frame.LargestAcked {
+ return nil, errors.New("invalid first ACK range")
+ }
+ smallest := frame.LargestAcked - protocol.PacketNumber(ackBlock)
+
+ // read all the other ACK ranges
+ if numBlocks > 0 {
+ frame.AckRanges = append(frame.AckRanges, AckRange{First: smallest, Last: frame.LargestAcked})
+ }
+ for i := uint64(0); i < numBlocks; i++ {
+ g, err := utils.ReadVarInt(r)
+ if err != nil {
+ return nil, err
+ }
+ gap := protocol.PacketNumber(g)
+ if smallest < gap+2 {
+ return nil, errInvalidAckRanges
+ }
+ largest := smallest - gap - 2
+
+ ab, err := utils.ReadVarInt(r)
+ if err != nil {
+ return nil, err
+ }
+ ackBlock := protocol.PacketNumber(ab)
+
+ if ackBlock > largest {
+ return nil, errInvalidAckRanges
+ }
+ smallest = largest - protocol.PacketNumber(ackBlock)
+ frame.AckRanges = append(frame.AckRanges, AckRange{First: smallest, Last: largest})
+ }
+
+ frame.LowestAcked = smallest
+ if !frame.validateAckRanges() {
+ return nil, errInvalidAckRanges
+ }
+
+ return frame, nil
+}
+
+// Write writes an ACK frame.
+func (f *AckFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error {
+ if !version.UsesIETFFrameFormat() {
+ return f.writeLegacy(b, version)
+ }
+
+ b.WriteByte(0xe)
+ utils.WriteVarInt(b, uint64(f.LargestAcked))
+ utils.WriteVarInt(b, encodeAckDelay(f.DelayTime))
+
+ // TODO: limit the number of ACK ranges, such that the frame doesn't grow larger than an upper bound
+ var lowestInFirstRange protocol.PacketNumber
+ if f.HasMissingRanges() {
+ utils.WriteVarInt(b, uint64(len(f.AckRanges)-1))
+ lowestInFirstRange = f.AckRanges[0].First
+ } else {
+ utils.WriteVarInt(b, 0)
+ lowestInFirstRange = f.LowestAcked
+ }
+
+ // write the first range
+ utils.WriteVarInt(b, uint64(f.LargestAcked-lowestInFirstRange))
+
+ // write all the other range
+ if !f.HasMissingRanges() {
+ return nil
+ }
+ var lowest protocol.PacketNumber
+ for i, ackRange := range f.AckRanges {
+ if i == 0 {
+ lowest = lowestInFirstRange
+ continue
+ }
+ utils.WriteVarInt(b, uint64(lowest-ackRange.Last-2))
+ utils.WriteVarInt(b, uint64(ackRange.Last-ackRange.First))
+ lowest = ackRange.First
+ }
+ return nil
+}
+
+// MinLength of a written frame
+func (f *AckFrame) MinLength(version protocol.VersionNumber) (protocol.ByteCount, error) {
+ if !version.UsesIETFFrameFormat() {
+ return f.minLengthLegacy(version)
+ }
+
+ length := 1 + utils.VarIntLen(uint64(f.LargestAcked)) + utils.VarIntLen(uint64(encodeAckDelay(f.DelayTime)))
+
+ var lowestInFirstRange protocol.PacketNumber
+ if f.HasMissingRanges() {
+ length += utils.VarIntLen(uint64(len(f.AckRanges) - 1))
+ lowestInFirstRange = f.AckRanges[0].First
+ } else {
+ length += utils.VarIntLen(0)
+ lowestInFirstRange = f.LowestAcked
+ }
+ length += utils.VarIntLen(uint64(f.LargestAcked - lowestInFirstRange))
+
+ if !f.HasMissingRanges() {
+ return length, nil
+ }
+ var lowest protocol.PacketNumber
+ for i, ackRange := range f.AckRanges {
+ if i == 0 {
+ lowest = ackRange.First
+ continue
+ }
+ length += utils.VarIntLen(uint64(lowest - ackRange.Last - 2))
+ length += utils.VarIntLen(uint64(ackRange.Last - ackRange.First))
+ lowest = ackRange.First
+ }
+ return length, nil
+}
+
+// HasMissingRanges returns if this frame reports any missing packets
+func (f *AckFrame) HasMissingRanges() bool {
+ return len(f.AckRanges) > 0
+}
+
+func (f *AckFrame) validateAckRanges() bool {
+ if len(f.AckRanges) == 0 {
+ return true
+ }
+
+ // if there are missing packets, there will always be at least 2 ACK ranges
+ if len(f.AckRanges) == 1 {
+ return false
+ }
+
+ if f.AckRanges[0].Last != f.LargestAcked {
+ return false
+ }
+
+ // check the validity of every single ACK range
+ for _, ackRange := range f.AckRanges {
+ if ackRange.First > ackRange.Last {
+ return false
+ }
+ }
+
+ // check the consistency for ACK with multiple NACK ranges
+ for i, ackRange := range f.AckRanges {
+ if i == 0 {
+ continue
+ }
+ lastAckRange := f.AckRanges[i-1]
+ if lastAckRange.First <= ackRange.First {
+ return false
+ }
+ if lastAckRange.First <= ackRange.Last+1 {
+ return false
+ }
+ }
+
+ return true
+}
+
+// AcksPacket determines if this ACK frame acks a certain packet number
+func (f *AckFrame) AcksPacket(p protocol.PacketNumber) bool {
+ if p < f.LowestAcked || p > f.LargestAcked { // this is just a performance optimization
+ return false
+ }
+
+ if f.HasMissingRanges() {
+ // TODO: this could be implemented as a binary search
+ for _, ackRange := range f.AckRanges {
+ if p >= ackRange.First && p <= ackRange.Last {
+ return true
+ }
+ }
+ return false
+ }
+ // if packet doesn't have missing ranges
+ return (p >= f.LowestAcked && p <= f.LargestAcked)
+}
+
+func encodeAckDelay(delay time.Duration) uint64 {
+ return uint64(delay.Nanoseconds() / (1000 * (1 << ackDelayExponent)))
+}
diff --git a/vendor/github.com/lucas-clemente/quic-go/frames/ack_frame.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/ack_frame_legacy.go
similarity index 57%
rename from vendor/github.com/lucas-clemente/quic-go/frames/ack_frame.go
rename to vendor/github.com/lucas-clemente/quic-go/internal/wire/ack_frame_legacy.go
index 0380541..3bef540 100644
--- a/vendor/github.com/lucas-clemente/quic-go/frames/ack_frame.go
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/ack_frame_legacy.go
@@ -1,40 +1,21 @@
-package frames
+package wire
import (
"bytes"
"errors"
"time"
- "github.com/lucas-clemente/quic-go/protocol"
- "github.com/lucas-clemente/quic-go/utils"
-)
-
-var (
- // ErrInvalidAckRanges occurs when a client sends inconsistent ACK ranges
- ErrInvalidAckRanges = errors.New("AckFrame: ACK frame contains invalid ACK ranges")
- // ErrInvalidFirstAckRange occurs when the first ACK range contains no packets
- ErrInvalidFirstAckRange = errors.New("AckFrame: ACK frame has invalid first ACK range")
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
)
var (
errInconsistentAckLargestAcked = errors.New("internal inconsistency: LargestAcked does not match ACK ranges")
errInconsistentAckLowestAcked = errors.New("internal inconsistency: LowestAcked does not match ACK ranges")
+ errInvalidAckRanges = errors.New("AckFrame: ACK frame contains invalid ACK ranges")
)
-// An AckFrame is an ACK frame in QUIC
-type AckFrame struct {
- LargestAcked protocol.PacketNumber
- LowestAcked protocol.PacketNumber
- AckRanges []AckRange // has to be ordered. The ACK range with the highest FirstPacketNumber goes first, the ACK range with the lowest FirstPacketNumber goes last
-
- // time when the LargestAcked was receiveid
- // this field Will not be set for received ACKs frames
- PacketReceivedTime time.Time
- DelayTime time.Duration
-}
-
-// ParseAckFrame reads an ACK frame
-func ParseAckFrame(r *bytes.Reader, version protocol.VersionNumber) (*AckFrame, error) {
+func parseAckFrameLegacy(r *bytes.Reader, _ protocol.VersionNumber) (*AckFrame, error) {
frame := &AckFrame{}
typeByte, err := r.ReadByte()
@@ -57,13 +38,13 @@ func ParseAckFrame(r *bytes.Reader, version protocol.VersionNumber) (*AckFrame,
missingSequenceNumberDeltaLen = 1
}
- largestAcked, err := utils.ReadUintN(r, largestAckedLen)
+ largestAcked, err := utils.BigEndian.ReadUintN(r, largestAckedLen)
if err != nil {
return nil, err
}
frame.LargestAcked = protocol.PacketNumber(largestAcked)
- delay, err := utils.ReadUfloat16(r)
+ delay, err := utils.BigEndian.ReadUfloat16(r)
if err != nil {
return nil, err
}
@@ -78,25 +59,25 @@ func ParseAckFrame(r *bytes.Reader, version protocol.VersionNumber) (*AckFrame,
}
if hasMissingRanges && numAckBlocks == 0 {
- return nil, ErrInvalidAckRanges
+ return nil, errInvalidAckRanges
}
- ackBlockLength, err := utils.ReadUintN(r, missingSequenceNumberDeltaLen)
+ ackBlockLength, err := utils.BigEndian.ReadUintN(r, missingSequenceNumberDeltaLen)
if err != nil {
return nil, err
}
if frame.LargestAcked > 0 && ackBlockLength < 1 {
- return nil, ErrInvalidFirstAckRange
+ return nil, errors.New("invalid first ACK range")
}
- if ackBlockLength > largestAcked {
- return nil, ErrInvalidAckRanges
+ if ackBlockLength > largestAcked+1 {
+ return nil, errInvalidAckRanges
}
if hasMissingRanges {
ackRange := AckRange{
- FirstPacketNumber: protocol.PacketNumber(largestAcked-ackBlockLength) + 1,
- LastPacketNumber: frame.LargestAcked,
+ First: protocol.PacketNumber(largestAcked-ackBlockLength) + 1,
+ Last: frame.LargestAcked,
}
frame.AckRanges = append(frame.AckRanges, ackRange)
@@ -109,7 +90,7 @@ func ParseAckFrame(r *bytes.Reader, version protocol.VersionNumber) (*AckFrame,
return nil, err
}
- ackBlockLength, err = utils.ReadUintN(r, missingSequenceNumberDeltaLen)
+ ackBlockLength, err = utils.BigEndian.ReadUintN(r, missingSequenceNumberDeltaLen)
if err != nil {
return nil, err
}
@@ -117,14 +98,14 @@ func ParseAckFrame(r *bytes.Reader, version protocol.VersionNumber) (*AckFrame,
length := protocol.PacketNumber(ackBlockLength)
if inLongBlock {
- frame.AckRanges[len(frame.AckRanges)-1].FirstPacketNumber -= protocol.PacketNumber(gap) + length
- frame.AckRanges[len(frame.AckRanges)-1].LastPacketNumber -= protocol.PacketNumber(gap)
+ frame.AckRanges[len(frame.AckRanges)-1].First -= protocol.PacketNumber(gap) + length
+ frame.AckRanges[len(frame.AckRanges)-1].Last -= protocol.PacketNumber(gap)
} else {
lastRangeComplete = false
ackRange := AckRange{
- LastPacketNumber: frame.AckRanges[len(frame.AckRanges)-1].FirstPacketNumber - protocol.PacketNumber(gap) - 1,
+ Last: frame.AckRanges[len(frame.AckRanges)-1].First - protocol.PacketNumber(gap) - 1,
}
- ackRange.FirstPacketNumber = ackRange.LastPacketNumber - length + 1
+ ackRange.First = ackRange.Last - length + 1
frame.AckRanges = append(frame.AckRanges, ackRange)
}
@@ -135,13 +116,13 @@ func ParseAckFrame(r *bytes.Reader, version protocol.VersionNumber) (*AckFrame,
inLongBlock = (ackBlockLength == 0)
}
- // if the last range was not complete, FirstPacketNumber and LastPacketNumber make no sense
+ // if the last range was not complete, First and Last make no sense
// remove the range from frame.AckRanges
if !lastRangeComplete {
frame.AckRanges = frame.AckRanges[:len(frame.AckRanges)-1]
}
- frame.LowestAcked = frame.AckRanges[len(frame.AckRanges)-1].FirstPacketNumber
+ frame.LowestAcked = frame.AckRanges[len(frame.AckRanges)-1].First
} else {
if frame.LargestAcked == 0 {
frame.LowestAcked = 0
@@ -151,7 +132,7 @@ func ParseAckFrame(r *bytes.Reader, version protocol.VersionNumber) (*AckFrame,
}
if !frame.validateAckRanges() {
- return nil, ErrInvalidAckRanges
+ return nil, errInvalidAckRanges
}
var numTimestamp byte
@@ -167,7 +148,7 @@ func ParseAckFrame(r *bytes.Reader, version protocol.VersionNumber) (*AckFrame,
return nil, err
}
// First Timestamp
- _, err = utils.ReadUint32(r)
+ _, err = utils.BigEndian.ReadUint32(r)
if err != nil {
return nil, err
}
@@ -180,18 +161,16 @@ func ParseAckFrame(r *bytes.Reader, version protocol.VersionNumber) (*AckFrame,
}
// Time Since Previous Timestamp
- _, err = utils.ReadUint16(r)
+ _, err = utils.BigEndian.ReadUint16(r)
if err != nil {
return nil, err
}
}
}
-
return frame, nil
}
-// Write writes an ACK frame.
-func (f *AckFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error {
+func (f *AckFrame) writeLegacy(b *bytes.Buffer, _ protocol.VersionNumber) error {
largestAckedLen := protocol.GetPacketNumberLength(f.LargestAcked)
typeByte := uint8(0x40)
@@ -215,15 +194,15 @@ func (f *AckFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error
case protocol.PacketNumberLen1:
b.WriteByte(uint8(f.LargestAcked))
case protocol.PacketNumberLen2:
- utils.WriteUint16(b, uint16(f.LargestAcked))
+ utils.BigEndian.WriteUint16(b, uint16(f.LargestAcked))
case protocol.PacketNumberLen4:
- utils.WriteUint32(b, uint32(f.LargestAcked))
+ utils.BigEndian.WriteUint32(b, uint32(f.LargestAcked))
case protocol.PacketNumberLen6:
- utils.WriteUint48(b, uint64(f.LargestAcked))
+ utils.BigEndian.WriteUint48(b, uint64(f.LargestAcked)&(1<<48-1))
}
- f.DelayTime = time.Now().Sub(f.PacketReceivedTime)
- utils.WriteUfloat16(b, uint64(f.DelayTime/time.Microsecond))
+ f.DelayTime = time.Since(f.PacketReceivedTime)
+ utils.BigEndian.WriteUfloat16(b, uint64(f.DelayTime/time.Microsecond))
var numRanges uint64
var numRangesWritten uint64
@@ -239,13 +218,13 @@ func (f *AckFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error
if !f.HasMissingRanges() {
firstAckBlockLength = f.LargestAcked - f.LowestAcked + 1
} else {
- if f.LargestAcked != f.AckRanges[0].LastPacketNumber {
+ if f.LargestAcked != f.AckRanges[0].Last {
return errInconsistentAckLargestAcked
}
- if f.LowestAcked != f.AckRanges[len(f.AckRanges)-1].FirstPacketNumber {
+ if f.LowestAcked != f.AckRanges[len(f.AckRanges)-1].First {
return errInconsistentAckLowestAcked
}
- firstAckBlockLength = f.LargestAcked - f.AckRanges[0].FirstPacketNumber + 1
+ firstAckBlockLength = f.LargestAcked - f.AckRanges[0].First + 1
numRangesWritten++
}
@@ -253,11 +232,11 @@ func (f *AckFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error
case protocol.PacketNumberLen1:
b.WriteByte(uint8(firstAckBlockLength))
case protocol.PacketNumberLen2:
- utils.WriteUint16(b, uint16(firstAckBlockLength))
+ utils.BigEndian.WriteUint16(b, uint16(firstAckBlockLength))
case protocol.PacketNumberLen4:
- utils.WriteUint32(b, uint32(firstAckBlockLength))
+ utils.BigEndian.WriteUint32(b, uint32(firstAckBlockLength))
case protocol.PacketNumberLen6:
- utils.WriteUint48(b, uint64(firstAckBlockLength))
+ utils.BigEndian.WriteUint48(b, uint64(firstAckBlockLength)&(1<<48-1))
}
for i, ackRange := range f.AckRanges {
@@ -265,8 +244,8 @@ func (f *AckFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error
continue
}
- length := ackRange.LastPacketNumber - ackRange.FirstPacketNumber + 1
- gap := f.AckRanges[i-1].FirstPacketNumber - ackRange.LastPacketNumber - 1
+ length := ackRange.Last - ackRange.First + 1
+ gap := f.AckRanges[i-1].First - ackRange.Last - 1
num := gap/0xFF + 1
if gap%0xFF == 0 {
@@ -279,11 +258,11 @@ func (f *AckFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error
case protocol.PacketNumberLen1:
b.WriteByte(uint8(length))
case protocol.PacketNumberLen2:
- utils.WriteUint16(b, uint16(length))
+ utils.BigEndian.WriteUint16(b, uint16(length))
case protocol.PacketNumberLen4:
- utils.WriteUint32(b, uint32(length))
+ utils.BigEndian.WriteUint32(b, uint32(length))
case protocol.PacketNumberLen6:
- utils.WriteUint48(b, uint64(length))
+ utils.BigEndian.WriteUint48(b, uint64(length)&(1<<48-1))
}
numRangesWritten++
} else {
@@ -304,11 +283,11 @@ func (f *AckFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error
case protocol.PacketNumberLen1:
b.WriteByte(uint8(lengthWritten))
case protocol.PacketNumberLen2:
- utils.WriteUint16(b, uint16(lengthWritten))
+ utils.BigEndian.WriteUint16(b, uint16(lengthWritten))
case protocol.PacketNumberLen4:
- utils.WriteUint32(b, uint32(lengthWritten))
+ utils.BigEndian.WriteUint32(b, uint32(lengthWritten))
case protocol.PacketNumberLen6:
- utils.WriteUint48(b, lengthWritten)
+ utils.BigEndian.WriteUint48(b, lengthWritten&(1<<48-1))
}
numRangesWritten++
@@ -326,14 +305,11 @@ func (f *AckFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error
}
b.WriteByte(0) // no timestamps
-
return nil
}
-// MinLength of a written frame
-func (f *AckFrame) MinLength(version protocol.VersionNumber) (protocol.ByteCount, error) {
- var length protocol.ByteCount
- length = 1 + 2 + 1 // 1 TypeByte, 2 ACK delay time, 1 Num Timestamp
+func (f *AckFrame) minLengthLegacy(_ protocol.VersionNumber) (protocol.ByteCount, error) {
+ length := protocol.ByteCount(1 + 2 + 1) // 1 TypeByte, 2 ACK delay time, 1 Num Timestamp
length += protocol.ByteCount(protocol.GetPacketNumberLength(f.LargestAcked))
missingSequenceNumberDeltaLen := protocol.ByteCount(f.getMissingSequenceNumberDeltaLen())
@@ -343,58 +319,10 @@ func (f *AckFrame) MinLength(version protocol.VersionNumber) (protocol.ByteCount
} else {
length += missingSequenceNumberDeltaLen
}
-
- length += (1 + 2) * 0 /* TODO: num_timestamps */
-
+ // we don't write
return length, nil
}
-// HasMissingRanges returns if this frame reports any missing packets
-func (f *AckFrame) HasMissingRanges() bool {
- if len(f.AckRanges) > 0 {
- return true
- }
- return false
-}
-
-func (f *AckFrame) validateAckRanges() bool {
- if len(f.AckRanges) == 0 {
- return true
- }
-
- // if there are missing packets, there will always be at least 2 ACK ranges
- if len(f.AckRanges) == 1 {
- return false
- }
-
- if f.AckRanges[0].LastPacketNumber != f.LargestAcked {
- return false
- }
-
- // check the validity of every single ACK range
- for _, ackRange := range f.AckRanges {
- if ackRange.FirstPacketNumber > ackRange.LastPacketNumber {
- return false
- }
- }
-
- // check the consistency for ACK with multiple NACK ranges
- for i, ackRange := range f.AckRanges {
- if i == 0 {
- continue
- }
- lastAckRange := f.AckRanges[i-1]
- if lastAckRange.FirstPacketNumber <= ackRange.FirstPacketNumber {
- return false
- }
- if lastAckRange.FirstPacketNumber <= ackRange.LastPacketNumber+1 {
- return false
- }
- }
-
- return true
-}
-
// numWritableNackRanges calculates the number of ACK blocks that are about to be written
// this number is different from len(f.AckRanges) for the case of long gaps (> 255 packets)
func (f *AckFrame) numWritableNackRanges() uint64 {
@@ -409,7 +337,7 @@ func (f *AckFrame) numWritableNackRanges() uint64 {
}
lastAckRange := f.AckRanges[i-1]
- gap := lastAckRange.FirstPacketNumber - ackRange.LastPacketNumber - 1
+ gap := lastAckRange.First - ackRange.Last - 1
rangeLength := 1 + uint64(gap)/0xFF
if uint64(gap)%0xFF == 0 {
rangeLength--
@@ -430,7 +358,7 @@ func (f *AckFrame) getMissingSequenceNumberDeltaLen() protocol.PacketNumberLen {
if f.HasMissingRanges() {
for _, ackRange := range f.AckRanges {
- rangeLength := ackRange.LastPacketNumber - ackRange.FirstPacketNumber + 1
+ rangeLength := ackRange.Last - ackRange.First + 1
if rangeLength > maxRangeLength {
maxRangeLength = rangeLength
}
@@ -451,22 +379,3 @@ func (f *AckFrame) getMissingSequenceNumberDeltaLen() protocol.PacketNumberLen {
return protocol.PacketNumberLen6
}
-
-// AcksPacket determines if this ACK frame acks a certain packet number
-func (f *AckFrame) AcksPacket(p protocol.PacketNumber) bool {
- if p < f.LowestAcked || p > f.LargestAcked { // this is just a performance optimization
- return false
- }
-
- if f.HasMissingRanges() {
- // TODO: this could be implemented as a binary search
- for _, ackRange := range f.AckRanges {
- if p >= ackRange.FirstPacketNumber && p <= ackRange.LastPacketNumber {
- return true
- }
- }
- return false
- }
- // if packet doesn't have missing ranges
- return (p >= f.LowestAcked && p <= f.LargestAcked)
-}
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/ack_frame_legacy_test.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/ack_frame_legacy_test.go
new file mode 100644
index 0000000..a849d40
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/ack_frame_legacy_test.go
@@ -0,0 +1,1281 @@
+package wire
+
+import (
+ "bytes"
+ "io"
+ "time"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+)
+
+var _ = Describe("ACK Frame (for gQUIC)", func() {
+ Context("when parsing", func() {
+ It("accepts a sample frame", func() {
+ b := bytes.NewReader([]byte{0x40,
+ 0x1c, // largest acked
+ 0x0, 0x0, // delay time
+ 0x1c, // block length
+ 0,
+ })
+ frame, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(0x1c)))
+ Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(1)))
+ Expect(frame.HasMissingRanges()).To(BeFalse())
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("parses a frame that acks packet number 0", func() {
+ b := bytes.NewReader([]byte{0x40,
+ 0x0, // largest acked
+ 0x0, 0x0, // delay time
+ 0x1, // block length
+ 0,
+ })
+ frame, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(0)))
+ Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(0)))
+ Expect(frame.HasMissingRanges()).To(BeFalse())
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("parses a frame with 1 ACKed packet", func() {
+ b := bytes.NewReader([]byte{0x40,
+ 0x10, // largest acked
+ 0x0, 0x0, // delay time
+ 0x1, // block length
+ 0,
+ })
+ frame, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(0x10)))
+ Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(0x10)))
+ Expect(frame.HasMissingRanges()).To(BeFalse())
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("parses a frame that acks multiple packets, starting with 0", func() {
+ b := bytes.NewReader([]byte{0x40,
+ 0x10, // largest acked
+ 0x0, 0x0, // delay time
+ 0x11, // block length
+ 0,
+ })
+ frame, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(0x10)))
+ Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(0)))
+ Expect(frame.HasMissingRanges()).To(BeFalse())
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("parses a frame with multiple timestamps", func() {
+ b := bytes.NewReader([]byte{0x40,
+ 0x10, // largest acked
+ 0x0, 0x0, // timestamp
+ 0x10, // block length
+ 0x4, // num timestamps
+ 0x1, 0x6b, 0x26, 0x4, 0x0, // 1st timestamp
+ 0x3, 0, 0, // 2nd timestamp
+ 0x2, 0, 0, // 3rd timestamp
+ 0x1, 0, 0, // 4th timestamp
+ })
+ _, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("errors when the ACK range is too large", func() {
+ // LargestAcked: 0x1c
+ // Length: 0x1d => LowestAcked would be -1
+ b := bytes.NewReader([]byte{0x40,
+ 0x1c, // largest acked
+ 0x0, 0x0, // delay time
+ 0x1e, // block length
+ 0,
+ })
+ _, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).To(MatchError(errInvalidAckRanges))
+ })
+
+ It("errors when the first ACK range is empty", func() {
+ b := bytes.NewReader([]byte{0x40,
+ 0x9, // largest acked
+ 0x0, 0x0, // delay time
+ 0x0, // block length
+ 0,
+ })
+ _, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).To(MatchError("invalid first ACK range"))
+ })
+
+ It("parses the delay time", func() {
+ b := bytes.NewReader([]byte{0x40,
+ 0x3, // largest acked
+ 0x0, 0x8e, // delay time
+ 0x3, // block length
+ 0,
+ })
+ frame, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(3)))
+ Expect(frame.DelayTime).To(Equal(142 * time.Microsecond))
+ })
+
+ It("errors on EOFs", func() {
+ data := []byte{0x60 ^ 0x4 ^ 0x1,
+ 0x9, 0x66, // largest acked
+ 0x23, 0x1, // delay time
+ 0x7, // num ACk blocks
+ 0x0, 0x7, // 1st block
+ 0xff, 0x0, 0x0, // 2nd block
+ 0xf5, 0x2, 0x8a, // 3rd block
+ 0xc8, 0x0, 0xe6, // 4th block
+ 0xff, 0x0, 0x0, // 5th block
+ 0xff, 0x0, 0x0, // 6th block
+ 0xff, 0x0, 0x0, // 7th block
+ 0x23, 0x0, 0x13, // 8th blocks
+ 0x2, // num timestamps
+ 0x1, 0x13, 0xae, 0xb, 0x0, // 1st timestamp
+ 0x0, 0x80, 0x5, // 2nd timestamp
+ }
+ _, err := ParseAckFrame(bytes.NewReader(data), versionBigEndian)
+ Expect(err).NotTo(HaveOccurred())
+ for i := range data {
+ _, err := ParseAckFrame(bytes.NewReader(data[0:i]), versionBigEndian)
+ Expect(err).To(MatchError(io.EOF))
+ }
+ })
+
+ Context("largest acked length", func() {
+ It("parses a frame with a 2 byte packet number", func() {
+ b := bytes.NewReader([]byte{0x40 | 0x4,
+ 0x13, 0x37, // largest acked
+ 0x0, 0x0, // delay time
+ 0x9, // block length
+ 0,
+ })
+ frame, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(0x1337)))
+ Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(0x1337 - 0x9 + 1)))
+ Expect(frame.HasMissingRanges()).To(BeFalse())
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("parses a frame with a 4 byte packet number", func() {
+ b := bytes.NewReader([]byte{0x40 | 0x8,
+ 0xde, 0xca, 0xfb, 0xad, // largest acked
+ 0x0, 0x0, // timesatmp
+ 0x5, // block length
+ 0,
+ })
+ frame, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(0xdecafbad)))
+ Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(0xdecafbad - 5 + 1)))
+ Expect(frame.HasMissingRanges()).To(BeFalse())
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("parses a frame with a 6 byte packet number", func() {
+ b := bytes.NewReader([]byte{0x4 | 0xc,
+ 0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, // largest acked
+ 0x0, 0x0, // delay time
+ 0x5, // block length
+ 0,
+ })
+ frame, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(0xdeadbeefcafe)))
+ Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(0xdeadbeefcafe - 5 + 1)))
+ Expect(frame.HasMissingRanges()).To(BeFalse())
+ Expect(b.Len()).To(BeZero())
+ })
+ })
+
+ Context("ACK blocks", func() {
+ It("parses a frame with two ACK blocks", func() {
+ b := bytes.NewReader([]byte{0x60,
+ 0x18, // largest acked
+ 0x0, 0x0, // delay time
+ 0x1, // num ACK blocks
+ 0x3, // 1st block
+ 0x2, 0x10, // 2nd block
+ 0,
+ })
+ frame, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(0x18)))
+ Expect(frame.HasMissingRanges()).To(BeTrue())
+ Expect(frame.AckRanges).To(HaveLen(2))
+ Expect(frame.AckRanges[0]).To(Equal(AckRange{First: 0x18 - 0x3 + 1, Last: 0x18}))
+ Expect(frame.AckRanges[1]).To(Equal(AckRange{First: (0x18 - 0x3 + 1) - (0x2 + 1) - (0x10 - 1), Last: (0x18 - 0x3 + 1) - (0x2 + 1)}))
+ Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(4)))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("rejects a frame with invalid ACK ranges", func() {
+ // like the test before, but increased the last ACK range, such that the First would be negative
+ b := bytes.NewReader([]byte{0x60,
+ 0x18, // largest acked
+ 0x0, 0x0, // delay time
+ 0x1, // num ACK blocks
+ 0x3, // 1st block
+ 0x2, 0x15, // 2nd block
+ 0,
+ })
+ _, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).To(MatchError(errInvalidAckRanges))
+ })
+
+ It("rejects a frame that says it has ACK blocks in the typeByte, but doesn't have any", func() {
+ b := bytes.NewReader([]byte{0x60 ^ 0x3,
+ 0x4, // largest acked
+ 0x0, 0x0, // delay time
+ 0, // num ACK blocks
+ 0,
+ })
+ _, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).To(MatchError(errInvalidAckRanges))
+ })
+
+ It("parses a frame with multiple single packets missing", func() {
+ b := bytes.NewReader([]byte{0x60,
+ 0x27, // largest acked
+ 0x0, 0x0, // delay time
+ 0x6, // num ACK blocks
+ 0x9, // 1st block
+ 0x1, 0x1, // 2nd block
+ 0x1, 0x1, // 3rd block
+ 0x1, 0x1, // 4th block
+ 0x1, 0x1, // 5th block
+ 0x1, 0x1, // 6th block
+ 0x1, 0x13, // 7th block
+ 0,
+ })
+ frame, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(0x27)))
+ Expect(frame.HasMissingRanges()).To(BeTrue())
+ Expect(frame.AckRanges).To(HaveLen(7))
+ Expect(frame.AckRanges[0]).To(Equal(AckRange{First: 31, Last: 0x27}))
+ Expect(frame.AckRanges[1]).To(Equal(AckRange{First: 29, Last: 29}))
+ Expect(frame.AckRanges[2]).To(Equal(AckRange{First: 27, Last: 27}))
+ Expect(frame.AckRanges[3]).To(Equal(AckRange{First: 25, Last: 25}))
+ Expect(frame.AckRanges[4]).To(Equal(AckRange{First: 23, Last: 23}))
+ Expect(frame.AckRanges[5]).To(Equal(AckRange{First: 21, Last: 21}))
+ Expect(frame.AckRanges[6]).To(Equal(AckRange{First: 1, Last: 19}))
+ Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(1)))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("parses a frame with multiple longer ACK blocks", func() {
+ b := bytes.NewReader([]byte{0x60,
+ 0x52, // largest acked
+ 0xd1, 0x0, //delay time
+ 0x3, // num ACK blocks
+ 0x17, // 1st block
+ 0xa, 0x10, // 2nd block
+ 0x4, 0x8, // 3rd block
+ 0x2, 0x12, // 4th block
+ 0,
+ })
+ frame, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(0x52)))
+ Expect(frame.HasMissingRanges()).To(BeTrue())
+ Expect(frame.AckRanges).To(HaveLen(4))
+ Expect(frame.AckRanges[0]).To(Equal(AckRange{First: 60, Last: 0x52}))
+ Expect(frame.AckRanges[1]).To(Equal(AckRange{First: 34, Last: 49}))
+ Expect(frame.AckRanges[2]).To(Equal(AckRange{First: 22, Last: 29}))
+ Expect(frame.AckRanges[3]).To(Equal(AckRange{First: 2, Last: 19}))
+ Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(2)))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ Context("more than 256 lost packets in a row", func() {
+ // 255 missing packets fit into a single ACK block
+ It("parses a frame with a range of 255 missing packets", func() {
+ b := bytes.NewReader([]byte{0x60 ^ 0x4,
+ 0x1, 0x15, // largest acked
+ 0x0, 0x0, // delay time
+ 0x1, // num ACK blocks
+ 0x3, // 1st block
+ 0xff, 0x13, // 2nd block
+ 0,
+ })
+ frame, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(0x115)))
+ Expect(frame.HasMissingRanges()).To(BeTrue())
+ Expect(frame.AckRanges).To(HaveLen(2))
+ Expect(frame.AckRanges[0]).To(Equal(AckRange{First: 20 + 255, Last: 0x115}))
+ Expect(frame.AckRanges[1]).To(Equal(AckRange{First: 1, Last: 19}))
+ Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(1)))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ // 256 missing packets fit into two ACK blocks
+ It("parses a frame with a range of 256 missing packets", func() {
+ b := bytes.NewReader([]byte{0x60 ^ 0x4,
+ 0x1, 0x14, // largest acked
+ 0x0, 0x0, // delay time
+ 0x2, // num ACK blocks
+ 0x1, // 1st block
+ 0xff, 0x0, // 2nd block
+ 0x1, 0x13, // 3rd block
+ 0,
+ })
+ frame, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(0x114)))
+ Expect(frame.HasMissingRanges()).To(BeTrue())
+ Expect(frame.AckRanges).To(HaveLen(2))
+ Expect(frame.AckRanges[0]).To(Equal(AckRange{First: 20 + 256, Last: 0x114}))
+ Expect(frame.AckRanges[1]).To(Equal(AckRange{First: 1, Last: 19}))
+ Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(1)))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("parses a frame with an incomplete range at the end", func() {
+ // this is a modified ACK frame that has 5 instead of originally 6 written ranges
+ // each gap is 300 packets and thus takes 2 ranges
+ // the last range is incomplete, and should be completely ignored
+ b := bytes.NewReader([]byte{0x60 ^ 0x4,
+ 0x3, 0x9b, // largest acked
+ 0x0, 0x0, // delay time
+ 0x5, // num ACK blocks, instead of 0x6
+ 0x1, // 1st block
+ 0xff, 0x0, // 2nd block
+ 0x2d, 0x1, // 3rd block
+ 0xff, 0x0, // 4th block
+ 0x2d, 0x1, // 5th block
+ 0xff, 0x0, /*0x2d, 0x14,*/ // 6th block
+ 0,
+ })
+ frame, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(0x39b)))
+ Expect(frame.HasMissingRanges()).To(BeTrue())
+ Expect(frame.AckRanges).To(HaveLen(3))
+ Expect(frame.AckRanges[0]).To(Equal(AckRange{First: 20 + 3*301, Last: 20 + 3*301}))
+ Expect(frame.AckRanges[1]).To(Equal(AckRange{First: 20 + 2*301, Last: 20 + 2*301}))
+ Expect(frame.AckRanges[2]).To(Equal(AckRange{First: 20 + 1*301, Last: 20 + 1*301}))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("parses a frame with one long range, spanning 2 blocks, of missing packets", func() {
+ // 280 missing packets
+ b := bytes.NewReader([]byte{0x60 ^ 0x4,
+ 0x1, 0x44, // largest acked
+ 0x0, 0x0, // delay time
+ 0x2, // num ACK blocks
+ 0x19, // 1st block
+ 0xff, 0x0, // 2nd block
+ 0x19, 0x13, // 3rd block
+ 0,
+ })
+ frame, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(0x144)))
+ Expect(frame.HasMissingRanges()).To(BeTrue())
+ Expect(frame.AckRanges).To(HaveLen(2))
+ Expect(frame.AckRanges[0]).To(Equal(AckRange{First: 300, Last: 0x144}))
+ Expect(frame.AckRanges[1]).To(Equal(AckRange{First: 1, Last: 19}))
+ Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(1)))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("parses a frame with one long range, spanning multiple blocks, of missing packets", func() {
+ // 2345 missing packets
+ b := bytes.NewReader([]byte{0x60 ^ 0x4,
+ 0x9, 0x5b, // largest acked
+ 0x0, 0x0, // delay time
+ 0xa, // num ACK blocks
+ 0x1f, // 1st block
+ 0xff, 0x0, // 2nd block
+ 0xff, 0x0, // 3rd block
+ 0xff, 0x0, // 4th block
+ 0xff, 0x0, // 5th block
+ 0xff, 0x0, // 6th block
+ 0xff, 0x0, // 7th block
+ 0xff, 0x0, // 8th block
+ 0xff, 0x0, // 9th block
+ 0xff, 0x0, // 10th block
+ 0x32, 0x13, // 11th block
+ 0,
+ })
+ frame, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(0x95b)))
+ Expect(frame.HasMissingRanges()).To(BeTrue())
+ Expect(frame.AckRanges).To(HaveLen(2))
+ Expect(frame.AckRanges[0]).To(Equal(AckRange{First: 2365, Last: 0x95b}))
+ Expect(frame.AckRanges[1]).To(Equal(AckRange{First: 1, Last: 19}))
+ Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(1)))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("parses a frame with multiple 2 byte long ranges of missing packets", func() {
+ b := bytes.NewReader([]byte{0x60 ^ 0x4 ^ 0x1,
+ 0x9, 0x66, // largest acked
+ 0x0, 0x0, // delay time
+ 0x7, // num ACK blocks
+ 0x0, 0x7, // 1st block
+ 0xff, 0x0, 0x0, // 2nd block
+ 0xf5, 0x2, 0x8a, // 3rd block
+ 0xc8, 0x0, 0xe6, // 4th block
+ 0xff, 0x0, 0x0, // 5th block
+ 0xff, 0x0, 0x0, // 6th block
+ 0xff, 0x0, 0x0, // 7th block
+ 0x23, 0x0, 0x13, // 8th block
+ 0,
+ })
+ frame, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(0x966)))
+ Expect(frame.HasMissingRanges()).To(BeTrue())
+ Expect(frame.AckRanges).To(HaveLen(4))
+ Expect(frame.AckRanges[0]).To(Equal(AckRange{First: 2400, Last: 0x966}))
+ Expect(frame.AckRanges[1]).To(Equal(AckRange{First: 1250, Last: 1899}))
+ Expect(frame.AckRanges[2]).To(Equal(AckRange{First: 820, Last: 1049}))
+ Expect(frame.AckRanges[3]).To(Equal(AckRange{First: 1, Last: 19}))
+ Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(1)))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("parses a frame with with a 4 byte ack block length", func() {
+ b := bytes.NewReader([]byte{0x60 ^ 0xc ^ 0x2,
+ 0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, // largest acked
+ 0x0, 0x0, // delay time
+ 0x1, // num ACK blocks
+ 0, 0, 0x13, 0x37, // 1st block
+ 0x20, 0x12, 0x34, 0x56, 0x78, // 2nd block
+ 0,
+ })
+ frame, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(0xdeadbeefcafe)))
+ Expect(frame.HasMissingRanges()).To(BeTrue())
+ Expect(frame.AckRanges).To(HaveLen(2))
+ Expect(frame.AckRanges[0]).To(Equal(AckRange{First: 0xdeadbeefcafe - 0x1337 + 1, Last: 0xdeadbeefcafe}))
+ Expect(frame.AckRanges[1]).To(Equal(AckRange{First: (0xdeadbeefcafe - 0x1337 + 1) - (0x20 + 1) - (0x12345678 - 1), Last: (0xdeadbeefcafe - 0x1337 + 1) - (0x20 + 1)}))
+ })
+
+ It("parses a frame with with a 6 byte ack block length", func() {
+ b := bytes.NewReader([]byte{0x60 ^ 0xc ^ 0x3,
+ 0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, // largest acked
+ 0x0, 0x0, // delay time
+ 0x1, // num ACk blocks
+ 0, 0, 0, 0, 0x13, 0x37, // 1st block
+ 0x20, 0x0, 0xab, 0x12, 0x34, 0x56, 0x78, // 2nd block
+ 0,
+ })
+ frame, err := ParseAckFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(0xdeadbeefcafe)))
+ Expect(frame.HasMissingRanges()).To(BeTrue())
+ Expect(frame.AckRanges).To(HaveLen(2))
+ Expect(frame.AckRanges[0]).To(Equal(AckRange{First: 0xdeadbeefcafe - 0x1337 + 1, Last: 0xdeadbeefcafe}))
+ Expect(frame.AckRanges[1]).To(Equal(AckRange{First: (0xdeadbeefcafe - 0x1337 + 1) - (0x20 + 1) - (0xab12345678 - 1), Last: (0xdeadbeefcafe - 0x1337 + 1) - (0x20 + 1)}))
+ })
+ })
+ })
+ })
+
+ Context("when writing", func() {
+ var b *bytes.Buffer
+
+ BeforeEach(func() {
+ b = &bytes.Buffer{}
+ })
+
+ Context("self-consistency", func() {
+ It("writes a simple ACK frame", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 1,
+ LowestAcked: 1,
+ }
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.HasMissingRanges()).To(BeFalse())
+ Expect(r.Len()).To(BeZero())
+ })
+
+ It("writes an ACK that also acks packet 0", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 1,
+ LowestAcked: 0,
+ }
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.HasMissingRanges()).To(BeFalse())
+ Expect(r.Len()).To(BeZero())
+ })
+
+ It("writes the correct block length in a simple ACK frame", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 20,
+ LowestAcked: 10,
+ }
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.LowestAcked).To(Equal(frameOrig.LowestAcked))
+ Expect(frame.HasMissingRanges()).To(BeFalse())
+ Expect(r.Len()).To(BeZero())
+ })
+
+ It("writes a simple ACK frame with a high packet number", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 0xdeadbeefcafe,
+ LowestAcked: 0xdeadbeefcafe,
+ }
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.HasMissingRanges()).To(BeFalse())
+ Expect(r.Len()).To(BeZero())
+ })
+
+ It("writes an ACK frame with one packet missing", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 40,
+ LowestAcked: 0,
+ AckRanges: []AckRange{
+ {First: 25, Last: 40},
+ {First: 0, Last: 23},
+ },
+ }
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.LowestAcked).To(Equal(frameOrig.LowestAcked))
+ Expect(frame.AckRanges).To(Equal(frameOrig.AckRanges))
+ Expect(r.Len()).To(BeZero())
+ })
+
+ It("writes an ACK frame with multiple missing packets", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 25,
+ LowestAcked: 1,
+ AckRanges: []AckRange{
+ {First: 22, Last: 25},
+ {First: 15, Last: 18},
+ {First: 13, Last: 13},
+ {First: 1, Last: 10},
+ },
+ }
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.LowestAcked).To(Equal(frameOrig.LowestAcked))
+ Expect(frame.AckRanges).To(Equal(frameOrig.AckRanges))
+ Expect(r.Len()).To(BeZero())
+ })
+
+ It("rejects a frame with incorrect LargestObserved value", func() {
+ frame := &AckFrame{
+ LargestAcked: 26,
+ LowestAcked: 1,
+ AckRanges: []AckRange{
+ {First: 12, Last: 25},
+ {First: 1, Last: 10},
+ },
+ }
+ err := frame.Write(b, versionBigEndian)
+ Expect(err).To(MatchError(errInconsistentAckLargestAcked))
+ })
+
+ It("rejects a frame with incorrect LargestObserved value", func() {
+ frame := &AckFrame{
+ LargestAcked: 25,
+ LowestAcked: 2,
+ AckRanges: []AckRange{
+ {First: 12, Last: 25},
+ {First: 1, Last: 10},
+ },
+ }
+ err := frame.Write(b, versionBigEndian)
+ Expect(err).To(MatchError(errInconsistentAckLowestAcked))
+ })
+
+ Context("longer gaps between ACK blocks", func() {
+ It("only writes one block for 254 lost packets", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 300,
+ LowestAcked: 1,
+ AckRanges: []AckRange{
+ {First: 20 + 254, Last: 300},
+ {First: 1, Last: 19},
+ },
+ }
+ Expect(frameOrig.numWritableNackRanges()).To(Equal(uint64(2)))
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.AckRanges).To(Equal(frameOrig.AckRanges))
+ })
+
+ It("only writes one block for 255 lost packets", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 300,
+ LowestAcked: 1,
+ AckRanges: []AckRange{
+ {First: 20 + 255, Last: 300},
+ {First: 1, Last: 19},
+ },
+ }
+ Expect(frameOrig.numWritableNackRanges()).To(Equal(uint64(2)))
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.AckRanges).To(Equal(frameOrig.AckRanges))
+ })
+
+ It("writes two blocks for 256 lost packets", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 300,
+ LowestAcked: 1,
+ AckRanges: []AckRange{
+ {First: 20 + 256, Last: 300},
+ {First: 1, Last: 19},
+ },
+ }
+ Expect(frameOrig.numWritableNackRanges()).To(Equal(uint64(3)))
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.AckRanges).To(Equal(frameOrig.AckRanges))
+ })
+
+ It("writes two blocks for 510 lost packets", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 600,
+ LowestAcked: 1,
+ AckRanges: []AckRange{
+ {First: 20 + 510, Last: 600},
+ {First: 1, Last: 19},
+ },
+ }
+ Expect(frameOrig.numWritableNackRanges()).To(Equal(uint64(3)))
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.AckRanges).To(Equal(frameOrig.AckRanges))
+ })
+
+ It("writes three blocks for 511 lost packets", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 600,
+ LowestAcked: 1,
+ AckRanges: []AckRange{
+ {First: 20 + 511, Last: 600},
+ {First: 1, Last: 19},
+ },
+ }
+ Expect(frameOrig.numWritableNackRanges()).To(Equal(uint64(4)))
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.AckRanges).To(Equal(frameOrig.AckRanges))
+ })
+
+ It("writes three blocks for 512 lost packets", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 600,
+ LowestAcked: 1,
+ AckRanges: []AckRange{
+ {First: 20 + 512, Last: 600},
+ {First: 1, Last: 19},
+ },
+ }
+ Expect(frameOrig.numWritableNackRanges()).To(Equal(uint64(4)))
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.AckRanges).To(Equal(frameOrig.AckRanges))
+ })
+
+ It("writes multiple blocks for a lot of lost packets", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 3000,
+ LowestAcked: 1,
+ AckRanges: []AckRange{
+ {First: 2900, Last: 3000},
+ {First: 1, Last: 19},
+ },
+ }
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.AckRanges).To(Equal(frameOrig.AckRanges))
+ })
+
+ It("writes multiple longer blocks for 256 lost packets", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 3600,
+ LowestAcked: 1,
+ AckRanges: []AckRange{
+ {First: 2900, Last: 3600},
+ {First: 1000, Last: 2500},
+ {First: 1, Last: 19},
+ },
+ }
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.AckRanges).To(Equal(frameOrig.AckRanges))
+ })
+ })
+
+ Context("largest acked length", func() {
+ It("writes a 1 largest acked", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 200,
+ LowestAcked: 1,
+ }
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()[0] & 0x3).To(Equal(byte(0x0)))
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.LowestAcked).To(Equal(frameOrig.LowestAcked))
+ Expect(r.Len()).To(BeZero())
+ })
+
+ It("writes a 2 byte largest acked", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 0x100,
+ LowestAcked: 1,
+ }
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()[0] & 0x3).To(Equal(byte(0x1)))
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.LowestAcked).To(Equal(frameOrig.LowestAcked))
+ Expect(r.Len()).To(BeZero())
+ })
+
+ It("writes a 4 byte largest acked", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 0x10000,
+ LowestAcked: 1,
+ }
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()[0] & 0x3).To(Equal(byte(0x2)))
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.LowestAcked).To(Equal(frameOrig.LowestAcked))
+ Expect(r.Len()).To(BeZero())
+ })
+
+ It("writes a 6 byte largest acked", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 0x100000000,
+ LowestAcked: 1,
+ }
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()[0] & 0x3).To(Equal(byte(0x3)))
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.LowestAcked).To(Equal(frameOrig.LowestAcked))
+ Expect(r.Len()).To(BeZero())
+ })
+ })
+
+ Context("ack block length", func() {
+ It("writes a 1 byte ack block length, if all ACK blocks are short", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 5001,
+ LowestAcked: 1,
+ AckRanges: []AckRange{
+ {First: 5000, Last: 5001},
+ {First: 250, Last: 300},
+ {First: 1, Last: 200},
+ },
+ }
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()[0] & 0x3).To(Equal(byte(0x0)))
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.LowestAcked).To(Equal(frameOrig.LowestAcked))
+ Expect(frame.AckRanges).To(Equal(frameOrig.AckRanges))
+ Expect(r.Len()).To(BeZero())
+ })
+
+ It("writes a 2 byte ack block length, for a frame with one ACK block", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 10000,
+ LowestAcked: 1,
+ AckRanges: []AckRange{
+ {First: 9990, Last: 10000},
+ {First: 1, Last: 9988},
+ },
+ }
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()[0] & 0x3).To(Equal(byte(0x1)))
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.LowestAcked).To(Equal(frameOrig.LowestAcked))
+ Expect(frame.AckRanges).To(Equal(frameOrig.AckRanges))
+ Expect(r.Len()).To(BeZero())
+ })
+
+ It("writes a 2 byte ack block length, for a frame with multiple ACK blocks", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 10000,
+ LowestAcked: 1,
+ AckRanges: []AckRange{
+ {First: 9990, Last: 10000},
+ {First: 1, Last: 256},
+ },
+ }
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()[0] & 0x3).To(Equal(byte(0x1)))
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.LowestAcked).To(Equal(frameOrig.LowestAcked))
+ Expect(frame.AckRanges).To(Equal(frameOrig.AckRanges))
+ Expect(r.Len()).To(BeZero())
+ })
+
+ It("writes a 4 byte ack block length, for a frame with single ACK blocks", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 0xdeadbeef,
+ LowestAcked: 1,
+ AckRanges: []AckRange{
+ {First: 9990, Last: 0xdeadbeef},
+ {First: 1, Last: 9988},
+ },
+ }
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()[0] & 0x3).To(Equal(byte(0x2)))
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.LowestAcked).To(Equal(frameOrig.LowestAcked))
+ Expect(frame.AckRanges).To(Equal(frameOrig.AckRanges))
+ Expect(r.Len()).To(BeZero())
+ })
+
+ It("writes a 4 byte ack block length, for a frame with multiple ACK blocks", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 0xdeadbeef,
+ LowestAcked: 1,
+ AckRanges: []AckRange{
+ {First: 9990, Last: 0xdeadbeef},
+ {First: 1, Last: 256},
+ },
+ }
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()[0] & 0x3).To(Equal(byte(0x2)))
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.LowestAcked).To(Equal(frameOrig.LowestAcked))
+ Expect(frame.AckRanges).To(Equal(frameOrig.AckRanges))
+ Expect(r.Len()).To(BeZero())
+ })
+
+ It("writes a 6 byte ack block length, for a frame with a single ACK blocks", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 0xdeadbeefcafe,
+ LowestAcked: 1,
+ AckRanges: []AckRange{
+ {First: 9990, Last: 0xdeadbeefcafe},
+ {First: 1, Last: 9988},
+ },
+ }
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()[0] & 0x3).To(Equal(byte(0x3)))
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.LowestAcked).To(Equal(frameOrig.LowestAcked))
+ Expect(frame.AckRanges).To(Equal(frameOrig.AckRanges))
+ Expect(r.Len()).To(BeZero())
+ })
+
+ It("writes a 6 byte ack block length, for a frame with multiple ACK blocks", func() {
+ frameOrig := &AckFrame{
+ LargestAcked: 0xdeadbeefcafe,
+ LowestAcked: 1,
+ AckRanges: []AckRange{
+ {First: 9990, Last: 0xdeadbeefcafe},
+ {First: 1, Last: 256},
+ },
+ }
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()[0] & 0x3).To(Equal(byte(0x3)))
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.LowestAcked).To(Equal(frameOrig.LowestAcked))
+ Expect(frame.AckRanges).To(Equal(frameOrig.AckRanges))
+ Expect(r.Len()).To(BeZero())
+ })
+ })
+
+ Context("too many ACK blocks", func() {
+ It("skips the lowest ACK ranges, if there are more than 255 AckRanges", func() {
+ ackRanges := make([]AckRange, 300)
+ for i := 1; i <= 300; i++ {
+ ackRanges[300-i] = AckRange{First: protocol.PacketNumber(3 * i), Last: protocol.PacketNumber(3*i + 1)}
+ }
+ frameOrig := &AckFrame{
+ LargestAcked: ackRanges[0].Last,
+ LowestAcked: ackRanges[len(ackRanges)-1].First,
+ AckRanges: ackRanges,
+ }
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.LowestAcked).To(Equal(ackRanges[254].First))
+ Expect(frame.AckRanges).To(HaveLen(0xFF))
+ Expect(frame.validateAckRanges()).To(BeTrue())
+ })
+
+ It("skips the lowest ACK ranges, if the gaps are large", func() {
+ ackRanges := make([]AckRange, 100)
+ // every AckRange will take 4 written ACK ranges
+ for i := 1; i <= 100; i++ {
+ ackRanges[100-i] = AckRange{First: protocol.PacketNumber(1000 * i), Last: protocol.PacketNumber(1000*i + 1)}
+ }
+ frameOrig := &AckFrame{
+ LargestAcked: ackRanges[0].Last,
+ LowestAcked: ackRanges[len(ackRanges)-1].First,
+ AckRanges: ackRanges,
+ }
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.LowestAcked).To(Equal(ackRanges[255/4].First))
+ Expect(frame.validateAckRanges()).To(BeTrue())
+ })
+
+ It("works with huge gaps", func() {
+ ackRanges := []AckRange{
+ {First: 2 * 255 * 200, Last: 2*255*200 + 1},
+ {First: 1 * 255 * 200, Last: 1*255*200 + 1},
+ {First: 1, Last: 2},
+ }
+ frameOrig := &AckFrame{
+ LargestAcked: ackRanges[0].Last,
+ LowestAcked: ackRanges[len(ackRanges)-1].First,
+ AckRanges: ackRanges,
+ }
+ err := frameOrig.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ r := bytes.NewReader(b.Bytes())
+ frame, err := ParseAckFrame(r, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
+ Expect(frame.AckRanges).To(HaveLen(2))
+ Expect(frame.LowestAcked).To(Equal(ackRanges[1].First))
+ Expect(frame.validateAckRanges()).To(BeTrue())
+ })
+ })
+ })
+
+ Context("min length", func() {
+ It("has proper min length", func() {
+ f := &AckFrame{
+ LargestAcked: 1,
+ }
+ err := f.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(f.MinLength(versionBigEndian)).To(Equal(protocol.ByteCount(b.Len())))
+ })
+
+ It("has proper min length with a large LargestObserved", func() {
+ f := &AckFrame{
+ LargestAcked: 0xDEADBEEFCAFE,
+ }
+ err := f.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(f.MinLength(versionBigEndian)).To(Equal(protocol.ByteCount(b.Len())))
+ })
+
+ It("has the proper min length for an ACK with missing packets", func() {
+ f := &AckFrame{
+ LargestAcked: 2000,
+ LowestAcked: 10,
+ AckRanges: []AckRange{
+ {First: 1000, Last: 2000},
+ {First: 50, Last: 900},
+ {First: 10, Last: 23},
+ },
+ }
+ err := f.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(f.MinLength(versionBigEndian)).To(Equal(protocol.ByteCount(b.Len())))
+ })
+
+ It("has the proper min length for an ACK with long gaps of missing packets", func() {
+ f := &AckFrame{
+ LargestAcked: 2000,
+ LowestAcked: 1,
+ AckRanges: []AckRange{
+ {First: 1500, Last: 2000},
+ {First: 290, Last: 295},
+ {First: 1, Last: 19},
+ },
+ }
+ err := f.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(f.MinLength(versionBigEndian)).To(Equal(protocol.ByteCount(b.Len())))
+ })
+
+ It("has the proper min length for an ACK with a long ACK range", func() {
+ largestAcked := protocol.PacketNumber(2 + 0xFFFFFF)
+ f := &AckFrame{
+ LargestAcked: largestAcked,
+ LowestAcked: 1,
+ AckRanges: []AckRange{
+ {First: 1500, Last: largestAcked},
+ {First: 290, Last: 295},
+ {First: 1, Last: 19},
+ },
+ }
+ err := f.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(f.MinLength(versionBigEndian)).To(Equal(protocol.ByteCount(b.Len())))
+ })
+ })
+ })
+
+ Context("ACK range validator", func() {
+ It("accepts an ACK without NACK Ranges", func() {
+ ack := AckFrame{LargestAcked: 7}
+ Expect(ack.validateAckRanges()).To(BeTrue())
+ })
+
+ It("rejects ACK ranges with a single range", func() {
+ ack := AckFrame{
+ LargestAcked: 10,
+ AckRanges: []AckRange{{First: 1, Last: 10}},
+ }
+ Expect(ack.validateAckRanges()).To(BeFalse())
+ })
+
+ It("rejects ACK ranges with Last of the first range unequal to LargestObserved", func() {
+ ack := AckFrame{
+ LargestAcked: 10,
+ AckRanges: []AckRange{
+ {First: 8, Last: 9},
+ {First: 2, Last: 3},
+ },
+ }
+ Expect(ack.validateAckRanges()).To(BeFalse())
+ })
+
+ It("rejects ACK ranges with First greater than Last", func() {
+ ack := AckFrame{
+ LargestAcked: 10,
+ AckRanges: []AckRange{
+ {First: 8, Last: 10},
+ {First: 4, Last: 3},
+ },
+ }
+ Expect(ack.validateAckRanges()).To(BeFalse())
+ })
+
+ It("rejects ACK ranges with First greater than LargestObserved", func() {
+ ack := AckFrame{
+ LargestAcked: 5,
+ AckRanges: []AckRange{
+ {First: 4, Last: 10},
+ {First: 1, Last: 2},
+ },
+ }
+ Expect(ack.validateAckRanges()).To(BeFalse())
+ })
+
+ It("rejects ACK ranges in the wrong order", func() {
+ ack := AckFrame{
+ LargestAcked: 7,
+ AckRanges: []AckRange{
+ {First: 2, Last: 2},
+ {First: 6, Last: 7},
+ },
+ }
+ Expect(ack.validateAckRanges()).To(BeFalse())
+ })
+
+ It("rejects with overlapping ACK ranges", func() {
+ ack := AckFrame{
+ LargestAcked: 7,
+ AckRanges: []AckRange{
+ {First: 5, Last: 7},
+ {First: 2, Last: 5},
+ },
+ }
+ Expect(ack.validateAckRanges()).To(BeFalse())
+ })
+
+ It("rejects ACK ranges that are part of a larger ACK range", func() {
+ ack := AckFrame{
+ LargestAcked: 7,
+ AckRanges: []AckRange{
+ {First: 4, Last: 7},
+ {First: 5, Last: 6},
+ },
+ }
+ Expect(ack.validateAckRanges()).To(BeFalse())
+ })
+
+ It("rejects with directly adjacent ACK ranges", func() {
+ ack := AckFrame{
+ LargestAcked: 7,
+ AckRanges: []AckRange{
+ {First: 5, Last: 7},
+ {First: 2, Last: 4},
+ },
+ }
+ Expect(ack.validateAckRanges()).To(BeFalse())
+ })
+
+ It("accepts an ACK with one lost packet", func() {
+ ack := AckFrame{
+ LargestAcked: 10,
+ AckRanges: []AckRange{
+ {First: 5, Last: 10},
+ {First: 1, Last: 3},
+ },
+ }
+ Expect(ack.validateAckRanges()).To(BeTrue())
+ })
+
+ It("accepts an ACK with multiple lost packets", func() {
+ ack := AckFrame{
+ LargestAcked: 20,
+ AckRanges: []AckRange{
+ {First: 15, Last: 20},
+ {First: 10, Last: 12},
+ {First: 1, Last: 3},
+ },
+ }
+ Expect(ack.validateAckRanges()).To(BeTrue())
+ })
+ })
+
+ Context("check if ACK frame acks a certain packet", func() {
+ It("works with an ACK without any ranges", func() {
+ f := AckFrame{
+ LowestAcked: 5,
+ LargestAcked: 10,
+ }
+ Expect(f.AcksPacket(1)).To(BeFalse())
+ Expect(f.AcksPacket(4)).To(BeFalse())
+ Expect(f.AcksPacket(5)).To(BeTrue())
+ Expect(f.AcksPacket(8)).To(BeTrue())
+ Expect(f.AcksPacket(10)).To(BeTrue())
+ Expect(f.AcksPacket(11)).To(BeFalse())
+ Expect(f.AcksPacket(20)).To(BeFalse())
+ })
+
+ It("works with an ACK with multiple ACK ranges", func() {
+ f := AckFrame{
+ LowestAcked: 5,
+ LargestAcked: 20,
+ AckRanges: []AckRange{
+ {First: 15, Last: 20},
+ {First: 5, Last: 8},
+ },
+ }
+ Expect(f.AcksPacket(4)).To(BeFalse())
+ Expect(f.AcksPacket(5)).To(BeTrue())
+ Expect(f.AcksPacket(7)).To(BeTrue())
+ Expect(f.AcksPacket(8)).To(BeTrue())
+ Expect(f.AcksPacket(9)).To(BeFalse())
+ Expect(f.AcksPacket(14)).To(BeFalse())
+ Expect(f.AcksPacket(15)).To(BeTrue())
+ Expect(f.AcksPacket(18)).To(BeTrue())
+ Expect(f.AcksPacket(20)).To(BeTrue())
+ Expect(f.AcksPacket(21)).To(BeFalse())
+ })
+ })
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/ack_frame_test.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/ack_frame_test.go
new file mode 100644
index 0000000..ef54ca8
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/ack_frame_test.go
@@ -0,0 +1,367 @@
+package wire
+
+import (
+ "bytes"
+ "io"
+ "time"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+)
+
+var _ = Describe("ACK Frame (for IETF QUIC)", func() {
+ Context("parsing", func() {
+ It("parses an ACK frame without any ranges", func() {
+ data := []byte{0xe}
+ data = append(data, encodeVarInt(100)...) // largest acked
+ data = append(data, encodeVarInt(0)...) // delay
+ data = append(data, encodeVarInt(0)...) // num blocks
+ data = append(data, encodeVarInt(10)...) // first ack block
+ b := bytes.NewReader(data)
+ frame, err := ParseAckFrame(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(100)))
+ Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(90)))
+ Expect(frame.HasMissingRanges()).To(BeFalse())
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("parses an ACK frame that only acks a single packet", func() {
+ data := []byte{0xe}
+ data = append(data, encodeVarInt(55)...) // largest acked
+ data = append(data, encodeVarInt(0)...) // delay
+ data = append(data, encodeVarInt(0)...) // num blocks
+ data = append(data, encodeVarInt(0)...) // first ack block
+ b := bytes.NewReader(data)
+ frame, err := ParseAckFrame(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(55)))
+ Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(55)))
+ Expect(frame.HasMissingRanges()).To(BeFalse())
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("accepts an ACK frame that acks all packets from 0 to largest", func() {
+ data := []byte{0xe}
+ data = append(data, encodeVarInt(20)...) // largest acked
+ data = append(data, encodeVarInt(0)...) // delay
+ data = append(data, encodeVarInt(0)...) // num blocks
+ data = append(data, encodeVarInt(20)...) // first ack block
+ b := bytes.NewReader(data)
+ frame, err := ParseAckFrame(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(20)))
+ Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(0)))
+ Expect(frame.HasMissingRanges()).To(BeFalse())
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("rejects an ACK frame that has a first ACK block which is larger than LargestAcked", func() {
+ data := []byte{0xe}
+ data = append(data, encodeVarInt(20)...) // largest acked
+ data = append(data, encodeVarInt(0)...) // delay
+ data = append(data, encodeVarInt(0)...) // num blocks
+ data = append(data, encodeVarInt(21)...) // first ack block
+ b := bytes.NewReader(data)
+ _, err := ParseAckFrame(b, versionIETFFrames)
+ Expect(err).To(MatchError("invalid first ACK range"))
+ })
+
+ It("parses an ACK frame that has a single block", func() {
+ data := []byte{0xe}
+ data = append(data, encodeVarInt(1000)...) // largest acked
+ data = append(data, encodeVarInt(0)...) // delay
+ data = append(data, encodeVarInt(1)...) // num blocks
+ data = append(data, encodeVarInt(100)...) // first ack block
+ data = append(data, encodeVarInt(98)...) // gap
+ data = append(data, encodeVarInt(50)...) // ack block
+ b := bytes.NewReader(data)
+ frame, err := ParseAckFrame(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(1000)))
+ Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(750)))
+ Expect(frame.HasMissingRanges()).To(BeTrue())
+ Expect(frame.AckRanges).To(Equal([]AckRange{
+ AckRange{Last: 1000, First: 900},
+ AckRange{Last: 800, First: 750},
+ }))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("parses an ACK frame that has a multiple blocks", func() {
+ data := []byte{0xe}
+ data = append(data, encodeVarInt(100)...) // largest acked
+ data = append(data, encodeVarInt(0)...) // delay
+ data = append(data, encodeVarInt(2)...) // num blocks
+ data = append(data, encodeVarInt(0)...) // first ack block
+ data = append(data, encodeVarInt(0)...) // gap
+ data = append(data, encodeVarInt(0)...) // ack block
+ data = append(data, encodeVarInt(1)...) // gap
+ data = append(data, encodeVarInt(1)...) // ack block
+ b := bytes.NewReader(data)
+ frame, err := ParseAckFrame(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(100)))
+ Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(94)))
+ Expect(frame.HasMissingRanges()).To(BeTrue())
+ Expect(frame.AckRanges).To(Equal([]AckRange{
+ AckRange{Last: 100, First: 100},
+ AckRange{Last: 98, First: 98},
+ AckRange{Last: 95, First: 94},
+ }))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("errors on EOF", func() {
+ data := []byte{0xe}
+ data = append(data, encodeVarInt(1000)...) // largest acked
+ data = append(data, encodeVarInt(0)...) // delay
+ data = append(data, encodeVarInt(1)...) // num blocks
+ data = append(data, encodeVarInt(100)...) // first ack block
+ data = append(data, encodeVarInt(98)...) // gap
+ data = append(data, encodeVarInt(50)...) // ack block
+ _, err := ParseAckFrame(bytes.NewReader(data), versionIETFFrames)
+ Expect(err).NotTo(HaveOccurred())
+ for i := range data {
+ _, err := ParseAckFrame(bytes.NewReader(data[0:i]), versionIETFFrames)
+ Expect(err).To(MatchError(io.EOF))
+ }
+ })
+ })
+
+ Context("when writing", func() {
+ It("writes a frame that acks a single packet", func() {
+ buf := &bytes.Buffer{}
+ f := &AckFrame{
+ LargestAcked: 0xdeadbeef,
+ LowestAcked: 0xdeadbeef,
+ DelayTime: 18 * time.Second,
+ }
+ err := f.Write(buf, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(f.MinLength(versionIETFFrames)).To(BeEquivalentTo(buf.Len()))
+ b := bytes.NewReader(buf.Bytes())
+ frame, err := ParseAckFrame(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame).To(Equal(f))
+ Expect(frame.HasMissingRanges()).To(BeFalse())
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("writes a frame that acks many packets", func() {
+ buf := &bytes.Buffer{}
+ f := &AckFrame{
+ LargestAcked: 0xdecafbad,
+ LowestAcked: 0x1337,
+ }
+ err := f.Write(buf, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(f.MinLength(versionIETFFrames)).To(BeEquivalentTo(buf.Len()))
+ b := bytes.NewReader(buf.Bytes())
+ frame, err := ParseAckFrame(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame).To(Equal(f))
+ Expect(frame.HasMissingRanges()).To(BeFalse())
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("writes a frame with a a single gap", func() {
+ buf := &bytes.Buffer{}
+ f := &AckFrame{
+ LargestAcked: 1000,
+ LowestAcked: 100,
+ AckRanges: []AckRange{
+ {First: 400, Last: 1000},
+ {First: 100, Last: 200},
+ },
+ }
+ Expect(f.validateAckRanges()).To(BeTrue())
+ err := f.Write(buf, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(f.MinLength(versionIETFFrames)).To(BeEquivalentTo(buf.Len()))
+ b := bytes.NewReader(buf.Bytes())
+ frame, err := ParseAckFrame(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame).To(Equal(f))
+ Expect(frame.HasMissingRanges()).To(BeTrue())
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("writes a frame with multiple ranges", func() {
+ buf := &bytes.Buffer{}
+ f := &AckFrame{
+ LargestAcked: 10,
+ LowestAcked: 1,
+ AckRanges: []AckRange{
+ {First: 10, Last: 10},
+ {First: 8, Last: 8},
+ {First: 5, Last: 6},
+ {First: 1, Last: 3},
+ },
+ }
+ Expect(f.validateAckRanges()).To(BeTrue())
+ err := f.Write(buf, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(f.MinLength(versionIETFFrames)).To(BeEquivalentTo(buf.Len()))
+ b := bytes.NewReader(buf.Bytes())
+ frame, err := ParseAckFrame(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame).To(Equal(f))
+ Expect(frame.HasMissingRanges()).To(BeTrue())
+ Expect(b.Len()).To(BeZero())
+ })
+ })
+
+ Context("ACK range validator", func() {
+ It("accepts an ACK without NACK Ranges", func() {
+ ack := AckFrame{LargestAcked: 7}
+ Expect(ack.validateAckRanges()).To(BeTrue())
+ })
+
+ It("rejects ACK ranges with a single range", func() {
+ ack := AckFrame{
+ LargestAcked: 10,
+ AckRanges: []AckRange{{First: 1, Last: 10}},
+ }
+ Expect(ack.validateAckRanges()).To(BeFalse())
+ })
+
+ It("rejects ACK ranges with Last of the first range unequal to LargestObserved", func() {
+ ack := AckFrame{
+ LargestAcked: 10,
+ AckRanges: []AckRange{
+ {First: 8, Last: 9},
+ {First: 2, Last: 3},
+ },
+ }
+ Expect(ack.validateAckRanges()).To(BeFalse())
+ })
+
+ It("rejects ACK ranges with First greater than Last", func() {
+ ack := AckFrame{
+ LargestAcked: 10,
+ AckRanges: []AckRange{
+ {First: 8, Last: 10},
+ {First: 4, Last: 3},
+ },
+ }
+ Expect(ack.validateAckRanges()).To(BeFalse())
+ })
+
+ It("rejects ACK ranges with First greater than LargestObserved", func() {
+ ack := AckFrame{
+ LargestAcked: 5,
+ AckRanges: []AckRange{
+ {First: 4, Last: 10},
+ {First: 1, Last: 2},
+ },
+ }
+ Expect(ack.validateAckRanges()).To(BeFalse())
+ })
+
+ It("rejects ACK ranges in the wrong order", func() {
+ ack := AckFrame{
+ LargestAcked: 7,
+ AckRanges: []AckRange{
+ {First: 2, Last: 2},
+ {First: 6, Last: 7},
+ },
+ }
+ Expect(ack.validateAckRanges()).To(BeFalse())
+ })
+
+ It("rejects with overlapping ACK ranges", func() {
+ ack := AckFrame{
+ LargestAcked: 7,
+ AckRanges: []AckRange{
+ {First: 5, Last: 7},
+ {First: 2, Last: 5},
+ },
+ }
+ Expect(ack.validateAckRanges()).To(BeFalse())
+ })
+
+ It("rejects ACK ranges that are part of a larger ACK range", func() {
+ ack := AckFrame{
+ LargestAcked: 7,
+ AckRanges: []AckRange{
+ {First: 4, Last: 7},
+ {First: 5, Last: 6},
+ },
+ }
+ Expect(ack.validateAckRanges()).To(BeFalse())
+ })
+
+ It("rejects with directly adjacent ACK ranges", func() {
+ ack := AckFrame{
+ LargestAcked: 7,
+ AckRanges: []AckRange{
+ {First: 5, Last: 7},
+ {First: 2, Last: 4},
+ },
+ }
+ Expect(ack.validateAckRanges()).To(BeFalse())
+ })
+
+ It("accepts an ACK with one lost packet", func() {
+ ack := AckFrame{
+ LargestAcked: 10,
+ AckRanges: []AckRange{
+ {First: 5, Last: 10},
+ {First: 1, Last: 3},
+ },
+ }
+ Expect(ack.validateAckRanges()).To(BeTrue())
+ })
+
+ It("accepts an ACK with multiple lost packets", func() {
+ ack := AckFrame{
+ LargestAcked: 20,
+ AckRanges: []AckRange{
+ {First: 15, Last: 20},
+ {First: 10, Last: 12},
+ {First: 1, Last: 3},
+ },
+ }
+ Expect(ack.validateAckRanges()).To(BeTrue())
+ })
+ })
+
+ Context("check if ACK frame acks a certain packet", func() {
+ It("works with an ACK without any ranges", func() {
+ f := AckFrame{
+ LowestAcked: 5,
+ LargestAcked: 10,
+ }
+ Expect(f.AcksPacket(1)).To(BeFalse())
+ Expect(f.AcksPacket(4)).To(BeFalse())
+ Expect(f.AcksPacket(5)).To(BeTrue())
+ Expect(f.AcksPacket(8)).To(BeTrue())
+ Expect(f.AcksPacket(10)).To(BeTrue())
+ Expect(f.AcksPacket(11)).To(BeFalse())
+ Expect(f.AcksPacket(20)).To(BeFalse())
+ })
+
+ It("works with an ACK with multiple ACK ranges", func() {
+ f := AckFrame{
+ LowestAcked: 5,
+ LargestAcked: 20,
+ AckRanges: []AckRange{
+ {First: 15, Last: 20},
+ {First: 5, Last: 8},
+ },
+ }
+ Expect(f.AcksPacket(4)).To(BeFalse())
+ Expect(f.AcksPacket(5)).To(BeTrue())
+ Expect(f.AcksPacket(7)).To(BeTrue())
+ Expect(f.AcksPacket(8)).To(BeTrue())
+ Expect(f.AcksPacket(9)).To(BeFalse())
+ Expect(f.AcksPacket(14)).To(BeFalse())
+ Expect(f.AcksPacket(15)).To(BeTrue())
+ Expect(f.AcksPacket(18)).To(BeTrue())
+ Expect(f.AcksPacket(20)).To(BeTrue())
+ Expect(f.AcksPacket(21)).To(BeFalse())
+ })
+ })
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/ack_range.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/ack_range.go
new file mode 100644
index 0000000..c561762
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/ack_range.go
@@ -0,0 +1,9 @@
+package wire
+
+import "github.com/lucas-clemente/quic-go/internal/protocol"
+
+// AckRange is an ACK range
+type AckRange struct {
+ First protocol.PacketNumber
+ Last protocol.PacketNumber
+}
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/blocked_frame.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/blocked_frame.go
new file mode 100644
index 0000000..cc6a016
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/blocked_frame.go
@@ -0,0 +1,35 @@
+package wire
+
+import (
+ "bytes"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+)
+
+// A BlockedFrame is a BLOCKED frame
+type BlockedFrame struct{}
+
+// ParseBlockedFrame parses a BLOCKED frame
+func ParseBlockedFrame(r *bytes.Reader, version protocol.VersionNumber) (*BlockedFrame, error) {
+ if _, err := r.ReadByte(); err != nil {
+ return nil, err
+ }
+ return &BlockedFrame{}, nil
+}
+
+func (f *BlockedFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error {
+ if !version.UsesIETFFrameFormat() {
+ return (&blockedFrameLegacy{}).Write(b, version)
+ }
+ typeByte := uint8(0x08)
+ b.WriteByte(typeByte)
+ return nil
+}
+
+// MinLength of a written frame
+func (f *BlockedFrame) MinLength(version protocol.VersionNumber) (protocol.ByteCount, error) {
+ if !version.UsesIETFFrameFormat() { // writing this frame would result in a legacy BLOCKED being written, which is longer
+ return 1 + 4, nil
+ }
+ return 1, nil
+}
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/blocked_frame_legacy.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/blocked_frame_legacy.go
new file mode 100644
index 0000000..41cf0ee
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/blocked_frame_legacy.go
@@ -0,0 +1,37 @@
+package wire
+
+import (
+ "bytes"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+)
+
+type blockedFrameLegacy struct {
+ StreamID protocol.StreamID
+}
+
+// ParseBlockedFrameLegacy parses a BLOCKED frame (in gQUIC format)
+// The frame returned is
+// * a STREAM_BLOCKED frame, if the BLOCKED applies to a stream
+// * a BLOCKED frame, if the BLOCKED applies to the connection
+func ParseBlockedFrameLegacy(r *bytes.Reader, _ protocol.VersionNumber) (Frame, error) {
+ if _, err := r.ReadByte(); err != nil { // read the TypeByte
+ return nil, err
+ }
+ streamID, err := utils.BigEndian.ReadUint32(r)
+ if err != nil {
+ return nil, err
+ }
+ if streamID == 0 {
+ return &BlockedFrame{}, nil
+ }
+ return &StreamBlockedFrame{StreamID: protocol.StreamID(streamID)}, nil
+}
+
+//Write writes a BLOCKED frame
+func (f *blockedFrameLegacy) Write(b *bytes.Buffer, _ protocol.VersionNumber) error {
+ b.WriteByte(0x05)
+ utils.BigEndian.WriteUint32(b, uint32(f.StreamID))
+ return nil
+}
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/blocked_frame_legacy_test.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/blocked_frame_legacy_test.go
new file mode 100644
index 0000000..6084ea6
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/blocked_frame_legacy_test.go
@@ -0,0 +1,65 @@
+package wire
+
+import (
+ "bytes"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+)
+
+var _ = Describe("legacy BLOCKED Frame", func() {
+ Context("when parsing", func() {
+ It("accepts sample frame for a stream", func() {
+ b := bytes.NewReader([]byte{0x5, 0xde, 0xad, 0xbe, 0xef})
+ f, err := ParseBlockedFrameLegacy(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(f).To(BeAssignableToTypeOf(&StreamBlockedFrame{}))
+ frame := f.(*StreamBlockedFrame)
+ Expect(frame.StreamID).To(Equal(protocol.StreamID(0xdeadbeef)))
+ })
+
+ It("accepts sample frame for the connection", func() {
+ b := bytes.NewReader([]byte{0x5, 0x0, 0x0, 0x0, 0x0})
+ f, err := ParseBlockedFrameLegacy(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(f).To(BeAssignableToTypeOf(&BlockedFrame{}))
+ })
+ })
+
+ It("errors on EOFs", func() {
+ data := []byte{0x5, 0xef, 0xbe, 0xad, 0xde}
+ _, err := ParseBlockedFrameLegacy(bytes.NewReader(data), protocol.VersionWhatever)
+ Expect(err).NotTo(HaveOccurred())
+ for i := range data {
+ _, err := ParseBlockedFrameLegacy(bytes.NewReader(data[0:i]), protocol.VersionWhatever)
+ Expect(err).To(HaveOccurred())
+ }
+ })
+
+ Context("when writing", func() {
+ It("writes a BLOCKED frame for a stream", func() {
+ b := &bytes.Buffer{}
+ frame := StreamBlockedFrame{StreamID: 0x1337}
+ frame.Write(b, versionBigEndian)
+ Expect(b.Bytes()).To(Equal([]byte{0x5, 0x0, 0x0, 0x13, 0x37}))
+ })
+
+ It("has the correct min length for a BLOCKED frame for a stream", func() {
+ frame := StreamBlockedFrame{StreamID: 3}
+ Expect(frame.MinLength(versionBigEndian)).To(Equal(protocol.ByteCount(5)))
+ })
+
+ It("writes a BLOCKED frame for the connection", func() {
+ b := &bytes.Buffer{}
+ frame := BlockedFrame{}
+ frame.Write(b, versionBigEndian)
+ Expect(b.Bytes()).To(Equal([]byte{0x5, 0x0, 0x0, 0x0, 0x0}))
+ })
+
+ It("has the correct min length for a BLOCKED frame for the connection", func() {
+ frame := BlockedFrame{}
+ Expect(frame.MinLength(versionBigEndian)).To(Equal(protocol.ByteCount(5)))
+ })
+ })
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/blocked_frame_test.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/blocked_frame_test.go
new file mode 100644
index 0000000..9a3e2dd
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/blocked_frame_test.go
@@ -0,0 +1,41 @@
+package wire
+
+import (
+ "bytes"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+)
+
+var _ = Describe("BLOCKED frame", func() {
+ Context("when parsing", func() {
+ It("accepts sample frame", func() {
+ b := bytes.NewReader([]byte{0x08})
+ _, err := ParseBlockedFrame(b, protocol.VersionWhatever)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("errors on EOFs", func() {
+ _, err := ParseBlockedFrame(bytes.NewReader(nil), protocol.VersionWhatever)
+ Expect(err).To(HaveOccurred())
+ })
+ })
+
+ Context("when writing", func() {
+ It("writes a sample frame", func() {
+ b := &bytes.Buffer{}
+ frame := BlockedFrame{}
+ err := frame.Write(b, protocol.VersionWhatever)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()).To(Equal([]byte{0x08}))
+ })
+
+ It("has the correct min length", func() {
+ frame := BlockedFrame{}
+ Expect(frame.MinLength(versionIETFFrames)).To(Equal(protocol.ByteCount(1)))
+ })
+ })
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/connection_close_frame.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/connection_close_frame.go
new file mode 100644
index 0000000..2cad865
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/connection_close_frame.go
@@ -0,0 +1,96 @@
+package wire
+
+import (
+ "bytes"
+ "errors"
+ "io"
+ "math"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+ "github.com/lucas-clemente/quic-go/qerr"
+)
+
+// A ConnectionCloseFrame in QUIC
+type ConnectionCloseFrame struct {
+ ErrorCode qerr.ErrorCode
+ ReasonPhrase string
+}
+
+// ParseConnectionCloseFrame reads a CONNECTION_CLOSE frame
+func ParseConnectionCloseFrame(r *bytes.Reader, version protocol.VersionNumber) (*ConnectionCloseFrame, error) {
+ if _, err := r.ReadByte(); err != nil { // read the TypeByte
+ return nil, err
+ }
+
+ var errorCode qerr.ErrorCode
+ var reasonPhraseLen uint64
+ if version.UsesIETFFrameFormat() {
+ ec, err := utils.BigEndian.ReadUint16(r)
+ if err != nil {
+ return nil, err
+ }
+ errorCode = qerr.ErrorCode(ec)
+ reasonPhraseLen, err = utils.ReadVarInt(r)
+ if err != nil {
+ return nil, err
+ }
+ } else {
+ ec, err := utils.BigEndian.ReadUint32(r)
+ if err != nil {
+ return nil, err
+ }
+ errorCode = qerr.ErrorCode(ec)
+ length, err := utils.BigEndian.ReadUint16(r)
+ if err != nil {
+ return nil, err
+ }
+ reasonPhraseLen = uint64(length)
+ }
+
+ // shortcut to prevent the unneccessary allocation of dataLen bytes
+ // if the dataLen is larger than the remaining length of the packet
+ // reading the whole reason phrase would result in EOF when attempting to READ
+ if int(reasonPhraseLen) > r.Len() {
+ return nil, io.EOF
+ }
+
+ reasonPhrase := make([]byte, reasonPhraseLen)
+ if _, err := io.ReadFull(r, reasonPhrase); err != nil {
+ // this should never happen, since we already checked the reasonPhraseLen earlier
+ return nil, err
+ }
+
+ return &ConnectionCloseFrame{
+ ErrorCode: qerr.ErrorCode(errorCode),
+ ReasonPhrase: string(reasonPhrase),
+ }, nil
+}
+
+// MinLength of a written frame
+func (f *ConnectionCloseFrame) MinLength(version protocol.VersionNumber) (protocol.ByteCount, error) {
+ if version.UsesIETFFrameFormat() {
+ return 1 + 2 + utils.VarIntLen(uint64(len(f.ReasonPhrase))) + protocol.ByteCount(len(f.ReasonPhrase)), nil
+ }
+ return 1 + 4 + 2 + protocol.ByteCount(len(f.ReasonPhrase)), nil
+}
+
+// Write writes an CONNECTION_CLOSE frame.
+func (f *ConnectionCloseFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error {
+ b.WriteByte(0x02)
+
+ if len(f.ReasonPhrase) > math.MaxUint16 {
+ return errors.New("ConnectionFrame: ReasonPhrase too long")
+ }
+
+ if version.UsesIETFFrameFormat() {
+ utils.BigEndian.WriteUint16(b, uint16(f.ErrorCode))
+ utils.WriteVarInt(b, uint64(len(f.ReasonPhrase)))
+ } else {
+ utils.BigEndian.WriteUint32(b, uint32(f.ErrorCode))
+ utils.BigEndian.WriteUint16(b, uint16(len(f.ReasonPhrase)))
+ }
+ b.WriteString(f.ReasonPhrase)
+
+ return nil
+}
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/connection_close_frame_test.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/connection_close_frame_test.go
new file mode 100644
index 0000000..b0bffa8
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/connection_close_frame_test.go
@@ -0,0 +1,196 @@
+package wire
+
+import (
+ "bytes"
+ "io"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/qerr"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+)
+
+var _ = Describe("CONNECTION_CLOSE Frame", func() {
+ Context("when parsing", func() {
+ Context("in varint encoding", func() {
+ It("accepts sample frame", func() {
+ data := []byte{0x2, 0x0, 0x19}
+ data = append(data, encodeVarInt(0x1b)...) // reason phrase length
+ data = append(data, []byte{
+ 'N', 'o', ' ', 'r', 'e', 'c', 'e', 'n', 't', ' ', 'n', 'e', 't', 'w', 'o', 'r', 'k', ' ', 'a', 'c', 't', 'i', 'v', 'i', 't', 'y', '.',
+ }...)
+ b := bytes.NewReader(data)
+ frame, err := ParseConnectionCloseFrame(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.ErrorCode).To(Equal(qerr.ErrorCode(0x19)))
+ Expect(frame.ReasonPhrase).To(Equal("No recent network activity."))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("rejects long reason phrases", func() {
+ data := []byte{0x2, 0xca, 0xfe}
+ data = append(data, encodeVarInt(0xffff)...) // reason phrase length
+ b := bytes.NewReader(data)
+ _, err := ParseConnectionCloseFrame(b, versionIETFFrames)
+ Expect(err).To(MatchError(io.EOF))
+ })
+
+ It("errors on EOFs", func() {
+ data := []byte{0x2, 0x0, 0x19}
+ data = append(data, encodeVarInt(0x1b)...) // reason phrase length
+ data = append(data, []byte{
+ 'N', 'o', ' ', 'r', 'e', 'c', 'e', 'n', 't', ' ', 'n', 'e', 't', 'w', 'o', 'r', 'k', ' ', 'a', 'c', 't', 'i', 'v', 'i', 't', 'y', '.',
+ }...)
+ _, err := ParseConnectionCloseFrame(bytes.NewReader(data), versionIETFFrames)
+ Expect(err).NotTo(HaveOccurred())
+ for i := range data {
+ _, err := ParseConnectionCloseFrame(bytes.NewReader(data[0:i]), versionIETFFrames)
+ Expect(err).To(HaveOccurred())
+ }
+ })
+
+ It("parses a frame without a reason phrase", func() {
+ data := []byte{0x2, 0xca, 0xfe}
+ data = append(data, encodeVarInt(0)...)
+ b := bytes.NewReader(data)
+ frame, err := ParseConnectionCloseFrame(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.ReasonPhrase).To(BeEmpty())
+ Expect(b.Len()).To(BeZero())
+ })
+ })
+
+ Context("in big endian", func() {
+ It("accepts sample frame", func() {
+ b := bytes.NewReader([]byte{0x2,
+ 0x0, 0x0, 0x0, 0x19, // error code
+ 0x0, 0x1b, // reason phrase length
+ 'N', 'o', ' ', 'r', 'e', 'c', 'e', 'n', 't', ' ', 'n', 'e', 't', 'w', 'o', 'r', 'k', ' ', 'a', 'c', 't', 'i', 'v', 'i', 't', 'y', '.',
+ })
+ frame, err := ParseConnectionCloseFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.ErrorCode).To(Equal(qerr.ErrorCode(0x19)))
+ Expect(frame.ReasonPhrase).To(Equal("No recent network activity."))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("rejects long reason phrases", func() {
+ b := bytes.NewReader([]byte{0x2,
+ 0xad, 0xfb, 0xca, 0xde, // error code
+ 0xff, 0x0, // reason phrase length
+ })
+ _, err := ParseConnectionCloseFrame(b, versionBigEndian)
+ Expect(err).To(MatchError(io.EOF))
+ })
+
+ It("errors on EOFs", func() {
+ data := []byte{0x40,
+ 0x19, 0x0, 0x0, 0x0, // error code
+ 0x0, 0x1b, // reason phrase length
+ 'N', 'o', ' ', 'r', 'e', 'c', 'e', 'n', 't', ' ', 'n', 'e', 't', 'w', 'o', 'r', 'k', ' ', 'a', 'c', 't', 'i', 'v', 'i', 't', 'y', '.',
+ }
+ _, err := ParseConnectionCloseFrame(bytes.NewReader(data), versionBigEndian)
+ Expect(err).NotTo(HaveOccurred())
+ for i := range data {
+ _, err := ParseConnectionCloseFrame(bytes.NewReader(data[0:i]), versionBigEndian)
+ Expect(err).To(HaveOccurred())
+ }
+ })
+
+ It("parses a frame without a reason phrase", func() {
+ b := bytes.NewReader([]byte{0x2,
+ 0xad, 0xfb, 0xca, 0xde, // error code
+ 0x0, 0x0, // reason phrase length
+ })
+ frame, err := ParseConnectionCloseFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.ReasonPhrase).To(BeEmpty())
+ Expect(b.Len()).To(BeZero())
+ })
+ })
+ })
+
+ Context("when writing", func() {
+ Context("in varint encoding", func() {
+ It("writes a frame without a ReasonPhrase", func() {
+ b := &bytes.Buffer{}
+ frame := &ConnectionCloseFrame{
+ ErrorCode: 0xbeef,
+ }
+ err := frame.Write(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ expected := []byte{0x2, 0xbe, 0xef}
+ expected = append(expected, encodeVarInt(0)...)
+ Expect(b.Bytes()).To(Equal(expected))
+ })
+
+ It("writes a frame with a ReasonPhrase", func() {
+ b := &bytes.Buffer{}
+ frame := &ConnectionCloseFrame{
+ ErrorCode: 0xdead,
+ ReasonPhrase: "foobar",
+ }
+ err := frame.Write(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ expected := []byte{0x2, 0xde, 0xad}
+ expected = append(expected, encodeVarInt(6)...)
+ expected = append(expected, []byte{'f', 'o', 'o', 'b', 'a', 'r'}...)
+ Expect(b.Bytes()).To(Equal(expected))
+ })
+
+ It("has proper min length", func() {
+ b := &bytes.Buffer{}
+ f := &ConnectionCloseFrame{
+ ErrorCode: 0xcafe,
+ ReasonPhrase: "foobar",
+ }
+ err := f.Write(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(f.MinLength(versionIETFFrames)).To(Equal(protocol.ByteCount(b.Len())))
+ })
+ })
+
+ Context("in big endian", func() {
+ It("writes a frame without a ReasonPhrase", func() {
+ b := &bytes.Buffer{}
+ frame := &ConnectionCloseFrame{
+ ErrorCode: 0xdeadbeef,
+ }
+ err := frame.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Len()).To(Equal(1 + 2 + 4))
+ Expect(b.Bytes()).To(Equal([]byte{0x2,
+ 0xde, 0xad, 0xbe, 0xef, // error code
+ 0x0, 0x0, // reason phrase length
+ }))
+ })
+
+ It("writes a frame with a ReasonPhrase", func() {
+ b := &bytes.Buffer{}
+ frame := &ConnectionCloseFrame{
+ ErrorCode: 0xdeadbeef,
+ ReasonPhrase: "foobar",
+ }
+ err := frame.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Len()).To(Equal(1 + 2 + 4 + len(frame.ReasonPhrase)))
+ Expect(b.Bytes()).To(Equal([]byte{0x2,
+ 0xde, 0xad, 0xbe, 0xef, // error code
+ 0x0, 0x6, // reason phrase length
+ 'f', 'o', 'o', 'b', 'a', 'r',
+ }))
+ })
+
+ It("has proper min length", func() {
+ b := &bytes.Buffer{}
+ f := &ConnectionCloseFrame{
+ ErrorCode: 0xcafe,
+ ReasonPhrase: "foobar",
+ }
+ err := f.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(f.MinLength(versionBigEndian)).To(Equal(protocol.ByteCount(b.Len())))
+ })
+ })
+ })
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/frames/frame.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/frame.go
similarity index 74%
rename from vendor/github.com/lucas-clemente/quic-go/frames/frame.go
rename to vendor/github.com/lucas-clemente/quic-go/internal/wire/frame.go
index 464e669..f31f5bf 100644
--- a/vendor/github.com/lucas-clemente/quic-go/frames/frame.go
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/frame.go
@@ -1,9 +1,9 @@
-package frames
+package wire
import (
"bytes"
- "github.com/lucas-clemente/quic-go/protocol"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
)
// A Frame in QUIC
diff --git a/vendor/github.com/lucas-clemente/quic-go/frames/goaway_frame.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/goaway_frame.go
similarity index 61%
rename from vendor/github.com/lucas-clemente/quic-go/frames/goaway_frame.go
rename to vendor/github.com/lucas-clemente/quic-go/internal/wire/goaway_frame.go
index 7d452d5..44a613c 100644
--- a/vendor/github.com/lucas-clemente/quic-go/frames/goaway_frame.go
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/goaway_frame.go
@@ -1,12 +1,12 @@
-package frames
+package wire
import (
"bytes"
"io"
- "github.com/lucas-clemente/quic-go/protocol"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
"github.com/lucas-clemente/quic-go/qerr"
- "github.com/lucas-clemente/quic-go/utils"
)
// A GoawayFrame is a GOAWAY frame
@@ -17,27 +17,26 @@ type GoawayFrame struct {
}
// ParseGoawayFrame parses a GOAWAY frame
-func ParseGoawayFrame(r *bytes.Reader) (*GoawayFrame, error) {
+func ParseGoawayFrame(r *bytes.Reader, _ protocol.VersionNumber) (*GoawayFrame, error) {
frame := &GoawayFrame{}
- _, err := r.ReadByte()
- if err != nil {
+ if _, err := r.ReadByte(); err != nil {
return nil, err
}
- errorCode, err := utils.ReadUint32(r)
+ errorCode, err := utils.BigEndian.ReadUint32(r)
if err != nil {
return nil, err
}
frame.ErrorCode = qerr.ErrorCode(errorCode)
- lastGoodStream, err := utils.ReadUint32(r)
+ lastGoodStream, err := utils.BigEndian.ReadUint32(r)
if err != nil {
return nil, err
}
frame.LastGoodStream = protocol.StreamID(lastGoodStream)
- reasonPhraseLen, err := utils.ReadUint16(r)
+ reasonPhraseLen, err := utils.BigEndian.ReadUint16(r)
if err != nil {
return nil, err
}
@@ -51,19 +50,15 @@ func ParseGoawayFrame(r *bytes.Reader) (*GoawayFrame, error) {
return nil, err
}
frame.ReasonPhrase = string(reasonPhrase)
-
return frame, nil
}
-func (f *GoawayFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error {
- typeByte := uint8(0x03)
- b.WriteByte(typeByte)
-
- utils.WriteUint32(b, uint32(f.ErrorCode))
- utils.WriteUint32(b, uint32(f.LastGoodStream))
- utils.WriteUint16(b, uint16(len(f.ReasonPhrase)))
+func (f *GoawayFrame) Write(b *bytes.Buffer, _ protocol.VersionNumber) error {
+ b.WriteByte(0x03)
+ utils.BigEndian.WriteUint32(b, uint32(f.ErrorCode))
+ utils.BigEndian.WriteUint32(b, uint32(f.LastGoodStream))
+ utils.BigEndian.WriteUint16(b, uint16(len(f.ReasonPhrase)))
b.WriteString(f.ReasonPhrase)
-
return nil
}
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/goaway_frame_test.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/goaway_frame_test.go
new file mode 100644
index 0000000..d9f33d7
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/goaway_frame_test.go
@@ -0,0 +1,87 @@
+package wire
+
+import (
+ "bytes"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/qerr"
+
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+)
+
+var _ = Describe("GoawayFrame", func() {
+ Context("when parsing", func() {
+ Context("in big endian", func() {
+ It("accepts sample frame", func() {
+ b := bytes.NewReader([]byte{0x3,
+ 0x0, 0x0, 0x13, 0x37, // error code
+ 0x0, 0x0, 0x12, 0x34, // last good stream id
+ 0x0, 0x3, // reason phrase length
+ 'f', 'o', 'o',
+ })
+ frame, err := ParseGoawayFrame(b, versionBigEndian)
+ Expect(frame).To(Equal(&GoawayFrame{
+ ErrorCode: 0x1337,
+ LastGoodStream: 0x1234,
+ ReasonPhrase: "foo",
+ }))
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("errors on EOFs", func() {
+ data := []byte{0x3,
+ 0x0, 0x0, 0x0, 0x1, // error code
+ 0x0, 0x0, 0x0, 0x2, // last good stream id
+ 0x0, 0x3, // reason phrase length
+ 'f', 'o', 'o',
+ }
+ _, err := ParseGoawayFrame(bytes.NewReader(data), versionBigEndian)
+ Expect(err).NotTo(HaveOccurred())
+ for i := range data {
+ _, err := ParseGoawayFrame(bytes.NewReader(data[0:i]), versionBigEndian)
+ Expect(err).To(HaveOccurred())
+ }
+ })
+ })
+
+ It("rejects long reason phrases", func() {
+ b := bytes.NewReader([]byte{0x3,
+ 0x1, 0x0, 0x0, 0x0, // error code
+ 0x2, 0x0, 0x0, 0x0, // last good stream id
+ 0xff, 0xff, // reason phrase length
+ })
+ _, err := ParseGoawayFrame(b, protocol.VersionWhatever)
+ Expect(err).To(MatchError(qerr.Error(qerr.InvalidGoawayData, "reason phrase too long")))
+ })
+ })
+
+ Context("when writing", func() {
+ Context("in big endian", func() {
+ It("writes a sample frame", func() {
+ b := &bytes.Buffer{}
+ frame := GoawayFrame{
+ ErrorCode: 0x1337,
+ LastGoodStream: 2,
+ ReasonPhrase: "foo",
+ }
+ err := frame.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()).To(Equal([]byte{0x3,
+ 0x0, 0x0, 0x13, 0x37, // reason code
+ 0x0, 0x0, 0x0, 0x2, // last good stream id
+ 0x0, 0x3, // reason phrase length
+ 'f', 'o', 'o',
+ }))
+ })
+ })
+
+ It("has the correct min length", func() {
+ frame := GoawayFrame{
+ ReasonPhrase: "foo",
+ }
+ Expect(frame.MinLength(0)).To(Equal(protocol.ByteCount(14)))
+ })
+ })
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/header.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/header.go
new file mode 100644
index 0000000..19c45c3
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/header.go
@@ -0,0 +1,110 @@
+package wire
+
+import (
+ "bytes"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+)
+
+// Header is the header of a QUIC packet.
+// It contains fields that are only needed for the gQUIC Public Header and the IETF draft Header.
+type Header struct {
+ Raw []byte
+ ConnectionID protocol.ConnectionID
+ OmitConnectionID bool
+ PacketNumberLen protocol.PacketNumberLen
+ PacketNumber protocol.PacketNumber
+ Version protocol.VersionNumber // VersionNumber sent by the client
+
+ IsVersionNegotiation bool
+ SupportedVersions []protocol.VersionNumber // Version Number sent in a Version Negotiation Packet by the server
+
+ // only needed for the gQUIC Public Header
+ VersionFlag bool
+ ResetFlag bool
+ DiversificationNonce []byte
+
+ // only needed for the IETF Header
+ Type protocol.PacketType
+ IsLongHeader bool
+ KeyPhase int
+
+ // only needed for logging
+ isPublicHeader bool
+}
+
+// ParseHeaderSentByServer parses the header for a packet that was sent by the server.
+func ParseHeaderSentByServer(b *bytes.Reader, version protocol.VersionNumber) (*Header, error) {
+ typeByte, err := b.ReadByte()
+ if err != nil {
+ return nil, err
+ }
+ _ = b.UnreadByte() // unread the type byte
+
+ var isPublicHeader bool
+ if typeByte&0x80 > 0 { // gQUIC always has 0x80 unset. IETF Long Header or Version Negotiation
+ isPublicHeader = false
+ } else if typeByte&0xcf == 0x9 { // gQUIC Version Negotiation Packet
+ isPublicHeader = true
+ } else {
+ // the client knows the version that this packet was sent with
+ isPublicHeader = !version.UsesTLS()
+ }
+ return parsePacketHeader(b, protocol.PerspectiveServer, isPublicHeader)
+}
+
+// ParseHeaderSentByClient parses the header for a packet that was sent by the client.
+func ParseHeaderSentByClient(b *bytes.Reader) (*Header, error) {
+ typeByte, err := b.ReadByte()
+ if err != nil {
+ return nil, err
+ }
+ _ = b.UnreadByte() // unread the type byte
+
+ // If this is a gQUIC header 0x80 and 0x40 will be set to 0.
+ // If this is an IETF QUIC header there are two options:
+ // * either 0x80 will be 1 (for the Long Header)
+ // * or 0x40 (the Connection ID Flag) will be 0 (for the Short Header), since we don't the client to omit it
+ isPublicHeader := typeByte&0xc0 == 0
+
+ return parsePacketHeader(b, protocol.PerspectiveClient, isPublicHeader)
+}
+
+func parsePacketHeader(b *bytes.Reader, sentBy protocol.Perspective, isPublicHeader bool) (*Header, error) {
+ // This is a gQUIC Public Header.
+ if isPublicHeader {
+ hdr, err := parsePublicHeader(b, sentBy)
+ if err != nil {
+ return nil, err
+ }
+ hdr.isPublicHeader = true // save that this is a Public Header, so we can log it correctly later
+ return hdr, nil
+ }
+ return parseHeader(b, sentBy)
+}
+
+// Write writes the Header.
+func (h *Header) Write(b *bytes.Buffer, pers protocol.Perspective, version protocol.VersionNumber) error {
+ if !version.UsesTLS() {
+ h.isPublicHeader = true // save that this is a Public Header, so we can log it correctly later
+ return h.writePublicHeader(b, pers, version)
+ }
+ return h.writeHeader(b)
+}
+
+// GetLength determines the length of the Header.
+func (h *Header) GetLength(pers protocol.Perspective, version protocol.VersionNumber) (protocol.ByteCount, error) {
+ if !version.UsesTLS() {
+ return h.getPublicHeaderLength(pers)
+ }
+ return h.getHeaderLength()
+}
+
+// Log logs the Header
+func (h *Header) Log() {
+ if h.isPublicHeader {
+ h.logPublicHeader()
+ } else {
+ h.logHeader()
+ }
+}
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/header_test.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/header_test.go
new file mode 100644
index 0000000..4d23173
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/header_test.go
@@ -0,0 +1,257 @@
+package wire
+
+import (
+ "bytes"
+ "io"
+ "log"
+ "os"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+)
+
+var _ = Describe("Header", func() {
+ const (
+ versionPublicHeader = protocol.Version39 // a QUIC version that uses the Public Header format
+ versionIETFHeader = protocol.VersionTLS // a QUIC version taht uses the IETF Header format
+ )
+
+ Context("parsing", func() {
+ It("parses an IETF draft Short Header, when the QUIC version supports TLS", func() {
+ buf := &bytes.Buffer{}
+ // use a short header, which isn't distinguishable from the gQUIC Public Header when looking at the type byte
+ err := (&Header{
+ IsLongHeader: false,
+ KeyPhase: 1,
+ PacketNumber: 0x42,
+ PacketNumberLen: protocol.PacketNumberLen2,
+ }).writeHeader(buf)
+ Expect(err).ToNot(HaveOccurred())
+ hdr, err := ParseHeaderSentByClient(bytes.NewReader(buf.Bytes()))
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.KeyPhase).To(BeEquivalentTo(1))
+ Expect(hdr.PacketNumber).To(Equal(protocol.PacketNumber(0x42)))
+ Expect(hdr.isPublicHeader).To(BeFalse())
+ })
+
+ It("parses an IETF draft header, when the version is not known, but it has Long Header format", func() {
+ buf := &bytes.Buffer{}
+ err := (&Header{
+ IsLongHeader: true,
+ Type: protocol.PacketType0RTT,
+ PacketNumber: 0x42,
+ Version: 0x1234,
+ }).writeHeader(buf)
+ Expect(err).ToNot(HaveOccurred())
+ hdr, err := ParseHeaderSentByClient(bytes.NewReader(buf.Bytes()))
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.Type).To(Equal(protocol.PacketType0RTT))
+ Expect(hdr.PacketNumber).To(Equal(protocol.PacketNumber(0x42)))
+ Expect(hdr.isPublicHeader).To(BeFalse())
+ Expect(hdr.Version).To(Equal(protocol.VersionNumber(0x1234)))
+ })
+
+ It("doens't mistake packets with a Short Header for Version Negotiation Packets", func() {
+ // make sure this packet could be mistaken for a Version Negotiation Packet, if we only look at the 0x1 bit
+ buf := &bytes.Buffer{}
+ err := (&Header{
+ IsLongHeader: false,
+ PacketNumberLen: protocol.PacketNumberLen1,
+ PacketNumber: 0x42,
+ }).writeHeader(buf)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(buf.Bytes()[0] & 0x1).To(BeEquivalentTo(0x1))
+ hdr, err := ParseHeaderSentByServer(bytes.NewReader(buf.Bytes()), versionIETFHeader)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.isPublicHeader).To(BeFalse())
+ })
+
+ It("parses a gQUIC Public Header, when the version is not known", func() {
+ buf := &bytes.Buffer{}
+ err := (&Header{
+ VersionFlag: true,
+ Version: versionPublicHeader,
+ ConnectionID: 0x42,
+ PacketNumber: 0x1337,
+ PacketNumberLen: protocol.PacketNumberLen6,
+ }).writePublicHeader(buf, protocol.PerspectiveClient, versionPublicHeader)
+ Expect(err).ToNot(HaveOccurred())
+ hdr, err := ParseHeaderSentByClient(bytes.NewReader(buf.Bytes()))
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.PacketNumber).To(Equal(protocol.PacketNumber(0x1337)))
+ Expect(hdr.Version).To(Equal(versionPublicHeader))
+ Expect(hdr.isPublicHeader).To(BeTrue())
+ })
+
+ It("parses a gQUIC Public Header, when the version is known", func() {
+ buf := &bytes.Buffer{}
+ err := (&Header{
+ ConnectionID: 0x42,
+ PacketNumber: 0x1337,
+ PacketNumberLen: protocol.PacketNumberLen6,
+ DiversificationNonce: bytes.Repeat([]byte{'f'}, 32),
+ }).writePublicHeader(buf, protocol.PerspectiveServer, versionPublicHeader)
+ Expect(err).ToNot(HaveOccurred())
+ hdr, err := ParseHeaderSentByServer(bytes.NewReader(buf.Bytes()), versionPublicHeader)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.PacketNumber).To(Equal(protocol.PacketNumber(0x1337)))
+ Expect(hdr.DiversificationNonce).To(HaveLen(32))
+ Expect(hdr.isPublicHeader).To(BeTrue())
+ })
+
+ It("errors when parsing the gQUIC header fails", func() {
+ buf := &bytes.Buffer{}
+ err := (&Header{
+ VersionFlag: true,
+ Version: versionPublicHeader,
+ ConnectionID: 0x42,
+ PacketNumber: 0x1337,
+ PacketNumberLen: protocol.PacketNumberLen6,
+ }).writePublicHeader(buf, protocol.PerspectiveClient, versionPublicHeader)
+ Expect(err).ToNot(HaveOccurred())
+ _, err = ParseHeaderSentByClient(bytes.NewReader(buf.Bytes()[0:12]))
+ Expect(err).To(MatchError(io.EOF))
+ })
+
+ It("errors when given no data", func() {
+ _, err := ParseHeaderSentByServer(bytes.NewReader([]byte{}), protocol.VersionUnknown)
+ Expect(err).To(MatchError(io.EOF))
+ _, err = ParseHeaderSentByClient(bytes.NewReader([]byte{}))
+ Expect(err).To(MatchError(io.EOF))
+ })
+
+ It("parses a gQUIC Version Negotiation Packet", func() {
+ versions := []protocol.VersionNumber{0x13, 0x37}
+ data := ComposeGQUICVersionNegotiation(0x42, versions)
+ hdr, err := ParseHeaderSentByServer(bytes.NewReader(data), protocol.VersionUnknown)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.isPublicHeader).To(BeTrue())
+ Expect(hdr.ConnectionID).To(Equal(protocol.ConnectionID(0x42)))
+ // in addition to the versions, the supported versions might contain a reserved version number
+ for _, version := range versions {
+ Expect(hdr.SupportedVersions).To(ContainElement(version))
+ }
+ })
+
+ It("parses an IETF draft style Version Negotiation Packet", func() {
+ versions := []protocol.VersionNumber{0x13, 0x37}
+ data := ComposeVersionNegotiation(0x42, 0x77, versions)
+ hdr, err := ParseHeaderSentByServer(bytes.NewReader(data), protocol.VersionUnknown)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.isPublicHeader).To(BeFalse())
+ Expect(hdr.IsVersionNegotiation).To(BeTrue())
+ Expect(hdr.ConnectionID).To(Equal(protocol.ConnectionID(0x42)))
+ Expect(hdr.PacketNumber).To(Equal(protocol.PacketNumber(0x77)))
+ Expect(hdr.Version).To(BeZero())
+ // in addition to the versions, the supported versions might contain a reserved version number
+ for _, version := range versions {
+ Expect(hdr.SupportedVersions).To(ContainElement(version))
+ }
+ })
+ })
+
+ Context("writing", func() {
+ It("writes a gQUIC Public Header", func() {
+ buf := &bytes.Buffer{}
+ hdr := &Header{
+ ConnectionID: 0x1337,
+ PacketNumber: 0x42,
+ PacketNumberLen: protocol.PacketNumberLen2,
+ }
+ err := hdr.Write(buf, protocol.PerspectiveServer, versionPublicHeader)
+ Expect(err).ToNot(HaveOccurred())
+ _, err = parsePublicHeader(bytes.NewReader(buf.Bytes()), protocol.PerspectiveServer)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.isPublicHeader).To(BeTrue())
+ })
+
+ It("writes a IETF draft header", func() {
+ buf := &bytes.Buffer{}
+ hdr := &Header{
+ ConnectionID: 0x1337,
+ PacketNumber: 0x42,
+ PacketNumberLen: protocol.PacketNumberLen2,
+ KeyPhase: 1,
+ }
+ err := hdr.Write(buf, protocol.PerspectiveServer, versionIETFHeader)
+ Expect(err).ToNot(HaveOccurred())
+ _, err = parseHeader(bytes.NewReader(buf.Bytes()), protocol.PerspectiveServer)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.isPublicHeader).To(BeFalse())
+ })
+ })
+
+ Context("getting the length", func() {
+ It("get the length of a gQUIC Public Header", func() {
+ buf := &bytes.Buffer{}
+ hdr := &Header{
+ ConnectionID: 0x1337,
+ PacketNumber: 0x42,
+ PacketNumberLen: protocol.PacketNumberLen2,
+ DiversificationNonce: bytes.Repeat([]byte{'f'}, 32),
+ }
+ err := hdr.Write(buf, protocol.PerspectiveServer, versionPublicHeader)
+ Expect(err).ToNot(HaveOccurred())
+ publicHeaderLen, err := hdr.getPublicHeaderLength(protocol.PerspectiveServer)
+ Expect(err).ToNot(HaveOccurred())
+ ietfHeaderLen, err := hdr.getHeaderLength()
+ Expect(err).ToNot(HaveOccurred())
+ Expect(publicHeaderLen).ToNot(Equal(ietfHeaderLen)) // make sure we can distinguish between the two header types
+ len, err := hdr.GetLength(protocol.PerspectiveServer, versionPublicHeader)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(len).To(Equal(publicHeaderLen))
+ })
+
+ It("get the length of a a IETF draft header", func() {
+ buf := &bytes.Buffer{}
+ hdr := &Header{
+ IsLongHeader: true,
+ ConnectionID: 0x1337,
+ PacketNumber: 0x42,
+ PacketNumberLen: protocol.PacketNumberLen2,
+ KeyPhase: 1,
+ }
+ err := hdr.Write(buf, protocol.PerspectiveServer, versionIETFHeader)
+ Expect(err).ToNot(HaveOccurred())
+ publicHeaderLen, err := hdr.getPublicHeaderLength(protocol.PerspectiveServer)
+ Expect(err).ToNot(HaveOccurred())
+ ietfHeaderLen, err := hdr.getHeaderLength()
+ Expect(err).ToNot(HaveOccurred())
+ Expect(publicHeaderLen).ToNot(Equal(ietfHeaderLen)) // make sure we can distinguish between the two header types
+ len, err := hdr.GetLength(protocol.PerspectiveServer, versionIETFHeader)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(len).To(Equal(ietfHeaderLen))
+ })
+ })
+
+ Context("logging", func() {
+ var buf bytes.Buffer
+
+ BeforeEach(func() {
+ buf.Reset()
+ utils.SetLogLevel(utils.LogLevelDebug)
+ log.SetOutput(&buf)
+ })
+
+ AfterEach(func() {
+ utils.SetLogLevel(utils.LogLevelNothing)
+ log.SetOutput(os.Stdout)
+ })
+
+ It("logs an IETF draft header", func() {
+ (&Header{
+ IsLongHeader: true,
+ }).Log()
+ Expect(string(buf.Bytes())).To(ContainSubstring("Long Header"))
+ })
+
+ It("logs a Public Header", func() {
+ (&Header{
+ isPublicHeader: true,
+ }).Log()
+ Expect(string(buf.Bytes())).To(ContainSubstring("Public Header"))
+ })
+ })
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/ietf_header.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/ietf_header.go
new file mode 100644
index 0000000..88bd139
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/ietf_header.go
@@ -0,0 +1,172 @@
+package wire
+
+import (
+ "bytes"
+ "fmt"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+ "github.com/lucas-clemente/quic-go/qerr"
+)
+
+// parseHeader parses the header.
+func parseHeader(b *bytes.Reader, packetSentBy protocol.Perspective) (*Header, error) {
+ typeByte, err := b.ReadByte()
+ if err != nil {
+ return nil, err
+ }
+ if typeByte&0x80 > 0 {
+ return parseLongHeader(b, packetSentBy, typeByte)
+ }
+ return parseShortHeader(b, typeByte)
+}
+
+// parse long header and version negotiation packets
+func parseLongHeader(b *bytes.Reader, sentBy protocol.Perspective, typeByte byte) (*Header, error) {
+ connID, err := utils.BigEndian.ReadUint64(b)
+ if err != nil {
+ return nil, err
+ }
+ v, err := utils.BigEndian.ReadUint32(b)
+ if err != nil {
+ return nil, err
+ }
+ pn, err := utils.BigEndian.ReadUint32(b)
+ if err != nil {
+ return nil, err
+ }
+ h := &Header{
+ ConnectionID: protocol.ConnectionID(connID),
+ PacketNumber: protocol.PacketNumber(pn),
+ PacketNumberLen: protocol.PacketNumberLen4,
+ Version: protocol.VersionNumber(v),
+ }
+ if v == 0 { // version negotiation packet
+ if sentBy == protocol.PerspectiveClient {
+ return nil, qerr.InvalidVersion
+ }
+ if b.Len() == 0 {
+ return nil, qerr.Error(qerr.InvalidVersionNegotiationPacket, "empty version list")
+ }
+ h.IsVersionNegotiation = true
+ h.SupportedVersions = make([]protocol.VersionNumber, b.Len()/4)
+ for i := 0; b.Len() > 0; i++ {
+ v, err := utils.BigEndian.ReadUint32(b)
+ if err != nil {
+ return nil, qerr.InvalidVersionNegotiationPacket
+ }
+ h.SupportedVersions[i] = protocol.VersionNumber(v)
+ }
+ return h, nil
+ }
+ h.IsLongHeader = true
+ h.Type = protocol.PacketType(typeByte & 0x7f)
+ if sentBy == protocol.PerspectiveClient && (h.Type != protocol.PacketTypeInitial && h.Type != protocol.PacketTypeHandshake && h.Type != protocol.PacketType0RTT) {
+ return nil, qerr.Error(qerr.InvalidPacketHeader, fmt.Sprintf("Received packet with invalid packet type: %d", h.Type))
+ }
+ if sentBy == protocol.PerspectiveServer && (h.Type != protocol.PacketTypeRetry && h.Type != protocol.PacketTypeHandshake) {
+ return nil, qerr.Error(qerr.InvalidPacketHeader, fmt.Sprintf("Received packet with invalid packet type: %d", h.Type))
+ }
+ return h, nil
+}
+
+func parseShortHeader(b *bytes.Reader, typeByte byte) (*Header, error) {
+ hasConnID := typeByte&0x40 > 0
+ var connID uint64
+ if hasConnID {
+ var err error
+ connID, err = utils.BigEndian.ReadUint64(b)
+ if err != nil {
+ return nil, err
+ }
+ }
+ pnLen := 1 << ((typeByte & 0x3) - 1)
+ pn, err := utils.BigEndian.ReadUintN(b, uint8(pnLen))
+ if err != nil {
+ return nil, err
+ }
+ return &Header{
+ KeyPhase: int(typeByte&0x20) >> 5,
+ OmitConnectionID: !hasConnID,
+ ConnectionID: protocol.ConnectionID(connID),
+ PacketNumber: protocol.PacketNumber(pn),
+ PacketNumberLen: protocol.PacketNumberLen(pnLen),
+ }, nil
+}
+
+// writeHeader writes the Header.
+func (h *Header) writeHeader(b *bytes.Buffer) error {
+ if h.IsLongHeader {
+ return h.writeLongHeader(b)
+ }
+ return h.writeShortHeader(b)
+}
+
+// TODO: add support for the key phase
+func (h *Header) writeLongHeader(b *bytes.Buffer) error {
+ b.WriteByte(byte(0x80 | h.Type))
+ utils.BigEndian.WriteUint64(b, uint64(h.ConnectionID))
+ utils.BigEndian.WriteUint32(b, uint32(h.Version))
+ utils.BigEndian.WriteUint32(b, uint32(h.PacketNumber))
+ return nil
+}
+
+func (h *Header) writeShortHeader(b *bytes.Buffer) error {
+ typeByte := byte(h.KeyPhase << 5)
+ if !h.OmitConnectionID {
+ typeByte ^= 0x40
+ }
+ switch h.PacketNumberLen {
+ case protocol.PacketNumberLen1:
+ typeByte ^= 0x1
+ case protocol.PacketNumberLen2:
+ typeByte ^= 0x2
+ case protocol.PacketNumberLen4:
+ typeByte ^= 0x3
+ default:
+ return fmt.Errorf("invalid packet number length: %d", h.PacketNumberLen)
+ }
+ b.WriteByte(typeByte)
+
+ if !h.OmitConnectionID {
+ utils.BigEndian.WriteUint64(b, uint64(h.ConnectionID))
+ }
+ switch h.PacketNumberLen {
+ case protocol.PacketNumberLen1:
+ b.WriteByte(uint8(h.PacketNumber))
+ case protocol.PacketNumberLen2:
+ utils.BigEndian.WriteUint16(b, uint16(h.PacketNumber))
+ case protocol.PacketNumberLen4:
+ utils.BigEndian.WriteUint32(b, uint32(h.PacketNumber))
+ }
+ return nil
+}
+
+// getHeaderLength gets the length of the Header in bytes.
+func (h *Header) getHeaderLength() (protocol.ByteCount, error) {
+ if h.IsLongHeader {
+ return 1 + 8 + 4 + 4, nil
+ }
+
+ length := protocol.ByteCount(1) // type byte
+ if !h.OmitConnectionID {
+ length += 8
+ }
+ if h.PacketNumberLen != protocol.PacketNumberLen1 && h.PacketNumberLen != protocol.PacketNumberLen2 && h.PacketNumberLen != protocol.PacketNumberLen4 {
+ return 0, fmt.Errorf("invalid packet number length: %d", h.PacketNumberLen)
+ }
+ length += protocol.ByteCount(h.PacketNumberLen)
+ return length, nil
+}
+
+func (h *Header) logHeader() {
+ if h.IsLongHeader {
+ utils.Debugf(" Long Header{Type: %s, ConnectionID: %#x, PacketNumber: %#x, Version: %s}", h.Type, h.ConnectionID, h.PacketNumber, h.Version)
+ } else {
+ connID := "(omitted)"
+ if !h.OmitConnectionID {
+ connID = fmt.Sprintf("%#x", h.ConnectionID)
+ }
+ utils.Debugf(" Short Header{ConnectionID: %s, PacketNumber: %#x, PacketNumberLen: %d, KeyPhase: %d}", connID, h.PacketNumber, h.PacketNumberLen, h.KeyPhase)
+ }
+}
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/ietf_header_test.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/ietf_header_test.go
new file mode 100644
index 0000000..4faa548
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/ietf_header_test.go
@@ -0,0 +1,419 @@
+package wire
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "log"
+ "os"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+ "github.com/lucas-clemente/quic-go/qerr"
+
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+)
+
+var _ = Describe("IETF draft Header", func() {
+ Context("parsing", func() {
+ Context("Version Negotiation Packets", func() {
+ It("parses", func() {
+ versions := []protocol.VersionNumber{0x22334455, 0x33445566}
+ data := ComposeVersionNegotiation(0x1234567890, 0x1337, versions)
+ b := bytes.NewReader(data)
+ h, err := parseHeader(b, protocol.PerspectiveServer)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(h.IsVersionNegotiation).To(BeTrue())
+ Expect(h.Version).To(BeZero())
+ Expect(h.ConnectionID).To(Equal(protocol.ConnectionID(0x1234567890)))
+ Expect(h.PacketNumber).To(Equal(protocol.PacketNumber(0x1337)))
+ for _, v := range versions {
+ Expect(h.SupportedVersions).To(ContainElement(v))
+ }
+ })
+
+ It("errors if it contains versions of the wrong length", func() {
+ versions := []protocol.VersionNumber{0x22334455, 0x33445566}
+ data := ComposeVersionNegotiation(0x1234567890, 0x1337, versions)
+ b := bytes.NewReader(data[:len(data)-2])
+ _, err := parseHeader(b, protocol.PerspectiveServer)
+ Expect(err).To(MatchError(qerr.InvalidVersionNegotiationPacket))
+ })
+
+ It("errors if the version list is emtpy", func() {
+ versions := []protocol.VersionNumber{0x22334455}
+ data := ComposeVersionNegotiation(0x1234567890, 0x1337, versions)
+ // remove 8 bytes (two versions), since ComposeVersionNegotiation also added a reserved version number
+ _, err := parseHeader(bytes.NewReader(data[:len(data)-8]), protocol.PerspectiveServer)
+ Expect(err).To(MatchError("InvalidVersionNegotiationPacket: empty version list"))
+ })
+ })
+
+ Context("long headers", func() {
+ generatePacket := func(t protocol.PacketType) []byte {
+ return []byte{
+ 0x80 ^ uint8(t),
+ 0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0x13, 0x37, // connection ID
+ 0x1, 0x2, 0x3, 0x4, // version number
+ 0xde, 0xca, 0xfb, 0xad, // packet number
+ }
+ }
+
+ It("parses a long header", func() {
+ b := bytes.NewReader(generatePacket(protocol.PacketTypeInitial))
+ h, err := parseHeader(b, protocol.PerspectiveClient)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(h.Type).To(Equal(protocol.PacketTypeInitial))
+ Expect(h.IsLongHeader).To(BeTrue())
+ Expect(h.OmitConnectionID).To(BeFalse())
+ Expect(h.ConnectionID).To(Equal(protocol.ConnectionID(0xdeadbeefcafe1337)))
+ Expect(h.PacketNumber).To(Equal(protocol.PacketNumber(0xdecafbad)))
+ Expect(h.PacketNumberLen).To(Equal(protocol.PacketNumberLen4))
+ Expect(h.Version).To(Equal(protocol.VersionNumber(0x1020304)))
+ Expect(h.IsVersionNegotiation).To(BeFalse())
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("rejects packets sent by the client that use packet types for packets sent by the server", func() {
+ b := bytes.NewReader(generatePacket(protocol.PacketTypeRetry))
+ _, err := parseHeader(b, protocol.PerspectiveClient)
+ Expect(err).To(MatchError(fmt.Sprintf("InvalidPacketHeader: Received packet with invalid packet type: %d", protocol.PacketTypeRetry)))
+ })
+
+ It("rejects packets sent by the client that use packet types for packets sent by the server", func() {
+ b := bytes.NewReader(generatePacket(protocol.PacketType0RTT))
+ _, err := parseHeader(b, protocol.PerspectiveServer)
+ Expect(err).To(MatchError(fmt.Sprintf("InvalidPacketHeader: Received packet with invalid packet type: %d", protocol.PacketType0RTT)))
+ })
+
+ It("rejects packets sent with an unknown packet type", func() {
+ b := bytes.NewReader(generatePacket(42))
+ _, err := parseHeader(b, protocol.PerspectiveServer)
+ Expect(err).To(MatchError("InvalidPacketHeader: Received packet with invalid packet type: 42"))
+ })
+
+ It("rejects version 0 for packets sent by the client", func() {
+ data := []byte{
+ 0x80 ^ uint8(protocol.PacketTypeInitial),
+ 0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0x13, 0x37, // connection ID
+ 0x0, 0x0, 0x0, 0x0, // version number
+ 0xde, 0xca, 0xfb, 0xad, // packet number
+ }
+ _, err := parseHeader(bytes.NewReader(data), protocol.PerspectiveClient)
+ Expect(err).To(MatchError(qerr.InvalidVersion))
+ })
+
+ It("errors on EOF", func() {
+ data := generatePacket(protocol.PacketTypeInitial)
+ for i := 0; i < len(data); i++ {
+ _, err := parseHeader(bytes.NewReader(data[:i]), protocol.PerspectiveClient)
+ Expect(err).To(Equal(io.EOF))
+ }
+ })
+ })
+
+ Context("short headers", func() {
+ It("reads a short header with a connection ID", func() {
+ data := []byte{
+ 0x40 ^ 0x1, //
+ 0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0x13, 0x37, // connection ID
+ 0x42, // packet number
+ }
+ b := bytes.NewReader(data)
+ h, err := parseHeader(b, protocol.PerspectiveClient)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(h.IsLongHeader).To(BeFalse())
+ Expect(h.KeyPhase).To(Equal(0))
+ Expect(h.OmitConnectionID).To(BeFalse())
+ Expect(h.ConnectionID).To(Equal(protocol.ConnectionID(0xdeadbeefcafe1337)))
+ Expect(h.PacketNumber).To(Equal(protocol.PacketNumber(0x42)))
+ Expect(h.IsVersionNegotiation).To(BeFalse())
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("reads the Key Phase Bit", func() {
+ data := []byte{
+ 0x20 ^ 0x1,
+ 0x11,
+ }
+ b := bytes.NewReader(data)
+ h, err := parseHeader(b, protocol.PerspectiveClient)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(h.IsLongHeader).To(BeFalse())
+ Expect(h.KeyPhase).To(Equal(1))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("reads a header with ommited connection ID", func() {
+ data := []byte{
+ 0x1,
+ 0x21, // packet number
+ }
+ b := bytes.NewReader(data)
+ h, err := parseHeader(b, protocol.PerspectiveClient)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(h.IsLongHeader).To(BeFalse())
+ Expect(h.OmitConnectionID).To(BeTrue())
+ Expect(h.PacketNumber).To(Equal(protocol.PacketNumber(0x21)))
+ Expect(h.PacketNumberLen).To(Equal(protocol.PacketNumberLen1))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("reads a header with a 2 byte packet number", func() {
+ data := []byte{
+ 0x2,
+ 0x13, 0x37, // packet number
+ }
+ b := bytes.NewReader(data)
+ h, err := parseHeader(b, protocol.PerspectiveClient)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(h.IsLongHeader).To(BeFalse())
+ Expect(h.PacketNumber).To(Equal(protocol.PacketNumber(0x1337)))
+ Expect(h.PacketNumberLen).To(Equal(protocol.PacketNumberLen2))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("reads a header with a 4 byte packet number", func() {
+ data := []byte{
+ 0x3,
+ 0xde, 0xad, 0xbe, 0xef, // packet number
+ }
+ b := bytes.NewReader(data)
+ h, err := parseHeader(b, protocol.PerspectiveClient)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(h.IsLongHeader).To(BeFalse())
+ Expect(h.PacketNumber).To(Equal(protocol.PacketNumber(0xdeadbeef)))
+ Expect(h.PacketNumberLen).To(Equal(protocol.PacketNumberLen4))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("errors on EOF", func() {
+ data := []byte{
+ 0x40 ^ 0x3,
+ 0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0x13, 0x37, // connection ID
+ 0xde, 0xca, 0xfb, 0xad, // packet number
+ }
+ for i := 0; i < len(data); i++ {
+ _, err := parseHeader(bytes.NewReader(data[:i]), protocol.PerspectiveClient)
+ Expect(err).To(Equal(io.EOF))
+ }
+ })
+ })
+ })
+
+ Context("writing", func() {
+ var buf *bytes.Buffer
+
+ BeforeEach(func() {
+ buf = &bytes.Buffer{}
+ })
+
+ Context("long header", func() {
+ It("writes", func() {
+ err := (&Header{
+ IsLongHeader: true,
+ Type: 0x5,
+ ConnectionID: 0xdeadbeefcafe1337,
+ PacketNumber: 0xdecafbad,
+ Version: 0x1020304,
+ }).writeHeader(buf)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(buf.Bytes()).To(Equal([]byte{
+ 0x80 ^ 0x5,
+ 0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0x13, 0x37, // connection ID
+ 0x1, 0x2, 0x3, 0x4, // version number
+ 0xde, 0xca, 0xfb, 0xad, // packet number
+ }))
+ })
+ })
+
+ Context("short header", func() {
+ It("writes a header with connection ID", func() {
+ err := (&Header{
+ ConnectionID: 0xdeadbeefcafe1337,
+ PacketNumberLen: protocol.PacketNumberLen1,
+ PacketNumber: 0x42,
+ }).writeHeader(buf)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(buf.Bytes()).To(Equal([]byte{
+ 0x40 ^ 0x1,
+ 0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0x13, 0x37, // connection ID
+ 0x42, // packet number
+ }))
+ })
+
+ It("writes a header without connection ID", func() {
+ err := (&Header{
+ OmitConnectionID: true,
+ PacketNumberLen: protocol.PacketNumberLen1,
+ PacketNumber: 0x42,
+ }).writeHeader(buf)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(buf.Bytes()).To(Equal([]byte{
+ 0x1,
+ 0x42, // packet number
+ }))
+ })
+
+ It("writes a header with a 2 byte packet number", func() {
+ err := (&Header{
+ OmitConnectionID: true,
+ PacketNumberLen: protocol.PacketNumberLen2,
+ PacketNumber: 0x1337,
+ }).writeHeader(buf)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(buf.Bytes()).To(Equal([]byte{
+ 0x2,
+ 0x13, 0x37, // packet number
+ }))
+ })
+
+ It("writes a header with a 4 byte packet number", func() {
+ err := (&Header{
+ OmitConnectionID: true,
+ PacketNumberLen: protocol.PacketNumberLen4,
+ PacketNumber: 0xdecafbad,
+ }).writeHeader(buf)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(buf.Bytes()).To(Equal([]byte{
+ 0x3,
+ 0xde, 0xca, 0xfb, 0xad, // packet number
+ }))
+ })
+
+ It("errors when given an invalid packet number length", func() {
+ err := (&Header{
+ OmitConnectionID: true,
+ PacketNumberLen: 3,
+ PacketNumber: 0xdecafbad,
+ }).writeHeader(buf)
+ Expect(err).To(MatchError("invalid packet number length: 3"))
+ })
+
+ It("writes the Key Phase Bit", func() {
+ err := (&Header{
+ KeyPhase: 1,
+ OmitConnectionID: true,
+ PacketNumberLen: protocol.PacketNumberLen1,
+ PacketNumber: 0x42,
+ }).writeHeader(buf)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(buf.Bytes()).To(Equal([]byte{
+ 0x20 ^ 0x1,
+ 0x42, // packet number
+ }))
+ })
+ })
+ })
+
+ Context("length", func() {
+ var buf *bytes.Buffer
+
+ BeforeEach(func() {
+ buf = &bytes.Buffer{}
+ })
+
+ It("has the right length for the long header", func() {
+ h := &Header{IsLongHeader: true}
+ Expect(h.getHeaderLength()).To(Equal(protocol.ByteCount(17)))
+ err := h.writeHeader(buf)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(buf.Len()).To(Equal(17))
+ })
+
+ It("has the right length for a short header containing a connection ID", func() {
+ h := &Header{
+ PacketNumberLen: protocol.PacketNumberLen1,
+ }
+ Expect(h.getHeaderLength()).To(Equal(protocol.ByteCount(1 + 8 + 1)))
+ err := h.writeHeader(buf)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(buf.Len()).To(Equal(10))
+ })
+
+ It("has the right length for a short header without a connection ID", func() {
+ h := &Header{
+ OmitConnectionID: true,
+ PacketNumberLen: protocol.PacketNumberLen1,
+ }
+ Expect(h.getHeaderLength()).To(Equal(protocol.ByteCount(1 + 1)))
+ err := h.writeHeader(buf)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(buf.Len()).To(Equal(2))
+ })
+
+ It("has the right length for a short header with a 2 byte packet number", func() {
+ h := &Header{
+ OmitConnectionID: true,
+ PacketNumberLen: protocol.PacketNumberLen2,
+ }
+ Expect(h.getHeaderLength()).To(Equal(protocol.ByteCount(1 + 2)))
+ err := h.writeHeader(buf)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(buf.Len()).To(Equal(3))
+ })
+
+ It("has the right length for a short header with a 5 byte packet number", func() {
+ h := &Header{
+ OmitConnectionID: true,
+ PacketNumberLen: protocol.PacketNumberLen4,
+ }
+ Expect(h.getHeaderLength()).To(Equal(protocol.ByteCount(1 + 4)))
+ err := h.writeHeader(buf)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(buf.Len()).To(Equal(5))
+ })
+
+ It("errors when given an invalid packet number length", func() {
+ h := &Header{PacketNumberLen: 5}
+ _, err := h.getHeaderLength()
+ Expect(err).To(MatchError("invalid packet number length: 5"))
+ })
+ })
+
+ Context("logging", func() {
+ var buf bytes.Buffer
+
+ BeforeEach(func() {
+ buf.Reset()
+ utils.SetLogLevel(utils.LogLevelDebug)
+ log.SetOutput(&buf)
+ })
+
+ AfterEach(func() {
+ utils.SetLogLevel(utils.LogLevelNothing)
+ log.SetOutput(os.Stdout)
+ })
+
+ It("logs Long Headers", func() {
+ (&Header{
+ IsLongHeader: true,
+ Type: protocol.PacketTypeHandshake,
+ PacketNumber: 0x1337,
+ ConnectionID: 0xdeadbeef,
+ Version: 253,
+ }).logHeader()
+ Expect(string(buf.Bytes())).To(ContainSubstring("Long Header{Type: Handshake, ConnectionID: 0xdeadbeef, PacketNumber: 0x1337, Version: 253}"))
+ })
+
+ It("logs Short Headers containing a connection ID", func() {
+ (&Header{
+ KeyPhase: 1,
+ PacketNumber: 0x1337,
+ PacketNumberLen: 4,
+ ConnectionID: 0xdeadbeef,
+ }).logHeader()
+ Expect(string(buf.Bytes())).To(ContainSubstring("Short Header{ConnectionID: 0xdeadbeef, PacketNumber: 0x1337, PacketNumberLen: 4, KeyPhase: 1}"))
+ })
+
+ It("logs Short Headers with omitted connection ID", func() {
+ (&Header{
+ PacketNumber: 0x12,
+ PacketNumberLen: 1,
+ OmitConnectionID: true,
+ }).logHeader()
+ Expect(string(buf.Bytes())).To(ContainSubstring("Short Header{ConnectionID: (omitted), PacketNumber: 0x12, PacketNumberLen: 1, KeyPhase: 0}"))
+ })
+ })
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/log.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/log.go
new file mode 100644
index 0000000..0e72ea9
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/log.go
@@ -0,0 +1,28 @@
+package wire
+
+import "github.com/lucas-clemente/quic-go/internal/utils"
+
+// LogFrame logs a frame, either sent or received
+func LogFrame(frame Frame, sent bool) {
+ if !utils.Debug() {
+ return
+ }
+ dir := "<-"
+ if sent {
+ dir = "->"
+ }
+ switch f := frame.(type) {
+ case *StreamFrame:
+ utils.Debugf("\t%s &wire.StreamFrame{StreamID: %d, FinBit: %t, Offset: 0x%x, Data length: 0x%x, Offset + Data length: 0x%x}", dir, f.StreamID, f.FinBit, f.Offset, f.DataLen(), f.Offset+f.DataLen())
+ case *StopWaitingFrame:
+ if sent {
+ utils.Debugf("\t%s &wire.StopWaitingFrame{LeastUnacked: 0x%x, PacketNumberLen: 0x%x}", dir, f.LeastUnacked, f.PacketNumberLen)
+ } else {
+ utils.Debugf("\t%s &wire.StopWaitingFrame{LeastUnacked: 0x%x}", dir, f.LeastUnacked)
+ }
+ case *AckFrame:
+ utils.Debugf("\t%s &wire.AckFrame{LargestAcked: 0x%x, LowestAcked: 0x%x, AckRanges: %#v, DelayTime: %s}", dir, f.LargestAcked, f.LowestAcked, f.AckRanges, f.DelayTime.String())
+ default:
+ utils.Debugf("\t%s %#v", dir, frame)
+ }
+}
diff --git a/vendor/github.com/lucas-clemente/quic-go/frames/log_test.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/log_test.go
similarity index 57%
rename from vendor/github.com/lucas-clemente/quic-go/frames/log_test.go
rename to vendor/github.com/lucas-clemente/quic-go/internal/wire/log_test.go
index d4f419c..33547ef 100644
--- a/vendor/github.com/lucas-clemente/quic-go/frames/log_test.go
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/log_test.go
@@ -1,12 +1,13 @@
-package frames
+package wire
import (
"bytes"
+ "log"
"os"
"time"
- "github.com/lucas-clemente/quic-go/protocol"
- "github.com/lucas-clemente/quic-go/utils"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
@@ -20,12 +21,12 @@ var _ = Describe("Frame logging", func() {
BeforeEach(func() {
buf.Reset()
utils.SetLogLevel(utils.LogLevelDebug)
- utils.SetLogWriter(&buf)
+ log.SetOutput(&buf)
})
AfterSuite(func() {
utils.SetLogLevel(utils.LogLevelNothing)
- utils.SetLogWriter(os.Stdout)
+ log.SetOutput(os.Stdout)
})
It("doesn't log when debug is disabled", func() {
@@ -36,12 +37,12 @@ var _ = Describe("Frame logging", func() {
It("logs sent frames", func() {
LogFrame(&RstStreamFrame{}, true)
- Expect(string(buf.Bytes())).To(Equal("\t-> &frames.RstStreamFrame{StreamID:0x0, ErrorCode:0x0, ByteOffset:0x0}\n"))
+ Expect(buf.Bytes()).To(ContainSubstring("\t-> &wire.RstStreamFrame{StreamID:0x0, ErrorCode:0x0, ByteOffset:0x0}\n"))
})
It("logs received frames", func() {
LogFrame(&RstStreamFrame{}, false)
- Expect(string(buf.Bytes())).To(Equal("\t<- &frames.RstStreamFrame{StreamID:0x0, ErrorCode:0x0, ByteOffset:0x0}\n"))
+ Expect(buf.Bytes()).To(ContainSubstring("\t<- &wire.RstStreamFrame{StreamID:0x0, ErrorCode:0x0, ByteOffset:0x0}\n"))
})
It("logs stream frames", func() {
@@ -51,7 +52,7 @@ var _ = Describe("Frame logging", func() {
Data: bytes.Repeat([]byte{'f'}, 0x100),
}
LogFrame(frame, false)
- Expect(string(buf.Bytes())).To(Equal("\t<- &frames.StreamFrame{StreamID: 42, FinBit: false, Offset: 0x1337, Data length: 0x100, Offset + Data length: 0x1437}\n"))
+ Expect(buf.Bytes()).To(ContainSubstring("\t<- &wire.StreamFrame{StreamID: 42, FinBit: false, Offset: 0x1337, Data length: 0x100, Offset + Data length: 0x1437}\n"))
})
It("logs ACK frames", func() {
@@ -61,7 +62,7 @@ var _ = Describe("Frame logging", func() {
DelayTime: 1 * time.Millisecond,
}
LogFrame(frame, false)
- Expect(string(buf.Bytes())).To(Equal("\t<- &frames.AckFrame{LargestAcked: 0x1337, LowestAcked: 0x42, AckRanges: []frames.AckRange(nil), DelayTime: 1ms}\n"))
+ Expect(buf.Bytes()).To(ContainSubstring("\t<- &wire.AckFrame{LargestAcked: 0x1337, LowestAcked: 0x42, AckRanges: []wire.AckRange(nil), DelayTime: 1ms}\n"))
})
It("logs incoming StopWaiting frames", func() {
@@ -69,7 +70,7 @@ var _ = Describe("Frame logging", func() {
LeastUnacked: 0x1337,
}
LogFrame(frame, false)
- Expect(string(buf.Bytes())).To(Equal("\t<- &frames.StopWaitingFrame{LeastUnacked: 0x1337}\n"))
+ Expect(buf.Bytes()).To(ContainSubstring("\t<- &wire.StopWaitingFrame{LeastUnacked: 0x1337}\n"))
})
It("logs outgoing StopWaiting frames", func() {
@@ -78,6 +79,6 @@ var _ = Describe("Frame logging", func() {
PacketNumberLen: protocol.PacketNumberLen4,
}
LogFrame(frame, true)
- Expect(string(buf.Bytes())).To(Equal("\t-> &frames.StopWaitingFrame{LeastUnacked: 0x1337, PacketNumberLen: 0x4}\n"))
+ Expect(buf.Bytes()).To(ContainSubstring("\t-> &wire.StopWaitingFrame{LeastUnacked: 0x1337, PacketNumberLen: 0x4}\n"))
})
})
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/max_data_frame.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/max_data_frame.go
new file mode 100644
index 0000000..19585bc
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/max_data_frame.go
@@ -0,0 +1,51 @@
+package wire
+
+import (
+ "bytes"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+)
+
+// A MaxDataFrame carries flow control information for the connection
+type MaxDataFrame struct {
+ ByteOffset protocol.ByteCount
+}
+
+// ParseMaxDataFrame parses a MAX_DATA frame
+func ParseMaxDataFrame(r *bytes.Reader, version protocol.VersionNumber) (*MaxDataFrame, error) {
+ // read the TypeByte
+ if _, err := r.ReadByte(); err != nil {
+ return nil, err
+ }
+
+ frame := &MaxDataFrame{}
+ byteOffset, err := utils.ReadVarInt(r)
+ if err != nil {
+ return nil, err
+ }
+ frame.ByteOffset = protocol.ByteCount(byteOffset)
+ return frame, nil
+}
+
+//Write writes a MAX_STREAM_DATA frame
+func (f *MaxDataFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error {
+ if !version.UsesIETFFrameFormat() {
+ // write a gQUIC WINDOW_UPDATE frame (with stream ID 0, which means connection-level there)
+ return (&windowUpdateFrame{
+ StreamID: 0,
+ ByteOffset: f.ByteOffset,
+ }).Write(b, version)
+ }
+ b.WriteByte(0x4)
+ utils.WriteVarInt(b, uint64(f.ByteOffset))
+ return nil
+}
+
+// MinLength of a written frame
+func (f *MaxDataFrame) MinLength(version protocol.VersionNumber) (protocol.ByteCount, error) {
+ if !version.UsesIETFFrameFormat() { // writing this frame would result in a gQUIC WINDOW_UPDATE being written, which is longer
+ return 1 + 4 + 8, nil
+ }
+ return 1 + utils.VarIntLen(uint64(f.ByteOffset)), nil
+}
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/max_data_frame_test.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/max_data_frame_test.go
new file mode 100644
index 0000000..1a098d8
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/max_data_frame_test.go
@@ -0,0 +1,56 @@
+package wire
+
+import (
+ "bytes"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+)
+
+var _ = Describe("MAX_DATA frame", func() {
+ Context("when parsing", func() {
+ It("accepts sample frame", func() {
+ data := []byte{0x4}
+ data = append(data, encodeVarInt(0xdecafbad123456)...) // byte offset
+ b := bytes.NewReader(data)
+ frame, err := ParseMaxDataFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.ByteOffset).To(Equal(protocol.ByteCount(0xdecafbad123456)))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("errors on EOFs", func() {
+ data := []byte{0x4}
+ data = append(data, encodeVarInt(0xdecafbad1234567)...) // byte offset
+ _, err := ParseMaxDataFrame(bytes.NewReader(data), versionIETFFrames)
+ Expect(err).NotTo(HaveOccurred())
+ for i := range data {
+ _, err := ParseMaxDataFrame(bytes.NewReader(data[0:i]), versionIETFFrames)
+ Expect(err).To(HaveOccurred())
+ }
+ })
+ })
+
+ Context("writing", func() {
+ It("has proper min length", func() {
+ f := &MaxDataFrame{
+ ByteOffset: 0xdeadbeef,
+ }
+ Expect(f.MinLength(versionIETFFrames)).To(Equal(1 + utils.VarIntLen(0xdeadbeef)))
+ })
+
+ It("writes a MAX_DATA frame", func() {
+ b := &bytes.Buffer{}
+ f := &MaxDataFrame{
+ ByteOffset: 0xdeadbeefcafe,
+ }
+ err := f.Write(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ expected := []byte{0x4}
+ expected = append(expected, encodeVarInt(0xdeadbeefcafe)...)
+ Expect(b.Bytes()).To(Equal(expected))
+ })
+ })
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/max_stream_data_frame.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/max_stream_data_frame.go
new file mode 100644
index 0000000..810dc92
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/max_stream_data_frame.go
@@ -0,0 +1,60 @@
+package wire
+
+import (
+ "bytes"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+)
+
+// A MaxStreamDataFrame carries flow control information for a stream
+type MaxStreamDataFrame struct {
+ StreamID protocol.StreamID
+ ByteOffset protocol.ByteCount
+}
+
+// ParseMaxStreamDataFrame parses a MAX_STREAM_DATA frame
+func ParseMaxStreamDataFrame(r *bytes.Reader, version protocol.VersionNumber) (*MaxStreamDataFrame, error) {
+ frame := &MaxStreamDataFrame{}
+
+ // read the TypeByte
+ if _, err := r.ReadByte(); err != nil {
+ return nil, err
+ }
+
+ sid, err := utils.ReadVarInt(r)
+ if err != nil {
+ return nil, err
+ }
+ frame.StreamID = protocol.StreamID(sid)
+
+ byteOffset, err := utils.ReadVarInt(r)
+ if err != nil {
+ return nil, err
+ }
+ frame.ByteOffset = protocol.ByteCount(byteOffset)
+ return frame, nil
+}
+
+// Write writes a MAX_STREAM_DATA frame
+func (f *MaxStreamDataFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error {
+ if !version.UsesIETFFrameFormat() {
+ return (&windowUpdateFrame{
+ StreamID: f.StreamID,
+ ByteOffset: f.ByteOffset,
+ }).Write(b, version)
+ }
+ b.WriteByte(0x5)
+ utils.WriteVarInt(b, uint64(f.StreamID))
+ utils.WriteVarInt(b, uint64(f.ByteOffset))
+ return nil
+}
+
+// MinLength of a written frame
+func (f *MaxStreamDataFrame) MinLength(version protocol.VersionNumber) (protocol.ByteCount, error) {
+ // writing this frame would result in a gQUIC WINDOW_UPDATE being written, which has a different length
+ if !version.UsesIETFFrameFormat() {
+ return 1 + 4 + 8, nil
+ }
+ return 1 + utils.VarIntLen(uint64(f.StreamID)) + utils.VarIntLen(uint64(f.ByteOffset)), nil
+}
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/max_stream_data_frame_test.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/max_stream_data_frame_test.go
new file mode 100644
index 0000000..d945390
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/max_stream_data_frame_test.go
@@ -0,0 +1,62 @@
+package wire
+
+import (
+ "bytes"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+)
+
+var _ = Describe("MAX_STREAM_DATA frame", func() {
+ Context("parsing", func() {
+ It("accepts sample frame", func() {
+ data := []byte{0x5}
+ data = append(data, encodeVarInt(0xdeadbeef)...) // Stream ID
+ data = append(data, encodeVarInt(0x12345678)...) // Offset
+ b := bytes.NewReader(data)
+ frame, err := ParseMaxStreamDataFrame(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.StreamID).To(Equal(protocol.StreamID(0xdeadbeef)))
+ Expect(frame.ByteOffset).To(Equal(protocol.ByteCount(0x12345678)))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("errors on EOFs", func() {
+ data := []byte{0x5}
+ data = append(data, encodeVarInt(0xdeadbeef)...) // Stream ID
+ data = append(data, encodeVarInt(0x12345678)...) // Offset
+ _, err := ParseMaxStreamDataFrame(bytes.NewReader(data), versionIETFFrames)
+ Expect(err).NotTo(HaveOccurred())
+ for i := range data {
+ _, err := ParseMaxStreamDataFrame(bytes.NewReader(data[0:i]), versionIETFFrames)
+ Expect(err).To(HaveOccurred())
+ }
+ })
+ })
+
+ Context("writing", func() {
+ It("has proper min length", func() {
+ f := &MaxStreamDataFrame{
+ StreamID: 0x1337,
+ ByteOffset: 0xdeadbeef,
+ }
+ Expect(f.MinLength(protocol.VersionWhatever)).To(Equal(1 + utils.VarIntLen(uint64(f.StreamID)) + utils.VarIntLen(uint64(f.ByteOffset))))
+ })
+
+ It("writes a sample frame", func() {
+ b := &bytes.Buffer{}
+ f := &MaxStreamDataFrame{
+ StreamID: 0xdecafbad,
+ ByteOffset: 0xdeadbeefcafe42,
+ }
+ expected := []byte{0x5}
+ expected = append(expected, encodeVarInt(0xdecafbad)...)
+ expected = append(expected, encodeVarInt(0xdeadbeefcafe42)...)
+ err := f.Write(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()).To(Equal(expected))
+ })
+ })
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/frames/ping_frame.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/ping_frame.go
similarity index 76%
rename from vendor/github.com/lucas-clemente/quic-go/frames/ping_frame.go
rename to vendor/github.com/lucas-clemente/quic-go/internal/wire/ping_frame.go
index 8486af5..2a09c33 100644
--- a/vendor/github.com/lucas-clemente/quic-go/frames/ping_frame.go
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/ping_frame.go
@@ -1,16 +1,16 @@
-package frames
+package wire
import (
"bytes"
- "github.com/lucas-clemente/quic-go/protocol"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
)
// A PingFrame is a ping frame
type PingFrame struct{}
// ParsePingFrame parses a Ping frame
-func ParsePingFrame(r *bytes.Reader) (*PingFrame, error) {
+func ParsePingFrame(r *bytes.Reader, version protocol.VersionNumber) (*PingFrame, error) {
frame := &PingFrame{}
_, err := r.ReadByte()
diff --git a/vendor/github.com/lucas-clemente/quic-go/frames/ping_frame_test.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/ping_frame_test.go
similarity index 70%
rename from vendor/github.com/lucas-clemente/quic-go/frames/ping_frame_test.go
rename to vendor/github.com/lucas-clemente/quic-go/internal/wire/ping_frame_test.go
index 3637a3b..d0627a6 100644
--- a/vendor/github.com/lucas-clemente/quic-go/frames/ping_frame_test.go
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/ping_frame_test.go
@@ -1,9 +1,9 @@
-package frames
+package wire
import (
"bytes"
- "github.com/lucas-clemente/quic-go/protocol"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
@@ -12,13 +12,13 @@ var _ = Describe("PingFrame", func() {
Context("when parsing", func() {
It("accepts sample frame", func() {
b := bytes.NewReader([]byte{0x07})
- _, err := ParsePingFrame(b)
+ _, err := ParsePingFrame(b, protocol.VersionWhatever)
Expect(err).ToNot(HaveOccurred())
- Expect(b.Len()).To(Equal(0))
+ Expect(b.Len()).To(BeZero())
})
It("errors on EOFs", func() {
- _, err := ParsePingFrame(bytes.NewReader(nil))
+ _, err := ParsePingFrame(bytes.NewReader(nil), protocol.VersionWhatever)
Expect(err).To(HaveOccurred())
})
})
@@ -27,7 +27,7 @@ var _ = Describe("PingFrame", func() {
It("writes a sample frame", func() {
b := &bytes.Buffer{}
frame := PingFrame{}
- frame.Write(b, 0)
+ frame.Write(b, protocol.VersionWhatever)
Expect(b.Bytes()).To(Equal([]byte{0x07}))
})
diff --git a/vendor/github.com/lucas-clemente/quic-go/public_header.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/public_header.go
similarity index 56%
rename from vendor/github.com/lucas-clemente/quic-go/public_header.go
rename to vendor/github.com/lucas-clemente/quic-go/internal/wire/public_header.go
index f68496b..e4c9975 100644
--- a/vendor/github.com/lucas-clemente/quic-go/public_header.go
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/public_header.go
@@ -1,61 +1,45 @@
-package quic
+package wire
import (
"bytes"
"errors"
+ "fmt"
+ "io"
- "github.com/lucas-clemente/quic-go/protocol"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
"github.com/lucas-clemente/quic-go/qerr"
- "github.com/lucas-clemente/quic-go/utils"
)
var (
- errPacketNumberLenNotSet = errors.New("PublicHeader: PacketNumberLen not set")
errResetAndVersionFlagSet = errors.New("PublicHeader: Reset Flag and Version Flag should not be set at the same time")
- errReceivedTruncatedConnectionID = qerr.Error(qerr.InvalidPacketHeader, "receiving packets with truncated ConnectionID is not supported")
+ errReceivedOmittedConnectionID = qerr.Error(qerr.InvalidPacketHeader, "receiving packets with omitted ConnectionID is not supported")
errInvalidConnectionID = qerr.Error(qerr.InvalidPacketHeader, "connection ID cannot be 0")
errGetLengthNotForVersionNegotiation = errors.New("PublicHeader: GetLength cannot be called for VersionNegotiation packets")
)
-// The PublicHeader of a QUIC packet. Warning: This struct should not be considered stable and will change soon.
-type PublicHeader struct {
- Raw []byte
- ConnectionID protocol.ConnectionID
- VersionFlag bool
- ResetFlag bool
- TruncateConnectionID bool
- PacketNumberLen protocol.PacketNumberLen
- PacketNumber protocol.PacketNumber
- VersionNumber protocol.VersionNumber // VersionNumber sent by the client
- SupportedVersions []protocol.VersionNumber // VersionNumbers sent by the server
- DiversificationNonce []byte
-}
-
-// Write writes a public header. Warning: This API should not be considered stable and will change soon.
-func (h *PublicHeader) Write(b *bytes.Buffer, version protocol.VersionNumber, pers protocol.Perspective) error {
- publicFlagByte := uint8(0x00)
-
+// writePublicHeader writes a Public Header.
+func (h *Header) writePublicHeader(b *bytes.Buffer, pers protocol.Perspective, _ protocol.VersionNumber) error {
if h.VersionFlag && h.ResetFlag {
return errResetAndVersionFlagSet
}
+ publicFlagByte := uint8(0x00)
if h.VersionFlag {
publicFlagByte |= 0x01
}
if h.ResetFlag {
publicFlagByte |= 0x02
}
- if !h.TruncateConnectionID {
+ if !h.OmitConnectionID {
publicFlagByte |= 0x08
}
-
if len(h.DiversificationNonce) > 0 {
if len(h.DiversificationNonce) != 32 {
return errors.New("invalid diversification nonce length")
}
publicFlagByte |= 0x04
}
-
// only set PacketNumberLen bits if a packet number will be written
if h.hasPacketNumber(pers) {
switch h.PacketNumberLen {
@@ -69,59 +53,50 @@ func (h *PublicHeader) Write(b *bytes.Buffer, version protocol.VersionNumber, pe
publicFlagByte |= 0x30
}
}
-
b.WriteByte(publicFlagByte)
- if !h.TruncateConnectionID {
- utils.WriteUint64(b, uint64(h.ConnectionID))
+ if !h.OmitConnectionID {
+ utils.BigEndian.WriteUint64(b, uint64(h.ConnectionID))
}
-
if h.VersionFlag && pers == protocol.PerspectiveClient {
- utils.WriteUint32(b, protocol.VersionNumberToTag(h.VersionNumber))
+ utils.BigEndian.WriteUint32(b, uint32(h.Version))
}
-
if len(h.DiversificationNonce) > 0 {
b.Write(h.DiversificationNonce)
}
-
// if we're a server, and the VersionFlag is set, we must not include anything else in the packet
if !h.hasPacketNumber(pers) {
return nil
}
- if h.PacketNumberLen != protocol.PacketNumberLen1 && h.PacketNumberLen != protocol.PacketNumberLen2 && h.PacketNumberLen != protocol.PacketNumberLen4 && h.PacketNumberLen != protocol.PacketNumberLen6 {
- return errPacketNumberLenNotSet
- }
-
switch h.PacketNumberLen {
case protocol.PacketNumberLen1:
b.WriteByte(uint8(h.PacketNumber))
case protocol.PacketNumberLen2:
- utils.WriteUint16(b, uint16(h.PacketNumber))
+ utils.BigEndian.WriteUint16(b, uint16(h.PacketNumber))
case protocol.PacketNumberLen4:
- utils.WriteUint32(b, uint32(h.PacketNumber))
+ utils.BigEndian.WriteUint32(b, uint32(h.PacketNumber))
case protocol.PacketNumberLen6:
- utils.WriteUint48(b, uint64(h.PacketNumber))
+ utils.BigEndian.WriteUint48(b, uint64(h.PacketNumber)&(1<<48-1))
default:
- return errPacketNumberLenNotSet
+ return errors.New("PublicHeader: PacketNumberLen not set")
}
return nil
}
-// ParsePublicHeader parses a QUIC packet's public header.
+// parsePublicHeader parses a QUIC packet's Public Header.
// The packetSentBy is the perspective of the peer that sent this PublicHeader, i.e. if we're the server, packetSentBy should be PerspectiveClient.
-// Warning: This API should not be considered stable and will change soon.
-func ParsePublicHeader(b *bytes.Reader, packetSentBy protocol.Perspective) (*PublicHeader, error) {
- header := &PublicHeader{}
+func parsePublicHeader(b *bytes.Reader, packetSentBy protocol.Perspective) (*Header, error) {
+ header := &Header{}
// First byte
publicFlagByte, err := b.ReadByte()
if err != nil {
return nil, err
}
- header.VersionFlag = publicFlagByte&0x01 > 0
header.ResetFlag = publicFlagByte&0x02 > 0
+ header.VersionFlag = publicFlagByte&0x01 > 0
// TODO: activate this check once Chrome sends the correct value
// see https://github.com/lucas-clemente/quic-go/issues/232
@@ -129,11 +104,10 @@ func ParsePublicHeader(b *bytes.Reader, packetSentBy protocol.Perspective) (*Pub
// return nil, errors.New("diversification nonces should only be sent by servers")
// }
- header.TruncateConnectionID = publicFlagByte&0x08 == 0
- if header.TruncateConnectionID && packetSentBy == protocol.PerspectiveClient {
- return nil, errReceivedTruncatedConnectionID
+ header.OmitConnectionID = publicFlagByte&0x08 == 0
+ if header.OmitConnectionID && packetSentBy == protocol.PerspectiveClient {
+ return nil, errReceivedOmittedConnectionID
}
-
if header.hasPacketNumber(packetSentBy) {
switch publicFlagByte & 0x30 {
case 0x30:
@@ -148,9 +122,9 @@ func ParsePublicHeader(b *bytes.Reader, packetSentBy protocol.Perspective) (*Pub
}
// Connection ID
- if !header.TruncateConnectionID {
+ if !header.OmitConnectionID {
var connID uint64
- connID, err = utils.ReadUint64(b)
+ connID, err = utils.BigEndian.ReadUint64(b)
if err != nil {
return nil, err
}
@@ -166,94 +140,86 @@ func ParsePublicHeader(b *bytes.Reader, packetSentBy protocol.Perspective) (*Pub
// see https://github.com/lucas-clemente/quic-go/issues/232
if !header.VersionFlag && !header.ResetFlag {
header.DiversificationNonce = make([]byte, 32)
- // this Read can never return an EOF for a valid packet, since the diversification nonce is followed by the packet number
- _, err = b.Read(header.DiversificationNonce)
- if err != nil {
+ if _, err := io.ReadFull(b, header.DiversificationNonce); err != nil {
return nil, err
}
}
}
// Version (optional)
- if !header.ResetFlag {
- if header.VersionFlag {
- if packetSentBy == protocol.PerspectiveClient {
- var versionTag uint32
- versionTag, err = utils.ReadUint32(b)
- if err != nil {
- return nil, err
- }
- header.VersionNumber = protocol.VersionTagToNumber(versionTag)
- } else { // parse the version negotiaton packet
- if b.Len()%4 != 0 {
- return nil, qerr.InvalidVersionNegotiationPacket
- }
- header.SupportedVersions = make([]protocol.VersionNumber, 0)
- for {
- var versionTag uint32
- versionTag, err = utils.ReadUint32(b)
- if err != nil {
- break
- }
- v := protocol.VersionTagToNumber(versionTag)
- if !protocol.IsSupportedVersion(v) {
- v = protocol.VersionUnsupported
- }
- header.SupportedVersions = append(header.SupportedVersions, v)
- }
+ if !header.ResetFlag && header.VersionFlag {
+ if packetSentBy == protocol.PerspectiveServer { // parse the version negotiaton packet
+ if b.Len() == 0 {
+ return nil, qerr.Error(qerr.InvalidVersionNegotiationPacket, "empty version list")
}
+ if b.Len()%4 != 0 {
+ return nil, qerr.InvalidVersionNegotiationPacket
+ }
+ header.IsVersionNegotiation = true
+ header.SupportedVersions = make([]protocol.VersionNumber, 0)
+ for {
+ var versionTag uint32
+ versionTag, err = utils.BigEndian.ReadUint32(b)
+ if err != nil {
+ break
+ }
+ v := protocol.VersionNumber(versionTag)
+ header.SupportedVersions = append(header.SupportedVersions, v)
+ }
+ // a version negotiation packet doesn't have a packet number
+ return header, nil
}
+ // packet was sent by the client. Read the version number
+ var versionTag uint32
+ versionTag, err = utils.BigEndian.ReadUint32(b)
+ if err != nil {
+ return nil, err
+ }
+ header.Version = protocol.VersionNumber(versionTag)
}
// Packet number
if header.hasPacketNumber(packetSentBy) {
- packetNumber, err := utils.ReadUintN(b, uint8(header.PacketNumberLen))
+ packetNumber, err := utils.BigEndian.ReadUintN(b, uint8(header.PacketNumberLen))
if err != nil {
return nil, err
}
header.PacketNumber = protocol.PacketNumber(packetNumber)
}
-
return header, nil
}
-// GetLength gets the length of the publicHeader in bytes.
+// getPublicHeaderLength gets the length of the publicHeader in bytes.
// It can only be called for regular packets.
-func (h *PublicHeader) GetLength(pers protocol.Perspective) (protocol.ByteCount, error) {
+func (h *Header) getPublicHeaderLength(pers protocol.Perspective) (protocol.ByteCount, error) {
if h.VersionFlag && h.ResetFlag {
return 0, errResetAndVersionFlagSet
}
-
if h.VersionFlag && pers == protocol.PerspectiveServer {
return 0, errGetLengthNotForVersionNegotiation
}
length := protocol.ByteCount(1) // 1 byte for public flags
-
if h.hasPacketNumber(pers) {
if h.PacketNumberLen != protocol.PacketNumberLen1 && h.PacketNumberLen != protocol.PacketNumberLen2 && h.PacketNumberLen != protocol.PacketNumberLen4 && h.PacketNumberLen != protocol.PacketNumberLen6 {
return 0, errPacketNumberLenNotSet
}
length += protocol.ByteCount(h.PacketNumberLen)
}
-
- if !h.TruncateConnectionID {
+ if !h.OmitConnectionID {
length += 8 // 8 bytes for the connection ID
}
-
// Version Number in packets sent by the client
if h.VersionFlag {
length += 4
}
-
length += protocol.ByteCount(len(h.DiversificationNonce))
-
return length, nil
}
-// hasPacketNumber determines if this PublicHeader will contain a packet number
+// hasPacketNumber determines if this Public Header will contain a packet number
// this depends on the ResetFlag, the VersionFlag and who sent the packet
-func (h *PublicHeader) hasPacketNumber(packetSentBy protocol.Perspective) bool {
+func (h *Header) hasPacketNumber(packetSentBy protocol.Perspective) bool {
if h.ResetFlag {
return false
}
@@ -262,3 +228,15 @@ func (h *PublicHeader) hasPacketNumber(packetSentBy protocol.Perspective) bool {
}
return true
}
+
+func (h *Header) logPublicHeader() {
+ connID := "(omitted)"
+ if !h.OmitConnectionID {
+ connID = fmt.Sprintf("%#x", h.ConnectionID)
+ }
+ ver := "(unset)"
+ if h.Version != 0 {
+ ver = fmt.Sprintf("%s", h.Version)
+ }
+ utils.Debugf(" Public Header{ConnectionID: %s, PacketNumber: %#x, PacketNumberLen: %d, Version: %s, DiversificationNonce: %#v}", connID, h.PacketNumber, h.PacketNumberLen, ver, h.DiversificationNonce)
+}
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/public_header_test.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/public_header_test.go
new file mode 100644
index 0000000..6f63b7e
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/public_header_test.go
@@ -0,0 +1,538 @@
+package wire
+
+import (
+ "bytes"
+ "encoding/binary"
+ "log"
+ "os"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+ "github.com/lucas-clemente/quic-go/qerr"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+)
+
+var _ = Describe("Public Header", func() {
+ Context("when parsing", func() {
+ It("accepts a sample client header", func() {
+ ver := make([]byte, 4)
+ binary.BigEndian.PutUint32(ver, uint32(protocol.SupportedVersions[0]))
+ b := bytes.NewReader(append(append([]byte{0x09, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6}, ver...), 0x01))
+ hdr, err := parsePublicHeader(b, protocol.PerspectiveClient)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.VersionFlag).To(BeTrue())
+ Expect(hdr.IsVersionNegotiation).To(BeFalse())
+ Expect(hdr.ResetFlag).To(BeFalse())
+ Expect(hdr.ConnectionID).To(Equal(protocol.ConnectionID(0x4cfa9f9b668619f6)))
+ Expect(hdr.Version).To(Equal(protocol.SupportedVersions[0]))
+ Expect(hdr.SupportedVersions).To(BeEmpty())
+ Expect(hdr.PacketNumber).To(Equal(protocol.PacketNumber(1)))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("does not accept an omittedd connection ID as a server", func() {
+ b := bytes.NewReader([]byte{0x00, 0x01})
+ _, err := parsePublicHeader(b, protocol.PerspectiveClient)
+ Expect(err).To(MatchError(errReceivedOmittedConnectionID))
+ })
+
+ It("accepts aan d connection ID as a client", func() {
+ b := bytes.NewReader([]byte{0x00, 0x01})
+ hdr, err := parsePublicHeader(b, protocol.PerspectiveServer)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.OmitConnectionID).To(BeTrue())
+ Expect(hdr.ConnectionID).To(BeZero())
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("rejects 0 as a connection ID", func() {
+ b := bytes.NewReader([]byte{0x09, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x51, 0x30, 0x33, 0x30, 0x01})
+ _, err := parsePublicHeader(b, protocol.PerspectiveClient)
+ Expect(err).To(MatchError(errInvalidConnectionID))
+ })
+
+ It("reads a PublicReset packet", func() {
+ b := bytes.NewReader([]byte{0xa, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8})
+ hdr, err := parsePublicHeader(b, protocol.PerspectiveServer)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.ResetFlag).To(BeTrue())
+ Expect(hdr.ConnectionID).ToNot(BeZero())
+ })
+
+ It("parses a public reset packet", func() {
+ b := bytes.NewReader([]byte{0xa, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08})
+ hdr, err := parsePublicHeader(b, protocol.PerspectiveServer)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.ResetFlag).To(BeTrue())
+ Expect(hdr.VersionFlag).To(BeFalse())
+ Expect(hdr.IsVersionNegotiation).To(BeFalse())
+ Expect(hdr.ConnectionID).To(Equal(protocol.ConnectionID(0x0102030405060708)))
+ })
+
+ It("reads a diversification nonce sent by the server", func() {
+ divNonce := []byte{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f}
+ Expect(divNonce).To(HaveLen(32))
+ b := bytes.NewReader(append(append([]byte{0x0c, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c}, divNonce...), 0x37))
+ hdr, err := parsePublicHeader(b, protocol.PerspectiveServer)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.ConnectionID).To(Not(BeZero()))
+ Expect(hdr.DiversificationNonce).To(Equal(divNonce))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ PIt("rejects diversification nonces sent by the client", func() {
+ b := bytes.NewReader([]byte{0x0c, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1,
+ 0x01,
+ })
+ _, err := parsePublicHeader(b, protocol.PerspectiveClient)
+ Expect(err).To(MatchError("diversification nonces should only be sent by servers"))
+ })
+
+ Context("version negotiation packets", func() {
+ appendVersion := func(data []byte, v protocol.VersionNumber) []byte {
+ data = append(data, []byte{0, 0, 0, 0}...)
+ binary.BigEndian.PutUint32(data[len(data)-4:], uint32(v))
+ return data
+ }
+
+ It("parses", func() {
+ versions := []protocol.VersionNumber{0x13, 0x37}
+ b := bytes.NewReader(ComposeGQUICVersionNegotiation(0x1337, versions))
+ hdr, err := parsePublicHeader(b, protocol.PerspectiveServer)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.VersionFlag).To(BeTrue())
+ Expect(hdr.Version).To(BeZero()) // unitialized
+ Expect(hdr.IsVersionNegotiation).To(BeTrue())
+ // in addition to the versions, the supported versions might contain a reserved version number
+ for _, version := range versions {
+ Expect(hdr.SupportedVersions).To(ContainElement(version))
+ }
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("errors if it doesn't contain any versions", func() {
+ b := bytes.NewReader([]byte{0x9, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c})
+ _, err := parsePublicHeader(b, protocol.PerspectiveServer)
+ Expect(err).To(MatchError("InvalidVersionNegotiationPacket: empty version list"))
+ })
+
+ It("reads version negotiation packets containing unsupported versions", func() {
+ data := []byte{0x9, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c}
+ data = appendVersion(data, 1) // unsupported version
+ data = appendVersion(data, protocol.SupportedVersions[0])
+ data = appendVersion(data, 99) // unsupported version
+ b := bytes.NewReader(data)
+ hdr, err := parsePublicHeader(b, protocol.PerspectiveServer)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.VersionFlag).To(BeTrue())
+ Expect(hdr.IsVersionNegotiation).To(BeTrue())
+ Expect(hdr.SupportedVersions).To(Equal([]protocol.VersionNumber{1, protocol.SupportedVersions[0], 99}))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("errors on invalid version tags", func() {
+ data := ComposeGQUICVersionNegotiation(0x1337, protocol.SupportedVersions)
+ data = append(data, []byte{0x13, 0x37}...)
+ b := bytes.NewReader(data)
+ _, err := parsePublicHeader(b, protocol.PerspectiveServer)
+ Expect(err).To(MatchError(qerr.InvalidVersionNegotiationPacket))
+ })
+ })
+
+ Context("Packet Number lengths", func() {
+ It("accepts 1-byte packet numbers", func() {
+ b := bytes.NewReader([]byte{0x08, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6, 0xde})
+ hdr, err := parsePublicHeader(b, protocol.PerspectiveClient)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.PacketNumber).To(Equal(protocol.PacketNumber(0xde)))
+ Expect(hdr.PacketNumberLen).To(Equal(protocol.PacketNumberLen1))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("accepts 2-byte packet numbers", func() {
+ b := bytes.NewReader([]byte{0x18, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6, 0xde, 0xca})
+ hdr, err := parsePublicHeader(b, protocol.PerspectiveClient)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.PacketNumber).To(Equal(protocol.PacketNumber(0xdeca)))
+ Expect(hdr.PacketNumberLen).To(Equal(protocol.PacketNumberLen2))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("accepts 4-byte packet numbers", func() {
+ b := bytes.NewReader([]byte{0x28, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6, 0xad, 0xfb, 0xca, 0xde})
+ hdr, err := parsePublicHeader(b, protocol.PerspectiveClient)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.PacketNumber).To(Equal(protocol.PacketNumber(0xadfbcade)))
+ Expect(hdr.PacketNumberLen).To(Equal(protocol.PacketNumberLen4))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("accepts 6-byte packet numbers", func() {
+ b := bytes.NewReader([]byte{0x38, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6, 0x23, 0x42, 0xad, 0xfb, 0xca, 0xde})
+ hdr, err := parsePublicHeader(b, protocol.PerspectiveClient)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.PacketNumber).To(Equal(protocol.PacketNumber(0x2342adfbcade)))
+ Expect(hdr.PacketNumberLen).To(Equal(protocol.PacketNumberLen6))
+ Expect(b.Len()).To(BeZero())
+ })
+ })
+ })
+
+ Context("when writing", func() {
+ It("writes a sample header as a server", func() {
+ b := &bytes.Buffer{}
+ hdr := Header{
+ ConnectionID: 0x4cfa9f9b668619f6,
+ PacketNumber: 2,
+ PacketNumberLen: protocol.PacketNumberLen6,
+ }
+ err := hdr.writePublicHeader(b, protocol.PerspectiveServer, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()).To(Equal([]byte{0x38, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6, 0, 0, 0, 0, 0, 2}))
+ })
+
+ It("writes a sample header as a client", func() {
+ b := &bytes.Buffer{}
+ hdr := Header{
+ ConnectionID: 0x4cfa9f9b668619f6,
+ PacketNumber: 0x1337,
+ PacketNumberLen: protocol.PacketNumberLen6,
+ }
+ err := hdr.writePublicHeader(b, protocol.PerspectiveClient, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()).To(Equal([]byte{0x38, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x13, 0x37}))
+ })
+
+ It("refuses to write a Public Header if the PacketNumberLen is not set", func() {
+ hdr := Header{
+ ConnectionID: 1,
+ PacketNumber: 2,
+ }
+ b := &bytes.Buffer{}
+ err := hdr.writePublicHeader(b, protocol.PerspectiveServer, protocol.VersionWhatever)
+ Expect(err).To(MatchError("PublicHeader: PacketNumberLen not set"))
+ })
+
+ It("omits the connection ID", func() {
+ b := &bytes.Buffer{}
+ hdr := Header{
+ ConnectionID: 0x4cfa9f9b668619f6,
+ OmitConnectionID: true,
+ PacketNumberLen: protocol.PacketNumberLen1,
+ PacketNumber: 1,
+ }
+ err := hdr.writePublicHeader(b, protocol.PerspectiveServer, protocol.VersionWhatever)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()).To(Equal([]byte{0x0, 0x1}))
+ })
+
+ It("writes diversification nonces", func() {
+ b := &bytes.Buffer{}
+ hdr := Header{
+ ConnectionID: 0x4cfa9f9b668619f6,
+ PacketNumber: 1,
+ PacketNumberLen: protocol.PacketNumberLen1,
+ DiversificationNonce: bytes.Repeat([]byte{1}, 32),
+ }
+ err := hdr.writePublicHeader(b, protocol.PerspectiveServer, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()).To(Equal([]byte{
+ 0x0c, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0x01,
+ }))
+ })
+
+ It("throws an error if both Reset Flag and Version Flag are set", func() {
+ b := &bytes.Buffer{}
+ hdr := Header{
+ VersionFlag: true,
+ ResetFlag: true,
+ }
+ err := hdr.writePublicHeader(b, protocol.PerspectiveServer, protocol.VersionWhatever)
+ Expect(err).To(MatchError(errResetAndVersionFlagSet))
+ })
+
+ Context("Version Negotiation packets", func() {
+ It("sets the Version Flag for packets sent as a server", func() {
+ b := &bytes.Buffer{}
+ hdr := Header{
+ VersionFlag: true,
+ ConnectionID: 0x4cfa9f9b668619f6,
+ PacketNumber: 2,
+ PacketNumberLen: protocol.PacketNumberLen6,
+ }
+ err := hdr.writePublicHeader(b, protocol.PerspectiveServer, protocol.VersionWhatever)
+ Expect(err).ToNot(HaveOccurred())
+ // must be the first assertion
+ Expect(b.Len()).To(Equal(1 + 8)) // 1 FlagByte + 8 ConnectionID
+ firstByte, _ := b.ReadByte()
+ Expect(firstByte & 0x01).To(Equal(uint8(1)))
+ Expect(firstByte & 0x30).To(BeZero()) // no packet number present
+ })
+
+ It("sets the Version Flag for packets sent as a client, and adds a packet number", func() {
+ b := &bytes.Buffer{}
+ hdr := Header{
+ VersionFlag: true,
+ Version: protocol.Version39,
+ ConnectionID: 0x4cfa9f9b668619f6,
+ PacketNumber: 0x42,
+ PacketNumberLen: protocol.PacketNumberLen1,
+ }
+ err := hdr.writePublicHeader(b, protocol.PerspectiveClient, protocol.VersionWhatever)
+ Expect(err).ToNot(HaveOccurred())
+ // must be the first assertion
+ Expect(b.Len()).To(Equal(1 + 8 + 4 + 1)) // 1 FlagByte + 8 ConnectionID + 4 version number + 1 PacketNumber
+ firstByte, _ := b.ReadByte()
+ Expect(firstByte & 0x01).To(Equal(uint8(1)))
+ Expect(firstByte & 0x30).To(Equal(uint8(0x0)))
+ Expect(string(b.Bytes()[8:12])).To(Equal("Q039"))
+ Expect(b.Bytes()[12:13]).To(Equal([]byte{0x42}))
+ })
+ })
+
+ Context("PublicReset packets", func() {
+ It("sets the Reset Flag", func() {
+ b := &bytes.Buffer{}
+ hdr := Header{
+ ResetFlag: true,
+ ConnectionID: 0x4cfa9f9b668619f6,
+ }
+ err := hdr.writePublicHeader(b, protocol.PerspectiveServer, protocol.VersionWhatever)
+ Expect(err).ToNot(HaveOccurred())
+ // must be the first assertion
+ Expect(b.Len()).To(Equal(1 + 8)) // 1 FlagByte + 8 ConnectionID
+ firstByte, _ := b.ReadByte()
+ Expect((firstByte & 0x02) >> 1).To(Equal(uint8(1)))
+ })
+
+ It("doesn't add a packet number for headers with Reset Flag sent as a client", func() {
+ b := &bytes.Buffer{}
+ hdr := Header{
+ ResetFlag: true,
+ ConnectionID: 0x4cfa9f9b668619f6,
+ PacketNumber: 2,
+ PacketNumberLen: protocol.PacketNumberLen6,
+ }
+ err := hdr.writePublicHeader(b, protocol.PerspectiveClient, protocol.VersionWhatever)
+ Expect(err).ToNot(HaveOccurred())
+ // must be the first assertion
+ Expect(b.Len()).To(Equal(1 + 8)) // 1 FlagByte + 8 ConnectionID
+ })
+ })
+
+ Context("getting the length", func() {
+ It("errors when calling getPublicHeaderLength for Version Negotiation packets", func() {
+ hdr := Header{VersionFlag: true}
+ _, err := hdr.getPublicHeaderLength(protocol.PerspectiveServer)
+ Expect(err).To(MatchError(errGetLengthNotForVersionNegotiation))
+ })
+
+ It("errors when calling getPublicHeaderLength for packets that have the VersionFlag and the ResetFlag set", func() {
+ hdr := Header{
+ ResetFlag: true,
+ VersionFlag: true,
+ }
+ _, err := hdr.getPublicHeaderLength(protocol.PerspectiveServer)
+ Expect(err).To(MatchError(errResetAndVersionFlagSet))
+ })
+
+ It("errors when PacketNumberLen is not set", func() {
+ hdr := Header{
+ ConnectionID: 0x4cfa9f9b668619f6,
+ PacketNumber: 0xdecafbad,
+ }
+ _, err := hdr.getPublicHeaderLength(protocol.PerspectiveServer)
+ Expect(err).To(MatchError(errPacketNumberLenNotSet))
+ })
+
+ It("gets the length of a packet with longest packet number length and connectionID", func() {
+ hdr := Header{
+ ConnectionID: 0x4cfa9f9b668619f6,
+ PacketNumber: 0xdecafbad,
+ PacketNumberLen: protocol.PacketNumberLen6,
+ }
+ length, err := hdr.getPublicHeaderLength(protocol.PerspectiveServer)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(length).To(Equal(protocol.ByteCount(1 + 8 + 6))) // 1 byte public flag, 8 bytes connectionID, and packet number
+ })
+
+ It("gets the lengths of a packet sent by the client with the VersionFlag set", func() {
+ hdr := Header{
+ ConnectionID: 0x4cfa9f9b668619f6,
+ OmitConnectionID: true,
+ PacketNumber: 0xdecafbad,
+ PacketNumberLen: protocol.PacketNumberLen6,
+ VersionFlag: true,
+ Version: versionBigEndian,
+ }
+ length, err := hdr.getPublicHeaderLength(protocol.PerspectiveClient)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(length).To(Equal(protocol.ByteCount(1 + 4 + 6))) // 1 byte public flag, 4 version number, and packet number
+ })
+
+ It("gets the length of a packet with longest packet number length and omitted connectionID", func() {
+ hdr := Header{
+ ConnectionID: 0x4cfa9f9b668619f6,
+ OmitConnectionID: true,
+ PacketNumber: 0xDECAFBAD,
+ PacketNumberLen: protocol.PacketNumberLen6,
+ }
+ length, err := hdr.getPublicHeaderLength(protocol.PerspectiveServer)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(length).To(Equal(protocol.ByteCount(1 + 6))) // 1 byte public flag, and packet number
+ })
+
+ It("gets the length of a packet 2 byte packet number length ", func() {
+ hdr := Header{
+ ConnectionID: 0x4cfa9f9b668619f6,
+ PacketNumber: 0xDECAFBAD,
+ PacketNumberLen: protocol.PacketNumberLen2,
+ }
+ length, err := hdr.getPublicHeaderLength(protocol.PerspectiveServer)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(length).To(Equal(protocol.ByteCount(1 + 8 + 2))) // 1 byte public flag, 8 byte connectionID, and packet number
+ })
+
+ It("works with diversification nonce", func() {
+ hdr := Header{
+ DiversificationNonce: []byte("foo"),
+ PacketNumberLen: protocol.PacketNumberLen1,
+ }
+ length, err := hdr.getPublicHeaderLength(protocol.PerspectiveServer)
+ Expect(err).NotTo(HaveOccurred())
+ Expect(length).To(Equal(protocol.ByteCount(1 + 8 + 3 + 1))) // 1 byte public flag, 8 byte connectionID, 3 byte DiversificationNonce, 1 byte PacketNumber
+ })
+
+ It("gets the length of a PublicReset", func() {
+ hdr := Header{
+ ResetFlag: true,
+ ConnectionID: 0x4cfa9f9b668619f6,
+ }
+ length, err := hdr.getPublicHeaderLength(protocol.PerspectiveServer)
+ Expect(err).NotTo(HaveOccurred())
+ Expect(length).To(Equal(protocol.ByteCount(1 + 8))) // 1 byte public flag, 8 byte connectionID
+ })
+ })
+
+ Context("packet number length", func() {
+ It("doesn't write a header if the packet number length is not set", func() {
+ b := &bytes.Buffer{}
+ hdr := Header{
+ ConnectionID: 0x4cfa9f9b668619f6,
+ PacketNumber: 0xDECAFBAD,
+ }
+ err := hdr.writePublicHeader(b, protocol.PerspectiveServer, protocol.VersionWhatever)
+ Expect(err).To(MatchError("PublicHeader: PacketNumberLen not set"))
+ })
+
+ Context("in big endian", func() {
+ version := versionBigEndian
+
+ It("writes a header with a 1-byte packet number", func() {
+ b := &bytes.Buffer{}
+ hdr := Header{
+ ConnectionID: 0x4cfa9f9b668619f6,
+ PacketNumber: 0xdecafbad,
+ PacketNumberLen: protocol.PacketNumberLen1,
+ }
+ err := hdr.writePublicHeader(b, protocol.PerspectiveServer, version)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()).To(Equal([]byte{0x08, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6, 0xad}))
+ })
+
+ It("writes a header with a 2-byte packet number", func() {
+ b := &bytes.Buffer{}
+ hdr := Header{
+ ConnectionID: 0x4cfa9f9b668619f6,
+ PacketNumber: 0xdecafbad,
+ PacketNumberLen: protocol.PacketNumberLen2,
+ }
+ err := hdr.writePublicHeader(b, protocol.PerspectiveServer, version)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()).To(Equal([]byte{0x18, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6, 0xfb, 0xad}))
+ })
+
+ It("writes a header with a 4-byte packet number", func() {
+ b := &bytes.Buffer{}
+ hdr := Header{
+ ConnectionID: 0x4cfa9f9b668619f6,
+ PacketNumber: 0x13decafbad,
+ PacketNumberLen: protocol.PacketNumberLen4,
+ }
+ err := hdr.writePublicHeader(b, protocol.PerspectiveServer, version)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()).To(Equal([]byte{0x28, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6, 0xde, 0xca, 0xfb, 0xad}))
+ })
+
+ It("writes a header with a 6-byte packet number", func() {
+ b := &bytes.Buffer{}
+ hdr := Header{
+ ConnectionID: 0x4cfa9f9b668619f6,
+ PacketNumber: 0xbe1337decafbad,
+ PacketNumberLen: protocol.PacketNumberLen6,
+ }
+ err := hdr.writePublicHeader(b, protocol.PerspectiveServer, version)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()).To(Equal([]byte{0x38, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6, 0x13, 0x37, 0xde, 0xca, 0xfb, 0xad}))
+ })
+ })
+ })
+ })
+
+ Context("logging", func() {
+ var buf bytes.Buffer
+
+ BeforeEach(func() {
+ buf.Reset()
+ utils.SetLogLevel(utils.LogLevelDebug)
+ log.SetOutput(&buf)
+ })
+
+ AfterEach(func() {
+ utils.SetLogLevel(utils.LogLevelNothing)
+ log.SetOutput(os.Stdout)
+ })
+
+ It("logs a Public Header containing a connection ID", func() {
+ (&Header{
+ ConnectionID: 0xdecafbad,
+ PacketNumber: 0x1337,
+ PacketNumberLen: 6,
+ Version: protocol.Version39,
+ }).logPublicHeader()
+ Expect(string(buf.Bytes())).To(ContainSubstring("Public Header{ConnectionID: 0xdecafbad, PacketNumber: 0x1337, PacketNumberLen: 6, Version: gQUIC 39"))
+ })
+
+ It("logs a Public Header with omitted connection ID", func() {
+ (&Header{
+ OmitConnectionID: true,
+ PacketNumber: 0x1337,
+ PacketNumberLen: 6,
+ Version: protocol.Version39,
+ }).logPublicHeader()
+ Expect(string(buf.Bytes())).To(ContainSubstring("Public Header{ConnectionID: (omitted)"))
+ })
+
+ It("logs a Public Header without a version", func() {
+ (&Header{
+ OmitConnectionID: true,
+ PacketNumber: 0x1337,
+ PacketNumberLen: 6,
+ }).logPublicHeader()
+ Expect(string(buf.Bytes())).To(ContainSubstring("Version: (unset)"))
+ })
+
+ It("logs diversification nonces", func() {
+ (&Header{
+ ConnectionID: 0xdecafbad,
+ DiversificationNonce: []byte{0xba, 0xdf, 0x00, 0x0d},
+ }).logPublicHeader()
+ Expect(string(buf.Bytes())).To(ContainSubstring("DiversificationNonce: []byte{0xba, 0xdf, 0x0, 0xd}"))
+ })
+
+ })
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/public_reset.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/public_reset.go
new file mode 100644
index 0000000..6adc9f6
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/public_reset.go
@@ -0,0 +1,65 @@
+package wire
+
+import (
+ "bytes"
+ "encoding/binary"
+ "errors"
+
+ "github.com/lucas-clemente/quic-go/internal/handshake"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+)
+
+// A PublicReset is a PUBLIC_RESET
+type PublicReset struct {
+ RejectedPacketNumber protocol.PacketNumber
+ Nonce uint64
+}
+
+// WritePublicReset writes a Public Reset
+func WritePublicReset(connectionID protocol.ConnectionID, rejectedPacketNumber protocol.PacketNumber, nonceProof uint64) []byte {
+ b := &bytes.Buffer{}
+ b.WriteByte(0x0a)
+ utils.BigEndian.WriteUint64(b, uint64(connectionID))
+ utils.LittleEndian.WriteUint32(b, uint32(handshake.TagPRST))
+ utils.LittleEndian.WriteUint32(b, 2)
+ utils.LittleEndian.WriteUint32(b, uint32(handshake.TagRNON))
+ utils.LittleEndian.WriteUint32(b, 8)
+ utils.LittleEndian.WriteUint32(b, uint32(handshake.TagRSEQ))
+ utils.LittleEndian.WriteUint32(b, 16)
+ utils.LittleEndian.WriteUint64(b, nonceProof)
+ utils.LittleEndian.WriteUint64(b, uint64(rejectedPacketNumber))
+ return b.Bytes()
+}
+
+// ParsePublicReset parses a Public Reset
+func ParsePublicReset(r *bytes.Reader) (*PublicReset, error) {
+ pr := PublicReset{}
+ msg, err := handshake.ParseHandshakeMessage(r)
+ if err != nil {
+ return nil, err
+ }
+ if msg.Tag != handshake.TagPRST {
+ return nil, errors.New("wrong public reset tag")
+ }
+
+ // The RSEQ tag is mandatory according to the gQUIC wire spec.
+ // However, Google doesn't send RSEQ in their Public Resets.
+ // Therefore, we'll treat RSEQ as an optional field.
+ if rseq, ok := msg.Data[handshake.TagRSEQ]; ok {
+ if len(rseq) != 8 {
+ return nil, errors.New("invalid RSEQ tag")
+ }
+ pr.RejectedPacketNumber = protocol.PacketNumber(binary.LittleEndian.Uint64(rseq))
+ }
+
+ rnon, ok := msg.Data[handshake.TagRNON]
+ if !ok {
+ return nil, errors.New("RNON missing")
+ }
+ if len(rnon) != 8 {
+ return nil, errors.New("invalid RNON tag")
+ }
+ pr.Nonce = binary.LittleEndian.Uint64(rnon)
+ return &pr, nil
+}
diff --git a/vendor/github.com/lucas-clemente/quic-go/public_reset_test.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/public_reset_test.go
similarity index 58%
rename from vendor/github.com/lucas-clemente/quic-go/public_reset_test.go
rename to vendor/github.com/lucas-clemente/quic-go/internal/wire/public_reset_test.go
index 0df859b..72e7939 100644
--- a/vendor/github.com/lucas-clemente/quic-go/public_reset_test.go
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/public_reset_test.go
@@ -1,11 +1,11 @@
-package quic
+package wire
import (
"bytes"
"io"
- "github.com/lucas-clemente/quic-go/handshake"
- "github.com/lucas-clemente/quic-go/protocol"
+ "github.com/lucas-clemente/quic-go/internal/handshake"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
@@ -13,9 +13,9 @@ import (
var _ = Describe("public reset", func() {
Context("writing", func() {
It("writes public reset packets", func() {
- Expect(writePublicReset(0xdeadbeef, 0x8badf00d, 0xdecafbad)).To(Equal([]byte{
+ Expect(WritePublicReset(0xdeadbeef, 0x8badf00d, 0xdecafbad)).To(Equal([]byte{
0x0a,
- 0xef, 0xbe, 0xad, 0xde, 0x00, 0x00, 0x00, 0x00,
+ 0x0, 0x0, 0x0, 0x0, 0xde, 0xad, 0xbe, 0xef,
'P', 'R', 'S', 'T',
0x02, 0x00, 0x00, 0x00,
'R', 'N', 'O', 'N',
@@ -36,21 +36,21 @@ var _ = Describe("public reset", func() {
})
It("parses a public reset", func() {
- packet := writePublicReset(0xdeadbeef, 0x8badf00d, 0xdecafbad)
- pr, err := parsePublicReset(bytes.NewReader(packet[9:])) // 1 byte Public Flag, 8 bytes connection ID
+ packet := WritePublicReset(0xdeadbeef, 0x8badf00d, 0xdecafbad)
+ pr, err := ParsePublicReset(bytes.NewReader(packet[9:])) // 1 byte Public Flag, 8 bytes connection ID
Expect(err).ToNot(HaveOccurred())
- Expect(pr.nonce).To(Equal(uint64(0xdecafbad)))
- Expect(pr.rejectedPacketNumber).To(Equal(protocol.PacketNumber(0x8badf00d)))
+ Expect(pr.Nonce).To(Equal(uint64(0xdecafbad)))
+ Expect(pr.RejectedPacketNumber).To(Equal(protocol.PacketNumber(0x8badf00d)))
})
It("rejects packets that it can't parse", func() {
- _, err := parsePublicReset(bytes.NewReader([]byte{}))
+ _, err := ParsePublicReset(bytes.NewReader([]byte{}))
Expect(err).To(MatchError(io.EOF))
})
It("rejects packets with the wrong tag", func() {
- handshake.WriteHandshakeMessage(b, handshake.TagREJ, nil)
- _, err := parsePublicReset(bytes.NewReader(b.Bytes()))
+ handshake.HandshakeMessage{Tag: handshake.TagREJ, Data: nil}.Write(b)
+ _, err := ParsePublicReset(bytes.NewReader(b.Bytes()))
Expect(err).To(MatchError("wrong public reset tag"))
})
@@ -58,8 +58,8 @@ var _ = Describe("public reset", func() {
data := map[handshake.Tag][]byte{
handshake.TagRSEQ: []byte{0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0x13, 0x37},
}
- handshake.WriteHandshakeMessage(b, handshake.TagPRST, data)
- _, err := parsePublicReset(bytes.NewReader(b.Bytes()))
+ handshake.HandshakeMessage{Tag: handshake.TagPRST, Data: data}.Write(b)
+ _, err := ParsePublicReset(bytes.NewReader(b.Bytes()))
Expect(err).To(MatchError("RNON missing"))
})
@@ -68,18 +68,19 @@ var _ = Describe("public reset", func() {
handshake.TagRSEQ: []byte{0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0x13, 0x37},
handshake.TagRNON: []byte{0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0x13},
}
- handshake.WriteHandshakeMessage(b, handshake.TagPRST, data)
- _, err := parsePublicReset(bytes.NewReader(b.Bytes()))
+ handshake.HandshakeMessage{Tag: handshake.TagPRST, Data: data}.Write(b)
+ _, err := ParsePublicReset(bytes.NewReader(b.Bytes()))
Expect(err).To(MatchError("invalid RNON tag"))
})
- It("rejects packets missing the rejected packet number", func() {
+ It("accepts packets missing the rejected packet number", func() {
data := map[handshake.Tag][]byte{
handshake.TagRNON: []byte{0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0x13, 0x37},
}
- handshake.WriteHandshakeMessage(b, handshake.TagPRST, data)
- _, err := parsePublicReset(bytes.NewReader(b.Bytes()))
- Expect(err).To(MatchError("RSEQ missing"))
+ handshake.HandshakeMessage{Tag: handshake.TagPRST, Data: data}.Write(b)
+ pr, err := ParsePublicReset(bytes.NewReader(b.Bytes()))
+ Expect(err).ToNot(HaveOccurred())
+ Expect(pr.Nonce).To(Equal(uint64(0x3713fecaefbeadde)))
})
It("rejects packets with a wrong length rejected packet number", func() {
@@ -87,8 +88,8 @@ var _ = Describe("public reset", func() {
handshake.TagRSEQ: []byte{0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0x13},
handshake.TagRNON: []byte{0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0x13, 0x37},
}
- handshake.WriteHandshakeMessage(b, handshake.TagPRST, data)
- _, err := parsePublicReset(bytes.NewReader(b.Bytes()))
+ handshake.HandshakeMessage{Tag: handshake.TagPRST, Data: data}.Write(b)
+ _, err := ParsePublicReset(bytes.NewReader(b.Bytes()))
Expect(err).To(MatchError("invalid RSEQ tag"))
})
})
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/rst_stream_frame.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/rst_stream_frame.go
new file mode 100644
index 0000000..05a4cad
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/rst_stream_frame.go
@@ -0,0 +1,88 @@
+package wire
+
+import (
+ "bytes"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+)
+
+// A RstStreamFrame in QUIC
+type RstStreamFrame struct {
+ StreamID protocol.StreamID
+ ErrorCode uint32
+ ByteOffset protocol.ByteCount
+}
+
+// ParseRstStreamFrame parses a RST_STREAM frame
+func ParseRstStreamFrame(r *bytes.Reader, version protocol.VersionNumber) (*RstStreamFrame, error) {
+ if _, err := r.ReadByte(); err != nil { // read the TypeByte
+ return nil, err
+ }
+
+ var streamID protocol.StreamID
+ var errorCode uint32
+ var byteOffset protocol.ByteCount
+ if version.UsesIETFFrameFormat() {
+ sid, err := utils.ReadVarInt(r)
+ if err != nil {
+ return nil, err
+ }
+ streamID = protocol.StreamID(sid)
+ ec, err := utils.BigEndian.ReadUint16(r)
+ if err != nil {
+ return nil, err
+ }
+ errorCode = uint32(ec)
+ bo, err := utils.ReadVarInt(r)
+ if err != nil {
+ return nil, err
+ }
+ byteOffset = protocol.ByteCount(bo)
+ } else {
+ sid, err := utils.BigEndian.ReadUint32(r)
+ if err != nil {
+ return nil, err
+ }
+ streamID = protocol.StreamID(sid)
+ bo, err := utils.BigEndian.ReadUint64(r)
+ if err != nil {
+ return nil, err
+ }
+ byteOffset = protocol.ByteCount(bo)
+ ec, err := utils.BigEndian.ReadUint32(r)
+ if err != nil {
+ return nil, err
+ }
+ errorCode = uint32(ec)
+ }
+
+ return &RstStreamFrame{
+ StreamID: streamID,
+ ErrorCode: errorCode,
+ ByteOffset: byteOffset,
+ }, nil
+}
+
+//Write writes a RST_STREAM frame
+func (f *RstStreamFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error {
+ b.WriteByte(0x01)
+ if version.UsesIETFFrameFormat() {
+ utils.WriteVarInt(b, uint64(f.StreamID))
+ utils.BigEndian.WriteUint16(b, uint16(f.ErrorCode))
+ utils.WriteVarInt(b, uint64(f.ByteOffset))
+ } else {
+ utils.BigEndian.WriteUint32(b, uint32(f.StreamID))
+ utils.BigEndian.WriteUint64(b, uint64(f.ByteOffset))
+ utils.BigEndian.WriteUint32(b, f.ErrorCode)
+ }
+ return nil
+}
+
+// MinLength of a written frame
+func (f *RstStreamFrame) MinLength(version protocol.VersionNumber) (protocol.ByteCount, error) {
+ if version.UsesIETFFrameFormat() {
+ return 1 + utils.VarIntLen(uint64(f.StreamID)) + 2 + utils.VarIntLen(uint64(f.ByteOffset)), nil
+ }
+ return 1 + 4 + 8 + 4, nil
+}
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/rst_stream_frame_test.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/rst_stream_frame_test.go
new file mode 100644
index 0000000..380c055
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/rst_stream_frame_test.go
@@ -0,0 +1,128 @@
+package wire
+
+import (
+ "bytes"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+)
+
+var _ = Describe("RST_STREAM frame", func() {
+ Context("when parsing", func() {
+ Context("in varint encoding", func() {
+ It("accepts sample frame", func() {
+ data := []byte{0x1}
+ data = append(data, encodeVarInt(0xdeadbeef)...) // stream ID
+ data = append(data, []byte{0x13, 0x37}...) // error code
+ data = append(data, encodeVarInt(0x987654321)...) // byte offset
+ b := bytes.NewReader(data)
+ frame, err := ParseRstStreamFrame(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.StreamID).To(Equal(protocol.StreamID(0xdeadbeef)))
+ Expect(frame.ByteOffset).To(Equal(protocol.ByteCount(0x987654321)))
+ Expect(frame.ErrorCode).To(Equal(uint32(0x1337)))
+ })
+
+ It("errors on EOFs", func() {
+ data := []byte{0x1}
+ data = append(data, encodeVarInt(0xdeadbeef)...) // stream ID
+ data = append(data, []byte{0x13, 0x37}...) // error code
+ data = append(data, encodeVarInt(0x987654321)...) // byte offset
+ _, err := ParseRstStreamFrame(bytes.NewReader(data), versionIETFFrames)
+ Expect(err).NotTo(HaveOccurred())
+ for i := range data {
+ _, err := ParseRstStreamFrame(bytes.NewReader(data[0:i]), versionIETFFrames)
+ Expect(err).To(HaveOccurred())
+ }
+ })
+ })
+
+ Context("in big endian", func() {
+ It("accepts sample frame", func() {
+ b := bytes.NewReader([]byte{0x1,
+ 0xde, 0xad, 0xbe, 0xef, // stream id
+ 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, // byte offset
+ 0x34, 0x12, 0x37, 0x13, // error code
+ })
+ frame, err := ParseRstStreamFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.StreamID).To(Equal(protocol.StreamID(0xdeadbeef)))
+ Expect(frame.ByteOffset).To(Equal(protocol.ByteCount(0x8877665544332211)))
+ Expect(frame.ErrorCode).To(Equal(uint32(0x34123713)))
+ })
+
+ It("errors on EOFs", func() {
+ data := []byte{0x1,
+ 0xef, 0xbe, 0xad, 0xde, 0x44, // stream id
+ 0x33, 0x22, 0x11, 0xad, 0xfb, 0xca, 0xde, 0x34, // byte offset
+ 0x12, 0x37, 0x13, // error code
+ }
+ _, err := ParseRstStreamFrame(bytes.NewReader(data), versionBigEndian)
+ Expect(err).NotTo(HaveOccurred())
+ for i := range data {
+ _, err := ParseRstStreamFrame(bytes.NewReader(data[0:i]), versionBigEndian)
+ Expect(err).To(HaveOccurred())
+ }
+ })
+ })
+ })
+
+ Context("when writing", func() {
+ Context("in varint encoding", func() {
+ It("writes a sample frame", func() {
+ frame := RstStreamFrame{
+ StreamID: 0x1337,
+ ByteOffset: 0x11223344decafbad,
+ ErrorCode: 0xcafe,
+ }
+ b := &bytes.Buffer{}
+ err := frame.Write(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ expected := []byte{0x1}
+ expected = append(expected, encodeVarInt(0x1337)...)
+ expected = append(expected, []byte{0xca, 0xfe}...)
+ expected = append(expected, encodeVarInt(0x11223344decafbad)...)
+ Expect(b.Bytes()).To(Equal(expected))
+ })
+
+ It("has the correct min length", func() {
+ rst := RstStreamFrame{
+ StreamID: 0x1337,
+ ByteOffset: 0x1234567,
+ ErrorCode: 0xde,
+ }
+ expectedLen := 1 + utils.VarIntLen(0x1337) + utils.VarIntLen(0x1234567) + 2
+ Expect(rst.MinLength(versionIETFFrames)).To(Equal(expectedLen))
+ })
+ })
+
+ Context("in big endian", func() {
+ It("writes a sample frame", func() {
+ frame := RstStreamFrame{
+ StreamID: 0x1337,
+ ByteOffset: 0x11223344decafbad,
+ ErrorCode: 0xdeadbeef,
+ }
+ b := &bytes.Buffer{}
+ err := frame.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()).To(Equal([]byte{0x01,
+ 0x0, 0x0, 0x13, 0x37, // stream id
+ 0x11, 0x22, 0x33, 0x44, 0xde, 0xca, 0xfb, 0xad, // byte offset
+ 0xde, 0xad, 0xbe, 0xef, // error code
+ }))
+ })
+
+ It("has the correct min length", func() {
+ rst := RstStreamFrame{
+ StreamID: 0x1337,
+ ByteOffset: 0x1000,
+ ErrorCode: 0xde,
+ }
+ Expect(rst.MinLength(versionBigEndian)).To(Equal(protocol.ByteCount(17)))
+ })
+ })
+ })
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/frames/stop_waiting_frame.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/stop_waiting_frame.go
similarity index 62%
rename from vendor/github.com/lucas-clemente/quic-go/frames/stop_waiting_frame.go
rename to vendor/github.com/lucas-clemente/quic-go/internal/wire/stop_waiting_frame.go
index 8267825..1f46688 100644
--- a/vendor/github.com/lucas-clemente/quic-go/frames/stop_waiting_frame.go
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/stop_waiting_frame.go
@@ -1,19 +1,19 @@
-package frames
+package wire
import (
"bytes"
"errors"
- "github.com/lucas-clemente/quic-go/protocol"
- "github.com/lucas-clemente/quic-go/qerr"
- "github.com/lucas-clemente/quic-go/utils"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
)
// A StopWaitingFrame in QUIC
type StopWaitingFrame struct {
LeastUnacked protocol.PacketNumber
PacketNumberLen protocol.PacketNumberLen
- PacketNumber protocol.PacketNumber
+ // PacketNumber is the packet number of the packet that this StopWaitingFrame will be sent with
+ PacketNumber protocol.PacketNumber
}
var (
@@ -22,71 +22,59 @@ var (
errPacketNumberLenNotSet = errors.New("StopWaitingFrame: PacketNumberLen not set")
)
-func (f *StopWaitingFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error {
- // packetNumber is the packet number of the packet that this StopWaitingFrame will be sent with
- typeByte := uint8(0x06)
- b.WriteByte(typeByte)
-
+func (f *StopWaitingFrame) Write(b *bytes.Buffer, _ protocol.VersionNumber) error {
// make sure the PacketNumber was set
if f.PacketNumber == protocol.PacketNumber(0) {
return errPacketNumberNotSet
}
-
if f.LeastUnacked > f.PacketNumber {
return errLeastUnackedHigherThanPacketNumber
}
+ b.WriteByte(0x06)
leastUnackedDelta := uint64(f.PacketNumber - f.LeastUnacked)
-
switch f.PacketNumberLen {
case protocol.PacketNumberLen1:
b.WriteByte(uint8(leastUnackedDelta))
case protocol.PacketNumberLen2:
- utils.WriteUint16(b, uint16(leastUnackedDelta))
+ utils.BigEndian.WriteUint16(b, uint16(leastUnackedDelta))
case protocol.PacketNumberLen4:
- utils.WriteUint32(b, uint32(leastUnackedDelta))
+ utils.BigEndian.WriteUint32(b, uint32(leastUnackedDelta))
case protocol.PacketNumberLen6:
- utils.WriteUint48(b, leastUnackedDelta)
+ utils.BigEndian.WriteUint48(b, leastUnackedDelta&(1<<48-1))
default:
return errPacketNumberLenNotSet
}
-
return nil
}
// MinLength of a written frame
-func (f *StopWaitingFrame) MinLength(version protocol.VersionNumber) (protocol.ByteCount, error) {
- var minLength protocol.ByteCount
- minLength = 1 // typeByte
+func (f *StopWaitingFrame) MinLength(_ protocol.VersionNumber) (protocol.ByteCount, error) {
+ minLength := protocol.ByteCount(1) // typeByte
if f.PacketNumberLen == protocol.PacketNumberLenInvalid {
return 0, errPacketNumberLenNotSet
}
minLength += protocol.ByteCount(f.PacketNumberLen)
-
return minLength, nil
}
// ParseStopWaitingFrame parses a StopWaiting frame
-func ParseStopWaitingFrame(r *bytes.Reader, packetNumber protocol.PacketNumber, packetNumberLen protocol.PacketNumberLen, version protocol.VersionNumber) (*StopWaitingFrame, error) {
+func ParseStopWaitingFrame(r *bytes.Reader, packetNumber protocol.PacketNumber, packetNumberLen protocol.PacketNumberLen, _ protocol.VersionNumber) (*StopWaitingFrame, error) {
frame := &StopWaitingFrame{}
// read the TypeByte
- _, err := r.ReadByte()
- if err != nil {
+ if _, err := r.ReadByte(); err != nil {
return nil, err
}
- leastUnackedDelta, err := utils.ReadUintN(r, uint8(packetNumberLen))
+ leastUnackedDelta, err := utils.BigEndian.ReadUintN(r, uint8(packetNumberLen))
if err != nil {
return nil, err
}
-
if leastUnackedDelta > uint64(packetNumber) {
- return nil, qerr.Error(qerr.InvalidStopWaitingData, "invalid LeastUnackedDelta")
+ return nil, errors.New("invalid LeastUnackedDelta")
}
-
frame.LeastUnacked = protocol.PacketNumber(uint64(packetNumber) - leastUnackedDelta)
-
return frame, nil
}
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/stop_waiting_frame_test.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/stop_waiting_frame_test.go
new file mode 100644
index 0000000..ec22c30
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/stop_waiting_frame_test.go
@@ -0,0 +1,205 @@
+package wire
+
+import (
+ "bytes"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+)
+
+var _ = Describe("StopWaitingFrame", func() {
+ Context("when parsing", func() {
+ Context("in big endian", func() {
+ It("accepts sample frame", func() {
+ b := bytes.NewReader([]byte{0x06, 0x12, 0x34})
+ frame, err := ParseStopWaitingFrame(b, 0x1337, 2, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LeastUnacked).To(Equal(protocol.PacketNumber(0x1337 - 0x1234)))
+ Expect(b.Len()).To(BeZero())
+ })
+ })
+
+ It("rejects frames that would have a negative LeastUnacked value", func() {
+ b := bytes.NewReader([]byte{0x06, 0xD})
+ _, err := ParseStopWaitingFrame(b, 10, 1, protocol.VersionWhatever)
+ Expect(err).To(HaveOccurred())
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("parses a frame with 0 as LeastUnacked", func() {
+ b := bytes.NewReader([]byte{0x6, 0x8})
+ frame, err := ParseStopWaitingFrame(b, 8, 1, protocol.VersionWhatever)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.LeastUnacked).To(Equal(protocol.PacketNumber(0)))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("rejects frames that underflow LeastUnacked", func() {
+ b := bytes.NewReader([]byte{0x6, 0x9})
+ _, err := ParseStopWaitingFrame(b, 8, 1, protocol.VersionWhatever)
+ Expect(err).To(MatchError("invalid LeastUnackedDelta"))
+ })
+
+ It("errors on EOFs", func() {
+ data := []byte{0x06, 0x03}
+ _, err := ParseStopWaitingFrame(bytes.NewReader(data), 5, 1, protocol.VersionWhatever)
+ Expect(err).NotTo(HaveOccurred())
+ for i := range data {
+ _, err := ParseStopWaitingFrame(bytes.NewReader(data[0:i]), 5, 1, protocol.VersionWhatever)
+ Expect(err).To(HaveOccurred())
+ }
+ })
+ })
+
+ Context("when writing", func() {
+ It("writes a sample frame", func() {
+ b := &bytes.Buffer{}
+ frame := &StopWaitingFrame{
+ LeastUnacked: 10,
+ PacketNumber: 13,
+ PacketNumberLen: protocol.PacketNumberLen6,
+ }
+ err := frame.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()[0]).To(Equal(uint8(0x06)))
+ Expect(b.Bytes()[1:7]).To(Equal([]byte{0, 0, 0, 0, 0, 3}))
+ })
+
+ It("writes a frame for LeastUnacked = 0", func() {
+ b := &bytes.Buffer{}
+ frame := &StopWaitingFrame{
+ LeastUnacked: 0,
+ PacketNumber: 8,
+ PacketNumberLen: protocol.PacketNumberLen1,
+ }
+ err := frame.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()).To(Equal([]byte{0x6, 0x8}))
+ })
+
+ It("errors when PacketNumber was not set", func() {
+ b := &bytes.Buffer{}
+ frame := &StopWaitingFrame{
+ LeastUnacked: 10,
+ PacketNumberLen: protocol.PacketNumberLen1,
+ }
+ err := frame.Write(b, protocol.VersionWhatever)
+ Expect(err).To(MatchError(errPacketNumberNotSet))
+ })
+
+ It("errors when PacketNumberLen was not set", func() {
+ b := &bytes.Buffer{}
+ frame := &StopWaitingFrame{
+ LeastUnacked: 10,
+ PacketNumber: 13,
+ }
+ err := frame.Write(b, protocol.VersionWhatever)
+ Expect(err).To(MatchError(errPacketNumberLenNotSet))
+ })
+
+ It("errors when the LeastUnackedDelta would be negative", func() {
+ b := &bytes.Buffer{}
+ frame := &StopWaitingFrame{
+ LeastUnacked: 10,
+ PacketNumber: 5,
+ PacketNumberLen: protocol.PacketNumberLen1,
+ }
+ err := frame.Write(b, protocol.VersionWhatever)
+ Expect(err).To(MatchError(errLeastUnackedHigherThanPacketNumber))
+ })
+
+ Context("LeastUnackedDelta length", func() {
+ Context("in big endian", func() {
+ It("writes a 1-byte LeastUnackedDelta", func() {
+ b := &bytes.Buffer{}
+ frame := &StopWaitingFrame{
+ LeastUnacked: 10,
+ PacketNumber: 13,
+ PacketNumberLen: protocol.PacketNumberLen1,
+ }
+ err := frame.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Len()).To(Equal(2))
+ Expect(b.Bytes()[1]).To(Equal(uint8(3)))
+ })
+
+ It("writes a 2-byte LeastUnackedDelta", func() {
+ b := &bytes.Buffer{}
+ frame := &StopWaitingFrame{
+ LeastUnacked: 0x10,
+ PacketNumber: 0x1300,
+ PacketNumberLen: protocol.PacketNumberLen2,
+ }
+ err := frame.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Len()).To(Equal(3))
+ Expect(b.Bytes()[1:3]).To(Equal([]byte{0x12, 0xf0}))
+ })
+
+ It("writes a 4-byte LeastUnackedDelta", func() {
+ b := &bytes.Buffer{}
+ frame := &StopWaitingFrame{
+ LeastUnacked: 0x1000,
+ PacketNumber: 0x12345678,
+ PacketNumberLen: protocol.PacketNumberLen4,
+ }
+ err := frame.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Len()).To(Equal(5))
+ Expect(b.Bytes()[1:5]).To(Equal([]byte{0x12, 0x34, 0x46, 0x78}))
+ })
+
+ It("writes a 6-byte LeastUnackedDelta, for a delta that fits into 6 bytes", func() {
+ b := &bytes.Buffer{}
+ frame := &StopWaitingFrame{
+ LeastUnacked: 0x10,
+ PacketNumber: 0x123456789abc,
+ PacketNumberLen: protocol.PacketNumberLen6,
+ }
+ err := frame.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Len()).To(Equal(7))
+ Expect(b.Bytes()[1:7]).To(Equal([]byte{0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc - 0x10}))
+ })
+ })
+ })
+ })
+
+ Context("minLength", func() {
+ It("calculates the right minLength", func() {
+ for _, length := range []protocol.PacketNumberLen{protocol.PacketNumberLen1, protocol.PacketNumberLen2, protocol.PacketNumberLen4, protocol.PacketNumberLen6} {
+ frame := &StopWaitingFrame{
+ LeastUnacked: 10,
+ PacketNumberLen: length,
+ }
+ Expect(frame.MinLength(protocol.VersionWhatever)).To(Equal(protocol.ByteCount(length + 1)))
+ }
+ })
+
+ It("errors when packetNumberLen is not set", func() {
+ frame := &StopWaitingFrame{
+ LeastUnacked: 10,
+ }
+ _, err := frame.MinLength(0)
+ Expect(err).To(MatchError(errPacketNumberLenNotSet))
+ })
+ })
+
+ Context("self consistency", func() {
+ It("reads a stop waiting frame that it wrote", func() {
+ packetNumber := protocol.PacketNumber(13)
+ frame := &StopWaitingFrame{
+ LeastUnacked: 10,
+ PacketNumber: packetNumber,
+ PacketNumberLen: protocol.PacketNumberLen4,
+ }
+ b := &bytes.Buffer{}
+ err := frame.Write(b, protocol.VersionWhatever)
+ Expect(err).ToNot(HaveOccurred())
+ readframe, err := ParseStopWaitingFrame(bytes.NewReader(b.Bytes()), packetNumber, protocol.PacketNumberLen4, protocol.VersionWhatever)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(readframe.LeastUnacked).To(Equal(frame.LeastUnacked))
+ })
+ })
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/stream_blocked_frame.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/stream_blocked_frame.go
new file mode 100644
index 0000000..510de50
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/stream_blocked_frame.go
@@ -0,0 +1,43 @@
+package wire
+
+import (
+ "bytes"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+)
+
+// A StreamBlockedFrame in QUIC
+type StreamBlockedFrame struct {
+ StreamID protocol.StreamID
+}
+
+// ParseStreamBlockedFrame parses a STREAM_BLOCKED frame
+func ParseStreamBlockedFrame(r *bytes.Reader, version protocol.VersionNumber) (*StreamBlockedFrame, error) {
+ if _, err := r.ReadByte(); err != nil { // read the TypeByte
+ return nil, err
+ }
+ sid, err := utils.ReadVarInt(r)
+ if err != nil {
+ return nil, err
+ }
+ return &StreamBlockedFrame{StreamID: protocol.StreamID(sid)}, nil
+}
+
+// Write writes a STREAM_BLOCKED frame
+func (f *StreamBlockedFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error {
+ if !version.UsesIETFFrameFormat() {
+ return (&blockedFrameLegacy{StreamID: f.StreamID}).Write(b, version)
+ }
+ b.WriteByte(0x09)
+ utils.WriteVarInt(b, uint64(f.StreamID))
+ return nil
+}
+
+// MinLength of a written frame
+func (f *StreamBlockedFrame) MinLength(version protocol.VersionNumber) (protocol.ByteCount, error) {
+ if !version.UsesIETFFrameFormat() {
+ return 1 + 4, nil
+ }
+ return 1 + utils.VarIntLen(uint64(f.StreamID)), nil
+}
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/stream_blocked_frame_test.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/stream_blocked_frame_test.go
new file mode 100644
index 0000000..d31ce78
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/stream_blocked_frame_test.go
@@ -0,0 +1,57 @@
+package wire
+
+import (
+ "bytes"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+)
+
+var _ = Describe("STREAM_BLOCKED frame", func() {
+ Context("parsing", func() {
+ It("accepts sample frame", func() {
+ data := []byte{0x9}
+ data = append(data, encodeVarInt(0xdeadbeef)...)
+ b := bytes.NewReader(data)
+ frame, err := ParseStreamBlockedFrame(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.StreamID).To(Equal(protocol.StreamID(0xdeadbeef)))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("errors on EOFs", func() {
+ data := []byte{0x9}
+ data = append(data, encodeVarInt(0xdeadbeef)...)
+ _, err := ParseStreamBlockedFrame(bytes.NewReader(data), versionIETFFrames)
+ Expect(err).NotTo(HaveOccurred())
+ for i := range data {
+ _, err := ParseStreamBlockedFrame(bytes.NewReader(data[0:i]), versionIETFFrames)
+ Expect(err).To(HaveOccurred())
+ }
+ })
+ })
+
+ Context("writing", func() {
+ It("has proper min length", func() {
+ f := &StreamBlockedFrame{
+ StreamID: 0x1337,
+ }
+ Expect(f.MinLength(0)).To(Equal(1 + utils.VarIntLen(0x1337)))
+ })
+
+ It("writes a sample frame", func() {
+ b := &bytes.Buffer{}
+ f := &StreamBlockedFrame{
+ StreamID: 0xdecafbad,
+ }
+ err := f.Write(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ expected := []byte{0x9}
+ expected = append(expected, encodeVarInt(uint64(f.StreamID))...)
+ Expect(b.Bytes()).To(Equal(expected))
+ })
+ })
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/stream_frame.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/stream_frame.go
new file mode 100644
index 0000000..fc38acd
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/stream_frame.go
@@ -0,0 +1,132 @@
+package wire
+
+import (
+ "bytes"
+ "errors"
+ "io"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+ "github.com/lucas-clemente/quic-go/qerr"
+)
+
+// A StreamFrame of QUIC
+type StreamFrame struct {
+ StreamID protocol.StreamID
+ FinBit bool
+ DataLenPresent bool
+ Offset protocol.ByteCount
+ Data []byte
+}
+
+// ParseStreamFrame reads a STREAM frame
+func ParseStreamFrame(r *bytes.Reader, version protocol.VersionNumber) (*StreamFrame, error) {
+ if !version.UsesIETFFrameFormat() {
+ return parseLegacyStreamFrame(r, version)
+ }
+
+ frame := &StreamFrame{}
+
+ typeByte, err := r.ReadByte()
+ if err != nil {
+ return nil, err
+ }
+
+ frame.FinBit = typeByte&0x1 > 0
+ frame.DataLenPresent = typeByte&0x2 > 0
+ hasOffset := typeByte&0x4 > 0
+
+ streamID, err := utils.ReadVarInt(r)
+ if err != nil {
+ return nil, err
+ }
+ frame.StreamID = protocol.StreamID(streamID)
+ if hasOffset {
+ offset, err := utils.ReadVarInt(r)
+ if err != nil {
+ return nil, err
+ }
+ frame.Offset = protocol.ByteCount(offset)
+ }
+
+ var dataLen uint64
+ if frame.DataLenPresent {
+ var err error
+ dataLen, err = utils.ReadVarInt(r)
+ if err != nil {
+ return nil, err
+ }
+ // shortcut to prevent the unneccessary allocation of dataLen bytes
+ // if the dataLen is larger than the remaining length of the packet
+ // reading the packet contents would result in EOF when attempting to READ
+ if dataLen > uint64(r.Len()) {
+ return nil, io.EOF
+ }
+ } else {
+ // The rest of the packet is data
+ dataLen = uint64(r.Len())
+ }
+ if dataLen != 0 {
+ frame.Data = make([]byte, dataLen)
+ if _, err := io.ReadFull(r, frame.Data); err != nil {
+ // this should never happen, since we already checked the dataLen earlier
+ return nil, err
+ }
+ }
+ if frame.Offset+frame.DataLen() > protocol.MaxByteCount {
+ return nil, qerr.Error(qerr.InvalidStreamData, "data overflows maximum offset")
+ }
+ if !frame.FinBit && frame.DataLen() == 0 {
+ return nil, qerr.EmptyStreamFrameNoFin
+ }
+ return frame, nil
+}
+
+// Write writes a STREAM frame
+func (f *StreamFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error {
+ if !version.UsesIETFFrameFormat() {
+ return f.writeLegacy(b, version)
+ }
+
+ if len(f.Data) == 0 && !f.FinBit {
+ return errors.New("StreamFrame: attempting to write empty frame without FIN")
+ }
+
+ typeByte := byte(0x10)
+ if f.FinBit {
+ typeByte ^= 0x1
+ }
+ hasOffset := f.Offset != 0
+ if f.DataLenPresent {
+ typeByte ^= 0x2
+ }
+ if hasOffset {
+ typeByte ^= 0x4
+ }
+ b.WriteByte(typeByte)
+ utils.WriteVarInt(b, uint64(f.StreamID))
+ if hasOffset {
+ utils.WriteVarInt(b, uint64(f.Offset))
+ }
+ if f.DataLenPresent {
+ utils.WriteVarInt(b, uint64(f.DataLen()))
+ }
+ b.Write(f.Data)
+ return nil
+}
+
+// MinLength returns the length of the header of a StreamFrame
+// the total length of the frame is frame.MinLength() + frame.DataLen()
+func (f *StreamFrame) MinLength(version protocol.VersionNumber) (protocol.ByteCount, error) {
+ if !version.UsesIETFFrameFormat() {
+ return f.minLengthLegacy(version)
+ }
+ length := 1 + utils.VarIntLen(uint64(f.StreamID))
+ if f.Offset != 0 {
+ length += utils.VarIntLen(uint64(f.Offset))
+ }
+ if f.DataLenPresent {
+ length += utils.VarIntLen(uint64(f.DataLen()))
+ }
+ return length, nil
+}
diff --git a/vendor/github.com/lucas-clemente/quic-go/frames/stream_frame.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/stream_frame_legacy.go
similarity index 57%
rename from vendor/github.com/lucas-clemente/quic-go/frames/stream_frame.go
rename to vendor/github.com/lucas-clemente/quic-go/internal/wire/stream_frame_legacy.go
index 680b180..e3687cb 100644
--- a/vendor/github.com/lucas-clemente/quic-go/frames/stream_frame.go
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/stream_frame_legacy.go
@@ -1,30 +1,22 @@
-package frames
+package wire
import (
"bytes"
"errors"
+ "io"
- "github.com/lucas-clemente/quic-go/protocol"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
"github.com/lucas-clemente/quic-go/qerr"
- "github.com/lucas-clemente/quic-go/utils"
)
-// A StreamFrame of QUIC
-type StreamFrame struct {
- StreamID protocol.StreamID
- FinBit bool
- DataLenPresent bool
- Offset protocol.ByteCount
- Data []byte
-}
-
var (
errInvalidStreamIDLen = errors.New("StreamFrame: Invalid StreamID length")
errInvalidOffsetLen = errors.New("StreamFrame: Invalid offset length")
)
-// ParseStreamFrame reads a stream frame. The type byte must not have been read yet.
-func ParseStreamFrame(r *bytes.Reader) (*StreamFrame, error) {
+// parseLegacyStreamFrame reads a stream frame. The type byte must not have been read yet.
+func parseLegacyStreamFrame(r *bytes.Reader, _ protocol.VersionNumber) (*StreamFrame, error) {
frame := &StreamFrame{}
typeByte, err := r.ReadByte()
@@ -34,19 +26,19 @@ func ParseStreamFrame(r *bytes.Reader) (*StreamFrame, error) {
frame.FinBit = typeByte&0x40 > 0
frame.DataLenPresent = typeByte&0x20 > 0
- offsetLen := typeByte & 0x1C >> 2
+ offsetLen := typeByte & 0x1c >> 2
if offsetLen != 0 {
offsetLen++
}
- streamIDLen := typeByte&0x03 + 1
+ streamIDLen := typeByte&0x3 + 1
- sid, err := utils.ReadUintN(r, streamIDLen)
+ sid, err := utils.BigEndian.ReadUintN(r, streamIDLen)
if err != nil {
return nil, err
}
frame.StreamID = protocol.StreamID(sid)
- offset, err := utils.ReadUintN(r, offsetLen)
+ offset, err := utils.BigEndian.ReadUintN(r, offsetLen)
if err != nil {
return nil, err
}
@@ -54,60 +46,57 @@ func ParseStreamFrame(r *bytes.Reader) (*StreamFrame, error) {
var dataLen uint16
if frame.DataLenPresent {
- dataLen, err = utils.ReadUint16(r)
+ dataLen, err = utils.BigEndian.ReadUint16(r)
if err != nil {
return nil, err
}
}
- if dataLen > uint16(protocol.MaxPacketSize) {
- return nil, qerr.Error(qerr.InvalidStreamData, "data len too large")
+ // shortcut to prevent the unneccessary allocation of dataLen bytes
+ // if the dataLen is larger than the remaining length of the packet
+ // reading the packet contents would result in EOF when attempting to READ
+ if int(dataLen) > r.Len() {
+ return nil, io.EOF
}
- if dataLen == 0 {
+ if !frame.DataLenPresent {
// The rest of the packet is data
dataLen = uint16(r.Len())
}
if dataLen != 0 {
frame.Data = make([]byte, dataLen)
- n, err := r.Read(frame.Data)
- if n != int(dataLen) {
- return nil, errors.New("BUG: StreamFrame could not read dataLen bytes")
- }
- if err != nil {
+ if _, err := io.ReadFull(r, frame.Data); err != nil {
+ // this should never happen, since we already checked the dataLen earlier
return nil, err
}
}
- if frame.Offset+frame.DataLen() < frame.Offset {
+ // MaxByteCount is the highest value that can be encoded with the IETF QUIC variable integer encoding (2^62-1).
+ // Note that this value is smaller than the maximum value that could be encoded in the gQUIC STREAM frame (2^64-1).
+ if frame.Offset+frame.DataLen() > protocol.MaxByteCount {
return nil, qerr.Error(qerr.InvalidStreamData, "data overflows maximum offset")
}
-
if !frame.FinBit && frame.DataLen() == 0 {
return nil, qerr.EmptyStreamFrameNoFin
}
-
return frame, nil
}
-// WriteStreamFrame writes a stream frame.
-func (f *StreamFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error {
+// writeLegacy writes a stream frame.
+func (f *StreamFrame) writeLegacy(b *bytes.Buffer, _ protocol.VersionNumber) error {
if len(f.Data) == 0 && !f.FinBit {
return errors.New("StreamFrame: attempting to write empty frame without FIN")
}
typeByte := uint8(0x80) // sets the leftmost bit to 1
-
if f.FinBit {
typeByte ^= 0x40
}
-
if f.DataLenPresent {
typeByte ^= 0x20
}
offsetLength := f.getOffsetLength()
-
if offsetLength > 0 {
typeByte ^= (uint8(offsetLength) - 1) << 2
}
@@ -121,11 +110,11 @@ func (f *StreamFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) err
case 1:
b.WriteByte(uint8(f.StreamID))
case 2:
- utils.WriteUint16(b, uint16(f.StreamID))
+ utils.BigEndian.WriteUint16(b, uint16(f.StreamID))
case 3:
- utils.WriteUint24(b, uint32(f.StreamID))
+ utils.BigEndian.WriteUint24(b, uint32(f.StreamID))
case 4:
- utils.WriteUint32(b, uint32(f.StreamID))
+ utils.BigEndian.WriteUint32(b, uint32(f.StreamID))
default:
return errInvalidStreamIDLen
}
@@ -133,29 +122,28 @@ func (f *StreamFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) err
switch offsetLength {
case 0:
case 2:
- utils.WriteUint16(b, uint16(f.Offset))
+ utils.BigEndian.WriteUint16(b, uint16(f.Offset))
case 3:
- utils.WriteUint24(b, uint32(f.Offset))
+ utils.BigEndian.WriteUint24(b, uint32(f.Offset))
case 4:
- utils.WriteUint32(b, uint32(f.Offset))
+ utils.BigEndian.WriteUint32(b, uint32(f.Offset))
case 5:
- utils.WriteUint40(b, uint64(f.Offset))
+ utils.BigEndian.WriteUint40(b, uint64(f.Offset))
case 6:
- utils.WriteUint48(b, uint64(f.Offset))
+ utils.BigEndian.WriteUint48(b, uint64(f.Offset))
case 7:
- utils.WriteUint56(b, uint64(f.Offset))
+ utils.BigEndian.WriteUint56(b, uint64(f.Offset))
case 8:
- utils.WriteUint64(b, uint64(f.Offset))
+ utils.BigEndian.WriteUint64(b, uint64(f.Offset))
default:
return errInvalidOffsetLen
}
if f.DataLenPresent {
- utils.WriteUint16(b, uint16(len(f.Data)))
+ utils.BigEndian.WriteUint16(b, uint16(len(f.Data)))
}
b.Write(f.Data)
-
return nil
}
@@ -195,14 +183,11 @@ func (f *StreamFrame) getOffsetLength() protocol.ByteCount {
return 8
}
-// MinLength returns the length of the header of a StreamFrame
-// the total length of the StreamFrame is frame.MinLength() + frame.DataLen()
-func (f *StreamFrame) MinLength(protocol.VersionNumber) (protocol.ByteCount, error) {
+func (f *StreamFrame) minLengthLegacy(_ protocol.VersionNumber) (protocol.ByteCount, error) {
length := protocol.ByteCount(1) + protocol.ByteCount(f.calculateStreamIDLength()) + f.getOffsetLength()
if f.DataLenPresent {
length += 2
}
-
return length, nil
}
diff --git a/vendor/github.com/lucas-clemente/quic-go/frames/stream_frame_test.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/stream_frame_legacy_test.go
similarity index 62%
rename from vendor/github.com/lucas-clemente/quic-go/frames/stream_frame_test.go
rename to vendor/github.com/lucas-clemente/quic-go/internal/wire/stream_frame_legacy_test.go
index 6177dde..b7b8d25 100644
--- a/vendor/github.com/lucas-clemente/quic-go/frames/stream_frame_test.go
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/stream_frame_legacy_test.go
@@ -1,68 +1,123 @@
-package frames
+package wire
import (
"bytes"
+ "io"
- "github.com/lucas-clemente/quic-go/protocol"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
"github.com/lucas-clemente/quic-go/qerr"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
-var _ = Describe("StreamFrame", func() {
+var _ = Describe("STREAM frame (for gQUIC)", func() {
Context("when parsing", func() {
- It("accepts sample frame", func() {
- b := bytes.NewReader([]byte{0xa0, 0x1, 0x06, 0x00, 'f', 'o', 'o', 'b', 'a', 'r'})
- frame, err := ParseStreamFrame(b)
+ It("accepts a sample frame", func() {
+ // a STREAM frame, plus 3 additional bytes, not belonging to this frame
+ b := bytes.NewReader([]byte{0x80 ^ 0x20,
+ 0x1, // stream id
+ 0x0, 0x6, // data length
+ 'f', 'o', 'o', 'b', 'a', 'r',
+ 'f', 'o', 'o', // additional bytes
+ })
+ frame, err := ParseStreamFrame(b, versionBigEndian)
Expect(err).ToNot(HaveOccurred())
Expect(frame.FinBit).To(BeFalse())
Expect(frame.StreamID).To(Equal(protocol.StreamID(1)))
Expect(frame.Offset).To(BeZero())
Expect(frame.DataLenPresent).To(BeTrue())
Expect(frame.Data).To(Equal([]byte("foobar")))
+ Expect(b.Len()).To(Equal(3))
+ })
+
+ It("accepts frames with offsets", func() {
+ b := bytes.NewReader([]byte{0x80 ^ 0x20 /* 2 byte offset */ ^ 0x4,
+ 0x1, // stream id
+ 0x0, 0x42, // offset
+ 0x0, 0x6, // data length
+ 'f', 'o', 'o', 'b', 'a', 'r',
+ })
+ frame, err := ParseStreamFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.FinBit).To(BeFalse())
+ Expect(frame.StreamID).To(Equal(protocol.StreamID(1)))
+ Expect(frame.Offset).To(Equal(protocol.ByteCount(0x42)))
+ Expect(frame.DataLenPresent).To(BeTrue())
+ Expect(frame.Data).To(Equal([]byte("foobar")))
+ Expect(b.Len()).To(BeZero())
+ })
+
+ It("errors on EOFs", func() {
+ data := []byte{0x80 ^ 0x20 ^ 0x4,
+ 0x1, // stream id
+ 0x0, 0x2a, // offset
+ 0x0, 0x6, // data length,
+ 'f', 'o', 'o', 'b', 'a', 'r',
+ }
+ _, err := ParseStreamFrame(bytes.NewReader(data), versionBigEndian)
+ Expect(err).NotTo(HaveOccurred())
+ for i := range data {
+ _, err := ParseStreamFrame(bytes.NewReader(data[0:i]), versionBigEndian)
+ Expect(err).To(HaveOccurred())
+ }
})
It("accepts frame without data length", func() {
- b := bytes.NewReader([]byte{0x80, 0x1, 'f', 'o', 'o', 'b', 'a', 'r'})
- frame, err := ParseStreamFrame(b)
+ b := bytes.NewReader([]byte{0x80,
+ 0x1, // stream id
+ 'f', 'o', 'o', 'b', 'a', 'r',
+ })
+ frame, err := ParseStreamFrame(b, versionBigEndian)
Expect(err).ToNot(HaveOccurred())
Expect(frame.FinBit).To(BeFalse())
Expect(frame.StreamID).To(Equal(protocol.StreamID(1)))
Expect(frame.Offset).To(BeZero())
Expect(frame.DataLenPresent).To(BeFalse())
Expect(frame.Data).To(Equal([]byte("foobar")))
+ Expect(b.Len()).To(BeZero())
})
- It("accepts empty frame with finbit set", func() {
- b := bytes.NewReader([]byte{0x80 ^ 0x40 ^ 0x20, 0x1, 0, 0})
- frame, err := ParseStreamFrame(b)
+ It("accepts an empty frame with FinBit set, with data length set", func() {
+ // the STREAM frame, plus 3 additional bytes, not belonging to this frame
+ b := bytes.NewReader([]byte{0x80 ^ 0x40 ^ 0x20,
+ 0x1, // stream id
+ 0, 0, // data length
+ 'f', 'o', 'o', // additional bytes
+ })
+ frame, err := ParseStreamFrame(b, versionBigEndian)
Expect(err).ToNot(HaveOccurred())
Expect(frame.FinBit).To(BeTrue())
Expect(frame.DataLenPresent).To(BeTrue())
- Expect(frame.Data).To(HaveLen(0))
+ Expect(frame.Data).To(BeEmpty())
+ Expect(b.Len()).To(Equal(3))
})
- It("accepts frames with offsets", func() {
- b := bytes.NewReader([]byte{0xa4, 0x1, 0x2a, 0x00, 0x06, 0x00, 'f', 'o', 'o', 'b', 'a', 'r'})
- frame, err := ParseStreamFrame(b)
+ It("accepts an empty frame with the FinBit set", func() {
+ b := bytes.NewReader([]byte{0x80 ^ 0x40,
+ 0x1, // stream id
+ 'f', 'o', 'o', 'b', 'a', 'r',
+ })
+ frame, err := ParseStreamFrame(b, versionBigEndian)
Expect(err).ToNot(HaveOccurred())
- Expect(frame.FinBit).To(BeFalse())
- Expect(frame.StreamID).To(Equal(protocol.StreamID(1)))
- Expect(frame.Offset).To(Equal(protocol.ByteCount(42)))
- Expect(frame.DataLenPresent).To(BeTrue())
+ Expect(frame.FinBit).To(BeTrue())
+ Expect(frame.DataLenPresent).To(BeFalse())
Expect(frame.Data).To(Equal([]byte("foobar")))
+ Expect(b.Len()).To(BeZero())
})
It("errors on empty stream frames that don't have the FinBit set", func() {
- b := bytes.NewReader([]byte{0x80 ^ 0x20, 0x1, 0, 0})
- _, err := ParseStreamFrame(b)
+ b := bytes.NewReader([]byte{0x80 ^ 0x20,
+ 0x1, // stream id
+ 0, 0, // data length
+ })
+ _, err := ParseStreamFrame(b, versionBigEndian)
Expect(err).To(MatchError(qerr.EmptyStreamFrameNoFin))
})
It("rejects frames to too large dataLen", func() {
- b := bytes.NewReader([]byte{0xa0, 0x1, 0xff, 0xf})
- _, err := ParseStreamFrame(b)
- Expect(err).To(MatchError(qerr.Error(qerr.InvalidStreamData, "data len too large")))
+ b := bytes.NewReader([]byte{0xa0, 0x1, 0xff, 0xff})
+ _, err := ParseStreamFrame(b, versionBigEndian)
+ Expect(err).To(MatchError(io.EOF))
})
It("rejects frames that overflow the offset", func() {
@@ -73,32 +128,29 @@ var _ = Describe("StreamFrame", func() {
Data: []byte{'f'},
}
b := &bytes.Buffer{}
- f.Write(b, protocol.VersionWhatever)
- _, err := ParseStreamFrame(bytes.NewReader(b.Bytes()))
+ err := f.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ _, err = ParseStreamFrame(bytes.NewReader(b.Bytes()), versionBigEndian)
Expect(err).To(MatchError(qerr.Error(qerr.InvalidStreamData, "data overflows maximum offset")))
})
-
- It("errors on EOFs", func() {
- data := []byte{0xa4, 0x1, 0x2a, 0x00, 0x06, 0x00, 'f', 'o', 'o', 'b', 'a', 'r'}
- _, err := ParseStreamFrame(bytes.NewReader(data))
- Expect(err).NotTo(HaveOccurred())
- for i := range data {
- _, err := ParseStreamFrame(bytes.NewReader(data[0:i]))
- Expect(err).To(HaveOccurred())
- }
- })
})
Context("when writing", func() {
- It("writes sample frame", func() {
- b := &bytes.Buffer{}
- err := (&StreamFrame{
- StreamID: 1,
- Data: []byte("foobar"),
- DataLenPresent: true,
- }).Write(b, 0)
- Expect(err).ToNot(HaveOccurred())
- Expect(b.Bytes()).To(Equal([]byte{0xa0, 0x1, 0x06, 0x00, 'f', 'o', 'o', 'b', 'a', 'r'}))
+ Context("in big endian", func() {
+ It("writes sample frame", func() {
+ b := &bytes.Buffer{}
+ err := (&StreamFrame{
+ StreamID: 1,
+ Data: []byte("foobar"),
+ DataLenPresent: true,
+ }).Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()).To(Equal([]byte{0x80 ^ 0x20,
+ 0x1, // stream id
+ 0x0, 0x6, // data length
+ 'f', 'o', 'o', 'b', 'a', 'r',
+ }))
+ })
})
It("sets the FinBit", func() {
@@ -107,7 +159,7 @@ var _ = Describe("StreamFrame", func() {
StreamID: 1,
Data: []byte("foobar"),
FinBit: true,
- }).Write(b, 0)
+ }).Write(b, versionBigEndian)
Expect(err).ToNot(HaveOccurred())
Expect(b.Bytes()[0] & 0x40).To(Equal(byte(0x40)))
})
@@ -116,7 +168,7 @@ var _ = Describe("StreamFrame", func() {
b := &bytes.Buffer{}
err := (&StreamFrame{
StreamID: 1,
- }).Write(b, 0)
+ }).Write(b, versionBigEndian)
Expect(err).To(MatchError("StreamFrame: attempting to write empty frame without FIN"))
})
@@ -128,7 +180,7 @@ var _ = Describe("StreamFrame", func() {
Offset: 0,
FinBit: true,
}
- err := f.Write(b, 0)
+ err := f.Write(b, versionBigEndian)
Expect(err).ToNot(HaveOccurred())
Expect(f.MinLength(0)).To(Equal(protocol.ByteCount(b.Len())))
})
@@ -136,14 +188,14 @@ var _ = Describe("StreamFrame", func() {
It("has proper min length for a long StreamID and a big offset", func() {
b := &bytes.Buffer{}
f := &StreamFrame{
- StreamID: 0xDECAFBAD,
+ StreamID: 0xdecafbad,
Data: []byte{},
- Offset: 0xDEADBEEFCAFE,
+ Offset: 0xdeadbeefcafe,
FinBit: true,
}
- err := f.Write(b, 0)
+ err := f.Write(b, versionBigEndian)
Expect(err).ToNot(HaveOccurred())
- Expect(f.MinLength(0)).To(Equal(protocol.ByteCount(b.Len())))
+ Expect(f.MinLength(versionBigEndian)).To(Equal(protocol.ByteCount(b.Len())))
})
Context("data length field", func() {
@@ -156,43 +208,43 @@ var _ = Describe("StreamFrame", func() {
DataLenPresent: true,
Offset: 0,
}
- err := f.Write(b, 0)
+ err := f.Write(b, versionBigEndian)
Expect(err).ToNot(HaveOccurred())
minLength, _ := f.MinLength(0)
Expect(b.Bytes()[0] & 0x20).To(Equal(uint8(0x20)))
- Expect(b.Bytes()[minLength-2 : minLength]).To(Equal([]byte{0x37, 0x13}))
+ Expect(b.Bytes()[minLength-2 : minLength]).To(Equal([]byte{0x13, 0x37}))
})
+ })
- It("omits the data length field", func() {
- dataLen := 0x1337
- b := &bytes.Buffer{}
- f := &StreamFrame{
- StreamID: 1,
- Data: bytes.Repeat([]byte{'f'}, dataLen),
- DataLenPresent: false,
- Offset: 0,
- }
- err := f.Write(b, 0)
- Expect(err).ToNot(HaveOccurred())
- Expect(b.Bytes()[0] & 0x20).To(Equal(uint8(0)))
- Expect(b.Bytes()[1 : b.Len()-dataLen]).ToNot(ContainSubstring(string([]byte{0x37, 0x13})))
- minLength, _ := f.MinLength(0)
- f.DataLenPresent = true
- minLengthWithoutDataLen, _ := f.MinLength(0)
- Expect(minLength).To(Equal(minLengthWithoutDataLen - 2))
- })
+ It("omits the data length field", func() {
+ dataLen := 0x1337
+ b := &bytes.Buffer{}
+ f := &StreamFrame{
+ StreamID: 1,
+ Data: bytes.Repeat([]byte{'f'}, dataLen),
+ DataLenPresent: false,
+ Offset: 0,
+ }
+ err := f.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()[0] & 0x20).To(Equal(uint8(0)))
+ Expect(b.Bytes()[1 : b.Len()-dataLen]).ToNot(ContainSubstring(string([]byte{0x37, 0x13})))
+ minLength, _ := f.MinLength(versionBigEndian)
+ f.DataLenPresent = true
+ minLengthWithoutDataLen, _ := f.MinLength(versionBigEndian)
+ Expect(minLength).To(Equal(minLengthWithoutDataLen - 2))
+ })
- It("calculates the correcct min-length", func() {
- f := &StreamFrame{
- StreamID: 0xCAFE,
- Data: []byte("foobar"),
- DataLenPresent: false,
- Offset: 0xDEADBEEF,
- }
- minLengthWithoutDataLen, _ := f.MinLength(0)
- f.DataLenPresent = true
- Expect(f.MinLength(0)).To(Equal(minLengthWithoutDataLen + 2))
- })
+ It("calculates the correct min-length", func() {
+ f := &StreamFrame{
+ StreamID: 0xcafe,
+ Data: []byte("foobar"),
+ DataLenPresent: false,
+ Offset: 0xdeadbeef,
+ }
+ minLengthWithoutDataLen, _ := f.MinLength(versionBigEndian)
+ f.DataLenPresent = true
+ Expect(f.MinLength(versionBigEndian)).To(Equal(minLengthWithoutDataLen + 2))
})
Context("offset lengths", func() {
@@ -202,7 +254,7 @@ var _ = Describe("StreamFrame", func() {
StreamID: 1,
Data: []byte("foobar"),
Offset: 0,
- }).Write(b, 0)
+ }).Write(b, versionBigEndian)
Expect(err).ToNot(HaveOccurred())
Expect(b.Bytes()[0] & 0x1c).To(Equal(uint8(0x0)))
})
@@ -213,10 +265,10 @@ var _ = Describe("StreamFrame", func() {
StreamID: 1,
Data: []byte("foobar"),
Offset: 0x1337,
- }).Write(b, 0)
+ }).Write(b, versionBigEndian)
Expect(err).ToNot(HaveOccurred())
Expect(b.Bytes()[0] & 0x1c).To(Equal(uint8(0x1 << 2)))
- Expect(b.Bytes()[2:4]).To(Equal([]byte{0x37, 0x13}))
+ Expect(b.Bytes()[2:4]).To(Equal([]byte{0x13, 0x37}))
})
It("writes a 3-byte offset if the offset", func() {
@@ -224,10 +276,10 @@ var _ = Describe("StreamFrame", func() {
(&StreamFrame{
StreamID: 1,
Data: []byte("foobar"),
- Offset: 0x13CAFE,
- }).Write(b, 0)
+ Offset: 0x13cafe,
+ }).Write(b, versionBigEndian)
Expect(b.Bytes()[0] & 0x1c).To(Equal(uint8(0x2 << 2)))
- Expect(b.Bytes()[2:5]).To(Equal([]byte{0xFE, 0xCA, 0x13}))
+ Expect(b.Bytes()[2:5]).To(Equal([]byte{0x13, 0xca, 0xfe}))
})
It("writes a 4-byte offset if the offset", func() {
@@ -235,11 +287,11 @@ var _ = Describe("StreamFrame", func() {
err := (&StreamFrame{
StreamID: 1,
Data: []byte("foobar"),
- Offset: 0xDEADBEEF,
- }).Write(b, 0)
+ Offset: 0xdeadbeef,
+ }).Write(b, versionBigEndian)
Expect(err).ToNot(HaveOccurred())
Expect(b.Bytes()[0] & 0x1c).To(Equal(uint8(0x3 << 2)))
- Expect(b.Bytes()[2:6]).To(Equal([]byte{0xEF, 0xBE, 0xAD, 0xDE}))
+ Expect(b.Bytes()[2:6]).To(Equal([]byte{0xde, 0xad, 0xbe, 0xef}))
})
It("writes a 5-byte offset if the offset", func() {
@@ -247,11 +299,11 @@ var _ = Describe("StreamFrame", func() {
err := (&StreamFrame{
StreamID: 1,
Data: []byte("foobar"),
- Offset: 0x13DEADBEEF,
- }).Write(b, 0)
+ Offset: 0x13deadbeef,
+ }).Write(b, versionBigEndian)
Expect(err).ToNot(HaveOccurred())
Expect(b.Bytes()[0] & 0x1c).To(Equal(uint8(0x4 << 2)))
- Expect(b.Bytes()[2:7]).To(Equal([]byte{0xEF, 0xBE, 0xAD, 0xDE, 0x13}))
+ Expect(b.Bytes()[2:7]).To(Equal([]byte{0x13, 0xde, 0xad, 0xbe, 0xef}))
})
It("writes a 6-byte offset if the offset", func() {
@@ -259,11 +311,11 @@ var _ = Describe("StreamFrame", func() {
err := (&StreamFrame{
StreamID: 1,
Data: []byte("foobar"),
- Offset: 0xDEADBEEFCAFE,
- }).Write(b, 0)
+ Offset: 0xdeadbeefcafe,
+ }).Write(b, versionBigEndian)
Expect(err).ToNot(HaveOccurred())
Expect(b.Bytes()[0] & 0x1c).To(Equal(uint8(0x5 << 2)))
- Expect(b.Bytes()[2:8]).To(Equal([]byte{0xFE, 0xCA, 0xEF, 0xBE, 0xAD, 0xDE}))
+ Expect(b.Bytes()[2:8]).To(Equal([]byte{0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe}))
})
It("writes a 7-byte offset if the offset", func() {
@@ -271,11 +323,11 @@ var _ = Describe("StreamFrame", func() {
err := (&StreamFrame{
StreamID: 1,
Data: []byte("foobar"),
- Offset: 0x13DEADBEEFCAFE,
- }).Write(b, 0)
+ Offset: 0x13deadbeefcafe,
+ }).Write(b, versionBigEndian)
Expect(err).ToNot(HaveOccurred())
Expect(b.Bytes()[0] & 0x1c).To(Equal(uint8(0x6 << 2)))
- Expect(b.Bytes()[2:9]).To(Equal([]byte{0xFE, 0xCA, 0xEF, 0xBE, 0xAD, 0xDE, 0x13}))
+ Expect(b.Bytes()[2:9]).To(Equal([]byte{0x13, 0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe}))
})
It("writes a 8-byte offset if the offset", func() {
@@ -283,11 +335,11 @@ var _ = Describe("StreamFrame", func() {
err := (&StreamFrame{
StreamID: 1,
Data: []byte("foobar"),
- Offset: 0x1337DEADBEEFCAFE,
- }).Write(b, 0)
+ Offset: 0x1337deadbeefcafe,
+ }).Write(b, versionBigEndian)
Expect(err).ToNot(HaveOccurred())
Expect(b.Bytes()[0] & 0x1c).To(Equal(uint8(0x7 << 2)))
- Expect(b.Bytes()[2:10]).To(Equal([]byte{0xFE, 0xCA, 0xEF, 0xBE, 0xAD, 0xDE, 0x37, 0x13}))
+ Expect(b.Bytes()[2:10]).To(Equal([]byte{0x13, 0x37, 0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe}))
})
})
@@ -297,7 +349,7 @@ var _ = Describe("StreamFrame", func() {
err := (&StreamFrame{
StreamID: 13,
Data: []byte("foobar"),
- }).Write(b, 0)
+ }).Write(b, versionBigEndian)
Expect(err).ToNot(HaveOccurred())
Expect(b.Bytes()[0] & 0x3).To(Equal(uint8(0x0)))
Expect(b.Bytes()[1]).To(Equal(uint8(13)))
@@ -306,47 +358,47 @@ var _ = Describe("StreamFrame", func() {
It("writes a 2 byte StreamID", func() {
b := &bytes.Buffer{}
err := (&StreamFrame{
- StreamID: 0xCAFE,
+ StreamID: 0xcafe,
Data: []byte("foobar"),
- }).Write(b, 0)
+ }).Write(b, versionBigEndian)
Expect(err).ToNot(HaveOccurred())
Expect(b.Bytes()[0] & 0x3).To(Equal(uint8(0x1)))
- Expect(b.Bytes()[1:3]).To(Equal([]byte{0xFE, 0xCA}))
+ Expect(b.Bytes()[1:3]).To(Equal([]byte{0xca, 0xfe}))
})
It("writes a 3 byte StreamID", func() {
b := &bytes.Buffer{}
err := (&StreamFrame{
- StreamID: 0x13BEEF,
+ StreamID: 0x13beef,
Data: []byte("foobar"),
- }).Write(b, 0)
+ }).Write(b, versionBigEndian)
Expect(err).ToNot(HaveOccurred())
Expect(b.Bytes()[0] & 0x3).To(Equal(uint8(0x2)))
- Expect(b.Bytes()[1:4]).To(Equal([]byte{0xEF, 0xBE, 0x13}))
+ Expect(b.Bytes()[1:4]).To(Equal([]byte{0x13, 0xbe, 0xef}))
})
It("writes a 4 byte StreamID", func() {
b := &bytes.Buffer{}
err := (&StreamFrame{
- StreamID: 0xDECAFBAD,
+ StreamID: 0xdecafbad,
Data: []byte("foobar"),
- }).Write(b, 0)
+ }).Write(b, versionBigEndian)
Expect(err).ToNot(HaveOccurred())
Expect(b.Bytes()[0] & 0x3).To(Equal(uint8(0x3)))
- Expect(b.Bytes()[1:5]).To(Equal([]byte{0xAD, 0xFB, 0xCA, 0xDE}))
+ Expect(b.Bytes()[1:5]).To(Equal([]byte{0xde, 0xca, 0xfb, 0xad}))
})
It("writes a multiple byte StreamID, after the Stream length was already determined by MinLenght()", func() {
b := &bytes.Buffer{}
frame := &StreamFrame{
- StreamID: 0xDECAFBAD,
+ StreamID: 0xdecafbad,
Data: []byte("foobar"),
}
frame.MinLength(0)
- err := frame.Write(b, 0)
+ err := frame.Write(b, versionBigEndian)
Expect(err).ToNot(HaveOccurred())
Expect(b.Bytes()[0] & 0x3).To(Equal(uint8(0x3)))
- Expect(b.Bytes()[1:5]).To(Equal([]byte{0xAD, 0xFB, 0xCA, 0xDE}))
+ Expect(b.Bytes()[1:5]).To(Equal([]byte{0xde, 0xca, 0xfb, 0xad}))
})
})
})
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/stream_frame_test.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/stream_frame_test.go
new file mode 100644
index 0000000..f116de3
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/stream_frame_test.go
@@ -0,0 +1,211 @@
+package wire
+
+import (
+ "bytes"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+ "github.com/lucas-clemente/quic-go/qerr"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+)
+
+var _ = Describe("STREAM frame (for IETF QUIC)", func() {
+ Context("when parsing", func() {
+ It("parses a frame with OFF bit", func() {
+ data := []byte{0x10 ^ 0x4}
+ data = append(data, encodeVarInt(0x12345)...) // stream ID
+ data = append(data, encodeVarInt(0xdecafbad)...) // offset
+ data = append(data, []byte("foobar")...)
+ r := bytes.NewReader(data)
+ frame, err := ParseStreamFrame(r, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.StreamID).To(Equal(protocol.StreamID(0x12345)))
+ Expect(frame.Data).To(Equal([]byte("foobar")))
+ Expect(frame.FinBit).To(BeFalse())
+ Expect(frame.Offset).To(Equal(protocol.ByteCount(0xdecafbad)))
+ Expect(r.Len()).To(BeZero())
+ })
+
+ It("respects the LEN when parsing the frame", func() {
+ data := []byte{0x10 ^ 0x2}
+ data = append(data, encodeVarInt(0x12345)...) // stream ID
+ data = append(data, encodeVarInt(4)...) // data length
+ data = append(data, []byte("foobar")...)
+ r := bytes.NewReader(data)
+ frame, err := ParseStreamFrame(r, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.StreamID).To(Equal(protocol.StreamID(0x12345)))
+ Expect(frame.Data).To(Equal([]byte("foob")))
+ Expect(frame.FinBit).To(BeFalse())
+ Expect(frame.Offset).To(BeZero())
+ Expect(r.Len()).To(Equal(2))
+ })
+
+ It("parses a frame with FIN bit", func() {
+ data := []byte{0x10 ^ 0x1}
+ data = append(data, encodeVarInt(9)...) // stream ID
+ data = append(data, []byte("foobar")...)
+ r := bytes.NewReader(data)
+ frame, err := ParseStreamFrame(r, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame.StreamID).To(Equal(protocol.StreamID(9)))
+ Expect(frame.Data).To(Equal([]byte("foobar")))
+ Expect(frame.FinBit).To(BeTrue())
+ Expect(frame.Offset).To(BeZero())
+ Expect(r.Len()).To(BeZero())
+ })
+
+ It("rejects empty frames than don't have the FIN bit set", func() {
+ data := []byte{0x10}
+ data = append(data, encodeVarInt(0x1337)...) // stream ID
+ r := bytes.NewReader(data)
+ _, err := ParseStreamFrame(r, versionIETFFrames)
+ Expect(err).To(MatchError(qerr.EmptyStreamFrameNoFin))
+ })
+
+ It("rejects frames that overflow the maximum offset", func() {
+ data := []byte{0x10 ^ 0x4}
+ data = append(data, encodeVarInt(0x12345)...) // stream ID
+ data = append(data, encodeVarInt(uint64(protocol.MaxByteCount-5))...) // offset
+ data = append(data, []byte("foobar")...)
+ r := bytes.NewReader(data)
+ _, err := ParseStreamFrame(r, versionIETFFrames)
+ Expect(err).To(MatchError(qerr.Error(qerr.InvalidStreamData, "data overflows maximum offset")))
+ })
+
+ It("errors on EOFs", func() {
+ data := []byte{0x10 ^ 0x4 ^ 0x2}
+ data = append(data, encodeVarInt(0x12345)...) // stream ID
+ data = append(data, encodeVarInt(0xdecafbad)...) // offset
+ data = append(data, encodeVarInt(6)...) // data length
+ data = append(data, []byte("foobar")...)
+ _, err := ParseStreamFrame(bytes.NewReader(data), versionIETFFrames)
+ Expect(err).NotTo(HaveOccurred())
+ for i := range data {
+ _, err := ParseStreamFrame(bytes.NewReader(data[0:i]), versionIETFFrames)
+ Expect(err).To(HaveOccurred())
+ }
+ })
+ })
+
+ Context("when writing", func() {
+ It("writes a frame without offset", func() {
+ f := &StreamFrame{
+ StreamID: 0x1337,
+ Data: []byte("foobar"),
+ }
+ b := &bytes.Buffer{}
+ err := f.Write(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ expected := []byte{0x10}
+ expected = append(expected, encodeVarInt(0x1337)...) // stream ID
+ expected = append(expected, []byte("foobar")...)
+ Expect(b.Bytes()).To(Equal(expected))
+ })
+
+ It("writes a frame with offset", func() {
+ f := &StreamFrame{
+ StreamID: 0x1337,
+ Offset: 0x123456,
+ Data: []byte("foobar"),
+ }
+ b := &bytes.Buffer{}
+ err := f.Write(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ expected := []byte{0x10 ^ 0x4}
+ expected = append(expected, encodeVarInt(0x1337)...) // stream ID
+ expected = append(expected, encodeVarInt(0x123456)...) // offset
+ expected = append(expected, []byte("foobar")...)
+ Expect(b.Bytes()).To(Equal(expected))
+ })
+
+ It("writes a frame with FIN bit", func() {
+ f := &StreamFrame{
+ StreamID: 0x1337,
+ Offset: 0x123456,
+ FinBit: true,
+ }
+ b := &bytes.Buffer{}
+ err := f.Write(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ expected := []byte{0x10 ^ 0x4 ^ 0x1}
+ expected = append(expected, encodeVarInt(0x1337)...) // stream ID
+ expected = append(expected, encodeVarInt(0x123456)...) // offset
+ Expect(b.Bytes()).To(Equal(expected))
+ })
+
+ It("writes a frame with data length", func() {
+ f := &StreamFrame{
+ StreamID: 0x1337,
+ Data: []byte("foobar"),
+ DataLenPresent: true,
+ }
+ b := &bytes.Buffer{}
+ err := f.Write(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ expected := []byte{0x10 ^ 0x2}
+ expected = append(expected, encodeVarInt(0x1337)...) // stream ID
+ expected = append(expected, encodeVarInt(6)...) // data length
+ expected = append(expected, []byte("foobar")...)
+ Expect(b.Bytes()).To(Equal(expected))
+ })
+
+ It("writes a frame with data length and offset", func() {
+ f := &StreamFrame{
+ StreamID: 0x1337,
+ Data: []byte("foobar"),
+ DataLenPresent: true,
+ Offset: 0x123456,
+ }
+ b := &bytes.Buffer{}
+ err := f.Write(b, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ expected := []byte{0x10 ^ 0x4 ^ 0x2}
+ expected = append(expected, encodeVarInt(0x1337)...) // stream ID
+ expected = append(expected, encodeVarInt(0x123456)...) // offset
+ expected = append(expected, encodeVarInt(6)...) // data length
+ expected = append(expected, []byte("foobar")...)
+ Expect(b.Bytes()).To(Equal(expected))
+ })
+
+ It("refuses to write an empty frame without FIN", func() {
+ f := &StreamFrame{
+ StreamID: 0x42,
+ Offset: 0x1337,
+ }
+ b := &bytes.Buffer{}
+ err := f.Write(b, versionIETFFrames)
+ Expect(err).To(MatchError("StreamFrame: attempting to write empty frame without FIN"))
+ })
+ })
+
+ Context("length", func() {
+ It("has the right length for a frame without offset and data length", func() {
+ f := &StreamFrame{
+ StreamID: 0x1337,
+ Data: []byte("foobar"),
+ }
+ Expect(f.MinLength(versionIETFFrames)).To(Equal(1 + utils.VarIntLen(0x1337)))
+ })
+
+ It("has the right length for a frame with offset", func() {
+ f := &StreamFrame{
+ StreamID: 0x1337,
+ Offset: 0x42,
+ Data: []byte("foobar"),
+ }
+ Expect(f.MinLength(versionIETFFrames)).To(Equal(1 + utils.VarIntLen(0x1337) + utils.VarIntLen(0x42)))
+ })
+
+ It("has the right length for a frame with data length", func() {
+ f := &StreamFrame{
+ StreamID: 0x1337,
+ Offset: 0x1234567,
+ DataLenPresent: true,
+ Data: []byte("foobar"),
+ }
+ Expect(f.MinLength(versionIETFFrames)).To(Equal(1 + utils.VarIntLen(0x1337) + utils.VarIntLen(0x1234567) + utils.VarIntLen(6)))
+ })
+ })
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/version_negotiation.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/version_negotiation.go
new file mode 100644
index 0000000..b20c43c
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/version_negotiation.go
@@ -0,0 +1,59 @@
+package wire
+
+import (
+ "bytes"
+ "crypto/rand"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+)
+
+// ComposeGQUICVersionNegotiation composes a Version Negotiation Packet for gQUIC
+func ComposeGQUICVersionNegotiation(connID protocol.ConnectionID, versions []protocol.VersionNumber) []byte {
+ fullReply := &bytes.Buffer{}
+ ph := Header{
+ ConnectionID: connID,
+ PacketNumber: 1,
+ VersionFlag: true,
+ IsVersionNegotiation: true,
+ }
+ if err := ph.writePublicHeader(fullReply, protocol.PerspectiveServer, protocol.VersionWhatever); err != nil {
+ utils.Errorf("error composing version negotiation packet: %s", err.Error())
+ return nil
+ }
+ writeVersions(fullReply, versions)
+ return fullReply.Bytes()
+}
+
+// ComposeVersionNegotiation composes a Version Negotiation according to the IETF draft
+func ComposeVersionNegotiation(
+ connID protocol.ConnectionID,
+ pn protocol.PacketNumber,
+ versions []protocol.VersionNumber,
+) []byte {
+ fullReply := &bytes.Buffer{}
+ r := make([]byte, 1)
+ _, _ = rand.Read(r) // ignore the error here. It is not critical to have perfect random here.
+ h := Header{
+ IsLongHeader: true,
+ Type: protocol.PacketType(r[0] | 0x80),
+ ConnectionID: connID,
+ PacketNumber: pn,
+ Version: 0,
+ IsVersionNegotiation: true,
+ }
+ if err := h.writeHeader(fullReply); err != nil {
+ utils.Errorf("error composing version negotiation packet: %s", err.Error())
+ return nil
+ }
+ writeVersions(fullReply, versions)
+ return fullReply.Bytes()
+}
+
+// writeVersions writes the versions for a Version Negotiation Packet.
+// It inserts one reserved version number at a random position.
+func writeVersions(buf *bytes.Buffer, supported []protocol.VersionNumber) {
+ for _, v := range protocol.GetGreasedVersions(supported) {
+ utils.BigEndian.WriteUint32(buf, uint32(v))
+ }
+}
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/version_negotiation_test.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/version_negotiation_test.go
new file mode 100644
index 0000000..5bd1a80
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/version_negotiation_test.go
@@ -0,0 +1,41 @@
+package wire
+
+import (
+ "bytes"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+)
+
+var _ = Describe("Version Negotiation Packets", func() {
+ It("writes for gQUIC", func() {
+ versions := []protocol.VersionNumber{1001, 1003}
+ data := ComposeGQUICVersionNegotiation(0x1337, versions)
+ hdr, err := parsePublicHeader(bytes.NewReader(data), protocol.PerspectiveServer)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.VersionFlag).To(BeTrue())
+ Expect(hdr.ConnectionID).To(Equal(protocol.ConnectionID(0x1337)))
+ // the supported versions should include one reserved version number
+ Expect(hdr.SupportedVersions).To(HaveLen(len(versions) + 1))
+ for _, version := range versions {
+ Expect(hdr.SupportedVersions).To(ContainElement(version))
+ }
+ })
+
+ It("writes in IETF draft style", func() {
+ versions := []protocol.VersionNumber{1001, 1003}
+ data := ComposeVersionNegotiation(0x1337, 0x42, versions)
+ hdr, err := parseHeader(bytes.NewReader(data), protocol.PerspectiveServer)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.IsVersionNegotiation).To(BeTrue())
+ Expect(hdr.ConnectionID).To(Equal(protocol.ConnectionID(0x1337)))
+ Expect(hdr.PacketNumber).To(Equal(protocol.PacketNumber(0x42)))
+ Expect(hdr.Version).To(BeZero())
+ // the supported versions should include one reserved version number
+ Expect(hdr.SupportedVersions).To(HaveLen(len(versions) + 1))
+ for _, version := range versions {
+ Expect(hdr.SupportedVersions).To(ContainElement(version))
+ }
+ })
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/window_update_frame.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/window_update_frame.go
new file mode 100644
index 0000000..8f7556e
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/window_update_frame.go
@@ -0,0 +1,45 @@
+package wire
+
+import (
+ "bytes"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+)
+
+type windowUpdateFrame struct {
+ StreamID protocol.StreamID
+ ByteOffset protocol.ByteCount
+}
+
+// ParseWindowUpdateFrame parses a WINDOW_UPDATE frame
+// The frame returned is
+// * a MAX_STREAM_DATA frame, if the WINDOW_UPDATE applies to a stream
+// * a MAX_DATA frame, if the WINDOW_UPDATE applies to the connection
+func ParseWindowUpdateFrame(r *bytes.Reader, _ protocol.VersionNumber) (Frame, error) {
+ if _, err := r.ReadByte(); err != nil { // read the TypeByte
+ return nil, err
+ }
+ streamID, err := utils.BigEndian.ReadUint32(r)
+ if err != nil {
+ return nil, err
+ }
+ offset, err := utils.BigEndian.ReadUint64(r)
+ if err != nil {
+ return nil, err
+ }
+ if streamID == 0 {
+ return &MaxDataFrame{ByteOffset: protocol.ByteCount(offset)}, nil
+ }
+ return &MaxStreamDataFrame{
+ StreamID: protocol.StreamID(streamID),
+ ByteOffset: protocol.ByteCount(offset),
+ }, nil
+}
+
+func (f *windowUpdateFrame) Write(b *bytes.Buffer, _ protocol.VersionNumber) error {
+ b.WriteByte(0x4)
+ utils.BigEndian.WriteUint32(b, uint32(f.StreamID))
+ utils.BigEndian.WriteUint64(b, uint64(f.ByteOffset))
+ return nil
+}
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/window_update_frame_test.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/window_update_frame_test.go
new file mode 100644
index 0000000..c5ec681
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/window_update_frame_test.go
@@ -0,0 +1,98 @@
+package wire
+
+import (
+ "bytes"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+)
+
+var _ = Describe("WINDOW_UPDATE frame", func() {
+ Context("parsing", func() {
+ Context("in big endian", func() {
+ It("parses a stream-level WINDOW_UPDATE", func() {
+ b := bytes.NewReader([]byte{0x4,
+ 0xde, 0xad, 0xbe, 0xef, // stream id
+ 0xde, 0xca, 0xfb, 0xad, 0x11, 0x22, 0x33, 0x44, // byte offset
+ })
+ f, err := ParseWindowUpdateFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(f).To(BeAssignableToTypeOf(&MaxStreamDataFrame{}))
+ frame := f.(*MaxStreamDataFrame)
+ Expect(frame.ByteOffset).To(Equal(protocol.ByteCount(0xdecafbad11223344)))
+ Expect(frame.StreamID).To(Equal(protocol.StreamID(0xdeadbeef)))
+ })
+
+ It("parses a connection-level WINDOW_UPDATE", func() {
+ b := bytes.NewReader([]byte{0x4,
+ 0x0, 0x0, 0x0, 0x0, // stream id
+ 0xde, 0xca, 0xfb, 0xad, 0x11, 0x22, 0x33, 0x44, // byte offset
+ })
+ f, err := ParseWindowUpdateFrame(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(f).To(BeAssignableToTypeOf(&MaxDataFrame{}))
+ frame := f.(*MaxDataFrame)
+ Expect(frame.ByteOffset).To(Equal(protocol.ByteCount(0xdecafbad11223344)))
+ })
+
+ It("errors on EOFs", func() {
+ data := []byte{0x4,
+ 0xef, 0xbe, 0xad, 0xde, // stream id
+ 0x44, 0x33, 0x22, 0x11, 0xad, 0xfb, 0xca, 0xde, // byte offset
+ }
+ _, err := ParseWindowUpdateFrame(bytes.NewReader(data), versionBigEndian)
+ Expect(err).NotTo(HaveOccurred())
+ for i := range data {
+ _, err := ParseWindowUpdateFrame(bytes.NewReader(data[0:i]), versionBigEndian)
+ Expect(err).To(HaveOccurred())
+ }
+ })
+ })
+ })
+
+ Context("writing", func() {
+ It("has the proper min length for the stream-level WINDOW_UPDATE frame", func() {
+ f := &MaxDataFrame{
+ ByteOffset: 0xdeadbeef,
+ }
+ Expect(f.MinLength(versionBigEndian)).To(Equal(protocol.ByteCount(1 + 4 + 8)))
+ })
+
+ It("has the proper min length for the connection-level WINDOW_UPDATE frame", func() {
+ f := &MaxDataFrame{
+ ByteOffset: 0xdeadbeef,
+ }
+ Expect(f.MinLength(versionBigEndian)).To(Equal(protocol.ByteCount(1 + 4 + 8)))
+ })
+
+ Context("in big endian", func() {
+ It("writes a stream-level WINDOW_UPDATE frame", func() {
+ b := &bytes.Buffer{}
+ f := &MaxStreamDataFrame{
+ StreamID: 0xdecafbad,
+ ByteOffset: 0xdeadbeefcafe1337,
+ }
+ err := f.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()).To(Equal([]byte{0x4,
+ 0xde, 0xca, 0xfb, 0xad, // stream ID 0
+ 0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0x13, 0x37, // byte offset
+ }))
+ })
+
+ It("writes a connection-level WINDOW_UPDATE frame", func() {
+ b := &bytes.Buffer{}
+ f := &MaxDataFrame{
+ ByteOffset: 0xdeadbeefcafe1337,
+ }
+ err := f.Write(b, versionBigEndian)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(b.Bytes()).To(Equal([]byte{0x4,
+ 0x0, 0x0, 0x0, 0x0, // stream ID 0
+ 0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0x13, 0x37, // byte offset
+ }))
+ })
+ })
+ })
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/internal/wire/wire_suite_test.go b/vendor/github.com/lucas-clemente/quic-go/internal/wire/wire_suite_test.go
new file mode 100644
index 0000000..9b19b2a
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/internal/wire/wire_suite_test.go
@@ -0,0 +1,35 @@
+package wire
+
+import (
+ "bytes"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+
+ "testing"
+)
+
+func TestWire(t *testing.T) {
+ RegisterFailHandler(Fail)
+ RunSpecs(t, "Wire Suite")
+}
+
+const (
+ // a QUIC version that uses big endian encoding
+ versionBigEndian = protocol.Version39
+ // a QUIC version that uses the IETF frame types
+ versionIETFFrames = protocol.VersionTLS
+)
+
+func encodeVarInt(i uint64) []byte {
+ b := &bytes.Buffer{}
+ utils.WriteVarInt(b, i)
+ return b.Bytes()
+}
+
+var _ = BeforeSuite(func() {
+ Expect(versionBigEndian.UsesIETFFrameFormat()).To(BeFalse())
+ Expect(versionIETFFrames.UsesIETFFrameFormat()).To(BeTrue())
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/mint_utils.go b/vendor/github.com/lucas-clemente/quic-go/mint_utils.go
new file mode 100644
index 0000000..02bb3ae
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/mint_utils.go
@@ -0,0 +1,150 @@
+package quic
+
+import (
+ "bytes"
+ gocrypto "crypto"
+ "crypto/tls"
+ "crypto/x509"
+ "errors"
+ "io"
+
+ "github.com/bifurcation/mint"
+ "github.com/lucas-clemente/quic-go/internal/crypto"
+ "github.com/lucas-clemente/quic-go/internal/handshake"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+ "github.com/lucas-clemente/quic-go/internal/wire"
+)
+
+type mintController struct {
+ csc *handshake.CryptoStreamConn
+ conn *mint.Conn
+}
+
+var _ handshake.MintTLS = &mintController{}
+
+func newMintController(
+ csc *handshake.CryptoStreamConn,
+ mconf *mint.Config,
+ pers protocol.Perspective,
+) handshake.MintTLS {
+ var conn *mint.Conn
+ if pers == protocol.PerspectiveClient {
+ conn = mint.Client(csc, mconf)
+ } else {
+ conn = mint.Server(csc, mconf)
+ }
+ return &mintController{
+ csc: csc,
+ conn: conn,
+ }
+}
+
+func (mc *mintController) GetCipherSuite() mint.CipherSuiteParams {
+ return mc.conn.State().CipherSuite
+}
+
+func (mc *mintController) ComputeExporter(label string, context []byte, keyLength int) ([]byte, error) {
+ return mc.conn.ComputeExporter(label, context, keyLength)
+}
+
+func (mc *mintController) Handshake() mint.Alert {
+ return mc.conn.Handshake()
+}
+
+func (mc *mintController) State() mint.State {
+ return mc.conn.State().HandshakeState
+}
+
+func (mc *mintController) SetCryptoStream(stream io.ReadWriter) {
+ mc.csc.SetStream(stream)
+}
+
+func (mc *mintController) SetExtensionHandler(h mint.AppExtensionHandler) error {
+ return mc.conn.SetExtensionHandler(h)
+}
+
+func tlsToMintConfig(tlsConf *tls.Config, pers protocol.Perspective) (*mint.Config, error) {
+ mconf := &mint.Config{
+ NonBlocking: true,
+ CipherSuites: []mint.CipherSuite{
+ mint.TLS_AES_128_GCM_SHA256,
+ mint.TLS_AES_256_GCM_SHA384,
+ },
+ }
+ if tlsConf != nil {
+ mconf.Certificates = make([]*mint.Certificate, len(tlsConf.Certificates))
+ for i, certChain := range tlsConf.Certificates {
+ mconf.Certificates[i] = &mint.Certificate{
+ Chain: make([]*x509.Certificate, len(certChain.Certificate)),
+ PrivateKey: certChain.PrivateKey.(gocrypto.Signer),
+ }
+ for j, cert := range certChain.Certificate {
+ c, err := x509.ParseCertificate(cert)
+ if err != nil {
+ return nil, err
+ }
+ mconf.Certificates[i].Chain[j] = c
+ }
+ }
+ }
+ if err := mconf.Init(pers == protocol.PerspectiveClient); err != nil {
+ return nil, err
+ }
+ return mconf, nil
+}
+
+// unpackInitialOrRetryPacket unpacks packets Initial and Retry packets
+// These packets must contain a STREAM_FRAME for the crypto stream, starting at offset 0.
+func unpackInitialPacket(aead crypto.AEAD, hdr *wire.Header, data []byte, version protocol.VersionNumber) (*wire.StreamFrame, error) {
+ unpacker := &packetUnpacker{aead: &nullAEAD{aead}, version: version}
+ packet, err := unpacker.Unpack(hdr.Raw, hdr, data)
+ if err != nil {
+ return nil, err
+ }
+ var frame *wire.StreamFrame
+ for _, f := range packet.frames {
+ var ok bool
+ frame, ok = f.(*wire.StreamFrame)
+ if ok {
+ break
+ }
+ }
+ if frame == nil {
+ return nil, errors.New("Packet doesn't contain a STREAM_FRAME")
+ }
+ // We don't need a check for the stream ID here.
+ // The packetUnpacker checks that there's no unencrypted stream data except for the crypto stream.
+ if frame.Offset != 0 {
+ return nil, errors.New("received stream data with non-zero offset")
+ }
+ if utils.Debug() {
+ utils.Debugf("<- Reading packet 0x%x (%d bytes) for connection %x", hdr.PacketNumber, len(data)+len(hdr.Raw), hdr.ConnectionID)
+ hdr.Log()
+ wire.LogFrame(frame, false)
+ }
+ return frame, nil
+}
+
+// packUnencryptedPacket provides a low-overhead way to pack a packet.
+// It is supposed to be used in the early stages of the handshake, before a session (which owns a packetPacker) is available.
+func packUnencryptedPacket(aead crypto.AEAD, hdr *wire.Header, sf *wire.StreamFrame, pers protocol.Perspective) ([]byte, error) {
+ raw := getPacketBuffer()
+ buffer := bytes.NewBuffer(raw)
+ if err := hdr.Write(buffer, pers, hdr.Version); err != nil {
+ return nil, err
+ }
+ payloadStartIndex := buffer.Len()
+ if err := sf.Write(buffer, hdr.Version); err != nil {
+ return nil, err
+ }
+ raw = raw[0:buffer.Len()]
+ _ = aead.Seal(raw[payloadStartIndex:payloadStartIndex], raw[payloadStartIndex:], hdr.PacketNumber, raw[:payloadStartIndex])
+ raw = raw[0 : buffer.Len()+aead.Overhead()]
+ if utils.Debug() {
+ utils.Debugf("-> Sending packet 0x%x (%d bytes) for connection %x, %s", hdr.PacketNumber, len(raw), hdr.ConnectionID, protocol.EncryptionUnencrypted)
+ hdr.Log()
+ wire.LogFrame(sf, true)
+ }
+ return raw, nil
+}
diff --git a/vendor/github.com/lucas-clemente/quic-go/mint_utils_test.go b/vendor/github.com/lucas-clemente/quic-go/mint_utils_test.go
new file mode 100644
index 0000000..e538cad
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/mint_utils_test.go
@@ -0,0 +1,111 @@
+package quic
+
+import (
+ "bytes"
+
+ "github.com/lucas-clemente/quic-go/internal/crypto"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/wire"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+)
+
+var _ = Describe("Packing and unpacking Initial packets", func() {
+ var aead crypto.AEAD
+ connID := protocol.ConnectionID(0x1337)
+ ver := protocol.VersionTLS
+ hdr := &wire.Header{
+ IsLongHeader: true,
+ Type: protocol.PacketTypeRetry,
+ PacketNumber: 0x42,
+ ConnectionID: connID,
+ Version: ver,
+ }
+
+ BeforeEach(func() {
+ var err error
+ aead, err = crypto.NewNullAEAD(protocol.PerspectiveServer, connID, ver)
+ Expect(err).ToNot(HaveOccurred())
+ // set hdr.Raw
+ buf := &bytes.Buffer{}
+ err = hdr.Write(buf, protocol.PerspectiveServer, ver)
+ Expect(err).ToNot(HaveOccurred())
+ hdr.Raw = buf.Bytes()
+ })
+
+ Context("unpacking", func() {
+ packPacket := func(frames []wire.Frame) []byte {
+ buf := &bytes.Buffer{}
+ err := hdr.Write(buf, protocol.PerspectiveClient, ver)
+ Expect(err).ToNot(HaveOccurred())
+ payloadStartIndex := buf.Len()
+ aeadCl, err := crypto.NewNullAEAD(protocol.PerspectiveClient, connID, ver)
+ for _, f := range frames {
+ err := f.Write(buf, ver)
+ Expect(err).ToNot(HaveOccurred())
+ }
+ raw := buf.Bytes()
+ return aeadCl.Seal(raw[payloadStartIndex:payloadStartIndex], raw[payloadStartIndex:], hdr.PacketNumber, raw[:payloadStartIndex])
+ }
+
+ It("unpacks a packet", func() {
+ f := &wire.StreamFrame{
+ StreamID: 0,
+ Data: []byte("foobar"),
+ }
+ p := packPacket([]wire.Frame{f})
+ frame, err := unpackInitialPacket(aead, hdr, p, ver)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(frame).To(Equal(f))
+ })
+
+ It("rejects a packet that doesn't contain a STREAM_FRAME", func() {
+ p := packPacket([]wire.Frame{&wire.PingFrame{}})
+ _, err := unpackInitialPacket(aead, hdr, p, ver)
+ Expect(err).To(MatchError("Packet doesn't contain a STREAM_FRAME"))
+ })
+
+ It("rejects a packet that has a STREAM_FRAME for the wrong stream", func() {
+ f := &wire.StreamFrame{
+ StreamID: 42,
+ Data: []byte("foobar"),
+ }
+ p := packPacket([]wire.Frame{f})
+ _, err := unpackInitialPacket(aead, hdr, p, ver)
+ Expect(err).To(MatchError("UnencryptedStreamData: received unencrypted stream data on stream 42"))
+ })
+
+ It("rejects a packet that has a STREAM_FRAME with a non-zero offset", func() {
+ f := &wire.StreamFrame{
+ StreamID: 0,
+ Offset: 10,
+ Data: []byte("foobar"),
+ }
+ p := packPacket([]wire.Frame{f})
+ _, err := unpackInitialPacket(aead, hdr, p, ver)
+ Expect(err).To(MatchError("received stream data with non-zero offset"))
+ })
+ })
+
+ Context("packing", func() {
+ var unpacker *packetUnpacker
+
+ BeforeEach(func() {
+ aeadCl, err := crypto.NewNullAEAD(protocol.PerspectiveClient, connID, ver)
+ Expect(err).ToNot(HaveOccurred())
+ unpacker = &packetUnpacker{aead: &nullAEAD{aeadCl}, version: ver}
+ })
+
+ It("packs a packet", func() {
+ f := &wire.StreamFrame{
+ Data: []byte("foobar"),
+ FinBit: true,
+ }
+ data, err := packUnencryptedPacket(aead, hdr, f, protocol.PerspectiveServer)
+ Expect(err).ToNot(HaveOccurred())
+ packet, err := unpacker.Unpack(hdr.Raw, hdr, data[len(hdr.Raw):])
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.frames).To(Equal([]wire.Frame{f}))
+ })
+ })
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/packet_number_generator.go b/vendor/github.com/lucas-clemente/quic-go/packet_number_generator.go
index 71ca9a3..ac63577 100644
--- a/vendor/github.com/lucas-clemente/quic-go/packet_number_generator.go
+++ b/vendor/github.com/lucas-clemente/quic-go/packet_number_generator.go
@@ -4,7 +4,7 @@ import (
"crypto/rand"
"math"
- "github.com/lucas-clemente/quic-go/protocol"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
)
// The packetNumberGenerator generates the packet number for the next packet
@@ -17,9 +17,9 @@ type packetNumberGenerator struct {
nextToSkip protocol.PacketNumber
}
-func newPacketNumberGenerator(averagePeriod protocol.PacketNumber) *packetNumberGenerator {
+func newPacketNumberGenerator(initial, averagePeriod protocol.PacketNumber) *packetNumberGenerator {
return &packetNumberGenerator{
- next: 1,
+ next: initial,
averagePeriod: averagePeriod,
}
}
diff --git a/vendor/github.com/lucas-clemente/quic-go/packet_number_generator_test.go b/vendor/github.com/lucas-clemente/quic-go/packet_number_generator_test.go
index f1f87fe..ece74a9 100644
--- a/vendor/github.com/lucas-clemente/quic-go/packet_number_generator_test.go
+++ b/vendor/github.com/lucas-clemente/quic-go/packet_number_generator_test.go
@@ -3,7 +3,7 @@ package quic
import (
"math"
- "github.com/lucas-clemente/quic-go/protocol"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
@@ -12,7 +12,12 @@ var _ = Describe("Packet Number Generator", func() {
var png packetNumberGenerator
BeforeEach(func() {
- png = *newPacketNumberGenerator(100)
+ png = *newPacketNumberGenerator(1, 100)
+ })
+
+ It("can be initialized to return any first packet number", func() {
+ png = *newPacketNumberGenerator(12345, 100)
+ Expect(png.Pop()).To(Equal(protocol.PacketNumber(12345)))
})
It("gets 1 as the first packet number", func() {
diff --git a/vendor/github.com/lucas-clemente/quic-go/packet_packer.go b/vendor/github.com/lucas-clemente/quic-go/packet_packer.go
index 08db29e..aabddee 100644
--- a/vendor/github.com/lucas-clemente/quic-go/packet_packer.go
+++ b/vendor/github.com/lucas-clemente/quic-go/packet_packer.go
@@ -6,16 +6,15 @@ import (
"fmt"
"github.com/lucas-clemente/quic-go/ackhandler"
- "github.com/lucas-clemente/quic-go/frames"
- "github.com/lucas-clemente/quic-go/handshake"
- "github.com/lucas-clemente/quic-go/protocol"
- "github.com/lucas-clemente/quic-go/qerr"
+ "github.com/lucas-clemente/quic-go/internal/handshake"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/wire"
)
type packedPacket struct {
- number protocol.PacketNumber
+ header *wire.Header
raw []byte
- frames []frames.Frame
+ frames []wire.Frame
encryptionLevel protocol.EncryptionLevel
}
@@ -24,133 +23,126 @@ type packetPacker struct {
perspective protocol.Perspective
version protocol.VersionNumber
cryptoSetup handshake.CryptoSetup
- // as long as packets are not sent with forward-secure encryption, we limit the MaxPacketSize such that they can be retransmitted as a whole
- isForwardSecure bool
packetNumberGenerator *packetNumberGenerator
+ streamFramer *streamFramer
- connectionParameters handshake.ConnectionParametersManager
-
- streamFramer *streamFramer
- controlFrames []frames.Frame
+ controlFrames []wire.Frame
+ stopWaiting *wire.StopWaitingFrame
+ ackFrame *wire.AckFrame
+ leastUnacked protocol.PacketNumber
+ omitConnectionID bool
+ hasSentPacket bool // has the packetPacker already sent a packet
}
-func newPacketPacker(connectionID protocol.ConnectionID, cryptoSetup handshake.CryptoSetup, connectionParameters handshake.ConnectionParametersManager, streamFramer *streamFramer, perspective protocol.Perspective, version protocol.VersionNumber) *packetPacker {
+func newPacketPacker(connectionID protocol.ConnectionID,
+ initialPacketNumber protocol.PacketNumber,
+ cryptoSetup handshake.CryptoSetup,
+ streamFramer *streamFramer,
+ perspective protocol.Perspective,
+ version protocol.VersionNumber,
+) *packetPacker {
return &packetPacker{
cryptoSetup: cryptoSetup,
connectionID: connectionID,
- connectionParameters: connectionParameters,
perspective: perspective,
version: version,
streamFramer: streamFramer,
- packetNumberGenerator: newPacketNumberGenerator(protocol.SkipPacketAveragePeriodLength),
+ packetNumberGenerator: newPacketNumberGenerator(initialPacketNumber, protocol.SkipPacketAveragePeriodLength),
}
}
// PackConnectionClose packs a packet that ONLY contains a ConnectionCloseFrame
-func (p *packetPacker) PackConnectionClose(ccf *frames.ConnectionCloseFrame, leastUnacked protocol.PacketNumber) (*packedPacket, error) {
- // in case the connection is closed, all queued control frames aren't of any use anymore
- // discard them and queue the ConnectionCloseFrame
- p.controlFrames = []frames.Frame{ccf}
- return p.packPacket(nil, leastUnacked, nil)
+func (p *packetPacker) PackConnectionClose(ccf *wire.ConnectionCloseFrame) (*packedPacket, error) {
+ frames := []wire.Frame{ccf}
+ encLevel, sealer := p.cryptoSetup.GetSealer()
+ header := p.getHeader(encLevel)
+ raw, err := p.writeAndSealPacket(header, frames, sealer)
+ return &packedPacket{
+ header: header,
+ raw: raw,
+ frames: frames,
+ encryptionLevel: encLevel,
+ }, err
}
-// RetransmitNonForwardSecurePacket retransmits a handshake packet, that was sent with less than forward-secure encryption
-func (p *packetPacker) RetransmitNonForwardSecurePacket(stopWaitingFrame *frames.StopWaitingFrame, packet *ackhandler.Packet) (*packedPacket, error) {
+func (p *packetPacker) PackAckPacket() (*packedPacket, error) {
+ if p.ackFrame == nil {
+ return nil, errors.New("packet packer BUG: no ack frame queued")
+ }
+ encLevel, sealer := p.cryptoSetup.GetSealer()
+ header := p.getHeader(encLevel)
+ frames := []wire.Frame{p.ackFrame}
+ if p.stopWaiting != nil {
+ p.stopWaiting.PacketNumber = header.PacketNumber
+ p.stopWaiting.PacketNumberLen = header.PacketNumberLen
+ frames = append(frames, p.stopWaiting)
+ p.stopWaiting = nil
+ }
+ p.ackFrame = nil
+ raw, err := p.writeAndSealPacket(header, frames, sealer)
+ return &packedPacket{
+ header: header,
+ raw: raw,
+ frames: frames,
+ encryptionLevel: encLevel,
+ }, err
+}
+
+// PackHandshakeRetransmission retransmits a handshake packet, that was sent with less than forward-secure encryption
+func (p *packetPacker) PackHandshakeRetransmission(packet *ackhandler.Packet) (*packedPacket, error) {
if packet.EncryptionLevel == protocol.EncryptionForwardSecure {
return nil, errors.New("PacketPacker BUG: forward-secure encrypted handshake packets don't need special treatment")
}
- if stopWaitingFrame == nil {
- return nil, errors.New("PacketPacker BUG: Handshake retransmissions must contain a StopWaitingFrame")
- }
-
- return p.packPacket(stopWaitingFrame, 0, packet)
-}
-
-// PackPacket packs a new packet
-// the stopWaitingFrame is *guaranteed* to be included in the next packet
-// the other controlFrames are sent in the next packet, but might be queued and sent in the next packet if the packet would overflow MaxPacketSize otherwise
-func (p *packetPacker) PackPacket(stopWaitingFrame *frames.StopWaitingFrame, controlFrames []frames.Frame, leastUnacked protocol.PacketNumber) (*packedPacket, error) {
- p.controlFrames = append(p.controlFrames, controlFrames...)
- return p.packPacket(stopWaitingFrame, leastUnacked, nil)
-}
-
-func (p *packetPacker) packPacket(stopWaitingFrame *frames.StopWaitingFrame, leastUnacked protocol.PacketNumber, handshakePacketToRetransmit *ackhandler.Packet) (*packedPacket, error) {
- // handshakePacketToRetransmit is only set for handshake retransmissions
- isHandshakeRetransmission := (handshakePacketToRetransmit != nil)
-
- var sealFunc handshake.Sealer
- var encLevel protocol.EncryptionLevel
-
- if isHandshakeRetransmission {
- var err error
- encLevel = handshakePacketToRetransmit.EncryptionLevel
- sealFunc, err = p.cryptoSetup.GetSealerWithEncryptionLevel(encLevel)
- if err != nil {
- return nil, err
- }
- } else {
- encLevel, sealFunc = p.cryptoSetup.GetSealer()
- }
-
- currentPacketNumber := p.packetNumberGenerator.Peek()
- packetNumberLen := protocol.GetPacketNumberLengthForPublicHeader(currentPacketNumber, leastUnacked)
- responsePublicHeader := &PublicHeader{
- ConnectionID: p.connectionID,
- PacketNumber: currentPacketNumber,
- PacketNumberLen: packetNumberLen,
- TruncateConnectionID: p.connectionParameters.TruncateConnectionID(),
- }
-
- if p.perspective == protocol.PerspectiveServer && encLevel == protocol.EncryptionSecure {
- responsePublicHeader.DiversificationNonce = p.cryptoSetup.DiversificationNonce()
- }
-
- if p.perspective == protocol.PerspectiveClient && encLevel != protocol.EncryptionForwardSecure {
- responsePublicHeader.VersionFlag = true
- responsePublicHeader.VersionNumber = p.version
- }
-
- publicHeaderLength, err := responsePublicHeader.GetLength(p.perspective)
+ sealer, err := p.cryptoSetup.GetSealerWithEncryptionLevel(packet.EncryptionLevel)
if err != nil {
return nil, err
}
+ if p.stopWaiting == nil {
+ return nil, errors.New("PacketPacker BUG: Handshake retransmissions must contain a StopWaitingFrame")
+ }
+ header := p.getHeader(packet.EncryptionLevel)
+ p.stopWaiting.PacketNumber = header.PacketNumber
+ p.stopWaiting.PacketNumberLen = header.PacketNumberLen
+ frames := append([]wire.Frame{p.stopWaiting}, packet.Frames...)
+ p.stopWaiting = nil
+ raw, err := p.writeAndSealPacket(header, frames, sealer)
+ return &packedPacket{
+ header: header,
+ raw: raw,
+ frames: frames,
+ encryptionLevel: packet.EncryptionLevel,
+ }, err
+}
- if stopWaitingFrame != nil {
- stopWaitingFrame.PacketNumber = currentPacketNumber
- stopWaitingFrame.PacketNumberLen = packetNumberLen
+// PackPacket packs a new packet
+// the other controlFrames are sent in the next packet, but might be queued and sent in the next packet if the packet would overflow MaxPacketSize otherwise
+func (p *packetPacker) PackPacket() (*packedPacket, error) {
+ hasCryptoStreamFrame := p.streamFramer.HasCryptoStreamFrame()
+ // if this is the first packet to be send, make sure it contains stream data
+ if !p.hasSentPacket && !hasCryptoStreamFrame {
+ return nil, nil
+ }
+ if hasCryptoStreamFrame {
+ return p.packCryptoPacket()
}
- // we're packing a ConnectionClose, don't add any StreamFrames
- var isConnectionClose bool
- if len(p.controlFrames) == 1 {
- _, isConnectionClose = p.controlFrames[0].(*frames.ConnectionCloseFrame)
+ encLevel, sealer := p.cryptoSetup.GetSealer()
+
+ header := p.getHeader(encLevel)
+ headerLength, err := header.GetLength(p.perspective, p.version)
+ if err != nil {
+ return nil, err
+ }
+ if p.stopWaiting != nil {
+ p.stopWaiting.PacketNumber = header.PacketNumber
+ p.stopWaiting.PacketNumberLen = header.PacketNumberLen
}
- var payloadFrames []frames.Frame
- if isHandshakeRetransmission {
- payloadFrames = append(payloadFrames, stopWaitingFrame)
- // don't retransmit Acks and StopWaitings
- for _, f := range handshakePacketToRetransmit.Frames {
- switch f.(type) {
- case *frames.AckFrame:
- continue
- case *frames.StopWaitingFrame:
- continue
- }
- payloadFrames = append(payloadFrames, f)
- }
- } else if isConnectionClose {
- payloadFrames = []frames.Frame{p.controlFrames[0]}
- } else {
- maxSize := protocol.MaxFrameAndPublicHeaderSize - publicHeaderLength
- if !p.isForwardSecure {
- maxSize -= protocol.NonForwardSecurePacketSizeReduction
- }
- payloadFrames, err = p.composeNextPacket(stopWaitingFrame, maxSize)
- if err != nil {
- return nil, err
- }
+ maxSize := protocol.MaxPacketSize - protocol.ByteCount(sealer.Overhead()) - headerLength
+ payloadFrames, err := p.composeNextPacket(maxSize, p.canSendData(encLevel))
+ if err != nil {
+ return nil, err
}
// Check if we have enough frames to send
@@ -158,71 +150,76 @@ func (p *packetPacker) packPacket(stopWaitingFrame *frames.StopWaitingFrame, lea
return nil, nil
}
// Don't send out packets that only contain a StopWaitingFrame
- if len(payloadFrames) == 1 && stopWaitingFrame != nil {
+ if len(payloadFrames) == 1 && p.stopWaiting != nil {
return nil, nil
}
+ p.stopWaiting = nil
+ p.ackFrame = nil
- raw := getPacketBuffer()
- buffer := bytes.NewBuffer(raw)
-
- if err = responsePublicHeader.Write(buffer, p.version, p.perspective); err != nil {
+ raw, err := p.writeAndSealPacket(header, payloadFrames, sealer)
+ if err != nil {
return nil, err
}
-
- payloadStartIndex := buffer.Len()
-
- var hasNonCryptoStreamData bool // does this frame contain any stream frame on a stream > 1
- for _, frame := range payloadFrames {
- if sf, ok := frame.(*frames.StreamFrame); ok && sf.StreamID != 1 {
- hasNonCryptoStreamData = true
- }
- err = frame.Write(buffer, p.version)
- if err != nil {
- return nil, err
- }
- }
-
- if protocol.ByteCount(buffer.Len()+12) > protocol.MaxPacketSize {
- return nil, errors.New("PacketPacker BUG: packet too large")
- }
-
- raw = raw[0:buffer.Len()]
- _ = sealFunc(raw[payloadStartIndex:payloadStartIndex], raw[payloadStartIndex:], currentPacketNumber, raw[:payloadStartIndex])
- raw = raw[0 : buffer.Len()+12]
-
- if hasNonCryptoStreamData && encLevel <= protocol.EncryptionUnencrypted {
- return nil, qerr.AttemptToSendUnencryptedStreamData
- }
-
- num := p.packetNumberGenerator.Pop()
- if num != currentPacketNumber {
- return nil, errors.New("PacketPacker BUG: Peeked and Popped packet numbers do not match.")
- }
-
return &packedPacket{
- number: currentPacketNumber,
+ header: header,
raw: raw,
frames: payloadFrames,
encryptionLevel: encLevel,
}, nil
}
-func (p *packetPacker) composeNextPacket(stopWaitingFrame *frames.StopWaitingFrame, maxFrameSize protocol.ByteCount) ([]frames.Frame, error) {
- var payloadLength protocol.ByteCount
- var payloadFrames []frames.Frame
+func (p *packetPacker) packCryptoPacket() (*packedPacket, error) {
+ encLevel, sealer := p.cryptoSetup.GetSealerForCryptoStream()
+ header := p.getHeader(encLevel)
+ headerLength, err := header.GetLength(p.perspective, p.version)
+ if err != nil {
+ return nil, err
+ }
+ maxLen := protocol.MaxPacketSize - protocol.ByteCount(sealer.Overhead()) - protocol.NonForwardSecurePacketSizeReduction - headerLength
+ frames := []wire.Frame{p.streamFramer.PopCryptoStreamFrame(maxLen)}
+ raw, err := p.writeAndSealPacket(header, frames, sealer)
+ if err != nil {
+ return nil, err
+ }
+ return &packedPacket{
+ header: header,
+ raw: raw,
+ frames: frames,
+ encryptionLevel: encLevel,
+ }, nil
+}
- if stopWaitingFrame != nil {
- payloadFrames = append(payloadFrames, stopWaitingFrame)
- minLength, err := stopWaitingFrame.MinLength(p.version)
+func (p *packetPacker) composeNextPacket(
+ maxFrameSize protocol.ByteCount,
+ canSendStreamFrames bool,
+) ([]wire.Frame, error) {
+ var payloadLength protocol.ByteCount
+ var payloadFrames []wire.Frame
+
+ // STOP_WAITING and ACK will always fit
+ if p.stopWaiting != nil {
+ payloadFrames = append(payloadFrames, p.stopWaiting)
+ l, err := p.stopWaiting.MinLength(p.version)
if err != nil {
return nil, err
}
- payloadLength += minLength
+ payloadLength += l
+ }
+ if p.ackFrame != nil {
+ payloadFrames = append(payloadFrames, p.ackFrame)
+ l, err := p.ackFrame.MinLength(p.version)
+ if err != nil {
+ return nil, err
+ }
+ payloadLength += l
}
for len(p.controlFrames) > 0 {
frame := p.controlFrames[len(p.controlFrames)-1]
- minLength, _ := frame.MinLength(p.version) // controlFrames does not contain any StopWaitingFrames. So it will *never* return an error
+ minLength, err := frame.MinLength(p.version)
+ if err != nil {
+ return nil, err
+ }
if payloadLength+minLength > maxFrameSize {
break
}
@@ -235,10 +232,20 @@ func (p *packetPacker) composeNextPacket(stopWaitingFrame *frames.StopWaitingFra
return nil, fmt.Errorf("Packet Packer BUG: packet payload (%d) too large (%d)", payloadLength, maxFrameSize)
}
- // temporarily increase the maxFrameSize by 2 bytes
+ if !canSendStreamFrames {
+ return payloadFrames, nil
+ }
+
+ // temporarily increase the maxFrameSize by the (minimum) length of the DataLen field
// this leads to a properly sized packet in all cases, since we do all the packet length calculations with StreamFrames that have the DataLen set
- // however, for the last StreamFrame in the packet, we can omit the DataLen, thus saving 2 bytes and yielding a packet of exactly the correct size
- maxFrameSize += 2
+ // however, for the last StreamFrame in the packet, we can omit the DataLen, thus yielding a packet of exactly the correct size
+ // for gQUIC STREAM frames, DataLen is always 2 bytes
+ // for IETF draft style STREAM frames, the length is encoded to either 1 or 2 bytes
+ if p.version.UsesIETFFrameFormat() {
+ maxFrameSize++
+ } else {
+ maxFrameSize += 2
+ }
fs := p.streamFramer.PopStreamFrames(maxFrameSize - payloadLength)
if len(fs) != 0 {
@@ -257,10 +264,116 @@ func (p *packetPacker) composeNextPacket(stopWaitingFrame *frames.StopWaitingFra
return payloadFrames, nil
}
-func (p *packetPacker) QueueControlFrameForNextPacket(f frames.Frame) {
- p.controlFrames = append(p.controlFrames, f)
+func (p *packetPacker) QueueControlFrame(frame wire.Frame) {
+ switch f := frame.(type) {
+ case *wire.StopWaitingFrame:
+ p.stopWaiting = f
+ case *wire.AckFrame:
+ p.ackFrame = f
+ default:
+ p.controlFrames = append(p.controlFrames, f)
+ }
}
-func (p *packetPacker) SetForwardSecure() {
- p.isForwardSecure = true
+func (p *packetPacker) getHeader(encLevel protocol.EncryptionLevel) *wire.Header {
+ pnum := p.packetNumberGenerator.Peek()
+ packetNumberLen := protocol.GetPacketNumberLengthForHeader(pnum, p.leastUnacked)
+
+ header := &wire.Header{
+ ConnectionID: p.connectionID,
+ PacketNumber: pnum,
+ PacketNumberLen: packetNumberLen,
+ }
+
+ if p.version.UsesTLS() && encLevel != protocol.EncryptionForwardSecure {
+ header.PacketNumberLen = protocol.PacketNumberLen4
+ header.IsLongHeader = true
+ if !p.hasSentPacket && p.perspective == protocol.PerspectiveClient {
+ header.Type = protocol.PacketTypeInitial
+ } else {
+ header.Type = protocol.PacketTypeHandshake
+ }
+ }
+
+ if p.omitConnectionID && encLevel == protocol.EncryptionForwardSecure {
+ header.OmitConnectionID = true
+ }
+ if !p.version.UsesTLS() {
+ if p.perspective == protocol.PerspectiveServer && encLevel == protocol.EncryptionSecure {
+ header.DiversificationNonce = p.cryptoSetup.DiversificationNonce()
+ }
+ if p.perspective == protocol.PerspectiveClient && encLevel != protocol.EncryptionForwardSecure {
+ header.VersionFlag = true
+ header.Version = p.version
+ }
+ } else {
+ if encLevel != protocol.EncryptionForwardSecure {
+ header.Version = p.version
+ }
+ }
+ return header
+}
+
+func (p *packetPacker) writeAndSealPacket(
+ header *wire.Header,
+ payloadFrames []wire.Frame,
+ sealer handshake.Sealer,
+) ([]byte, error) {
+ raw := getPacketBuffer()
+ buffer := bytes.NewBuffer(raw)
+
+ if err := header.Write(buffer, p.perspective, p.version); err != nil {
+ return nil, err
+ }
+ payloadStartIndex := buffer.Len()
+
+ // the Initial packet needs to be padded, so the last STREAM frame must have the data length present
+ if header.Type == protocol.PacketTypeInitial {
+ lastFrame := payloadFrames[len(payloadFrames)-1]
+ if sf, ok := lastFrame.(*wire.StreamFrame); ok {
+ sf.DataLenPresent = true
+ }
+ }
+ for _, frame := range payloadFrames {
+ if err := frame.Write(buffer, p.version); err != nil {
+ return nil, err
+ }
+ }
+ // if this is an IETF QUIC Initial packet, we need to pad it to fulfill the minimum size requirement
+ // in gQUIC, padding is handled in the CHLO
+ if header.Type == protocol.PacketTypeInitial {
+ paddingLen := protocol.MinInitialPacketSize - sealer.Overhead() - buffer.Len()
+ if paddingLen > 0 {
+ buffer.Write(bytes.Repeat([]byte{0}, paddingLen))
+ }
+ }
+ if protocol.ByteCount(buffer.Len()+sealer.Overhead()) > protocol.MaxPacketSize {
+ return nil, errors.New("PacketPacker BUG: packet too large")
+ }
+
+ raw = raw[0:buffer.Len()]
+ _ = sealer.Seal(raw[payloadStartIndex:payloadStartIndex], raw[payloadStartIndex:], header.PacketNumber, raw[:payloadStartIndex])
+ raw = raw[0 : buffer.Len()+sealer.Overhead()]
+
+ num := p.packetNumberGenerator.Pop()
+ if num != header.PacketNumber {
+ return nil, errors.New("packetPacker BUG: Peeked and Popped packet numbers do not match")
+ }
+ p.hasSentPacket = true
+ return raw, nil
+}
+
+func (p *packetPacker) canSendData(encLevel protocol.EncryptionLevel) bool {
+ if p.perspective == protocol.PerspectiveClient {
+ return encLevel >= protocol.EncryptionSecure
+ }
+ return encLevel == protocol.EncryptionForwardSecure
+}
+
+func (p *packetPacker) SetLeastUnacked(leastUnacked protocol.PacketNumber) {
+ p.leastUnacked = leastUnacked
+}
+
+func (p *packetPacker) SetOmitConnectionID() {
+ p.omitConnectionID = true
}
diff --git a/vendor/github.com/lucas-clemente/quic-go/packet_packer_test.go b/vendor/github.com/lucas-clemente/quic-go/packet_packer_test.go
index 4d1c6df..50cedd9 100644
--- a/vendor/github.com/lucas-clemente/quic-go/packet_packer_test.go
+++ b/vendor/github.com/lucas-clemente/quic-go/packet_packer_test.go
@@ -2,44 +2,53 @@ package quic
import (
"bytes"
+ "math"
"github.com/lucas-clemente/quic-go/ackhandler"
- "github.com/lucas-clemente/quic-go/frames"
- "github.com/lucas-clemente/quic-go/handshake"
- "github.com/lucas-clemente/quic-go/protocol"
- "github.com/lucas-clemente/quic-go/qerr"
+ "github.com/lucas-clemente/quic-go/internal/flowcontrol"
+ "github.com/lucas-clemente/quic-go/internal/handshake"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/wire"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
-type mockCryptoSetup struct {
- divNonce []byte
- handshakeComplete bool
- encLevelSeal protocol.EncryptionLevel
+type mockSealer struct{}
+
+func (s *mockSealer) Seal(dst, src []byte, packetNumber protocol.PacketNumber, associatedData []byte) []byte {
+ return append(src, bytes.Repeat([]byte{0}, 12)...)
}
-func (m *mockCryptoSetup) HandleCryptoStream() error { return nil }
+func (s *mockSealer) Overhead() int { return 12 }
+var _ handshake.Sealer = &mockSealer{}
+
+type mockCryptoSetup struct {
+ handleErr error
+ divNonce []byte
+ encLevelSeal protocol.EncryptionLevel
+ encLevelSealCrypto protocol.EncryptionLevel
+}
+
+var _ handshake.CryptoSetup = &mockCryptoSetup{}
+
+func (m *mockCryptoSetup) HandleCryptoStream() error {
+ return m.handleErr
+}
func (m *mockCryptoSetup) Open(dst, src []byte, packetNumber protocol.PacketNumber, associatedData []byte) ([]byte, protocol.EncryptionLevel, error) {
return nil, protocol.EncryptionUnspecified, nil
}
func (m *mockCryptoSetup) GetSealer() (protocol.EncryptionLevel, handshake.Sealer) {
- return m.encLevelSeal, func(dst, src []byte, packetNumber protocol.PacketNumber, associatedData []byte) []byte {
- return append(src, bytes.Repeat([]byte{0}, 12)...)
- }
+ return m.encLevelSeal, &mockSealer{}
+}
+func (m *mockCryptoSetup) GetSealerForCryptoStream() (protocol.EncryptionLevel, handshake.Sealer) {
+ return m.encLevelSealCrypto, &mockSealer{}
}
func (m *mockCryptoSetup) GetSealerWithEncryptionLevel(protocol.EncryptionLevel) (handshake.Sealer, error) {
- return func(dst, src []byte, packetNumber protocol.PacketNumber, associatedData []byte) []byte {
- return append(src, bytes.Repeat([]byte{0}, 12)...)
- }, nil
+ return &mockSealer{}, nil
}
-func (m *mockCryptoSetup) HandshakeComplete() bool { return m.handshakeComplete }
-func (m *mockCryptoSetup) DiversificationNonce() []byte {
- return m.divNonce
-}
-func (m *mockCryptoSetup) SetDiversificationNonce([]byte) error { panic("not implemented") }
-
-var _ handshake.CryptoSetup = &mockCryptoSetup{}
+func (m *mockCryptoSetup) DiversificationNonce() []byte { return m.divNonce }
+func (m *mockCryptoSetup) SetDiversificationNonce(divNonce []byte) { m.divNonce = divNonce }
var _ = Describe("Packet packer", func() {
var (
@@ -47,136 +56,194 @@ var _ = Describe("Packet packer", func() {
publicHeaderLen protocol.ByteCount
maxFrameSize protocol.ByteCount
streamFramer *streamFramer
+ cryptoStream *stream
)
BeforeEach(func() {
- fcm := newMockFlowControlHandler()
- fcm.sendWindowSizes[3] = protocol.MaxByteCount
- fcm.sendWindowSizes[5] = protocol.MaxByteCount
- fcm.sendWindowSizes[7] = protocol.MaxByteCount
-
- cpm := &mockConnectionParametersManager{}
- streamFramer = newStreamFramer(newStreamsMap(nil, protocol.PerspectiveServer, cpm), fcm)
+ version := versionGQUICFrames
+ cryptoStream = &stream{streamID: version.CryptoStreamID(), flowController: flowcontrol.NewStreamFlowController(version.CryptoStreamID(), false, flowcontrol.NewConnectionFlowController(1000, 1000, nil), 1000, 1000, 1000, nil)}
+ streamsMap := newStreamsMap(nil, protocol.PerspectiveServer, versionGQUICFrames)
+ streamFramer = newStreamFramer(cryptoStream, streamsMap, nil, versionGQUICFrames)
packer = &packetPacker{
cryptoSetup: &mockCryptoSetup{encLevelSeal: protocol.EncryptionForwardSecure},
- connectionParameters: cpm,
connectionID: 0x1337,
- packetNumberGenerator: newPacketNumberGenerator(protocol.SkipPacketAveragePeriodLength),
+ packetNumberGenerator: newPacketNumberGenerator(1, protocol.SkipPacketAveragePeriodLength),
streamFramer: streamFramer,
perspective: protocol.PerspectiveServer,
}
publicHeaderLen = 1 + 8 + 2 // 1 flag byte, 8 connection ID, 2 packet number
- maxFrameSize = protocol.MaxFrameAndPublicHeaderSize - publicHeaderLen
- packer.version = protocol.VersionWhatever
- packer.isForwardSecure = true
+ maxFrameSize = protocol.MaxPacketSize - protocol.ByteCount((&mockSealer{}).Overhead()) - publicHeaderLen
+ packer.hasSentPacket = true
+ packer.version = version
})
It("returns nil when no packet is queued", func() {
- p, err := packer.PackPacket(nil, []frames.Frame{}, 0)
+ p, err := packer.PackPacket()
Expect(p).To(BeNil())
Expect(err).ToNot(HaveOccurred())
})
It("packs single packets", func() {
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
StreamID: 5,
Data: []byte{0xDE, 0xCA, 0xFB, 0xAD},
}
streamFramer.AddFrameForRetransmission(f)
- p, err := packer.PackPacket(nil, []frames.Frame{}, 0)
+ p, err := packer.PackPacket()
Expect(err).ToNot(HaveOccurred())
Expect(p).ToNot(BeNil())
b := &bytes.Buffer{}
- f.Write(b, 0)
+ f.Write(b, packer.version)
Expect(p.frames).To(HaveLen(1))
Expect(p.raw).To(ContainSubstring(string(b.Bytes())))
})
It("stores the encryption level a packet was sealed with", func() {
- packer.cryptoSetup.(*mockCryptoSetup).encLevelSeal = protocol.EncryptionSecure
- f := &frames.StreamFrame{
+ packer.cryptoSetup.(*mockCryptoSetup).encLevelSeal = protocol.EncryptionForwardSecure
+ f := &wire.StreamFrame{
StreamID: 5,
Data: []byte("foobar"),
}
streamFramer.AddFrameForRetransmission(f)
- p, err := packer.PackPacket(nil, []frames.Frame{}, 0)
+ p, err := packer.PackPacket()
Expect(err).ToNot(HaveOccurred())
- Expect(p.encryptionLevel).To(Equal(protocol.EncryptionSecure))
+ Expect(p.encryptionLevel).To(Equal(protocol.EncryptionForwardSecure))
})
- Context("diversificaton nonces", func() {
- var nonce []byte
+ Context("generating a packet header", func() {
+ const (
+ versionPublicHeader = protocol.Version39 // a QUIC version that uses the Public Header format
+ versionIETFHeader = protocol.VersionTLS // a QUIC version taht uses the IETF Header format
+ )
- BeforeEach(func() {
- nonce = bytes.Repeat([]byte{'e'}, 32)
- packer.cryptoSetup.(*mockCryptoSetup).divNonce = nonce
- f := &frames.StreamFrame{
- StreamID: 1,
- Data: []byte{0xDE, 0xCA, 0xFB, 0xAD},
- }
- streamFramer.AddFrameForRetransmission(f)
+ Context("Public Header (for gQUIC)", func() {
+ BeforeEach(func() {
+ packer.version = versionPublicHeader
+ })
+
+ It("it omits the connection ID for forward-secure packets", func() {
+ ph := packer.getHeader(protocol.EncryptionForwardSecure)
+ Expect(ph.OmitConnectionID).To(BeFalse())
+ packer.SetOmitConnectionID()
+ ph = packer.getHeader(protocol.EncryptionForwardSecure)
+ Expect(ph.OmitConnectionID).To(BeTrue())
+ })
+
+ It("doesn't omit the connection ID for non-forward-secure packets", func() {
+ packer.SetOmitConnectionID()
+ ph := packer.getHeader(protocol.EncryptionSecure)
+ Expect(ph.OmitConnectionID).To(BeFalse())
+ })
+
+ It("adds the Version Flag to the Public Header before the crypto handshake is finished", func() {
+ packer.perspective = protocol.PerspectiveClient
+ ph := packer.getHeader(protocol.EncryptionSecure)
+ Expect(ph.VersionFlag).To(BeTrue())
+ })
+
+ It("doesn't add the Version Flag to the Public Header for forward-secure packets", func() {
+ packer.perspective = protocol.PerspectiveClient
+ ph := packer.getHeader(protocol.EncryptionForwardSecure)
+ Expect(ph.VersionFlag).To(BeFalse())
+ })
+
+ Context("diversificaton nonces", func() {
+ var nonce []byte
+
+ BeforeEach(func() {
+ nonce = bytes.Repeat([]byte{'e'}, 32)
+ packer.cryptoSetup.(*mockCryptoSetup).divNonce = nonce
+ })
+
+ It("doesn't include a div nonce, when sending a packet with initial encryption", func() {
+ ph := packer.getHeader(protocol.EncryptionUnencrypted)
+ Expect(ph.DiversificationNonce).To(BeEmpty())
+ })
+
+ It("includes a div nonce, when sending a packet with secure encryption", func() {
+ ph := packer.getHeader(protocol.EncryptionSecure)
+ Expect(ph.DiversificationNonce).To(Equal(nonce))
+ })
+
+ It("doesn't include a div nonce, when sending a packet with forward-secure encryption", func() {
+ ph := packer.getHeader(protocol.EncryptionForwardSecure)
+ Expect(ph.DiversificationNonce).To(BeEmpty())
+ })
+
+ It("doesn't send a div nonce as a client", func() {
+ packer.perspective = protocol.PerspectiveClient
+ ph := packer.getHeader(protocol.EncryptionSecure)
+ Expect(ph.DiversificationNonce).To(BeEmpty())
+ })
+ })
})
- It("doesn't include a div nonce, when sending a packet with initial encryption", func() {
- packer.cryptoSetup.(*mockCryptoSetup).encLevelSeal = protocol.EncryptionUnencrypted
- p, err := packer.PackPacket(nil, []frames.Frame{}, 0)
- Expect(err).ToNot(HaveOccurred())
- Expect(p.raw).ToNot(ContainSubstring(string(nonce)))
- })
+ Context("Header (for IETF draft QUIC)", func() {
+ BeforeEach(func() {
+ packer.version = versionIETFHeader
+ })
- It("includes a div nonce, when sending a packet with secure encryption", func() {
- packer.cryptoSetup.(*mockCryptoSetup).encLevelSeal = protocol.EncryptionSecure
- p, err := packer.PackPacket(nil, []frames.Frame{}, 0)
- Expect(err).ToNot(HaveOccurred())
- Expect(p.raw).To(ContainSubstring(string(nonce)))
- })
+ It("uses the Long Header format for non-forward-secure packets", func() {
+ h := packer.getHeader(protocol.EncryptionSecure)
+ Expect(h.IsLongHeader).To(BeTrue())
+ Expect(h.PacketNumberLen).To(Equal(protocol.PacketNumberLen4))
+ Expect(h.Version).To(Equal(versionIETFHeader))
+ })
- It("doesn't include a div nonce, when sending a packet with forward-secure encryption", func() {
- packer.cryptoSetup.(*mockCryptoSetup).encLevelSeal = protocol.EncryptionUnencrypted
- p, err := packer.PackPacket(nil, []frames.Frame{}, 0)
- Expect(err).ToNot(HaveOccurred())
- Expect(p.raw).ToNot(ContainSubstring(string(nonce)))
- })
+ It("uses the Short Header format for forward-secure packets", func() {
+ h := packer.getHeader(protocol.EncryptionForwardSecure)
+ Expect(h.IsLongHeader).To(BeFalse())
+ Expect(h.PacketNumberLen).To(BeNumerically(">", 0))
+ })
- It("doesn't send a div nonce as a client", func() {
- packer.perspective = protocol.PerspectiveClient
- packer.cryptoSetup.(*mockCryptoSetup).encLevelSeal = protocol.EncryptionSecure
- p, err := packer.PackPacket(nil, []frames.Frame{}, 0)
- Expect(err).ToNot(HaveOccurred())
- Expect(p.raw).ToNot(ContainSubstring(string(nonce)))
+ It("it omits the connection ID for forward-secure packets", func() {
+ h := packer.getHeader(protocol.EncryptionForwardSecure)
+ Expect(h.OmitConnectionID).To(BeFalse())
+ packer.SetOmitConnectionID()
+ h = packer.getHeader(protocol.EncryptionForwardSecure)
+ Expect(h.OmitConnectionID).To(BeTrue())
+ })
+
+ It("doesn't omit the connection ID for non-forward-secure packets", func() {
+ packer.SetOmitConnectionID()
+ h := packer.getHeader(protocol.EncryptionSecure)
+ Expect(h.OmitConnectionID).To(BeFalse())
+ })
})
})
It("packs a ConnectionClose", func() {
- ccf := frames.ConnectionCloseFrame{
+ ccf := wire.ConnectionCloseFrame{
ErrorCode: 0x1337,
ReasonPhrase: "foobar",
}
- p, err := packer.PackConnectionClose(&ccf, 0)
+ p, err := packer.PackConnectionClose(&ccf)
Expect(err).ToNot(HaveOccurred())
Expect(p.frames).To(HaveLen(1))
Expect(p.frames[0]).To(Equal(&ccf))
})
It("doesn't send any other frames when sending a ConnectionClose", func() {
- ccf := frames.ConnectionCloseFrame{
+ ccf := wire.ConnectionCloseFrame{
ErrorCode: 0x1337,
ReasonPhrase: "foobar",
}
- packer.controlFrames = []frames.Frame{&frames.WindowUpdateFrame{StreamID: 37}}
- streamFramer.AddFrameForRetransmission(&frames.StreamFrame{
+ packer.controlFrames = []wire.Frame{&wire.MaxStreamDataFrame{StreamID: 37}}
+ streamFramer.AddFrameForRetransmission(&wire.StreamFrame{
StreamID: 5,
Data: []byte("foobar"),
})
- p, err := packer.PackConnectionClose(&ccf, 0)
+ p, err := packer.PackConnectionClose(&ccf)
Expect(err).ToNot(HaveOccurred())
Expect(p.frames).To(HaveLen(1))
Expect(p.frames[0]).To(Equal(&ccf))
})
It("packs only control frames", func() {
- p, err := packer.PackPacket(nil, []frames.Frame{&frames.RstStreamFrame{}, &frames.WindowUpdateFrame{}}, 0)
+ packer.QueueControlFrame(&wire.RstStreamFrame{})
+ packer.QueueControlFrame(&wire.MaxDataFrame{})
+ p, err := packer.PackPacket()
Expect(p).ToNot(BeNil())
Expect(err).ToNot(HaveOccurred())
Expect(p.frames).To(HaveLen(2))
@@ -184,205 +251,202 @@ var _ = Describe("Packet packer", func() {
})
It("increases the packet number", func() {
- p1, err := packer.PackPacket(nil, []frames.Frame{&frames.RstStreamFrame{}}, 0)
+ packer.QueueControlFrame(&wire.RstStreamFrame{})
+ p1, err := packer.PackPacket()
Expect(err).ToNot(HaveOccurred())
Expect(p1).ToNot(BeNil())
- p2, err := packer.PackPacket(nil, []frames.Frame{&frames.RstStreamFrame{}}, 0)
+ packer.QueueControlFrame(&wire.RstStreamFrame{})
+ p2, err := packer.PackPacket()
Expect(err).ToNot(HaveOccurred())
Expect(p2).ToNot(BeNil())
- Expect(p2.number).To(BeNumerically(">", p1.number))
+ Expect(p2.header.PacketNumber).To(BeNumerically(">", p1.header.PacketNumber))
})
- It("packs a StopWaitingFrame first", func() {
+ It("packs a STOP_WAITING frame first", func() {
packer.packetNumberGenerator.next = 15
- swf := &frames.StopWaitingFrame{LeastUnacked: 10}
- p, err := packer.PackPacket(swf, []frames.Frame{&frames.RstStreamFrame{}}, 0)
+ swf := &wire.StopWaitingFrame{LeastUnacked: 10}
+ packer.QueueControlFrame(&wire.RstStreamFrame{})
+ packer.QueueControlFrame(swf)
+ p, err := packer.PackPacket()
Expect(err).ToNot(HaveOccurred())
Expect(p).ToNot(BeNil())
Expect(p.frames).To(HaveLen(2))
Expect(p.frames[0]).To(Equal(swf))
})
- It("sets the LeastUnackedDelta length of a StopWaitingFrame", func() {
+ It("sets the LeastUnackedDelta length of a STOP_WAITING frame", func() {
packetNumber := protocol.PacketNumber(0xDECAFB) // will result in a 4 byte packet number
packer.packetNumberGenerator.next = packetNumber
- swf := &frames.StopWaitingFrame{LeastUnacked: packetNumber - 0x100}
- p, err := packer.PackPacket(swf, []frames.Frame{&frames.RstStreamFrame{}}, 0)
+ swf := &wire.StopWaitingFrame{LeastUnacked: packetNumber - 0x100}
+ packer.QueueControlFrame(&wire.RstStreamFrame{})
+ packer.QueueControlFrame(swf)
+ p, err := packer.PackPacket()
Expect(err).ToNot(HaveOccurred())
- Expect(p.frames[0].(*frames.StopWaitingFrame).PacketNumberLen).To(Equal(protocol.PacketNumberLen4))
+ Expect(p.frames[0].(*wire.StopWaitingFrame).PacketNumberLen).To(Equal(protocol.PacketNumberLen4))
})
- It("does not pack a packet containing only a StopWaitingFrame", func() {
- swf := &frames.StopWaitingFrame{LeastUnacked: 10}
- p, err := packer.PackPacket(swf, []frames.Frame{}, 0)
+ It("does not pack a packet containing only a STOP_WAITING frame", func() {
+ swf := &wire.StopWaitingFrame{LeastUnacked: 10}
+ packer.QueueControlFrame(swf)
+ p, err := packer.PackPacket()
Expect(p).To(BeNil())
Expect(err).ToNot(HaveOccurred())
})
It("packs a packet if it has queued control frames, but no new control frames", func() {
- packer.controlFrames = []frames.Frame{&frames.BlockedFrame{StreamID: 0}}
- p, err := packer.PackPacket(nil, []frames.Frame{}, 0)
+ packer.controlFrames = []wire.Frame{&wire.BlockedFrame{}}
+ p, err := packer.PackPacket()
Expect(err).ToNot(HaveOccurred())
Expect(p).ToNot(BeNil())
})
- It("adds the version flag to the public header before the crypto handshake is finished", func() {
- packer.perspective = protocol.PerspectiveClient
- packer.cryptoSetup.(*mockCryptoSetup).encLevelSeal = protocol.EncryptionSecure
- packer.controlFrames = []frames.Frame{&frames.BlockedFrame{StreamID: 0}}
- packer.connectionID = 0x1337
- packer.version = 123
- p, err := packer.PackPacket(nil, []frames.Frame{}, 0)
+ It("refuses to send a packet that doesn't contain crypto stream data, if it has never sent a packet before", func() {
+ packer.hasSentPacket = false
+ packer.controlFrames = []wire.Frame{&wire.BlockedFrame{}}
+ p, err := packer.PackPacket()
Expect(err).ToNot(HaveOccurred())
- Expect(p).ToNot(BeNil())
- hdr, err := ParsePublicHeader(bytes.NewReader(p.raw), protocol.PerspectiveClient)
- Expect(err).ToNot(HaveOccurred())
- Expect(hdr.VersionFlag).To(BeTrue())
- Expect(hdr.VersionNumber).To(Equal(packer.version))
- })
-
- It("doesn't add the version flag to the public header for forward-secure packets", func() {
- packer.perspective = protocol.PerspectiveClient
- packer.cryptoSetup.(*mockCryptoSetup).encLevelSeal = protocol.EncryptionForwardSecure
- packer.controlFrames = []frames.Frame{&frames.BlockedFrame{StreamID: 0}}
- packer.connectionID = 0x1337
- p, err := packer.PackPacket(nil, []frames.Frame{}, 0)
- Expect(err).ToNot(HaveOccurred())
- Expect(p).ToNot(BeNil())
- hdr, err := ParsePublicHeader(bytes.NewReader(p.raw), protocol.PerspectiveClient)
- Expect(err).ToNot(HaveOccurred())
- Expect(hdr.VersionFlag).To(BeFalse())
+ Expect(p).To(BeNil())
})
It("packs many control frames into 1 packets", func() {
- f := &frames.AckFrame{LargestAcked: 1}
+ f := &wire.AckFrame{LargestAcked: 1}
b := &bytes.Buffer{}
- f.Write(b, protocol.VersionWhatever)
- maxFramesPerPacket := int(protocol.MaxFrameAndPublicHeaderSize-publicHeaderLen) / b.Len()
- var controlFrames []frames.Frame
+ err := f.Write(b, packer.version)
+ Expect(err).ToNot(HaveOccurred())
+ maxFramesPerPacket := int(maxFrameSize) / b.Len()
+ var controlFrames []wire.Frame
for i := 0; i < maxFramesPerPacket; i++ {
controlFrames = append(controlFrames, f)
}
packer.controlFrames = controlFrames
- payloadFrames, err := packer.composeNextPacket(nil, maxFrameSize)
+ payloadFrames, err := packer.composeNextPacket(maxFrameSize, false)
Expect(err).ToNot(HaveOccurred())
Expect(payloadFrames).To(HaveLen(maxFramesPerPacket))
- payloadFrames, err = packer.composeNextPacket(nil, maxFrameSize)
+ payloadFrames, err = packer.composeNextPacket(maxFrameSize, false)
Expect(err).ToNot(HaveOccurred())
Expect(payloadFrames).To(BeEmpty())
})
It("packs a lot of control frames into 2 packets if they don't fit into one", func() {
- blockedFrame := &frames.BlockedFrame{
- StreamID: 0x1337,
- }
- minLength, _ := blockedFrame.MinLength(0)
- maxFramesPerPacket := int(protocol.MaxFrameAndPublicHeaderSize-publicHeaderLen) / int(minLength)
- var controlFrames []frames.Frame
+ blockedFrame := &wire.BlockedFrame{}
+ minLength, _ := blockedFrame.MinLength(packer.version)
+ maxFramesPerPacket := int(maxFrameSize) / int(minLength)
+ var controlFrames []wire.Frame
for i := 0; i < maxFramesPerPacket+10; i++ {
controlFrames = append(controlFrames, blockedFrame)
}
packer.controlFrames = controlFrames
- payloadFrames, err := packer.composeNextPacket(nil, maxFrameSize)
+ payloadFrames, err := packer.composeNextPacket(maxFrameSize, false)
Expect(err).ToNot(HaveOccurred())
Expect(payloadFrames).To(HaveLen(maxFramesPerPacket))
- payloadFrames, err = packer.composeNextPacket(nil, maxFrameSize)
+ payloadFrames, err = packer.composeNextPacket(maxFrameSize, false)
Expect(err).ToNot(HaveOccurred())
Expect(payloadFrames).To(HaveLen(10))
})
It("only increases the packet number when there is an actual packet to send", func() {
packer.packetNumberGenerator.nextToSkip = 1000
- p, err := packer.PackPacket(nil, []frames.Frame{}, 0)
+ p, err := packer.PackPacket()
Expect(p).To(BeNil())
Expect(err).ToNot(HaveOccurred())
Expect(packer.packetNumberGenerator.Peek()).To(Equal(protocol.PacketNumber(1)))
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
StreamID: 5,
Data: []byte{0xDE, 0xCA, 0xFB, 0xAD},
}
streamFramer.AddFrameForRetransmission(f)
- p, err = packer.PackPacket(nil, []frames.Frame{}, 0)
+ p, err = packer.PackPacket()
Expect(err).ToNot(HaveOccurred())
Expect(p).ToNot(BeNil())
- Expect(p.number).To(Equal(protocol.PacketNumber(1)))
+ Expect(p.header.PacketNumber).To(Equal(protocol.PacketNumber(1)))
Expect(packer.packetNumberGenerator.Peek()).To(Equal(protocol.PacketNumber(2)))
})
- Context("Stream Frame handling", func() {
- It("does not splits a stream frame with maximum size", func() {
- f := &frames.StreamFrame{
+ Context("STREAM Frame handling", func() {
+ It("does not splits a STREAM frame with maximum size, for gQUIC frames", func() {
+ f := &wire.StreamFrame{
Offset: 1,
StreamID: 5,
DataLenPresent: false,
}
- minLength, _ := f.MinLength(0)
+ minLength, _ := f.MinLength(packer.version)
maxStreamFrameDataLen := maxFrameSize - minLength
f.Data = bytes.Repeat([]byte{'f'}, int(maxStreamFrameDataLen))
streamFramer.AddFrameForRetransmission(f)
- payloadFrames, err := packer.composeNextPacket(nil, maxFrameSize)
+ payloadFrames, err := packer.composeNextPacket(maxFrameSize, true)
Expect(err).ToNot(HaveOccurred())
Expect(payloadFrames).To(HaveLen(1))
- Expect(payloadFrames[0].(*frames.StreamFrame).DataLenPresent).To(BeFalse())
- payloadFrames, err = packer.composeNextPacket(nil, maxFrameSize)
+ Expect(payloadFrames[0].(*wire.StreamFrame).DataLenPresent).To(BeFalse())
+ payloadFrames, err = packer.composeNextPacket(maxFrameSize, true)
Expect(err).ToNot(HaveOccurred())
Expect(payloadFrames).To(BeEmpty())
})
- It("correctly handles a stream frame with one byte less than maximum size", func() {
- maxStreamFrameDataLen := protocol.MaxFrameAndPublicHeaderSize - publicHeaderLen - (1 + 1 + 2) - 1
- f1 := &frames.StreamFrame{
+ It("does not splits a STREAM frame with maximum size, for IETF draft style frame", func() {
+ packer.version = versionIETFFrames
+ streamFramer.version = versionIETFFrames
+ f := &wire.StreamFrame{
+ Offset: 1,
+ StreamID: 5,
+ DataLenPresent: true,
+ }
+ minLength, _ := f.MinLength(packer.version)
+ // for IETF draft style STREAM frames, we don't know the size of the DataLen, because it is a variable length integer
+ // in the general case, we therefore use a STREAM frame that is 1 byte smaller than the maximum size
+ maxStreamFrameDataLen := maxFrameSize - minLength - 1
+ f.Data = bytes.Repeat([]byte{'f'}, int(maxStreamFrameDataLen))
+ streamFramer.AddFrameForRetransmission(f)
+ payloadFrames, err := packer.composeNextPacket(maxFrameSize, true)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(payloadFrames).To(HaveLen(1))
+ Expect(payloadFrames[0].(*wire.StreamFrame).DataLenPresent).To(BeFalse())
+ payloadFrames, err = packer.composeNextPacket(maxFrameSize, true)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(payloadFrames).To(BeEmpty())
+ })
+
+ It("correctly handles a STREAM frame with one byte less than maximum size", func() {
+ maxStreamFrameDataLen := maxFrameSize - (1 + 1 + 2) - 1
+ f1 := &wire.StreamFrame{
StreamID: 5,
Offset: 1,
Data: bytes.Repeat([]byte{'f'}, int(maxStreamFrameDataLen)),
}
- f2 := &frames.StreamFrame{
+ f2 := &wire.StreamFrame{
StreamID: 5,
Offset: 1,
Data: []byte("foobar"),
}
streamFramer.AddFrameForRetransmission(f1)
streamFramer.AddFrameForRetransmission(f2)
- p, err := packer.PackPacket(nil, []frames.Frame{}, 0)
+ p, err := packer.PackPacket()
Expect(err).ToNot(HaveOccurred())
Expect(p.raw).To(HaveLen(int(protocol.MaxPacketSize - 1)))
Expect(p.frames).To(HaveLen(1))
- Expect(p.frames[0].(*frames.StreamFrame).DataLenPresent).To(BeFalse())
- p, err = packer.PackPacket(nil, []frames.Frame{}, 0)
+ Expect(p.frames[0].(*wire.StreamFrame).DataLenPresent).To(BeFalse())
+ p, err = packer.PackPacket()
Expect(err).ToNot(HaveOccurred())
Expect(p.frames).To(HaveLen(1))
- Expect(p.frames[0].(*frames.StreamFrame).DataLenPresent).To(BeFalse())
+ Expect(p.frames[0].(*wire.StreamFrame).DataLenPresent).To(BeFalse())
})
- It("packs smaller packets when it is not yet forward-secure", func() {
- packer.isForwardSecure = false
- f := &frames.StreamFrame{
- StreamID: 3,
- Data: bytes.Repeat([]byte{'f'}, int(protocol.MaxPacketSize)),
- }
- streamFramer.AddFrameForRetransmission(f)
- p, err := packer.PackPacket(nil, nil, 0)
- Expect(err).ToNot(HaveOccurred())
- Expect(p.raw).To(HaveLen(int(protocol.MaxPacketSize - protocol.NonForwardSecurePacketSizeReduction)))
- })
-
- It("packs multiple small stream frames into single packet", func() {
- f1 := &frames.StreamFrame{
+ It("packs multiple small STREAM frames into single packet", func() {
+ f1 := &wire.StreamFrame{
StreamID: 5,
Data: []byte{0xDE, 0xCA, 0xFB, 0xAD},
}
- f2 := &frames.StreamFrame{
+ f2 := &wire.StreamFrame{
StreamID: 5,
Data: []byte{0xBE, 0xEF, 0x13, 0x37},
}
- f3 := &frames.StreamFrame{
+ f3 := &wire.StreamFrame{
StreamID: 3,
Data: []byte{0xCA, 0xFE},
}
streamFramer.AddFrameForRetransmission(f1)
streamFramer.AddFrameForRetransmission(f2)
streamFramer.AddFrameForRetransmission(f3)
- p, err := packer.PackPacket(nil, []frames.Frame{}, 0)
+ p, err := packer.PackPacket()
Expect(p).ToNot(BeNil())
Expect(err).ToNot(HaveOccurred())
b := &bytes.Buffer{}
@@ -390,238 +454,270 @@ var _ = Describe("Packet packer", func() {
f2.Write(b, 0)
f3.Write(b, 0)
Expect(p.frames).To(HaveLen(3))
- Expect(p.frames[0].(*frames.StreamFrame).DataLenPresent).To(BeTrue())
- Expect(p.frames[1].(*frames.StreamFrame).DataLenPresent).To(BeTrue())
- Expect(p.frames[2].(*frames.StreamFrame).DataLenPresent).To(BeFalse())
+ Expect(p.frames[0].(*wire.StreamFrame).DataLenPresent).To(BeTrue())
+ Expect(p.frames[1].(*wire.StreamFrame).DataLenPresent).To(BeTrue())
+ Expect(p.frames[2].(*wire.StreamFrame).DataLenPresent).To(BeFalse())
Expect(p.raw).To(ContainSubstring(string(f1.Data)))
Expect(p.raw).To(ContainSubstring(string(f2.Data)))
Expect(p.raw).To(ContainSubstring(string(f3.Data)))
})
- It("splits one stream frame larger than maximum size", func() {
- f := &frames.StreamFrame{
+ It("splits one STREAM frame larger than maximum size", func() {
+ f := &wire.StreamFrame{
StreamID: 7,
Offset: 1,
}
- minLength, _ := f.MinLength(0)
- maxStreamFrameDataLen := protocol.MaxFrameAndPublicHeaderSize - publicHeaderLen - minLength
+ minLength, _ := f.MinLength(packer.version)
+ maxStreamFrameDataLen := maxFrameSize - minLength
f.Data = bytes.Repeat([]byte{'f'}, int(maxStreamFrameDataLen)+200)
streamFramer.AddFrameForRetransmission(f)
- payloadFrames, err := packer.composeNextPacket(nil, maxFrameSize)
+ payloadFrames, err := packer.composeNextPacket(maxFrameSize, true)
Expect(err).ToNot(HaveOccurred())
Expect(payloadFrames).To(HaveLen(1))
- Expect(payloadFrames[0].(*frames.StreamFrame).DataLenPresent).To(BeFalse())
- Expect(payloadFrames[0].(*frames.StreamFrame).Data).To(HaveLen(int(maxStreamFrameDataLen)))
- payloadFrames, err = packer.composeNextPacket(nil, maxFrameSize)
+ Expect(payloadFrames[0].(*wire.StreamFrame).DataLenPresent).To(BeFalse())
+ Expect(payloadFrames[0].(*wire.StreamFrame).Data).To(HaveLen(int(maxStreamFrameDataLen)))
+ payloadFrames, err = packer.composeNextPacket(maxFrameSize, true)
Expect(err).ToNot(HaveOccurred())
Expect(payloadFrames).To(HaveLen(1))
- Expect(payloadFrames[0].(*frames.StreamFrame).Data).To(HaveLen(200))
- Expect(payloadFrames[0].(*frames.StreamFrame).DataLenPresent).To(BeFalse())
- payloadFrames, err = packer.composeNextPacket(nil, maxFrameSize)
+ Expect(payloadFrames[0].(*wire.StreamFrame).Data).To(HaveLen(200))
+ Expect(payloadFrames[0].(*wire.StreamFrame).DataLenPresent).To(BeFalse())
+ payloadFrames, err = packer.composeNextPacket(maxFrameSize, true)
Expect(err).ToNot(HaveOccurred())
Expect(payloadFrames).To(BeEmpty())
})
- It("packs 2 stream frames that are too big for one packet correctly", func() {
- maxStreamFrameDataLen := protocol.MaxFrameAndPublicHeaderSize - publicHeaderLen - (1 + 1 + 2)
- f1 := &frames.StreamFrame{
+ It("packs 2 STREAM frames that are too big for one packet correctly", func() {
+ maxStreamFrameDataLen := maxFrameSize - (1 + 1 + 2)
+ f1 := &wire.StreamFrame{
StreamID: 5,
Data: bytes.Repeat([]byte{'f'}, int(maxStreamFrameDataLen)+100),
Offset: 1,
}
- f2 := &frames.StreamFrame{
+ f2 := &wire.StreamFrame{
StreamID: 5,
Data: bytes.Repeat([]byte{'f'}, int(maxStreamFrameDataLen)+100),
Offset: 1,
}
streamFramer.AddFrameForRetransmission(f1)
streamFramer.AddFrameForRetransmission(f2)
- p, err := packer.PackPacket(nil, []frames.Frame{}, 0)
+ p, err := packer.PackPacket()
Expect(err).ToNot(HaveOccurred())
Expect(p.frames).To(HaveLen(1))
- Expect(p.frames[0].(*frames.StreamFrame).DataLenPresent).To(BeFalse())
+ Expect(p.frames[0].(*wire.StreamFrame).DataLenPresent).To(BeFalse())
Expect(p.raw).To(HaveLen(int(protocol.MaxPacketSize)))
- p, err = packer.PackPacket(nil, []frames.Frame{}, 0)
+ p, err = packer.PackPacket()
Expect(p.frames).To(HaveLen(2))
- Expect(p.frames[0].(*frames.StreamFrame).DataLenPresent).To(BeTrue())
- Expect(p.frames[1].(*frames.StreamFrame).DataLenPresent).To(BeFalse())
+ Expect(p.frames[0].(*wire.StreamFrame).DataLenPresent).To(BeTrue())
+ Expect(p.frames[1].(*wire.StreamFrame).DataLenPresent).To(BeFalse())
Expect(err).ToNot(HaveOccurred())
Expect(p.raw).To(HaveLen(int(protocol.MaxPacketSize)))
- p, err = packer.PackPacket(nil, []frames.Frame{}, 0)
+ p, err = packer.PackPacket()
Expect(p.frames).To(HaveLen(1))
- Expect(p.frames[0].(*frames.StreamFrame).DataLenPresent).To(BeFalse())
+ Expect(p.frames[0].(*wire.StreamFrame).DataLenPresent).To(BeFalse())
Expect(err).ToNot(HaveOccurred())
Expect(p).ToNot(BeNil())
- p, err = packer.PackPacket(nil, []frames.Frame{}, 0)
+ p, err = packer.PackPacket()
Expect(err).ToNot(HaveOccurred())
Expect(p).To(BeNil())
})
- It("packs a packet that has the maximum packet size when given a large enough stream frame", func() {
- f := &frames.StreamFrame{
+ It("packs a packet that has the maximum packet size when given a large enough STREAM frame", func() {
+ f := &wire.StreamFrame{
StreamID: 5,
Offset: 1,
}
- minLength, _ := f.MinLength(0)
- f.Data = bytes.Repeat([]byte{'f'}, int(protocol.MaxFrameAndPublicHeaderSize-publicHeaderLen-minLength+1)) // + 1 since MinceLength is 1 bigger than the actual StreamFrame header
+ minLength, _ := f.MinLength(packer.version)
+ f.Data = bytes.Repeat([]byte{'f'}, int(maxFrameSize-minLength+1)) // + 1 since MinceLength is 1 bigger than the actual StreamFrame header
streamFramer.AddFrameForRetransmission(f)
- p, err := packer.PackPacket(nil, []frames.Frame{}, 0)
+ p, err := packer.PackPacket()
Expect(err).ToNot(HaveOccurred())
Expect(p).ToNot(BeNil())
Expect(p.raw).To(HaveLen(int(protocol.MaxPacketSize)))
})
- It("splits a stream frame larger than the maximum size", func() {
- f := &frames.StreamFrame{
+ It("splits a STREAM frame larger than the maximum size", func() {
+ f := &wire.StreamFrame{
StreamID: 5,
Offset: 1,
}
- minLength, _ := f.MinLength(0)
- f.Data = bytes.Repeat([]byte{'f'}, int(protocol.MaxFrameAndPublicHeaderSize-publicHeaderLen-minLength+2)) // + 2 since MinceLength is 1 bigger than the actual StreamFrame header
+ minLength, _ := f.MinLength(packer.version)
+ f.Data = bytes.Repeat([]byte{'f'}, int(maxFrameSize-minLength+2)) // + 2 since MinceLength is 1 bigger than the actual StreamFrame header
streamFramer.AddFrameForRetransmission(f)
- payloadFrames, err := packer.composeNextPacket(nil, maxFrameSize)
+ payloadFrames, err := packer.composeNextPacket(maxFrameSize, true)
Expect(err).ToNot(HaveOccurred())
Expect(payloadFrames).To(HaveLen(1))
- payloadFrames, err = packer.composeNextPacket(nil, maxFrameSize)
+ payloadFrames, err = packer.composeNextPacket(maxFrameSize, true)
Expect(err).ToNot(HaveOccurred())
Expect(payloadFrames).To(HaveLen(1))
})
It("refuses to send unencrypted stream data on a data stream", func() {
packer.cryptoSetup.(*mockCryptoSetup).encLevelSeal = protocol.EncryptionUnencrypted
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
StreamID: 3,
Data: []byte("foobar"),
}
streamFramer.AddFrameForRetransmission(f)
- _, err := packer.PackPacket(nil, nil, 0)
- Expect(err).To(MatchError(qerr.AttemptToSendUnencryptedStreamData))
+ p, err := packer.PackPacket()
+ Expect(err).NotTo(HaveOccurred())
+ Expect(p).To(BeNil())
})
- It("sends encrypted, non forward-secure, stream data on a data stream", func() {
+ It("sends non forward-secure data as the client", func() {
+ packer.perspective = protocol.PerspectiveClient
packer.cryptoSetup.(*mockCryptoSetup).encLevelSeal = protocol.EncryptionSecure
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
StreamID: 5,
Data: []byte("foobar"),
}
streamFramer.AddFrameForRetransmission(f)
- p, err := packer.PackPacket(nil, nil, 0)
+ p, err := packer.PackPacket()
Expect(err).ToNot(HaveOccurred())
Expect(p.encryptionLevel).To(Equal(protocol.EncryptionSecure))
Expect(p.frames[0]).To(Equal(f))
})
+ It("does not send non forward-secure data as the server", func() {
+ packer.cryptoSetup.(*mockCryptoSetup).encLevelSeal = protocol.EncryptionSecure
+ f := &wire.StreamFrame{
+ StreamID: 5,
+ Data: []byte("foobar"),
+ }
+ streamFramer.AddFrameForRetransmission(f)
+ p, err := packer.PackPacket()
+ Expect(err).ToNot(HaveOccurred())
+ Expect(p).To(BeNil())
+ })
+
It("sends unencrypted stream data on the crypto stream", func() {
- packer.cryptoSetup.(*mockCryptoSetup).encLevelSeal = protocol.EncryptionUnencrypted
- f := &frames.StreamFrame{
- StreamID: 1,
- Data: []byte("foobar"),
- }
- streamFramer.AddFrameForRetransmission(f)
- p, err := packer.PackPacket(nil, nil, 0)
+ packer.cryptoSetup.(*mockCryptoSetup).encLevelSealCrypto = protocol.EncryptionUnencrypted
+ cryptoStream.dataForWriting = []byte("foobar")
+ p, err := packer.PackPacket()
Expect(err).ToNot(HaveOccurred())
Expect(p.encryptionLevel).To(Equal(protocol.EncryptionUnencrypted))
- Expect(p.frames[0]).To(Equal(f))
+ Expect(p.frames).To(HaveLen(1))
+ Expect(p.frames[0]).To(Equal(&wire.StreamFrame{
+ StreamID: packer.version.CryptoStreamID(),
+ Data: []byte("foobar"),
+ }))
})
It("sends encrypted stream data on the crypto stream", func() {
- packer.cryptoSetup.(*mockCryptoSetup).encLevelSeal = protocol.EncryptionSecure
- f := &frames.StreamFrame{
- StreamID: 1,
- Data: []byte("foobar"),
- }
- streamFramer.AddFrameForRetransmission(f)
- p, err := packer.PackPacket(nil, nil, 0)
+ packer.cryptoSetup.(*mockCryptoSetup).encLevelSealCrypto = protocol.EncryptionSecure
+ cryptoStream.dataForWriting = []byte("foobar")
+ p, err := packer.PackPacket()
Expect(err).ToNot(HaveOccurred())
Expect(p.encryptionLevel).To(Equal(protocol.EncryptionSecure))
- Expect(p.frames[0]).To(Equal(f))
+ Expect(p.frames).To(HaveLen(1))
+ Expect(p.frames[0]).To(Equal(&wire.StreamFrame{
+ StreamID: packer.version.CryptoStreamID(),
+ Data: []byte("foobar"),
+ }))
+ })
+
+ It("does not pack stream frames if not allowed", func() {
+ packer.cryptoSetup.(*mockCryptoSetup).encLevelSeal = protocol.EncryptionUnencrypted
+ packer.QueueControlFrame(&wire.AckFrame{})
+ streamFramer.AddFrameForRetransmission(&wire.StreamFrame{StreamID: 3, Data: []byte("foobar")})
+ p, err := packer.PackPacket()
+ Expect(err).ToNot(HaveOccurred())
+ Expect(p.frames).To(HaveLen(1))
+ Expect(func() { _ = p.frames[0].(*wire.AckFrame) }).NotTo(Panic())
})
})
- Context("Blocked frames", func() {
+ Context("BLOCKED frames", func() {
It("queues a BLOCKED frame", func() {
length := 100
- streamFramer.blockedFrameQueue = []*frames.BlockedFrame{{StreamID: 5}}
- f := &frames.StreamFrame{
+ streamFramer.blockedFrameQueue = []wire.Frame{&wire.StreamBlockedFrame{StreamID: 5}}
+ f := &wire.StreamFrame{
StreamID: 5,
Data: bytes.Repeat([]byte{'f'}, length),
}
streamFramer.AddFrameForRetransmission(f)
- _, err := packer.composeNextPacket(nil, maxFrameSize)
+ _, err := packer.composeNextPacket(maxFrameSize, true)
Expect(err).ToNot(HaveOccurred())
- Expect(packer.controlFrames[0]).To(Equal(&frames.BlockedFrame{StreamID: 5}))
+ Expect(packer.controlFrames[0]).To(Equal(&wire.StreamBlockedFrame{StreamID: 5}))
})
It("removes the dataLen attribute from the last StreamFrame, even if it queued a BLOCKED frame", func() {
length := 100
- streamFramer.blockedFrameQueue = []*frames.BlockedFrame{{StreamID: 5}}
- f := &frames.StreamFrame{
+ streamFramer.blockedFrameQueue = []wire.Frame{&wire.StreamBlockedFrame{StreamID: 5}}
+ f := &wire.StreamFrame{
StreamID: 5,
Data: bytes.Repeat([]byte{'f'}, length),
}
streamFramer.AddFrameForRetransmission(f)
- p, err := packer.composeNextPacket(nil, maxFrameSize)
+ p, err := packer.composeNextPacket(maxFrameSize, true)
Expect(err).ToNot(HaveOccurred())
Expect(p).To(HaveLen(1))
- Expect(p[0].(*frames.StreamFrame).DataLenPresent).To(BeFalse())
+ Expect(p[0].(*wire.StreamFrame).DataLenPresent).To(BeFalse())
})
It("packs a connection-level BlockedFrame", func() {
- streamFramer.blockedFrameQueue = []*frames.BlockedFrame{{StreamID: 0}}
- f := &frames.StreamFrame{
+ streamFramer.blockedFrameQueue = []wire.Frame{&wire.BlockedFrame{}}
+ f := &wire.StreamFrame{
StreamID: 5,
Data: []byte("foobar"),
}
streamFramer.AddFrameForRetransmission(f)
- _, err := packer.composeNextPacket(nil, maxFrameSize)
+ _, err := packer.composeNextPacket(maxFrameSize, true)
Expect(err).ToNot(HaveOccurred())
- Expect(packer.controlFrames[0]).To(Equal(&frames.BlockedFrame{StreamID: 0}))
+ Expect(packer.controlFrames[0]).To(Equal(&wire.BlockedFrame{}))
})
})
It("returns nil if we only have a single STOP_WAITING", func() {
- p, err := packer.PackPacket(&frames.StopWaitingFrame{}, nil, 0)
+ packer.QueueControlFrame(&wire.StopWaitingFrame{})
+ p, err := packer.PackPacket()
Expect(err).NotTo(HaveOccurred())
Expect(p).To(BeNil())
})
It("packs a single ACK", func() {
- ack := &frames.AckFrame{LargestAcked: 42}
- p, err := packer.PackPacket(nil, []frames.Frame{ack}, 0)
+ ack := &wire.AckFrame{LargestAcked: 42}
+ packer.QueueControlFrame(ack)
+ p, err := packer.PackPacket()
Expect(err).NotTo(HaveOccurred())
Expect(p).ToNot(BeNil())
Expect(p.frames[0]).To(Equal(ack))
})
It("does not return nil if we only have a single ACK but request it to be sent", func() {
- p, err := packer.PackPacket(nil, []frames.Frame{&frames.AckFrame{}}, 0)
+ ack := &wire.AckFrame{}
+ packer.QueueControlFrame(ack)
+ p, err := packer.PackPacket()
Expect(err).NotTo(HaveOccurred())
Expect(p).ToNot(BeNil())
})
It("queues a control frame to be sent in the next packet", func() {
- wuf := &frames.WindowUpdateFrame{StreamID: 5}
- packer.QueueControlFrameForNextPacket(wuf)
- p, err := packer.PackPacket(nil, nil, 0)
+ msd := &wire.MaxStreamDataFrame{StreamID: 5}
+ packer.QueueControlFrame(msd)
+ p, err := packer.PackPacket()
Expect(err).NotTo(HaveOccurred())
Expect(p.frames).To(HaveLen(1))
- Expect(p.frames[0]).To(Equal(wuf))
+ Expect(p.frames[0]).To(Equal(msd))
})
Context("retransmitting of handshake packets", func() {
- swf := &frames.StopWaitingFrame{LeastUnacked: 1}
- sf := &frames.StreamFrame{
+ swf := &wire.StopWaitingFrame{LeastUnacked: 1}
+ sf := &wire.StreamFrame{
StreamID: 1,
Data: []byte("foobar"),
}
+ BeforeEach(func() {
+ packer.QueueControlFrame(swf)
+ })
+
It("packs a retransmission for a packet sent with no encryption", func() {
packet := &ackhandler.Packet{
EncryptionLevel: protocol.EncryptionUnencrypted,
- Frames: []frames.Frame{sf},
+ Frames: []wire.Frame{sf},
}
- p, err := packer.RetransmitNonForwardSecurePacket(swf, packet)
+ p, err := packer.PackHandshakeRetransmission(packet)
Expect(err).ToNot(HaveOccurred())
Expect(p.frames).To(ContainElement(sf))
Expect(p.frames).To(ContainElement(swf))
@@ -633,9 +729,9 @@ var _ = Describe("Packet packer", func() {
packer.cryptoSetup.(*mockCryptoSetup).divNonce = nonce
packet := &ackhandler.Packet{
EncryptionLevel: protocol.EncryptionSecure,
- Frames: []frames.Frame{sf},
+ Frames: []wire.Frame{sf},
}
- p, err := packer.RetransmitNonForwardSecurePacket(swf, packet)
+ p, err := packer.PackHandshakeRetransmission(packet)
Expect(err).ToNot(HaveOccurred())
Expect(p.frames).To(ContainElement(sf))
Expect(p.frames).To(ContainElement(swf))
@@ -648,73 +744,78 @@ var _ = Describe("Packet packer", func() {
It("includes the diversification nonce on packets sent with initial encryption", func() {
packet := &ackhandler.Packet{
EncryptionLevel: protocol.EncryptionSecure,
- Frames: []frames.Frame{sf},
+ Frames: []wire.Frame{sf},
}
- p, err := packer.RetransmitNonForwardSecurePacket(swf, packet)
+ p, err := packer.PackHandshakeRetransmission(packet)
Expect(err).ToNot(HaveOccurred())
Expect(p.encryptionLevel).To(Equal(protocol.EncryptionSecure))
})
- It("removes non-retransmittable frames", func() {
- wuf := &frames.WindowUpdateFrame{StreamID: 5, ByteOffset: 10}
- packet := &ackhandler.Packet{
- EncryptionLevel: protocol.EncryptionSecure,
- Frames: []frames.Frame{
- sf,
- &frames.StopWaitingFrame{},
- wuf,
- &frames.AckFrame{},
- },
- }
- p, err := packer.RetransmitNonForwardSecurePacket(swf, packet)
- Expect(err).ToNot(HaveOccurred())
- Expect(p.frames).To(HaveLen(3))
- Expect(p.frames).To(ContainElement(sf))
- Expect(p.frames).To(ContainElement(swf))
- Expect(p.frames).To(ContainElement(wuf))
- Expect(p.encryptionLevel).To(Equal(protocol.EncryptionSecure))
- })
-
- It("doesn't pack a packet for a non-retransmittable packet", func() {
- packet := &ackhandler.Packet{
- EncryptionLevel: protocol.EncryptionSecure,
- Frames: []frames.Frame{&frames.AckFrame{}, &frames.StopWaitingFrame{}},
- }
- p, err := packer.RetransmitNonForwardSecurePacket(swf, packet)
- Expect(err).ToNot(HaveOccurred())
- Expect(p).To(BeNil())
- })
-
// this should never happen, since non forward-secure packets are limited to a size smaller than MaxPacketSize, such that it is always possible to retransmit them without splitting the StreamFrame
// (note that the retransmitted packet needs to have enough space for the StopWaitingFrame)
It("refuses to send a packet larger than MaxPacketSize", func() {
packet := &ackhandler.Packet{
EncryptionLevel: protocol.EncryptionSecure,
- Frames: []frames.Frame{
- &frames.StreamFrame{
+ Frames: []wire.Frame{
+ &wire.StreamFrame{
StreamID: 1,
Data: bytes.Repeat([]byte{'f'}, int(protocol.MaxPacketSize-5)),
},
},
}
- _, err := packer.RetransmitNonForwardSecurePacket(swf, packet)
+ _, err := packer.PackHandshakeRetransmission(packet)
Expect(err).To(MatchError("PacketPacker BUG: packet too large"))
})
+ It("pads Initial packets to the required minimum packet size", func() {
+ packer.version = protocol.VersionTLS
+ packer.hasSentPacket = false
+ packer.perspective = protocol.PerspectiveClient
+ packer.cryptoSetup.(*mockCryptoSetup).encLevelSealCrypto = protocol.EncryptionUnencrypted
+ cryptoStream.dataForWriting = []byte("foobar")
+ packet, err := packer.PackPacket()
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.raw).To(HaveLen(protocol.MinInitialPacketSize))
+ Expect(packet.frames).To(HaveLen(1))
+ sf := packet.frames[0].(*wire.StreamFrame)
+ Expect(sf.Data).To(Equal([]byte("foobar")))
+ Expect(sf.DataLenPresent).To(BeTrue())
+ })
+
It("refuses to retransmit packets that were sent with forward-secure encryption", func() {
p := &ackhandler.Packet{
EncryptionLevel: protocol.EncryptionForwardSecure,
}
- _, err := packer.RetransmitNonForwardSecurePacket(nil, p)
+ _, err := packer.PackHandshakeRetransmission(p)
Expect(err).To(MatchError("PacketPacker BUG: forward-secure encrypted handshake packets don't need special treatment"))
})
- It("refuses to retransmit packets without a StopWaitingFrame", func() {
- p := &ackhandler.Packet{
+ It("refuses to retransmit packets without a STOP_WAITING Frame", func() {
+ packer.stopWaiting = nil
+ _, err := packer.PackHandshakeRetransmission(&ackhandler.Packet{
EncryptionLevel: protocol.EncryptionSecure,
- }
- _, err := packer.RetransmitNonForwardSecurePacket(nil, p)
+ })
Expect(err).To(MatchError("PacketPacker BUG: Handshake retransmissions must contain a StopWaitingFrame"))
})
})
+
+ Context("packing ACK packets", func() {
+ It("packs ACK packets", func() {
+ packer.QueueControlFrame(&wire.AckFrame{})
+ p, err := packer.PackAckPacket()
+ Expect(err).NotTo(HaveOccurred())
+ Expect(p.frames).To(Equal([]wire.Frame{&wire.AckFrame{DelayTime: math.MaxInt64}}))
+ })
+
+ It("packs ACK packets with SWFs", func() {
+ packer.QueueControlFrame(&wire.AckFrame{})
+ packer.QueueControlFrame(&wire.StopWaitingFrame{})
+ p, err := packer.PackAckPacket()
+ Expect(err).NotTo(HaveOccurred())
+ Expect(p.frames).To(Equal([]wire.Frame{
+ &wire.AckFrame{DelayTime: math.MaxInt64},
+ &wire.StopWaitingFrame{PacketNumber: 1, PacketNumberLen: 2},
+ }))
+ })
+ })
})
diff --git a/vendor/github.com/lucas-clemente/quic-go/packet_unpacker.go b/vendor/github.com/lucas-clemente/quic-go/packet_unpacker.go
index 30dee80..7291dc2 100644
--- a/vendor/github.com/lucas-clemente/quic-go/packet_unpacker.go
+++ b/vendor/github.com/lucas-clemente/quic-go/packet_unpacker.go
@@ -2,14 +2,18 @@ package quic
import (
"bytes"
- "errors"
"fmt"
- "github.com/lucas-clemente/quic-go/frames"
- "github.com/lucas-clemente/quic-go/protocol"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/wire"
"github.com/lucas-clemente/quic-go/qerr"
)
+type unpackedPacket struct {
+ encryptionLevel protocol.EncryptionLevel
+ frames []wire.Frame
+}
+
type quicAEAD interface {
Open(dst, src []byte, packetNumber protocol.PacketNumber, associatedData []byte) ([]byte, protocol.EncryptionLevel, error)
}
@@ -19,10 +23,10 @@ type packetUnpacker struct {
aead quicAEAD
}
-func (u *packetUnpacker) Unpack(publicHeaderBinary []byte, hdr *PublicHeader, data []byte) (*unpackedPacket, error) {
+func (u *packetUnpacker) Unpack(headerBinary []byte, hdr *wire.Header, data []byte) (*unpackedPacket, error) {
buf := getPacketBuffer()
defer putPacketBuffer(buf)
- decrypted, encryptionLevel, err := u.aead.Open(buf, data, hdr.PacketNumber, publicHeaderBinary)
+ decrypted, encryptionLevel, err := u.aead.Open(buf, data, hdr.PacketNumber, headerBinary)
if err != nil {
// Wrap err in quicError so that public reset is sent by session
return nil, qerr.Error(qerr.DecryptionFailure, err.Error())
@@ -33,7 +37,7 @@ func (u *packetUnpacker) Unpack(publicHeaderBinary []byte, hdr *PublicHeader, da
return nil, qerr.MissingPayload
}
- fs := make([]frames.Frame, 0, 2)
+ fs := make([]wire.Frame, 0, 2)
// Read all frames in the packet
for r.Len() > 0 {
@@ -43,65 +47,15 @@ func (u *packetUnpacker) Unpack(publicHeaderBinary []byte, hdr *PublicHeader, da
}
r.UnreadByte()
- var frame frames.Frame
- if typeByte&0x80 == 0x80 {
- frame, err = frames.ParseStreamFrame(r)
- if err != nil {
- err = qerr.Error(qerr.InvalidStreamData, err.Error())
- } else {
- streamID := frame.(*frames.StreamFrame).StreamID
- if streamID != 1 && encryptionLevel <= protocol.EncryptionUnencrypted {
- err = qerr.Error(qerr.UnencryptedStreamData, fmt.Sprintf("received unencrypted stream data on stream %d", streamID))
- }
- }
- } else if typeByte&0xc0 == 0x40 {
- frame, err = frames.ParseAckFrame(r, u.version)
- if err != nil {
- err = qerr.Error(qerr.InvalidAckData, err.Error())
- }
- } else if typeByte&0xe0 == 0x20 {
- err = errors.New("unimplemented: CONGESTION_FEEDBACK")
- } else {
- switch typeByte {
- case 0x01:
- frame, err = frames.ParseRstStreamFrame(r)
- if err != nil {
- err = qerr.Error(qerr.InvalidRstStreamData, err.Error())
- }
- case 0x02:
- frame, err = frames.ParseConnectionCloseFrame(r)
- if err != nil {
- err = qerr.Error(qerr.InvalidConnectionCloseData, err.Error())
- }
- case 0x03:
- frame, err = frames.ParseGoawayFrame(r)
- if err != nil {
- err = qerr.Error(qerr.InvalidGoawayData, err.Error())
- }
- case 0x04:
- frame, err = frames.ParseWindowUpdateFrame(r)
- if err != nil {
- err = qerr.Error(qerr.InvalidWindowUpdateData, err.Error())
- }
- case 0x05:
- frame, err = frames.ParseBlockedFrame(r)
- if err != nil {
- err = qerr.Error(qerr.InvalidBlockedData, err.Error())
- }
- case 0x06:
- frame, err = frames.ParseStopWaitingFrame(r, hdr.PacketNumber, hdr.PacketNumberLen, u.version)
- if err != nil {
- err = qerr.Error(qerr.InvalidStopWaitingData, err.Error())
- }
- case 0x07:
- frame, err = frames.ParsePingFrame(r)
- default:
- err = qerr.Error(qerr.InvalidFrameData, fmt.Sprintf("unknown type byte 0x%x", typeByte))
- }
- }
+ frame, err := u.parseFrame(r, typeByte, hdr)
if err != nil {
return nil, err
}
+ if sf, ok := frame.(*wire.StreamFrame); ok {
+ if sf.StreamID != u.version.CryptoStreamID() && encryptionLevel <= protocol.EncryptionUnencrypted {
+ return nil, qerr.Error(qerr.UnencryptedStreamData, fmt.Sprintf("received unencrypted stream data on stream %d", sf.StreamID))
+ }
+ }
if frame != nil {
fs = append(fs, frame)
}
@@ -112,3 +66,124 @@ func (u *packetUnpacker) Unpack(publicHeaderBinary []byte, hdr *PublicHeader, da
frames: fs,
}, nil
}
+
+func (u *packetUnpacker) parseFrame(r *bytes.Reader, typeByte byte, hdr *wire.Header) (wire.Frame, error) {
+ if u.version.UsesIETFFrameFormat() {
+ return u.parseIETFFrame(r, typeByte, hdr)
+ }
+ return u.parseGQUICFrame(r, typeByte, hdr)
+}
+
+func (u *packetUnpacker) parseIETFFrame(r *bytes.Reader, typeByte byte, hdr *wire.Header) (wire.Frame, error) {
+ var frame wire.Frame
+ var err error
+ if typeByte&0xf8 == 0x10 {
+ frame, err = wire.ParseStreamFrame(r, u.version)
+ if err != nil {
+ err = qerr.Error(qerr.InvalidStreamData, err.Error())
+ }
+ return frame, err
+ }
+ // TODO: implement all IETF QUIC frame types
+ switch typeByte {
+ case 0x1:
+ frame, err = wire.ParseRstStreamFrame(r, u.version)
+ if err != nil {
+ err = qerr.Error(qerr.InvalidRstStreamData, err.Error())
+ }
+ case 0x2:
+ frame, err = wire.ParseConnectionCloseFrame(r, u.version)
+ if err != nil {
+ err = qerr.Error(qerr.InvalidConnectionCloseData, err.Error())
+ }
+ case 0x4:
+ frame, err = wire.ParseMaxDataFrame(r, u.version)
+ if err != nil {
+ err = qerr.Error(qerr.InvalidWindowUpdateData, err.Error())
+ }
+ case 0x5:
+ frame, err = wire.ParseMaxStreamDataFrame(r, u.version)
+ if err != nil {
+ err = qerr.Error(qerr.InvalidWindowUpdateData, err.Error())
+ }
+ case 0x6:
+ // TODO(#964): remove STOP_WAITING frames
+ // TODO(#878): implement the MAX_STREAM_ID frame
+ frame, err = wire.ParseStopWaitingFrame(r, hdr.PacketNumber, hdr.PacketNumberLen, u.version)
+ if err != nil {
+ err = qerr.Error(qerr.InvalidStopWaitingData, err.Error())
+ }
+ case 0x7:
+ frame, err = wire.ParsePingFrame(r, u.version)
+ case 0x8:
+ frame, err = wire.ParseBlockedFrame(r, u.version)
+ case 0x9:
+ frame, err = wire.ParseStreamBlockedFrame(r, u.version)
+ if err != nil {
+ err = qerr.Error(qerr.InvalidBlockedData, err.Error())
+ }
+ case 0xe:
+ frame, err = wire.ParseAckFrame(r, u.version)
+ if err != nil {
+ err = qerr.Error(qerr.InvalidAckData, err.Error())
+ }
+ default:
+ err = qerr.Error(qerr.InvalidFrameData, fmt.Sprintf("unknown type byte 0x%x", typeByte))
+ }
+ return frame, err
+}
+
+func (u *packetUnpacker) parseGQUICFrame(r *bytes.Reader, typeByte byte, hdr *wire.Header) (wire.Frame, error) {
+ var frame wire.Frame
+ var err error
+ if typeByte&0x80 == 0x80 {
+ frame, err = wire.ParseStreamFrame(r, u.version)
+ if err != nil {
+ err = qerr.Error(qerr.InvalidStreamData, err.Error())
+ }
+ return frame, err
+ } else if typeByte&0xc0 == 0x40 {
+ frame, err = wire.ParseAckFrame(r, u.version)
+ if err != nil {
+ err = qerr.Error(qerr.InvalidAckData, err.Error())
+ }
+ return frame, err
+ }
+ switch typeByte {
+ case 0x1:
+ frame, err = wire.ParseRstStreamFrame(r, u.version)
+ if err != nil {
+ err = qerr.Error(qerr.InvalidRstStreamData, err.Error())
+ }
+ case 0x2:
+ frame, err = wire.ParseConnectionCloseFrame(r, u.version)
+ if err != nil {
+ err = qerr.Error(qerr.InvalidConnectionCloseData, err.Error())
+ }
+ case 0x3:
+ frame, err = wire.ParseGoawayFrame(r, u.version)
+ if err != nil {
+ err = qerr.Error(qerr.InvalidGoawayData, err.Error())
+ }
+ case 0x4:
+ frame, err = wire.ParseWindowUpdateFrame(r, u.version)
+ if err != nil {
+ err = qerr.Error(qerr.InvalidWindowUpdateData, err.Error())
+ }
+ case 0x5:
+ frame, err = wire.ParseBlockedFrameLegacy(r, u.version)
+ if err != nil {
+ err = qerr.Error(qerr.InvalidBlockedData, err.Error())
+ }
+ case 0x6:
+ frame, err = wire.ParseStopWaitingFrame(r, hdr.PacketNumber, hdr.PacketNumberLen, u.version)
+ if err != nil {
+ err = qerr.Error(qerr.InvalidStopWaitingData, err.Error())
+ }
+ case 0x7:
+ frame, err = wire.ParsePingFrame(r, u.version)
+ default:
+ err = qerr.Error(qerr.InvalidFrameData, fmt.Sprintf("unknown type byte 0x%x", typeByte))
+ }
+ return frame, err
+}
diff --git a/vendor/github.com/lucas-clemente/quic-go/packet_unpacker_test.go b/vendor/github.com/lucas-clemente/quic-go/packet_unpacker_test.go
index 90d4d08..91e0656 100644
--- a/vendor/github.com/lucas-clemente/quic-go/packet_unpacker_test.go
+++ b/vendor/github.com/lucas-clemente/quic-go/packet_unpacker_test.go
@@ -3,9 +3,9 @@ package quic
import (
"bytes"
- "github.com/lucas-clemente/quic-go/crypto"
- "github.com/lucas-clemente/quic-go/frames"
- "github.com/lucas-clemente/quic-go/protocol"
+ "github.com/lucas-clemente/quic-go/internal/crypto"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/wire"
"github.com/lucas-clemente/quic-go/qerr"
. "github.com/onsi/ginkgo"
@@ -17,11 +17,15 @@ type mockAEAD struct {
}
func (m *mockAEAD) Open(dst, src []byte, packetNumber protocol.PacketNumber, associatedData []byte) ([]byte, protocol.EncryptionLevel, error) {
- res, err := (&crypto.NullAEAD{}).Open(dst, src, packetNumber, associatedData)
+ nullAEAD, err := crypto.NewNullAEAD(protocol.PerspectiveClient, 0x1337, protocol.VersionWhatever)
+ Expect(err).ToNot(HaveOccurred())
+ res, err := nullAEAD.Open(dst, src, packetNumber, associatedData)
return res, m.encLevelOpen, err
}
func (m *mockAEAD) Seal(dst, src []byte, packetNumber protocol.PacketNumber, associatedData []byte) ([]byte, protocol.EncryptionLevel) {
- return (&crypto.NullAEAD{}).Seal(dst, src, packetNumber, associatedData), protocol.EncryptionUnspecified
+ nullAEAD, err := crypto.NewNullAEAD(protocol.PerspectiveServer, 0x1337, protocol.VersionWhatever)
+ Expect(err).ToNot(HaveOccurred())
+ return nullAEAD.Seal(dst, src, packetNumber, associatedData), protocol.EncryptionUnspecified
}
var _ quicAEAD = &mockAEAD{}
@@ -29,14 +33,14 @@ var _ quicAEAD = &mockAEAD{}
var _ = Describe("Packet unpacker", func() {
var (
unpacker *packetUnpacker
- hdr *PublicHeader
+ hdr *wire.Header
hdrBin []byte
data []byte
buf *bytes.Buffer
)
BeforeEach(func() {
- hdr = &PublicHeader{
+ hdr = &wire.Header{
PacketNumber: 10,
PacketNumberLen: 1,
}
@@ -50,19 +54,16 @@ var _ = Describe("Packet unpacker", func() {
data, _ = unpacker.aead.(*mockAEAD).Seal(nil, p, 0, hdrBin)
}
- It("does not read read a private flag for QUIC Version >= 34", func() {
- f := &frames.ConnectionCloseFrame{ReasonPhrase: "foo"}
- err := f.Write(buf, 0)
- Expect(err).ToNot(HaveOccurred())
- setData(buf.Bytes())
- packet, err := unpacker.Unpack(hdrBin, hdr, data)
- Expect(err).ToNot(HaveOccurred())
- Expect(packet.frames).To(Equal([]frames.Frame{f}))
+ It("errors if the packet doesn't contain any payload", func() {
+ setData(nil)
+ _, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).To(MatchError(qerr.MissingPayload))
})
It("saves the encryption level", func() {
- f := &frames.ConnectionCloseFrame{ReasonPhrase: "foo"}
- err := f.Write(buf, 0)
+ unpacker.version = versionGQUICFrames
+ f := &wire.ConnectionCloseFrame{ReasonPhrase: "foo"}
+ err := f.Write(buf, versionGQUICFrames)
Expect(err).ToNot(HaveOccurred())
setData(buf.Bytes())
unpacker.aead.(*mockAEAD).encLevelOpen = protocol.EncryptionSecure
@@ -71,198 +72,377 @@ var _ = Describe("Packet unpacker", func() {
Expect(packet.encryptionLevel).To(Equal(protocol.EncryptionSecure))
})
- It("unpacks ACK frames", func() {
- unpacker.version = protocol.VersionWhatever
- f := &frames.AckFrame{
- LargestAcked: 0x13,
- LowestAcked: 1,
- }
- err := f.Write(buf, protocol.VersionWhatever)
- Expect(err).ToNot(HaveOccurred())
- setData(buf.Bytes())
- packet, err := unpacker.Unpack(hdrBin, hdr, data)
- Expect(err).ToNot(HaveOccurred())
- Expect(packet.frames).To(HaveLen(1))
- readFrame := packet.frames[0].(*frames.AckFrame)
- Expect(readFrame).ToNot(BeNil())
- Expect(readFrame.LargestAcked).To(Equal(protocol.PacketNumber(0x13)))
- })
-
- It("errors on CONGESTION_FEEDBACK frames", func() {
- setData([]byte{0x20})
- _, err := unpacker.Unpack(hdrBin, hdr, data)
- Expect(err).To(MatchError("unimplemented: CONGESTION_FEEDBACK"))
- })
-
- It("handles PADDING frames", func() {
- setData([]byte{0, 0, 0}) // 3 bytes PADDING
- packet, err := unpacker.Unpack(hdrBin, hdr, data)
- Expect(err).ToNot(HaveOccurred())
- Expect(packet.frames).To(BeEmpty())
- })
-
- It("handles PADDING between two other frames", func() {
- f := &frames.PingFrame{}
- err := f.Write(buf, protocol.VersionWhatever)
- Expect(err).ToNot(HaveOccurred())
- _, err = buf.Write(bytes.Repeat([]byte{0}, 10)) // 10 bytes PADDING
- Expect(err).ToNot(HaveOccurred())
- err = f.Write(buf, protocol.VersionWhatever)
- Expect(err).ToNot(HaveOccurred())
- setData(buf.Bytes())
- packet, err := unpacker.Unpack(hdrBin, hdr, data)
- Expect(err).ToNot(HaveOccurred())
- Expect(packet.frames).To(HaveLen(2))
- })
-
- It("unpacks RST_STREAM frames", func() {
- setData([]byte{0x01, 0xEF, 0xBE, 0xAD, 0xDE, 0x44, 0x33, 0x22, 0x11, 0xAD, 0xFB, 0xCA, 0xDE, 0x34, 0x12, 0x37, 0x13})
- packet, err := unpacker.Unpack(hdrBin, hdr, data)
- Expect(err).ToNot(HaveOccurred())
- Expect(packet.frames).To(Equal([]frames.Frame{
- &frames.RstStreamFrame{
- StreamID: 0xDEADBEEF,
- ByteOffset: 0xDECAFBAD11223344,
- ErrorCode: 0x13371234,
- },
- }))
- })
-
- It("unpacks CONNECTION_CLOSE frames", func() {
- f := &frames.ConnectionCloseFrame{ReasonPhrase: "foo"}
- err := f.Write(buf, 0)
- Expect(err).ToNot(HaveOccurred())
- setData(buf.Bytes())
- packet, err := unpacker.Unpack(hdrBin, hdr, data)
- Expect(err).ToNot(HaveOccurred())
- Expect(packet.frames).To(Equal([]frames.Frame{f}))
- })
-
- It("accepts GOAWAY frames", func() {
- setData([]byte{
- 0x03,
- 0x01, 0x00, 0x00, 0x00,
- 0x02, 0x00, 0x00, 0x00,
- 0x03, 0x00,
- 'f', 'o', 'o',
+ Context("for gQUIC frames", func() {
+ BeforeEach(func() {
+ unpacker.version = versionGQUICFrames
})
- packet, err := unpacker.Unpack(hdrBin, hdr, data)
- Expect(err).ToNot(HaveOccurred())
- Expect(packet.frames).To(Equal([]frames.Frame{
- &frames.GoawayFrame{
+
+ It("handles PADDING frames", func() {
+ setData([]byte{0, 0, 0}) // 3 bytes PADDING
+ packet, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.frames).To(BeEmpty())
+ })
+
+ It("handles PADDING between two other frames", func() {
+ f := &wire.PingFrame{}
+ err := f.Write(buf, versionGQUICFrames)
+ Expect(err).ToNot(HaveOccurred())
+ _, err = buf.Write(bytes.Repeat([]byte{0}, 10)) // 10 bytes PADDING
+ Expect(err).ToNot(HaveOccurred())
+ err = f.Write(buf, versionGQUICFrames)
+ Expect(err).ToNot(HaveOccurred())
+ setData(buf.Bytes())
+ packet, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.frames).To(HaveLen(2))
+ })
+
+ It("unpacks RST_STREAM frames", func() {
+ f := &wire.RstStreamFrame{
+ StreamID: 0xdeadbeef,
+ ByteOffset: 0xdecafbad11223344,
+ ErrorCode: 0x13371234,
+ }
+ err := f.Write(buf, versionGQUICFrames)
+ Expect(err).ToNot(HaveOccurred())
+ setData(buf.Bytes())
+ packet, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.frames).To(Equal([]wire.Frame{f}))
+ })
+
+ It("unpacks CONNECTION_CLOSE frames", func() {
+ f := &wire.ConnectionCloseFrame{ReasonPhrase: "foo"}
+ err := f.Write(buf, versionGQUICFrames)
+ Expect(err).ToNot(HaveOccurred())
+ setData(buf.Bytes())
+ packet, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.frames).To(Equal([]wire.Frame{f}))
+ })
+
+ It("unpacks GOAWAY frames", func() {
+ f := &wire.GoawayFrame{
ErrorCode: 1,
LastGoodStream: 2,
ReasonPhrase: "foo",
- },
- }))
- })
+ }
+ err := f.Write(buf, 0)
+ Expect(err).ToNot(HaveOccurred())
+ setData(buf.Bytes())
+ packet, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.frames).To(Equal([]wire.Frame{f}))
+ })
- It("accepts WINDOW_UPDATE frames", func() {
- setData([]byte{0x04, 0xEF, 0xBE, 0xAD, 0xDE, 0x37, 0x13, 0, 0, 0, 0, 0xFE, 0xCA})
- packet, err := unpacker.Unpack(hdrBin, hdr, data)
- Expect(err).ToNot(HaveOccurred())
- Expect(packet.frames).To(Equal([]frames.Frame{
- &frames.WindowUpdateFrame{
- StreamID: 0xDEADBEEF,
- ByteOffset: 0xCAFE000000001337,
- },
- }))
- })
+ It("unpacks a stream-level WINDOW_UPDATE frame", func() {
+ f := &wire.MaxStreamDataFrame{
+ StreamID: 0xdeadbeef,
+ ByteOffset: 0xcafe000000001337,
+ }
+ buf := &bytes.Buffer{}
+ err := f.Write(buf, versionGQUICFrames)
+ Expect(err).ToNot(HaveOccurred())
+ setData(buf.Bytes())
+ packet, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.frames).To(Equal([]wire.Frame{f}))
+ })
- It("accepts BLOCKED frames", func() {
- setData([]byte{0x05, 0xEF, 0xBE, 0xAD, 0xDE})
- packet, err := unpacker.Unpack(hdrBin, hdr, data)
- Expect(err).ToNot(HaveOccurred())
- Expect(packet.frames).To(Equal([]frames.Frame{
- &frames.BlockedFrame{
- StreamID: 0xDEADBEEF,
- },
- }))
- })
+ It("unpacks a connection-level WINDOW_UPDATE frame", func() {
+ f := &wire.MaxDataFrame{
+ ByteOffset: 0xcafe000000001337,
+ }
+ buf := &bytes.Buffer{}
+ err := f.Write(buf, versionGQUICFrames)
+ Expect(err).ToNot(HaveOccurred())
+ setData(buf.Bytes())
+ packet, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.frames).To(Equal([]wire.Frame{f}))
+ })
- It("unpacks STOP_WAITING frames", func() {
- setData([]byte{0x06, 0x03})
- packet, err := unpacker.Unpack(hdrBin, hdr, data)
- Expect(err).ToNot(HaveOccurred())
- Expect(packet.frames).To(Equal([]frames.Frame{
- &frames.StopWaitingFrame{
- LeastUnacked: 7,
- },
- }))
- })
+ It("unpacks connection-level BLOCKED frames", func() {
+ f := &wire.BlockedFrame{}
+ buf := &bytes.Buffer{}
+ err := f.Write(buf, versionGQUICFrames)
+ Expect(err).ToNot(HaveOccurred())
+ setData(buf.Bytes())
+ packet, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.frames).To(Equal([]wire.Frame{f}))
+ })
- It("accepts PING frames", func() {
- setData([]byte{0x07})
- packet, err := unpacker.Unpack(hdrBin, hdr, data)
- Expect(err).ToNot(HaveOccurred())
- Expect(packet.frames).To(Equal([]frames.Frame{
- &frames.PingFrame{},
- }))
- })
+ It("unpacks stream-level BLOCKED frames", func() {
+ f := &wire.StreamBlockedFrame{StreamID: 0xdeadbeef}
+ buf := &bytes.Buffer{}
+ err := f.Write(buf, versionGQUICFrames)
+ Expect(err).ToNot(HaveOccurred())
+ setData(buf.Bytes())
+ packet, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.frames).To(Equal([]wire.Frame{f}))
+ })
- It("errors on invalid type", func() {
- setData([]byte{0x08})
- _, err := unpacker.Unpack(hdrBin, hdr, data)
- Expect(err).To(MatchError("InvalidFrameData: unknown type byte 0x8"))
- })
+ It("unpacks STOP_WAITING frames", func() {
+ setData([]byte{0x06, 0x03})
+ packet, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.frames).To(Equal([]wire.Frame{
+ &wire.StopWaitingFrame{LeastUnacked: 7},
+ }))
+ })
- It("errors on invalid frames", func() {
- for b, e := range map[byte]qerr.ErrorCode{
- 0x80: qerr.InvalidStreamData,
- 0x40: qerr.InvalidAckData,
- 0x01: qerr.InvalidRstStreamData,
- 0x02: qerr.InvalidConnectionCloseData,
- 0x03: qerr.InvalidGoawayData,
- 0x04: qerr.InvalidWindowUpdateData,
- 0x05: qerr.InvalidBlockedData,
- 0x06: qerr.InvalidStopWaitingData,
- } {
- setData([]byte{b})
+ It("unpacks PING frames", func() {
+ setData([]byte{0x07})
+ packet, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.frames).To(Equal([]wire.Frame{
+ &wire.PingFrame{},
+ }))
+ })
+
+ It("errors on invalid type", func() {
+ setData([]byte{0xf})
_, err := unpacker.Unpack(hdrBin, hdr, data)
- Expect(err.(*qerr.QuicError).ErrorCode).To(Equal(e))
- }
+ Expect(err).To(MatchError("InvalidFrameData: unknown type byte 0xf"))
+ })
+
+ It("errors on invalid frames", func() {
+ for b, e := range map[byte]qerr.ErrorCode{
+ 0x80: qerr.InvalidStreamData,
+ 0x40: qerr.InvalidAckData,
+ 0x01: qerr.InvalidRstStreamData,
+ 0x02: qerr.InvalidConnectionCloseData,
+ 0x03: qerr.InvalidGoawayData,
+ 0x04: qerr.InvalidWindowUpdateData,
+ 0x05: qerr.InvalidBlockedData,
+ 0x06: qerr.InvalidStopWaitingData,
+ } {
+ setData([]byte{b})
+ _, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err.(*qerr.QuicError).ErrorCode).To(Equal(e))
+ }
+ })
+
+ It("unpacks ACK frames", func() {
+ f := &wire.AckFrame{
+ LargestAcked: 0x13,
+ LowestAcked: 1,
+ }
+ err := f.Write(buf, versionGQUICFrames)
+ Expect(err).ToNot(HaveOccurred())
+ setData(buf.Bytes())
+ packet, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.frames).To(HaveLen(1))
+ readFrame := packet.frames[0].(*wire.AckFrame)
+ Expect(readFrame).ToNot(BeNil())
+ Expect(readFrame.LargestAcked).To(Equal(protocol.PacketNumber(0x13)))
+ })
+
+ Context("unpacking STREAM frames", func() {
+ It("unpacks unencrypted STREAM frames on the crypto stream", func() {
+ unpacker.aead.(*mockAEAD).encLevelOpen = protocol.EncryptionUnencrypted
+ f := &wire.StreamFrame{
+ StreamID: versionGQUICFrames.CryptoStreamID(),
+ Data: []byte("foobar"),
+ }
+ err := f.Write(buf, versionGQUICFrames)
+ Expect(err).ToNot(HaveOccurred())
+ setData(buf.Bytes())
+ packet, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.frames).To(Equal([]wire.Frame{f}))
+ })
+
+ It("unpacks encrypted STREAM frames on the crypto stream", func() {
+ unpacker.aead.(*mockAEAD).encLevelOpen = protocol.EncryptionSecure
+ f := &wire.StreamFrame{
+ StreamID: versionGQUICFrames.CryptoStreamID(),
+ Data: []byte("foobar"),
+ }
+ err := f.Write(buf, versionGQUICFrames)
+ Expect(err).ToNot(HaveOccurred())
+ setData(buf.Bytes())
+ packet, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.frames).To(Equal([]wire.Frame{f}))
+ })
+
+ It("does not unpack unencrypted STREAM frames on higher streams", func() {
+ unpacker.aead.(*mockAEAD).encLevelOpen = protocol.EncryptionUnencrypted
+ f := &wire.StreamFrame{
+ StreamID: 3,
+ Data: []byte("foobar"),
+ }
+ err := f.Write(buf, versionGQUICFrames)
+ Expect(err).ToNot(HaveOccurred())
+ setData(buf.Bytes())
+ _, err = unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).To(MatchError(qerr.Error(qerr.UnencryptedStreamData, "received unencrypted stream data on stream 3")))
+ })
+ })
})
- Context("unpacking STREAM frames", func() {
- It("unpacks unencrypted STREAM frames on stream 1", func() {
- unpacker.aead.(*mockAEAD).encLevelOpen = protocol.EncryptionUnencrypted
- f := &frames.StreamFrame{
- StreamID: 1,
- Data: []byte("foobar"),
+ Context("for IETF draft frames", func() {
+ BeforeEach(func() {
+ unpacker.version = versionIETFFrames
+ })
+
+ It("unpacks RST_STREAM frames", func() {
+ f := &wire.RstStreamFrame{
+ StreamID: 0xdeadbeef,
+ ByteOffset: 0xdecafbad1234,
+ ErrorCode: 0x1337,
}
- err := f.Write(buf, 0)
+ err := f.Write(buf, versionIETFFrames)
Expect(err).ToNot(HaveOccurred())
setData(buf.Bytes())
packet, err := unpacker.Unpack(hdrBin, hdr, data)
Expect(err).ToNot(HaveOccurred())
- Expect(packet.frames).To(Equal([]frames.Frame{f}))
+ Expect(packet.frames).To(Equal([]wire.Frame{f}))
})
- It("unpacks encrypted STREAM frames on stream 1", func() {
- unpacker.aead.(*mockAEAD).encLevelOpen = protocol.EncryptionSecure
- f := &frames.StreamFrame{
- StreamID: 1,
- Data: []byte("foobar"),
- }
- err := f.Write(buf, 0)
+ It("unpacks CONNECTION_CLOSE frames", func() {
+ f := &wire.ConnectionCloseFrame{ReasonPhrase: "foo"}
+ err := f.Write(buf, versionIETFFrames)
Expect(err).ToNot(HaveOccurred())
setData(buf.Bytes())
packet, err := unpacker.Unpack(hdrBin, hdr, data)
Expect(err).ToNot(HaveOccurred())
- Expect(packet.frames).To(Equal([]frames.Frame{f}))
+ Expect(packet.frames).To(Equal([]wire.Frame{f}))
})
- It("does not unpack unencrypted STREAM frames on higher streams", func() {
- unpacker.aead.(*mockAEAD).encLevelOpen = protocol.EncryptionUnencrypted
- f := &frames.StreamFrame{
- StreamID: 3,
- Data: []byte("foobar"),
+ It("unpacks MAX_DATA frames", func() {
+ f := &wire.MaxDataFrame{
+ ByteOffset: 0xcafe,
}
- err := f.Write(buf, 0)
+ buf := &bytes.Buffer{}
+ err := f.Write(buf, versionIETFFrames)
Expect(err).ToNot(HaveOccurred())
setData(buf.Bytes())
- _, err = unpacker.Unpack(hdrBin, hdr, data)
- Expect(err).To(MatchError(qerr.Error(qerr.UnencryptedStreamData, "received unencrypted stream data on stream 3")))
+ packet, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.frames).To(Equal([]wire.Frame{f}))
+ })
+
+ It("unpacks MAX_STREAM_DATA frames", func() {
+ f := &wire.MaxStreamDataFrame{
+ StreamID: 0xdeadbeef,
+ ByteOffset: 0xdecafbad,
+ }
+ buf := &bytes.Buffer{}
+ err := f.Write(buf, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ setData(buf.Bytes())
+ packet, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.frames).To(Equal([]wire.Frame{f}))
+ })
+
+ It("unpacks connection-level BLOCKED frames", func() {
+ f := &wire.BlockedFrame{}
+ buf := &bytes.Buffer{}
+ err := f.Write(buf, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ setData(buf.Bytes())
+ packet, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.frames).To(Equal([]wire.Frame{f}))
+ })
+
+ It("unpacks stream-level BLOCKED frames", func() {
+ f := &wire.StreamBlockedFrame{StreamID: 0xdeadbeef}
+ buf := &bytes.Buffer{}
+ err := f.Write(buf, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ setData(buf.Bytes())
+ packet, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.frames).To(Equal([]wire.Frame{f}))
+ })
+
+ It("unpacks ACK frames", func() {
+ f := &wire.AckFrame{
+ LargestAcked: 0x13,
+ LowestAcked: 1,
+ }
+ err := f.Write(buf, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ setData(buf.Bytes())
+ packet, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.frames).To(HaveLen(1))
+ readFrame := packet.frames[0].(*wire.AckFrame)
+ Expect(readFrame).ToNot(BeNil())
+ Expect(readFrame.LargestAcked).To(Equal(protocol.PacketNumber(0x13)))
+ })
+
+ It("errors on invalid type", func() {
+ setData([]byte{0xf})
+ _, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).To(MatchError("InvalidFrameData: unknown type byte 0xf"))
+ })
+
+ It("errors on invalid frames", func() {
+ for b, e := range map[byte]qerr.ErrorCode{
+ 0x01: qerr.InvalidRstStreamData,
+ 0x02: qerr.InvalidConnectionCloseData,
+ 0x04: qerr.InvalidWindowUpdateData,
+ 0x05: qerr.InvalidWindowUpdateData,
+ 0x09: qerr.InvalidBlockedData,
+ 0x10: qerr.InvalidStreamData,
+ 0xe: qerr.InvalidAckData,
+ } {
+ setData([]byte{b})
+ _, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err.(*qerr.QuicError).ErrorCode).To(Equal(e))
+ }
+ })
+
+ Context("unpacking STREAM frames", func() {
+ It("unpacks unencrypted STREAM frames on the crypto stream", func() {
+ unpacker.aead.(*mockAEAD).encLevelOpen = protocol.EncryptionUnencrypted
+ f := &wire.StreamFrame{
+ StreamID: versionIETFFrames.CryptoStreamID(),
+ Data: []byte("foobar"),
+ }
+ err := f.Write(buf, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ setData(buf.Bytes())
+ packet, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.frames).To(Equal([]wire.Frame{f}))
+ })
+
+ It("unpacks encrypted STREAM frames on the crypto stream", func() {
+ unpacker.aead.(*mockAEAD).encLevelOpen = protocol.EncryptionSecure
+ f := &wire.StreamFrame{
+ StreamID: versionIETFFrames.CryptoStreamID(),
+ Data: []byte("foobar"),
+ }
+ err := f.Write(buf, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ setData(buf.Bytes())
+ packet, err := unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.frames).To(Equal([]wire.Frame{f}))
+ })
+
+ It("does not unpack unencrypted STREAM frames on higher streams", func() {
+ unpacker.aead.(*mockAEAD).encLevelOpen = protocol.EncryptionUnencrypted
+ f := &wire.StreamFrame{
+ StreamID: 3,
+ Data: []byte("foobar"),
+ }
+ err := f.Write(buf, versionIETFFrames)
+ Expect(err).ToNot(HaveOccurred())
+ setData(buf.Bytes())
+ _, err = unpacker.Unpack(hdrBin, hdr, data)
+ Expect(err).To(MatchError(qerr.Error(qerr.UnencryptedStreamData, "received unencrypted stream data on stream 3")))
+ })
})
})
})
diff --git a/vendor/github.com/lucas-clemente/quic-go/protocol/version.go b/vendor/github.com/lucas-clemente/quic-go/protocol/version.go
deleted file mode 100644
index d5c0dac..0000000
--- a/vendor/github.com/lucas-clemente/quic-go/protocol/version.go
+++ /dev/null
@@ -1,90 +0,0 @@
-package protocol
-
-import (
- "bytes"
- "encoding/binary"
- "strconv"
-)
-
-// VersionNumber is a version number as int
-type VersionNumber int
-
-// The version numbers, making grepping easier
-const (
- Version35 VersionNumber = 35 + iota
- Version36
- VersionWhatever = 0 // for when the version doesn't matter
- VersionUnsupported = -1
-)
-
-// SupportedVersions lists the versions that the server supports
-// must be in sorted order
-var SupportedVersions = []VersionNumber{
- Version35, Version36,
-}
-
-// SupportedVersionsAsTags is needed for the SHLO crypto message
-var SupportedVersionsAsTags []byte
-
-// SupportedVersionsAsString is needed for the Alt-Scv HTTP header
-var SupportedVersionsAsString string
-
-// VersionNumberToTag maps version numbers ('32') to tags ('Q032')
-func VersionNumberToTag(vn VersionNumber) uint32 {
- v := uint32(vn)
- return 'Q' + ((v/100%10)+'0')<<8 + ((v/10%10)+'0')<<16 + ((v%10)+'0')<<24
-}
-
-// VersionTagToNumber is built from VersionNumberToTag in init()
-func VersionTagToNumber(v uint32) VersionNumber {
- return VersionNumber(((v>>8)&0xff-'0')*100 + ((v>>16)&0xff-'0')*10 + ((v>>24)&0xff - '0'))
-}
-
-// IsSupportedVersion returns true if the server supports this version
-func IsSupportedVersion(v VersionNumber) bool {
- for _, t := range SupportedVersions {
- if t == v {
- return true
- }
- }
- return false
-}
-
-// HighestSupportedVersion finds the highest version number that is both present in other and in SupportedVersions
-// the versions in other do not need to be ordered
-// it returns true and the version number, if there is one, otherwise false
-func HighestSupportedVersion(other []VersionNumber) (bool, VersionNumber) {
- var otherSupported []VersionNumber
- for _, ver := range other {
- if ver != VersionUnsupported {
- otherSupported = append(otherSupported, ver)
- }
- }
-
- for i := len(SupportedVersions) - 1; i >= 0; i-- {
- for _, ver := range otherSupported {
- if ver == SupportedVersions[i] {
- return true, ver
- }
- }
- }
-
- return false, 0
-}
-
-func init() {
- var b bytes.Buffer
- for _, v := range SupportedVersions {
- s := make([]byte, 4)
- binary.LittleEndian.PutUint32(s, VersionNumberToTag(v))
- b.Write(s)
- }
- SupportedVersionsAsTags = b.Bytes()
-
- for i := len(SupportedVersions) - 1; i >= 0; i-- {
- SupportedVersionsAsString += strconv.Itoa(int(SupportedVersions[i]))
- if i != 0 {
- SupportedVersionsAsString += ","
- }
- }
-}
diff --git a/vendor/github.com/lucas-clemente/quic-go/protocol/version_test.go b/vendor/github.com/lucas-clemente/quic-go/protocol/version_test.go
deleted file mode 100644
index 3d3095f..0000000
--- a/vendor/github.com/lucas-clemente/quic-go/protocol/version_test.go
+++ /dev/null
@@ -1,72 +0,0 @@
-package protocol
-
-import (
- . "github.com/onsi/ginkgo"
- . "github.com/onsi/gomega"
-)
-
-var _ = Describe("Version", func() {
- It("converts tags to numbers", func() {
- Expect(VersionTagToNumber('Q' + '1'<<8 + '2'<<16 + '3'<<24)).To(Equal(VersionNumber(123)))
- })
-
- It("converts number to tag", func() {
- Expect(VersionNumberToTag(VersionNumber(123))).To(Equal(uint32('Q' + '1'<<8 + '2'<<16 + '3'<<24)))
- })
-
- It("has proper tag list", func() {
- Expect(SupportedVersionsAsTags).To(Equal([]byte("Q035Q036")))
- })
-
- It("has proper version list", func() {
- Expect(SupportedVersionsAsString).To(Equal("36,35"))
- })
-
- It("recognizes supported versions", func() {
- Expect(IsSupportedVersion(0)).To(BeFalse())
- Expect(IsSupportedVersion(SupportedVersions[0])).To(BeTrue())
- })
-
- It("has supported versions in sorted order", func() {
- for i := 0; i < len(SupportedVersions)-1; i++ {
- Expect(SupportedVersions[i]).To(BeNumerically("<", SupportedVersions[i+1]))
- }
- })
-
- Context("highest supported version", func() {
- var initialSupportedVersions []VersionNumber
-
- BeforeEach(func() {
- initialSupportedVersions = make([]VersionNumber, len(SupportedVersions))
- copy(initialSupportedVersions, SupportedVersions)
- })
-
- AfterEach(func() {
- SupportedVersions = initialSupportedVersions
- })
-
- It("finds the supported version", func() {
- SupportedVersions = []VersionNumber{1, 2, 3}
- other := []VersionNumber{3, 4, 5, 6}
- found, ver := HighestSupportedVersion(other)
- Expect(found).To(BeTrue())
- Expect(ver).To(Equal(VersionNumber(3)))
- })
-
- It("picks the highest supported version", func() {
- SupportedVersions = []VersionNumber{1, 2, 3, 6, 7}
- other := []VersionNumber{3, 6, 1, 8, 2, 10}
- found, ver := HighestSupportedVersion(other)
- Expect(found).To(BeTrue())
- Expect(ver).To(Equal(VersionNumber(6)))
- })
-
- It("handles empty inputs", func() {
- SupportedVersions = []VersionNumber{101, 102}
- Expect(HighestSupportedVersion([]VersionNumber{})).To(BeFalse())
- SupportedVersions = []VersionNumber{}
- Expect(HighestSupportedVersion([]VersionNumber{1, 2})).To(BeFalse())
- Expect(HighestSupportedVersion([]VersionNumber{})).To(BeFalse())
- })
- })
-})
diff --git a/vendor/github.com/lucas-clemente/quic-go/public_header_test.go b/vendor/github.com/lucas-clemente/quic-go/public_header_test.go
deleted file mode 100644
index d728900..0000000
--- a/vendor/github.com/lucas-clemente/quic-go/public_header_test.go
+++ /dev/null
@@ -1,484 +0,0 @@
-package quic
-
-import (
- "bytes"
- "encoding/binary"
-
- "github.com/lucas-clemente/quic-go/protocol"
- "github.com/lucas-clemente/quic-go/qerr"
- . "github.com/onsi/ginkgo"
- . "github.com/onsi/gomega"
-)
-
-var _ = Describe("Public Header", func() {
- Context("when parsing", func() {
- It("accepts a sample client header", func() {
- b := bytes.NewReader([]byte{0x09, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c, 0x51, 0x30, 0x33, 0x34, 0x01})
- hdr, err := ParsePublicHeader(b, protocol.PerspectiveClient)
- Expect(err).ToNot(HaveOccurred())
- Expect(hdr.VersionFlag).To(BeTrue())
- Expect(hdr.ResetFlag).To(BeFalse())
- Expect(hdr.ConnectionID).To(Equal(protocol.ConnectionID(0x4cfa9f9b668619f6)))
- Expect(hdr.VersionNumber).To(Equal(protocol.VersionNumber(34)))
- Expect(hdr.SupportedVersions).To(BeEmpty())
- Expect(hdr.PacketNumber).To(Equal(protocol.PacketNumber(1)))
- Expect(b.Len()).To(BeZero())
- })
-
- It("does not accept truncated connection ID as a server", func() {
- b := bytes.NewReader([]byte{0x00, 0x01})
- _, err := ParsePublicHeader(b, protocol.PerspectiveClient)
- Expect(err).To(MatchError(errReceivedTruncatedConnectionID))
- })
-
- It("accepts a truncated connection ID as a client", func() {
- b := bytes.NewReader([]byte{0x00, 0x01})
- hdr, err := ParsePublicHeader(b, protocol.PerspectiveServer)
- Expect(err).ToNot(HaveOccurred())
- Expect(hdr.TruncateConnectionID).To(BeTrue())
- Expect(hdr.ConnectionID).To(BeZero())
- Expect(b.Len()).To(BeZero())
- })
-
- It("rejects 0 as a connection ID", func() {
- b := bytes.NewReader([]byte{0x09, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x51, 0x30, 0x33, 0x30, 0x01})
- _, err := ParsePublicHeader(b, protocol.PerspectiveClient)
- Expect(err).To(MatchError(errInvalidConnectionID))
- })
-
- It("reads a PublicReset packet", func() {
- b := bytes.NewReader([]byte{0xa, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8})
- hdr, err := ParsePublicHeader(b, protocol.PerspectiveServer)
- Expect(err).ToNot(HaveOccurred())
- Expect(hdr.ResetFlag).To(BeTrue())
- Expect(hdr.ConnectionID).ToNot(BeZero())
- })
-
- It("parses a public reset packet", func() {
- b := bytes.NewReader([]byte{0xa, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08})
- hdr, err := ParsePublicHeader(b, protocol.PerspectiveServer)
- Expect(err).ToNot(HaveOccurred())
- Expect(hdr.ResetFlag).To(BeTrue())
- Expect(hdr.VersionFlag).To(BeFalse())
- Expect(hdr.ConnectionID).To(Equal(protocol.ConnectionID(0x0807060504030201)))
- })
-
- It("reads a diversification nonce sent by the server", func() {
- divNonce := []byte{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f}
- Expect(divNonce).To(HaveLen(32))
- b := bytes.NewReader(append(append([]byte{0x0c, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c}, divNonce...), 0x37))
- hdr, err := ParsePublicHeader(b, protocol.PerspectiveServer)
- Expect(err).ToNot(HaveOccurred())
- Expect(hdr.ConnectionID).To(Not(BeZero()))
- Expect(hdr.DiversificationNonce).To(Equal(divNonce))
- Expect(hdr.PacketNumber).To(Equal(protocol.PacketNumber(0x37)))
- Expect(b.Len()).To(BeZero())
- })
-
- PIt("rejects diversification nonces sent by the client", func() {
- b := bytes.NewReader([]byte{0x0c, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c,
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1,
- 0x01,
- })
- _, err := ParsePublicHeader(b, protocol.PerspectiveClient)
- Expect(err).To(MatchError("diversification nonces should only be sent by servers"))
- })
-
- Context("version negotiation packets", func() {
- appendVersion := func(data []byte, v protocol.VersionNumber) []byte {
- data = append(data, []byte{0, 0, 0, 0}...)
- binary.LittleEndian.PutUint32(data[len(data)-4:], protocol.VersionNumberToTag(v))
- return data
- }
-
- It("parses version negotiation packets sent by the server", func() {
- b := bytes.NewReader(composeVersionNegotiation(0x1337))
- hdr, err := ParsePublicHeader(b, protocol.PerspectiveServer)
- Expect(err).ToNot(HaveOccurred())
- Expect(hdr.VersionFlag).To(BeTrue())
- Expect(hdr.VersionNumber).To(BeZero()) // unitialized
- Expect(hdr.SupportedVersions).To(Equal(protocol.SupportedVersions))
- Expect(b.Len()).To(BeZero())
- })
-
- It("parses a version negotiation packet that contains 0 versions", func() {
- b := bytes.NewReader([]byte{0x9, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c})
- hdr, err := ParsePublicHeader(b, protocol.PerspectiveServer)
- Expect(err).ToNot(HaveOccurred())
- Expect(hdr.VersionFlag).To(BeTrue())
- Expect(hdr.VersionNumber).To(BeZero()) // unitialized
- Expect(hdr.SupportedVersions).To(BeEmpty())
- Expect(b.Len()).To(BeZero())
- })
-
- It("sets version numbers to unsupported, if we don't support them", func() {
- data := []byte{0x9, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c}
- data = appendVersion(data, 1) // unsupported version
- data = appendVersion(data, protocol.SupportedVersions[0])
- data = appendVersion(data, 1337) // unsupported version
- b := bytes.NewReader(data)
- hdr, err := ParsePublicHeader(b, protocol.PerspectiveServer)
- Expect(err).ToNot(HaveOccurred())
- Expect(hdr.VersionFlag).To(BeTrue())
- Expect(hdr.SupportedVersions).To(Equal([]protocol.VersionNumber{protocol.VersionUnsupported, protocol.SupportedVersions[0], protocol.VersionUnsupported}))
- Expect(b.Len()).To(BeZero())
- })
-
- It("errors on invalid version tags", func() {
- data := composeVersionNegotiation(0x1337)
- data = append(data, []byte{0x13, 0x37}...)
- b := bytes.NewReader(data)
- _, err := ParsePublicHeader(b, protocol.PerspectiveServer)
- Expect(err).To(MatchError(qerr.InvalidVersionNegotiationPacket))
- })
- })
-
- Context("Packet Number lengths", func() {
- It("accepts 1-byte packet numbers", func() {
- b := bytes.NewReader([]byte{0x08, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c, 0xde})
- hdr, err := ParsePublicHeader(b, protocol.PerspectiveClient)
- Expect(err).ToNot(HaveOccurred())
- Expect(hdr.PacketNumber).To(Equal(protocol.PacketNumber(0xde)))
- Expect(b.Len()).To(BeZero())
- })
-
- It("accepts 2-byte packet numbers", func() {
- b := bytes.NewReader([]byte{0x18, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c, 0xde, 0xca})
- hdr, err := ParsePublicHeader(b, protocol.PerspectiveClient)
- Expect(err).ToNot(HaveOccurred())
- Expect(hdr.PacketNumber).To(Equal(protocol.PacketNumber(0xcade)))
- Expect(b.Len()).To(BeZero())
- })
-
- It("accepts 4-byte packet numbers", func() {
- b := bytes.NewReader([]byte{0x28, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c, 0xad, 0xfb, 0xca, 0xde})
- hdr, err := ParsePublicHeader(b, protocol.PerspectiveClient)
- Expect(err).ToNot(HaveOccurred())
- Expect(hdr.PacketNumber).To(Equal(protocol.PacketNumber(0xdecafbad)))
- Expect(b.Len()).To(BeZero())
- })
-
- It("accepts 6-byte packet numbers", func() {
- b := bytes.NewReader([]byte{0x38, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c, 0x23, 0x42, 0xad, 0xfb, 0xca, 0xde})
- hdr, err := ParsePublicHeader(b, protocol.PerspectiveClient)
- Expect(err).ToNot(HaveOccurred())
- Expect(hdr.PacketNumber).To(Equal(protocol.PacketNumber(0xdecafbad4223)))
- Expect(b.Len()).To(BeZero())
- })
- })
- })
-
- Context("when writing", func() {
- It("writes a sample header as a server", func() {
- b := &bytes.Buffer{}
- hdr := PublicHeader{
- ConnectionID: 0x4cfa9f9b668619f6,
- PacketNumber: 2,
- PacketNumberLen: protocol.PacketNumberLen6,
- }
- err := hdr.Write(b, protocol.Version35, protocol.PerspectiveServer)
- Expect(err).ToNot(HaveOccurred())
- Expect(b.Bytes()).To(Equal([]byte{0x38, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c, 2, 0, 0, 0, 0, 0}))
- })
-
- It("writes a sample header as a client", func() {
- b := &bytes.Buffer{}
- hdr := PublicHeader{
- ConnectionID: 0x4cfa9f9b668619f6,
- PacketNumber: 0x1337,
- PacketNumberLen: protocol.PacketNumberLen6,
- }
- err := hdr.Write(b, protocol.Version35, protocol.PerspectiveClient)
- Expect(err).ToNot(HaveOccurred())
- Expect(b.Bytes()).To(Equal([]byte{0x38, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c, 0x37, 0x13, 0, 0, 0, 0}))
- })
-
- It("refuses to write a Public Header if the PacketNumberLen is not set", func() {
- hdr := PublicHeader{
- ConnectionID: 1,
- PacketNumber: 2,
- }
- b := &bytes.Buffer{}
- err := hdr.Write(b, protocol.VersionWhatever, protocol.PerspectiveServer)
- Expect(err).To(MatchError(errPacketNumberLenNotSet))
- })
-
- It("truncates the connection ID", func() {
- b := &bytes.Buffer{}
- hdr := PublicHeader{
- ConnectionID: 0x4cfa9f9b668619f6,
- TruncateConnectionID: true,
- PacketNumberLen: protocol.PacketNumberLen6,
- PacketNumber: 1,
- }
- err := hdr.Write(b, protocol.VersionWhatever, protocol.PerspectiveServer)
- Expect(err).ToNot(HaveOccurred())
- Expect(b.Bytes()).To(Equal([]byte{0x30, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0}))
- })
-
- It("writes proper v33 packets", func() {
- b := &bytes.Buffer{}
- hdr := PublicHeader{
- ConnectionID: 0x4cfa9f9b668619f6,
- PacketNumber: 1,
- PacketNumberLen: protocol.PacketNumberLen1,
- }
- err := hdr.Write(b, protocol.Version35, protocol.PerspectiveServer)
- Expect(err).ToNot(HaveOccurred())
- Expect(b.Bytes()).To(Equal([]byte{0x08, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c, 0x01}))
- })
-
- It("writes diversification nonces", func() {
- b := &bytes.Buffer{}
- hdr := PublicHeader{
- ConnectionID: 0x4cfa9f9b668619f6,
- PacketNumber: 1,
- PacketNumberLen: protocol.PacketNumberLen1,
- DiversificationNonce: bytes.Repeat([]byte{1}, 32),
- }
- err := hdr.Write(b, protocol.Version35, protocol.PerspectiveServer)
- Expect(err).ToNot(HaveOccurred())
- Expect(b.Bytes()).To(Equal([]byte{
- 0x0c, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 0x01,
- }))
- })
-
- It("throws an error if both Reset Flag and Version Flag are set", func() {
- b := &bytes.Buffer{}
- hdr := PublicHeader{
- VersionFlag: true,
- ResetFlag: true,
- ConnectionID: 0x4cfa9f9b668619f6,
- PacketNumber: 2,
- PacketNumberLen: protocol.PacketNumberLen6,
- }
- err := hdr.Write(b, protocol.VersionWhatever, protocol.PerspectiveServer)
- Expect(err).To(MatchError(errResetAndVersionFlagSet))
- })
-
- Context("Version Negotiation packets", func() {
- It("sets the Version Flag for packets sent as a server", func() {
- b := &bytes.Buffer{}
- hdr := PublicHeader{
- VersionFlag: true,
- ConnectionID: 0x4cfa9f9b668619f6,
- PacketNumber: 2,
- PacketNumberLen: protocol.PacketNumberLen6,
- }
- err := hdr.Write(b, protocol.VersionWhatever, protocol.PerspectiveServer)
- Expect(err).ToNot(HaveOccurred())
- // must be the first assertion
- Expect(b.Len()).To(Equal(1 + 8)) // 1 FlagByte + 8 ConnectionID
- firstByte, _ := b.ReadByte()
- Expect(firstByte & 0x01).To(Equal(uint8(1)))
- Expect(firstByte & 0x30).To(BeZero()) // no packet number present
- })
-
- It("sets the Version Flag for packets sent as a client, and adds a packet number", func() {
- b := &bytes.Buffer{}
- hdr := PublicHeader{
- VersionFlag: true,
- VersionNumber: protocol.Version36,
- ConnectionID: 0x4cfa9f9b668619f6,
- PacketNumber: 0x1337,
- PacketNumberLen: protocol.PacketNumberLen6,
- }
- err := hdr.Write(b, protocol.VersionWhatever, protocol.PerspectiveClient)
- Expect(err).ToNot(HaveOccurred())
- // must be the first assertion
- Expect(b.Len()).To(Equal(1 + 8 + 4 + 6)) // 1 FlagByte + 8 ConnectionID + 4 version number + 6 PacketNumber
- firstByte, _ := b.ReadByte()
- Expect(firstByte & 0x01).To(Equal(uint8(1)))
- Expect(firstByte & 0x30).To(Equal(uint8(0x30)))
- Expect(string(b.Bytes()[8:12])).To(Equal("Q036"))
- Expect(b.Bytes()[12:18]).To(Equal([]byte{0x37, 0x13, 0, 0, 0, 0}))
- })
- })
-
- Context("PublicReset packets", func() {
- It("sets the Reset Flag", func() {
- b := &bytes.Buffer{}
- hdr := PublicHeader{
- ResetFlag: true,
- ConnectionID: 0x4cfa9f9b668619f6,
- }
- err := hdr.Write(b, protocol.VersionWhatever, protocol.PerspectiveServer)
- Expect(err).ToNot(HaveOccurred())
- // must be the first assertion
- Expect(b.Len()).To(Equal(1 + 8)) // 1 FlagByte + 8 ConnectionID
- firstByte, _ := b.ReadByte()
- Expect((firstByte & 0x02) >> 1).To(Equal(uint8(1)))
- })
-
- It("doesn't add a packet number for headers with Reset Flag sent as a client", func() {
- b := &bytes.Buffer{}
- hdr := PublicHeader{
- ResetFlag: true,
- ConnectionID: 0x4cfa9f9b668619f6,
- PacketNumber: 2,
- PacketNumberLen: protocol.PacketNumberLen6,
- }
- err := hdr.Write(b, protocol.VersionWhatever, protocol.PerspectiveClient)
- Expect(err).ToNot(HaveOccurred())
- // must be the first assertion
- Expect(b.Len()).To(Equal(1 + 8)) // 1 FlagByte + 8 ConnectionID
- })
- })
-
- Context("GetLength", func() {
- It("errors when calling GetLength for Version Negotiation packets", func() {
- hdr := PublicHeader{VersionFlag: true}
- _, err := hdr.GetLength(protocol.PerspectiveServer)
- Expect(err).To(MatchError(errGetLengthNotForVersionNegotiation))
- })
-
- It("errors when calling GetLength for packets that have the VersionFlag and the ResetFlag set", func() {
- hdr := PublicHeader{
- ResetFlag: true,
- VersionFlag: true,
- }
- _, err := hdr.GetLength(protocol.PerspectiveServer)
- Expect(err).To(MatchError(errResetAndVersionFlagSet))
- })
-
- It("errors when PacketNumberLen is not set", func() {
- hdr := PublicHeader{
- ConnectionID: 0x4cfa9f9b668619f6,
- PacketNumber: 0xDECAFBAD,
- }
- _, err := hdr.GetLength(protocol.PerspectiveServer)
- Expect(err).To(MatchError(errPacketNumberLenNotSet))
- })
-
- It("gets the length of a packet with longest packet number length and connectionID", func() {
- hdr := PublicHeader{
- ConnectionID: 0x4cfa9f9b668619f6,
- PacketNumber: 0xDECAFBAD,
- PacketNumberLen: protocol.PacketNumberLen6,
- }
- length, err := hdr.GetLength(protocol.PerspectiveServer)
- Expect(err).ToNot(HaveOccurred())
- Expect(length).To(Equal(protocol.ByteCount(1 + 8 + 6))) // 1 byte public flag, 8 bytes connectionID, and packet number
- })
-
- It("gets the lengths of a packet sent by the client with the VersionFlag set", func() {
- hdr := PublicHeader{
- ConnectionID: 0x4cfa9f9b668619f6,
- TruncateConnectionID: true,
- PacketNumber: 0xDECAFBAD,
- PacketNumberLen: protocol.PacketNumberLen6,
- VersionFlag: true,
- VersionNumber: protocol.Version36,
- }
- length, err := hdr.GetLength(protocol.PerspectiveClient)
- Expect(err).ToNot(HaveOccurred())
- Expect(length).To(Equal(protocol.ByteCount(1 + 4 + 6))) // 1 byte public flag, 4 version number, and packet number
- })
-
- It("gets the length of a packet with longest packet number length and truncated connectionID", func() {
- hdr := PublicHeader{
- ConnectionID: 0x4cfa9f9b668619f6,
- TruncateConnectionID: true,
- PacketNumber: 0xDECAFBAD,
- PacketNumberLen: protocol.PacketNumberLen6,
- }
- length, err := hdr.GetLength(protocol.PerspectiveServer)
- Expect(err).ToNot(HaveOccurred())
- Expect(length).To(Equal(protocol.ByteCount(1 + 6))) // 1 byte public flag, and packet number
- })
-
- It("gets the length of a packet 2 byte packet number length ", func() {
- hdr := PublicHeader{
- ConnectionID: 0x4cfa9f9b668619f6,
- PacketNumber: 0xDECAFBAD,
- PacketNumberLen: protocol.PacketNumberLen2,
- }
- length, err := hdr.GetLength(protocol.PerspectiveServer)
- Expect(err).ToNot(HaveOccurred())
- Expect(length).To(Equal(protocol.ByteCount(1 + 8 + 2))) // 1 byte public flag, 8 byte connectionID, and packet number
- })
-
- It("works with diversification nonce", func() {
- hdr := PublicHeader{
- DiversificationNonce: []byte("foo"),
- PacketNumberLen: protocol.PacketNumberLen1,
- }
- length, err := hdr.GetLength(protocol.PerspectiveServer)
- Expect(err).NotTo(HaveOccurred())
- Expect(length).To(Equal(protocol.ByteCount(1 + 8 + 3 + 1))) // 1 byte public flag, 8 byte connectionID, 3 byte DiversificationNonce, 1 byte PacketNumber
- })
-
- It("gets the length of a PublicReset", func() {
- hdr := PublicHeader{
- ResetFlag: true,
- ConnectionID: 0x4cfa9f9b668619f6,
- }
- length, err := hdr.GetLength(protocol.PerspectiveServer)
- Expect(err).NotTo(HaveOccurred())
- Expect(length).To(Equal(protocol.ByteCount(1 + 8))) // 1 byte public flag, 8 byte connectionID
- })
- })
-
- Context("packet number length", func() {
- It("doesn't write a header if the packet number length is not set", func() {
- b := &bytes.Buffer{}
- hdr := PublicHeader{
- ConnectionID: 0x4cfa9f9b668619f6,
- PacketNumber: 0xDECAFBAD,
- }
- err := hdr.Write(b, protocol.VersionWhatever, protocol.PerspectiveServer)
- Expect(err).To(MatchError(errPacketNumberLenNotSet))
- })
-
- It("writes a header with a 1-byte packet number", func() {
- b := &bytes.Buffer{}
- hdr := PublicHeader{
- ConnectionID: 0x4cfa9f9b668619f6,
- PacketNumber: 0xDECAFBAD,
- PacketNumberLen: protocol.PacketNumberLen1,
- }
- err := hdr.Write(b, protocol.VersionWhatever, protocol.PerspectiveServer)
- Expect(err).ToNot(HaveOccurred())
- Expect(b.Bytes()).To(Equal([]byte{0x08, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c, 0xAD}))
- })
-
- It("writes a header with a 2-byte packet number", func() {
- b := &bytes.Buffer{}
- hdr := PublicHeader{
- ConnectionID: 0x4cfa9f9b668619f6,
- PacketNumber: 0xDECAFBAD,
- PacketNumberLen: protocol.PacketNumberLen2,
- }
- err := hdr.Write(b, protocol.VersionWhatever, protocol.PerspectiveServer)
- Expect(err).ToNot(HaveOccurred())
- Expect(b.Bytes()).To(Equal([]byte{0x18, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c, 0xAD, 0xFB}))
- })
-
- It("writes a header with a 4-byte packet number", func() {
- b := &bytes.Buffer{}
- hdr := PublicHeader{
- ConnectionID: 0x4cfa9f9b668619f6,
- PacketNumber: 0x13DECAFBAD,
- PacketNumberLen: protocol.PacketNumberLen4,
- }
- err := hdr.Write(b, protocol.VersionWhatever, protocol.PerspectiveServer)
- Expect(err).ToNot(HaveOccurred())
- Expect(b.Bytes()).To(Equal([]byte{0x28, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c, 0xAD, 0xFB, 0xCA, 0xDE}))
- })
-
- It("writes a header with a 6-byte packet number", func() {
- b := &bytes.Buffer{}
- hdr := PublicHeader{
- ConnectionID: 0x4cfa9f9b668619f6,
- PacketNumber: 0xBE1337DECAFBAD,
- PacketNumberLen: protocol.PacketNumberLen6,
- }
- err := hdr.Write(b, protocol.VersionWhatever, protocol.PerspectiveServer)
- Expect(err).ToNot(HaveOccurred())
- Expect(b.Bytes()).To(Equal([]byte{0x38, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c, 0xAD, 0xFB, 0xCA, 0xDE, 0x37, 0x13}))
- })
- })
- })
-})
diff --git a/vendor/github.com/lucas-clemente/quic-go/public_reset.go b/vendor/github.com/lucas-clemente/quic-go/public_reset.go
deleted file mode 100644
index b1f60d4..0000000
--- a/vendor/github.com/lucas-clemente/quic-go/public_reset.go
+++ /dev/null
@@ -1,62 +0,0 @@
-package quic
-
-import (
- "bytes"
- "encoding/binary"
- "errors"
-
- "github.com/lucas-clemente/quic-go/handshake"
- "github.com/lucas-clemente/quic-go/protocol"
- "github.com/lucas-clemente/quic-go/utils"
-)
-
-type publicReset struct {
- rejectedPacketNumber protocol.PacketNumber
- nonce uint64
-}
-
-func writePublicReset(connectionID protocol.ConnectionID, rejectedPacketNumber protocol.PacketNumber, nonceProof uint64) []byte {
- b := &bytes.Buffer{}
- b.WriteByte(0x0a)
- utils.WriteUint64(b, uint64(connectionID))
- utils.WriteUint32(b, uint32(handshake.TagPRST))
- utils.WriteUint32(b, 2)
- utils.WriteUint32(b, uint32(handshake.TagRNON))
- utils.WriteUint32(b, 8)
- utils.WriteUint32(b, uint32(handshake.TagRSEQ))
- utils.WriteUint32(b, 16)
- utils.WriteUint64(b, nonceProof)
- utils.WriteUint64(b, uint64(rejectedPacketNumber))
- return b.Bytes()
-}
-
-func parsePublicReset(r *bytes.Reader) (*publicReset, error) {
- pr := publicReset{}
- tag, tagMap, err := handshake.ParseHandshakeMessage(r)
- if err != nil {
- return nil, err
- }
- if tag != handshake.TagPRST {
- return nil, errors.New("wrong public reset tag")
- }
-
- rseq, ok := tagMap[handshake.TagRSEQ]
- if !ok {
- return nil, errors.New("RSEQ missing")
- }
- if len(rseq) != 8 {
- return nil, errors.New("invalid RSEQ tag")
- }
- pr.rejectedPacketNumber = protocol.PacketNumber(binary.LittleEndian.Uint64(rseq))
-
- rnon, ok := tagMap[handshake.TagRNON]
- if !ok {
- return nil, errors.New("RNON missing")
- }
- if len(rnon) != 8 {
- return nil, errors.New("invalid RNON tag")
- }
- pr.nonce = binary.LittleEndian.Uint64(rnon)
-
- return &pr, nil
-}
diff --git a/vendor/github.com/lucas-clemente/quic-go/qerr/quic_error.go b/vendor/github.com/lucas-clemente/quic-go/qerr/quic_error.go
index 6259476..9e1956f 100644
--- a/vendor/github.com/lucas-clemente/quic-go/qerr/quic_error.go
+++ b/vendor/github.com/lucas-clemente/quic-go/qerr/quic_error.go
@@ -3,7 +3,7 @@ package qerr
import (
"fmt"
- "github.com/lucas-clemente/quic-go/utils"
+ "github.com/lucas-clemente/quic-go/internal/utils"
)
// ErrorCode can be used as a normal error without reason.
@@ -31,6 +31,16 @@ func (e *QuicError) Error() string {
return fmt.Sprintf("%s: %s", e.ErrorCode.String(), e.ErrorMessage)
}
+func (e *QuicError) Timeout() bool {
+ switch e.ErrorCode {
+ case NetworkIdleTimeout,
+ HandshakeTimeout,
+ TimeoutsWithOpenStreams:
+ return true
+ }
+ return false
+}
+
// ToQuicError converts an arbitrary error to a QuicError. It leaves QuicErrors
// unchanged, and properly handles `ErrorCode`s.
func ToQuicError(err error) *QuicError {
diff --git a/vendor/github.com/lucas-clemente/quic-go/qerr/quic_error_test.go b/vendor/github.com/lucas-clemente/quic-go/qerr/quic_error_test.go
index 5c84a75..58d48fe 100644
--- a/vendor/github.com/lucas-clemente/quic-go/qerr/quic_error_test.go
+++ b/vendor/github.com/lucas-clemente/quic-go/qerr/quic_error_test.go
@@ -22,6 +22,13 @@ var _ = Describe("Quic error", func() {
})
})
+ Context("TimeoutError", func() {
+ It("works as timeout error", func() {
+ err := Error(HandshakeTimeout, "handshake timeout")
+ Expect(err.Timeout()).Should(BeTrue())
+ })
+ })
+
Context("ToQuicError", func() {
It("leaves QuicError unchanged", func() {
err := Error(DecryptionFailure, "foo")
diff --git a/vendor/github.com/lucas-clemente/quic-go/quic_suite_test.go b/vendor/github.com/lucas-clemente/quic-go/quic_suite_test.go
index 31e8db1..fefe277 100644
--- a/vendor/github.com/lucas-clemente/quic-go/quic_suite_test.go
+++ b/vendor/github.com/lucas-clemente/quic-go/quic_suite_test.go
@@ -1,6 +1,8 @@
package quic
import (
+ "github.com/golang/mock/gomock"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
@@ -11,3 +13,25 @@ func TestQuicGo(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "QUIC Suite")
}
+
+const (
+ versionGQUICFrames = protocol.Version39
+ versionIETFFrames = protocol.VersionTLS
+)
+
+var mockCtrl *gomock.Controller
+
+var _ = BeforeSuite(func() {
+ Expect(versionGQUICFrames.CryptoStreamID()).To(Equal(protocol.StreamID(1)))
+ Expect(versionGQUICFrames.UsesIETFFrameFormat()).To(BeFalse())
+ Expect(versionIETFFrames.CryptoStreamID()).To(Equal(protocol.StreamID(0)))
+ Expect(versionIETFFrames.UsesIETFFrameFormat()).To(BeTrue())
+})
+
+var _ = BeforeEach(func() {
+ mockCtrl = gomock.NewController(GinkgoT())
+})
+
+var _ = AfterEach(func() {
+ mockCtrl.Finish()
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/server.go b/vendor/github.com/lucas-clemente/quic-go/server.go
index af4b7e6..4ca25a2 100644
--- a/vendor/github.com/lucas-clemente/quic-go/server.go
+++ b/vendor/github.com/lucas-clemente/quic-go/server.go
@@ -2,31 +2,41 @@ package quic
import (
"bytes"
+ "crypto/tls"
"errors"
"net"
"sync"
"time"
- "github.com/lucas-clemente/quic-go/crypto"
- "github.com/lucas-clemente/quic-go/handshake"
- "github.com/lucas-clemente/quic-go/protocol"
+ "github.com/lucas-clemente/quic-go/internal/crypto"
+ "github.com/lucas-clemente/quic-go/internal/handshake"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+ "github.com/lucas-clemente/quic-go/internal/wire"
"github.com/lucas-clemente/quic-go/qerr"
- "github.com/lucas-clemente/quic-go/utils"
)
// packetHandler handles packets
type packetHandler interface {
Session
+ getCryptoStream() cryptoStream
+ handshakeStatus() <-chan handshakeEvent
handlePacket(*receivedPacket)
- run()
+ GetVersion() protocol.VersionNumber
+ run() error
+ closeRemote(error)
}
// A Listener of QUIC
type server struct {
- config *Config
+ tlsConf *tls.Config
+ config *Config
conn net.PacketConn
+ supportsTLS bool
+ serverTLS *serverTLS
+
certChain crypto.CertChain
scfg *handshake.ServerConfig
@@ -34,14 +44,19 @@ type server struct {
sessionsMutex sync.RWMutex
deleteClosedSessionsAfter time.Duration
- newSession func(conn connection, v protocol.VersionNumber, connectionID protocol.ConnectionID, sCfg *handshake.ServerConfig, closeCallback closeCallback, cryptoChangeCallback cryptoChangeCallback) (packetHandler, error)
+ serverError error
+ sessionQueue chan Session
+ errorChan chan struct{}
+
+ newSession func(conn connection, v protocol.VersionNumber, connectionID protocol.ConnectionID, sCfg *handshake.ServerConfig, tlsConf *tls.Config, config *Config) (packetHandler, error)
}
var _ Listener = &server{}
// ListenAddr creates a QUIC server listening on a given address.
// The listener is not active until Serve() is called.
-func ListenAddr(addr string, config *Config) (Listener, error) {
+// The tls.Config must not be nil, the quic.Config may be nil.
+func ListenAddr(addr string, tlsConf *tls.Config, config *Config) (Listener, error) {
udpAddr, err := net.ResolveUDPAddr("udp", addr)
if err != nil {
return nil, err
@@ -50,13 +65,14 @@ func ListenAddr(addr string, config *Config) (Listener, error) {
if err != nil {
return nil, err
}
- return Listen(conn, config)
+ return Listen(conn, tlsConf, config)
}
// Listen listens for QUIC connections on a given net.PacketConn.
// The listener is not active until Serve() is called.
-func Listen(conn net.PacketConn, config *Config) (Listener, error) {
- certChain := crypto.NewCertChain(config.TLSConfig)
+// The tls.Config must not be nil, the quic.Config may be nil.
+func Listen(conn net.PacketConn, tlsConf *tls.Config, config *Config) (Listener, error) {
+ certChain := crypto.NewCertChain(tlsConf)
kex, err := crypto.NewCurve25519KEX()
if err != nil {
return nil, err
@@ -65,20 +81,132 @@ func Listen(conn net.PacketConn, config *Config) (Listener, error) {
if err != nil {
return nil, err
}
+ config = populateServerConfig(config)
- return &server{
+ // check if any of the supported versions supports TLS
+ var supportsTLS bool
+ for _, v := range config.Versions {
+ if v.UsesTLS() {
+ supportsTLS = true
+ break
+ }
+ }
+
+ s := &server{
conn: conn,
+ tlsConf: tlsConf,
config: config,
certChain: certChain,
scfg: scfg,
sessions: map[protocol.ConnectionID]packetHandler{},
newSession: newSession,
deleteClosedSessionsAfter: protocol.ClosedSessionDeleteTimeout,
- }, nil
+ sessionQueue: make(chan Session, 5),
+ errorChan: make(chan struct{}),
+ supportsTLS: supportsTLS,
+ }
+ if supportsTLS {
+ if err := s.setupTLS(); err != nil {
+ return nil, err
+ }
+ }
+ go s.serve()
+ utils.Debugf("Listening for %s connections on %s", conn.LocalAddr().Network(), conn.LocalAddr().String())
+ return s, nil
}
-// Listen listens on an existing PacketConn
-func (s *server) Serve() error {
+func (s *server) setupTLS() error {
+ cookieHandler, err := handshake.NewCookieHandler(s.config.AcceptCookie)
+ if err != nil {
+ return err
+ }
+ serverTLS, sessionChan, err := newServerTLS(s.conn, s.config, cookieHandler, s.tlsConf)
+ if err != nil {
+ return err
+ }
+ s.serverTLS = serverTLS
+ // handle TLS connection establishment statelessly
+ go func() {
+ for {
+ select {
+ case <-s.errorChan:
+ return
+ case sess := <-sessionChan:
+ // TODO: think about what to do with connection ID collisions
+ connID := sess.(*session).connectionID
+ s.sessionsMutex.Lock()
+ s.sessions[connID] = sess
+ s.sessionsMutex.Unlock()
+ s.runHandshakeAndSession(sess, connID)
+ }
+ }
+ }()
+ return nil
+}
+
+var defaultAcceptCookie = func(clientAddr net.Addr, cookie *Cookie) bool {
+ if cookie == nil {
+ return false
+ }
+ if time.Now().After(cookie.SentTime.Add(protocol.CookieExpiryTime)) {
+ return false
+ }
+ var sourceAddr string
+ if udpAddr, ok := clientAddr.(*net.UDPAddr); ok {
+ sourceAddr = udpAddr.IP.String()
+ } else {
+ sourceAddr = clientAddr.String()
+ }
+ return sourceAddr == cookie.RemoteAddr
+}
+
+// populateServerConfig populates fields in the quic.Config with their default values, if none are set
+// it may be called with nil
+func populateServerConfig(config *Config) *Config {
+ if config == nil {
+ config = &Config{}
+ }
+ versions := config.Versions
+ if len(versions) == 0 {
+ versions = protocol.SupportedVersions
+ }
+
+ vsa := defaultAcceptCookie
+ if config.AcceptCookie != nil {
+ vsa = config.AcceptCookie
+ }
+
+ handshakeTimeout := protocol.DefaultHandshakeTimeout
+ if config.HandshakeTimeout != 0 {
+ handshakeTimeout = config.HandshakeTimeout
+ }
+ idleTimeout := protocol.DefaultIdleTimeout
+ if config.IdleTimeout != 0 {
+ idleTimeout = config.IdleTimeout
+ }
+
+ maxReceiveStreamFlowControlWindow := config.MaxReceiveStreamFlowControlWindow
+ if maxReceiveStreamFlowControlWindow == 0 {
+ maxReceiveStreamFlowControlWindow = protocol.DefaultMaxReceiveStreamFlowControlWindowServer
+ }
+ maxReceiveConnectionFlowControlWindow := config.MaxReceiveConnectionFlowControlWindow
+ if maxReceiveConnectionFlowControlWindow == 0 {
+ maxReceiveConnectionFlowControlWindow = protocol.DefaultMaxReceiveConnectionFlowControlWindowServer
+ }
+
+ return &Config{
+ Versions: versions,
+ HandshakeTimeout: handshakeTimeout,
+ IdleTimeout: idleTimeout,
+ AcceptCookie: vsa,
+ KeepAlive: config.KeepAlive,
+ MaxReceiveStreamFlowControlWindow: maxReceiveStreamFlowControlWindow,
+ MaxReceiveConnectionFlowControlWindow: maxReceiveConnectionFlowControlWindow,
+ }
+}
+
+// serve listens on an existing PacketConn
+func (s *server) serve() {
for {
data := getPacketBuffer()
data = data[:protocol.MaxReceivePacketSize]
@@ -86,7 +214,10 @@ func (s *server) Serve() error {
// If it does, we only read a truncated packet, which will then end up undecryptable
n, remoteAddr, err := s.conn.ReadFrom(data)
if err != nil {
- return err
+ s.serverError = err
+ close(s.errorChan)
+ _ = s.Close()
+ return
}
data = data[:n]
if err := s.handlePacket(s.conn, remoteAddr, data); err != nil {
@@ -95,17 +226,33 @@ func (s *server) Serve() error {
}
}
+// Accept returns newly openend sessions
+func (s *server) Accept() (Session, error) {
+ var sess Session
+ select {
+ case sess = <-s.sessionQueue:
+ return sess, nil
+ case <-s.errorChan:
+ return nil, s.serverError
+ }
+}
+
// Close the server
func (s *server) Close() error {
s.sessionsMutex.Lock()
+ var wg sync.WaitGroup
for _, session := range s.sessions {
if session != nil {
- s.sessionsMutex.Unlock()
- _ = session.Close(nil)
- s.sessionsMutex.Lock()
+ wg.Add(1)
+ go func(sess packetHandler) {
+ // session.Close() blocks until the CONNECTION_CLOSE has been sent and the run-loop has stopped
+ _ = sess.Close(nil)
+ wg.Done()
+ }(session)
}
}
s.sessionsMutex.Unlock()
+ wg.Wait()
if s.conn == nil {
return nil
@@ -122,25 +269,39 @@ func (s *server) handlePacket(pconn net.PacketConn, remoteAddr net.Addr, packet
rcvTime := time.Now()
r := bytes.NewReader(packet)
- hdr, err := ParsePublicHeader(r, protocol.PerspectiveClient)
+ hdr, err := wire.ParseHeaderSentByClient(r)
if err != nil {
return qerr.Error(qerr.InvalidPacketHeader, err.Error())
}
hdr.Raw = packet[:len(packet)-r.Len()]
+ packetData := packet[len(packet)-r.Len():]
+ connID := hdr.ConnectionID
+
+ if hdr.Type == protocol.PacketTypeInitial {
+ if s.supportsTLS {
+ go s.serverTLS.HandleInitial(remoteAddr, hdr, packetData)
+ }
+ return nil
+ }
s.sessionsMutex.RLock()
- session, ok := s.sessions[hdr.ConnectionID]
+ session, sessionKnown := s.sessions[connID]
s.sessionsMutex.RUnlock()
+ if sessionKnown && session == nil {
+ // Late packet for closed session
+ return nil
+ }
+
// ignore all Public Reset packets
if hdr.ResetFlag {
- if ok {
- var pr *publicReset
- pr, err = parsePublicReset(r)
+ if sessionKnown {
+ var pr *wire.PublicReset
+ pr, err = wire.ParsePublicReset(r)
if err != nil {
utils.Infof("Received a Public Reset for connection %x. An error occurred parsing the packet.")
} else {
- utils.Infof("Received a Public Reset for connection %x, rejected packet number: 0x%x.", hdr.ConnectionID, pr.rejectedPacketNumber)
+ utils.Infof("Received a Public Reset for connection %x, rejected packet number: 0x%x.", hdr.ConnectionID, pr.RejectedPacketNumber)
}
} else {
utils.Infof("Received Public Reset for unknown connection %x.", hdr.ConnectionID)
@@ -148,80 +309,95 @@ func (s *server) handlePacket(pconn net.PacketConn, remoteAddr net.Addr, packet
return nil
}
- // a session is only created once the client sent a supported version
- // if we receive a packet for a connection that already has session, it's probably an old packet that was sent by the client before the version was negotiated
- // it is safe to drop it
- if ok && hdr.VersionFlag && !protocol.IsSupportedVersion(hdr.VersionNumber) {
- return nil
- }
-
- // Send Version Negotiation Packet if the client is speaking a different protocol version
- if hdr.VersionFlag && !protocol.IsSupportedVersion(hdr.VersionNumber) {
- // drop packets that are too small to be valid first packets
- if len(packet) < protocol.ClientHelloMinimumSize+len(hdr.Raw) {
- return errors.New("dropping small packet with unknown version")
- }
- utils.Infof("Client offered version %d, sending VersionNegotiationPacket", hdr.VersionNumber)
- _, err = pconn.WriteTo(composeVersionNegotiation(hdr.ConnectionID), remoteAddr)
+ // If we don't have a session for this connection, and this packet cannot open a new connection, send a Public Reset
+ // This should only happen after a server restart, when we still receive packets for connections that we lost the state for.
+ // TODO(#943): implement sending of IETF draft style stateless resets
+ if !sessionKnown && (!hdr.VersionFlag && hdr.Type != protocol.PacketTypeInitial) {
+ _, err = pconn.WriteTo(wire.WritePublicReset(connID, 0, 0), remoteAddr)
return err
}
- if !ok {
- if !hdr.VersionFlag {
- _, err = pconn.WriteTo(writePublicReset(hdr.ConnectionID, hdr.PacketNumber, 0), remoteAddr)
+ // a session is only created once the client sent a supported version
+ // if we receive a packet for a connection that already has session, it's probably an old packet that was sent by the client before the version was negotiated
+ // it is safe to drop it
+ if sessionKnown && hdr.VersionFlag && !protocol.IsSupportedVersion(s.config.Versions, hdr.Version) {
+ return nil
+ }
+
+ // send a Version Negotiation Packet if the client is speaking a different protocol version
+ // since the client send a Public Header (only gQUIC has a Version Flag), we need to send a gQUIC Version Negotiation Packet
+ if hdr.VersionFlag && !protocol.IsSupportedVersion(s.config.Versions, hdr.Version) {
+ // drop packets that are too small to be valid first packets
+ if len(packet) < protocol.MinClientHelloSize+len(hdr.Raw) {
+ return errors.New("dropping small packet with unknown version")
+ }
+ utils.Infof("Client offered version %s, sending VersionNegotiationPacket", hdr.Version)
+ if _, err := pconn.WriteTo(wire.ComposeGQUICVersionNegotiation(hdr.ConnectionID, s.config.Versions), remoteAddr); err != nil {
return err
}
- version := hdr.VersionNumber
- if !protocol.IsSupportedVersion(version) {
+ }
+
+ // This is (potentially) a Client Hello.
+ // Make sure it has the minimum required size before spending any more ressources on it.
+ if !sessionKnown && len(packet) < protocol.MinClientHelloSize+len(hdr.Raw) {
+ return errors.New("dropping small packet for unknown connection")
+ }
+
+ if !sessionKnown {
+ version := hdr.Version
+ if !protocol.IsSupportedVersion(s.config.Versions, version) {
return errors.New("Server BUG: negotiated version not supported")
}
- utils.Infof("Serving new connection: %x, version %d from %v", hdr.ConnectionID, version, remoteAddr)
+ utils.Infof("Serving new connection: %x, version %s from %v", hdr.ConnectionID, version, remoteAddr)
session, err = s.newSession(
&conn{pconn: pconn, currentAddr: remoteAddr},
version,
hdr.ConnectionID,
s.scfg,
- s.closeCallback,
- s.cryptoChangeCallback,
+ s.tlsConf,
+ s.config,
)
if err != nil {
return err
}
- go session.run()
s.sessionsMutex.Lock()
- s.sessions[hdr.ConnectionID] = session
+ s.sessions[connID] = session
s.sessionsMutex.Unlock()
- if s.config.ConnState != nil {
- go s.config.ConnState(session, ConnStateVersionNegotiated)
- }
- }
- if session == nil {
- // Late packet for closed session
- return nil
+
+ s.runHandshakeAndSession(session, connID)
}
session.handlePacket(&receivedPacket{
- remoteAddr: remoteAddr,
- publicHeader: hdr,
- data: packet[len(packet)-r.Len():],
- rcvTime: rcvTime,
+ remoteAddr: remoteAddr,
+ header: hdr,
+ data: packetData,
+ rcvTime: rcvTime,
})
return nil
}
-func (s *server) cryptoChangeCallback(session Session, isForwardSecure bool) {
- var state ConnState
- if isForwardSecure {
- state = ConnStateForwardSecure
- } else {
- state = ConnStateSecure
- }
- if s.config.ConnState != nil {
- go s.config.ConnState(session, state)
- }
+func (s *server) runHandshakeAndSession(session packetHandler, connID protocol.ConnectionID) {
+ go func() {
+ _ = session.run()
+ // session.run() returns as soon as the session is closed
+ s.removeConnection(connID)
+ }()
+
+ go func() {
+ for {
+ ev := <-session.handshakeStatus()
+ if ev.err != nil {
+ return
+ }
+ if ev.encLevel == protocol.EncryptionForwardSecure {
+ break
+ }
+ }
+ s.sessionQueue <- session
+ }()
}
-func (s *server) closeCallback(id protocol.ConnectionID) {
+func (s *server) removeConnection(id protocol.ConnectionID) {
s.sessionsMutex.Lock()
s.sessions[id] = nil
s.sessionsMutex.Unlock()
@@ -232,18 +408,3 @@ func (s *server) closeCallback(id protocol.ConnectionID) {
s.sessionsMutex.Unlock()
})
}
-
-func composeVersionNegotiation(connectionID protocol.ConnectionID) []byte {
- fullReply := &bytes.Buffer{}
- responsePublicHeader := PublicHeader{
- ConnectionID: connectionID,
- PacketNumber: 1,
- VersionFlag: true,
- }
- err := responsePublicHeader.Write(fullReply, protocol.Version35, protocol.PerspectiveServer)
- if err != nil {
- utils.Errorf("error composing version negotiation packet: %s", err.Error())
- }
- fullReply.Write(protocol.SupportedVersionsAsTags)
- return fullReply.Bytes()
-}
diff --git a/vendor/github.com/lucas-clemente/quic-go/server_test.go b/vendor/github.com/lucas-clemente/quic-go/server_test.go
index 5a575ed..7e95acc 100644
--- a/vendor/github.com/lucas-clemente/quic-go/server_test.go
+++ b/vendor/github.com/lucas-clemente/quic-go/server_test.go
@@ -2,59 +2,92 @@ package quic
import (
"bytes"
+ "context"
+ "crypto/tls"
"errors"
"net"
+ "reflect"
"time"
- "github.com/lucas-clemente/quic-go/crypto"
- "github.com/lucas-clemente/quic-go/handshake"
- "github.com/lucas-clemente/quic-go/protocol"
+ "github.com/lucas-clemente/quic-go/internal/crypto"
+ "github.com/lucas-clemente/quic-go/internal/handshake"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/testdata"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+ "github.com/lucas-clemente/quic-go/internal/wire"
"github.com/lucas-clemente/quic-go/qerr"
- "github.com/lucas-clemente/quic-go/utils"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
type mockSession struct {
- connectionID protocol.ConnectionID
- packetCount int
- closed bool
- closeReason error
+ connectionID protocol.ConnectionID
+ packetCount int
+ closed bool
+ closeReason error
+ closedRemote bool
+ stopRunLoop chan struct{} // run returns as soon as this channel receives a value
+ handshakeChan chan handshakeEvent
+ handshakeComplete chan error // for WaitUntilHandshakeComplete
}
func (s *mockSession) handlePacket(*receivedPacket) {
s.packetCount++
}
-func (s *mockSession) run() {}
+func (s *mockSession) run() error {
+ <-s.stopRunLoop
+ return s.closeReason
+}
+func (s *mockSession) WaitUntilHandshakeComplete() error {
+ return <-s.handshakeComplete
+}
func (s *mockSession) Close(e error) error {
+ if s.closed {
+ return nil
+ }
s.closeReason = e
s.closed = true
+ close(s.stopRunLoop)
return nil
}
-func (s *mockSession) AcceptStream() (Stream, error) {
- panic("not implemented")
+func (s *mockSession) closeRemote(e error) {
+ s.closeReason = e
+ s.closed = true
+ s.closedRemote = true
+ close(s.stopRunLoop)
}
func (s *mockSession) OpenStream() (Stream, error) {
return &stream{streamID: 1337}, nil
}
-func (s *mockSession) OpenStreamSync() (Stream, error) {
- panic("not implemented")
-}
-func (s *mockSession) LocalAddr() net.Addr {
- panic("not implemented")
-}
-func (s *mockSession) RemoteAddr() net.Addr {
- panic("not implemented")
-}
+func (s *mockSession) AcceptStream() (Stream, error) { panic("not implemented") }
+func (s *mockSession) OpenStreamSync() (Stream, error) { panic("not implemented") }
+func (s *mockSession) LocalAddr() net.Addr { panic("not implemented") }
+func (s *mockSession) RemoteAddr() net.Addr { panic("not implemented") }
+func (*mockSession) Context() context.Context { panic("not implemented") }
+func (*mockSession) GetVersion() protocol.VersionNumber { return protocol.VersionWhatever }
+func (s *mockSession) handshakeStatus() <-chan handshakeEvent { return s.handshakeChan }
+func (*mockSession) getCryptoStream() cryptoStream { panic("not implemented") }
var _ Session = &mockSession{}
+var _ NonFWSession = &mockSession{}
-func newMockSession(conn connection, v protocol.VersionNumber, connectionID protocol.ConnectionID, sCfg *handshake.ServerConfig, closeCallback closeCallback, cryptoChangeCallback cryptoChangeCallback) (packetHandler, error) {
- return &mockSession{
- connectionID: connectionID,
- }, nil
+func newMockSession(
+ _ connection,
+ _ protocol.VersionNumber,
+ connectionID protocol.ConnectionID,
+ _ *handshake.ServerConfig,
+ _ *tls.Config,
+ _ *Config,
+) (packetHandler, error) {
+ s := mockSession{
+ connectionID: connectionID,
+ handshakeChan: make(chan handshakeEvent),
+ handshakeComplete: make(chan error),
+ stopRunLoop: make(chan struct{}),
+ }
+ return &s, nil
}
var _ = Describe("Server", func() {
@@ -65,8 +98,9 @@ var _ = Describe("Server", func() {
)
BeforeEach(func() {
- conn = &mockPacketConn{}
- config = &Config{}
+ conn = newMockPacketConn()
+ conn.addr = &net.UDPAddr{}
+ config = &Config{Versions: protocol.SupportedVersions}
})
Context("with mock session", func() {
@@ -78,15 +112,18 @@ var _ = Describe("Server", func() {
BeforeEach(func() {
serv = &server{
- sessions: make(map[protocol.ConnectionID]packetHandler),
- newSession: newMockSession,
- conn: conn,
- config: config,
+ sessions: make(map[protocol.ConnectionID]packetHandler),
+ newSession: newMockSession,
+ conn: conn,
+ config: config,
+ sessionQueue: make(chan Session, 5),
+ errorChan: make(chan struct{}),
}
b := &bytes.Buffer{}
- utils.WriteUint32(b, protocol.VersionNumberToTag(protocol.SupportedVersions[0]))
- firstPacket = []byte{0x09, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c}
+ utils.BigEndian.WriteUint32(b, uint32(protocol.SupportedVersions[0]))
+ firstPacket = []byte{0x09, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6}
firstPacket = append(append(firstPacket, b.Bytes()...), 0x01)
+ firstPacket = append(firstPacket, bytes.Repeat([]byte{0}, protocol.MinClientHelloSize)...) // add padding
})
It("returns the address", func() {
@@ -97,70 +134,54 @@ var _ = Describe("Server", func() {
Expect(serv.Addr().String()).To(Equal("192.168.13.37:1234"))
})
- It("composes version negotiation packets", func() {
- expected := append(
- []byte{0x01 | 0x08, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
- protocol.SupportedVersionsAsTags...,
- )
- Expect(composeVersionNegotiation(1)).To(Equal(expected))
- })
-
It("creates new sessions", func() {
- var connStateCalled bool
- var connStateStatus ConnState
- var connStateSession Session
- config.ConnState = func(s Session, state ConnState) {
- connStateStatus = state
- connStateSession = s
- connStateCalled = true
- }
err := serv.handlePacket(nil, nil, firstPacket)
Expect(err).ToNot(HaveOccurred())
Expect(serv.sessions).To(HaveLen(1))
sess := serv.sessions[connID].(*mockSession)
Expect(sess.connectionID).To(Equal(connID))
Expect(sess.packetCount).To(Equal(1))
- Eventually(func() bool { return connStateCalled }).Should(BeTrue())
- Expect(connStateSession).To(Equal(sess))
- Expect(connStateStatus).To(Equal(ConnStateVersionNegotiated))
})
- It("calls the ConnState callback when the connection is secure", func() {
- var connStateCalled bool
- var connStateStatus ConnState
- var connStateSession Session
- config.ConnState = func(s Session, state ConnState) {
- connStateStatus = state
- connStateSession = s
- connStateCalled = true
- }
- sess := &mockSession{}
- serv.cryptoChangeCallback(sess, false)
- Eventually(func() bool { return connStateCalled }).Should(BeTrue())
- Expect(connStateSession).To(Equal(sess))
- Expect(connStateStatus).To(Equal(ConnStateSecure))
- })
+ It("accepts a session once the connection it is forward secure", func(done Done) {
+ var acceptedSess Session
+ go func() {
+ defer GinkgoRecover()
+ var err error
+ acceptedSess, err = serv.Accept()
+ Expect(err).ToNot(HaveOccurred())
+ }()
+ err := serv.handlePacket(nil, nil, firstPacket)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(serv.sessions).To(HaveLen(1))
+ sess := serv.sessions[connID].(*mockSession)
+ sess.handshakeChan <- handshakeEvent{encLevel: protocol.EncryptionSecure}
+ Consistently(func() Session { return acceptedSess }).Should(BeNil())
+ sess.handshakeChan <- handshakeEvent{encLevel: protocol.EncryptionForwardSecure}
+ Eventually(func() Session { return acceptedSess }).Should(Equal(sess))
+ close(done)
+ }, 0.5)
- It("calls the ConnState callback when the connection is forward-secure", func() {
- var connStateCalled bool
- var connStateStatus ConnState
- var connStateSession Session
- config.ConnState = func(s Session, state ConnState) {
- connStateStatus = state
- connStateSession = s
- connStateCalled = true
- }
- sess := &mockSession{}
- serv.cryptoChangeCallback(sess, true)
- Eventually(func() bool { return connStateCalled }).Should(BeTrue())
- Expect(connStateStatus).To(Equal(ConnStateForwardSecure))
- Expect(connStateSession).To(Equal(sess))
+ It("doesn't accept session that error during the handshake", func(done Done) {
+ var accepted bool
+ go func() {
+ defer GinkgoRecover()
+ serv.Accept()
+ accepted = true
+ }()
+ err := serv.handlePacket(nil, nil, firstPacket)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(serv.sessions).To(HaveLen(1))
+ sess := serv.sessions[connID].(*mockSession)
+ sess.handshakeChan <- handshakeEvent{err: errors.New("handshake failed")}
+ Consistently(func() bool { return accepted }).Should(BeFalse())
+ close(done)
})
It("assigns packets to existing sessions", func() {
err := serv.handlePacket(nil, nil, firstPacket)
Expect(err).ToNot(HaveOccurred())
- err = serv.handlePacket(nil, nil, []byte{0x08, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c, 0x01})
+ err = serv.handlePacket(nil, nil, []byte{0x08, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6, 0x01})
Expect(err).ToNot(HaveOccurred())
Expect(serv.sessions).To(HaveLen(1))
Expect(serv.sessions[connID].(*mockSession).connectionID).To(Equal(connID))
@@ -169,23 +190,29 @@ var _ = Describe("Server", func() {
It("closes and deletes sessions", func() {
serv.deleteClosedSessionsAfter = time.Second // make sure that the nil value for the closed session doesn't get deleted in this test
- err := serv.handlePacket(nil, nil, append(firstPacket, (&crypto.NullAEAD{}).Seal(nil, nil, 0, firstPacket)...))
+ nullAEAD, err := crypto.NewNullAEAD(protocol.PerspectiveServer, connID, protocol.VersionWhatever)
+ Expect(err).ToNot(HaveOccurred())
+ err = serv.handlePacket(nil, nil, append(firstPacket, nullAEAD.Seal(nil, nil, 0, firstPacket)...))
Expect(err).ToNot(HaveOccurred())
Expect(serv.sessions).To(HaveLen(1))
Expect(serv.sessions[connID]).ToNot(BeNil())
- serv.closeCallback(connID)
+ // make session.run() return
+ serv.sessions[connID].(*mockSession).stopRunLoop <- struct{}{}
// The server should now have closed the session, leaving a nil value in the sessions map
- Expect(serv.sessions).To(HaveLen(1))
+ Consistently(func() map[protocol.ConnectionID]packetHandler { return serv.sessions }).Should(HaveLen(1))
Expect(serv.sessions[connID]).To(BeNil())
})
It("deletes nil session entries after a wait time", func() {
serv.deleteClosedSessionsAfter = 25 * time.Millisecond
- err := serv.handlePacket(nil, nil, append(firstPacket, (&crypto.NullAEAD{}).Seal(nil, nil, 0, firstPacket)...))
+ nullAEAD, err := crypto.NewNullAEAD(protocol.PerspectiveServer, connID, protocol.VersionWhatever)
+ Expect(err).ToNot(HaveOccurred())
+ err = serv.handlePacket(nil, nil, append(firstPacket, nullAEAD.Seal(nil, nil, 0, firstPacket)...))
Expect(err).ToNot(HaveOccurred())
Expect(serv.sessions).To(HaveLen(1))
- serv.closeCallback(connID)
Expect(serv.sessions).To(HaveKey(connID))
+ // make session.run() return
+ serv.sessions[connID].(*mockSession).stopRunLoop <- struct{}{}
Eventually(func() bool {
serv.sessionsMutex.Lock()
_, ok := serv.sessions[connID]
@@ -195,30 +222,37 @@ var _ = Describe("Server", func() {
})
It("closes sessions and the connection when Close is called", func() {
- session := &mockSession{}
+ session, _ := newMockSession(nil, 0, 0, nil, nil, nil)
serv.sessions[1] = session
err := serv.Close()
Expect(err).NotTo(HaveOccurred())
- Expect(session.closed).To(BeTrue())
+ Expect(session.(*mockSession).closed).To(BeTrue())
Expect(conn.closed).To(BeTrue())
})
It("ignores packets for closed sessions", func() {
serv.sessions[connID] = nil
- err := serv.handlePacket(nil, nil, []byte{0x08, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c, 0x01})
+ err := serv.handlePacket(nil, nil, []byte{0x08, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6, 0x01})
Expect(err).ToNot(HaveOccurred())
Expect(serv.sessions).To(HaveLen(1))
Expect(serv.sessions[connID]).To(BeNil())
})
+ It("works if no quic.Config is given", func(done Done) {
+ ln, err := ListenAddr("127.0.0.1:0", testdata.GetTLSConfig(), nil)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(ln.Close()).To(Succeed())
+ close(done)
+ }, 1)
+
It("closes properly", func() {
- ln, err := ListenAddr("127.0.0.1:0", config)
+ ln, err := ListenAddr("127.0.0.1:0", testdata.GetTLSConfig(), config)
Expect(err).ToNot(HaveOccurred())
var returned bool
go func() {
defer GinkgoRecover()
- err := ln.Serve()
+ _, err := ln.Accept()
Expect(err).To(HaveOccurred())
Expect(err.Error()).To(ContainSubstring("use of closed network connection"))
returned = true
@@ -227,11 +261,26 @@ var _ = Describe("Server", func() {
Eventually(func() bool { return returned }).Should(BeTrue())
})
- It("errors when encountering a connection error", func() {
+ It("errors when encountering a connection error", func(done Done) {
testErr := errors.New("connection error")
conn.readErr = testErr
- err := serv.Serve()
+ go serv.serve()
+ _, err := serv.Accept()
Expect(err).To(MatchError(testErr))
+ Expect(serv.Close()).To(Succeed())
+ close(done)
+ }, 0.5)
+
+ It("closes all sessions when encountering a connection error", func() {
+ session, _ := newMockSession(nil, 0, 0, nil, nil, nil)
+ serv.sessions[0x12345] = session
+ Expect(serv.sessions[0x12345].(*mockSession).closed).To(BeFalse())
+ testErr := errors.New("connection error")
+ conn.readErr = testErr
+ go serv.serve()
+ Eventually(func() Session { return serv.sessions[connID] }).Should(BeNil())
+ Eventually(func() bool { return session.(*mockSession).closed }).Should(BeTrue())
+ Expect(serv.Close()).To(Succeed())
})
It("ignores delayed packets with mismatching versions", func() {
@@ -240,8 +289,8 @@ var _ = Describe("Server", func() {
Expect(serv.sessions[connID].(*mockSession).packetCount).To(Equal(1))
b := &bytes.Buffer{}
// add an unsupported version
- utils.WriteUint32(b, protocol.VersionNumberToTag(protocol.SupportedVersions[0]-2))
- data := []byte{0x09, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c}
+ data := []byte{0x09, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6}
+ utils.BigEndian.WriteUint32(b, uint32(protocol.SupportedVersions[0]+1))
data = append(append(data, b.Bytes()...), 0x01)
err = serv.handlePacket(nil, nil, data)
Expect(err).ToNot(HaveOccurred())
@@ -257,7 +306,7 @@ var _ = Describe("Server", func() {
})
It("ignores public resets for unknown connections", func() {
- err := serv.handlePacket(nil, nil, writePublicReset(999, 1, 1337))
+ err := serv.handlePacket(nil, nil, wire.WritePublicReset(999, 1, 1337))
Expect(err).ToNot(HaveOccurred())
Expect(serv.sessions).To(BeEmpty())
})
@@ -266,7 +315,7 @@ var _ = Describe("Server", func() {
err := serv.handlePacket(nil, nil, firstPacket)
Expect(serv.sessions).To(HaveLen(1))
Expect(serv.sessions[connID].(*mockSession).packetCount).To(Equal(1))
- err = serv.handlePacket(nil, nil, writePublicReset(connID, 1, 1337))
+ err = serv.handlePacket(nil, nil, wire.WritePublicReset(connID, 1, 1337))
Expect(err).ToNot(HaveOccurred())
Expect(serv.sessions).To(HaveLen(1))
Expect(serv.sessions[connID].(*mockSession).packetCount).To(Equal(1))
@@ -276,7 +325,7 @@ var _ = Describe("Server", func() {
err := serv.handlePacket(nil, nil, firstPacket)
Expect(serv.sessions).To(HaveLen(1))
Expect(serv.sessions[connID].(*mockSession).packetCount).To(Equal(1))
- data := writePublicReset(connID, 1, 1337)
+ data := wire.WritePublicReset(connID, 1, 1337)
err = serv.handlePacket(nil, nil, data[:len(data)-2])
Expect(err).ToNot(HaveOccurred())
Expect(serv.sessions).To(HaveLen(1))
@@ -285,14 +334,14 @@ var _ = Describe("Server", func() {
It("doesn't respond with a version negotiation packet if the first packet is too small", func() {
b := &bytes.Buffer{}
- hdr := PublicHeader{
+ hdr := wire.Header{
VersionFlag: true,
ConnectionID: 0x1337,
PacketNumber: 1,
PacketNumberLen: protocol.PacketNumberLen2,
}
- hdr.Write(b, 13 /* not a valid QUIC version */, protocol.PerspectiveClient)
- b.Write(bytes.Repeat([]byte{0}, protocol.ClientHelloMinimumSize-1)) // this packet is 1 byte too small
+ hdr.Write(b, protocol.PerspectiveClient, 13 /* not a valid QUIC version */)
+ b.Write(bytes.Repeat([]byte{0}, protocol.MinClientHelloSize-1)) // this packet is 1 byte too small
err := serv.handlePacket(conn, udpAddr, b.Bytes())
Expect(err).To(MatchError("dropping small packet with unknown version"))
Expect(conn.dataWritten.Len()).Should(BeZero())
@@ -300,21 +349,42 @@ var _ = Describe("Server", func() {
})
It("setups with the right values", func() {
+ supportedVersions := []protocol.VersionNumber{1, 3, 5}
+ acceptCookie := func(_ net.Addr, _ *Cookie) bool { return true }
config := Config{
- ConnState: func(_ Session, _ ConnState) {},
+ Versions: supportedVersions,
+ AcceptCookie: acceptCookie,
+ HandshakeTimeout: 1337 * time.Hour,
+ IdleTimeout: 42 * time.Minute,
+ KeepAlive: true,
}
- ln, err := Listen(conn, &config)
- server := ln.(*server)
+ ln, err := Listen(conn, &tls.Config{}, &config)
Expect(err).ToNot(HaveOccurred())
+ server := ln.(*server)
Expect(server.deleteClosedSessionsAfter).To(Equal(protocol.ClosedSessionDeleteTimeout))
Expect(server.sessions).ToNot(BeNil())
Expect(server.scfg).ToNot(BeNil())
- Expect(server.config).To(Equal(&config))
+ Expect(server.config.Versions).To(Equal(supportedVersions))
+ Expect(server.config.HandshakeTimeout).To(Equal(1337 * time.Hour))
+ Expect(server.config.IdleTimeout).To(Equal(42 * time.Minute))
+ Expect(reflect.ValueOf(server.config.AcceptCookie)).To(Equal(reflect.ValueOf(acceptCookie)))
+ Expect(server.config.KeepAlive).To(BeTrue())
+ })
+
+ It("fills in default values if options are not set in the Config", func() {
+ ln, err := Listen(conn, &tls.Config{}, &Config{})
+ Expect(err).ToNot(HaveOccurred())
+ server := ln.(*server)
+ Expect(server.config.Versions).To(Equal(protocol.SupportedVersions))
+ Expect(server.config.HandshakeTimeout).To(Equal(protocol.DefaultHandshakeTimeout))
+ Expect(server.config.IdleTimeout).To(Equal(protocol.DefaultIdleTimeout))
+ Expect(reflect.ValueOf(server.config.AcceptCookie)).To(Equal(reflect.ValueOf(defaultAcceptCookie)))
+ Expect(server.config.KeepAlive).To(BeFalse())
})
It("listens on a given address", func() {
addr := "127.0.0.1:13579"
- ln, err := ListenAddr(addr, config)
+ ln, err := ListenAddr(addr, nil, config)
Expect(err).ToNot(HaveOccurred())
serv := ln.(*server)
Expect(serv.Addr().String()).To(Equal(addr))
@@ -322,55 +392,116 @@ var _ = Describe("Server", func() {
It("errors if given an invalid address", func() {
addr := "127.0.0.1"
- _, err := ListenAddr(addr, config)
+ _, err := ListenAddr(addr, nil, config)
Expect(err).To(BeAssignableToTypeOf(&net.AddrError{}))
})
It("errors if given an invalid address", func() {
addr := "1.1.1.1:1111"
- _, err := ListenAddr(addr, config)
+ _, err := ListenAddr(addr, nil, config)
Expect(err).To(BeAssignableToTypeOf(&net.OpError{}))
})
It("setups and responds with version negotiation", func() {
+ config.Versions = []protocol.VersionNumber{99}
b := &bytes.Buffer{}
- hdr := PublicHeader{
+ hdr := wire.Header{
VersionFlag: true,
ConnectionID: 0x1337,
PacketNumber: 1,
PacketNumberLen: protocol.PacketNumberLen2,
}
- hdr.Write(b, 13 /* not a valid QUIC version */, protocol.PerspectiveClient)
- b.Write(bytes.Repeat([]byte{0}, protocol.ClientHelloMinimumSize)) // add a fake CHLO
- conn.dataToRead = b.Bytes()
+ hdr.Write(b, protocol.PerspectiveClient, 13 /* not a valid QUIC version */)
+ b.Write(bytes.Repeat([]byte{0}, protocol.MinClientHelloSize)) // add a fake CHLO
+ conn.dataToRead <- b.Bytes()
conn.dataReadFrom = udpAddr
- ln, err := Listen(conn, config)
+ ln, err := Listen(conn, nil, config)
Expect(err).ToNot(HaveOccurred())
- var returned bool
+ done := make(chan struct{})
go func() {
- ln.Serve()
- returned = true
+ ln.Accept()
+ close(done)
}()
Eventually(func() int { return conn.dataWritten.Len() }).ShouldNot(BeZero())
Expect(conn.dataWrittenTo).To(Equal(udpAddr))
- expected := append(
- []byte{0x9, 0x37, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
- protocol.SupportedVersionsAsTags...,
- )
- Expect(conn.dataWritten.Bytes()).To(Equal(expected))
- Expect(returned).To(BeFalse())
+ r := bytes.NewReader(conn.dataWritten.Bytes())
+ packet, err := wire.ParseHeaderSentByServer(r, protocol.VersionUnknown)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.VersionFlag).To(BeTrue())
+ Expect(packet.ConnectionID).To(Equal(protocol.ConnectionID(0x1337)))
+ Expect(r.Len()).To(BeZero())
+ Consistently(done).ShouldNot(BeClosed())
+ })
+
+ It("sends an IETF draft style Version Negotaion Packet, if the client sent a IETF draft style header", func() {
+ config.Versions = []protocol.VersionNumber{99, protocol.VersionTLS}
+ b := &bytes.Buffer{}
+ hdr := wire.Header{
+ Type: protocol.PacketTypeInitial,
+ IsLongHeader: true,
+ ConnectionID: 0x1337,
+ PacketNumber: 0x55,
+ Version: 0x1234,
+ }
+ err := hdr.Write(b, protocol.PerspectiveClient, protocol.VersionTLS)
+ Expect(err).ToNot(HaveOccurred())
+ b.Write(bytes.Repeat([]byte{0}, protocol.MinInitialPacketSize)) // add a fake CHLO
+ conn.dataToRead <- b.Bytes()
+ conn.dataReadFrom = udpAddr
+ ln, err := Listen(conn, testdata.GetTLSConfig(), config)
+ Expect(err).ToNot(HaveOccurred())
+
+ done := make(chan struct{})
+ go func() {
+ ln.Accept()
+ close(done)
+ }()
+
+ Eventually(func() int { return conn.dataWritten.Len() }).ShouldNot(BeZero())
+ Expect(conn.dataWrittenTo).To(Equal(udpAddr))
+ r := bytes.NewReader(conn.dataWritten.Bytes())
+ packet, err := wire.ParseHeaderSentByServer(r, protocol.VersionUnknown)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(packet.IsVersionNegotiation).To(BeTrue())
+ Expect(packet.ConnectionID).To(Equal(protocol.ConnectionID(0x1337)))
+ Expect(packet.PacketNumber).To(Equal(protocol.PacketNumber(0x55)))
+ Expect(r.Len()).To(BeZero())
+ Consistently(done).ShouldNot(BeClosed())
+ })
+
+ It("ignores IETF draft style Initial packets, if it doesn't support TLS", func() {
+ version := protocol.VersionNumber(99)
+ Expect(version.UsesTLS()).To(BeFalse())
+ config.Versions = []protocol.VersionNumber{version}
+ b := &bytes.Buffer{}
+ hdr := wire.Header{
+ Type: protocol.PacketTypeInitial,
+ IsLongHeader: true,
+ ConnectionID: 0x1337,
+ PacketNumber: 0x55,
+ Version: protocol.VersionTLS,
+ }
+ err := hdr.Write(b, protocol.PerspectiveClient, protocol.VersionTLS)
+ Expect(err).ToNot(HaveOccurred())
+ b.Write(bytes.Repeat([]byte{0}, protocol.MinClientHelloSize)) // add a fake CHLO
+ conn.dataToRead <- b.Bytes()
+ conn.dataReadFrom = udpAddr
+ ln, err := Listen(conn, testdata.GetTLSConfig(), config)
+ defer ln.Close()
+ Expect(err).ToNot(HaveOccurred())
+ Consistently(func() int { return conn.dataWritten.Len() }).Should(BeZero())
})
It("sends a PublicReset for new connections that don't have the VersionFlag set", func() {
conn.dataReadFrom = udpAddr
- conn.dataToRead = []byte{0x08, 0xf6, 0x19, 0x86, 0x66, 0x9b, 0x9f, 0xfa, 0x4c, 0x01}
- ln, err := Listen(conn, config)
+ conn.dataToRead <- []byte{0x08, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6, 0x01}
+ ln, err := Listen(conn, nil, config)
Expect(err).ToNot(HaveOccurred())
go func() {
defer GinkgoRecover()
- err := ln.Serve()
+ _, err := ln.Accept()
Expect(err).ToNot(HaveOccurred())
}()
@@ -380,3 +511,55 @@ var _ = Describe("Server", func() {
Expect(ln.(*server).sessions).To(BeEmpty())
})
})
+
+var _ = Describe("default source address verification", func() {
+ It("accepts a token", func() {
+ remoteAddr := &net.UDPAddr{IP: net.IPv4(192, 168, 0, 1)}
+ cookie := &Cookie{
+ RemoteAddr: "192.168.0.1",
+ SentTime: time.Now().Add(-protocol.CookieExpiryTime).Add(time.Second), // will expire in 1 second
+ }
+ Expect(defaultAcceptCookie(remoteAddr, cookie)).To(BeTrue())
+ })
+
+ It("requests verification if no token is provided", func() {
+ remoteAddr := &net.UDPAddr{IP: net.IPv4(192, 168, 0, 1)}
+ Expect(defaultAcceptCookie(remoteAddr, nil)).To(BeFalse())
+ })
+
+ It("rejects a token if the address doesn't match", func() {
+ remoteAddr := &net.UDPAddr{IP: net.IPv4(192, 168, 0, 1)}
+ cookie := &Cookie{
+ RemoteAddr: "127.0.0.1",
+ SentTime: time.Now(),
+ }
+ Expect(defaultAcceptCookie(remoteAddr, cookie)).To(BeFalse())
+ })
+
+ It("accepts a token for a remote address is not a UDP address", func() {
+ remoteAddr := &net.TCPAddr{IP: net.IPv4(192, 168, 0, 1), Port: 1337}
+ cookie := &Cookie{
+ RemoteAddr: "192.168.0.1:1337",
+ SentTime: time.Now(),
+ }
+ Expect(defaultAcceptCookie(remoteAddr, cookie)).To(BeTrue())
+ })
+
+ It("rejects an invalid token for a remote address is not a UDP address", func() {
+ remoteAddr := &net.TCPAddr{IP: net.IPv4(192, 168, 0, 1), Port: 1337}
+ cookie := &Cookie{
+ RemoteAddr: "192.168.0.1:7331", // mismatching port
+ SentTime: time.Now(),
+ }
+ Expect(defaultAcceptCookie(remoteAddr, cookie)).To(BeFalse())
+ })
+
+ It("rejects an expired token", func() {
+ remoteAddr := &net.UDPAddr{IP: net.IPv4(192, 168, 0, 1)}
+ cookie := &Cookie{
+ RemoteAddr: "192.168.0.1",
+ SentTime: time.Now().Add(-protocol.CookieExpiryTime).Add(-time.Second), // expired 1 second ago
+ }
+ Expect(defaultAcceptCookie(remoteAddr, cookie)).To(BeFalse())
+ })
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/server_tls.go b/vendor/github.com/lucas-clemente/quic-go/server_tls.go
new file mode 100644
index 0000000..a40a8f5
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/server_tls.go
@@ -0,0 +1,182 @@
+package quic
+
+import (
+ "crypto/tls"
+ "errors"
+ "fmt"
+ "net"
+
+ "github.com/bifurcation/mint"
+ "github.com/lucas-clemente/quic-go/internal/crypto"
+ "github.com/lucas-clemente/quic-go/internal/handshake"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+ "github.com/lucas-clemente/quic-go/internal/wire"
+)
+
+type nullAEAD struct {
+ aead crypto.AEAD
+}
+
+var _ quicAEAD = &nullAEAD{}
+
+func (n *nullAEAD) Open(dst, src []byte, packetNumber protocol.PacketNumber, associatedData []byte) ([]byte, protocol.EncryptionLevel, error) {
+ data, err := n.aead.Open(dst, src, packetNumber, associatedData)
+ return data, protocol.EncryptionUnencrypted, err
+}
+
+type serverTLS struct {
+ conn net.PacketConn
+ config *Config
+ supportedVersions []protocol.VersionNumber
+ mintConf *mint.Config
+ cookieProtector mint.CookieProtector
+ params *handshake.TransportParameters
+ newMintConn func(*handshake.CryptoStreamConn, protocol.VersionNumber) (handshake.MintTLS, <-chan handshake.TransportParameters, error)
+
+ sessionChan chan<- packetHandler
+}
+
+func newServerTLS(
+ conn net.PacketConn,
+ config *Config,
+ cookieHandler *handshake.CookieHandler,
+ tlsConf *tls.Config,
+) (*serverTLS, <-chan packetHandler, error) {
+ mconf, err := tlsToMintConfig(tlsConf, protocol.PerspectiveServer)
+ if err != nil {
+ return nil, nil, err
+ }
+ mconf.RequireCookie = true
+ cs, err := mint.NewDefaultCookieProtector()
+ if err != nil {
+ return nil, nil, err
+ }
+ mconf.CookieProtector = cs
+ mconf.CookieHandler = cookieHandler
+
+ sessionChan := make(chan packetHandler)
+ s := &serverTLS{
+ conn: conn,
+ config: config,
+ supportedVersions: config.Versions,
+ mintConf: mconf,
+ sessionChan: sessionChan,
+ params: &handshake.TransportParameters{
+ StreamFlowControlWindow: protocol.ReceiveStreamFlowControlWindow,
+ ConnectionFlowControlWindow: protocol.ReceiveConnectionFlowControlWindow,
+ MaxStreams: protocol.MaxIncomingStreams,
+ IdleTimeout: config.IdleTimeout,
+ },
+ }
+ s.newMintConn = s.newMintConnImpl
+ return s, sessionChan, nil
+}
+
+func (s *serverTLS) HandleInitial(remoteAddr net.Addr, hdr *wire.Header, data []byte) {
+ utils.Debugf("Received a Packet. Handling it statelessly.")
+ sess, err := s.handleInitialImpl(remoteAddr, hdr, data)
+ if err != nil {
+ utils.Errorf("Error occured handling initial packet: %s", err)
+ return
+ }
+ if sess == nil { // a stateless reset was done
+ return
+ }
+ s.sessionChan <- sess
+}
+
+// will be set to s.newMintConn by the constructor
+func (s *serverTLS) newMintConnImpl(bc *handshake.CryptoStreamConn, v protocol.VersionNumber) (handshake.MintTLS, <-chan handshake.TransportParameters, error) {
+ conn := mint.Server(bc, s.mintConf)
+ extHandler := handshake.NewExtensionHandlerServer(s.params, s.config.Versions, v)
+ if err := conn.SetExtensionHandler(extHandler); err != nil {
+ return nil, nil, err
+ }
+ tls := newMintController(bc, s.mintConf, protocol.PerspectiveServer)
+ tls.SetExtensionHandler(extHandler)
+ return tls, extHandler.GetPeerParams(), nil
+}
+
+func (s *serverTLS) handleInitialImpl(remoteAddr net.Addr, hdr *wire.Header, data []byte) (packetHandler, error) {
+ if len(hdr.Raw)+len(data) < protocol.MinInitialPacketSize {
+ return nil, errors.New("dropping too small Initial packet")
+ }
+ // check version, if not matching send VNP
+ if !protocol.IsSupportedVersion(s.supportedVersions, hdr.Version) {
+ utils.Debugf("Client offered version %s, sending VersionNegotiationPacket", hdr.Version)
+ _, err := s.conn.WriteTo(wire.ComposeVersionNegotiation(hdr.ConnectionID, hdr.PacketNumber, s.supportedVersions), remoteAddr)
+ return nil, err
+ }
+
+ // unpack packet and check stream frame contents
+ version := hdr.Version
+ aead, err := crypto.NewNullAEAD(protocol.PerspectiveServer, hdr.ConnectionID, version)
+ if err != nil {
+ return nil, err
+ }
+ frame, err := unpackInitialPacket(aead, hdr, data, version)
+ if err != nil {
+ utils.Debugf("Error unpacking initial packet: %s", err)
+ return nil, nil
+ }
+ bc := handshake.NewCryptoStreamConn(remoteAddr)
+ bc.AddDataForReading(frame.Data)
+ tls, paramsChan, err := s.newMintConn(bc, hdr.Version)
+ if err != nil {
+ return nil, err
+ }
+ alert := tls.Handshake()
+ if alert == mint.AlertStatelessRetry {
+ // the HelloRetryRequest was written to the bufferConn
+ // Take that data and write send a Retry packet
+ replyHdr := &wire.Header{
+ IsLongHeader: true,
+ Type: protocol.PacketTypeRetry,
+ ConnectionID: hdr.ConnectionID, // echo the client's connection ID
+ PacketNumber: hdr.PacketNumber, // echo the client's packet number
+ Version: version,
+ }
+ f := &wire.StreamFrame{
+ StreamID: version.CryptoStreamID(),
+ Data: bc.GetDataForWriting(),
+ }
+ data, err := packUnencryptedPacket(aead, replyHdr, f, protocol.PerspectiveServer)
+ if err != nil {
+ return nil, err
+ }
+ _, err = s.conn.WriteTo(data, remoteAddr)
+ return nil, err
+ }
+ if alert != mint.AlertNoAlert {
+ return nil, alert
+ }
+ if tls.State() != mint.StateServerNegotiated {
+ return nil, fmt.Errorf("Expected mint state to be %s, got %s", mint.StateServerNegotiated, tls.State())
+ }
+ if alert := tls.Handshake(); alert != mint.AlertNoAlert {
+ return nil, alert
+ }
+ if tls.State() != mint.StateServerWaitFlight2 {
+ return nil, fmt.Errorf("Expected mint state to be %s, got %s", mint.StateServerWaitFlight2, tls.State())
+ }
+ params := <-paramsChan
+ sess, err := newTLSServerSession(
+ &conn{pconn: s.conn, currentAddr: remoteAddr},
+ hdr.ConnectionID, // TODO: we can use a server-chosen connection ID here
+ protocol.PacketNumber(1), // TODO: use a random packet number here
+ s.config,
+ tls,
+ bc,
+ aead,
+ ¶ms,
+ version,
+ )
+ if err != nil {
+ return nil, err
+ }
+ cs := sess.getCryptoStream()
+ cs.SetReadOffset(frame.DataLen())
+ bc.SetStream(cs)
+ return sess, nil
+}
diff --git a/vendor/github.com/lucas-clemente/quic-go/server_tls_test.go b/vendor/github.com/lucas-clemente/quic-go/server_tls_test.go
new file mode 100644
index 0000000..9c8d00e
--- /dev/null
+++ b/vendor/github.com/lucas-clemente/quic-go/server_tls_test.go
@@ -0,0 +1,127 @@
+package quic
+
+import (
+ "bytes"
+ "io"
+
+ "github.com/lucas-clemente/quic-go/internal/mocks"
+ "github.com/lucas-clemente/quic-go/internal/mocks/handshake"
+
+ "github.com/bifurcation/mint"
+ "github.com/lucas-clemente/quic-go/internal/crypto"
+ "github.com/lucas-clemente/quic-go/internal/handshake"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/testdata"
+ "github.com/lucas-clemente/quic-go/internal/wire"
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+)
+
+var _ = Describe("Stateless TLS handling", func() {
+ var (
+ conn *mockPacketConn
+ server *serverTLS
+ sessionChan <-chan packetHandler
+ mintTLS *mockhandshake.MockMintTLS
+ extHandler *mocks.MockTLSExtensionHandler
+ mintReply io.Writer
+ )
+
+ BeforeEach(func() {
+ mintTLS = mockhandshake.NewMockMintTLS(mockCtrl)
+ extHandler = mocks.NewMockTLSExtensionHandler(mockCtrl)
+ conn = newMockPacketConn()
+ config := &Config{
+ Versions: []protocol.VersionNumber{protocol.VersionTLS},
+ }
+ var err error
+ server, sessionChan, err = newServerTLS(conn, config, nil, testdata.GetTLSConfig())
+ Expect(err).ToNot(HaveOccurred())
+ server.newMintConn = func(bc *handshake.CryptoStreamConn, v protocol.VersionNumber) (handshake.MintTLS, <-chan handshake.TransportParameters, error) {
+ mintReply = bc
+ return mintTLS, extHandler.GetPeerParams(), nil
+ }
+ })
+
+ getPacket := func(f wire.Frame) (*wire.Header, []byte) {
+ hdrBuf := &bytes.Buffer{}
+ hdr := &wire.Header{
+ IsLongHeader: true,
+ PacketNumber: 1,
+ Version: protocol.VersionTLS,
+ }
+ err := hdr.Write(hdrBuf, protocol.PerspectiveClient, protocol.VersionTLS)
+ Expect(err).ToNot(HaveOccurred())
+ hdr.Raw = hdrBuf.Bytes()
+ aead, err := crypto.NewNullAEAD(protocol.PerspectiveClient, 0, protocol.VersionTLS)
+ Expect(err).ToNot(HaveOccurred())
+ buf := &bytes.Buffer{}
+ err = f.Write(buf, protocol.VersionTLS)
+ Expect(err).ToNot(HaveOccurred())
+ // pad the packet such that is has exactly the required minimum size
+ buf.Write(bytes.Repeat([]byte{0}, protocol.MinInitialPacketSize-len(hdr.Raw)-aead.Overhead()-buf.Len()))
+ data := aead.Seal(nil, buf.Bytes(), 1, hdr.Raw)
+ Expect(len(hdr.Raw) + len(data)).To(Equal(protocol.MinInitialPacketSize))
+ return hdr, data
+ }
+
+ It("sends a version negotiation packet if it doesn't support the version", func() {
+ server.HandleInitial(nil, &wire.Header{Version: 0x1337}, bytes.Repeat([]byte{0}, protocol.MinInitialPacketSize))
+ Expect(conn.dataWritten.Len()).ToNot(BeZero())
+ hdr, err := wire.ParseHeaderSentByServer(bytes.NewReader(conn.dataWritten.Bytes()), protocol.VersionUnknown)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.IsVersionNegotiation).To(BeTrue())
+ Expect(sessionChan).ToNot(Receive())
+ })
+
+ It("drops too small packets", func() {
+ hdr, data := getPacket(&wire.StreamFrame{Data: []byte("Client Hello")})
+ data = data[:len(data)-1] // the packet is now 1 byte too small
+ server.HandleInitial(nil, hdr, data)
+ Expect(conn.dataWritten.Len()).To(BeZero())
+ })
+
+ It("ignores packets with invalid contents", func() {
+ hdr, data := getPacket(&wire.StreamFrame{StreamID: 10, Offset: 11, Data: []byte("foobar")})
+ server.HandleInitial(nil, hdr, data)
+ Expect(conn.dataWritten.Len()).To(BeZero())
+ Expect(sessionChan).ToNot(Receive())
+ })
+
+ It("replies with a Retry packet, if a Cookie is required", func() {
+ extHandler.EXPECT().GetPeerParams()
+ mintTLS.EXPECT().Handshake().Return(mint.AlertStatelessRetry).Do(func() {
+ mintReply.Write([]byte("Retry with this Cookie"))
+ })
+ hdr, data := getPacket(&wire.StreamFrame{Data: []byte("Client Hello")})
+ server.HandleInitial(nil, hdr, data)
+ Expect(conn.dataWritten.Len()).ToNot(BeZero())
+ hdr, err := wire.ParseHeaderSentByServer(bytes.NewReader(conn.dataWritten.Bytes()), protocol.VersionTLS)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(hdr.Type).To(Equal(protocol.PacketTypeRetry))
+ Expect(sessionChan).ToNot(Receive())
+ })
+
+ It("replies with a Handshake packet and creates a session, if no Cookie is required", func() {
+ mintTLS.EXPECT().Handshake().Return(mint.AlertNoAlert).Do(func() {
+ mintReply.Write([]byte("Server Hello"))
+ })
+ mintTLS.EXPECT().Handshake().Return(mint.AlertNoAlert)
+ mintTLS.EXPECT().State().Return(mint.StateServerNegotiated)
+ mintTLS.EXPECT().State().Return(mint.StateServerWaitFlight2)
+ paramsChan := make(chan handshake.TransportParameters, 1)
+ paramsChan <- handshake.TransportParameters{}
+ extHandler.EXPECT().GetPeerParams().Return(paramsChan)
+ hdr, data := getPacket(&wire.StreamFrame{Data: []byte("Client Hello")})
+ done := make(chan struct{})
+ go func() {
+ defer GinkgoRecover()
+ server.HandleInitial(nil, hdr, data)
+ // the Handshake packet is written by the session
+ Expect(conn.dataWritten.Len()).To(BeZero())
+ close(done)
+ }()
+ Eventually(sessionChan).Should(Receive())
+ Eventually(done).Should(BeClosed())
+ })
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/session.go b/vendor/github.com/lucas-clemente/quic-go/session.go
index 89d3112..467c992 100644
--- a/vendor/github.com/lucas-clemente/quic-go/session.go
+++ b/vendor/github.com/lucas-clemente/quic-go/session.go
@@ -1,59 +1,62 @@
package quic
import (
+ "context"
"crypto/tls"
"errors"
"fmt"
"net"
- "sync/atomic"
+ "sync"
"time"
"github.com/lucas-clemente/quic-go/ackhandler"
"github.com/lucas-clemente/quic-go/congestion"
- "github.com/lucas-clemente/quic-go/flowcontrol"
- "github.com/lucas-clemente/quic-go/frames"
- "github.com/lucas-clemente/quic-go/handshake"
- "github.com/lucas-clemente/quic-go/protocol"
+ "github.com/lucas-clemente/quic-go/internal/crypto"
+ "github.com/lucas-clemente/quic-go/internal/flowcontrol"
+ "github.com/lucas-clemente/quic-go/internal/handshake"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+ "github.com/lucas-clemente/quic-go/internal/wire"
"github.com/lucas-clemente/quic-go/qerr"
- "github.com/lucas-clemente/quic-go/utils"
)
type unpacker interface {
- Unpack(publicHeaderBinary []byte, hdr *PublicHeader, data []byte) (*unpackedPacket, error)
+ Unpack(headerBinary []byte, hdr *wire.Header, data []byte) (*unpackedPacket, error)
}
type receivedPacket struct {
- remoteAddr net.Addr
- publicHeader *PublicHeader
- data []byte
- rcvTime time.Time
+ remoteAddr net.Addr
+ header *wire.Header
+ data []byte
+ rcvTime time.Time
}
var (
- errRstStreamOnInvalidStream = errors.New("RST_STREAM received for unknown stream")
- errWindowUpdateOnClosedStream = errors.New("WINDOW_UPDATE received for an already closed stream")
- errSessionAlreadyClosed = errors.New("cannot close session; it was already closed before")
+ newCryptoSetup = handshake.NewCryptoSetup
+ newCryptoSetupClient = handshake.NewCryptoSetupClient
)
-// cryptoChangeCallback is called every time the encryption level changes
-// Once the callback has been called with isForwardSecure = true, it is guarantueed to not be called with isForwardSecure = false after that
-type cryptoChangeCallback func(session Session, isForwardSecure bool)
+type handshakeEvent struct {
+ encLevel protocol.EncryptionLevel
+ err error
+}
-// closeCallback is called when a session is closed
-type closeCallback func(id protocol.ConnectionID)
+type closeError struct {
+ err error
+ remote bool
+}
// A Session is a QUIC session
type session struct {
connectionID protocol.ConnectionID
perspective protocol.Perspective
version protocol.VersionNumber
-
- closeCallback closeCallback
- cryptoChangeCallback cryptoChangeCallback
+ config *Config
conn connection
- streamsMap *streamsMap
+ streamsMap *streamsMap
+ cryptoStream cryptoStream
rttStats *congestion.RTTStats
@@ -61,7 +64,7 @@ type session struct {
receivedPacketHandler ackhandler.ReceivedPacketHandler
streamFramer *streamFramer
- flowControlManager flowcontrol.FlowControlManager
+ connFlowController flowcontrol.ConnectionFlowController
unpacker unpacker
packer *packetPacker
@@ -71,21 +74,30 @@ type session struct {
receivedPackets chan *receivedPacket
sendingScheduled chan struct{}
// closeChan is used to notify the run loop that it should terminate.
- // If the value is not nil, the error is sent as a CONNECTION_CLOSE.
- closeChan chan *qerr.QuicError
- runClosed chan struct{}
- closed uint32 // atomic bool
+ closeChan chan closeError
+ closeOnce sync.Once
+
+ ctx context.Context
+ ctxCancel context.CancelFunc
// when we receive too many undecryptable packets during the handshake, we send a Public reset
// but only after a time of protocol.PublicResetTimeout has passed
undecryptablePackets []*receivedPacket
receivedTooManyUndecrytablePacketsTime time.Time
- aeadChanged chan protocol.EncryptionLevel
-
- nextAckScheduledTime time.Time
-
- connectionParameters handshake.ConnectionParametersManager
+ // this channel is passed to the CryptoSetup and receives the transport parameters, as soon as the peer sends them
+ paramsChan <-chan handshake.TransportParameters
+ // this channel is passed to the CryptoSetup and receives the current encryption level
+ // it is closed as soon as the handshake is complete
+ aeadChanged <-chan protocol.EncryptionLevel
+ handshakeComplete bool
+ // will be closed as soon as the handshake completes, and receive any error that might occur until then
+ // it is used to block WaitUntilHandshakeComplete()
+ handshakeCompleteChan chan error
+ // handshakeChan receives handshake events and is closed as soon the handshake completes
+ // the receiving end of this channel is passed to the creator of the session
+ // it receives at most 3 handshake events: 2 when the encryption level changes, and one error
+ handshakeChan chan handshakeEvent
lastRcvdPacketNumber protocol.PacketNumber
// Used to calculate the next packet number from the truncated wire
@@ -95,231 +107,362 @@ type session struct {
sessionCreationTime time.Time
lastNetworkActivityTime time.Time
- timer *time.Timer
- currentDeadline time.Time
- timerRead bool
+ peerParams *handshake.TransportParameters
+
+ timer *utils.Timer
+ // keepAlivePingSent stores whether a Ping frame was sent to the peer or not
+ // it is reset as soon as we receive a packet from the peer
+ keepAlivePingSent bool
}
var _ Session = &session{}
// newSession makes a new session
-func newSession(conn connection, v protocol.VersionNumber, connectionID protocol.ConnectionID, sCfg *handshake.ServerConfig, closeCallback closeCallback, cryptoChangeCallback cryptoChangeCallback) (packetHandler, error) {
+func newSession(
+ conn connection,
+ v protocol.VersionNumber,
+ connectionID protocol.ConnectionID,
+ scfg *handshake.ServerConfig,
+ tlsConf *tls.Config,
+ config *Config,
+) (packetHandler, error) {
+ paramsChan := make(chan handshake.TransportParameters)
+ aeadChanged := make(chan protocol.EncryptionLevel, 2)
s := &session{
conn: conn,
connectionID: connectionID,
perspective: protocol.PerspectiveServer,
version: v,
-
- closeCallback: closeCallback,
- cryptoChangeCallback: cryptoChangeCallback,
- connectionParameters: handshake.NewConnectionParamatersManager(protocol.PerspectiveServer, v),
+ config: config,
+ aeadChanged: aeadChanged,
+ paramsChan: paramsChan,
}
-
- s.setup()
- cryptoStream, _ := s.GetOrOpenStream(1)
- _, _ = s.AcceptStream() // don't expose the crypto stream
- var sourceAddr []byte
- if udpAddr, ok := conn.RemoteAddr().(*net.UDPAddr); ok {
- sourceAddr = udpAddr.IP
- } else {
- sourceAddr = []byte(conn.RemoteAddr().String())
+ s.preSetup()
+ transportParams := &handshake.TransportParameters{
+ StreamFlowControlWindow: protocol.ReceiveStreamFlowControlWindow,
+ ConnectionFlowControlWindow: protocol.ReceiveConnectionFlowControlWindow,
+ MaxStreams: protocol.MaxIncomingStreams,
+ IdleTimeout: s.config.IdleTimeout,
}
- var err error
- s.cryptoSetup, err = handshake.NewCryptoSetup(connectionID, sourceAddr, v, sCfg, cryptoStream, s.connectionParameters, s.aeadChanged)
+ cs, err := newCryptoSetup(
+ s.cryptoStream,
+ s.connectionID,
+ s.conn.RemoteAddr(),
+ s.version,
+ scfg,
+ transportParams,
+ s.config.Versions,
+ s.config.AcceptCookie,
+ paramsChan,
+ aeadChanged,
+ )
if err != nil {
return nil, err
}
-
- s.packer = newPacketPacker(connectionID, s.cryptoSetup, s.connectionParameters, s.streamFramer, s.perspective, s.version)
- s.unpacker = &packetUnpacker{aead: s.cryptoSetup, version: s.version}
-
- return s, err
+ s.cryptoSetup = cs
+ return s, s.postSetup(1)
}
-func newClientSession(conn connection, hostname string, v protocol.VersionNumber, connectionID protocol.ConnectionID, tlsConfig *tls.Config, closeCallback closeCallback, cryptoChangeCallback cryptoChangeCallback, negotiatedVersions []protocol.VersionNumber) (*session, error) {
+// declare this as a variable, so that we can it mock it in the tests
+var newClientSession = func(
+ conn connection,
+ hostname string,
+ v protocol.VersionNumber,
+ connectionID protocol.ConnectionID,
+ tlsConf *tls.Config,
+ config *Config,
+ initialVersion protocol.VersionNumber,
+ negotiatedVersions []protocol.VersionNumber, // needed for validation of the GQUIC version negotiaton
+) (packetHandler, error) {
+ paramsChan := make(chan handshake.TransportParameters)
+ aeadChanged := make(chan protocol.EncryptionLevel, 2)
s := &session{
conn: conn,
connectionID: connectionID,
perspective: protocol.PerspectiveClient,
version: v,
-
- closeCallback: closeCallback,
- cryptoChangeCallback: cryptoChangeCallback,
- connectionParameters: handshake.NewConnectionParamatersManager(protocol.PerspectiveClient, v),
+ config: config,
+ aeadChanged: aeadChanged,
+ paramsChan: paramsChan,
}
-
- s.receivedPacketHandler = ackhandler.NewReceivedPacketHandler(s.ackAlarmChanged)
- s.setup()
-
- cryptoStream, _ := s.OpenStream()
- var err error
- s.cryptoSetup, err = handshake.NewCryptoSetupClient(hostname, connectionID, v, cryptoStream, tlsConfig, s.connectionParameters, s.aeadChanged, negotiatedVersions)
+ s.preSetup()
+ transportParams := &handshake.TransportParameters{
+ StreamFlowControlWindow: protocol.ReceiveStreamFlowControlWindow,
+ ConnectionFlowControlWindow: protocol.ReceiveConnectionFlowControlWindow,
+ MaxStreams: protocol.MaxIncomingStreams,
+ IdleTimeout: s.config.IdleTimeout,
+ OmitConnectionID: s.config.RequestConnectionIDOmission,
+ }
+ cs, err := newCryptoSetupClient(
+ s.cryptoStream,
+ hostname,
+ s.connectionID,
+ s.version,
+ tlsConf,
+ transportParams,
+ paramsChan,
+ aeadChanged,
+ initialVersion,
+ negotiatedVersions,
+ )
if err != nil {
return nil, err
}
-
- s.packer = newPacketPacker(connectionID, s.cryptoSetup, s.connectionParameters, s.streamFramer, s.perspective, s.version)
- s.unpacker = &packetUnpacker{aead: s.cryptoSetup, version: s.version}
-
- return s, err
+ s.cryptoSetup = cs
+ return s, s.postSetup(1)
}
-// setup is called from newSession and newClientSession and initializes values that are independent of the perspective
-func (s *session) setup() {
+func newTLSServerSession(
+ conn connection,
+ connectionID protocol.ConnectionID,
+ initialPacketNumber protocol.PacketNumber,
+ config *Config,
+ tls handshake.MintTLS,
+ cryptoStreamConn *handshake.CryptoStreamConn,
+ nullAEAD crypto.AEAD,
+ peerParams *handshake.TransportParameters,
+ v protocol.VersionNumber,
+) (packetHandler, error) {
+ aeadChanged := make(chan protocol.EncryptionLevel, 2)
+ s := &session{
+ conn: conn,
+ config: config,
+ connectionID: connectionID,
+ perspective: protocol.PerspectiveServer,
+ version: v,
+ aeadChanged: aeadChanged,
+ }
+ s.preSetup()
+ s.cryptoSetup = handshake.NewCryptoSetupTLSServer(
+ tls,
+ cryptoStreamConn,
+ nullAEAD,
+ aeadChanged,
+ v,
+ )
+ if err := s.postSetup(initialPacketNumber); err != nil {
+ return nil, err
+ }
+ s.peerParams = peerParams
+ s.processTransportParameters(peerParams)
+ s.unpacker = &packetUnpacker{aead: s.cryptoSetup, version: s.version}
+ return s, nil
+}
+
+// declare this as a variable, such that we can it mock it in the tests
+var newTLSClientSession = func(
+ conn connection,
+ hostname string,
+ v protocol.VersionNumber,
+ connectionID protocol.ConnectionID,
+ config *Config,
+ tls handshake.MintTLS,
+ paramsChan <-chan handshake.TransportParameters,
+ initialPacketNumber protocol.PacketNumber,
+) (packetHandler, error) {
+ aeadChanged := make(chan protocol.EncryptionLevel, 2)
+ s := &session{
+ conn: conn,
+ config: config,
+ connectionID: connectionID,
+ perspective: protocol.PerspectiveClient,
+ version: v,
+ aeadChanged: aeadChanged,
+ paramsChan: paramsChan,
+ }
+ s.preSetup()
+ tls.SetCryptoStream(s.cryptoStream)
+ cs, err := handshake.NewCryptoSetupTLSClient(
+ s.cryptoStream,
+ s.connectionID,
+ hostname,
+ aeadChanged,
+ tls,
+ v,
+ )
+ if err != nil {
+ return nil, err
+ }
+ s.cryptoSetup = cs
+ return s, s.postSetup(initialPacketNumber)
+}
+
+func (s *session) preSetup() {
s.rttStats = &congestion.RTTStats{}
- flowControlManager := flowcontrol.NewFlowControlManager(s.connectionParameters, s.rttStats)
-
- var sentPacketHandler ackhandler.SentPacketHandler
- sentPacketHandler = ackhandler.NewSentPacketHandler(s.rttStats)
-
- now := time.Now()
-
- s.sentPacketHandler = sentPacketHandler
- s.flowControlManager = flowControlManager
- s.receivedPacketHandler = ackhandler.NewReceivedPacketHandler(s.ackAlarmChanged)
+ s.connFlowController = flowcontrol.NewConnectionFlowController(
+ protocol.ReceiveConnectionFlowControlWindow,
+ protocol.ByteCount(s.config.MaxReceiveConnectionFlowControlWindow),
+ s.rttStats,
+ )
+ s.cryptoStream = s.newStream(s.version.CryptoStreamID()).(cryptoStream)
+}
+func (s *session) postSetup(initialPacketNumber protocol.PacketNumber) error {
+ s.handshakeChan = make(chan handshakeEvent, 3)
+ s.handshakeCompleteChan = make(chan error, 1)
s.receivedPackets = make(chan *receivedPacket, protocol.MaxSessionUnprocessedPackets)
- s.closeChan = make(chan *qerr.QuicError, 1)
+ s.closeChan = make(chan closeError, 1)
s.sendingScheduled = make(chan struct{}, 1)
s.undecryptablePackets = make([]*receivedPacket, 0, protocol.MaxUndecryptablePackets)
- s.aeadChanged = make(chan protocol.EncryptionLevel, 2)
- s.runClosed = make(chan struct{}, 1)
+ s.ctx, s.ctxCancel = context.WithCancel(context.Background())
- s.timer = time.NewTimer(0)
+ s.timer = utils.NewTimer()
+ now := time.Now()
s.lastNetworkActivityTime = now
s.sessionCreationTime = now
- s.streamsMap = newStreamsMap(s.newStream, s.perspective, s.connectionParameters)
- s.streamFramer = newStreamFramer(s.streamsMap, s.flowControlManager)
+ s.sentPacketHandler = ackhandler.NewSentPacketHandler(s.rttStats)
+ s.receivedPacketHandler = ackhandler.NewReceivedPacketHandler(s.version)
+
+ s.streamsMap = newStreamsMap(s.newStream, s.perspective, s.version)
+ s.streamFramer = newStreamFramer(s.cryptoStream, s.streamsMap, s.connFlowController, s.version)
+
+ s.packer = newPacketPacker(s.connectionID,
+ initialPacketNumber,
+ s.cryptoSetup,
+ s.streamFramer,
+ s.perspective,
+ s.version,
+ )
+ s.unpacker = &packetUnpacker{aead: s.cryptoSetup, version: s.version}
+ return nil
}
// run the session main loop
-func (s *session) run() {
- // Start the crypto stream handler
+func (s *session) run() error {
+ defer s.ctxCancel()
+
go func() {
if err := s.cryptoSetup.HandleCryptoStream(); err != nil {
s.Close(err)
}
}()
+ var closeErr closeError
+ aeadChanged := s.aeadChanged
+
runLoop:
for {
// Close immediately if requested
select {
- case errForConnClose := <-s.closeChan:
- if errForConnClose != nil {
- s.sendConnectionClose(errForConnClose)
- }
+ case closeErr = <-s.closeChan:
break runLoop
default:
}
s.maybeResetTimer()
- var err error
select {
- case errForConnClose := <-s.closeChan:
- if errForConnClose != nil {
- s.sendConnectionClose(errForConnClose)
- }
+ case closeErr = <-s.closeChan:
break runLoop
- case <-s.timer.C:
- s.timerRead = true
+ case <-s.timer.Chan():
+ s.timer.SetRead()
// We do all the interesting stuff after the switch statement, so
// nothing to see here.
case <-s.sendingScheduled:
// We do all the interesting stuff after the switch statement, so
// nothing to see here.
case p := <-s.receivedPackets:
- err = s.handlePacketImpl(p)
- if qErr, ok := err.(*qerr.QuicError); ok && qErr.ErrorCode == qerr.DecryptionFailure {
- s.tryQueueingUndecryptablePacket(p)
+ err := s.handlePacketImpl(p)
+ if err != nil {
+ if qErr, ok := err.(*qerr.QuicError); ok && qErr.ErrorCode == qerr.DecryptionFailure {
+ s.tryQueueingUndecryptablePacket(p)
+ continue
+ }
+ s.closeLocal(err)
continue
}
// This is a bit unclean, but works properly, since the packet always
// begins with the public header and we never copy it.
- putPacketBuffer(p.publicHeader.Raw)
- case l := <-s.aeadChanged:
- if l == protocol.EncryptionForwardSecure {
- s.packer.SetForwardSecure()
+ putPacketBuffer(p.header.Raw)
+ case p := <-s.paramsChan:
+ s.processTransportParameters(&p)
+ case l, ok := <-aeadChanged:
+ if !ok { // the aeadChanged chan was closed. This means that the handshake is completed.
+ s.handshakeComplete = true
+ aeadChanged = nil // prevent this case from ever being selected again
+ s.sentPacketHandler.SetHandshakeComplete()
+ close(s.handshakeChan)
+ close(s.handshakeCompleteChan)
+ } else {
+ s.tryDecryptingQueuedPackets()
+ s.handshakeChan <- handshakeEvent{encLevel: l}
}
- s.tryDecryptingQueuedPackets()
- s.cryptoChangeCallback(s, l == protocol.EncryptionForwardSecure)
- }
-
- if err != nil {
- s.close(err)
}
now := time.Now()
- if s.sentPacketHandler.GetAlarmTimeout().Before(now) {
+ if timeout := s.sentPacketHandler.GetAlarmTimeout(); !timeout.IsZero() && timeout.Before(now) {
// This could cause packets to be retransmitted, so check it before trying
// to send packets.
s.sentPacketHandler.OnAlarm()
}
+ if s.config.KeepAlive && s.handshakeComplete && time.Since(s.lastNetworkActivityTime) >= s.peerParams.IdleTimeout/2 {
+ // send the PING frame since there is no activity in the session
+ s.packer.QueueControlFrame(&wire.PingFrame{})
+ s.keepAlivePingSent = true
+ }
+
if err := s.sendPacket(); err != nil {
- s.close(err)
+ s.closeLocal(err)
}
if !s.receivedTooManyUndecrytablePacketsTime.IsZero() && s.receivedTooManyUndecrytablePacketsTime.Add(protocol.PublicResetTimeout).Before(now) && len(s.undecryptablePackets) != 0 {
- s.close(qerr.Error(qerr.DecryptionFailure, "too many undecryptable packets received"))
+ s.closeLocal(qerr.Error(qerr.DecryptionFailure, "too many undecryptable packets received"))
}
- if now.Sub(s.lastNetworkActivityTime) >= s.idleTimeout() {
- s.close(qerr.Error(qerr.NetworkIdleTimeout, "No recent network activity."))
+ if !s.handshakeComplete && now.Sub(s.sessionCreationTime) >= s.config.HandshakeTimeout {
+ s.closeLocal(qerr.Error(qerr.HandshakeTimeout, "Crypto handshake did not complete in time."))
}
- if !s.cryptoSetup.HandshakeComplete() && now.Sub(s.sessionCreationTime) >= protocol.MaxTimeForCryptoHandshake {
- s.close(qerr.Error(qerr.NetworkIdleTimeout, "Crypto handshake did not complete in time."))
+ if s.handshakeComplete && now.Sub(s.lastNetworkActivityTime) >= s.config.IdleTimeout {
+ s.closeLocal(qerr.Error(qerr.NetworkIdleTimeout, "No recent network activity."))
+ }
+
+ if err := s.streamsMap.DeleteClosedStreams(); err != nil {
+ s.closeLocal(err)
}
- s.garbageCollectStreams()
}
- s.closeCallback(s.connectionID)
- s.runClosed <- struct{}{}
+ // only send the error the handshakeChan when the handshake is not completed yet
+ // otherwise this chan will already be closed
+ if !s.handshakeComplete {
+ s.handshakeCompleteChan <- closeErr.err
+ s.handshakeChan <- handshakeEvent{err: closeErr.err}
+ }
+ s.handleCloseError(closeErr)
+ return closeErr.err
+}
+
+func (s *session) Context() context.Context {
+ return s.ctx
}
func (s *session) maybeResetTimer() {
- nextDeadline := s.lastNetworkActivityTime.Add(s.idleTimeout())
+ var deadline time.Time
+ if s.config.KeepAlive && s.handshakeComplete && !s.keepAlivePingSent {
+ deadline = s.lastNetworkActivityTime.Add(s.peerParams.IdleTimeout / 2)
+ } else {
+ deadline = s.lastNetworkActivityTime.Add(s.config.IdleTimeout)
+ }
- if !s.nextAckScheduledTime.IsZero() {
- nextDeadline = utils.MinTime(nextDeadline, s.nextAckScheduledTime)
+ if ackAlarm := s.receivedPacketHandler.GetAlarmTimeout(); !ackAlarm.IsZero() {
+ deadline = utils.MinTime(deadline, ackAlarm)
}
if lossTime := s.sentPacketHandler.GetAlarmTimeout(); !lossTime.IsZero() {
- nextDeadline = utils.MinTime(nextDeadline, lossTime)
+ deadline = utils.MinTime(deadline, lossTime)
}
- if !s.cryptoSetup.HandshakeComplete() {
- handshakeDeadline := s.sessionCreationTime.Add(protocol.MaxTimeForCryptoHandshake)
- nextDeadline = utils.MinTime(nextDeadline, handshakeDeadline)
+ if !s.handshakeComplete {
+ handshakeDeadline := s.sessionCreationTime.Add(s.config.HandshakeTimeout)
+ deadline = utils.MinTime(deadline, handshakeDeadline)
}
if !s.receivedTooManyUndecrytablePacketsTime.IsZero() {
- nextDeadline = utils.MinTime(nextDeadline, s.receivedTooManyUndecrytablePacketsTime.Add(protocol.PublicResetTimeout))
+ deadline = utils.MinTime(deadline, s.receivedTooManyUndecrytablePacketsTime.Add(protocol.PublicResetTimeout))
}
- if nextDeadline.Equal(s.currentDeadline) {
- // No need to reset the timer
- return
- }
-
- // We need to drain the timer if the value from its channel was not read yet.
- // See https://groups.google.com/forum/#!topic/golang-dev/c9UUfASVPoU
- if !s.timer.Stop() && !s.timerRead {
- <-s.timer.C
- }
- s.timer.Reset(nextDeadline.Sub(time.Now()))
-
- s.timerRead = false
- s.currentDeadline = nextDeadline
-}
-
-func (s *session) idleTimeout() time.Duration {
- if s.cryptoSetup.HandshakeComplete() {
- return s.connectionParameters.GetIdleConnectionStateLifetime()
- }
- return protocol.InitialIdleTimeout
+ s.timer.Reset(deadline)
}
func (s *session) handlePacketImpl(p *receivedPacket) error {
if s.perspective == protocol.PerspectiveClient {
- diversificationNonce := p.publicHeader.DiversificationNonce
+ diversificationNonce := p.header.DiversificationNonce
if len(diversificationNonce) > 0 {
s.cryptoSetup.SetDiversificationNonce(diversificationNonce)
}
@@ -331,7 +474,8 @@ func (s *session) handlePacketImpl(p *receivedPacket) error {
}
s.lastNetworkActivityTime = p.rcvTime
- hdr := p.publicHeader
+ s.keepAlivePingSent = false
+ hdr := p.header
data := p.data
// Calculate packet number
@@ -344,20 +488,13 @@ func (s *session) handlePacketImpl(p *receivedPacket) error {
packet, err := s.unpacker.Unpack(hdr.Raw, hdr, data)
if utils.Debug() {
if err != nil {
- utils.Debugf("<- Reading packet 0x%x (%d bytes) for connection %x @ %s", hdr.PacketNumber, len(data)+len(hdr.Raw), hdr.ConnectionID, time.Now().Format("15:04:05.000"))
+ utils.Debugf("<- Reading packet 0x%x (%d bytes) for connection %x", hdr.PacketNumber, len(data)+len(hdr.Raw), hdr.ConnectionID)
} else {
- utils.Debugf("<- Reading packet 0x%x (%d bytes) for connection %x, %s @ %s", hdr.PacketNumber, len(data)+len(hdr.Raw), hdr.ConnectionID, packet.encryptionLevel, time.Now().Format("15:04:05.000"))
+ utils.Debugf("<- Reading packet 0x%x (%d bytes) for connection %x, %s", hdr.PacketNumber, len(data)+len(hdr.Raw), hdr.ConnectionID, packet.encryptionLevel)
}
+ hdr.Log()
}
// if the decryption failed, this might be a packet sent by an attacker
- // don't update the remote address
- if quicErr, ok := err.(*qerr.QuicError); ok && quicErr.ErrorCode == qerr.DecryptionFailure {
- return err
- }
- if s.perspective == protocol.PerspectiveServer {
- // update the remote address, even if unpacking failed for any other reason than a decryption error
- s.conn.SetCurrentRemoteAddr(p.remoteAddr)
- }
if err != nil {
return err
}
@@ -366,46 +503,38 @@ func (s *session) handlePacketImpl(p *receivedPacket) error {
// Only do this after decrypting, so we are sure the packet is not attacker-controlled
s.largestRcvdPacketNumber = utils.MaxPacketNumber(s.largestRcvdPacketNumber, hdr.PacketNumber)
- err = s.receivedPacketHandler.ReceivedPacket(hdr.PacketNumber, packet.IsRetransmittable())
- // ignore duplicate packets
- if err == ackhandler.ErrDuplicatePacket {
- utils.Infof("Ignoring packet 0x%x due to ErrDuplicatePacket", hdr.PacketNumber)
- return nil
- }
- // ignore packets with packet numbers smaller than the LeastUnacked of a StopWaiting
- if err == ackhandler.ErrPacketSmallerThanLastStopWaiting {
- utils.Infof("Ignoring packet 0x%x due to ErrPacketSmallerThanLastStopWaiting", hdr.PacketNumber)
- return nil
- }
-
- if err != nil {
+ isRetransmittable := ackhandler.HasRetransmittableFrames(packet.frames)
+ if err = s.receivedPacketHandler.ReceivedPacket(hdr.PacketNumber, isRetransmittable); err != nil {
return err
}
- return s.handleFrames(packet.frames)
+ return s.handleFrames(packet.frames, packet.encryptionLevel)
}
-func (s *session) handleFrames(fs []frames.Frame) error {
+func (s *session) handleFrames(fs []wire.Frame, encLevel protocol.EncryptionLevel) error {
for _, ff := range fs {
var err error
- frames.LogFrame(ff, false)
+ wire.LogFrame(ff, false)
switch frame := ff.(type) {
- case *frames.StreamFrame:
+ case *wire.StreamFrame:
err = s.handleStreamFrame(frame)
- case *frames.AckFrame:
- err = s.handleAckFrame(frame)
- case *frames.ConnectionCloseFrame:
- s.closeImpl(qerr.Error(frame.ErrorCode, frame.ReasonPhrase), true)
- case *frames.GoawayFrame:
+ case *wire.AckFrame:
+ err = s.handleAckFrame(frame, encLevel)
+ case *wire.ConnectionCloseFrame:
+ s.closeRemote(qerr.Error(frame.ErrorCode, frame.ReasonPhrase))
+ case *wire.GoawayFrame:
err = errors.New("unimplemented: handling GOAWAY frames")
- case *frames.StopWaitingFrame:
- err = s.receivedPacketHandler.ReceivedStopWaiting(frame)
- case *frames.RstStreamFrame:
+ case *wire.StopWaitingFrame:
+ s.receivedPacketHandler.IgnoreBelow(frame.LeastUnacked)
+ case *wire.RstStreamFrame:
err = s.handleRstStreamFrame(frame)
- case *frames.WindowUpdateFrame:
- err = s.handleWindowUpdateFrame(frame)
- case *frames.BlockedFrame:
- case *frames.PingFrame:
+ case *wire.MaxDataFrame:
+ s.handleMaxDataFrame(frame)
+ case *wire.MaxStreamDataFrame:
+ err = s.handleMaxStreamDataFrame(frame)
+ case *wire.BlockedFrame:
+ case *wire.StreamBlockedFrame:
+ case *wire.PingFrame:
default:
return errors.New("Session BUG: unexpected frame type")
}
@@ -414,11 +543,6 @@ func (s *session) handleFrames(fs []frames.Frame) error {
switch err {
case ackhandler.ErrDuplicateOrOutOfOrderAck:
// Can happen e.g. when packets thought missing arrive late
- case errRstStreamOnInvalidStream:
- // Can happen when RST_STREAMs arrive early or late (?)
- utils.Errorf("Ignoring error in session: %s", err.Error())
- case errWindowUpdateOnClosedStream:
- // Can happen when we already sent the last StreamFrame with the FinBit, but the client already sent a WindowUpdate for this Stream
default:
return err
}
@@ -437,7 +561,10 @@ func (s *session) handlePacket(p *receivedPacket) {
}
}
-func (s *session) handleStreamFrame(frame *frames.StreamFrame) error {
+func (s *session) handleStreamFrame(frame *wire.StreamFrame) error {
+ if frame.StreamID == s.version.CryptoStreamID() {
+ return s.cryptoStream.AddStreamFrame(frame)
+ }
str, err := s.streamsMap.GetOrOpenStream(frame.StreamID)
if err != nil {
return err
@@ -447,140 +574,142 @@ func (s *session) handleStreamFrame(frame *frames.StreamFrame) error {
// ignore this StreamFrame
return nil
}
- err = str.AddStreamFrame(frame)
- if err != nil {
- return err
- }
- return nil
+ return str.AddStreamFrame(frame)
}
-func (s *session) handleWindowUpdateFrame(frame *frames.WindowUpdateFrame) error {
- if frame.StreamID != 0 {
- str, err := s.streamsMap.GetOrOpenStream(frame.StreamID)
- if err != nil {
- return err
- }
- if str == nil {
- return errWindowUpdateOnClosedStream
- }
- }
- _, err := s.flowControlManager.UpdateWindow(frame.StreamID, frame.ByteOffset)
- return err
+func (s *session) handleMaxDataFrame(frame *wire.MaxDataFrame) {
+ s.connFlowController.UpdateSendWindow(frame.ByteOffset)
}
-func (s *session) handleRstStreamFrame(frame *frames.RstStreamFrame) error {
+func (s *session) handleMaxStreamDataFrame(frame *wire.MaxStreamDataFrame) error {
str, err := s.streamsMap.GetOrOpenStream(frame.StreamID)
if err != nil {
return err
}
if str == nil {
- return errRstStreamOnInvalidStream
+ // stream is closed and already garbage collected
+ return nil
}
-
- str.RegisterRemoteError(fmt.Errorf("RST_STREAM received with code %d", frame.ErrorCode))
- return s.flowControlManager.ResetStream(frame.StreamID, frame.ByteOffset)
+ str.UpdateSendWindow(frame.ByteOffset)
+ return nil
}
-func (s *session) handleAckFrame(frame *frames.AckFrame) error {
- if err := s.sentPacketHandler.ReceivedAck(frame, s.lastRcvdPacketNumber, s.lastNetworkActivityTime); err != nil {
+func (s *session) handleRstStreamFrame(frame *wire.RstStreamFrame) error {
+ str, err := s.streamsMap.GetOrOpenStream(frame.StreamID)
+ if err != nil {
return err
}
- return nil
+ if str == nil {
+ // stream is closed and already garbage collected
+ return nil
+ }
+ return str.RegisterRemoteError(fmt.Errorf("RST_STREAM received with code %d", frame.ErrorCode), frame.ByteOffset)
+}
+
+func (s *session) handleAckFrame(frame *wire.AckFrame, encLevel protocol.EncryptionLevel) error {
+ return s.sentPacketHandler.ReceivedAck(frame, s.lastRcvdPacketNumber, encLevel, s.lastNetworkActivityTime)
+}
+
+func (s *session) closeLocal(e error) {
+ s.closeOnce.Do(func() {
+ s.closeChan <- closeError{err: e, remote: false}
+ })
+}
+
+func (s *session) closeRemote(e error) {
+ s.closeOnce.Do(func() {
+ s.closeChan <- closeError{err: e, remote: true}
+ })
}
// Close the connection. If err is nil it will be set to qerr.PeerGoingAway.
// It waits until the run loop has stopped before returning
func (s *session) Close(e error) error {
- err := s.closeImpl(e, false)
- if err == errSessionAlreadyClosed {
- return nil
- }
-
- // wait for the run loop to finish
- <-s.runClosed
- return err
+ s.closeLocal(e)
+ <-s.ctx.Done()
+ return nil
}
-// close the connection. Use this when called from the run loop
-func (s *session) close(e error) error {
- err := s.closeImpl(e, false)
- if err == errSessionAlreadyClosed {
- return nil
- }
- return err
-}
-
-func (s *session) closeImpl(e error, remoteClose bool) error {
- // Only close once
- if !atomic.CompareAndSwapUint32(&s.closed, 0, 1) {
- return errSessionAlreadyClosed
+func (s *session) handleCloseError(closeErr closeError) error {
+ if closeErr.err == nil {
+ closeErr.err = qerr.PeerGoingAway
}
- if e == errCloseSessionForNewVersion {
- s.streamsMap.CloseWithError(e)
- s.closeStreamsWithError(e)
- // when the run loop exits, it will call the closeCallback
- // replace it with an noop function to make sure this doesn't have any effect
- s.closeCallback = func(protocol.ConnectionID) {}
- s.closeChan <- nil
- return nil
+ var quicErr *qerr.QuicError
+ var ok bool
+ if quicErr, ok = closeErr.err.(*qerr.QuicError); !ok {
+ quicErr = qerr.ToQuicError(closeErr.err)
}
-
- if e == nil {
- e = qerr.PeerGoingAway
- }
-
- quicErr := qerr.ToQuicError(e)
-
// Don't log 'normal' reasons
if quicErr.ErrorCode == qerr.PeerGoingAway || quicErr.ErrorCode == qerr.NetworkIdleTimeout {
utils.Infof("Closing connection %x", s.connectionID)
} else {
- utils.Errorf("Closing session with error: %s", e.Error())
+ utils.Errorf("Closing session with error: %s", closeErr.err.Error())
}
+ s.cryptoStream.Cancel(quicErr)
s.streamsMap.CloseWithError(quicErr)
- s.closeStreamsWithError(quicErr)
- if remoteClose {
- // If this is a remote close we don't need to send a CONNECTION_CLOSE
- s.closeChan <- nil
+ if closeErr.err == errCloseSessionForNewVersion || closeErr.err == handshake.ErrCloseSessionForRetry {
return nil
}
- if quicErr.ErrorCode == qerr.DecryptionFailure || quicErr == handshake.ErrHOLExperiment {
- // If we send a public reset, don't send a CONNECTION_CLOSE
- s.closeChan <- nil
+ // If this is a remote close we're done here
+ if closeErr.remote {
+ return nil
+ }
+
+ if quicErr.ErrorCode == qerr.DecryptionFailure ||
+ quicErr == handshake.ErrHOLExperiment ||
+ quicErr == handshake.ErrNSTPExperiment {
return s.sendPublicReset(s.lastRcvdPacketNumber)
}
- s.closeChan <- quicErr
- return nil
+ return s.sendConnectionClose(quicErr)
}
-func (s *session) closeStreamsWithError(err error) {
- s.streamsMap.Iterate(func(str *stream) (bool, error) {
- str.Cancel(err)
- return true, nil
+func (s *session) processTransportParameters(params *handshake.TransportParameters) {
+ s.peerParams = params
+ s.streamsMap.UpdateMaxStreamLimit(params.MaxStreams)
+ if params.OmitConnectionID {
+ s.packer.SetOmitConnectionID()
+ }
+ s.connFlowController.UpdateSendWindow(params.ConnectionFlowControlWindow)
+ s.streamsMap.Range(func(str streamI) {
+ str.UpdateSendWindow(params.StreamFlowControlWindow)
})
}
func (s *session) sendPacket() error {
+ s.packer.SetLeastUnacked(s.sentPacketHandler.GetLeastUnacked())
+
+ // Get MAX_DATA and MAX_STREAM_DATA frames
+ // this call triggers the flow controller to increase the flow control windows, if necessary
+ windowUpdates := s.getWindowUpdates()
+ for _, f := range windowUpdates {
+ s.packer.QueueControlFrame(f)
+ }
+
+ ack := s.receivedPacketHandler.GetAckFrame()
+ if ack != nil {
+ s.packer.QueueControlFrame(ack)
+ }
+
// Repeatedly try sending until we don't have any more data, or run out of the congestion window
for {
if !s.sentPacketHandler.SendingAllowed() {
- return nil
- }
-
- var controlFrames []frames.Frame
-
- // get WindowUpdate frames
- // this call triggers the flow controller to increase the flow control windows, if necessary
- windowUpdateFrames, err := s.getWindowUpdateFrames()
- if err != nil {
- return err
- }
- for _, wuf := range windowUpdateFrames {
- controlFrames = append(controlFrames, wuf)
+ if ack == nil {
+ return nil
+ }
+ // If we aren't allowed to send, at least try sending an ACK frame
+ swf := s.sentPacketHandler.GetStopWaitingFrame(false)
+ if swf != nil {
+ s.packer.QueueControlFrame(swf)
+ }
+ packet, err := s.packer.PackAckPacket()
+ if err != nil {
+ return err
+ }
+ return s.sendPackedPacket(packet)
}
// check for retransmissions first
@@ -589,77 +718,68 @@ func (s *session) sendPacket() error {
if retransmitPacket == nil {
break
}
- utils.Debugf("\tDequeueing retransmission for packet 0x%x", retransmitPacket.PacketNumber)
if retransmitPacket.EncryptionLevel != protocol.EncryptionForwardSecure {
- utils.Debugf("\tDequeueing handshake retransmission for packet 0x%x", retransmitPacket.PacketNumber)
- stopWaitingFrame := s.sentPacketHandler.GetStopWaitingFrame(true)
- var packet *packedPacket
- packet, err = s.packer.RetransmitNonForwardSecurePacket(stopWaitingFrame, retransmitPacket)
- if err != nil {
- return err
- }
- if packet == nil {
+ if s.handshakeComplete {
+ // Don't retransmit handshake packets when the handshake is complete
continue
}
- err = s.sendPackedPacket(packet)
+ utils.Debugf("\tDequeueing handshake retransmission for packet 0x%x", retransmitPacket.PacketNumber)
+ s.packer.QueueControlFrame(s.sentPacketHandler.GetStopWaitingFrame(true))
+ packet, err := s.packer.PackHandshakeRetransmission(retransmitPacket)
if err != nil {
return err
}
- continue
+ if err = s.sendPackedPacket(packet); err != nil {
+ return err
+ }
} else {
+ utils.Debugf("\tDequeueing retransmission for packet 0x%x", retransmitPacket.PacketNumber)
// resend the frames that were in the packet
for _, frame := range retransmitPacket.GetFramesForRetransmission() {
- switch frame.(type) {
- case *frames.StreamFrame:
- s.streamFramer.AddFrameForRetransmission(frame.(*frames.StreamFrame))
- case *frames.WindowUpdateFrame:
- // only retransmit WindowUpdates if the stream is not yet closed and the we haven't sent another WindowUpdate with a higher ByteOffset for the stream
- var currentOffset protocol.ByteCount
- f := frame.(*frames.WindowUpdateFrame)
- currentOffset, err = s.flowControlManager.GetReceiveWindow(f.StreamID)
- if err == nil && f.ByteOffset >= currentOffset {
- controlFrames = append(controlFrames, frame)
- }
+ // TODO: only retransmit WINDOW_UPDATEs if they actually enlarge the window
+ switch f := frame.(type) {
+ case *wire.StreamFrame:
+ s.streamFramer.AddFrameForRetransmission(f)
default:
- controlFrames = append(controlFrames, frame)
+ s.packer.QueueControlFrame(frame)
}
}
}
}
- ack := s.receivedPacketHandler.GetAckFrame()
- if ack != nil {
- controlFrames = append(controlFrames, ack)
- }
hasRetransmission := s.streamFramer.HasFramesForRetransmission()
- var stopWaitingFrame *frames.StopWaitingFrame
if ack != nil || hasRetransmission {
- stopWaitingFrame = s.sentPacketHandler.GetStopWaitingFrame(hasRetransmission)
+ swf := s.sentPacketHandler.GetStopWaitingFrame(hasRetransmission)
+ if swf != nil {
+ s.packer.QueueControlFrame(swf)
+ }
}
- packet, err := s.packer.PackPacket(stopWaitingFrame, controlFrames, s.sentPacketHandler.GetLeastUnacked())
- if err != nil {
+ // add a retransmittable frame
+ if s.sentPacketHandler.ShouldSendRetransmittablePacket() {
+ s.packer.QueueControlFrame(&wire.PingFrame{})
+ }
+ packet, err := s.packer.PackPacket()
+ if err != nil || packet == nil {
return err
}
- if packet == nil {
- return nil
- }
- // send every window update twice
- for _, f := range windowUpdateFrames {
- s.packer.QueueControlFrameForNextPacket(f)
+ if err = s.sendPackedPacket(packet); err != nil {
+ return err
}
- err = s.sendPackedPacket(packet)
- if err != nil {
- return err
+ // send every window update twice
+ for _, f := range windowUpdates {
+ s.packer.QueueControlFrame(f)
}
- s.nextAckScheduledTime = time.Time{}
+ windowUpdates = nil
+ ack = nil
}
}
func (s *session) sendPackedPacket(packet *packedPacket) error {
+ defer putPacketBuffer(packet.raw)
err := s.sentPacketHandler.SentPacket(&ackhandler.Packet{
- PacketNumber: packet.number,
+ PacketNumber: packet.header.PacketNumber,
Frames: packet.frames,
Length: protocol.ByteCount(len(packet.raw)),
EncryptionLevel: packet.encryptionLevel,
@@ -667,22 +787,19 @@ func (s *session) sendPackedPacket(packet *packedPacket) error {
if err != nil {
return err
}
-
s.logPacket(packet)
-
- err = s.conn.Write(packet.raw)
- putPacketBuffer(packet.raw)
- return err
+ return s.conn.Write(packet.raw)
}
func (s *session) sendConnectionClose(quicErr *qerr.QuicError) error {
- packet, err := s.packer.PackConnectionClose(&frames.ConnectionCloseFrame{ErrorCode: quicErr.ErrorCode, ReasonPhrase: quicErr.ErrorMessage}, s.sentPacketHandler.GetLeastUnacked())
+ s.packer.SetLeastUnacked(s.sentPacketHandler.GetLeastUnacked())
+ packet, err := s.packer.PackConnectionClose(&wire.ConnectionCloseFrame{
+ ErrorCode: quicErr.ErrorCode,
+ ReasonPhrase: quicErr.ErrorMessage,
+ })
if err != nil {
return err
}
- if packet == nil {
- return errors.New("Session BUG: expected packet not to be nil")
- }
s.logPacket(packet)
return s.conn.Write(packet.raw)
}
@@ -692,11 +809,10 @@ func (s *session) logPacket(packet *packedPacket) {
// We don't need to allocate the slices for calling the format functions
return
}
- if utils.Debug() {
- utils.Debugf("-> Sending packet 0x%x (%d bytes), %s, @ %s", packet.number, len(packet.raw), packet.encryptionLevel, time.Now().Format("15:04:05.000"))
- for _, frame := range packet.frames {
- frames.LogFrame(frame, true)
- }
+ utils.Debugf("-> Sending packet 0x%x (%d bytes) for connection %x, %s", packet.header.PacketNumber, len(packet.raw), s.connectionID, packet.encryptionLevel)
+ packet.header.Log()
+ for _, frame := range packet.frames {
+ wire.LogFrame(frame, true)
}
}
@@ -725,49 +841,38 @@ func (s *session) OpenStreamSync() (Stream, error) {
return s.streamsMap.OpenStreamSync()
}
+func (s *session) WaitUntilHandshakeComplete() error {
+ return <-s.handshakeCompleteChan
+}
+
func (s *session) queueResetStreamFrame(id protocol.StreamID, offset protocol.ByteCount) {
- s.packer.QueueControlFrameForNextPacket(&frames.RstStreamFrame{
+ s.packer.QueueControlFrame(&wire.RstStreamFrame{
StreamID: id,
ByteOffset: offset,
})
s.scheduleSending()
}
-func (s *session) newStream(id protocol.StreamID) (*stream, error) {
- stream, err := newStream(id, s.scheduleSending, s.queueResetStreamFrame, s.flowControlManager)
- if err != nil {
- return nil, err
+func (s *session) newStream(id protocol.StreamID) streamI {
+ var initialSendWindow protocol.ByteCount
+ if s.peerParams != nil {
+ initialSendWindow = s.peerParams.StreamFlowControlWindow
}
-
- // TODO: find a better solution for determining which streams contribute to connection level flow control
- if id == 1 || id == 3 {
- s.flowControlManager.NewStream(id, false)
- } else {
- s.flowControlManager.NewStream(id, true)
- }
-
- return stream, nil
-}
-
-// garbageCollectStreams goes through all streams and removes EOF'ed streams
-// from the streams map.
-func (s *session) garbageCollectStreams() {
- s.streamsMap.Iterate(func(str *stream) (bool, error) {
- id := str.StreamID()
- if str.finished() {
- err := s.streamsMap.RemoveStream(id)
- if err != nil {
- return false, err
- }
- s.flowControlManager.RemoveStream(id)
- }
- return true, nil
- })
+ flowController := flowcontrol.NewStreamFlowController(
+ id,
+ s.version.StreamContributesToConnectionFlowControl(id),
+ s.connFlowController,
+ protocol.ReceiveStreamFlowControlWindow,
+ protocol.ByteCount(s.config.MaxReceiveStreamFlowControlWindow),
+ initialSendWindow,
+ s.rttStats,
+ )
+ return newStream(id, s.scheduleSending, s.queueResetStreamFrame, flowController, s.version)
}
func (s *session) sendPublicReset(rejectedPacketNumber protocol.PacketNumber) error {
utils.Infof("Sending public reset for connection %x, packet number %d", s.connectionID, rejectedPacketNumber)
- return s.conn.Write(writePublicReset(s.connectionID, rejectedPacketNumber, 0))
+ return s.conn.Write(wire.WritePublicReset(s.connectionID, rejectedPacketNumber, 0))
}
// scheduleSending signals that we have data for sending
@@ -779,7 +884,8 @@ func (s *session) scheduleSending() {
}
func (s *session) tryQueueingUndecryptablePacket(p *receivedPacket) {
- if s.cryptoSetup.HandshakeComplete() {
+ if s.handshakeComplete {
+ utils.Debugf("Received undecryptable packet from %s after the handshake: %#v, %d bytes data", p.remoteAddr.String(), p.header, len(p.data))
return
}
if len(s.undecryptablePackets)+1 > protocol.MaxUndecryptablePackets {
@@ -788,10 +894,10 @@ func (s *session) tryQueueingUndecryptablePacket(p *receivedPacket) {
s.receivedTooManyUndecrytablePacketsTime = time.Now()
s.maybeResetTimer()
}
- utils.Infof("Dropping undecrytable packet 0x%x (undecryptable packet queue full)", p.publicHeader.PacketNumber)
+ utils.Infof("Dropping undecrytable packet 0x%x (undecryptable packet queue full)", p.header.PacketNumber)
return
}
- utils.Infof("Queueing packet 0x%x for later decryption", p.publicHeader.PacketNumber)
+ utils.Infof("Queueing packet 0x%x for later decryption", p.header.PacketNumber)
s.undecryptablePackets = append(s.undecryptablePackets, p)
}
@@ -802,18 +908,22 @@ func (s *session) tryDecryptingQueuedPackets() {
s.undecryptablePackets = s.undecryptablePackets[:0]
}
-func (s *session) getWindowUpdateFrames() ([]*frames.WindowUpdateFrame, error) {
- updates := s.flowControlManager.GetWindowUpdates()
- res := make([]*frames.WindowUpdateFrame, len(updates))
- for i, u := range updates {
- res[i] = &frames.WindowUpdateFrame{StreamID: u.StreamID, ByteOffset: u.Offset}
+func (s *session) getWindowUpdates() []wire.Frame {
+ var res []wire.Frame
+ s.streamsMap.Range(func(str streamI) {
+ if offset := str.GetWindowUpdate(); offset != 0 {
+ res = append(res, &wire.MaxStreamDataFrame{
+ StreamID: str.StreamID(),
+ ByteOffset: offset,
+ })
+ }
+ })
+ if offset := s.connFlowController.GetWindowUpdate(); offset != 0 {
+ res = append(res, &wire.MaxDataFrame{
+ ByteOffset: offset,
+ })
}
- return res, nil
-}
-
-func (s *session) ackAlarmChanged(t time.Time) {
- s.nextAckScheduledTime = t
- s.maybeResetTimer()
+ return res
}
func (s *session) LocalAddr() net.Addr {
@@ -824,3 +934,15 @@ func (s *session) LocalAddr() net.Addr {
func (s *session) RemoteAddr() net.Addr {
return s.conn.RemoteAddr()
}
+
+func (s *session) handshakeStatus() <-chan handshakeEvent {
+ return s.handshakeChan
+}
+
+func (s *session) getCryptoStream() cryptoStream {
+ return s.cryptoStream
+}
+
+func (s *session) GetVersion() protocol.VersionNumber {
+ return s.version
+}
diff --git a/vendor/github.com/lucas-clemente/quic-go/session_test.go b/vendor/github.com/lucas-clemente/quic-go/session_test.go
index 8aff5cd..52c9ad9 100644
--- a/vendor/github.com/lucas-clemente/quic-go/session_test.go
+++ b/vendor/github.com/lucas-clemente/quic-go/session_test.go
@@ -2,38 +2,50 @@ package quic
import (
"bytes"
+ "context"
+ "crypto/tls"
"errors"
"io"
"net"
- "reflect"
"runtime/pprof"
"strings"
- "sync/atomic"
"time"
- "unsafe"
+ "github.com/golang/mock/gomock"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"github.com/lucas-clemente/quic-go/ackhandler"
- "github.com/lucas-clemente/quic-go/crypto"
- "github.com/lucas-clemente/quic-go/frames"
- "github.com/lucas-clemente/quic-go/handshake"
- "github.com/lucas-clemente/quic-go/protocol"
+ "github.com/lucas-clemente/quic-go/internal/crypto"
+ "github.com/lucas-clemente/quic-go/internal/handshake"
+ "github.com/lucas-clemente/quic-go/internal/mocks"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/testdata"
+ "github.com/lucas-clemente/quic-go/internal/wire"
"github.com/lucas-clemente/quic-go/qerr"
- "github.com/lucas-clemente/quic-go/testdata"
)
type mockConnection struct {
remoteAddr net.Addr
localAddr net.Addr
- written [][]byte
+ written chan []byte
+}
+
+func newMockConnection() *mockConnection {
+ return &mockConnection{
+ remoteAddr: &net.UDPAddr{},
+ written: make(chan []byte, 100),
+ }
}
func (m *mockConnection) Write(p []byte) error {
b := make([]byte, len(p))
copy(b, p)
- m.written = append(m.written, b)
+ select {
+ case m.written <- b:
+ default:
+ panic("mockConnection channel full")
+ }
return nil
}
func (m *mockConnection) Read([]byte) (int, net.Addr, error) { panic("not implemented") }
@@ -49,7 +61,7 @@ type mockUnpacker struct {
unpackErr error
}
-func (m *mockUnpacker) Unpack(publicHeaderBinary []byte, hdr *PublicHeader, data []byte) (*unpackedPacket, error) {
+func (m *mockUnpacker) Unpack(headerBinary []byte, hdr *wire.Header, data []byte) (*unpackedPacket, error) {
if m.unpackErr != nil {
return nil, m.unpackErr
}
@@ -59,10 +71,11 @@ func (m *mockUnpacker) Unpack(publicHeaderBinary []byte, hdr *PublicHeader, data
}
type mockSentPacketHandler struct {
- retransmissionQueue []*ackhandler.Packet
- sentPackets []*ackhandler.Packet
- congestionLimited bool
- requestedStopWaiting bool
+ retransmissionQueue []*ackhandler.Packet
+ sentPackets []*ackhandler.Packet
+ congestionLimited bool
+ requestedStopWaiting bool
+ shouldSendRetransmittablePacket bool
}
func (h *mockSentPacketHandler) SentPacket(packet *ackhandler.Packet) error {
@@ -70,18 +83,23 @@ func (h *mockSentPacketHandler) SentPacket(packet *ackhandler.Packet) error {
return nil
}
-func (h *mockSentPacketHandler) ReceivedAck(ackFrame *frames.AckFrame, withPacketNumber protocol.PacketNumber, recvTime time.Time) error {
+func (h *mockSentPacketHandler) ReceivedAck(ackFrame *wire.AckFrame, withPacketNumber protocol.PacketNumber, encLevel protocol.EncryptionLevel, recvTime time.Time) error {
return nil
}
-
+func (h *mockSentPacketHandler) SetHandshakeComplete() {}
func (h *mockSentPacketHandler) GetLeastUnacked() protocol.PacketNumber { return 1 }
func (h *mockSentPacketHandler) GetAlarmTimeout() time.Time { panic("not implemented") }
func (h *mockSentPacketHandler) OnAlarm() { panic("not implemented") }
func (h *mockSentPacketHandler) SendingAllowed() bool { return !h.congestionLimited }
+func (h *mockSentPacketHandler) ShouldSendRetransmittablePacket() bool {
+ b := h.shouldSendRetransmittablePacket
+ h.shouldSendRetransmittablePacket = false
+ return b
+}
-func (h *mockSentPacketHandler) GetStopWaitingFrame(force bool) *frames.StopWaitingFrame {
+func (h *mockSentPacketHandler) GetStopWaitingFrame(force bool) *wire.StopWaitingFrame {
h.requestedStopWaiting = true
- return &frames.StopWaitingFrame{LeastUnacked: 0x1337}
+ return &wire.StopWaitingFrame{LeastUnacked: 0x1337}
}
func (h *mockSentPacketHandler) DequeuePacketForRetransmission() *ackhandler.Packet {
@@ -100,16 +118,22 @@ func newMockSentPacketHandler() ackhandler.SentPacketHandler {
var _ ackhandler.SentPacketHandler = &mockSentPacketHandler{}
type mockReceivedPacketHandler struct {
- nextAckFrame *frames.AckFrame
+ nextAckFrame *wire.AckFrame
+ ackAlarm time.Time
}
-func (m *mockReceivedPacketHandler) GetAckFrame() *frames.AckFrame { return m.nextAckFrame }
+func (m *mockReceivedPacketHandler) GetAckFrame() *wire.AckFrame {
+ f := m.nextAckFrame
+ m.nextAckFrame = nil
+ return f
+}
func (m *mockReceivedPacketHandler) ReceivedPacket(packetNumber protocol.PacketNumber, shouldInstigateAck bool) error {
panic("not implemented")
}
-func (m *mockReceivedPacketHandler) ReceivedStopWaiting(*frames.StopWaitingFrame) error {
+func (m *mockReceivedPacketHandler) IgnoreBelow(protocol.PacketNumber) {
panic("not implemented")
}
+func (m *mockReceivedPacketHandler) GetAlarmTimeout() time.Time { return m.ackAlarm }
var _ ackhandler.ReceivedPacketHandler = &mockReceivedPacketHandler{}
@@ -121,512 +145,465 @@ func areSessionsRunning() bool {
var _ = Describe("Session", func() {
var (
- sess *session
- clientSess *session
- closeCallbackCalled bool
- scfg *handshake.ServerConfig
- mconn *mockConnection
- cpm *mockConnectionParametersManager
+ sess *session
+ scfg *handshake.ServerConfig
+ mconn *mockConnection
+ cryptoSetup *mockCryptoSetup
+ aeadChanged chan<- protocol.EncryptionLevel
)
BeforeEach(func() {
Eventually(areSessionsRunning).Should(BeFalse())
- mconn = &mockConnection{
- remoteAddr: &net.UDPAddr{},
+ cryptoSetup = &mockCryptoSetup{}
+ newCryptoSetup = func(
+ _ io.ReadWriter,
+ _ protocol.ConnectionID,
+ _ net.Addr,
+ _ protocol.VersionNumber,
+ _ *handshake.ServerConfig,
+ _ *handshake.TransportParameters,
+ _ []protocol.VersionNumber,
+ _ func(net.Addr, *Cookie) bool,
+ _ chan<- handshake.TransportParameters,
+ aeadChangedP chan<- protocol.EncryptionLevel,
+ ) (handshake.CryptoSetup, error) {
+ aeadChanged = aeadChangedP
+ return cryptoSetup, nil
}
- closeCallbackCalled = false
+ mconn = newMockConnection()
certChain := crypto.NewCertChain(testdata.GetTLSConfig())
kex, err := crypto.NewCurve25519KEX()
Expect(err).NotTo(HaveOccurred())
scfg, err = handshake.NewServerConfig(kex, certChain)
Expect(err).NotTo(HaveOccurred())
- pSess, err := newSession(
+ var pSess Session
+ pSess, err = newSession(
mconn,
- protocol.Version35,
+ protocol.Version39,
0,
scfg,
- func(protocol.ConnectionID) { closeCallbackCalled = true },
- func(Session, bool) {},
+ nil,
+ populateServerConfig(&Config{}),
)
Expect(err).NotTo(HaveOccurred())
sess = pSess.(*session)
- Expect(sess.streamsMap.openStreams).To(HaveLen(1)) // Crypto stream
-
- cpm = &mockConnectionParametersManager{idleTime: 60 * time.Second}
- sess.connectionParameters = cpm
-
- clientSess, err = newClientSession(
- nil,
- "hostname",
- protocol.Version35,
- 0,
- nil,
- func(protocol.ConnectionID) { closeCallbackCalled = true },
- func(Session, bool) {},
- nil,
- )
- Expect(err).ToNot(HaveOccurred())
- Expect(clientSess.streamsMap.openStreams).To(HaveLen(1)) // Crypto stream
+ Expect(sess.streamsMap.openStreams).To(BeEmpty())
})
AfterEach(func() {
+ newCryptoSetup = handshake.NewCryptoSetup
Eventually(areSessionsRunning).Should(BeFalse())
})
- Context("source address", func() {
- It("uses the IP address if given an UDP connection", func() {
- conn := &conn{currentAddr: &net.UDPAddr{IP: net.IPv4(192, 168, 100, 200)[12:], Port: 1337}}
- sess, err := newSession(
- conn,
- protocol.VersionWhatever,
- 0,
- scfg,
- func(protocol.ConnectionID) { closeCallbackCalled = true },
- func(Session, bool) {},
- )
- Expect(err).ToNot(HaveOccurred())
- Expect(*(*[]byte)(unsafe.Pointer(reflect.ValueOf(sess.(*session).cryptoSetup).Elem().FieldByName("sourceAddr").UnsafeAddr()))).To(Equal([]byte{192, 168, 100, 200}))
- })
+ Context("source address validation", func() {
+ var (
+ cookieVerify func(net.Addr, *Cookie) bool
+ paramClientAddr net.Addr
+ paramCookie *Cookie
+ )
+ remoteAddr := &net.UDPAddr{IP: net.IPv4(192, 168, 13, 37), Port: 1000}
- It("uses the string representation of the remote addresses if not given a UDP connection", func() {
- conn := &conn{
- currentAddr: &net.TCPAddr{IP: net.IPv4(192, 168, 100, 200)[12:], Port: 1337},
+ BeforeEach(func() {
+ newCryptoSetup = func(
+ _ io.ReadWriter,
+ _ protocol.ConnectionID,
+ _ net.Addr,
+ _ protocol.VersionNumber,
+ _ *handshake.ServerConfig,
+ _ *handshake.TransportParameters,
+ _ []protocol.VersionNumber,
+ cookieFunc func(net.Addr, *Cookie) bool,
+ _ chan<- handshake.TransportParameters,
+ _ chan<- protocol.EncryptionLevel,
+ ) (handshake.CryptoSetup, error) {
+ cookieVerify = cookieFunc
+ return cryptoSetup, nil
}
- sess, err := newSession(
- conn,
- protocol.VersionWhatever,
+
+ conf := populateServerConfig(&Config{})
+ conf.AcceptCookie = func(clientAddr net.Addr, cookie *Cookie) bool {
+ paramClientAddr = clientAddr
+ paramCookie = cookie
+ return false
+ }
+ pSess, err := newSession(
+ mconn,
+ protocol.Version39,
0,
scfg,
- func(protocol.ConnectionID) { closeCallbackCalled = true },
- func(Session, bool) {},
+ nil,
+ conf,
)
- Expect(err).ToNot(HaveOccurred())
- Expect(*(*[]byte)(unsafe.Pointer(reflect.ValueOf(sess.(*session).cryptoSetup).Elem().FieldByName("sourceAddr").UnsafeAddr()))).To(Equal([]byte("192.168.100.200:1337")))
+ Expect(err).NotTo(HaveOccurred())
+ sess = pSess.(*session)
+ })
+
+ It("calls the callback with the right parameters when the client didn't send an STK", func() {
+ cookieVerify(remoteAddr, nil)
+ Expect(paramClientAddr).To(Equal(remoteAddr))
+ Expect(paramCookie).To(BeNil())
+ })
+
+ It("calls the callback with the STK when the client sent an STK", func() {
+ cookieAddr := &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 1337}
+ sentTime := time.Now().Add(-time.Hour)
+ cookieVerify(remoteAddr, &Cookie{SentTime: sentTime, RemoteAddr: cookieAddr.String()})
+ Expect(paramClientAddr).To(Equal(remoteAddr))
+ Expect(paramCookie).ToNot(BeNil())
+ Expect(paramCookie.RemoteAddr).To(Equal(cookieAddr.String()))
+ Expect(paramCookie.SentTime).To(Equal(sentTime))
})
})
- Context("when handling stream frames", func() {
- It("makes new streams", func() {
- sess.handleStreamFrame(&frames.StreamFrame{
- StreamID: 5,
- Data: []byte{0xde, 0xca, 0xfb, 0xad},
- })
- p := make([]byte, 4)
- str, err := sess.streamsMap.GetOrOpenStream(5)
- Expect(err).ToNot(HaveOccurred())
- Expect(str).ToNot(BeNil())
- _, err = str.Read(p)
- Expect(err).ToNot(HaveOccurred())
- Expect(p).To(Equal([]byte{0xde, 0xca, 0xfb, 0xad}))
+ Context("frame handling", func() {
+ BeforeEach(func() {
+ sess.streamsMap.newStream = func(id protocol.StreamID) streamI {
+ str := mocks.NewMockStreamI(mockCtrl)
+ str.EXPECT().StreamID().Return(id).AnyTimes()
+ if id == 1 {
+ str.EXPECT().Finished().AnyTimes()
+ }
+ return str
+ }
})
- It("does not reject existing streams with even StreamIDs", func() {
+ Context("when handling STREAM frames", func() {
+ BeforeEach(func() {
+ sess.streamsMap.UpdateMaxStreamLimit(100)
+ })
+
+ It("makes new streams", func() {
+ f := &wire.StreamFrame{
+ StreamID: 5,
+ Data: []byte{0xde, 0xca, 0xfb, 0xad},
+ }
+ newStreamLambda := sess.streamsMap.newStream
+ sess.streamsMap.newStream = func(id protocol.StreamID) streamI {
+ str := newStreamLambda(id)
+ if id == 5 {
+ str.(*mocks.MockStreamI).EXPECT().AddStreamFrame(f)
+ }
+ return str
+ }
+ err := sess.handleStreamFrame(f)
+ Expect(err).ToNot(HaveOccurred())
+ str, err := sess.streamsMap.GetOrOpenStream(5)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(str).ToNot(BeNil())
+ })
+
+ It("handles existing streams", func() {
+ f1 := &wire.StreamFrame{
+ StreamID: 5,
+ Data: []byte{0xde, 0xca},
+ }
+ f2 := &wire.StreamFrame{
+ StreamID: 5,
+ Offset: 2,
+ Data: []byte{0xfb, 0xad},
+ }
+ newStreamLambda := sess.streamsMap.newStream
+ sess.streamsMap.newStream = func(id protocol.StreamID) streamI {
+ str := newStreamLambda(id)
+ if id == 5 {
+ str.(*mocks.MockStreamI).EXPECT().AddStreamFrame(f1)
+ str.(*mocks.MockStreamI).EXPECT().AddStreamFrame(f2)
+ }
+ return str
+ }
+ sess.handleStreamFrame(f1)
+ numOpenStreams := len(sess.streamsMap.openStreams)
+ sess.handleStreamFrame(f2)
+ Expect(sess.streamsMap.openStreams).To(HaveLen(numOpenStreams))
+ })
+
+ It("ignores STREAM frames for closed streams", func() {
+ sess.streamsMap.streams[5] = nil
+ str, err := sess.GetOrOpenStream(5)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(str).To(BeNil()) // make sure the stream is gone
+ err = sess.handleStreamFrame(&wire.StreamFrame{
+ StreamID: 5,
+ Data: []byte("foobar"),
+ })
+ Expect(err).ToNot(HaveOccurred())
+ })
+ })
+
+ Context("handling RST_STREAM frames", func() {
+ It("closes the streams for writing", func() {
+ str, err := sess.GetOrOpenStream(5)
+ Expect(err).ToNot(HaveOccurred())
+ str.(*mocks.MockStreamI).EXPECT().RegisterRemoteError(
+ errors.New("RST_STREAM received with code 42"),
+ protocol.ByteCount(0x1337),
+ )
+ err = sess.handleRstStreamFrame(&wire.RstStreamFrame{
+ StreamID: 5,
+ ErrorCode: 42,
+ ByteOffset: 0x1337,
+ })
+ Expect(err).ToNot(HaveOccurred())
+ })
+
+ It("queues a RST_STERAM frame", func() {
+ sess.queueResetStreamFrame(5, 0x1337)
+ Expect(sess.packer.controlFrames).To(HaveLen(1))
+ Expect(sess.packer.controlFrames[0].(*wire.RstStreamFrame)).To(Equal(&wire.RstStreamFrame{
+ StreamID: 5,
+ ByteOffset: 0x1337,
+ }))
+ })
+
+ It("returns errors", func() {
+ testErr := errors.New("flow control violation")
+ str, err := sess.GetOrOpenStream(5)
+ Expect(err).ToNot(HaveOccurred())
+ str.(*mocks.MockStreamI).EXPECT().RegisterRemoteError(gomock.Any(), gomock.Any()).Return(testErr)
+ err = sess.handleRstStreamFrame(&wire.RstStreamFrame{
+ StreamID: 5,
+ ByteOffset: 0x1337,
+ })
+ Expect(err).To(MatchError(testErr))
+ })
+
+ It("ignores the error when the stream is not known", func() {
+ str, err := sess.GetOrOpenStream(3)
+ Expect(err).ToNot(HaveOccurred())
+ str.(*mocks.MockStreamI).EXPECT().Finished().Return(true)
+ sess.streamsMap.DeleteClosedStreams()
+ str, err = sess.GetOrOpenStream(3)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(str).To(BeNil())
+ err = sess.handleFrames([]wire.Frame{&wire.RstStreamFrame{
+ StreamID: 3,
+ ErrorCode: 42,
+ }}, protocol.EncryptionUnspecified)
+ Expect(err).NotTo(HaveOccurred())
+ })
+ })
+
+ Context("handling MAX_DATA and MAX_STREAM_DATA frames", func() {
+ var connFC *mocks.MockConnectionFlowController
+
+ BeforeEach(func() {
+ connFC = mocks.NewMockConnectionFlowController(mockCtrl)
+ sess.connFlowController = connFC
+ })
+
+ It("updates the flow control window of a stream", func() {
+ offset := protocol.ByteCount(0x1234)
+ str, err := sess.GetOrOpenStream(5)
+ str.(*mocks.MockStreamI).EXPECT().UpdateSendWindow(offset)
+ Expect(err).ToNot(HaveOccurred())
+ err = sess.handleMaxStreamDataFrame(&wire.MaxStreamDataFrame{
+ StreamID: 5,
+ ByteOffset: offset,
+ })
+ Expect(err).ToNot(HaveOccurred())
+ })
+
+ It("updates the flow control window of the connection", func() {
+ offset := protocol.ByteCount(0x800000)
+ connFC.EXPECT().UpdateSendWindow(offset)
+ sess.handleMaxDataFrame(&wire.MaxDataFrame{ByteOffset: offset})
+ })
+
+ It("opens a new stream when receiving a MAX_STREAM_DATA frame for an unknown stream", func() {
+ newStreamLambda := sess.streamsMap.newStream
+ sess.streamsMap.newStream = func(id protocol.StreamID) streamI {
+ str := newStreamLambda(id)
+ if id == 5 {
+ str.(*mocks.MockStreamI).EXPECT().UpdateSendWindow(protocol.ByteCount(0x1337))
+ }
+ return str
+ }
+ err := sess.handleMaxStreamDataFrame(&wire.MaxStreamDataFrame{
+ StreamID: 5,
+ ByteOffset: 0x1337,
+ })
+ Expect(err).ToNot(HaveOccurred())
+ str, err := sess.streamsMap.GetOrOpenStream(5)
+ Expect(err).NotTo(HaveOccurred())
+ Expect(str).ToNot(BeNil())
+ })
+
+ It("ignores MAX_STREAM_DATA frames for a closed stream", func() {
+ str, err := sess.GetOrOpenStream(3)
+ Expect(err).ToNot(HaveOccurred())
+ str.(*mocks.MockStreamI).EXPECT().Finished().Return(true)
+ err = sess.streamsMap.DeleteClosedStreams()
+ Expect(err).ToNot(HaveOccurred())
+ str, err = sess.GetOrOpenStream(3)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(str).To(BeNil())
+ err = sess.handleFrames([]wire.Frame{&wire.MaxStreamDataFrame{
+ StreamID: 3,
+ ByteOffset: 1337,
+ }}, protocol.EncryptionUnspecified)
+ Expect(err).NotTo(HaveOccurred())
+ })
+ })
+
+ It("handles PING frames", func() {
+ err := sess.handleFrames([]wire.Frame{&wire.PingFrame{}}, protocol.EncryptionUnspecified)
+ Expect(err).NotTo(HaveOccurred())
+ })
+
+ It("handles BLOCKED frames", func() {
+ err := sess.handleFrames([]wire.Frame{&wire.BlockedFrame{}}, protocol.EncryptionUnspecified)
+ Expect(err).NotTo(HaveOccurred())
+ })
+
+ It("errors on GOAWAY frames", func() {
+ err := sess.handleFrames([]wire.Frame{&wire.GoawayFrame{}}, protocol.EncryptionUnspecified)
+ Expect(err).To(MatchError("unimplemented: handling GOAWAY frames"))
+ })
+
+ It("handles STOP_WAITING frames", func() {
+ err := sess.handleFrames([]wire.Frame{&wire.StopWaitingFrame{LeastUnacked: 10}}, protocol.EncryptionUnspecified)
+ Expect(err).NotTo(HaveOccurred())
+ })
+
+ It("handles CONNECTION_CLOSE frames", func() {
+ done := make(chan struct{})
+ go func() {
+ defer GinkgoRecover()
+ err := sess.run()
+ Expect(err).To(MatchError("ProofInvalid: foobar"))
+ close(done)
+ }()
_, err := sess.GetOrOpenStream(5)
Expect(err).ToNot(HaveOccurred())
- err = sess.handleStreamFrame(&frames.StreamFrame{
- StreamID: 5,
- Data: []byte{0xde, 0xca, 0xfb, 0xad},
+ sess.streamsMap.Range(func(s streamI) {
+ s.(*mocks.MockStreamI).EXPECT().Cancel(gomock.Any())
})
- Expect(err).ToNot(HaveOccurred())
- })
-
- It("handles existing streams", func() {
- sess.handleStreamFrame(&frames.StreamFrame{
- StreamID: 5,
- Data: []byte{0xde, 0xca},
- })
- numOpenStreams := len(sess.streamsMap.openStreams)
- sess.handleStreamFrame(&frames.StreamFrame{
- StreamID: 5,
- Offset: 2,
- Data: []byte{0xfb, 0xad},
- })
- Expect(sess.streamsMap.openStreams).To(HaveLen(numOpenStreams))
- p := make([]byte, 4)
- str, _ := sess.streamsMap.GetOrOpenStream(5)
- Expect(str).ToNot(BeNil())
- _, err := str.Read(p)
- Expect(err).ToNot(HaveOccurred())
- Expect(p).To(Equal([]byte{0xde, 0xca, 0xfb, 0xad}))
- })
-
- It("does not delete streams with Close()", func() {
- str, err := sess.GetOrOpenStream(5)
- Expect(err).ToNot(HaveOccurred())
- str.Close()
- sess.garbageCollectStreams()
- str, err = sess.streamsMap.GetOrOpenStream(5)
- Expect(err).ToNot(HaveOccurred())
- Expect(str).ToNot(BeNil())
- })
-
- It("does not delete streams with FIN bit", func() {
- sess.handleStreamFrame(&frames.StreamFrame{
- StreamID: 5,
- Data: []byte{0xde, 0xca, 0xfb, 0xad},
- FinBit: true,
- })
- numOpenStreams := len(sess.streamsMap.openStreams)
- str, _ := sess.streamsMap.GetOrOpenStream(5)
- Expect(str).ToNot(BeNil())
- p := make([]byte, 4)
- _, err := str.Read(p)
- Expect(err).To(MatchError(io.EOF))
- Expect(p).To(Equal([]byte{0xde, 0xca, 0xfb, 0xad}))
- sess.garbageCollectStreams()
- Expect(sess.streamsMap.openStreams).To(HaveLen(numOpenStreams))
- str, _ = sess.streamsMap.GetOrOpenStream(5)
- Expect(str).ToNot(BeNil())
- })
-
- It("deletes streams with FIN bit & close", func() {
- sess.handleStreamFrame(&frames.StreamFrame{
- StreamID: 5,
- Data: []byte{0xde, 0xca, 0xfb, 0xad},
- FinBit: true,
- })
- numOpenStreams := len(sess.streamsMap.openStreams)
- str, _ := sess.streamsMap.GetOrOpenStream(5)
- Expect(str).ToNot(BeNil())
- p := make([]byte, 4)
- _, err := str.Read(p)
- Expect(err).To(MatchError(io.EOF))
- Expect(p).To(Equal([]byte{0xde, 0xca, 0xfb, 0xad}))
- sess.garbageCollectStreams()
- Expect(sess.streamsMap.openStreams).To(HaveLen(numOpenStreams))
- str, _ = sess.streamsMap.GetOrOpenStream(5)
- Expect(str).ToNot(BeNil())
- // We still need to close the stream locally
- str.Close()
- // ... and simulate that we actually the FIN
- str.sentFin()
- sess.garbageCollectStreams()
- Expect(len(sess.streamsMap.openStreams)).To(BeNumerically("<", numOpenStreams))
- str, err = sess.streamsMap.GetOrOpenStream(5)
+ err = sess.handleFrames([]wire.Frame{&wire.ConnectionCloseFrame{ErrorCode: qerr.ProofInvalid, ReasonPhrase: "foobar"}}, protocol.EncryptionUnspecified)
Expect(err).NotTo(HaveOccurred())
- Expect(str).To(BeNil())
- // flow controller should have been notified
- _, err = sess.flowControlManager.SendWindowSize(5)
- Expect(err).To(MatchError("Error accessing the flowController map."))
+ Eventually(sess.Context().Done()).Should(BeClosed())
+ Eventually(done).Should(BeClosed())
+ })
+ })
+
+ It("tells its versions", func() {
+ sess.version = 4242
+ Expect(sess.GetVersion()).To(Equal(protocol.VersionNumber(4242)))
+ })
+
+ Context("waiting until the handshake completes", func() {
+ It("waits until the handshake is complete", func() {
+ go func() {
+ defer GinkgoRecover()
+ sess.run()
+ }()
+
+ done := make(chan struct{})
+ go func() {
+ defer GinkgoRecover()
+ err := sess.WaitUntilHandshakeComplete()
+ Expect(err).ToNot(HaveOccurred())
+ close(done)
+ }()
+ aeadChanged <- protocol.EncryptionForwardSecure
+ Consistently(done).ShouldNot(BeClosed())
+ close(aeadChanged)
+ Eventually(done).Should(BeClosed())
+ Expect(sess.Close(nil)).To(Succeed())
})
- It("cancels streams with error", func() {
- sess.garbageCollectStreams()
- testErr := errors.New("test")
- sess.handleStreamFrame(&frames.StreamFrame{
- StreamID: 5,
- Data: []byte{0xde, 0xca, 0xfb, 0xad},
- })
- str, err := sess.streamsMap.GetOrOpenStream(5)
- Expect(err).ToNot(HaveOccurred())
- Expect(str).ToNot(BeNil())
- p := make([]byte, 4)
- _, err = str.Read(p)
- Expect(err).ToNot(HaveOccurred())
- sess.closeStreamsWithError(testErr)
- _, err = str.Read(p)
+ It("errors if the handshake fails", func(done Done) {
+ testErr := errors.New("crypto error")
+ sess.cryptoSetup = &mockCryptoSetup{handleErr: testErr}
+ go sess.run()
+ err := sess.WaitUntilHandshakeComplete()
Expect(err).To(MatchError(testErr))
- sess.garbageCollectStreams()
- str, err = sess.streamsMap.GetOrOpenStream(5)
- Expect(err).NotTo(HaveOccurred())
- Expect(str).To(BeNil())
+ close(done)
+ }, 0.5)
+
+ It("returns when Close is called", func(done Done) {
+ testErr := errors.New("close error")
+ go sess.run()
+ var waitReturned bool
+ go func() {
+ defer GinkgoRecover()
+ err := sess.WaitUntilHandshakeComplete()
+ Expect(err).To(MatchError(testErr))
+ waitReturned = true
+ }()
+ sess.Close(testErr)
+ Eventually(func() bool { return waitReturned }).Should(BeTrue())
+ close(done)
})
- It("cancels empty streams with error", func() {
- testErr := errors.New("test")
- sess.GetOrOpenStream(5)
- str, err := sess.streamsMap.GetOrOpenStream(5)
+ It("doesn't wait if the handshake is already completed", func(done Done) {
+ go sess.run()
+ close(aeadChanged)
+ err := sess.WaitUntilHandshakeComplete()
Expect(err).ToNot(HaveOccurred())
- Expect(str).ToNot(BeNil())
- sess.closeStreamsWithError(testErr)
- _, err = str.Read([]byte{0})
- Expect(err).To(MatchError(testErr))
- sess.garbageCollectStreams()
- str, err = sess.streamsMap.GetOrOpenStream(5)
- Expect(err).NotTo(HaveOccurred())
- Expect(str).To(BeNil())
+ Expect(sess.Close(nil)).To(Succeed())
+ close(done)
})
-
- It("informs the FlowControlManager about new streams", func() {
- // since the stream doesn't yet exist, this will throw an error
- err := sess.flowControlManager.UpdateHighestReceived(5, 1000)
- Expect(err).To(HaveOccurred())
- sess.GetOrOpenStream(5)
- err = sess.flowControlManager.UpdateHighestReceived(5, 2000)
- Expect(err).ToNot(HaveOccurred())
- })
-
- It("ignores streams that existed previously", func() {
- sess.handleStreamFrame(&frames.StreamFrame{
- StreamID: 5,
- Data: []byte{},
- FinBit: true,
- })
- str, _ := sess.streamsMap.GetOrOpenStream(5)
- Expect(str).ToNot(BeNil())
- _, err := str.Read([]byte{0})
- Expect(err).To(MatchError(io.EOF))
- str.Close()
- str.sentFin()
- sess.garbageCollectStreams()
- err = sess.handleStreamFrame(&frames.StreamFrame{
- StreamID: 5,
- Data: []byte{},
- })
- Expect(err).To(BeNil())
- })
- })
-
- Context("handling RST_STREAM frames", func() {
- It("closes the streams for writing", func() {
- s, err := sess.GetOrOpenStream(5)
- Expect(err).ToNot(HaveOccurred())
- err = sess.handleRstStreamFrame(&frames.RstStreamFrame{
- StreamID: 5,
- ErrorCode: 42,
- })
- Expect(err).ToNot(HaveOccurred())
- n, err := s.Write([]byte{0})
- Expect(n).To(BeZero())
- Expect(err).To(MatchError("RST_STREAM received with code 42"))
- })
-
- It("doesn't close the stream for reading", func() {
- s, err := sess.GetOrOpenStream(5)
- Expect(err).ToNot(HaveOccurred())
- sess.handleStreamFrame(&frames.StreamFrame{
- StreamID: 5,
- Data: []byte("foobar"),
- })
- err = sess.handleRstStreamFrame(&frames.RstStreamFrame{
- StreamID: 5,
- ErrorCode: 42,
- ByteOffset: 6,
- })
- Expect(err).ToNot(HaveOccurred())
- b := make([]byte, 3)
- n, err := s.Read(b)
- Expect(n).To(Equal(3))
- Expect(err).ToNot(HaveOccurred())
- })
-
- It("queues a RST_STERAM frame with the correct offset", func() {
- str, err := sess.GetOrOpenStream(5)
- Expect(err).ToNot(HaveOccurred())
- str.(*stream).writeOffset = 0x1337
- err = sess.handleRstStreamFrame(&frames.RstStreamFrame{
- StreamID: 5,
- })
- Expect(err).ToNot(HaveOccurred())
- Expect(sess.packer.controlFrames).To(HaveLen(1))
- Expect(sess.packer.controlFrames[0].(*frames.RstStreamFrame)).To(Equal(&frames.RstStreamFrame{
- StreamID: 5,
- ByteOffset: 0x1337,
- }))
- Expect(str.(*stream).finished()).To(BeTrue())
- })
-
- It("doesn't queue a RST_STREAM for a stream that it already sent a FIN on", func() {
- str, err := sess.GetOrOpenStream(5)
- Expect(err).NotTo(HaveOccurred())
- str.(*stream).sentFin()
- str.Close()
- err = sess.handleRstStreamFrame(&frames.RstStreamFrame{
- StreamID: 5,
- })
- Expect(err).ToNot(HaveOccurred())
- Expect(sess.packer.controlFrames).To(BeEmpty())
- Expect(str.(*stream).finished()).To(BeTrue())
- })
-
- It("passes the byte offset to the flow controller", func() {
- sess.streamsMap.GetOrOpenStream(5)
- sess.flowControlManager = newMockFlowControlHandler()
- err := sess.handleRstStreamFrame(&frames.RstStreamFrame{
- StreamID: 5,
- ByteOffset: 0x1337,
- })
- Expect(err).ToNot(HaveOccurred())
- Expect(sess.flowControlManager.(*mockFlowControlHandler).highestReceivedForStream).To(Equal(protocol.StreamID(5)))
- Expect(sess.flowControlManager.(*mockFlowControlHandler).highestReceived).To(Equal(protocol.ByteCount(0x1337)))
- })
-
- It("returns errors from the flow controller", func() {
- sess.streamsMap.GetOrOpenStream(5)
- sess.flowControlManager = newMockFlowControlHandler()
- testErr := errors.New("flow control violation")
- sess.flowControlManager.(*mockFlowControlHandler).flowControlViolation = testErr
- err := sess.handleRstStreamFrame(&frames.RstStreamFrame{
- StreamID: 5,
- ByteOffset: 0x1337,
- })
- Expect(err).To(MatchError(testErr))
- })
-
- It("ignores the error when the stream is not known", func() {
- err := sess.handleFrames([]frames.Frame{&frames.RstStreamFrame{
- StreamID: 5,
- ErrorCode: 42,
- }})
- Expect(err).NotTo(HaveOccurred())
- })
-
- It("queues a RST_STREAM when a stream gets reset locally", func() {
- testErr := errors.New("testErr")
- str, err := sess.streamsMap.GetOrOpenStream(5)
- str.writeOffset = 0x1337
- Expect(err).ToNot(HaveOccurred())
- str.Reset(testErr)
- Expect(sess.packer.controlFrames).To(HaveLen(1))
- Expect(sess.packer.controlFrames[0]).To(Equal(&frames.RstStreamFrame{
- StreamID: 5,
- ByteOffset: 0x1337,
- }))
- Expect(str.finished()).To(BeFalse())
- })
-
- It("doesn't queue another RST_STREAM, when it receives an RST_STREAM as a response for the first", func() {
- testErr := errors.New("testErr")
- str, err := sess.streamsMap.GetOrOpenStream(5)
- Expect(err).ToNot(HaveOccurred())
- str.Reset(testErr)
- Expect(sess.packer.controlFrames).To(HaveLen(1))
- err = sess.handleRstStreamFrame(&frames.RstStreamFrame{
- StreamID: 5,
- ByteOffset: 0x42,
- })
- Expect(err).ToNot(HaveOccurred())
- Expect(sess.packer.controlFrames).To(HaveLen(1))
- })
- })
-
- Context("handling WINDOW_UPDATE frames", func() {
- It("updates the Flow Control Window of a stream", func() {
- _, err := sess.GetOrOpenStream(5)
- Expect(err).ToNot(HaveOccurred())
- err = sess.handleWindowUpdateFrame(&frames.WindowUpdateFrame{
- StreamID: 5,
- ByteOffset: 100,
- })
- Expect(err).ToNot(HaveOccurred())
- Expect(sess.flowControlManager.SendWindowSize(5)).To(Equal(protocol.ByteCount(100)))
- })
-
- It("updates the Flow Control Window of the connection", func() {
- err := sess.handleWindowUpdateFrame(&frames.WindowUpdateFrame{
- StreamID: 0,
- ByteOffset: 0x800000,
- })
- Expect(err).ToNot(HaveOccurred())
- })
-
- It("opens a new stream when receiving a WINDOW_UPDATE for an unknown stream", func() {
- err := sess.handleWindowUpdateFrame(&frames.WindowUpdateFrame{
- StreamID: 5,
- ByteOffset: 1337,
- })
- Expect(err).ToNot(HaveOccurred())
- str, err := sess.streamsMap.GetOrOpenStream(5)
- Expect(err).NotTo(HaveOccurred())
- Expect(str).ToNot(BeNil())
- })
-
- It("errors when receiving a WindowUpdateFrame for a closed stream", func() {
- sess.handleStreamFrame(&frames.StreamFrame{StreamID: 5})
- err := sess.streamsMap.RemoveStream(5)
- Expect(err).ToNot(HaveOccurred())
- sess.garbageCollectStreams()
- err = sess.handleWindowUpdateFrame(&frames.WindowUpdateFrame{
- StreamID: 5,
- ByteOffset: 1337,
- })
- Expect(err).To(MatchError(errWindowUpdateOnClosedStream))
- })
-
- It("ignores errors when receiving a WindowUpdateFrame for a closed stream", func() {
- sess.handleStreamFrame(&frames.StreamFrame{StreamID: 5})
- err := sess.streamsMap.RemoveStream(5)
- Expect(err).ToNot(HaveOccurred())
- sess.garbageCollectStreams()
- err = sess.handleFrames([]frames.Frame{&frames.WindowUpdateFrame{
- StreamID: 5,
- ByteOffset: 1337,
- }})
- Expect(err).NotTo(HaveOccurred())
- })
- })
-
- It("handles PING frames", func() {
- err := sess.handleFrames([]frames.Frame{&frames.PingFrame{}})
- Expect(err).NotTo(HaveOccurred())
- })
-
- It("handles BLOCKED frames", func() {
- err := sess.handleFrames([]frames.Frame{&frames.BlockedFrame{}})
- Expect(err).NotTo(HaveOccurred())
- })
-
- It("errors on GOAWAY frames", func() {
- err := sess.handleFrames([]frames.Frame{&frames.GoawayFrame{}})
- Expect(err).To(MatchError("unimplemented: handling GOAWAY frames"))
- })
-
- It("handles STOP_WAITING frames", func() {
- err := sess.handleFrames([]frames.Frame{&frames.StopWaitingFrame{LeastUnacked: 10}})
- Expect(err).NotTo(HaveOccurred())
- })
-
- It("handles CONNECTION_CLOSE frames", func() {
- str, _ := sess.GetOrOpenStream(5)
- err := sess.handleFrames([]frames.Frame{&frames.ConnectionCloseFrame{ErrorCode: 42, ReasonPhrase: "foobar"}})
- Expect(err).NotTo(HaveOccurred())
- _, err = str.Read([]byte{0})
- Expect(err).To(MatchError(qerr.Error(42, "foobar")))
})
Context("accepting streams", func() {
+ BeforeEach(func() {
+ // don't use the mock here
+ sess.streamsMap.newStream = sess.newStream
+ })
+
It("waits for new streams", func() {
- var str Stream
+ strChan := make(chan Stream)
+ // accept two streams
go func() {
defer GinkgoRecover()
- var err error
- str, err = sess.AcceptStream()
- Expect(err).ToNot(HaveOccurred())
+ for i := 0; i < 2; i++ {
+ str, err := sess.AcceptStream()
+ Expect(err).ToNot(HaveOccurred())
+ strChan <- str
+ }
}()
- Consistently(func() Stream { return str }).Should(BeNil())
- sess.handleStreamFrame(&frames.StreamFrame{
- StreamID: 3,
- })
- Eventually(func() Stream { return str }).ShouldNot(BeNil())
+ Consistently(strChan).ShouldNot(Receive())
+ // this could happen e.g. by receiving a STREAM frame
+ _, err := sess.GetOrOpenStream(5)
+ Expect(err).ToNot(HaveOccurred())
+ var str Stream
+ Eventually(strChan).Should(Receive(&str))
Expect(str.StreamID()).To(Equal(protocol.StreamID(3)))
+ Eventually(strChan).Should(Receive(&str))
+ Expect(str.StreamID()).To(Equal(protocol.StreamID(5)))
})
It("stops accepting when the session is closed", func() {
testErr := errors.New("testErr")
- var err error
+ done := make(chan struct{})
go func() {
- _, err = sess.AcceptStream()
+ defer GinkgoRecover()
+ _, err := sess.AcceptStream()
+ Expect(err).To(MatchError(qerr.ToQuicError(testErr)))
+ close(done)
}()
go sess.run()
- Consistently(func() error { return err }).ShouldNot(HaveOccurred())
+ Consistently(done).ShouldNot(BeClosed())
sess.Close(testErr)
- Eventually(func() error { return err }).Should(HaveOccurred())
- Expect(err).To(MatchError(qerr.ToQuicError(testErr)))
+ Eventually(done).Should(BeClosed())
})
It("stops accepting when the session is closed after version negotiation", func() {
- testErr := errCloseSessionForNewVersion
- var err error
+ done := make(chan struct{})
go func() {
- _, err = sess.AcceptStream()
+ defer GinkgoRecover()
+ _, err := sess.AcceptStream()
+ Expect(err).To(MatchError(qerr.Error(qerr.InternalError, errCloseSessionForNewVersion.Error())))
+ close(done)
}()
go sess.run()
- Consistently(func() error { return err }).ShouldNot(HaveOccurred())
- sess.Close(testErr)
- Eventually(func() error { return err }).Should(HaveOccurred())
- Expect(err).To(MatchError(testErr))
+ Consistently(done).ShouldNot(BeClosed())
+ Expect(sess.Context().Done()).ToNot(BeClosed())
+ sess.Close(errCloseSessionForNewVersion)
+ Eventually(done).Should(BeClosed())
+ Eventually(sess.Context().Done()).Should(BeClosed())
})
})
@@ -641,9 +618,11 @@ var _ = Describe("Session", func() {
sess.Close(nil)
Eventually(areSessionsRunning).Should(BeFalse())
Expect(mconn.written).To(HaveLen(1))
- Expect(mconn.written[0][len(mconn.written[0])-7:]).To(Equal([]byte{0x02, byte(qerr.PeerGoingAway), 0, 0, 0, 0, 0}))
- Expect(closeCallbackCalled).To(BeTrue())
- Expect(sess.runClosed).ToNot(Receive()) // channel should be drained by Close()
+ buf := &bytes.Buffer{}
+ err := (&wire.ConnectionCloseFrame{ErrorCode: qerr.PeerGoingAway}).Write(buf, sess.version)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(mconn.written).To(Receive(ContainSubstring(string(buf.Bytes()))))
+ Expect(sess.Context().Done()).To(BeClosed())
})
It("only closes once", func() {
@@ -651,7 +630,7 @@ var _ = Describe("Session", func() {
sess.Close(nil)
Eventually(areSessionsRunning).Should(BeFalse())
Expect(mconn.written).To(HaveLen(1))
- Expect(sess.runClosed).ToNot(Receive()) // channel should be drained by Close()
+ Expect(sess.Context().Done()).To(BeClosed())
})
It("closes streams with proper error", func() {
@@ -660,98 +639,113 @@ var _ = Describe("Session", func() {
Expect(err).NotTo(HaveOccurred())
sess.Close(testErr)
Eventually(areSessionsRunning).Should(BeFalse())
- Expect(closeCallbackCalled).To(BeTrue())
n, err := s.Read([]byte{0})
Expect(n).To(BeZero())
Expect(err.Error()).To(ContainSubstring(testErr.Error()))
n, err = s.Write([]byte{0})
Expect(n).To(BeZero())
Expect(err.Error()).To(ContainSubstring(testErr.Error()))
- Expect(sess.runClosed).ToNot(Receive()) // channel should be drained by Close()
+ Expect(sess.Context().Done()).To(BeClosed())
})
It("closes the session in order to replace it with another QUIC version", func() {
sess.Close(errCloseSessionForNewVersion)
- Expect(closeCallbackCalled).To(BeFalse())
Eventually(areSessionsRunning).Should(BeFalse())
- Expect(atomic.LoadUint32(&sess.closed) != 0).To(BeTrue())
Expect(mconn.written).To(BeEmpty()) // no CONNECTION_CLOSE or PUBLIC_RESET sent
})
It("sends a Public Reset if the client is initiating the head-of-line blocking experiment", func() {
sess.Close(handshake.ErrHOLExperiment)
- Expect(closeCallbackCalled).To(BeTrue())
Expect(mconn.written).To(HaveLen(1))
- Expect(mconn.written[0][0] & 0x02).ToNot(BeZero()) // Public Reset
- Expect(sess.runClosed).ToNot(Receive()) // channel should be drained by Close()
+ Expect((<-mconn.written)[0] & 0x02).ToNot(BeZero()) // Public Reset
+ Expect(sess.Context().Done()).To(BeClosed())
+ })
+
+ It("sends a Public Reset if the client is initiating the no STOP_WAITING experiment", func() {
+ sess.Close(handshake.ErrHOLExperiment)
+ Expect(mconn.written).To(HaveLen(1))
+ Expect((<-mconn.written)[0] & 0x02).ToNot(BeZero()) // Public Reset
+ Expect(sess.Context().Done()).To(BeClosed())
+ })
+
+ It("cancels the context when the run loop exists", func() {
+ returned := make(chan struct{})
+ go func() {
+ defer GinkgoRecover()
+ ctx := sess.Context()
+ <-ctx.Done()
+ Expect(ctx.Err()).To(MatchError(context.Canceled))
+ close(returned)
+ }()
+ Consistently(returned).ShouldNot(BeClosed())
+ sess.Close(nil)
+ Eventually(returned).Should(BeClosed())
})
})
Context("receiving packets", func() {
- var hdr *PublicHeader
+ var hdr *wire.Header
BeforeEach(func() {
sess.unpacker = &mockUnpacker{}
- clientSess.unpacker = &mockUnpacker{}
- hdr = &PublicHeader{PacketNumberLen: protocol.PacketNumberLen6}
+ hdr = &wire.Header{PacketNumberLen: protocol.PacketNumberLen6}
})
It("sets the {last,largest}RcvdPacketNumber", func() {
hdr.PacketNumber = 5
- err := sess.handlePacketImpl(&receivedPacket{publicHeader: hdr})
+ err := sess.handlePacketImpl(&receivedPacket{header: hdr})
Expect(err).ToNot(HaveOccurred())
Expect(sess.lastRcvdPacketNumber).To(Equal(protocol.PacketNumber(5)))
Expect(sess.largestRcvdPacketNumber).To(Equal(protocol.PacketNumber(5)))
})
+ It("closes when handling a packet fails", func(done Done) {
+ testErr := errors.New("unpack error")
+ hdr.PacketNumber = 5
+ var runErr error
+ go func() {
+ runErr = sess.run()
+ }()
+ sess.unpacker.(*mockUnpacker).unpackErr = testErr
+ sess.handlePacket(&receivedPacket{header: hdr})
+ Eventually(func() error { return runErr }).Should(MatchError(testErr))
+ Expect(sess.Context().Done()).To(BeClosed())
+ close(done)
+ })
+
It("sets the {last,largest}RcvdPacketNumber, for an out-of-order packet", func() {
hdr.PacketNumber = 5
- err := sess.handlePacketImpl(&receivedPacket{publicHeader: hdr})
+ err := sess.handlePacketImpl(&receivedPacket{header: hdr})
Expect(err).ToNot(HaveOccurred())
Expect(sess.lastRcvdPacketNumber).To(Equal(protocol.PacketNumber(5)))
Expect(sess.largestRcvdPacketNumber).To(Equal(protocol.PacketNumber(5)))
hdr.PacketNumber = 3
- err = sess.handlePacketImpl(&receivedPacket{publicHeader: hdr})
+ err = sess.handlePacketImpl(&receivedPacket{header: hdr})
Expect(err).ToNot(HaveOccurred())
Expect(sess.lastRcvdPacketNumber).To(Equal(protocol.PacketNumber(3)))
Expect(sess.largestRcvdPacketNumber).To(Equal(protocol.PacketNumber(5)))
})
- It("ignores duplicate packets", func() {
+ It("handles duplicate packets", func() {
hdr.PacketNumber = 5
- err := sess.handlePacketImpl(&receivedPacket{publicHeader: hdr})
+ err := sess.handlePacketImpl(&receivedPacket{header: hdr})
Expect(err).ToNot(HaveOccurred())
- err = sess.handlePacketImpl(&receivedPacket{publicHeader: hdr})
+ err = sess.handlePacketImpl(&receivedPacket{header: hdr})
Expect(err).ToNot(HaveOccurred())
})
- It("ignores packets smaller than the highest LeastUnacked of a StopWaiting", func() {
- err := sess.receivedPacketHandler.ReceivedStopWaiting(&frames.StopWaitingFrame{LeastUnacked: 10})
- Expect(err).ToNot(HaveOccurred())
- hdr.PacketNumber = 5
- err = sess.handlePacketImpl(&receivedPacket{publicHeader: hdr})
- Expect(err).ToNot(HaveOccurred())
- })
-
- It("passes the diversification nonce to the cryptoSetup, if it is a client", func() {
- hdr.PacketNumber = 5
- hdr.DiversificationNonce = []byte("foobar")
- err := clientSess.handlePacketImpl(&receivedPacket{publicHeader: hdr})
- Expect(err).ToNot(HaveOccurred())
- Expect((*[]byte)(unsafe.Pointer(reflect.ValueOf(clientSess.cryptoSetup).Elem().FieldByName("diversificationNonce").UnsafeAddr()))).To(Equal(&hdr.DiversificationNonce))
- })
-
Context("updating the remote address", func() {
- It("sets the remote address", func() {
+ It("doesn't support connection migration", func() {
+ origAddr := sess.conn.(*mockConnection).remoteAddr
remoteIP := &net.IPAddr{IP: net.IPv4(192, 168, 0, 100)}
- Expect(sess.conn.(*mockConnection).remoteAddr).ToNot(Equal(remoteIP))
+ Expect(origAddr).ToNot(Equal(remoteIP))
p := receivedPacket{
- remoteAddr: remoteIP,
- publicHeader: &PublicHeader{PacketNumber: 1337},
+ remoteAddr: remoteIP,
+ header: &wire.Header{PacketNumber: 1337},
}
err := sess.handlePacketImpl(&p)
Expect(err).ToNot(HaveOccurred())
- Expect(sess.conn.(*mockConnection).remoteAddr).To(Equal(remoteIP))
+ Expect(sess.conn.(*mockConnection).remoteAddr).To(Equal(origAddr))
})
It("doesn't change the remote address if authenticating the packet fails", func() {
@@ -762,69 +756,87 @@ var _ = Describe("Session", func() {
sess.unpacker = &packetUnpacker{}
sess.unpacker.(*packetUnpacker).aead = &mockAEAD{}
p := receivedPacket{
- remoteAddr: attackerIP,
- publicHeader: &PublicHeader{PacketNumber: 1337},
+ remoteAddr: attackerIP,
+ header: &wire.Header{PacketNumber: 1337},
}
err := sess.handlePacketImpl(&p)
quicErr := err.(*qerr.QuicError)
Expect(quicErr.ErrorCode).To(Equal(qerr.DecryptionFailure))
Expect(sess.conn.(*mockConnection).remoteAddr).To(Equal(remoteIP))
})
-
- It("sets the remote address, if the packet is authenticated, but unpacking fails for another reason", func() {
- testErr := errors.New("testErr")
- remoteIP := &net.IPAddr{IP: net.IPv4(192, 168, 0, 100)}
- Expect(sess.conn.(*mockConnection).remoteAddr).ToNot(Equal(remoteIP))
- p := receivedPacket{
- remoteAddr: remoteIP,
- publicHeader: &PublicHeader{PacketNumber: 1337},
- }
- sess.unpacker.(*mockUnpacker).unpackErr = testErr
- err := sess.handlePacketImpl(&p)
- Expect(err).To(MatchError(testErr))
- Expect(sess.conn.(*mockConnection).remoteAddr).To(Equal(remoteIP))
- })
})
})
Context("sending packets", func() {
- It("sends ack frames", func() {
- packetNumber := protocol.PacketNumber(0x035E)
+ BeforeEach(func() {
+ sess.packer.hasSentPacket = true // make sure this is not the first packet the packer sends
+ })
+
+ It("sends ACK frames", func() {
+ packetNumber := protocol.PacketNumber(0x035e)
+ err := sess.receivedPacketHandler.ReceivedPacket(packetNumber, true)
+ Expect(err).ToNot(HaveOccurred())
+ err = sess.sendPacket()
+ Expect(err).NotTo(HaveOccurred())
+ Expect(mconn.written).To(HaveLen(1))
+ Expect(mconn.written).To(Receive(ContainSubstring(string([]byte{0x03, 0x5e}))))
+ })
+
+ It("sends ACK frames when congestion limited", func() {
+ sess.sentPacketHandler = &mockSentPacketHandler{congestionLimited: true}
+ sess.packer.packetNumberGenerator.next = 0x1338
+ packetNumber := protocol.PacketNumber(0x035e)
sess.receivedPacketHandler.ReceivedPacket(packetNumber, true)
err := sess.sendPacket()
Expect(err).NotTo(HaveOccurred())
Expect(mconn.written).To(HaveLen(1))
- Expect(mconn.written[0]).To(ContainSubstring(string([]byte{0x5E, 0x03})))
+ Expect(mconn.written).To(Receive(ContainSubstring(string([]byte{0x03, 0x5e}))))
})
- It("sends two WindowUpdate frames", func() {
- _, err := sess.GetOrOpenStream(5)
+ It("sends a retransmittable packet when required by the SentPacketHandler", func() {
+ sess.sentPacketHandler = &mockSentPacketHandler{shouldSendRetransmittablePacket: true}
+ err := sess.sendPacket()
Expect(err).ToNot(HaveOccurred())
- sess.flowControlManager.AddBytesRead(5, protocol.ReceiveStreamFlowControlWindow)
+ Expect(mconn.written).To(HaveLen(1))
+ Expect(sess.sentPacketHandler.(*mockSentPacketHandler).sentPackets[0].Frames).To(ContainElement(&wire.PingFrame{}))
+ })
+
+ It("sends two MAX_STREAM_DATA frames", func() {
+ mockFC := mocks.NewMockStreamFlowController(mockCtrl)
+ mockFC.EXPECT().GetWindowUpdate().Return(protocol.ByteCount(0x1000))
+ mockFC.EXPECT().GetWindowUpdate().Return(protocol.ByteCount(0)).Times(2)
+ str, err := sess.GetOrOpenStream(5)
+ Expect(err).ToNot(HaveOccurred())
+ str.(*stream).flowController = mockFC
err = sess.sendPacket()
Expect(err).NotTo(HaveOccurred())
err = sess.sendPacket()
Expect(err).NotTo(HaveOccurred())
err = sess.sendPacket()
Expect(err).NotTo(HaveOccurred())
+ buf := &bytes.Buffer{}
+ (&wire.MaxStreamDataFrame{
+ StreamID: 5,
+ ByteOffset: 0x1000,
+ }).Write(buf, sess.version)
Expect(mconn.written).To(HaveLen(2))
- Expect(mconn.written[0]).To(ContainSubstring(string([]byte{0x04, 0x05, 0, 0, 0})))
- Expect(mconn.written[1]).To(ContainSubstring(string([]byte{0x04, 0x05, 0, 0, 0})))
+ Expect(mconn.written).To(Receive(ContainSubstring(string(buf.Bytes()))))
+ Expect(mconn.written).To(Receive(ContainSubstring(string(buf.Bytes()))))
})
It("sends public reset", func() {
err := sess.sendPublicReset(1)
Expect(err).NotTo(HaveOccurred())
Expect(mconn.written).To(HaveLen(1))
- Expect(mconn.written[0]).To(ContainSubstring(string([]byte("PRST"))))
+ Expect(mconn.written).To(Receive(ContainSubstring("PRST")))
})
It("informs the SentPacketHandler about sent packets", func() {
sess.sentPacketHandler = newMockSentPacketHandler()
sess.packer.packetNumberGenerator.next = 0x1337 + 9
- sess.packer.cryptoSetup = &mockCryptoSetup{encLevelSeal: protocol.EncryptionSecure}
+ sess.packer.cryptoSetup = &mockCryptoSetup{encLevelSeal: protocol.EncryptionForwardSecure}
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
StreamID: 5,
Data: []byte("foobar"),
}
@@ -837,8 +849,9 @@ var _ = Describe("Session", func() {
sentPackets := sess.sentPacketHandler.(*mockSentPacketHandler).sentPackets
Expect(sentPackets).To(HaveLen(1))
Expect(sentPackets[0].Frames).To(ContainElement(f))
- Expect(sentPackets[0].EncryptionLevel).To(Equal(protocol.EncryptionSecure))
- Expect(sentPackets[0].Length).To(BeEquivalentTo(len(mconn.written[0])))
+ Expect(sentPackets[0].EncryptionLevel).To(Equal(protocol.EncryptionForwardSecure))
+ Expect(mconn.written).To(HaveLen(1))
+ Expect(sentPackets[0].Length).To(BeEquivalentTo(len(<-mconn.written)))
})
})
@@ -847,6 +860,7 @@ var _ = Describe("Session", func() {
BeforeEach(func() {
// a StopWaitingFrame is added, so make sure the packet number of the new package is higher than the packet number of the retransmitted packet
sess.packer.packetNumberGenerator.next = 0x1337 + 10
+ sess.packer.hasSentPacket = true // make sure this is not the first packet the packer sends
sph = newMockSentPacketHandler().(*mockSentPacketHandler)
sess.sentPacketHandler = sph
sess.packer.cryptoSetup = &mockCryptoSetup{encLevelSeal: protocol.EncryptionForwardSecure}
@@ -854,9 +868,9 @@ var _ = Describe("Session", func() {
Context("for handshake packets", func() {
It("retransmits an unencrypted packet", func() {
- sf := &frames.StreamFrame{StreamID: 1, Data: []byte("foobar")}
+ sf := &wire.StreamFrame{StreamID: 1, Data: []byte("foobar")}
sph.retransmissionQueue = []*ackhandler.Packet{{
- Frames: []frames.Frame{sf},
+ Frames: []wire.Frame{sf},
EncryptionLevel: protocol.EncryptionUnencrypted,
}}
err := sess.sendPacket()
@@ -867,27 +881,14 @@ var _ = Describe("Session", func() {
Expect(sentPackets[0].EncryptionLevel).To(Equal(protocol.EncryptionUnencrypted))
Expect(sentPackets[0].Frames).To(HaveLen(2))
Expect(sentPackets[0].Frames[1]).To(Equal(sf))
- swf := sentPackets[0].Frames[0].(*frames.StopWaitingFrame)
+ swf := sentPackets[0].Frames[0].(*wire.StopWaitingFrame)
Expect(swf.LeastUnacked).To(Equal(protocol.PacketNumber(0x1337)))
})
- It("doesn't retransmit non-retransmittable packets", func() {
- sph.retransmissionQueue = []*ackhandler.Packet{{
- Frames: []frames.Frame{
- &frames.AckFrame{},
- &frames.StopWaitingFrame{},
- },
- EncryptionLevel: protocol.EncryptionUnencrypted,
- }}
- err := sess.sendPacket()
- Expect(err).ToNot(HaveOccurred())
- Expect(mconn.written).To(BeEmpty())
- })
-
It("retransmit a packet encrypted with the initial encryption", func() {
- sf := &frames.StreamFrame{StreamID: 1, Data: []byte("foobar")}
+ sf := &wire.StreamFrame{StreamID: 1, Data: []byte("foobar")}
sph.retransmissionQueue = []*ackhandler.Packet{{
- Frames: []frames.Frame{sf},
+ Frames: []wire.Frame{sf},
EncryptionLevel: protocol.EncryptionSecure,
}}
err := sess.sendPacket()
@@ -899,21 +900,29 @@ var _ = Describe("Session", func() {
Expect(sentPackets[0].Frames).To(HaveLen(2))
Expect(sentPackets[0].Frames).To(ContainElement(sf))
})
+
+ It("doesn't retransmit handshake packets when the handshake is complete", func() {
+ sess.handshakeComplete = true
+ sf := &wire.StreamFrame{StreamID: 1, Data: []byte("foobar")}
+ sph.retransmissionQueue = []*ackhandler.Packet{{
+ Frames: []wire.Frame{sf},
+ EncryptionLevel: protocol.EncryptionSecure,
+ }}
+ err := sess.sendPacket()
+ Expect(err).ToNot(HaveOccurred())
+ Expect(mconn.written).To(BeEmpty())
+ })
})
Context("for packets after the handshake", func() {
- BeforeEach(func() {
- sess.packer.SetForwardSecure()
- })
-
It("sends a StreamFrame from a packet queued for retransmission", func() {
- f := frames.StreamFrame{
+ f := wire.StreamFrame{
StreamID: 0x5,
Data: []byte("foobar1234567"),
}
p := ackhandler.Packet{
PacketNumber: 0x1337,
- Frames: []frames.Frame{&f},
+ Frames: []wire.Frame{&f},
EncryptionLevel: protocol.EncryptionForwardSecure,
}
sph.retransmissionQueue = []*ackhandler.Packet{&p}
@@ -922,26 +931,26 @@ var _ = Describe("Session", func() {
Expect(err).NotTo(HaveOccurred())
Expect(mconn.written).To(HaveLen(1))
Expect(sph.requestedStopWaiting).To(BeTrue())
- Expect(mconn.written[0]).To(ContainSubstring("foobar1234567"))
+ Expect(mconn.written).To(Receive(ContainSubstring("foobar1234567")))
})
It("sends a StreamFrame from a packet queued for retransmission", func() {
- f1 := frames.StreamFrame{
+ f1 := wire.StreamFrame{
StreamID: 0x5,
Data: []byte("foobar"),
}
- f2 := frames.StreamFrame{
+ f2 := wire.StreamFrame{
StreamID: 0x7,
Data: []byte("loremipsum"),
}
p1 := ackhandler.Packet{
PacketNumber: 0x1337,
- Frames: []frames.Frame{&f1},
+ Frames: []wire.Frame{&f1},
EncryptionLevel: protocol.EncryptionForwardSecure,
}
p2 := ackhandler.Packet{
PacketNumber: 0x1338,
- Frames: []frames.Frame{&f2},
+ Frames: []wire.Frame{&f2},
EncryptionLevel: protocol.EncryptionForwardSecure,
}
sph.retransmissionQueue = []*ackhandler.Packet{&p1, &p2}
@@ -949,12 +958,13 @@ var _ = Describe("Session", func() {
err := sess.sendPacket()
Expect(err).NotTo(HaveOccurred())
Expect(mconn.written).To(HaveLen(1))
- Expect(mconn.written[0]).To(ContainSubstring("foobar"))
- Expect(mconn.written[0]).To(ContainSubstring("loremipsum"))
+ packet := <-mconn.written
+ Expect(packet).To(ContainSubstring("foobar"))
+ Expect(packet).To(ContainSubstring("loremipsum"))
})
It("always attaches a StopWaiting to a packet that contains a retransmission", func() {
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
StreamID: 0x5,
Data: bytes.Repeat([]byte{'f'}, int(1.5*float32(protocol.MaxPacketSize))),
}
@@ -965,97 +975,29 @@ var _ = Describe("Session", func() {
Expect(mconn.written).To(HaveLen(2))
sentPackets := sph.sentPackets
Expect(sentPackets).To(HaveLen(2))
- _, ok := sentPackets[0].Frames[0].(*frames.StopWaitingFrame)
+ _, ok := sentPackets[0].Frames[0].(*wire.StopWaitingFrame)
Expect(ok).To(BeTrue())
- _, ok = sentPackets[1].Frames[0].(*frames.StopWaitingFrame)
+ _, ok = sentPackets[1].Frames[0].(*wire.StopWaitingFrame)
Expect(ok).To(BeTrue())
})
-
- It("retransmits a WindowUpdates if it hasn't already sent a WindowUpdate with a higher ByteOffset", func() {
- _, err := sess.GetOrOpenStream(5)
- Expect(err).ToNot(HaveOccurred())
- fc := newMockFlowControlHandler()
- fc.receiveWindow = 0x1000
- sess.flowControlManager = fc
- wuf := &frames.WindowUpdateFrame{
- StreamID: 5,
- ByteOffset: 0x1000,
- }
- sph.retransmissionQueue = []*ackhandler.Packet{{
- Frames: []frames.Frame{wuf},
- EncryptionLevel: protocol.EncryptionForwardSecure,
- }}
- err = sess.sendPacket()
- Expect(err).ToNot(HaveOccurred())
- Expect(sph.sentPackets).To(HaveLen(1))
- Expect(sph.sentPackets[0].Frames).To(ContainElement(wuf))
- })
-
- It("doesn't retransmit WindowUpdates if it already sent a WindowUpdate with a higher ByteOffset", func() {
- _, err := sess.GetOrOpenStream(5)
- Expect(err).ToNot(HaveOccurred())
- fc := newMockFlowControlHandler()
- fc.receiveWindow = 0x2000
- sess.flowControlManager = fc
- sph.retransmissionQueue = []*ackhandler.Packet{{
- Frames: []frames.Frame{&frames.WindowUpdateFrame{
- StreamID: 5,
- ByteOffset: 0x1000,
- }},
- EncryptionLevel: protocol.EncryptionForwardSecure,
- }}
- err = sess.sendPacket()
- Expect(err).ToNot(HaveOccurred())
- Expect(sph.sentPackets).To(BeEmpty())
- })
-
- It("doesn't retransmit WindowUpdates for closed streams", func() {
- str, err := sess.GetOrOpenStream(5)
- Expect(err).ToNot(HaveOccurred())
- // close the stream
- str.(*stream).sentFin()
- str.Close()
- str.(*stream).RegisterRemoteError(nil)
- sess.garbageCollectStreams()
- _, err = sess.flowControlManager.SendWindowSize(5)
- Expect(err).To(MatchError("Error accessing the flowController map."))
- sph.retransmissionQueue = []*ackhandler.Packet{{
- Frames: []frames.Frame{&frames.WindowUpdateFrame{
- StreamID: 5,
- ByteOffset: 0x1337,
- }},
- EncryptionLevel: protocol.EncryptionForwardSecure,
- }}
- err = sess.sendPacket()
- Expect(err).ToNot(HaveOccurred())
- Expect(sph.sentPackets).To(BeEmpty())
- })
})
})
It("retransmits RTO packets", func() {
+ sess.packer.hasSentPacket = true // make sure this is not the first packet the packer sends
+ sess.sentPacketHandler.SetHandshakeComplete()
+ n := protocol.PacketNumber(10)
sess.packer.cryptoSetup = &mockCryptoSetup{encLevelSeal: protocol.EncryptionForwardSecure}
// We simulate consistently low RTTs, so that the test works faster
- n := protocol.PacketNumber(10)
- for p := protocol.PacketNumber(1); p < n; p++ {
- err := sess.sentPacketHandler.SentPacket(&ackhandler.Packet{
- PacketNumber: p,
- Length: 1,
- EncryptionLevel: protocol.EncryptionForwardSecure,
- })
- Expect(err).NotTo(HaveOccurred())
- time.Sleep(time.Microsecond)
- ack := &frames.AckFrame{}
- ack.LargestAcked = p
- err = sess.sentPacketHandler.ReceivedAck(ack, p, time.Now())
- Expect(err).NotTo(HaveOccurred())
- }
+ rtt := time.Millisecond
+ sess.rttStats.UpdateRTT(rtt, 0, time.Now())
+ Expect(sess.rttStats.SmoothedRTT()).To(Equal(rtt)) // make sure it worked
sess.packer.packetNumberGenerator.next = n + 1
// Now, we send a single packet, and expect that it was retransmitted later
err := sess.sentPacketHandler.SentPacket(&ackhandler.Packet{
PacketNumber: n,
Length: 1,
- Frames: []frames.Frame{&frames.StreamFrame{
+ Frames: []wire.Frame{&wire.StreamFrame{
Data: []byte("foobar"),
}},
EncryptionLevel: protocol.EncryptionForwardSecure,
@@ -1064,12 +1006,18 @@ var _ = Describe("Session", func() {
go sess.run()
defer sess.Close(nil)
sess.scheduleSending()
- Eventually(func() [][]byte { return mconn.written }).ShouldNot(BeEmpty())
- Expect(mconn.written[0]).To(ContainSubstring("foobar"))
+ Eventually(func() int { return len(mconn.written) }).ShouldNot(BeZero())
+ Expect(mconn.written).To(Receive(ContainSubstring("foobar")))
})
Context("scheduling sending", func() {
BeforeEach(func() {
+ sess.packer.hasSentPacket = true // make sure this is not the first packet the packer sends
+ sess.processTransportParameters(&handshake.TransportParameters{
+ StreamFlowControlWindow: protocol.MaxByteCount,
+ ConnectionFlowControlWindow: protocol.MaxByteCount,
+ MaxStreams: 1000,
+ })
sess.packer.cryptoSetup = &mockCryptoSetup{encLevelSeal: protocol.EncryptionForwardSecure}
})
@@ -1082,19 +1030,18 @@ var _ = Describe("Session", func() {
close(done)
}()
Eventually(sess.sendingScheduled).Should(Receive())
- s.(*stream).getDataForWriting(1000) // unblock
+ s.(*stream).GetDataForWriting(1000) // unblock
})
It("sets the timer to the ack timer", func() {
- rph := &mockReceivedPacketHandler{}
- rph.nextAckFrame = &frames.AckFrame{LargestAcked: 0x1337}
+ rph := &mockReceivedPacketHandler{ackAlarm: time.Now().Add(10 * time.Millisecond)}
+ rph.nextAckFrame = &wire.AckFrame{LargestAcked: 0x1337}
sess.receivedPacketHandler = rph
go sess.run()
defer sess.Close(nil)
- sess.ackAlarmChanged(time.Now().Add(10 * time.Millisecond))
time.Sleep(10 * time.Millisecond)
Eventually(func() int { return len(mconn.written) }).ShouldNot(BeZero())
- Expect(mconn.written[0]).To(ContainSubstring(string([]byte{0x37, 0x13})))
+ Expect(mconn.written).To(Receive(ContainSubstring(string([]byte{0x13, 0x37}))))
})
Context("bundling of small packets", func() {
@@ -1112,9 +1059,10 @@ var _ = Describe("Session", func() {
go sess.run()
defer sess.Close(nil)
- Eventually(func() [][]byte { return mconn.written }).Should(HaveLen(1))
- Expect(mconn.written[0]).To(ContainSubstring("foobar1"))
- Expect(mconn.written[0]).To(ContainSubstring("foobar2"))
+ Eventually(mconn.written).Should(HaveLen(1))
+ packet := <-mconn.written
+ Expect(packet).To(ContainSubstring("foobar1"))
+ Expect(packet).To(ContainSubstring("foobar2"))
})
It("sends out two big frames in two packets", func() {
@@ -1130,7 +1078,7 @@ var _ = Describe("Session", func() {
}()
_, err = s2.Write(bytes.Repeat([]byte{'e'}, 1000))
Expect(err).ToNot(HaveOccurred())
- Eventually(func() [][]byte { return mconn.written }).Should(HaveLen(2))
+ Eventually(mconn.written).Should(HaveLen(2))
})
It("sends out two small frames that are written to long after one another into two packets", func() {
@@ -1140,10 +1088,10 @@ var _ = Describe("Session", func() {
defer sess.Close(nil)
_, err = s.Write([]byte("foobar1"))
Expect(err).NotTo(HaveOccurred())
- Eventually(func() [][]byte { return mconn.written }).Should(HaveLen(1))
+ Eventually(mconn.written).Should(HaveLen(1))
_, err = s.Write([]byte("foobar2"))
Expect(err).NotTo(HaveOccurred())
- Eventually(func() [][]byte { return mconn.written }).Should(HaveLen(2))
+ Eventually(mconn.written).Should(HaveLen(2))
})
It("sends a queued ACK frame only once", func() {
@@ -1156,38 +1104,26 @@ var _ = Describe("Session", func() {
defer sess.Close(nil)
_, err = s.Write([]byte("foobar1"))
Expect(err).NotTo(HaveOccurred())
- Eventually(func() [][]byte { return mconn.written }).Should(HaveLen(1))
+ Eventually(mconn.written).Should(HaveLen(1))
_, err = s.Write([]byte("foobar2"))
Expect(err).NotTo(HaveOccurred())
- Eventually(func() [][]byte { return mconn.written }).Should(HaveLen(2))
- Expect(mconn.written[0]).To(ContainSubstring(string([]byte{0x37, 0x13})))
- Expect(mconn.written[1]).ToNot(ContainSubstring(string([]byte{0x37, 0x13})))
+ Eventually(mconn.written).Should(HaveLen(2))
+ Expect(mconn.written).To(Receive(ContainSubstring(string([]byte{0x13, 0x37}))))
+ Expect(mconn.written).ToNot(Receive(ContainSubstring(string([]byte{0x13, 0x37}))))
})
})
})
- It("tells the packetPacker when forward-secure encryption is used", func() {
- go sess.run()
- defer sess.Close(nil)
- sess.aeadChanged <- protocol.EncryptionSecure
- Consistently(func() bool { return sess.packer.isForwardSecure }).Should(BeFalse())
- sess.aeadChanged <- protocol.EncryptionForwardSecure
- Eventually(func() bool { return sess.packer.isForwardSecure }).Should(BeTrue())
- })
-
It("closes when crypto stream errors", func() {
- go sess.run()
- s, err := sess.GetOrOpenStream(3)
- Expect(err).NotTo(HaveOccurred())
- err = sess.handleStreamFrame(&frames.StreamFrame{
- StreamID: 1,
- Data: []byte("4242\x00\x00\x00\x00"),
- })
- Expect(err).NotTo(HaveOccurred())
- Eventually(func() bool { return atomic.LoadUint32(&sess.closed) != 0 }).Should(BeTrue())
- _, err = s.Write([]byte{})
- Expect(err.(*qerr.QuicError).ErrorCode).To(Equal(qerr.InvalidCryptoMessageType))
+ testErr := errors.New("crypto setup error")
+ cryptoSetup.handleErr = testErr
+ var runErr error
+ go func() {
+ runErr = sess.run()
+ }()
+ Eventually(func() error { return runErr }).Should(HaveOccurred())
+ Expect(runErr).To(MatchError(testErr))
})
Context("sending a Public Reset when receiving undecryptable packets during the handshake", func() {
@@ -1195,10 +1131,14 @@ var _ = Describe("Session", func() {
// this completely fills up the undecryptable packets queue and triggers the public reset timer
sendUndecryptablePackets := func() {
for i := 0; i < protocol.MaxUndecryptablePackets+1; i++ {
- hdr := &PublicHeader{
+ hdr := &wire.Header{
PacketNumber: protocol.PacketNumber(i + 1),
}
- sess.handlePacket(&receivedPacket{publicHeader: hdr, data: []byte("foobar")})
+ sess.handlePacket(&receivedPacket{
+ header: hdr,
+ remoteAddr: &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 1234},
+ data: []byte("foobar"),
+ })
}
}
@@ -1211,14 +1151,17 @@ var _ = Describe("Session", func() {
go sess.run()
sendUndecryptablePackets()
sess.scheduleSending()
- Consistently(func() [][]byte { return mconn.written }).Should(HaveLen(0))
+ Consistently(mconn.written).Should(HaveLen(0))
+ Expect(sess.Close(nil)).To(Succeed())
+ Eventually(sess.Context().Done()).Should(BeClosed())
})
It("sets a deadline to send a Public Reset after receiving too many undecryptable packets", func() {
go sess.run()
sendUndecryptablePackets()
- Eventually(func() time.Time { return sess.receivedTooManyUndecrytablePacketsTime }).Should(BeTemporally("~", time.Now(), 10*time.Millisecond))
+ Eventually(func() time.Time { return sess.receivedTooManyUndecrytablePacketsTime }).Should(BeTemporally("~", time.Now(), 20*time.Millisecond))
sess.Close(nil)
+ Eventually(sess.Context().Done()).Should(BeClosed())
})
It("drops undecryptable packets when the undecrytable packet queue is full", func() {
@@ -1226,21 +1169,23 @@ var _ = Describe("Session", func() {
sendUndecryptablePackets()
Eventually(func() []*receivedPacket { return sess.undecryptablePackets }).Should(HaveLen(protocol.MaxUndecryptablePackets))
// check that old packets are kept, and the new packets are dropped
- Expect(sess.undecryptablePackets[0].publicHeader.PacketNumber).To(Equal(protocol.PacketNumber(1)))
- sess.Close(nil)
+ Expect(sess.undecryptablePackets[0].header.PacketNumber).To(Equal(protocol.PacketNumber(1)))
+ Expect(sess.Close(nil)).To(Succeed())
+ Eventually(sess.Context().Done()).Should(BeClosed())
})
It("sends a Public Reset after a timeout", func() {
+ Expect(sess.receivedTooManyUndecrytablePacketsTime).To(BeZero())
go sess.run()
sendUndecryptablePackets()
- Eventually(func() time.Time { return sess.receivedTooManyUndecrytablePacketsTime }).Should(BeTemporally("~", time.Now(), time.Millisecond))
+ Eventually(func() time.Time { return sess.receivedTooManyUndecrytablePacketsTime }).Should(BeTemporally("~", time.Now(), time.Second))
// speed up this test by manually setting back the time when too many packets were received
sess.receivedTooManyUndecrytablePacketsTime = time.Now().Add(-protocol.PublicResetTimeout)
time.Sleep(10 * time.Millisecond) // wait for the run loop to spin up
sess.scheduleSending() // wake up the run loop
- Eventually(func() [][]byte { return mconn.written }).Should(HaveLen(1))
- Expect(mconn.written[0]).To(ContainSubstring(string([]byte("PRST"))))
- Expect(sess.runClosed).To(Receive())
+ Eventually(mconn.written).Should(HaveLen(1))
+ Expect(mconn.written).To(Receive(ContainSubstring("PRST")))
+ Eventually(sess.Context().Done()).Should(BeClosed())
})
It("doesn't send a Public Reset if decrypting them suceeded during the timeout", func() {
@@ -1249,23 +1194,24 @@ var _ = Describe("Session", func() {
sess.scheduleSending() // wake up the run loop
// there are no packets in the undecryptable packet queue
// in reality, this happens when the trial decryption succeeded during the Public Reset timeout
- Consistently(func() [][]byte { return mconn.written }).ShouldNot(HaveLen(1))
- Expect(sess.runClosed).ToNot(Receive())
- sess.Close(nil)
+ Consistently(mconn.written).ShouldNot(HaveLen(1))
+ Expect(sess.Context().Done()).ToNot(Receive())
+ Expect(sess.Close(nil)).To(Succeed())
+ Eventually(sess.Context().Done()).Should(BeClosed())
})
It("ignores undecryptable packets after the handshake is complete", func() {
- sess.cryptoSetup.(*mockCryptoSetup).handshakeComplete = true
+ sess.handshakeComplete = true
go sess.run()
sendUndecryptablePackets()
Consistently(sess.undecryptablePackets).Should(BeEmpty())
- sess.closeImpl(nil, true)
- Eventually(sess.runClosed).Should(Receive())
+ Expect(sess.Close(nil)).To(Succeed())
+ Eventually(sess.Context().Done()).Should(BeClosed())
})
It("unqueues undecryptable packets for later decryption", func() {
sess.undecryptablePackets = []*receivedPacket{{
- publicHeader: &PublicHeader{PacketNumber: protocol.PacketNumber(42)},
+ header: &wire.Header{PacketNumber: protocol.PacketNumber(42)},
}}
Expect(sess.receivedPackets).NotTo(Receive())
sess.tryDecryptingQueuedPackets()
@@ -1274,83 +1220,158 @@ var _ = Describe("Session", func() {
})
})
- It("calls the cryptoChangeCallback when the AEAD changes", func(done Done) {
- var callbackCalled bool
- var callbackCalledWith bool
- var callbackSession Session
- cb := func(s Session, p bool) {
- callbackCalled = true
- callbackCalledWith = p
- callbackSession = s
- }
- sess.cryptoChangeCallback = cb
- sess.aeadChanged <- protocol.EncryptionSecure
+ It("send a handshake event on the handshakeChan when the AEAD changes to secure", func(done Done) {
go sess.run()
- defer sess.Close(nil)
- Eventually(func() bool { return callbackCalled }).Should(BeTrue())
- Expect(callbackCalledWith).To(BeFalse())
- Expect(callbackSession).To(Equal(sess))
+ aeadChanged <- protocol.EncryptionSecure
+ Eventually(sess.handshakeStatus()).Should(Receive(&handshakeEvent{encLevel: protocol.EncryptionSecure}))
+ Expect(sess.Close(nil)).To(Succeed())
close(done)
})
- It("calls the cryptoChangeCallback when the AEAD changes to forward secure encryption", func(done Done) {
- var callbackCalledWith bool
- var callbackSession Session
- cb := func(s Session, p bool) {
- callbackSession = s
- callbackCalledWith = p
- }
- sess.cryptoChangeCallback = cb
- sess.cryptoSetup = &mockCryptoSetup{handshakeComplete: true}
- sess.aeadChanged <- protocol.EncryptionForwardSecure
+ It("send a handshake event on the handshakeChan when the AEAD changes to forward-secure", func(done Done) {
go sess.run()
- defer sess.Close(nil)
- Eventually(func() bool { return callbackCalledWith }).Should(BeTrue())
- Expect(callbackSession).To(Equal(sess))
+ aeadChanged <- protocol.EncryptionForwardSecure
+ Eventually(sess.handshakeStatus()).Should(Receive(&handshakeEvent{encLevel: protocol.EncryptionForwardSecure}))
+ Expect(sess.Close(nil)).To(Succeed())
close(done)
})
+ It("closes the handshakeChan when the handshake completes", func(done Done) {
+ go sess.run()
+ close(aeadChanged)
+ Eventually(sess.handshakeStatus()).Should(BeClosed())
+ Expect(sess.Close(nil)).To(Succeed())
+ close(done)
+ })
+
+ It("passes errors to the handshakeChan", func(done Done) {
+ testErr := errors.New("handshake error")
+ go sess.run()
+ Expect(sess.Close(nil)).To(Succeed())
+ Expect(sess.handshakeStatus()).To(Receive(&handshakeEvent{err: testErr}))
+ close(done)
+ })
+
+ It("does not block if an error occurs", func(done Done) {
+ // this test basically tests that the handshakeChan has a capacity of 3
+ // The session needs to run (and close) properly, even if no one is receiving from the handshakeChan
+ go sess.run()
+ aeadChanged <- protocol.EncryptionSecure
+ aeadChanged <- protocol.EncryptionForwardSecure
+ Expect(sess.Close(nil)).To(Succeed())
+ close(done)
+ })
+
+ It("process transport parameters received from the peer", func() {
+ paramsChan := make(chan handshake.TransportParameters)
+ sess.paramsChan = paramsChan
+ _, err := sess.GetOrOpenStream(5)
+ Expect(err).ToNot(HaveOccurred())
+ go sess.run()
+ params := handshake.TransportParameters{
+ MaxStreams: 123,
+ IdleTimeout: 90 * time.Second,
+ StreamFlowControlWindow: 0x5000,
+ ConnectionFlowControlWindow: 0x5000,
+ OmitConnectionID: true,
+ }
+ paramsChan <- params
+ Eventually(func() *handshake.TransportParameters { return sess.peerParams }).Should(Equal(¶ms))
+ Eventually(func() uint32 { return sess.streamsMap.maxOutgoingStreams }).Should(Equal(uint32(123)))
+ // Eventually(func() (protocol.ByteCount, error) { return sess.flowControlManager.SendWindowSize(5) }).Should(Equal(protocol.ByteCount(0x5000)))
+ Eventually(func() bool { return sess.packer.omitConnectionID }).Should(BeTrue())
+ Expect(sess.Close(nil)).To(Succeed())
+ })
+
+ Context("keep-alives", func() {
+ // should be shorter than the local timeout for these tests
+ // otherwise we'd send a CONNECTION_CLOSE in the tests where we're testing that no PING is sent
+ remoteIdleTimeout := 20 * time.Second
+
+ BeforeEach(func() {
+ sess.peerParams = &handshake.TransportParameters{IdleTimeout: remoteIdleTimeout}
+ })
+
+ It("sends a PING", func() {
+ sess.handshakeComplete = true
+ sess.config.KeepAlive = true
+ sess.lastNetworkActivityTime = time.Now().Add(-remoteIdleTimeout / 2)
+ sess.packer.hasSentPacket = true // make sure this is not the first packet the packer sends
+ go sess.run()
+ defer sess.Close(nil)
+ var data []byte
+ Eventually(mconn.written).Should(Receive(&data))
+ // -12 because of the crypto tag. This should be 7 (the frame id for a ping frame).
+ Expect(data[len(data)-12-1 : len(data)-12]).To(Equal([]byte{0x07}))
+ })
+
+ It("doesn't send a PING packet if keep-alive is disabled", func() {
+ sess.handshakeComplete = true
+ sess.config.KeepAlive = false
+ sess.lastNetworkActivityTime = time.Now().Add(-remoteIdleTimeout / 2)
+ go sess.run()
+ defer sess.Close(nil)
+ Consistently(mconn.written).ShouldNot(Receive())
+ })
+
+ It("doesn't send a PING if the handshake isn't completed yet", func() {
+ sess.handshakeComplete = false
+ sess.config.KeepAlive = true
+ sess.lastNetworkActivityTime = time.Now().Add(-remoteIdleTimeout / 2)
+ go sess.run()
+ defer sess.Close(nil)
+ Consistently(mconn.written).ShouldNot(Receive())
+ })
+ })
+
Context("timeouts", func() {
It("times out due to no network activity", func(done Done) {
+ sess.handshakeComplete = true
sess.lastNetworkActivityTime = time.Now().Add(-time.Hour)
- sess.run() // Would normally not return
- Expect(mconn.written[0]).To(ContainSubstring("No recent network activity."))
- Expect(closeCallbackCalled).To(BeTrue())
- Expect(sess.runClosed).To(Receive())
+ err := sess.run() // Would normally not return
+ Expect(err.(*qerr.QuicError).ErrorCode).To(Equal(qerr.NetworkIdleTimeout))
+ Expect(mconn.written).To(Receive(ContainSubstring("No recent network activity.")))
+ Expect(sess.Context().Done()).To(BeClosed())
close(done)
})
- It("times out due to non-completed crypto handshake", func(done Done) {
- sess.sessionCreationTime = time.Now().Add(-time.Hour)
- sess.run() // Would normally not return
- Expect(mconn.written[0]).To(ContainSubstring("Crypto handshake did not complete in time."))
- Expect(closeCallbackCalled).To(BeTrue())
- Expect(sess.runClosed).To(Receive())
+ It("times out due to non-completed handshake", func(done Done) {
+ sess.sessionCreationTime = time.Now().Add(-protocol.DefaultHandshakeTimeout).Add(-time.Second)
+ err := sess.run() // Would normally not return
+ Expect(err.(*qerr.QuicError).ErrorCode).To(Equal(qerr.HandshakeTimeout))
+ Expect(mconn.written).To(Receive(ContainSubstring("Crypto handshake did not complete in time.")))
+ Expect(sess.Context().Done()).To(BeClosed())
close(done)
})
- It("does not use ICSL before handshake", func(done Done) {
+ It("does not use the idle timeout before the handshake complete", func() {
+ sess.config.IdleTimeout = 9999 * time.Second
+ defer sess.Close(nil)
sess.lastNetworkActivityTime = time.Now().Add(-time.Minute)
- cpm.idleTime = 99999 * time.Second
- sess.packer.connectionParameters = sess.connectionParameters
- sess.run() // Would normally not return
- Expect(mconn.written[0]).To(ContainSubstring("No recent network activity."))
- Expect(closeCallbackCalled).To(BeTrue())
- Expect(sess.runClosed).To(Receive())
- close(done)
+ // the handshake timeout is irrelevant here, since it depends on the time the session was created,
+ // and not on the last network activity
+ done := make(chan struct{})
+ go func() {
+ defer GinkgoRecover()
+ _ = sess.run()
+ close(done)
+ }()
+ Consistently(done).ShouldNot(BeClosed())
})
- It("uses ICSL after handshake", func(done Done) {
- // sess.lastNetworkActivityTime = time.Now().Add(-time.Minute)
- *(*bool)(unsafe.Pointer(reflect.ValueOf(sess.cryptoSetup).Elem().FieldByName("receivedForwardSecurePacket").UnsafeAddr())) = true
- *(*crypto.AEAD)(unsafe.Pointer(reflect.ValueOf(sess.cryptoSetup).Elem().FieldByName("forwardSecureAEAD").UnsafeAddr())) = &crypto.NullAEAD{}
- cpm.idleTime = 0 * time.Millisecond
- sess.packer.connectionParameters = sess.connectionParameters
- sess.run() // Would normally not return
- Expect(mconn.written[0]).To(ContainSubstring("No recent network activity."))
- Expect(closeCallbackCalled).To(BeTrue())
- Expect(sess.runClosed).To(Receive())
- close(done)
+ It("closes the session due to the idle timeout after handshake", func() {
+ sess.config.IdleTimeout = 0
+ close(aeadChanged)
+ errChan := make(chan error)
+ go func() {
+ defer GinkgoRecover()
+ errChan <- sess.run() // Would normally not return
+ }()
+ var err error
+ Eventually(errChan).Should(Receive(&err))
+ Expect(err.(*qerr.QuicError).ErrorCode).To(Equal(qerr.NetworkIdleTimeout))
+ Expect(mconn.written).To(Receive(ContainSubstring("No recent network activity.")))
+ Expect(sess.Context().Done()).To(BeClosed())
})
})
@@ -1363,6 +1384,10 @@ var _ = Describe("Session", func() {
}, 0.5)
Context("getting streams", func() {
+ BeforeEach(func() {
+ sess.processTransportParameters(&handshake.TransportParameters{MaxStreams: 1000})
+ })
+
It("returns a new stream", func() {
str, err := sess.GetOrOpenStream(11)
Expect(err).ToNot(HaveOccurred())
@@ -1371,13 +1396,16 @@ var _ = Describe("Session", func() {
})
It("returns a nil-value (not an interface with value nil) for closed streams", func() {
- _, err := sess.GetOrOpenStream(9)
- Expect(err).ToNot(HaveOccurred())
- sess.streamsMap.RemoveStream(9)
- sess.garbageCollectStreams()
- Expect(sess.streamsMap.GetOrOpenStream(9)).To(BeNil())
str, err := sess.GetOrOpenStream(9)
Expect(err).ToNot(HaveOccurred())
+ str.Close()
+ str.(*stream).Cancel(nil)
+ Expect(str.(*stream).Finished()).To(BeTrue())
+ err = sess.streamsMap.DeleteClosedStreams()
+ Expect(err).ToNot(HaveOccurred())
+ Expect(sess.streamsMap.GetOrOpenStream(9)).To(BeNil())
+ str, err = sess.GetOrOpenStream(9)
+ Expect(err).ToNot(HaveOccurred())
Expect(str).To(BeNil())
// make sure that the returned value is a plain nil, not an Stream with value nil
_, ok := str.(Stream)
@@ -1394,7 +1422,7 @@ var _ = Describe("Session", func() {
Context("counting streams", func() {
It("errors when too many streams are opened", func() {
- for i := 0; i < 110; i++ {
+ for i := 0; i < protocol.MaxIncomingStreams; i++ {
_, err := sess.GetOrOpenStream(protocol.StreamID(i*2 + 1))
Expect(err).NotTo(HaveOccurred())
}
@@ -1406,13 +1434,13 @@ var _ = Describe("Session", func() {
for i := 2; i <= 1000; i++ {
s, err := sess.GetOrOpenStream(protocol.StreamID(i*2 + 1))
Expect(err).NotTo(HaveOccurred())
- err = s.Close()
- Expect(err).NotTo(HaveOccurred())
- s.(*stream).sentFin()
+ Expect(s.Close()).To(Succeed())
+ _, sentFin := s.(*stream).GetDataForWriting(1000) // trigger "sending" of the FIN bit
+ Expect(sentFin).To(BeTrue())
s.(*stream).CloseRemote(0)
_, err = s.Read([]byte("a"))
Expect(err).To(MatchError(io.EOF))
- sess.garbageCollectStreams()
+ sess.streamsMap.DeleteClosedStreams()
}
})
})
@@ -1423,40 +1451,40 @@ var _ = Describe("Session", func() {
PacketNumber: 1,
Length: 1,
})
- err := sess.handleFrames([]frames.Frame{&frames.AckFrame{
+ err := sess.handleFrames([]wire.Frame{&wire.AckFrame{
LargestAcked: 1,
- }})
+ }}, protocol.EncryptionUnspecified)
Expect(err).NotTo(HaveOccurred())
- err = sess.handleFrames([]frames.Frame{&frames.AckFrame{
+ err = sess.handleFrames([]wire.Frame{&wire.AckFrame{
LargestAcked: 1,
- }})
+ }}, protocol.EncryptionUnspecified)
Expect(err).NotTo(HaveOccurred())
})
})
- Context("window updates", func() {
- It("gets stream level window updates", func() {
- err := sess.flowControlManager.AddBytesRead(1, protocol.ReceiveStreamFlowControlWindow)
- Expect(err).NotTo(HaveOccurred())
- frames, err := sess.getWindowUpdateFrames()
- Expect(err).NotTo(HaveOccurred())
- Expect(frames).To(HaveLen(1))
- Expect(frames[0].StreamID).To(Equal(protocol.StreamID(1)))
- Expect(frames[0].ByteOffset).To(Equal(protocol.ReceiveStreamFlowControlWindow * 2))
- })
+ // Context("window updates", func() {
+ // It("gets stream level window updates", func() {
+ // _, err := sess.GetOrOpenStream(3)
+ // Expect(err).ToNot(HaveOccurred())
+ // err = sess.flowControlManager.AddBytesRead(3, protocol.ReceiveStreamFlowControlWindow)
+ // Expect(err).NotTo(HaveOccurred())
+ // frames := sess.getWindowUpdateFrames()
+ // Expect(frames).To(HaveLen(1))
+ // Expect(frames[0].StreamID).To(Equal(protocol.StreamID(3)))
+ // Expect(frames[0].ByteOffset).To(BeEquivalentTo(protocol.ReceiveStreamFlowControlWindow * 2))
+ // })
- It("gets connection level window updates", func() {
- _, err := sess.GetOrOpenStream(5)
- Expect(err).NotTo(HaveOccurred())
- err = sess.flowControlManager.AddBytesRead(5, protocol.ReceiveConnectionFlowControlWindow)
- Expect(err).NotTo(HaveOccurred())
- frames, err := sess.getWindowUpdateFrames()
- Expect(err).NotTo(HaveOccurred())
- Expect(frames).To(HaveLen(1))
- Expect(frames[0].StreamID).To(Equal(protocol.StreamID(0)))
- Expect(frames[0].ByteOffset).To(Equal(protocol.ReceiveConnectionFlowControlWindow * 2))
- })
- })
+ // It("gets connection level window updates", func() {
+ // _, err := sess.GetOrOpenStream(5)
+ // Expect(err).NotTo(HaveOccurred())
+ // err = sess.flowControlManager.AddBytesRead(5, protocol.ReceiveConnectionFlowControlWindow)
+ // Expect(err).NotTo(HaveOccurred())
+ // frames := sess.getWindowUpdateFrames()
+ // Expect(frames).To(HaveLen(1))
+ // Expect(frames[0].StreamID).To(Equal(protocol.StreamID(0)))
+ // Expect(frames[0].ByteOffset).To(BeEquivalentTo(protocol.ReceiveConnectionFlowControlWindow * 2))
+ // })
+ // })
It("returns the local address", func() {
addr := &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 1337}
@@ -1470,3 +1498,85 @@ var _ = Describe("Session", func() {
Expect(sess.RemoteAddr()).To(Equal(addr))
})
})
+
+var _ = Describe("Client Session", func() {
+ var (
+ sess *session
+ mconn *mockConnection
+ aeadChanged chan<- protocol.EncryptionLevel
+
+ cryptoSetup *mockCryptoSetup
+ )
+
+ BeforeEach(func() {
+ Eventually(areSessionsRunning).Should(BeFalse())
+
+ cryptoSetup = &mockCryptoSetup{}
+ newCryptoSetupClient = func(
+ _ io.ReadWriter,
+ _ string,
+ _ protocol.ConnectionID,
+ _ protocol.VersionNumber,
+ _ *tls.Config,
+ _ *handshake.TransportParameters,
+ _ chan<- handshake.TransportParameters,
+ aeadChangedP chan<- protocol.EncryptionLevel,
+ _ protocol.VersionNumber,
+ _ []protocol.VersionNumber,
+ ) (handshake.CryptoSetup, error) {
+ aeadChanged = aeadChangedP
+ return cryptoSetup, nil
+ }
+
+ mconn = newMockConnection()
+ sessP, err := newClientSession(
+ mconn,
+ "hostname",
+ protocol.Version39,
+ 0,
+ nil,
+ populateClientConfig(&Config{}),
+ protocol.VersionWhatever,
+ nil,
+ )
+ sess = sessP.(*session)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(sess.streamsMap.openStreams).To(BeEmpty())
+ })
+
+ AfterEach(func() {
+ newCryptoSetupClient = handshake.NewCryptoSetupClient
+ })
+
+ Context("receiving packets", func() {
+ var hdr *wire.Header
+
+ BeforeEach(func() {
+ hdr = &wire.Header{PacketNumberLen: protocol.PacketNumberLen6}
+ sess.unpacker = &mockUnpacker{}
+ })
+
+ It("passes the diversification nonce to the cryptoSetup", func() {
+ go func() {
+ defer GinkgoRecover()
+ sess.run()
+ }()
+ hdr.PacketNumber = 5
+ hdr.DiversificationNonce = []byte("foobar")
+ err := sess.handlePacketImpl(&receivedPacket{header: hdr})
+ Expect(err).ToNot(HaveOccurred())
+ Eventually(func() []byte { return cryptoSetup.divNonce }).Should(Equal(hdr.DiversificationNonce))
+ Expect(sess.Close(nil)).To(Succeed())
+ })
+ })
+
+ It("does not block if an error occurs", func(done Done) {
+ // this test basically tests that the handshakeChan has a capacity of 3
+ // The session needs to run (and close) properly, even if no one is receiving from the handshakeChan
+ go sess.run()
+ aeadChanged <- protocol.EncryptionSecure
+ aeadChanged <- protocol.EncryptionForwardSecure
+ Expect(sess.Close(nil)).To(Succeed())
+ close(done)
+ })
+})
diff --git a/vendor/github.com/lucas-clemente/quic-go/stream.go b/vendor/github.com/lucas-clemente/quic-go/stream.go
index 72d3ec8..0e4f34e 100644
--- a/vendor/github.com/lucas-clemente/quic-go/stream.go
+++ b/vendor/github.com/lucas-clemente/quic-go/stream.go
@@ -1,22 +1,49 @@
package quic
import (
+ "context"
"fmt"
"io"
+ "net"
"sync"
+ "time"
- "github.com/lucas-clemente/quic-go/flowcontrol"
- "github.com/lucas-clemente/quic-go/frames"
- "github.com/lucas-clemente/quic-go/protocol"
- "github.com/lucas-clemente/quic-go/utils"
+ "github.com/lucas-clemente/quic-go/internal/flowcontrol"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+ "github.com/lucas-clemente/quic-go/internal/wire"
)
+type streamI interface {
+ Stream
+
+ AddStreamFrame(*wire.StreamFrame) error
+ RegisterRemoteError(error, protocol.ByteCount) error
+ HasDataForWriting() bool
+ GetDataForWriting(maxBytes protocol.ByteCount) (data []byte, shouldSendFin bool)
+ GetWriteOffset() protocol.ByteCount
+ Finished() bool
+ Cancel(error)
+ // methods needed for flow control
+ GetWindowUpdate() protocol.ByteCount
+ UpdateSendWindow(protocol.ByteCount)
+ IsFlowControlBlocked() bool
+}
+
+type cryptoStream interface {
+ streamI
+ SetReadOffset(protocol.ByteCount)
+}
+
// A Stream assembles the data from StreamFrames and provides a super-convenient Read-Interface
//
// Read() and Write() may be called concurrently, but multiple calls to Read() or Write() individually must be synchronized manually.
type stream struct {
mutex sync.Mutex
+ ctx context.Context
+ ctxCancel context.CancelFunc
+
streamID protocol.StreamID
onData func()
// onReset is a callback that should send a RST_STREAM
@@ -40,37 +67,59 @@ type stream struct {
// resetRemotely is set if RegisterRemoteError() is called
resetRemotely utils.AtomicBool
- frameQueue *streamFrameSorter
- newFrameOrErrCond sync.Cond
+ frameQueue *streamFrameSorter
+ readChan chan struct{}
+ readDeadline time.Time
- dataForWriting []byte
- finSent utils.AtomicBool
- rstSent utils.AtomicBool
- doneWritingOrErrCond sync.Cond
+ dataForWriting []byte
+ finSent utils.AtomicBool
+ rstSent utils.AtomicBool
+ writeChan chan struct{}
+ writeDeadline time.Time
- flowControlManager flowcontrol.FlowControlManager
+ flowController flowcontrol.StreamFlowController
+ version protocol.VersionNumber
}
+var _ Stream = &stream{}
+var _ streamI = &stream{}
+
+type deadlineError struct{}
+
+func (deadlineError) Error() string { return "deadline exceeded" }
+func (deadlineError) Temporary() bool { return true }
+func (deadlineError) Timeout() bool { return true }
+
+var errDeadline net.Error = &deadlineError{}
+
// newStream creates a new Stream
-func newStream(StreamID protocol.StreamID, onData func(), onReset func(protocol.StreamID, protocol.ByteCount), flowControlManager flowcontrol.FlowControlManager) (*stream, error) {
+func newStream(StreamID protocol.StreamID,
+ onData func(),
+ onReset func(protocol.StreamID, protocol.ByteCount),
+ flowController flowcontrol.StreamFlowController,
+ version protocol.VersionNumber,
+) *stream {
s := &stream{
- onData: onData,
- onReset: onReset,
- streamID: StreamID,
- flowControlManager: flowControlManager,
- frameQueue: newStreamFrameSorter(),
+ onData: onData,
+ onReset: onReset,
+ streamID: StreamID,
+ flowController: flowController,
+ frameQueue: newStreamFrameSorter(),
+ readChan: make(chan struct{}, 1),
+ writeChan: make(chan struct{}, 1),
+ version: version,
}
-
- s.newFrameOrErrCond.L = &s.mutex
- s.doneWritingOrErrCond.L = &s.mutex
-
- return s, nil
+ s.ctx, s.ctxCancel = context.WithCancel(context.Background())
+ return s
}
// Read implements io.Reader. It is not thread safe!
func (s *stream) Read(p []byte) (int, error) {
+ s.mutex.Lock()
+ err := s.err
+ s.mutex.Unlock()
if s.cancelled.Get() || s.resetLocally.Get() {
- return 0, s.err
+ return 0, err
}
if s.finishedReading.Get() {
return 0, io.EOF
@@ -80,10 +129,10 @@ func (s *stream) Read(p []byte) (int, error) {
for bytesRead < len(p) {
s.mutex.Lock()
frame := s.frameQueue.Head()
-
if frame == nil && bytesRead > 0 {
+ err = s.err
s.mutex.Unlock()
- return bytesRead, s.err
+ return bytesRead, err
}
var err error
@@ -93,11 +142,28 @@ func (s *stream) Read(p []byte) (int, error) {
err = s.err
break
}
+
+ deadline := s.readDeadline
+ if !deadline.IsZero() && !time.Now().Before(deadline) {
+ err = errDeadline
+ break
+ }
+
if frame != nil {
s.readPosInFrame = int(s.readOffset - frame.Offset)
break
}
- s.newFrameOrErrCond.Wait()
+
+ s.mutex.Unlock()
+ if deadline.IsZero() {
+ <-s.readChan
+ } else {
+ select {
+ case <-s.readChan:
+ case <-time.After(deadline.Sub(time.Now())):
+ }
+ }
+ s.mutex.Lock()
frame = s.frameQueue.Head()
}
s.mutex.Unlock()
@@ -122,7 +188,7 @@ func (s *stream) Read(p []byte) (int, error) {
// when a RST_STREAM was received, the was already informed about the final byteOffset for this stream
if !s.resetRemotely.Get() {
- s.flowControlManager.AddBytesRead(s.streamID, protocol.ByteCount(m))
+ s.flowController.AddBytesRead(protocol.ByteCount(m))
}
s.onData() // so that a possible WINDOW_UPDATE is sent
@@ -142,57 +208,93 @@ func (s *stream) Read(p []byte) (int, error) {
}
func (s *stream) Write(p []byte) (int, error) {
- if s.resetLocally.Get() {
- return 0, s.err
- }
-
s.mutex.Lock()
defer s.mutex.Unlock()
- if s.err != nil {
+ if s.resetLocally.Get() || s.err != nil {
return 0, s.err
}
-
+ if s.finishedWriting.Get() {
+ return 0, fmt.Errorf("write on closed stream %d", s.streamID)
+ }
if len(p) == 0 {
return 0, nil
}
s.dataForWriting = make([]byte, len(p))
copy(s.dataForWriting, p)
-
s.onData()
- for s.dataForWriting != nil && s.err == nil {
- s.doneWritingOrErrCond.Wait()
+ var err error
+ for {
+ deadline := s.writeDeadline
+ if !deadline.IsZero() && !time.Now().Before(deadline) {
+ err = errDeadline
+ break
+ }
+ if s.dataForWriting == nil || s.err != nil {
+ break
+ }
+
+ s.mutex.Unlock()
+ if deadline.IsZero() {
+ <-s.writeChan
+ } else {
+ select {
+ case <-s.writeChan:
+ case <-time.After(deadline.Sub(time.Now())):
+ }
+ }
+ s.mutex.Lock()
}
+ if err != nil {
+ return 0, err
+ }
if s.err != nil {
- return 0, s.err
+ return len(p) - len(s.dataForWriting), s.err
}
-
return len(p), nil
}
-func (s *stream) lenOfDataForWriting() protocol.ByteCount {
- s.mutex.Lock()
- var l protocol.ByteCount
- if s.err == nil {
- l = protocol.ByteCount(len(s.dataForWriting))
- }
- s.mutex.Unlock()
- return l
+func (s *stream) GetWriteOffset() protocol.ByteCount {
+ return s.writeOffset
}
-func (s *stream) getDataForWriting(maxBytes protocol.ByteCount) []byte {
+// HasDataForWriting says if there's stream available to be dequeued for writing
+func (s *stream) HasDataForWriting() bool {
s.mutex.Lock()
- if s.err != nil {
- s.mutex.Unlock()
- return nil
+ hasData := s.err == nil && // nothing should be sent if an error occurred
+ (len(s.dataForWriting) > 0 || // there is data queued for sending
+ s.finishedWriting.Get() && !s.finSent.Get()) // if there is no data, but writing finished and the FIN hasn't been sent yet
+ s.mutex.Unlock()
+ return hasData
+}
+
+func (s *stream) GetDataForWriting(maxBytes protocol.ByteCount) ([]byte, bool /* should send FIN */) {
+ data, shouldSendFin := s.getDataForWritingImpl(maxBytes)
+ if shouldSendFin {
+ s.finSent.Set(true)
}
- if s.dataForWriting == nil {
- s.mutex.Unlock()
- return nil
+ return data, shouldSendFin
+}
+
+func (s *stream) getDataForWritingImpl(maxBytes protocol.ByteCount) ([]byte, bool /* should send FIN */) {
+ s.mutex.Lock()
+ defer s.mutex.Unlock()
+
+ if s.err != nil || s.dataForWriting == nil {
+ return nil, s.finishedWriting.Get() && !s.finSent.Get()
}
+
+ // TODO(#657): Flow control for the crypto stream
+ if s.streamID != s.version.CryptoStreamID() {
+ maxBytes = utils.MinByteCount(maxBytes, s.flowController.SendWindowSize())
+ }
+ if maxBytes == 0 {
+ return nil, false
+ }
+
var ret []byte
if protocol.ByteCount(len(s.dataForWriting)) > maxBytes {
ret = s.dataForWriting[:maxBytes]
@@ -200,16 +302,17 @@ func (s *stream) getDataForWriting(maxBytes protocol.ByteCount) []byte {
} else {
ret = s.dataForWriting
s.dataForWriting = nil
- s.doneWritingOrErrCond.Signal()
+ s.signalWrite()
}
s.writeOffset += protocol.ByteCount(len(ret))
- s.mutex.Unlock()
- return ret
+ s.flowController.AddBytesSent(protocol.ByteCount(len(ret)))
+ return ret, s.finishedWriting.Get() && s.dataForWriting == nil && !s.finSent.Get()
}
// Close implements io.Closer
func (s *stream) Close() error {
s.finishedWriting.Set(true)
+ s.ctxCancel()
s.onData()
return nil
}
@@ -221,38 +324,70 @@ func (s *stream) shouldSendReset() bool {
return (s.resetLocally.Get() || s.resetRemotely.Get()) && !s.finishedWriteAndSentFin()
}
-func (s *stream) shouldSendFin() bool {
- s.mutex.Lock()
- res := s.finishedWriting.Get() && !s.finSent.Get() && s.err == nil && s.dataForWriting == nil
- s.mutex.Unlock()
- return res
-}
-
-func (s *stream) sentFin() {
- s.finSent.Set(true)
-}
-
// AddStreamFrame adds a new stream frame
-func (s *stream) AddStreamFrame(frame *frames.StreamFrame) error {
+func (s *stream) AddStreamFrame(frame *wire.StreamFrame) error {
maxOffset := frame.Offset + frame.DataLen()
- err := s.flowControlManager.UpdateHighestReceived(s.streamID, maxOffset)
- if err != nil {
+ if err := s.flowController.UpdateHighestReceived(maxOffset, frame.FinBit); err != nil {
return err
}
s.mutex.Lock()
defer s.mutex.Unlock()
- err = s.frameQueue.Push(frame)
- if err != nil && err != errDuplicateStreamData {
+ if err := s.frameQueue.Push(frame); err != nil && err != errDuplicateStreamData {
return err
}
- s.newFrameOrErrCond.Signal()
+ s.signalRead()
+ return nil
+}
+
+// signalRead performs a non-blocking send on the readChan
+func (s *stream) signalRead() {
+ select {
+ case s.readChan <- struct{}{}:
+ default:
+ }
+}
+
+// signalRead performs a non-blocking send on the writeChan
+func (s *stream) signalWrite() {
+ select {
+ case s.writeChan <- struct{}{}:
+ default:
+ }
+}
+
+func (s *stream) SetReadDeadline(t time.Time) error {
+ s.mutex.Lock()
+ oldDeadline := s.readDeadline
+ s.readDeadline = t
+ s.mutex.Unlock()
+ // if the new deadline is before the currently set deadline, wake up Read()
+ if t.Before(oldDeadline) {
+ s.signalRead()
+ }
+ return nil
+}
+
+func (s *stream) SetWriteDeadline(t time.Time) error {
+ s.mutex.Lock()
+ oldDeadline := s.writeDeadline
+ s.writeDeadline = t
+ s.mutex.Unlock()
+ if t.Before(oldDeadline) {
+ s.signalWrite()
+ }
+ return nil
+}
+
+func (s *stream) SetDeadline(t time.Time) error {
+ _ = s.SetReadDeadline(t) // SetReadDeadline never errors
+ _ = s.SetWriteDeadline(t) // SetWriteDeadline never errors
return nil
}
// CloseRemote makes the stream receive a "virtual" FIN stream frame at a given offset
func (s *stream) CloseRemote(offset protocol.ByteCount) {
- s.AddStreamFrame(&frames.StreamFrame{FinBit: true, Offset: offset})
+ s.AddStreamFrame(&wire.StreamFrame{FinBit: true, Offset: offset})
}
// Cancel is called by session to indicate that an error occurred
@@ -260,11 +395,12 @@ func (s *stream) CloseRemote(offset protocol.ByteCount) {
func (s *stream) Cancel(err error) {
s.mutex.Lock()
s.cancelled.Set(true)
+ s.ctxCancel()
// errors must not be changed!
if s.err == nil {
s.err = err
- s.newFrameOrErrCond.Signal()
- s.doneWritingOrErrCond.Signal()
+ s.signalRead()
+ s.signalWrite()
}
s.mutex.Unlock()
}
@@ -276,11 +412,12 @@ func (s *stream) Reset(err error) {
}
s.mutex.Lock()
s.resetLocally.Set(true)
+ s.ctxCancel()
// errors must not be changed!
if s.err == nil {
s.err = err
- s.newFrameOrErrCond.Signal()
- s.doneWritingOrErrCond.Signal()
+ s.signalRead()
+ s.signalWrite()
}
if s.shouldSendReset() {
s.onReset(s.streamID, s.writeOffset)
@@ -290,29 +427,34 @@ func (s *stream) Reset(err error) {
}
// resets the stream remotely
-func (s *stream) RegisterRemoteError(err error) {
+func (s *stream) RegisterRemoteError(err error, offset protocol.ByteCount) error {
if s.resetRemotely.Get() {
- return
+ return nil
}
s.mutex.Lock()
s.resetRemotely.Set(true)
+ s.ctxCancel()
// errors must not be changed!
if s.err == nil {
s.err = err
- s.doneWritingOrErrCond.Signal()
+ s.signalWrite()
+ }
+ if err := s.flowController.UpdateHighestReceived(offset, true); err != nil {
+ return err
}
if s.shouldSendReset() {
s.onReset(s.streamID, s.writeOffset)
s.rstSent.Set(true)
}
s.mutex.Unlock()
+ return nil
}
func (s *stream) finishedWriteAndSentFin() bool {
return s.finishedWriting.Get() && s.finSent.Get()
}
-func (s *stream) finished() bool {
+func (s *stream) Finished() bool {
return s.cancelled.Get() ||
(s.finishedReading.Get() && s.finishedWriteAndSentFin()) ||
(s.resetRemotely.Get() && s.rstSent.Get()) ||
@@ -320,6 +462,30 @@ func (s *stream) finished() bool {
(s.finishedWriteAndSentFin() && s.resetRemotely.Get())
}
+func (s *stream) Context() context.Context {
+ return s.ctx
+}
+
func (s *stream) StreamID() protocol.StreamID {
return s.streamID
}
+
+func (s *stream) UpdateSendWindow(n protocol.ByteCount) {
+ s.flowController.UpdateSendWindow(n)
+}
+
+func (s *stream) IsFlowControlBlocked() bool {
+ return s.flowController.IsBlocked()
+}
+
+func (s *stream) GetWindowUpdate() protocol.ByteCount {
+ return s.flowController.GetWindowUpdate()
+}
+
+// SetReadOffset sets the read offset.
+// It is only needed for the crypto stream.
+// It must not be called concurrently with any other stream methods, especially Read and Write.
+func (s *stream) SetReadOffset(offset protocol.ByteCount) {
+ s.readOffset = offset
+ s.frameQueue.readPosition = offset
+}
diff --git a/vendor/github.com/lucas-clemente/quic-go/stream_frame_sorter.go b/vendor/github.com/lucas-clemente/quic-go/stream_frame_sorter.go
index 8db048c..e3a3a80 100644
--- a/vendor/github.com/lucas-clemente/quic-go/stream_frame_sorter.go
+++ b/vendor/github.com/lucas-clemente/quic-go/stream_frame_sorter.go
@@ -3,13 +3,13 @@ package quic
import (
"errors"
- "github.com/lucas-clemente/quic-go/frames"
- "github.com/lucas-clemente/quic-go/protocol"
- "github.com/lucas-clemente/quic-go/utils"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+ "github.com/lucas-clemente/quic-go/internal/wire"
)
type streamFrameSorter struct {
- queuedFrames map[protocol.ByteCount]*frames.StreamFrame
+ queuedFrames map[protocol.ByteCount]*wire.StreamFrame
readPosition protocol.ByteCount
gaps *utils.ByteIntervalList
}
@@ -23,13 +23,13 @@ var (
func newStreamFrameSorter() *streamFrameSorter {
s := streamFrameSorter{
gaps: utils.NewByteIntervalList(),
- queuedFrames: make(map[protocol.ByteCount]*frames.StreamFrame),
+ queuedFrames: make(map[protocol.ByteCount]*wire.StreamFrame),
}
s.gaps.PushFront(utils.ByteInterval{Start: 0, End: protocol.MaxByteCount})
return &s
}
-func (s *streamFrameSorter) Push(frame *frames.StreamFrame) error {
+func (s *streamFrameSorter) Push(frame *wire.StreamFrame) error {
if frame.DataLen() == 0 {
if frame.FinBit {
s.queuedFrames[frame.Offset] = frame
@@ -143,7 +143,7 @@ func (s *streamFrameSorter) Push(frame *frames.StreamFrame) error {
return nil
}
-func (s *streamFrameSorter) Pop() *frames.StreamFrame {
+func (s *streamFrameSorter) Pop() *wire.StreamFrame {
frame := s.Head()
if frame != nil {
s.readPosition += frame.DataLen()
@@ -152,7 +152,7 @@ func (s *streamFrameSorter) Pop() *frames.StreamFrame {
return frame
}
-func (s *streamFrameSorter) Head() *frames.StreamFrame {
+func (s *streamFrameSorter) Head() *wire.StreamFrame {
frame, ok := s.queuedFrames[s.readPosition]
if ok {
return frame
diff --git a/vendor/github.com/lucas-clemente/quic-go/stream_frame_sorter_test.go b/vendor/github.com/lucas-clemente/quic-go/stream_frame_sorter_test.go
index 79962be..3980e56 100644
--- a/vendor/github.com/lucas-clemente/quic-go/stream_frame_sorter_test.go
+++ b/vendor/github.com/lucas-clemente/quic-go/stream_frame_sorter_test.go
@@ -3,9 +3,9 @@ package quic
import (
"bytes"
- "github.com/lucas-clemente/quic-go/frames"
- "github.com/lucas-clemente/quic-go/protocol"
- "github.com/lucas-clemente/quic-go/utils"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
+ "github.com/lucas-clemente/quic-go/internal/wire"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
@@ -32,7 +32,7 @@ var _ = Describe("StreamFrame sorter", func() {
Context("Push", func() {
It("inserts and pops a single frame", func() {
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
Offset: 0,
Data: []byte("foobar"),
}
@@ -44,11 +44,11 @@ var _ = Describe("StreamFrame sorter", func() {
})
It("inserts and pops two consecutive frame", func() {
- f1 := &frames.StreamFrame{
+ f1 := &wire.StreamFrame{
Offset: 0,
Data: []byte("foobar"),
}
- f2 := &frames.StreamFrame{
+ f2 := &wire.StreamFrame{
Offset: 6,
Data: []byte("foobar2"),
}
@@ -62,14 +62,14 @@ var _ = Describe("StreamFrame sorter", func() {
})
It("rejects empty frames", func() {
- f := &frames.StreamFrame{}
+ f := &wire.StreamFrame{}
err := s.Push(f)
Expect(err).To(MatchError(errEmptyStreamData))
})
Context("FinBit handling", func() {
It("saves a FinBit frame at offset 0", func() {
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
Offset: 0,
FinBit: true,
}
@@ -79,13 +79,13 @@ var _ = Describe("StreamFrame sorter", func() {
})
It("sets the FinBit if a stream is closed after receiving some data", func() {
- f1 := &frames.StreamFrame{
+ f1 := &wire.StreamFrame{
Offset: 0,
Data: []byte("foobar"),
}
err := s.Push(f1)
Expect(err).ToNot(HaveOccurred())
- f2 := &frames.StreamFrame{
+ f2 := &wire.StreamFrame{
Offset: 6,
FinBit: true,
}
@@ -98,7 +98,7 @@ var _ = Describe("StreamFrame sorter", func() {
Context("Gap handling", func() {
It("finds the first gap", func() {
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
Offset: 10,
Data: []byte("foobar"),
}
@@ -111,7 +111,7 @@ var _ = Describe("StreamFrame sorter", func() {
})
It("correctly sets the first gap for a frame with offset 0", func() {
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
Offset: 0,
Data: []byte("foobar"),
}
@@ -123,13 +123,13 @@ var _ = Describe("StreamFrame sorter", func() {
})
It("finds the two gaps", func() {
- f1 := &frames.StreamFrame{
+ f1 := &wire.StreamFrame{
Offset: 10,
Data: []byte("foobar"),
}
err := s.Push(f1)
Expect(err).ToNot(HaveOccurred())
- f2 := &frames.StreamFrame{
+ f2 := &wire.StreamFrame{
Offset: 20,
Data: []byte("foobar"),
}
@@ -143,13 +143,13 @@ var _ = Describe("StreamFrame sorter", func() {
})
It("finds the two gaps in reverse order", func() {
- f1 := &frames.StreamFrame{
+ f1 := &wire.StreamFrame{
Offset: 20,
Data: []byte("foobar"),
}
err := s.Push(f1)
Expect(err).ToNot(HaveOccurred())
- f2 := &frames.StreamFrame{
+ f2 := &wire.StreamFrame{
Offset: 10,
Data: []byte("foobar"),
}
@@ -163,13 +163,13 @@ var _ = Describe("StreamFrame sorter", func() {
})
It("shrinks a gap when it is partially filled", func() {
- f1 := &frames.StreamFrame{
+ f1 := &wire.StreamFrame{
Offset: 10,
Data: []byte("test"),
}
err := s.Push(f1)
Expect(err).ToNot(HaveOccurred())
- f2 := &frames.StreamFrame{
+ f2 := &wire.StreamFrame{
Offset: 4,
Data: []byte("foobar"),
}
@@ -182,13 +182,13 @@ var _ = Describe("StreamFrame sorter", func() {
})
It("deletes a gap at the beginning, when it is filled", func() {
- f1 := &frames.StreamFrame{
+ f1 := &wire.StreamFrame{
Offset: 6,
Data: []byte("test"),
}
err := s.Push(f1)
Expect(err).ToNot(HaveOccurred())
- f2 := &frames.StreamFrame{
+ f2 := &wire.StreamFrame{
Offset: 0,
Data: []byte("foobar"),
}
@@ -200,19 +200,19 @@ var _ = Describe("StreamFrame sorter", func() {
})
It("deletes a gap in the middle, when it is filled", func() {
- f1 := &frames.StreamFrame{
+ f1 := &wire.StreamFrame{
Offset: 0,
Data: []byte("test"),
}
err := s.Push(f1)
Expect(err).ToNot(HaveOccurred())
- f2 := &frames.StreamFrame{
+ f2 := &wire.StreamFrame{
Offset: 10,
Data: []byte("test2"),
}
err = s.Push(f2)
Expect(err).ToNot(HaveOccurred())
- f3 := &frames.StreamFrame{
+ f3 := &wire.StreamFrame{
Offset: 4,
Data: []byte("foobar"),
}
@@ -225,13 +225,13 @@ var _ = Describe("StreamFrame sorter", func() {
})
It("splits a gap into two", func() {
- f1 := &frames.StreamFrame{
+ f1 := &wire.StreamFrame{
Offset: 100,
Data: []byte("test"),
}
err := s.Push(f1)
Expect(err).ToNot(HaveOccurred())
- f2 := &frames.StreamFrame{
+ f2 := &wire.StreamFrame{
Offset: 50,
Data: []byte("foobar"),
}
@@ -248,11 +248,11 @@ var _ = Describe("StreamFrame sorter", func() {
Context("Overlapping Stream Data detection", func() {
// create gaps: 0-5, 10-15, 20-25, 30-inf
BeforeEach(func() {
- err := s.Push(&frames.StreamFrame{Offset: 5, Data: []byte("12345")})
+ err := s.Push(&wire.StreamFrame{Offset: 5, Data: []byte("12345")})
Expect(err).ToNot(HaveOccurred())
- err = s.Push(&frames.StreamFrame{Offset: 15, Data: []byte("12345")})
+ err = s.Push(&wire.StreamFrame{Offset: 15, Data: []byte("12345")})
Expect(err).ToNot(HaveOccurred())
- err = s.Push(&frames.StreamFrame{Offset: 25, Data: []byte("12345")})
+ err = s.Push(&wire.StreamFrame{Offset: 25, Data: []byte("12345")})
Expect(err).ToNot(HaveOccurred())
checkGaps([]utils.ByteInterval{
{Start: 0, End: 5},
@@ -263,7 +263,7 @@ var _ = Describe("StreamFrame sorter", func() {
})
It("cuts a frame with offset 0 that overlaps at the end", func() {
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
Offset: 0,
Data: []byte("foobar"),
}
@@ -281,7 +281,7 @@ var _ = Describe("StreamFrame sorter", func() {
It("cuts a frame that overlaps at the end", func() {
// 4 to 7
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
Offset: 4,
Data: []byte("foo"),
}
@@ -300,7 +300,7 @@ var _ = Describe("StreamFrame sorter", func() {
It("cuts a frame that completely fills a gap, but overlaps at the end", func() {
// 10 to 16
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
Offset: 10,
Data: []byte("foobar"),
}
@@ -318,7 +318,7 @@ var _ = Describe("StreamFrame sorter", func() {
It("cuts a frame that overlaps at the beginning", func() {
// 8 to 14
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
Offset: 8,
Data: []byte("foobar"),
}
@@ -338,7 +338,7 @@ var _ = Describe("StreamFrame sorter", func() {
It("processes a frame that overlaps at the beginning and at the end, starting in a gap", func() {
// 2 to 12
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
Offset: 2,
Data: []byte("1234567890"),
}
@@ -357,7 +357,7 @@ var _ = Describe("StreamFrame sorter", func() {
It("processes a frame that overlaps at the beginning and at the end, starting in a gap, ending in data", func() {
// 2 to 17
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
Offset: 2,
Data: []byte("123456789012345"),
}
@@ -376,7 +376,7 @@ var _ = Describe("StreamFrame sorter", func() {
It("processes a frame that overlaps at the beginning and at the end, starting in a gap, ending in data", func() {
// 5 to 22
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
Offset: 5,
Data: []byte("12345678901234567"),
}
@@ -394,7 +394,7 @@ var _ = Describe("StreamFrame sorter", func() {
It("processes a frame that closes multiple gaps", func() {
// 2 to 27
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
Offset: 2,
Data: bytes.Repeat([]byte{'e'}, 25),
}
@@ -414,7 +414,7 @@ var _ = Describe("StreamFrame sorter", func() {
It("processes a frame that closes multiple gaps", func() {
// 5 to 27
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
Offset: 5,
Data: bytes.Repeat([]byte{'d'}, 22),
}
@@ -434,7 +434,7 @@ var _ = Describe("StreamFrame sorter", func() {
It("processes a frame that covers multiple gaps and ends at the end of a gap", func() {
// 1 to 15
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
Offset: 1,
Data: bytes.Repeat([]byte{'f'}, 14),
}
@@ -453,7 +453,7 @@ var _ = Describe("StreamFrame sorter", func() {
It("processes a frame that closes all gaps (except for the last one)", func() {
// 0 to 32
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
Offset: 0,
Data: bytes.Repeat([]byte{'f'}, 32),
}
@@ -469,7 +469,7 @@ var _ = Describe("StreamFrame sorter", func() {
It("cuts a frame that overlaps at the beginning and at the end, starting in data already received", func() {
// 8 to 17
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
Offset: 8,
Data: []byte("123456789"),
}
@@ -488,7 +488,7 @@ var _ = Describe("StreamFrame sorter", func() {
It("cuts a frame that completely covers two gaps", func() {
// 10 to 20
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
Offset: 10,
Data: []byte("1234567890"),
}
@@ -513,9 +513,9 @@ var _ = Describe("StreamFrame sorter", func() {
BeforeEach(func() {
// create gaps: 5-10, 15-inf
- err := s.Push(&frames.StreamFrame{Offset: 0, Data: []byte("12345")})
+ err := s.Push(&wire.StreamFrame{Offset: 0, Data: []byte("12345")})
Expect(err).ToNot(HaveOccurred())
- err = s.Push(&frames.StreamFrame{Offset: 10, Data: []byte("12345")})
+ err = s.Push(&wire.StreamFrame{Offset: 10, Data: []byte("12345")})
Expect(err).ToNot(HaveOccurred())
checkGaps(expectedGaps)
})
@@ -526,21 +526,21 @@ var _ = Describe("StreamFrame sorter", func() {
})
It("does not modify data when receiving a duplicate", func() {
- err := s.Push(&frames.StreamFrame{Offset: 0, Data: []byte("fffff")})
+ err := s.Push(&wire.StreamFrame{Offset: 0, Data: []byte("fffff")})
Expect(err).To(MatchError(errDuplicateStreamData))
Expect(s.queuedFrames[0].Data).ToNot(Equal([]byte("fffff")))
})
It("detects a duplicate frame that is smaller than the original, starting at the beginning", func() {
// 10 to 12
- err := s.Push(&frames.StreamFrame{Offset: 10, Data: []byte("12")})
+ err := s.Push(&wire.StreamFrame{Offset: 10, Data: []byte("12")})
Expect(err).To(MatchError(errDuplicateStreamData))
Expect(s.queuedFrames[10].Data).To(HaveLen(5))
})
It("detects a duplicate frame that is smaller than the original, somewhere in the middle", func() {
// 1 to 4
- err := s.Push(&frames.StreamFrame{Offset: 1, Data: []byte("123")})
+ err := s.Push(&wire.StreamFrame{Offset: 1, Data: []byte("123")})
Expect(err).To(MatchError(errDuplicateStreamData))
Expect(s.queuedFrames[0].Data).To(HaveLen(5))
Expect(s.queuedFrames).ToNot(HaveKey(protocol.ByteCount(1)))
@@ -548,7 +548,7 @@ var _ = Describe("StreamFrame sorter", func() {
It("detects a duplicate frame that is smaller than the original, somewhere in the middle in the last block", func() {
// 11 to 14
- err := s.Push(&frames.StreamFrame{Offset: 11, Data: []byte("123")})
+ err := s.Push(&wire.StreamFrame{Offset: 11, Data: []byte("123")})
Expect(err).To(MatchError(errDuplicateStreamData))
Expect(s.queuedFrames[10].Data).To(HaveLen(5))
Expect(s.queuedFrames).ToNot(HaveKey(protocol.ByteCount(11)))
@@ -556,7 +556,7 @@ var _ = Describe("StreamFrame sorter", func() {
It("detects a duplicate frame that is smaller than the original, with aligned end in the last block", func() {
// 11 to 14
- err := s.Push(&frames.StreamFrame{Offset: 11, Data: []byte("1234")})
+ err := s.Push(&wire.StreamFrame{Offset: 11, Data: []byte("1234")})
Expect(err).To(MatchError(errDuplicateStreamData))
Expect(s.queuedFrames[10].Data).To(HaveLen(5))
Expect(s.queuedFrames).ToNot(HaveKey(protocol.ByteCount(11)))
@@ -564,7 +564,7 @@ var _ = Describe("StreamFrame sorter", func() {
It("detects a duplicate frame that is smaller than the original, with aligned end", func() {
// 3 to 5
- err := s.Push(&frames.StreamFrame{Offset: 3, Data: []byte("12")})
+ err := s.Push(&wire.StreamFrame{Offset: 3, Data: []byte("12")})
Expect(err).To(MatchError(errDuplicateStreamData))
Expect(s.queuedFrames[0].Data).To(HaveLen(5))
Expect(s.queuedFrames).ToNot(HaveKey(protocol.ByteCount(3)))
@@ -574,7 +574,7 @@ var _ = Describe("StreamFrame sorter", func() {
Context("DoS protection", func() {
It("errors when too many gaps are created", func() {
for i := 0; i < protocol.MaxStreamFrameSorterGaps; i++ {
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
Data: []byte("foobar"),
Offset: protocol.ByteCount(i * 7),
}
@@ -582,7 +582,7 @@ var _ = Describe("StreamFrame sorter", func() {
Expect(err).ToNot(HaveOccurred())
}
Expect(s.gaps.Len()).To(Equal(protocol.MaxStreamFrameSorterGaps))
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
Data: []byte("foobar"),
Offset: protocol.ByteCount(protocol.MaxStreamFrameSorterGaps*7) + 100,
}
diff --git a/vendor/github.com/lucas-clemente/quic-go/stream_framer.go b/vendor/github.com/lucas-clemente/quic-go/stream_framer.go
index 45c0722..e275fcc 100644
--- a/vendor/github.com/lucas-clemente/quic-go/stream_framer.go
+++ b/vendor/github.com/lucas-clemente/quic-go/stream_framer.go
@@ -1,38 +1,46 @@
package quic
import (
- "github.com/lucas-clemente/quic-go/flowcontrol"
- "github.com/lucas-clemente/quic-go/frames"
- "github.com/lucas-clemente/quic-go/protocol"
- "github.com/lucas-clemente/quic-go/utils"
+ "github.com/lucas-clemente/quic-go/internal/flowcontrol"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/wire"
)
type streamFramer struct {
- streamsMap *streamsMap
+ streamsMap *streamsMap
+ cryptoStream streamI
+ version protocol.VersionNumber
- flowControlManager flowcontrol.FlowControlManager
+ connFlowController flowcontrol.ConnectionFlowController
- retransmissionQueue []*frames.StreamFrame
- blockedFrameQueue []*frames.BlockedFrame
+ retransmissionQueue []*wire.StreamFrame
+ blockedFrameQueue []wire.Frame
}
-func newStreamFramer(streamsMap *streamsMap, flowControlManager flowcontrol.FlowControlManager) *streamFramer {
+func newStreamFramer(
+ cryptoStream streamI,
+ streamsMap *streamsMap,
+ cfc flowcontrol.ConnectionFlowController,
+ v protocol.VersionNumber,
+) *streamFramer {
return &streamFramer{
streamsMap: streamsMap,
- flowControlManager: flowControlManager,
+ cryptoStream: cryptoStream,
+ connFlowController: cfc,
+ version: v,
}
}
-func (f *streamFramer) AddFrameForRetransmission(frame *frames.StreamFrame) {
+func (f *streamFramer) AddFrameForRetransmission(frame *wire.StreamFrame) {
f.retransmissionQueue = append(f.retransmissionQueue, frame)
}
-func (f *streamFramer) PopStreamFrames(maxLen protocol.ByteCount) []*frames.StreamFrame {
+func (f *streamFramer) PopStreamFrames(maxLen protocol.ByteCount) []*wire.StreamFrame {
fs, currentLen := f.maybePopFramesForRetransmission(maxLen)
return append(fs, f.maybePopNormalFrames(maxLen-currentLen)...)
}
-func (f *streamFramer) PopBlockedFrame() *frames.BlockedFrame {
+func (f *streamFramer) PopBlockedFrame() wire.Frame {
if len(f.blockedFrameQueue) == 0 {
return nil
}
@@ -45,12 +53,30 @@ func (f *streamFramer) HasFramesForRetransmission() bool {
return len(f.retransmissionQueue) > 0
}
-func (f *streamFramer) maybePopFramesForRetransmission(maxLen protocol.ByteCount) (res []*frames.StreamFrame, currentLen protocol.ByteCount) {
+func (f *streamFramer) HasCryptoStreamFrame() bool {
+ return f.cryptoStream.HasDataForWriting()
+}
+
+// TODO(lclemente): This is somewhat duplicate with the normal path for generating frames.
+func (f *streamFramer) PopCryptoStreamFrame(maxLen protocol.ByteCount) *wire.StreamFrame {
+ if !f.HasCryptoStreamFrame() {
+ return nil
+ }
+ frame := &wire.StreamFrame{
+ StreamID: f.cryptoStream.StreamID(),
+ Offset: f.cryptoStream.GetWriteOffset(),
+ }
+ frameHeaderBytes, _ := frame.MinLength(f.version) // can never error
+ frame.Data, frame.FinBit = f.cryptoStream.GetDataForWriting(maxLen - frameHeaderBytes)
+ return frame
+}
+
+func (f *streamFramer) maybePopFramesForRetransmission(maxLen protocol.ByteCount) (res []*wire.StreamFrame, currentLen protocol.ByteCount) {
for len(f.retransmissionQueue) > 0 {
frame := f.retransmissionQueue[0]
frame.DataLenPresent = true
- frameHeaderLen, _ := frame.MinLength(protocol.VersionWhatever) // can never error
+ frameHeaderLen, _ := frame.MinLength(f.version) // can never error
if currentLen+frameHeaderLen >= maxLen {
break
}
@@ -71,57 +97,37 @@ func (f *streamFramer) maybePopFramesForRetransmission(maxLen protocol.ByteCount
return
}
-func (f *streamFramer) maybePopNormalFrames(maxBytes protocol.ByteCount) (res []*frames.StreamFrame) {
- frame := &frames.StreamFrame{DataLenPresent: true}
+func (f *streamFramer) maybePopNormalFrames(maxBytes protocol.ByteCount) (res []*wire.StreamFrame) {
+ frame := &wire.StreamFrame{DataLenPresent: true}
var currentLen protocol.ByteCount
- fn := func(s *stream) (bool, error) {
+ fn := func(s streamI) (bool, error) {
if s == nil {
return true, nil
}
- frame.StreamID = s.streamID
+ frame.StreamID = s.StreamID()
+ frame.Offset = s.GetWriteOffset()
// not perfect, but thread-safe since writeOffset is only written when getting data
- frame.Offset = s.writeOffset
- frameHeaderBytes, _ := frame.MinLength(protocol.VersionWhatever) // can never error
+ frameHeaderBytes, _ := frame.MinLength(f.version) // can never error
if currentLen+frameHeaderBytes > maxBytes {
return false, nil // theoretically, we could find another stream that fits, but this is quite unlikely, so we stop here
}
maxLen := maxBytes - currentLen - frameHeaderBytes
- var sendWindowSize protocol.ByteCount
- if s.lenOfDataForWriting() != 0 {
- sendWindowSize, _ = f.flowControlManager.SendWindowSize(s.streamID)
- maxLen = utils.MinByteCount(maxLen, sendWindowSize)
+ if s.HasDataForWriting() {
+ frame.Data, frame.FinBit = s.GetDataForWriting(maxLen)
}
-
- if maxLen == 0 {
+ if len(frame.Data) == 0 && !frame.FinBit {
return true, nil
}
- data := s.getDataForWriting(maxLen)
-
- // This is unlikely, but check it nonetheless, the scheduler might have jumped in. Seems to happen in ~20% of cases in the tests.
- shouldSendFin := s.shouldSendFin()
- if data == nil && !shouldSendFin {
- return true, nil
- }
-
- if shouldSendFin {
- frame.FinBit = true
- s.sentFin()
- }
-
- frame.Data = data
- f.flowControlManager.AddBytesSent(s.streamID, protocol.ByteCount(len(data)))
-
// Finally, check if we are now FC blocked and should queue a BLOCKED frame
- if f.flowControlManager.RemainingConnectionWindowSize() == 0 {
- // We are now connection-level FC blocked
- f.blockedFrameQueue = append(f.blockedFrameQueue, &frames.BlockedFrame{StreamID: 0})
- } else if !frame.FinBit && sendWindowSize-frame.DataLen() == 0 {
- // We are now stream-level FC blocked
- f.blockedFrameQueue = append(f.blockedFrameQueue, &frames.BlockedFrame{StreamID: s.StreamID()})
+ if !frame.FinBit && s.IsFlowControlBlocked() {
+ f.blockedFrameQueue = append(f.blockedFrameQueue, &wire.StreamBlockedFrame{StreamID: s.StreamID()})
+ }
+ if f.connFlowController.IsBlocked() {
+ f.blockedFrameQueue = append(f.blockedFrameQueue, &wire.BlockedFrame{})
}
res = append(res, frame)
@@ -131,17 +137,16 @@ func (f *streamFramer) maybePopNormalFrames(maxBytes protocol.ByteCount) (res []
return false, nil
}
- frame = &frames.StreamFrame{DataLenPresent: true}
+ frame = &wire.StreamFrame{DataLenPresent: true}
return true, nil
}
f.streamsMap.RoundRobinIterate(fn)
-
return
}
// maybeSplitOffFrame removes the first n bytes and returns them as a separate frame. If n >= len(frame), nil is returned and nothing is modified.
-func maybeSplitOffFrame(frame *frames.StreamFrame, n protocol.ByteCount) *frames.StreamFrame {
+func maybeSplitOffFrame(frame *wire.StreamFrame, n protocol.ByteCount) *wire.StreamFrame {
if n >= frame.DataLen() {
return nil
}
@@ -151,7 +156,7 @@ func maybeSplitOffFrame(frame *frames.StreamFrame, n protocol.ByteCount) *frames
frame.Offset += n
}()
- return &frames.StreamFrame{
+ return &wire.StreamFrame{
FinBit: false,
StreamID: frame.StreamID,
Offset: frame.Offset,
diff --git a/vendor/github.com/lucas-clemente/quic-go/stream_framer_test.go b/vendor/github.com/lucas-clemente/quic-go/stream_framer_test.go
index 9226b2a..0dabce5 100644
--- a/vendor/github.com/lucas-clemente/quic-go/stream_framer_test.go
+++ b/vendor/github.com/lucas-clemente/quic-go/stream_framer_test.go
@@ -3,46 +3,58 @@ package quic
import (
"bytes"
- "github.com/lucas-clemente/quic-go/frames"
- "github.com/lucas-clemente/quic-go/protocol"
+ "github.com/golang/mock/gomock"
+ "github.com/lucas-clemente/quic-go/internal/mocks"
+
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/wire"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("Stream Framer", func() {
+ const (
+ id1 = protocol.StreamID(10)
+ id2 = protocol.StreamID(11)
+ )
+
var (
- retransmittedFrame1, retransmittedFrame2 *frames.StreamFrame
+ retransmittedFrame1, retransmittedFrame2 *wire.StreamFrame
framer *streamFramer
streamsMap *streamsMap
- stream1, stream2 *stream
- fcm *mockFlowControlHandler
+ stream1, stream2 *mocks.MockStreamI
+ connFC *mocks.MockConnectionFlowController
)
BeforeEach(func() {
- retransmittedFrame1 = &frames.StreamFrame{
+ retransmittedFrame1 = &wire.StreamFrame{
StreamID: 5,
Data: []byte{0x13, 0x37},
}
- retransmittedFrame2 = &frames.StreamFrame{
+ retransmittedFrame2 = &wire.StreamFrame{
StreamID: 6,
Data: []byte{0xDE, 0xCA, 0xFB, 0xAD},
}
- stream1 = &stream{streamID: 10}
- stream2 = &stream{streamID: 11}
+ stream1 = mocks.NewMockStreamI(mockCtrl)
+ stream1.EXPECT().StreamID().Return(protocol.StreamID(5)).AnyTimes()
+ stream2 = mocks.NewMockStreamI(mockCtrl)
+ stream2.EXPECT().StreamID().Return(protocol.StreamID(6)).AnyTimes()
- streamsMap = newStreamsMap(nil, protocol.PerspectiveServer, &mockConnectionParametersManager{})
+ streamsMap = newStreamsMap(nil, protocol.PerspectiveServer, versionGQUICFrames)
streamsMap.putStream(stream1)
streamsMap.putStream(stream2)
- fcm = newMockFlowControlHandler()
- fcm.sendWindowSizes[stream1.streamID] = protocol.MaxByteCount
- fcm.sendWindowSizes[stream2.streamID] = protocol.MaxByteCount
- fcm.sendWindowSizes[retransmittedFrame1.StreamID] = protocol.MaxByteCount
- fcm.sendWindowSizes[retransmittedFrame2.StreamID] = protocol.MaxByteCount
- framer = newStreamFramer(streamsMap, fcm)
+ connFC = mocks.NewMockConnectionFlowController(mockCtrl)
+ framer = newStreamFramer(nil, streamsMap, connFC, versionGQUICFrames)
})
+ setNoData := func(str *mocks.MockStreamI) {
+ str.EXPECT().HasDataForWriting().Return(false).AnyTimes()
+ str.EXPECT().GetDataForWriting(gomock.Any()).Return(nil, false).AnyTimes()
+ str.EXPECT().GetWriteOffset().AnyTimes()
+ }
+
It("says if it has retransmissions", func() {
Expect(framer.HasFramesForRetransmission()).To(BeFalse())
framer.AddFrameForRetransmission(retransmittedFrame1)
@@ -50,6 +62,8 @@ var _ = Describe("Stream Framer", func() {
})
It("sets the DataLenPresent for dequeued retransmitted frames", func() {
+ setNoData(stream1)
+ setNoData(stream2)
framer.AddFrameForRetransmission(retransmittedFrame1)
fs := framer.PopStreamFrames(protocol.MaxByteCount)
Expect(fs).To(HaveLen(1))
@@ -57,18 +71,34 @@ var _ = Describe("Stream Framer", func() {
})
It("sets the DataLenPresent for dequeued normal frames", func() {
- stream1.dataForWriting = []byte("foobar")
+ connFC.EXPECT().IsBlocked()
+ setNoData(stream2)
+ stream1.EXPECT().GetWriteOffset()
+ stream1.EXPECT().HasDataForWriting().Return(true)
+ stream1.EXPECT().GetDataForWriting(gomock.Any()).Return([]byte("foobar"), false)
+ stream1.EXPECT().IsFlowControlBlocked()
fs := framer.PopStreamFrames(protocol.MaxByteCount)
Expect(fs).To(HaveLen(1))
Expect(fs[0].DataLenPresent).To(BeTrue())
})
Context("Popping", func() {
+ BeforeEach(func() {
+ // nothing is blocked here
+ connFC.EXPECT().IsBlocked().AnyTimes()
+ stream1.EXPECT().IsFlowControlBlocked().Return(false).AnyTimes()
+ stream2.EXPECT().IsFlowControlBlocked().Return(false).AnyTimes()
+ })
+
It("returns nil when popping an empty framer", func() {
+ setNoData(stream1)
+ setNoData(stream2)
Expect(framer.PopStreamFrames(1000)).To(BeEmpty())
})
It("pops frames for retransmission", func() {
+ setNoData(stream1)
+ setNoData(stream2)
framer.AddFrameForRetransmission(retransmittedFrame1)
framer.AddFrameForRetransmission(retransmittedFrame2)
fs := framer.PopStreamFrames(1000)
@@ -79,53 +109,64 @@ var _ = Describe("Stream Framer", func() {
})
It("returns normal frames", func() {
- stream1.dataForWriting = []byte("foobar")
+ stream1.EXPECT().GetDataForWriting(gomock.Any()).Return([]byte("foobar"), false)
+ stream1.EXPECT().HasDataForWriting().Return(true)
+ stream1.EXPECT().GetWriteOffset()
+ setNoData(stream2)
fs := framer.PopStreamFrames(1000)
Expect(fs).To(HaveLen(1))
- Expect(fs[0].StreamID).To(Equal(stream1.streamID))
+ Expect(fs[0].StreamID).To(Equal(stream1.StreamID()))
Expect(fs[0].Data).To(Equal([]byte("foobar")))
- Expect(framer.PopStreamFrames(1000)).To(BeEmpty())
- })
-
- It("returns multiple normal frames", func() {
- stream1.dataForWriting = []byte("foobar")
- stream2.dataForWriting = []byte("foobaz")
- fs := framer.PopStreamFrames(1000)
- Expect(fs).To(HaveLen(2))
- // Swap if we dequeued in other order
- if fs[0].StreamID != stream1.streamID {
- fs[0], fs[1] = fs[1], fs[0]
- }
- Expect(fs[0].StreamID).To(Equal(stream1.streamID))
- Expect(fs[0].Data).To(Equal([]byte("foobar")))
- Expect(fs[1].StreamID).To(Equal(stream2.streamID))
- Expect(fs[1].Data).To(Equal([]byte("foobaz")))
- Expect(framer.PopStreamFrames(1000)).To(BeEmpty())
- })
-
- It("returns retransmission frames before normal frames", func() {
- framer.AddFrameForRetransmission(retransmittedFrame1)
- stream1.dataForWriting = []byte("foobar")
- fs := framer.PopStreamFrames(1000)
- Expect(fs).To(HaveLen(2))
- Expect(fs[0]).To(Equal(retransmittedFrame1))
- Expect(fs[1].StreamID).To(Equal(stream1.streamID))
- Expect(framer.PopStreamFrames(1000)).To(BeEmpty())
- })
-
- It("does not pop empty frames", func() {
- stream1.dataForWriting = []byte("foobar")
- fs := framer.PopStreamFrames(4)
- Expect(fs).To(HaveLen(0))
- fs = framer.PopStreamFrames(5)
- Expect(fs).To(HaveLen(1))
- Expect(fs[0].Data).ToNot(BeEmpty())
Expect(fs[0].FinBit).To(BeFalse())
})
+ It("returns multiple normal frames", func() {
+ stream1.EXPECT().GetDataForWriting(gomock.Any()).Return([]byte("foobar"), false)
+ stream1.EXPECT().HasDataForWriting().Return(true)
+ stream1.EXPECT().GetWriteOffset()
+ stream2.EXPECT().GetDataForWriting(gomock.Any()).Return([]byte("foobaz"), false)
+ stream2.EXPECT().HasDataForWriting().Return(true)
+ stream2.EXPECT().GetWriteOffset()
+ fs := framer.PopStreamFrames(1000)
+ Expect(fs).To(HaveLen(2))
+ // Swap if we dequeued in other order
+ if fs[0].StreamID != stream1.StreamID() {
+ fs[0], fs[1] = fs[1], fs[0]
+ }
+ Expect(fs[0].StreamID).To(Equal(stream1.StreamID()))
+ Expect(fs[0].Data).To(Equal([]byte("foobar")))
+ Expect(fs[1].StreamID).To(Equal(stream2.StreamID()))
+ Expect(fs[1].Data).To(Equal([]byte("foobaz")))
+ })
+
+ It("returns retransmission frames before normal frames", func() {
+ stream1.EXPECT().GetDataForWriting(gomock.Any()).Return([]byte("foobar"), false)
+ stream1.EXPECT().HasDataForWriting().Return(true)
+ stream1.EXPECT().GetWriteOffset()
+ setNoData(stream2)
+ framer.AddFrameForRetransmission(retransmittedFrame1)
+ fs := framer.PopStreamFrames(1000)
+ Expect(fs).To(HaveLen(2))
+ Expect(fs[0]).To(Equal(retransmittedFrame1))
+ Expect(fs[1].StreamID).To(Equal(stream1.StreamID()))
+ })
+
+ It("does not pop empty frames", func() {
+ stream1.EXPECT().HasDataForWriting().Return(false)
+ stream1.EXPECT().GetWriteOffset()
+ setNoData(stream2)
+ fs := framer.PopStreamFrames(5)
+ Expect(fs).To(BeEmpty())
+ })
+
It("uses the round-robin scheduling", func() {
- stream1.dataForWriting = bytes.Repeat([]byte("f"), 100)
- stream2.dataForWriting = bytes.Repeat([]byte("e"), 100)
+ streamFrameHeaderLen := protocol.ByteCount(4)
+ stream1.EXPECT().GetDataForWriting(10-streamFrameHeaderLen).Return(bytes.Repeat([]byte("f"), int(10-streamFrameHeaderLen)), false)
+ stream1.EXPECT().HasDataForWriting().Return(true)
+ stream1.EXPECT().GetWriteOffset()
+ stream2.EXPECT().GetDataForWriting(protocol.ByteCount(10-streamFrameHeaderLen)).Return(bytes.Repeat([]byte("e"), int(10-streamFrameHeaderLen)), false)
+ stream2.EXPECT().HasDataForWriting().Return(true)
+ stream2.EXPECT().GetWriteOffset()
fs := framer.PopStreamFrames(10)
Expect(fs).To(HaveLen(1))
// it doesn't matter here if this data is from stream1 or from stream2...
@@ -138,7 +179,7 @@ var _ = Describe("Stream Framer", func() {
Context("splitting of frames", func() {
It("splits off nothing", func() {
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
StreamID: 1,
Data: []byte("bar"),
Offset: 3,
@@ -149,7 +190,7 @@ var _ = Describe("Stream Framer", func() {
})
It("splits off initial frame", func() {
- f := &frames.StreamFrame{
+ f := &wire.StreamFrame{
StreamID: 1,
Data: []byte("foobar"),
DataLenPresent: true,
@@ -171,11 +212,13 @@ var _ = Describe("Stream Framer", func() {
})
It("splits a frame", func() {
+ setNoData(stream1)
+ setNoData(stream2)
framer.AddFrameForRetransmission(retransmittedFrame2)
origlen := retransmittedFrame2.DataLen()
fs := framer.PopStreamFrames(6)
Expect(fs).To(HaveLen(1))
- minLength, _ := fs[0].MinLength(0)
+ minLength, _ := fs[0].MinLength(framer.version)
Expect(minLength + fs[0].DataLen()).To(Equal(protocol.ByteCount(6)))
Expect(framer.retransmissionQueue[0].Data).To(HaveLen(int(origlen - fs[0].DataLen())))
Expect(framer.retransmissionQueue[0].Offset).To(Equal(fs[0].DataLen()))
@@ -183,7 +226,7 @@ var _ = Describe("Stream Framer", func() {
It("never returns an empty stream frame", func() {
// this one frame will be split off from again and again in this test. Therefore, it has to be large enough (checked again at the end)
- origFrame := &frames.StreamFrame{
+ origFrame := &wire.StreamFrame{
StreamID: 5,
Offset: 1,
FinBit: false,
@@ -191,7 +234,7 @@ var _ = Describe("Stream Framer", func() {
}
framer.AddFrameForRetransmission(origFrame)
- minFrameDataLen := protocol.MaxFrameAndPublicHeaderSize
+ minFrameDataLen := protocol.MaxPacketSize
for i := 0; i < 30; i++ {
frames, currentLen := framer.maybePopFramesForRetransmission(protocol.ByteCount(i))
@@ -212,6 +255,8 @@ var _ = Describe("Stream Framer", func() {
})
It("only removes a frame from the framer after returning all split parts", func() {
+ setNoData(stream1)
+ setNoData(stream2)
framer.AddFrameForRetransmission(retransmittedFrame2)
fs := framer.PopStreamFrames(6)
Expect(fs).To(HaveLen(1))
@@ -220,221 +265,85 @@ var _ = Describe("Stream Framer", func() {
Expect(fs).To(HaveLen(1))
Expect(framer.retransmissionQueue).To(BeEmpty())
})
-
- It("gets the whole data of a frame if it was split", func() {
- origdata := []byte("foobar")
- stream1.dataForWriting = origdata
- fs := framer.PopStreamFrames(7)
- Expect(fs).To(HaveLen(1))
- Expect(fs[0].Data).To(Equal([]byte("foo")))
- var b bytes.Buffer
- fs[0].Write(&b, 0)
- Expect(b.Len()).To(Equal(7))
- fs = framer.PopStreamFrames(1000)
- Expect(fs).To(HaveLen(1))
- Expect(fs[0].Data).To(Equal([]byte("bar")))
- })
})
Context("sending FINs", func() {
It("sends FINs when streams are closed", func() {
- stream1.writeOffset = 42
- stream1.finishedWriting.Set(true)
- fs := framer.PopStreamFrames(1000)
- Expect(fs).To(HaveLen(1))
- Expect(fs[0].StreamID).To(Equal(stream1.streamID))
- Expect(fs[0].Offset).To(Equal(stream1.writeOffset))
- Expect(fs[0].FinBit).To(BeTrue())
- Expect(fs[0].Data).To(BeEmpty())
- })
+ offset := protocol.ByteCount(42)
+ stream1.EXPECT().HasDataForWriting().Return(true)
+ stream1.EXPECT().GetDataForWriting(gomock.Any()).Return(nil, true)
+ stream1.EXPECT().GetWriteOffset().Return(offset)
+ setNoData(stream2)
- It("sends FINs when flow-control blocked", func() {
- stream1.writeOffset = 42
- stream1.finishedWriting.Set(true)
- fcm.sendWindowSizes[stream1.StreamID()] = 42
fs := framer.PopStreamFrames(1000)
Expect(fs).To(HaveLen(1))
- Expect(fs[0].StreamID).To(Equal(stream1.streamID))
- Expect(fs[0].Offset).To(Equal(stream1.writeOffset))
+ Expect(fs[0].StreamID).To(Equal(stream1.StreamID()))
+ Expect(fs[0].Offset).To(Equal(offset))
Expect(fs[0].FinBit).To(BeTrue())
Expect(fs[0].Data).To(BeEmpty())
})
It("bundles FINs with data", func() {
- stream1.dataForWriting = []byte("foobar")
- stream1.finishedWriting.Set(true)
+ offset := protocol.ByteCount(42)
+ stream1.EXPECT().GetDataForWriting(gomock.Any()).Return([]byte("foobar"), true)
+ stream1.EXPECT().HasDataForWriting().Return(true)
+ stream1.EXPECT().GetWriteOffset().Return(offset)
+ setNoData(stream2)
+
fs := framer.PopStreamFrames(1000)
Expect(fs).To(HaveLen(1))
- Expect(fs[0].StreamID).To(Equal(stream1.streamID))
+ Expect(fs[0].StreamID).To(Equal(stream1.StreamID()))
Expect(fs[0].Data).To(Equal([]byte("foobar")))
Expect(fs[0].FinBit).To(BeTrue())
})
})
})
- Context("flow control", func() {
- It("tells the FlowControlManager how many bytes it sent", func() {
- stream1.dataForWriting = []byte("foobar")
- framer.PopStreamFrames(1000)
- Expect(fcm.bytesSent).To(Equal(protocol.ByteCount(6)))
- })
-
- It("does not count retransmitted frames as sent bytes", func() {
- framer.AddFrameForRetransmission(retransmittedFrame1)
- framer.PopStreamFrames(1000)
- Expect(fcm.bytesSent).To(BeZero())
- })
-
- It("returns the whole frame if it fits", func() {
- stream1.writeOffset = 10
- stream1.dataForWriting = []byte("foobar")
- fcm.sendWindowSizes[stream1.streamID] = 10 + 6
- fs := framer.PopStreamFrames(1000)
- Expect(fs).To(HaveLen(1))
- Expect(fs[0].DataLen()).To(Equal(protocol.ByteCount(6)))
- })
-
- It("returns a smaller frame if the whole frame doesn't fit", func() {
- stream1.dataForWriting = []byte("foobar")
- fcm.sendWindowSizes[stream1.streamID] = 3
- fs := framer.PopStreamFrames(1000)
- Expect(fs).To(HaveLen(1))
- Expect(fs[0].Data).To(Equal([]byte("foo")))
- })
-
- It("returns a smaller frame if the whole frame doesn't fit in the stream flow control window, for non-zero StreamFrame offset", func() {
- stream1.writeOffset = 1
- stream1.dataForWriting = []byte("foobar")
- fcm.sendWindowSizes[stream1.StreamID()] = 3
- fs := framer.PopStreamFrames(1000)
- Expect(fs).To(HaveLen(1))
- Expect(fs[0].Data).To(Equal([]byte("foo")))
- })
-
- It("returns a smaller frame if the whole frame doesn't fit in the connection flow control window", func() {
- stream1.dataForWriting = []byte("foobar")
- fcm.streamsContributing = []protocol.StreamID{stream1.StreamID()}
- fcm.remainingConnectionWindowSize = 3
- fs := framer.PopStreamFrames(1000)
- Expect(fs).To(HaveLen(1))
- Expect(fs[0].Data).To(Equal([]byte("foo")))
- })
-
- It("ignores the connection flow control window for non-contributing streams", func() {
- stream1.dataForWriting = []byte("foobar")
- fcm.remainingConnectionWindowSize = 0
- fs := framer.PopStreamFrames(1000)
- Expect(fs).To(HaveLen(1))
- Expect(fs[0].Data).To(Equal([]byte("foobar")))
- })
-
- It("respects the connection flow control window for contributing streams", func() {
- stream1.dataForWriting = []byte("foobar")
- fcm.remainingConnectionWindowSize = 0
- fcm.streamsContributing = []protocol.StreamID{stream1.StreamID()}
- fs := framer.PopStreamFrames(1000)
- Expect(fs).To(BeEmpty())
- })
-
- It("selects a stream that is not flow control blocked", func() {
- fcm.sendWindowSizes[stream1.StreamID()] = 0
- stream1.dataForWriting = []byte("foobar")
- stream2.dataForWriting = []byte("foobaz")
- fs := framer.PopStreamFrames(1000)
- Expect(fs).To(HaveLen(1))
- Expect(fs[0].StreamID).To(Equal(stream2.StreamID()))
- Expect(fs[0].Data).To(Equal([]byte("foobaz")))
- })
-
- It("chooses a non-contributing stream if the connection is flow control blocked", func() {
- stream1.dataForWriting = []byte("foobar")
- stream2.dataForWriting = []byte("foobaz")
- fcm.streamsContributing = []protocol.StreamID{stream1.StreamID()}
- fcm.remainingConnectionWindowSize = 0
- fs := framer.PopStreamFrames(1000)
- Expect(fs).To(HaveLen(1))
- Expect(fs[0].StreamID).To(Equal(stream2.StreamID()))
- })
-
- It("returns nil if every stream is individually flow control blocked", func() {
- fcm.sendWindowSizes[stream1.StreamID()] = 0
- fcm.sendWindowSizes[stream2.StreamID()] = 0
- stream1.dataForWriting = []byte("foobar")
- stream2.dataForWriting = []byte("foobaz")
- fs := framer.PopStreamFrames(1000)
- Expect(fs).To(BeEmpty())
- })
-
- It("returns nil if every stream is connection flow control blocked", func() {
- fcm.remainingConnectionWindowSize = 0
- stream1.dataForWriting = []byte("foobar")
- stream2.dataForWriting = []byte("foobaz")
- fcm.streamsContributing = []protocol.StreamID{stream1.StreamID(), stream2.StreamID()}
- fs := framer.PopStreamFrames(1000)
- Expect(fs).To(BeEmpty())
- })
- })
-
Context("BLOCKED frames", func() {
- BeforeEach(func() {
- fcm.remainingConnectionWindowSize = protocol.MaxByteCount
- })
-
It("Pop returns nil if no frame is queued", func() {
Expect(framer.PopBlockedFrame()).To(BeNil())
})
It("queues and pops BLOCKED frames for individually blocked streams", func() {
- fcm.sendWindowSizes[stream1.StreamID()] = 3
- stream1.dataForWriting = []byte("foo")
+ connFC.EXPECT().IsBlocked()
+ stream1.EXPECT().GetDataForWriting(gomock.Any()).Return([]byte("foobar"), false)
+ stream1.EXPECT().HasDataForWriting().Return(true)
+ stream1.EXPECT().GetWriteOffset()
+ stream1.EXPECT().IsFlowControlBlocked().Return(true)
+ setNoData(stream2)
frames := framer.PopStreamFrames(1000)
Expect(frames).To(HaveLen(1))
- blockedFrame := framer.PopBlockedFrame()
- Expect(blockedFrame).ToNot(BeNil())
- Expect(blockedFrame.StreamID).To(Equal(stream1.StreamID()))
+ f := framer.PopBlockedFrame()
+ Expect(f).To(BeAssignableToTypeOf(&wire.StreamBlockedFrame{}))
+ bf := f.(*wire.StreamBlockedFrame)
+ Expect(bf.StreamID).To(Equal(stream1.StreamID()))
Expect(framer.PopBlockedFrame()).To(BeNil())
})
It("does not queue a stream-level BLOCKED frame after sending the FinBit frame", func() {
- fcm.sendWindowSizes[stream1.StreamID()] = 5000
- stream1.dataForWriting = []byte("foo")
+ connFC.EXPECT().IsBlocked()
+ stream1.EXPECT().GetDataForWriting(gomock.Any()).Return([]byte("foo"), true)
+ stream1.EXPECT().HasDataForWriting().Return(true)
+ stream1.EXPECT().GetWriteOffset()
+ setNoData(stream2)
frames := framer.PopStreamFrames(1000)
Expect(frames).To(HaveLen(1))
- Expect(frames[0].FinBit).To(BeFalse())
- stream1.finishedWriting.Set(true)
- frames = framer.PopStreamFrames(1000)
- Expect(frames).To(HaveLen(1))
Expect(frames[0].FinBit).To(BeTrue())
- Expect(frames[0].DataLen()).To(BeZero())
+ Expect(frames[0].DataLen()).To(Equal(protocol.ByteCount(3)))
blockedFrame := framer.PopBlockedFrame()
Expect(blockedFrame).To(BeNil())
})
It("queues and pops BLOCKED frames for connection blocked streams", func() {
- fcm.remainingConnectionWindowSize = 3
- fcm.streamsContributing = []protocol.StreamID{stream1.StreamID()}
- stream1.dataForWriting = []byte("foo")
+ connFC.EXPECT().IsBlocked().Return(true)
+ stream1.EXPECT().GetDataForWriting(gomock.Any()).Return([]byte("foo"), false)
+ stream1.EXPECT().HasDataForWriting().Return(true)
+ stream1.EXPECT().GetWriteOffset()
+ stream1.EXPECT().IsFlowControlBlocked().Return(false)
+ setNoData(stream2)
framer.PopStreamFrames(1000)
- blockedFrame := framer.PopBlockedFrame()
- Expect(blockedFrame).ToNot(BeNil())
- Expect(blockedFrame.StreamID).To(BeZero())
- Expect(framer.PopBlockedFrame()).To(BeNil())
- })
-
- It("does not queue BLOCKED frames for non-contributing streams", func() {
- fcm.remainingConnectionWindowSize = 3
- stream1.dataForWriting = []byte("foo")
- framer.PopStreamFrames(1000)
- Expect(framer.PopBlockedFrame()).To(BeNil())
- })
-
- It("does not queue BLOCKED frames twice", func() {
- fcm.sendWindowSizes[stream1.StreamID()] = 3
- stream1.dataForWriting = []byte("foobar")
- framer.PopStreamFrames(1000)
- blockedFrame := framer.PopBlockedFrame()
- Expect(blockedFrame).ToNot(BeNil())
- Expect(blockedFrame.StreamID).To(Equal(stream1.StreamID()))
+ f := framer.PopBlockedFrame()
+ Expect(f).To(BeAssignableToTypeOf(&wire.BlockedFrame{}))
Expect(framer.PopBlockedFrame()).To(BeNil())
})
})
diff --git a/vendor/github.com/lucas-clemente/quic-go/stream_test.go b/vendor/github.com/lucas-clemente/quic-go/stream_test.go
index 4ece7d8..ce2ab48 100644
--- a/vendor/github.com/lucas-clemente/quic-go/stream_test.go
+++ b/vendor/github.com/lucas-clemente/quic-go/stream_test.go
@@ -3,125 +3,49 @@ package quic
import (
"errors"
"io"
+ "runtime"
+ "strconv"
"time"
- "github.com/lucas-clemente/quic-go/congestion"
- "github.com/lucas-clemente/quic-go/flowcontrol"
- "github.com/lucas-clemente/quic-go/frames"
- "github.com/lucas-clemente/quic-go/protocol"
- "github.com/lucas-clemente/quic-go/utils"
+ "os"
+
+ "github.com/golang/mock/gomock"
+ "github.com/lucas-clemente/quic-go/internal/mocks"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/wire"
+
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
+ "github.com/onsi/gomega/gbytes"
)
-type mockFlowControlHandler struct {
- streamsContributing []protocol.StreamID
-
- sendWindowSizes map[protocol.StreamID]protocol.ByteCount
- remainingConnectionWindowSize protocol.ByteCount
- bytesReadForStream protocol.StreamID
- bytesRead protocol.ByteCount
- bytesSent protocol.ByteCount
-
- receiveWindow protocol.ByteCount
- highestReceivedForStream protocol.StreamID
- highestReceived protocol.ByteCount
- flowControlViolation error
-
- triggerStreamWindowUpdate bool
- triggerConnectionWindowUpdate bool
-}
-
-var _ flowcontrol.FlowControlManager = &mockFlowControlHandler{}
-
-func newMockFlowControlHandler() *mockFlowControlHandler {
- return &mockFlowControlHandler{
- sendWindowSizes: make(map[protocol.StreamID]protocol.ByteCount),
- }
-}
-
-func (m *mockFlowControlHandler) NewStream(streamID protocol.StreamID, contributesToConnectionFlow bool) {
- panic("not implemented")
-}
-
-func (m *mockFlowControlHandler) RemoveStream(streamID protocol.StreamID) {
- delete(m.sendWindowSizes, streamID)
-}
-
-func (m *mockFlowControlHandler) GetWindowUpdates() (res []flowcontrol.WindowUpdate) {
- if m.triggerStreamWindowUpdate {
- res = append(res, flowcontrol.WindowUpdate{StreamID: 42, Offset: 0x1337})
- }
- if m.triggerConnectionWindowUpdate {
- res = append(res, flowcontrol.WindowUpdate{StreamID: 0, Offset: 0x1337})
- }
- return res
-}
-
-func (m *mockFlowControlHandler) GetReceiveWindow(protocol.StreamID) (protocol.ByteCount, error) {
- return m.receiveWindow, nil
-}
-
-func (m *mockFlowControlHandler) AddBytesRead(streamID protocol.StreamID, n protocol.ByteCount) error {
- m.bytesReadForStream = streamID
- m.bytesRead = n
- return nil
-}
-
-func (m *mockFlowControlHandler) ResetStream(streamID protocol.StreamID, byteOffset protocol.ByteCount) error {
- m.bytesRead = byteOffset
- return m.UpdateHighestReceived(streamID, byteOffset)
-}
-
-func (m *mockFlowControlHandler) UpdateHighestReceived(streamID protocol.StreamID, byteOffset protocol.ByteCount) error {
- if m.flowControlViolation != nil {
- return m.flowControlViolation
- }
- m.highestReceivedForStream = streamID
- m.highestReceived = byteOffset
- return nil
-}
-
-func (m *mockFlowControlHandler) AddBytesSent(streamID protocol.StreamID, n protocol.ByteCount) error {
- m.bytesSent += n
- m.sendWindowSizes[streamID] -= n
- for _, s := range m.streamsContributing {
- if s == streamID {
- m.remainingConnectionWindowSize -= n
- return nil
- }
- }
- return nil
-}
-
-func (m *mockFlowControlHandler) SendWindowSize(streamID protocol.StreamID) (protocol.ByteCount, error) {
- res := m.sendWindowSizes[streamID]
- for _, s := range m.streamsContributing {
- if s == streamID {
- return utils.MinByteCount(res, m.remainingConnectionWindowSize), nil
- }
- }
- return res, nil
-}
-
-func (m *mockFlowControlHandler) RemainingConnectionWindowSize() protocol.ByteCount {
- return m.remainingConnectionWindowSize
-}
-
-func (m *mockFlowControlHandler) UpdateWindow(streamID protocol.StreamID, offset protocol.ByteCount) (bool, error) {
- panic("not implemented")
-}
-
var _ = Describe("Stream", func() {
+ const streamID protocol.StreamID = 1337
+
var (
- str *stream
- onDataCalled bool
+ str *stream
+ strWithTimeout io.ReadWriter // str wrapped with gbytes.Timeout{Reader,Writer}
+ onDataCalled bool
resetCalled bool
resetCalledForStream protocol.StreamID
resetCalledAtOffset protocol.ByteCount
+
+ mockFC *mocks.MockStreamFlowController
)
+ // in the tests for the stream deadlines we set a deadline
+ // and wait to make an assertion when Read / Write was unblocked
+ // on the CIs, the timing is a lot less precise, so scale every duration by this factor
+ scaleDuration := func(t time.Duration) time.Duration {
+ scaleFactor := 1
+ if f, err := strconv.Atoi(os.Getenv("TIMESCALE_FACTOR")); err == nil { // parsing "" errors, so this works fine if the env is not set
+ scaleFactor = f
+ }
+ Expect(scaleFactor).ToNot(BeZero())
+ return time.Duration(scaleFactor) * t
+ }
+
onData := func() {
onDataCalled = true
}
@@ -135,11 +59,17 @@ var _ = Describe("Stream", func() {
BeforeEach(func() {
onDataCalled = false
resetCalled = false
- var streamID protocol.StreamID = 1337
- cpm := &mockConnectionParametersManager{}
- flowControlManager := flowcontrol.NewFlowControlManager(cpm, &congestion.RTTStats{})
- flowControlManager.NewStream(streamID, true)
- str, _ = newStream(streamID, onData, onReset, flowControlManager)
+ mockFC = mocks.NewMockStreamFlowController(mockCtrl)
+ str = newStream(streamID, onData, onReset, mockFC, protocol.VersionWhatever)
+
+ timeout := scaleDuration(250 * time.Millisecond)
+ strWithTimeout = struct {
+ io.Reader
+ io.Writer
+ }{
+ gbytes.TimeoutReader(str, timeout),
+ gbytes.TimeoutWriter(str, timeout),
+ }
})
It("gets stream id", func() {
@@ -148,43 +78,51 @@ var _ = Describe("Stream", func() {
Context("reading", func() {
It("reads a single StreamFrame", func() {
- frame := frames.StreamFrame{
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(4), false)
+ mockFC.EXPECT().AddBytesRead(protocol.ByteCount(4))
+ frame := wire.StreamFrame{
Offset: 0,
Data: []byte{0xDE, 0xAD, 0xBE, 0xEF},
}
err := str.AddStreamFrame(&frame)
Expect(err).ToNot(HaveOccurred())
b := make([]byte, 4)
- n, err := str.Read(b)
+ n, err := strWithTimeout.Read(b)
Expect(err).ToNot(HaveOccurred())
Expect(n).To(Equal(4))
Expect(b).To(Equal([]byte{0xDE, 0xAD, 0xBE, 0xEF}))
})
It("reads a single StreamFrame in multiple goes", func() {
- frame := frames.StreamFrame{
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(4), false)
+ mockFC.EXPECT().AddBytesRead(protocol.ByteCount(2))
+ mockFC.EXPECT().AddBytesRead(protocol.ByteCount(2))
+ frame := wire.StreamFrame{
Offset: 0,
Data: []byte{0xDE, 0xAD, 0xBE, 0xEF},
}
err := str.AddStreamFrame(&frame)
Expect(err).ToNot(HaveOccurred())
b := make([]byte, 2)
- n, err := str.Read(b)
+ n, err := strWithTimeout.Read(b)
Expect(err).ToNot(HaveOccurred())
Expect(n).To(Equal(2))
Expect(b).To(Equal([]byte{0xDE, 0xAD}))
- n, err = str.Read(b)
+ n, err = strWithTimeout.Read(b)
Expect(err).ToNot(HaveOccurred())
Expect(n).To(Equal(2))
Expect(b).To(Equal([]byte{0xBE, 0xEF}))
})
It("reads all data available", func() {
- frame1 := frames.StreamFrame{
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(2), false)
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(4), false)
+ mockFC.EXPECT().AddBytesRead(protocol.ByteCount(2)).Times(2)
+ frame1 := wire.StreamFrame{
Offset: 0,
Data: []byte{0xDE, 0xAD},
}
- frame2 := frames.StreamFrame{
+ frame2 := wire.StreamFrame{
Offset: 2,
Data: []byte{0xBE, 0xEF},
}
@@ -193,18 +131,21 @@ var _ = Describe("Stream", func() {
err = str.AddStreamFrame(&frame2)
Expect(err).ToNot(HaveOccurred())
b := make([]byte, 6)
- n, err := str.Read(b)
+ n, err := strWithTimeout.Read(b)
Expect(err).ToNot(HaveOccurred())
Expect(n).To(Equal(4))
Expect(b).To(Equal([]byte{0xDE, 0xAD, 0xBE, 0xEF, 0x00, 0x00}))
})
It("assembles multiple StreamFrames", func() {
- frame1 := frames.StreamFrame{
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(2), false)
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(4), false)
+ mockFC.EXPECT().AddBytesRead(protocol.ByteCount(2)).Times(2)
+ frame1 := wire.StreamFrame{
Offset: 0,
Data: []byte{0xDE, 0xAD},
}
- frame2 := frames.StreamFrame{
+ frame2 := wire.StreamFrame{
Offset: 2,
Data: []byte{0xBE, 0xEF},
}
@@ -213,34 +154,37 @@ var _ = Describe("Stream", func() {
err = str.AddStreamFrame(&frame2)
Expect(err).ToNot(HaveOccurred())
b := make([]byte, 4)
- n, err := str.Read(b)
+ n, err := strWithTimeout.Read(b)
Expect(err).ToNot(HaveOccurred())
Expect(n).To(Equal(4))
Expect(b).To(Equal([]byte{0xDE, 0xAD, 0xBE, 0xEF}))
})
It("waits until data is available", func() {
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(2), false)
+ mockFC.EXPECT().AddBytesRead(protocol.ByteCount(2))
go func() {
- frame := frames.StreamFrame{
- Offset: 0,
- Data: []byte{0xDE, 0xAD},
- }
- time.Sleep(time.Millisecond)
+ defer GinkgoRecover()
+ frame := wire.StreamFrame{Data: []byte{0xDE, 0xAD}}
+ time.Sleep(10 * time.Millisecond)
err := str.AddStreamFrame(&frame)
Expect(err).ToNot(HaveOccurred())
}()
b := make([]byte, 2)
- n, err := str.Read(b)
+ n, err := strWithTimeout.Read(b)
Expect(err).ToNot(HaveOccurred())
Expect(n).To(Equal(2))
})
It("handles StreamFrames in wrong order", func() {
- frame1 := frames.StreamFrame{
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(2), false)
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(4), false)
+ mockFC.EXPECT().AddBytesRead(protocol.ByteCount(2)).Times(2)
+ frame1 := wire.StreamFrame{
Offset: 2,
Data: []byte{0xBE, 0xEF},
}
- frame2 := frames.StreamFrame{
+ frame2 := wire.StreamFrame{
Offset: 0,
Data: []byte{0xDE, 0xAD},
}
@@ -249,22 +193,26 @@ var _ = Describe("Stream", func() {
err = str.AddStreamFrame(&frame2)
Expect(err).ToNot(HaveOccurred())
b := make([]byte, 4)
- n, err := str.Read(b)
+ n, err := strWithTimeout.Read(b)
Expect(err).ToNot(HaveOccurred())
Expect(n).To(Equal(4))
Expect(b).To(Equal([]byte{0xDE, 0xAD, 0xBE, 0xEF}))
})
It("ignores duplicate StreamFrames", func() {
- frame1 := frames.StreamFrame{
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(2), false)
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(2), false)
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(4), false)
+ mockFC.EXPECT().AddBytesRead(protocol.ByteCount(2)).Times(2)
+ frame1 := wire.StreamFrame{
Offset: 0,
Data: []byte{0xDE, 0xAD},
}
- frame2 := frames.StreamFrame{
+ frame2 := wire.StreamFrame{
Offset: 0,
Data: []byte{0x13, 0x37},
}
- frame3 := frames.StreamFrame{
+ frame3 := wire.StreamFrame{
Offset: 2,
Data: []byte{0xBE, 0xEF},
}
@@ -275,69 +223,165 @@ var _ = Describe("Stream", func() {
err = str.AddStreamFrame(&frame3)
Expect(err).ToNot(HaveOccurred())
b := make([]byte, 4)
- n, err := str.Read(b)
+ n, err := strWithTimeout.Read(b)
Expect(err).ToNot(HaveOccurred())
Expect(n).To(Equal(4))
Expect(b).To(Equal([]byte{0xDE, 0xAD, 0xBE, 0xEF}))
})
It("doesn't rejects a StreamFrames with an overlapping data range", func() {
- frame1 := frames.StreamFrame{
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(4), false)
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(6), false)
+ mockFC.EXPECT().AddBytesRead(protocol.ByteCount(2))
+ mockFC.EXPECT().AddBytesRead(protocol.ByteCount(4))
+ frame1 := wire.StreamFrame{
Offset: 0,
Data: []byte("foob"),
}
- frame2 := frames.StreamFrame{
+ frame2 := wire.StreamFrame{
Offset: 2,
Data: []byte("obar"),
}
err := str.AddStreamFrame(&frame1)
Expect(err).ToNot(HaveOccurred())
err = str.AddStreamFrame(&frame2)
+ Expect(err).ToNot(HaveOccurred())
b := make([]byte, 6)
- n, err := str.Read(b)
+ n, err := strWithTimeout.Read(b)
Expect(err).ToNot(HaveOccurred())
Expect(n).To(Equal(6))
Expect(b).To(Equal([]byte("foobar")))
})
It("calls onData", func() {
- frame := frames.StreamFrame{
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(4), false)
+ mockFC.EXPECT().AddBytesRead(protocol.ByteCount(4))
+ frame := wire.StreamFrame{
Offset: 0,
Data: []byte{0xDE, 0xAD, 0xBE, 0xEF},
}
str.AddStreamFrame(&frame)
b := make([]byte, 4)
- _, err := str.Read(b)
+ _, err := strWithTimeout.Read(b)
Expect(err).ToNot(HaveOccurred())
Expect(onDataCalled).To(BeTrue())
})
+ It("sets the read offset", func() {
+ str.SetReadOffset(0x42)
+ Expect(str.readOffset).To(Equal(protocol.ByteCount(0x42)))
+ Expect(str.frameQueue.readPosition).To(Equal(protocol.ByteCount(0x42)))
+ })
+
+ Context("deadlines", func() {
+ It("the deadline error has the right net.Error properties", func() {
+ Expect(errDeadline.Temporary()).To(BeTrue())
+ Expect(errDeadline.Timeout()).To(BeTrue())
+ })
+
+ It("returns an error when Read is called after the deadline", func() {
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(6), false).AnyTimes()
+ f := &wire.StreamFrame{Data: []byte("foobar")}
+ err := str.AddStreamFrame(f)
+ Expect(err).ToNot(HaveOccurred())
+ str.SetReadDeadline(time.Now().Add(-time.Second))
+ b := make([]byte, 6)
+ n, err := strWithTimeout.Read(b)
+ Expect(err).To(MatchError(errDeadline))
+ Expect(n).To(BeZero())
+ })
+
+ It("unblocks after the deadline", func() {
+ deadline := time.Now().Add(scaleDuration(50 * time.Millisecond))
+ str.SetReadDeadline(deadline)
+ b := make([]byte, 6)
+ n, err := strWithTimeout.Read(b)
+ Expect(err).To(MatchError(errDeadline))
+ Expect(n).To(BeZero())
+ Expect(time.Now()).To(BeTemporally("~", deadline, scaleDuration(10*time.Millisecond)))
+ })
+
+ It("doesn't unblock if the deadline is changed before the first one expires", func() {
+ deadline1 := time.Now().Add(scaleDuration(50 * time.Millisecond))
+ deadline2 := time.Now().Add(scaleDuration(100 * time.Millisecond))
+ str.SetReadDeadline(deadline1)
+ go func() {
+ defer GinkgoRecover()
+ time.Sleep(scaleDuration(20 * time.Millisecond))
+ str.SetReadDeadline(deadline2)
+ // make sure that this was actually execute before the deadline expires
+ Expect(time.Now()).To(BeTemporally("<", deadline1))
+ }()
+ runtime.Gosched()
+ b := make([]byte, 10)
+ n, err := strWithTimeout.Read(b)
+ Expect(err).To(MatchError(errDeadline))
+ Expect(n).To(BeZero())
+ Expect(time.Now()).To(BeTemporally("~", deadline2, scaleDuration(20*time.Millisecond)))
+ })
+
+ It("unblocks earlier, when a new deadline is set", func() {
+ deadline1 := time.Now().Add(scaleDuration(200 * time.Millisecond))
+ deadline2 := time.Now().Add(scaleDuration(50 * time.Millisecond))
+ go func() {
+ defer GinkgoRecover()
+ time.Sleep(scaleDuration(10 * time.Millisecond))
+ str.SetReadDeadline(deadline2)
+ // make sure that this was actually execute before the deadline expires
+ Expect(time.Now()).To(BeTemporally("<", deadline2))
+ }()
+ str.SetReadDeadline(deadline1)
+ runtime.Gosched()
+ b := make([]byte, 10)
+ _, err := strWithTimeout.Read(b)
+ Expect(err).To(MatchError(errDeadline))
+ Expect(time.Now()).To(BeTemporally("~", deadline2, scaleDuration(25*time.Millisecond)))
+ })
+
+ It("sets a read deadline, when SetDeadline is called", func() {
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(6), false).AnyTimes()
+ f := &wire.StreamFrame{Data: []byte("foobar")}
+ err := str.AddStreamFrame(f)
+ Expect(err).ToNot(HaveOccurred())
+ str.SetDeadline(time.Now().Add(-time.Second))
+ b := make([]byte, 6)
+ n, err := strWithTimeout.Read(b)
+ Expect(err).To(MatchError(errDeadline))
+ Expect(n).To(BeZero())
+ })
+ })
+
Context("closing", func() {
Context("with FIN bit", func() {
It("returns EOFs", func() {
- frame := frames.StreamFrame{
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(4), true)
+ mockFC.EXPECT().AddBytesRead(protocol.ByteCount(4))
+ frame := wire.StreamFrame{
Offset: 0,
Data: []byte{0xDE, 0xAD, 0xBE, 0xEF},
FinBit: true,
}
str.AddStreamFrame(&frame)
b := make([]byte, 4)
- n, err := str.Read(b)
+ n, err := strWithTimeout.Read(b)
Expect(err).To(MatchError(io.EOF))
Expect(n).To(Equal(4))
Expect(b).To(Equal([]byte{0xDE, 0xAD, 0xBE, 0xEF}))
- n, err = str.Read(b)
+ n, err = strWithTimeout.Read(b)
Expect(n).To(BeZero())
Expect(err).To(MatchError(io.EOF))
})
It("handles out-of-order frames", func() {
- frame1 := frames.StreamFrame{
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(2), false)
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(4), true)
+ mockFC.EXPECT().AddBytesRead(protocol.ByteCount(2)).Times(2)
+ frame1 := wire.StreamFrame{
Offset: 2,
Data: []byte{0xBE, 0xEF},
FinBit: true,
}
- frame2 := frames.StreamFrame{
+ frame2 := wire.StreamFrame{
Offset: 0,
Data: []byte{0xDE, 0xAD},
}
@@ -346,17 +390,19 @@ var _ = Describe("Stream", func() {
err = str.AddStreamFrame(&frame2)
Expect(err).ToNot(HaveOccurred())
b := make([]byte, 4)
- n, err := str.Read(b)
+ n, err := strWithTimeout.Read(b)
Expect(err).To(MatchError(io.EOF))
Expect(n).To(Equal(4))
Expect(b).To(Equal([]byte{0xDE, 0xAD, 0xBE, 0xEF}))
- n, err = str.Read(b)
+ n, err = strWithTimeout.Read(b)
Expect(n).To(BeZero())
Expect(err).To(MatchError(io.EOF))
})
It("returns EOFs with partial read", func() {
- frame := frames.StreamFrame{
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(2), true)
+ mockFC.EXPECT().AddBytesRead(protocol.ByteCount(2))
+ frame := wire.StreamFrame{
Offset: 0,
Data: []byte{0xDE, 0xAD},
FinBit: true,
@@ -364,14 +410,16 @@ var _ = Describe("Stream", func() {
err := str.AddStreamFrame(&frame)
Expect(err).ToNot(HaveOccurred())
b := make([]byte, 4)
- n, err := str.Read(b)
+ n, err := strWithTimeout.Read(b)
Expect(err).To(MatchError(io.EOF))
Expect(n).To(Equal(2))
Expect(b[:n]).To(Equal([]byte{0xDE, 0xAD}))
})
It("handles immediate FINs", func() {
- frame := frames.StreamFrame{
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(0), true)
+ mockFC.EXPECT().AddBytesRead(protocol.ByteCount(0))
+ frame := wire.StreamFrame{
Offset: 0,
Data: []byte{},
FinBit: true,
@@ -379,7 +427,7 @@ var _ = Describe("Stream", func() {
err := str.AddStreamFrame(&frame)
Expect(err).ToNot(HaveOccurred())
b := make([]byte, 4)
- n, err := str.Read(b)
+ n, err := strWithTimeout.Read(b)
Expect(n).To(BeZero())
Expect(err).To(MatchError(io.EOF))
})
@@ -387,12 +435,20 @@ var _ = Describe("Stream", func() {
Context("when CloseRemote is called", func() {
It("closes", func() {
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(0), true)
+ mockFC.EXPECT().AddBytesRead(protocol.ByteCount(0))
str.CloseRemote(0)
b := make([]byte, 8)
- n, err := str.Read(b)
+ n, err := strWithTimeout.Read(b)
Expect(n).To(BeZero())
Expect(err).To(MatchError(io.EOF))
})
+
+ It("doesn't cancel the context", func() {
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(0), true)
+ str.CloseRemote(0)
+ Expect(str.Context().Done()).ToNot(BeClosed())
+ })
})
})
@@ -400,28 +456,33 @@ var _ = Describe("Stream", func() {
testErr := errors.New("test error")
It("immediately returns all reads", func() {
- var readReturned bool
- var n int
- var err error
+ done := make(chan struct{})
b := make([]byte, 4)
go func() {
- n, err = str.Read(b)
- readReturned = true
+ defer GinkgoRecover()
+ n, err := strWithTimeout.Read(b)
+ Expect(n).To(BeZero())
+ Expect(err).To(MatchError(testErr))
+ close(done)
}()
- Consistently(func() bool { return readReturned }).Should(BeFalse())
+ Consistently(done).ShouldNot(BeClosed())
str.Cancel(testErr)
- Eventually(func() bool { return readReturned }).Should(BeTrue())
- Expect(n).To(BeZero())
- Expect(err).To(MatchError(testErr))
+ Eventually(done).Should(BeClosed())
})
It("errors for all following reads", func() {
str.Cancel(testErr)
b := make([]byte, 1)
- n, err := str.Read(b)
+ n, err := strWithTimeout.Read(b)
Expect(n).To(BeZero())
Expect(err).To(MatchError(testErr))
})
+
+ It("cancels the context", func() {
+ Expect(str.Context().Done()).ToNot(BeClosed())
+ str.Cancel(testErr)
+ Expect(str.Context().Done()).To(BeClosed())
+ })
})
})
@@ -430,199 +491,228 @@ var _ = Describe("Stream", func() {
Context("reset by the peer", func() {
It("continues reading after receiving a remote error", func() {
- frame := frames.StreamFrame{
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(4), false)
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(10), true)
+ frame := wire.StreamFrame{
Offset: 0,
Data: []byte{0xDE, 0xAD, 0xBE, 0xEF},
}
str.AddStreamFrame(&frame)
- str.RegisterRemoteError(testErr)
+ str.RegisterRemoteError(testErr, 10)
b := make([]byte, 4)
- n, err := str.Read(b)
+ n, err := strWithTimeout.Read(b)
Expect(err).ToNot(HaveOccurred())
Expect(n).To(Equal(4))
})
It("reads a delayed StreamFrame that arrives after receiving a remote error", func() {
- str.RegisterRemoteError(testErr)
- frame := frames.StreamFrame{
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(4), true)
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(4), false)
+ str.RegisterRemoteError(testErr, 4)
+ frame := wire.StreamFrame{
Offset: 0,
Data: []byte{0xDE, 0xAD, 0xBE, 0xEF},
}
err := str.AddStreamFrame(&frame)
Expect(err).ToNot(HaveOccurred())
b := make([]byte, 4)
- n, err := str.Read(b)
+ n, err := strWithTimeout.Read(b)
Expect(err).ToNot(HaveOccurred())
Expect(n).To(Equal(4))
})
It("returns the error if reading past the offset of the frame received", func() {
- frame := frames.StreamFrame{
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(4), false)
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(8), true)
+ frame := wire.StreamFrame{
Offset: 0,
Data: []byte{0xDE, 0xAD, 0xBE, 0xEF},
}
str.AddStreamFrame(&frame)
- str.RegisterRemoteError(testErr)
+ str.RegisterRemoteError(testErr, 8)
b := make([]byte, 10)
- n, err := str.Read(b)
+ n, err := strWithTimeout.Read(b)
Expect(b[0:4]).To(Equal(frame.Data))
Expect(err).To(MatchError(testErr))
Expect(n).To(Equal(4))
})
It("returns an EOF when reading past the offset, if the stream received a finbit", func() {
- frame := frames.StreamFrame{
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(4), true)
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(8), true)
+ frame := wire.StreamFrame{
Offset: 0,
Data: []byte{0xDE, 0xAD, 0xBE, 0xEF},
FinBit: true,
}
str.AddStreamFrame(&frame)
- str.RegisterRemoteError(testErr)
+ str.RegisterRemoteError(testErr, 8)
b := make([]byte, 10)
- n, err := str.Read(b)
+ n, err := strWithTimeout.Read(b)
Expect(b[:4]).To(Equal(frame.Data))
Expect(err).To(MatchError(io.EOF))
Expect(n).To(Equal(4))
})
It("continues reading in small chunks after receiving a remote error", func() {
- frame := frames.StreamFrame{
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(4), true)
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(4), true)
+ frame := wire.StreamFrame{
Offset: 0,
Data: []byte{0xDE, 0xAD, 0xBE, 0xEF},
FinBit: true,
}
str.AddStreamFrame(&frame)
- str.RegisterRemoteError(testErr)
+ str.RegisterRemoteError(testErr, 4)
b := make([]byte, 3)
- _, err := str.Read(b)
+ _, err := strWithTimeout.Read(b)
Expect(err).ToNot(HaveOccurred())
Expect(b).To(Equal([]byte{0xde, 0xad, 0xbe}))
b = make([]byte, 3)
- n, err := str.Read(b)
+ n, err := strWithTimeout.Read(b)
Expect(err).To(MatchError(io.EOF))
Expect(b[:1]).To(Equal([]byte{0xef}))
Expect(n).To(Equal(1))
})
It("doesn't inform the flow controller about bytes read after receiving the remote error", func() {
- str.flowControlManager = newMockFlowControlHandler()
- frame := frames.StreamFrame{
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(4), false)
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(10), true)
+ // No AddBytesRead()
+ frame := wire.StreamFrame{
Offset: 0,
StreamID: 5,
Data: []byte{0xDE, 0xAD, 0xBE, 0xEF},
}
str.AddStreamFrame(&frame)
- str.flowControlManager.ResetStream(5, 4)
- str.RegisterRemoteError(testErr)
+ str.RegisterRemoteError(testErr, 10)
b := make([]byte, 3)
- _, err := str.Read(b)
+ _, err := strWithTimeout.Read(b)
Expect(err).ToNot(HaveOccurred())
- Expect(str.flowControlManager.(*mockFlowControlHandler).bytesRead).To(BeEquivalentTo(4))
})
It("stops writing after receiving a remote error", func() {
- var writeReturned bool
- var n int
- var err error
-
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(10), true)
+ done := make(chan struct{})
go func() {
- n, err = str.Write([]byte("foobar"))
- writeReturned = true
+ defer GinkgoRecover()
+ n, err := strWithTimeout.Write([]byte("foobar"))
+ Expect(n).To(BeZero())
+ Expect(err).To(MatchError(testErr))
+ close(done)
}()
- str.RegisterRemoteError(testErr)
- Eventually(func() bool { return writeReturned }).Should(BeTrue())
- Expect(n).To(BeZero())
- Expect(err).To(MatchError(testErr))
+ str.RegisterRemoteError(testErr, 10)
+ Eventually(done).Should(BeClosed())
+ })
+
+ It("returns how much was written when recieving a remote error", func() {
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(10), true)
+ mockFC.EXPECT().SendWindowSize().Return(protocol.ByteCount(9999))
+ mockFC.EXPECT().AddBytesSent(protocol.ByteCount(4))
+ done := make(chan struct{})
+ go func() {
+ defer GinkgoRecover()
+ n, err := strWithTimeout.Write([]byte("foobar"))
+ Expect(err).To(MatchError(testErr))
+ Expect(n).To(Equal(4))
+ close(done)
+ }()
+
+ Eventually(func() []byte { data, _ := str.GetDataForWriting(4); return data }).ShouldNot(BeEmpty())
+ str.RegisterRemoteError(testErr, 10)
+ Eventually(done).Should(BeClosed())
})
It("calls onReset when receiving a remote error", func() {
- var writeReturned bool
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(0), true)
+ done := make(chan struct{})
str.writeOffset = 0x1000
go func() {
- str.Write([]byte("foobar"))
- writeReturned = true
+ _, _ = strWithTimeout.Write([]byte("foobar"))
+ close(done)
}()
- str.RegisterRemoteError(testErr)
+ str.RegisterRemoteError(testErr, 0)
Expect(resetCalled).To(BeTrue())
Expect(resetCalledForStream).To(Equal(protocol.StreamID(1337)))
Expect(resetCalledAtOffset).To(Equal(protocol.ByteCount(0x1000)))
- Eventually(func() bool { return writeReturned }).Should(BeTrue())
+ Eventually(done).Should(BeClosed())
})
It("doesn't call onReset if it already sent a FIN", func() {
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(0), true)
str.Close()
- str.sentFin()
- str.RegisterRemoteError(testErr)
+ _, sentFin := str.GetDataForWriting(1000)
+ Expect(sentFin).To(BeTrue())
+ str.RegisterRemoteError(testErr, 0)
Expect(resetCalled).To(BeFalse())
})
It("doesn't call onReset if the stream was reset locally before", func() {
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(0), true)
str.Reset(testErr)
Expect(resetCalled).To(BeTrue())
resetCalled = false
- str.RegisterRemoteError(testErr)
+ str.RegisterRemoteError(testErr, 0)
Expect(resetCalled).To(BeFalse())
})
It("doesn't call onReset twice, when it gets two remote errors", func() {
- str.RegisterRemoteError(testErr)
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(0), true)
+ str.RegisterRemoteError(testErr, 0)
Expect(resetCalled).To(BeTrue())
resetCalled = false
- str.RegisterRemoteError(testErr)
+ str.RegisterRemoteError(testErr, 0)
Expect(resetCalled).To(BeFalse())
})
})
Context("reset locally", func() {
It("stops writing", func() {
- var writeReturned bool
- var n int
- var err error
-
+ done := make(chan struct{})
go func() {
- n, err = str.Write([]byte("foobar"))
- writeReturned = true
+ defer GinkgoRecover()
+ n, err := strWithTimeout.Write([]byte("foobar"))
+ Expect(n).To(BeZero())
+ Expect(err).To(MatchError(testErr))
+ close(done)
}()
- Consistently(func() bool { return writeReturned }).Should(BeFalse())
+ Consistently(done).ShouldNot(BeClosed())
str.Reset(testErr)
- Expect(str.getDataForWriting(6)).To(BeNil())
- Eventually(func() bool { return writeReturned }).Should(BeTrue())
- Expect(n).To(BeZero())
- Expect(err).To(MatchError(testErr))
+ Expect(str.GetDataForWriting(6)).To(BeNil())
+ Eventually(done).Should(BeClosed())
})
It("doesn't allow further writes", func() {
str.Reset(testErr)
- n, err := str.Write([]byte("foobar"))
+ n, err := strWithTimeout.Write([]byte("foobar"))
Expect(n).To(BeZero())
Expect(err).To(MatchError(testErr))
- Expect(str.getDataForWriting(6)).To(BeNil())
+ Expect(str.GetDataForWriting(6)).To(BeNil())
})
It("stops reading", func() {
- var readReturned bool
- var n int
- var err error
-
+ done := make(chan struct{})
go func() {
+ defer GinkgoRecover()
b := make([]byte, 4)
- n, err = str.Read(b)
- readReturned = true
+ n, err := strWithTimeout.Read(b)
+ Expect(n).To(BeZero())
+ Expect(err).To(MatchError(testErr))
+ close(done)
}()
- Consistently(func() bool { return readReturned }).Should(BeFalse())
+ Consistently(done).ShouldNot(BeClosed())
str.Reset(testErr)
- Eventually(func() bool { return readReturned }).Should(BeTrue())
- Expect(n).To(BeZero())
- Expect(err).To(MatchError(testErr))
+ Eventually(done).Should(BeClosed())
})
It("doesn't allow further reads", func() {
- str.AddStreamFrame(&frames.StreamFrame{
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(6), false)
+ str.AddStreamFrame(&wire.StreamFrame{
Data: []byte("foobar"),
})
str.Reset(testErr)
b := make([]byte, 6)
- n, err := str.Read(b)
+ n, err := strWithTimeout.Read(b)
Expect(n).To(BeZero())
Expect(err).To(MatchError(testErr))
})
@@ -637,13 +727,15 @@ var _ = Describe("Stream", func() {
It("doesn't call onReset if it already sent a FIN", func() {
str.Close()
- str.sentFin()
+ _, sentFin := str.GetDataForWriting(1000)
+ Expect(sentFin).To(BeTrue())
str.Reset(testErr)
Expect(resetCalled).To(BeFalse())
})
It("doesn't call onReset if the stream was reset remotely before", func() {
- str.RegisterRemoteError(testErr)
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(0), true)
+ str.RegisterRemoteError(testErr, 0)
Expect(resetCalled).To(BeTrue())
resetCalled = false
str.Reset(testErr)
@@ -657,13 +749,23 @@ var _ = Describe("Stream", func() {
str.Reset(testErr)
Expect(resetCalled).To(BeFalse())
})
+
+ It("cancels the context", func() {
+ Expect(str.Context().Done()).ToNot(BeClosed())
+ str.Reset(testErr)
+ Expect(str.Context().Done()).To(BeClosed())
+ })
})
})
Context("writing", func() {
- It("writes and gets all data at once", func(done Done) {
+ It("writes and gets all data at once", func() {
+ mockFC.EXPECT().SendWindowSize().Return(protocol.ByteCount(9999))
+ mockFC.EXPECT().AddBytesSent(protocol.ByteCount(6))
+ done := make(chan struct{})
go func() {
- n, err := str.Write([]byte("foobar"))
+ defer GinkgoRecover()
+ n, err := strWithTimeout.Write([]byte("foobar"))
Expect(err).ToNot(HaveOccurred())
Expect(n).To(Equal(6))
close(done)
@@ -673,17 +775,24 @@ var _ = Describe("Stream", func() {
defer str.mutex.Unlock()
return str.dataForWriting
}).Should(Equal([]byte("foobar")))
+ Consistently(done).ShouldNot(BeClosed())
Expect(onDataCalled).To(BeTrue())
- Expect(str.lenOfDataForWriting()).To(Equal(protocol.ByteCount(6)))
- data := str.getDataForWriting(1000)
+ Expect(str.HasDataForWriting()).To(BeTrue())
+ data, sendFin := str.GetDataForWriting(1000)
Expect(data).To(Equal([]byte("foobar")))
+ Expect(sendFin).To(BeFalse())
Expect(str.writeOffset).To(Equal(protocol.ByteCount(6)))
Expect(str.dataForWriting).To(BeNil())
+ Eventually(done).Should(BeClosed())
})
- It("writes and gets data in two turns", func(done Done) {
+ It("writes and gets data in two turns", func() {
+ mockFC.EXPECT().SendWindowSize().Return(protocol.ByteCount(9999)).Times(2)
+ mockFC.EXPECT().AddBytesSent(protocol.ByteCount(3)).Times(2)
+ done := make(chan struct{})
go func() {
- n, err := str.Write([]byte("foobar"))
+ defer GinkgoRecover()
+ n, err := strWithTimeout.Write([]byte("foobar"))
Expect(err).ToNot(HaveOccurred())
Expect(n).To(Equal(6))
close(done)
@@ -693,78 +802,167 @@ var _ = Describe("Stream", func() {
defer str.mutex.Unlock()
return str.dataForWriting
}).Should(Equal([]byte("foobar")))
- Expect(str.lenOfDataForWriting()).To(Equal(protocol.ByteCount(6)))
- data := str.getDataForWriting(3)
+ Consistently(done).ShouldNot(BeClosed())
+ Expect(str.HasDataForWriting()).To(BeTrue())
+ data, sendFin := str.GetDataForWriting(3)
Expect(data).To(Equal([]byte("foo")))
+ Expect(sendFin).To(BeFalse())
Expect(str.writeOffset).To(Equal(protocol.ByteCount(3)))
Expect(str.dataForWriting).ToNot(BeNil())
- Expect(str.lenOfDataForWriting()).To(Equal(protocol.ByteCount(3)))
- data = str.getDataForWriting(3)
+ Expect(str.HasDataForWriting()).To(BeTrue())
+ data, sendFin = str.GetDataForWriting(3)
Expect(data).To(Equal([]byte("bar")))
+ Expect(sendFin).To(BeFalse())
Expect(str.writeOffset).To(Equal(protocol.ByteCount(6)))
Expect(str.dataForWriting).To(BeNil())
- Expect(str.lenOfDataForWriting()).To(Equal(protocol.ByteCount(0)))
+ Expect(str.HasDataForWriting()).To(BeFalse())
+ Eventually(done).Should(BeClosed())
})
It("getDataForWriting returns nil if no data is available", func() {
- Expect(str.getDataForWriting(1000)).To(BeNil())
+ Expect(str.GetDataForWriting(1000)).To(BeNil())
})
It("copies the slice while writing", func() {
+ mockFC.EXPECT().SendWindowSize().Return(protocol.ByteCount(9999))
+ mockFC.EXPECT().AddBytesSent(protocol.ByteCount(3))
s := []byte("foo")
go func() {
- n, err := str.Write(s)
+ defer GinkgoRecover()
+ n, err := strWithTimeout.Write(s)
Expect(err).ToNot(HaveOccurred())
Expect(n).To(Equal(3))
}()
- Eventually(func() protocol.ByteCount { return str.lenOfDataForWriting() }).ShouldNot(BeZero())
+ Eventually(func() bool { return str.HasDataForWriting() }).Should(BeTrue())
s[0] = 'v'
- Expect(str.getDataForWriting(3)).To(Equal([]byte("foo")))
+ Expect(str.GetDataForWriting(3)).To(Equal([]byte("foo")))
})
It("returns when given a nil input", func() {
- n, err := str.Write(nil)
+ n, err := strWithTimeout.Write(nil)
Expect(n).To(BeZero())
Expect(err).ToNot(HaveOccurred())
})
It("returns when given an empty slice", func() {
- n, err := str.Write([]byte(""))
+ n, err := strWithTimeout.Write([]byte(""))
Expect(n).To(BeZero())
Expect(err).ToNot(HaveOccurred())
})
+ Context("deadlines", func() {
+ It("returns an error when Write is called after the deadline", func() {
+ str.SetWriteDeadline(time.Now().Add(-time.Second))
+ n, err := strWithTimeout.Write([]byte("foobar"))
+ Expect(err).To(MatchError(errDeadline))
+ Expect(n).To(BeZero())
+ })
+
+ It("unblocks after the deadline", func() {
+ deadline := time.Now().Add(scaleDuration(50 * time.Millisecond))
+ str.SetWriteDeadline(deadline)
+ n, err := strWithTimeout.Write([]byte("foobar"))
+ Expect(err).To(MatchError(errDeadline))
+ Expect(n).To(BeZero())
+ Expect(time.Now()).To(BeTemporally("~", deadline, scaleDuration(20*time.Millisecond)))
+ })
+
+ It("doesn't unblock if the deadline is changed before the first one expires", func() {
+ deadline1 := time.Now().Add(scaleDuration(50 * time.Millisecond))
+ deadline2 := time.Now().Add(scaleDuration(100 * time.Millisecond))
+ str.SetWriteDeadline(deadline1)
+ go func() {
+ defer GinkgoRecover()
+ time.Sleep(scaleDuration(20 * time.Millisecond))
+ str.SetWriteDeadline(deadline2)
+ // make sure that this was actually execute before the deadline expires
+ Expect(time.Now()).To(BeTemporally("<", deadline1))
+ }()
+ runtime.Gosched()
+ n, err := strWithTimeout.Write([]byte("foobar"))
+ Expect(err).To(MatchError(errDeadline))
+ Expect(n).To(BeZero())
+ Expect(time.Now()).To(BeTemporally("~", deadline2, scaleDuration(20*time.Millisecond)))
+ })
+
+ It("unblocks earlier, when a new deadline is set", func() {
+ deadline1 := time.Now().Add(scaleDuration(200 * time.Millisecond))
+ deadline2 := time.Now().Add(scaleDuration(50 * time.Millisecond))
+ go func() {
+ defer GinkgoRecover()
+ time.Sleep(scaleDuration(10 * time.Millisecond))
+ str.SetWriteDeadline(deadline2)
+ // make sure that this was actually execute before the deadline expires
+ Expect(time.Now()).To(BeTemporally("<", deadline2))
+ }()
+ str.SetWriteDeadline(deadline1)
+ runtime.Gosched()
+ _, err := strWithTimeout.Write([]byte("foobar"))
+ Expect(err).To(MatchError(errDeadline))
+ Expect(time.Now()).To(BeTemporally("~", deadline2, scaleDuration(20*time.Millisecond)))
+ })
+
+ It("sets a read deadline, when SetDeadline is called", func() {
+ str.SetDeadline(time.Now().Add(-time.Second))
+ n, err := strWithTimeout.Write([]byte("foobar"))
+ Expect(err).To(MatchError(errDeadline))
+ Expect(n).To(BeZero())
+ })
+ })
+
Context("closing", func() {
- It("sets finishedWriting when calling Close", func() {
+ It("doesn't allow writes after it has been closed", func() {
str.Close()
- Expect(str.finishedWriting.Get()).To(BeTrue())
+ _, err := strWithTimeout.Write([]byte("foobar"))
+ Expect(err).To(MatchError("write on closed stream 1337"))
})
It("allows FIN", func() {
str.Close()
- Expect(str.shouldSendFin()).To(BeTrue())
+ Expect(str.HasDataForWriting()).To(BeTrue())
+ data, sendFin := str.GetDataForWriting(1000)
+ Expect(data).To(BeEmpty())
+ Expect(sendFin).To(BeTrue())
})
It("does not allow FIN when there's still data", func() {
+ mockFC.EXPECT().SendWindowSize().Return(protocol.ByteCount(9999)).Times(2)
+ mockFC.EXPECT().AddBytesSent(gomock.Any()).Times(2)
str.dataForWriting = []byte("foobar")
str.Close()
- Expect(str.shouldSendFin()).To(BeFalse())
+ Expect(str.HasDataForWriting()).To(BeTrue())
+ data, sendFin := str.GetDataForWriting(3)
+ Expect(data).To(Equal([]byte("foo")))
+ Expect(sendFin).To(BeFalse())
+ data, sendFin = str.GetDataForWriting(3)
+ Expect(data).To(Equal([]byte("bar")))
+ Expect(sendFin).To(BeTrue())
})
It("does not allow FIN when the stream is not closed", func() {
- Expect(str.shouldSendFin()).To(BeFalse())
+ Expect(str.HasDataForWriting()).To(BeFalse())
+ _, sendFin := str.GetDataForWriting(3)
+ Expect(sendFin).To(BeFalse())
})
It("does not allow FIN after an error", func() {
str.Cancel(errors.New("test"))
- Expect(str.shouldSendFin()).To(BeFalse())
+ Expect(str.HasDataForWriting()).To(BeFalse())
+ data, sendFin := str.GetDataForWriting(1000)
+ Expect(data).To(BeEmpty())
+ Expect(sendFin).To(BeFalse())
})
It("does not allow FIN twice", func() {
str.Close()
- Expect(str.shouldSendFin()).To(BeTrue())
- str.sentFin()
- Expect(str.shouldSendFin()).To(BeFalse())
+ Expect(str.HasDataForWriting()).To(BeTrue())
+ data, sendFin := str.GetDataForWriting(1000)
+ Expect(data).To(BeEmpty())
+ Expect(sendFin).To(BeTrue())
+ Expect(str.HasDataForWriting()).To(BeFalse())
+ data, sendFin = str.GetDataForWriting(1000)
+ Expect(data).To(BeEmpty())
+ Expect(sendFin).To(BeFalse())
})
})
@@ -773,108 +971,132 @@ var _ = Describe("Stream", func() {
It("returns errors when the stream is cancelled", func() {
str.Cancel(testErr)
- n, err := str.Write([]byte("foo"))
+ n, err := strWithTimeout.Write([]byte("foo"))
Expect(n).To(BeZero())
Expect(err).To(MatchError(testErr))
})
It("doesn't get data for writing if an error occurred", func() {
go func() {
- _, err := str.Write([]byte("foobar"))
+ defer GinkgoRecover()
+ _, err := strWithTimeout.Write([]byte("foobar"))
Expect(err).To(MatchError(testErr))
}()
Eventually(func() []byte { return str.dataForWriting }).ShouldNot(BeNil())
- Expect(str.lenOfDataForWriting()).ToNot(BeZero())
+ Expect(str.HasDataForWriting()).To(BeTrue())
str.Cancel(testErr)
- data := str.getDataForWriting(6)
+ data, sendFin := str.GetDataForWriting(6)
Expect(data).To(BeNil())
- Expect(str.lenOfDataForWriting()).To(BeZero())
+ Expect(sendFin).To(BeFalse())
+ Expect(str.HasDataForWriting()).To(BeFalse())
})
})
})
- Context("flow control, for receiving", func() {
- BeforeEach(func() {
- str.flowControlManager = &mockFlowControlHandler{}
- })
-
- It("updates the highestReceived value in the flow controller", func() {
- frame := frames.StreamFrame{
- Offset: 2,
- Data: []byte("foobar"),
- }
- err := str.AddStreamFrame(&frame)
- Expect(err).ToNot(HaveOccurred())
- Expect(str.flowControlManager.(*mockFlowControlHandler).highestReceivedForStream).To(Equal(str.streamID))
- Expect(str.flowControlManager.(*mockFlowControlHandler).highestReceived).To(Equal(protocol.ByteCount(2 + 6)))
- })
-
- It("errors when a StreamFrames causes a flow control violation", func() {
- testErr := errors.New("flow control violation")
- str.flowControlManager.(*mockFlowControlHandler).flowControlViolation = testErr
- frame := frames.StreamFrame{
- Offset: 2,
- Data: []byte("foobar"),
- }
- err := str.AddStreamFrame(&frame)
- Expect(err).To(MatchError(testErr))
- })
+ It("errors when a StreamFrames causes a flow control violation", func() {
+ testErr := errors.New("flow control violation")
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(8), false).Return(testErr)
+ frame := wire.StreamFrame{
+ Offset: 2,
+ Data: []byte("foobar"),
+ }
+ err := str.AddStreamFrame(&frame)
+ Expect(err).To(MatchError(testErr))
})
Context("closing", func() {
testErr := errors.New("testErr")
finishReading := func() {
- err := str.AddStreamFrame(&frames.StreamFrame{FinBit: true})
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(0), true)
+ err := str.AddStreamFrame(&wire.StreamFrame{FinBit: true})
Expect(err).ToNot(HaveOccurred())
b := make([]byte, 100)
- _, err = str.Read(b)
+ _, err = strWithTimeout.Read(b)
Expect(err).To(MatchError(io.EOF))
}
It("is finished after it is canceled", func() {
str.Cancel(testErr)
- Expect(str.finished()).To(BeTrue())
+ Expect(str.Finished()).To(BeTrue())
})
It("is not finished if it is only closed for writing", func() {
str.Close()
- str.sentFin()
- Expect(str.finished()).To(BeFalse())
+ _, sentFin := str.GetDataForWriting(1000)
+ Expect(sentFin).To(BeTrue())
+ Expect(str.Finished()).To(BeFalse())
+ })
+
+ It("cancels the context after it is closed", func() {
+ Expect(str.Context().Done()).ToNot(BeClosed())
+ str.Close()
+ Expect(str.Context().Done()).To(BeClosed())
})
It("is not finished if it is only closed for reading", func() {
+ mockFC.EXPECT().AddBytesRead(protocol.ByteCount(0))
finishReading()
- Expect(str.finished()).To(BeFalse())
+ Expect(str.Finished()).To(BeFalse())
})
It("is finished after receiving a RST and sending one", func() {
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(0), true)
// this directly sends a rst
- str.RegisterRemoteError(testErr)
+ str.RegisterRemoteError(testErr, 0)
Expect(str.rstSent.Get()).To(BeTrue())
- Expect(str.finished()).To(BeTrue())
+ Expect(str.Finished()).To(BeTrue())
+ })
+
+ It("cancels the context after receiving a RST", func() {
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(0), true)
+ Expect(str.Context().Done()).ToNot(BeClosed())
+ str.RegisterRemoteError(testErr, 0)
+ Expect(str.Context().Done()).To(BeClosed())
})
It("is finished after being locally reset and receiving a RST in response", func() {
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(13), true)
str.Reset(testErr)
- Expect(str.finished()).To(BeFalse())
- str.RegisterRemoteError(testErr)
- Expect(str.finished()).To(BeTrue())
+ Expect(str.Finished()).To(BeFalse())
+ str.RegisterRemoteError(testErr, 13)
+ Expect(str.Finished()).To(BeTrue())
})
It("is finished after finishing writing and receiving a RST", func() {
+ mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(13), true)
str.Close()
- str.sentFin()
- str.RegisterRemoteError(testErr)
- Expect(str.finished()).To(BeTrue())
+ _, sentFin := str.GetDataForWriting(1000)
+ Expect(sentFin).To(BeTrue())
+ str.RegisterRemoteError(testErr, 13)
+ Expect(str.Finished()).To(BeTrue())
})
It("is finished after finishing reading and being locally reset", func() {
+ mockFC.EXPECT().AddBytesRead(protocol.ByteCount(0))
finishReading()
- Expect(str.finished()).To(BeFalse())
+ Expect(str.Finished()).To(BeFalse())
str.Reset(testErr)
- Expect(str.finished()).To(BeTrue())
+ Expect(str.Finished()).To(BeTrue())
})
})
+ Context("flow control", func() {
+ It("says when it's flow control blocked", func() {
+ mockFC.EXPECT().IsBlocked().Return(false)
+ Expect(str.IsFlowControlBlocked()).To(BeFalse())
+ mockFC.EXPECT().IsBlocked().Return(true)
+ Expect(str.IsFlowControlBlocked()).To(BeTrue())
+ })
+
+ It("updates the flow control window", func() {
+ mockFC.EXPECT().UpdateSendWindow(protocol.ByteCount(0x42))
+ str.UpdateSendWindow(0x42)
+ })
+
+ It("gets a window update", func() {
+ mockFC.EXPECT().GetWindowUpdate().Return(protocol.ByteCount(0x100))
+ Expect(str.GetWindowUpdate()).To(Equal(protocol.ByteCount(0x100)))
+ })
+ })
})
diff --git a/vendor/github.com/lucas-clemente/quic-go/streams_map.go b/vendor/github.com/lucas-clemente/quic-go/streams_map.go
index c2fa76b..e162205 100644
--- a/vendor/github.com/lucas-clemente/quic-go/streams_map.go
+++ b/vendor/github.com/lucas-clemente/quic-go/streams_map.go
@@ -5,21 +5,20 @@ import (
"fmt"
"sync"
- "github.com/lucas-clemente/quic-go/handshake"
- "github.com/lucas-clemente/quic-go/protocol"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
+ "github.com/lucas-clemente/quic-go/internal/utils"
"github.com/lucas-clemente/quic-go/qerr"
)
type streamsMap struct {
mutex sync.RWMutex
- perspective protocol.Perspective
- connectionParameters handshake.ConnectionParametersManager
+ perspective protocol.Perspective
- streams map[protocol.StreamID]*stream
+ streams map[protocol.StreamID]streamI
// needed for round-robin scheduling
openStreams []protocol.StreamID
- roundRobinIndex uint32
+ roundRobinIndex int
nextStream protocol.StreamID // StreamID of the next Stream that will be returned by OpenStream()
highestStreamOpenedByPeer protocol.StreamID
@@ -33,40 +32,58 @@ type streamsMap struct {
numOutgoingStreams uint32
numIncomingStreams uint32
+ maxIncomingStreams uint32
+ maxOutgoingStreams uint32
}
-type streamLambda func(*stream) (bool, error)
-type newStreamLambda func(protocol.StreamID) (*stream, error)
+type streamLambda func(streamI) (bool, error)
+type newStreamLambda func(protocol.StreamID) streamI
-var (
- errMapAccess = errors.New("streamsMap: Error accessing the streams map")
-)
+var errMapAccess = errors.New("streamsMap: Error accessing the streams map")
-func newStreamsMap(newStream newStreamLambda, pers protocol.Perspective, connectionParameters handshake.ConnectionParametersManager) *streamsMap {
+func newStreamsMap(newStream newStreamLambda, pers protocol.Perspective, ver protocol.VersionNumber) *streamsMap {
+ // add some tolerance to the maximum incoming streams value
+ maxStreams := uint32(protocol.MaxIncomingStreams)
+ maxIncomingStreams := utils.MaxUint32(
+ maxStreams+protocol.MaxStreamsMinimumIncrement,
+ uint32(float64(maxStreams)*float64(protocol.MaxStreamsMultiplier)),
+ )
sm := streamsMap{
- perspective: pers,
- streams: map[protocol.StreamID]*stream{},
- openStreams: make([]protocol.StreamID, 0),
- newStream: newStream,
- connectionParameters: connectionParameters,
+ perspective: pers,
+ streams: make(map[protocol.StreamID]streamI),
+ openStreams: make([]protocol.StreamID, 0),
+ newStream: newStream,
+ maxIncomingStreams: maxIncomingStreams,
}
sm.nextStreamOrErrCond.L = &sm.mutex
sm.openStreamOrErrCond.L = &sm.mutex
+ nextOddStream := protocol.StreamID(1)
+ if ver.CryptoStreamID() == protocol.StreamID(1) {
+ nextOddStream = 3
+ }
if pers == protocol.PerspectiveClient {
- sm.nextStream = 1
+ sm.nextStream = nextOddStream
sm.nextStreamToAccept = 2
} else {
sm.nextStream = 2
- sm.nextStreamToAccept = 1
+ sm.nextStreamToAccept = nextOddStream
}
return &sm
}
+// getStreamPerspective says which side should initiate a stream
+func (m *streamsMap) streamInitiatedBy(id protocol.StreamID) protocol.Perspective {
+ if id%2 == 0 {
+ return protocol.PerspectiveServer
+ }
+ return protocol.PerspectiveClient
+}
+
// GetOrOpenStream either returns an existing stream, a newly opened stream, or nil if a stream with the provided ID is already closed.
// Newly opened streams should only originate from the client. To open a stream from the server, OpenStream should be used.
-func (m *streamsMap) GetOrOpenStream(id protocol.StreamID) (*stream, error) {
+func (m *streamsMap) GetOrOpenStream(id protocol.StreamID) (streamI, error) {
m.mutex.RLock()
s, ok := m.streams[id]
m.mutex.RUnlock()
@@ -83,17 +100,16 @@ func (m *streamsMap) GetOrOpenStream(id protocol.StreamID) (*stream, error) {
return s, nil
}
- if id <= m.highestStreamOpenedByPeer {
+ if m.perspective == m.streamInitiatedBy(id) {
+ if id <= m.nextStream { // this is a stream opened by us. Must have been closed already
+ return nil, nil
+ }
+ return nil, qerr.Error(qerr.InvalidStreamID, fmt.Sprintf("peer attempted to open stream %d", id))
+ }
+ if id <= m.highestStreamOpenedByPeer { // this is a peer-initiated stream that doesn't exist anymore. Must have been closed already
return nil, nil
}
- if m.perspective == protocol.PerspectiveServer && id%2 == 0 {
- return nil, qerr.Error(qerr.InvalidStreamID, fmt.Sprintf("attempted to open stream %d from client-side", id))
- }
- if m.perspective == protocol.PerspectiveClient && id%2 == 1 {
- return nil, qerr.Error(qerr.InvalidStreamID, fmt.Sprintf("attempted to open stream %d from server-side", id))
- }
-
// sid is the next stream that will be opened
sid := m.highestStreamOpenedByPeer + 2
// if there is no stream opened yet, and this is the server, stream 1 should be openend
@@ -102,8 +118,7 @@ func (m *streamsMap) GetOrOpenStream(id protocol.StreamID) (*stream, error) {
}
for ; sid <= id; sid += 2 {
- _, err := m.openRemoteStream(sid)
- if err != nil {
+ if _, err := m.openRemoteStream(sid); err != nil {
return nil, err
}
}
@@ -112,64 +127,49 @@ func (m *streamsMap) GetOrOpenStream(id protocol.StreamID) (*stream, error) {
return m.streams[id], nil
}
-func (m *streamsMap) openRemoteStream(id protocol.StreamID) (*stream, error) {
- if m.numIncomingStreams >= m.connectionParameters.GetMaxIncomingStreams() {
+func (m *streamsMap) openRemoteStream(id protocol.StreamID) (streamI, error) {
+ if m.numIncomingStreams >= m.maxIncomingStreams {
return nil, qerr.TooManyOpenStreams
}
if id+protocol.MaxNewStreamIDDelta < m.highestStreamOpenedByPeer {
return nil, qerr.Error(qerr.InvalidStreamID, fmt.Sprintf("attempted to open stream %d, which is a lot smaller than the highest opened stream, %d", id, m.highestStreamOpenedByPeer))
}
- s, err := m.newStream(id)
- if err != nil {
- return nil, err
- }
-
- if m.perspective == protocol.PerspectiveServer {
- m.numIncomingStreams++
- } else {
- m.numOutgoingStreams++
- }
-
+ m.numIncomingStreams++
if id > m.highestStreamOpenedByPeer {
m.highestStreamOpenedByPeer = id
}
+ s := m.newStream(id)
m.putStream(s)
return s, nil
}
-func (m *streamsMap) openStreamImpl() (*stream, error) {
+func (m *streamsMap) openStreamImpl() (streamI, error) {
id := m.nextStream
- if m.numOutgoingStreams >= m.connectionParameters.GetMaxOutgoingStreams() {
+ if m.numOutgoingStreams >= m.maxOutgoingStreams {
return nil, qerr.TooManyOpenStreams
}
- s, err := m.newStream(id)
- if err != nil {
- return nil, err
- }
-
- if m.perspective == protocol.PerspectiveServer {
- m.numOutgoingStreams++
- } else {
- m.numIncomingStreams++
- }
-
+ m.numOutgoingStreams++
m.nextStream += 2
+ s := m.newStream(id)
m.putStream(s)
return s, nil
}
// OpenStream opens the next available stream
-func (m *streamsMap) OpenStream() (*stream, error) {
+func (m *streamsMap) OpenStream() (streamI, error) {
m.mutex.Lock()
defer m.mutex.Unlock()
+ if m.closeErr != nil {
+ return nil, m.closeErr
+ }
return m.openStreamImpl()
}
-func (m *streamsMap) OpenStreamSync() (*stream, error) {
+func (m *streamsMap) OpenStreamSync() (streamI, error) {
m.mutex.Lock()
defer m.mutex.Unlock()
@@ -190,10 +190,10 @@ func (m *streamsMap) OpenStreamSync() (*stream, error) {
// AcceptStream returns the next stream opened by the peer
// it blocks until a new stream is opened
-func (m *streamsMap) AcceptStream() (*stream, error) {
+func (m *streamsMap) AcceptStream() (streamI, error) {
m.mutex.Lock()
defer m.mutex.Unlock()
- var str *stream
+ var str streamI
for {
var ok bool
if m.closeErr != nil {
@@ -209,53 +209,64 @@ func (m *streamsMap) AcceptStream() (*stream, error) {
return str, nil
}
-func (m *streamsMap) Iterate(fn streamLambda) error {
+func (m *streamsMap) DeleteClosedStreams() error {
m.mutex.Lock()
defer m.mutex.Unlock()
- openStreams := make([]protocol.StreamID, len(m.openStreams), len(m.openStreams))
- for i, streamID := range m.openStreams { // copy openStreams
- openStreams[i] = streamID
+ var numDeletedStreams int
+ // for every closed stream, the streamID is replaced by 0 in the openStreams slice
+ for i, streamID := range m.openStreams {
+ str, ok := m.streams[streamID]
+ if !ok {
+ return errMapAccess
+ }
+ if !str.Finished() {
+ continue
+ }
+ numDeletedStreams++
+ m.openStreams[i] = 0
+ if m.streamInitiatedBy(streamID) == m.perspective {
+ m.numOutgoingStreams--
+ } else {
+ m.numIncomingStreams--
+ }
+ delete(m.streams, streamID)
}
- for _, streamID := range openStreams {
- cont, err := m.iterateFunc(streamID, fn)
- if err != nil {
- return err
+ if numDeletedStreams == 0 {
+ return nil
+ }
+
+ // remove all 0s (representing closed streams) from the openStreams slice
+ // and adjust the roundRobinIndex
+ var j int
+ for i, id := range m.openStreams {
+ if i != j {
+ m.openStreams[j] = m.openStreams[i]
}
- if !cont {
- break
+ if id != 0 {
+ j++
+ } else if j < m.roundRobinIndex {
+ m.roundRobinIndex--
}
}
+ m.openStreams = m.openStreams[:len(m.openStreams)-numDeletedStreams]
+ m.openStreamOrErrCond.Signal()
return nil
}
// RoundRobinIterate executes the streamLambda for every open stream, until the streamLambda returns false
// It uses a round-robin-like scheduling to ensure that every stream is considered fairly
-// It prioritizes the crypto- and the header-stream (StreamIDs 1 and 3)
+// It prioritizes the the header-stream (StreamID 3)
func (m *streamsMap) RoundRobinIterate(fn streamLambda) error {
m.mutex.Lock()
defer m.mutex.Unlock()
- numStreams := uint32(len(m.streams))
+ numStreams := len(m.streams)
startIndex := m.roundRobinIndex
- for _, i := range []protocol.StreamID{1, 3} {
- cont, err := m.iterateFunc(i, fn)
- if err != nil && err != errMapAccess {
- return err
- }
- if !cont {
- return nil
- }
- }
-
- for i := uint32(0); i < numStreams; i++ {
+ for i := 0; i < numStreams; i++ {
streamID := m.openStreams[(i+startIndex)%numStreams]
- if streamID == 1 || streamID == 3 {
- continue
- }
-
cont, err := m.iterateFunc(streamID, fn)
if err != nil {
return err
@@ -268,6 +279,18 @@ func (m *streamsMap) RoundRobinIterate(fn streamLambda) error {
return nil
}
+// Range executes a callback for all streams, in pseudo-random order
+func (m *streamsMap) Range(cb func(s streamI)) {
+ m.mutex.RLock()
+ defer m.mutex.RUnlock()
+
+ for _, s := range m.streams {
+ if s != nil {
+ cb(s)
+ }
+ }
+}
+
func (m *streamsMap) iterateFunc(streamID protocol.StreamID, fn streamLambda) (bool, error) {
str, ok := m.streams[streamID]
if !ok {
@@ -276,7 +299,7 @@ func (m *streamsMap) iterateFunc(streamID protocol.StreamID, fn streamLambda) (b
return fn(str)
}
-func (m *streamsMap) putStream(s *stream) error {
+func (m *streamsMap) putStream(s streamI) error {
id := s.StreamID()
if _, ok := m.streams[id]; ok {
return fmt.Errorf("a stream with ID %d already exists", id)
@@ -287,40 +310,20 @@ func (m *streamsMap) putStream(s *stream) error {
return nil
}
-// Attention: this function must only be called if a mutex has been acquired previously
-func (m *streamsMap) RemoveStream(id protocol.StreamID) error {
- s, ok := m.streams[id]
- if !ok || s == nil {
- return fmt.Errorf("attempted to remove non-existing stream: %d", id)
- }
-
- if id%2 == 0 {
- m.numOutgoingStreams--
- } else {
- m.numIncomingStreams--
- }
-
- for i, s := range m.openStreams {
- if s == id {
- // delete the streamID from the openStreams slice
- m.openStreams = m.openStreams[:i+copy(m.openStreams[i:], m.openStreams[i+1:])]
- // adjust round-robin index, if necessary
- if uint32(i) < m.roundRobinIndex {
- m.roundRobinIndex--
- }
- break
- }
- }
-
- delete(m.streams, id)
- m.openStreamOrErrCond.Signal()
- return nil
-}
-
func (m *streamsMap) CloseWithError(err error) {
m.mutex.Lock()
+ defer m.mutex.Unlock()
m.closeErr = err
m.nextStreamOrErrCond.Broadcast()
m.openStreamOrErrCond.Broadcast()
- m.mutex.Unlock()
+ for _, s := range m.openStreams {
+ m.streams[s].Cancel(err)
+ }
+}
+
+func (m *streamsMap) UpdateMaxStreamLimit(limit uint32) {
+ m.mutex.Lock()
+ defer m.mutex.Unlock()
+ m.maxOutgoingStreams = limit
+ m.openStreamOrErrCond.Broadcast()
}
diff --git a/vendor/github.com/lucas-clemente/quic-go/streams_map_test.go b/vendor/github.com/lucas-clemente/quic-go/streams_map_test.go
index 370d9b5..99936c9 100644
--- a/vendor/github.com/lucas-clemente/quic-go/streams_map_test.go
+++ b/vendor/github.com/lucas-clemente/quic-go/streams_map_test.go
@@ -2,83 +2,55 @@ package quic
import (
"errors"
- "math"
- "time"
+ "sort"
- "github.com/lucas-clemente/quic-go/handshake"
- "github.com/lucas-clemente/quic-go/protocol"
+ "github.com/lucas-clemente/quic-go/internal/mocks"
+ "github.com/lucas-clemente/quic-go/internal/protocol"
"github.com/lucas-clemente/quic-go/qerr"
+
+ "github.com/golang/mock/gomock"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
-type mockConnectionParametersManager struct {
- maxIncomingStreams uint32
- maxOutgoingStreams uint32
- idleTime time.Duration
-}
-
-func (m *mockConnectionParametersManager) SetFromMap(map[handshake.Tag][]byte) error {
- panic("not implemented")
-}
-func (m *mockConnectionParametersManager) GetHelloMap() (map[handshake.Tag][]byte, error) {
- panic("not implemented")
-}
-func (m *mockConnectionParametersManager) GetSendStreamFlowControlWindow() protocol.ByteCount {
- return math.MaxUint64
-}
-func (m *mockConnectionParametersManager) GetSendConnectionFlowControlWindow() protocol.ByteCount {
- return math.MaxUint64
-}
-func (m *mockConnectionParametersManager) GetReceiveStreamFlowControlWindow() protocol.ByteCount {
- return math.MaxUint64
-}
-func (m *mockConnectionParametersManager) GetMaxReceiveStreamFlowControlWindow() protocol.ByteCount {
- return math.MaxUint64
-}
-func (m *mockConnectionParametersManager) GetReceiveConnectionFlowControlWindow() protocol.ByteCount {
- return math.MaxUint64
-}
-func (m *mockConnectionParametersManager) GetMaxReceiveConnectionFlowControlWindow() protocol.ByteCount {
- return math.MaxUint64
-}
-func (m *mockConnectionParametersManager) GetMaxOutgoingStreams() uint32 { return m.maxOutgoingStreams }
-func (m *mockConnectionParametersManager) GetMaxIncomingStreams() uint32 { return m.maxIncomingStreams }
-func (m *mockConnectionParametersManager) GetIdleConnectionStateLifetime() time.Duration {
- return m.idleTime
-}
-func (m *mockConnectionParametersManager) TruncateConnectionID() bool { return false }
-
-var _ handshake.ConnectionParametersManager = &mockConnectionParametersManager{}
-
var _ = Describe("Streams Map", func() {
var (
- cpm handshake.ConnectionParametersManager
- m *streamsMap
+ m *streamsMap
+ finishedStreams map[protocol.StreamID]*gomock.Call
)
- setNewStreamsMap := func(p protocol.Perspective) {
- m = newStreamsMap(nil, p, cpm)
- m.newStream = func(id protocol.StreamID) (*stream, error) {
- return &stream{streamID: id}, nil
- }
+ newStream := func(id protocol.StreamID) streamI {
+ str := mocks.NewMockStreamI(mockCtrl)
+ str.EXPECT().StreamID().Return(id).AnyTimes()
+ c := str.EXPECT().Finished().Return(false).AnyTimes()
+ finishedStreams[id] = c
+ return str
+ }
+
+ setNewStreamsMap := func(p protocol.Perspective, v protocol.VersionNumber) {
+ m = newStreamsMap(newStream, p, v)
}
BeforeEach(func() {
- cpm = &mockConnectionParametersManager{
- maxIncomingStreams: 75,
- maxOutgoingStreams: 60,
- }
+ finishedStreams = make(map[protocol.StreamID]*gomock.Call)
})
AfterEach(func() {
Expect(m.openStreams).To(HaveLen(len(m.streams)))
})
+ deleteStream := func(id protocol.StreamID) {
+ str := m.streams[id]
+ Expect(str).ToNot(BeNil())
+ finishedStreams[id].Return(true)
+ err := m.DeleteClosedStreams()
+ Expect(err).ToNot(HaveOccurred())
+ }
+
Context("getting and creating streams", func() {
Context("as a server", func() {
BeforeEach(func() {
- setNewStreamsMap(protocol.PerspectiveServer)
+ setNewStreamsMap(protocol.PerspectiveServer, versionGQUICFrames)
})
Context("client-side streams", func() {
@@ -92,7 +64,14 @@ var _ = Describe("Streams Map", func() {
It("rejects streams with even IDs", func() {
_, err := m.GetOrOpenStream(6)
- Expect(err).To(MatchError("InvalidStreamID: attempted to open stream 6 from client-side"))
+ Expect(err).To(MatchError("InvalidStreamID: peer attempted to open stream 6"))
+ })
+
+ It("rejects streams with even IDs, which are lower thatn the highest client-side stream", func() {
+ _, err := m.GetOrOpenStream(5)
+ Expect(err).NotTo(HaveOccurred())
+ _, err = m.GetOrOpenStream(4)
+ Expect(err).To(MatchError("InvalidStreamID: peer attempted to open stream 4"))
})
It("gets existing streams", func() {
@@ -106,12 +85,11 @@ var _ = Describe("Streams Map", func() {
})
It("returns nil for closed streams", func() {
+ _, err := m.GetOrOpenStream(5)
+ Expect(err).NotTo(HaveOccurred())
+ deleteStream(5)
s, err := m.GetOrOpenStream(5)
Expect(err).NotTo(HaveOccurred())
- err = m.RemoveStream(5)
- Expect(err).NotTo(HaveOccurred())
- s, err = m.GetOrOpenStream(5)
- Expect(err).NotTo(HaveOccurred())
Expect(s).To(BeNil())
})
@@ -126,7 +104,7 @@ var _ = Describe("Streams Map", func() {
It("doesn't reopen an already closed stream", func() {
_, err := m.GetOrOpenStream(5)
Expect(err).ToNot(HaveOccurred())
- err = m.RemoveStream(5)
+ deleteStream(5)
Expect(err).ToNot(HaveOccurred())
str, err := m.GetOrOpenStream(5)
Expect(err).ToNot(HaveOccurred())
@@ -134,38 +112,38 @@ var _ = Describe("Streams Map", func() {
})
Context("counting streams", func() {
- var maxNumStreams int
-
- BeforeEach(func() {
- maxNumStreams = int(cpm.GetMaxIncomingStreams())
- })
-
It("errors when too many streams are opened", func() {
- for i := 0; i < maxNumStreams; i++ {
+ for i := uint32(0); i < m.maxIncomingStreams; i++ {
_, err := m.GetOrOpenStream(protocol.StreamID(i*2 + 1))
Expect(err).NotTo(HaveOccurred())
}
- _, err := m.GetOrOpenStream(protocol.StreamID(2*maxNumStreams + 3))
+ _, err := m.GetOrOpenStream(protocol.StreamID(2*m.maxIncomingStreams + 3))
Expect(err).To(MatchError(qerr.TooManyOpenStreams))
})
It("errors when too many streams are opened implicitely", func() {
- _, err := m.GetOrOpenStream(protocol.StreamID(maxNumStreams*2 + 1))
+ _, err := m.GetOrOpenStream(protocol.StreamID(m.maxIncomingStreams*2 + 1))
Expect(err).To(MatchError(qerr.TooManyOpenStreams))
})
It("does not error when many streams are opened and closed", func() {
- for i := 2; i < 10*maxNumStreams; i++ {
- _, err := m.GetOrOpenStream(protocol.StreamID(i*2 + 1))
+ for i := uint32(2); i < 10*m.maxIncomingStreams; i++ {
+ str, err := m.GetOrOpenStream(protocol.StreamID(i*2 + 1))
Expect(err).NotTo(HaveOccurred())
- m.RemoveStream(protocol.StreamID(i*2 + 1))
+ deleteStream(str.StreamID())
}
})
})
})
Context("server-side streams", func() {
+ It("doesn't allow opening streams before receiving the transport parameters", func() {
+ _, err := m.OpenStream()
+ Expect(err).To(MatchError(qerr.TooManyOpenStreams))
+ })
+
It("opens a stream 2 first", func() {
+ m.UpdateMaxStreamLimit(100)
s, err := m.OpenStream()
Expect(err).ToNot(HaveOccurred())
Expect(s).ToNot(BeNil())
@@ -174,22 +152,34 @@ var _ = Describe("Streams Map", func() {
Expect(m.numOutgoingStreams).To(BeEquivalentTo(1))
})
- It("errors if the stream can't be created", func() {
+ It("returns the error when the streamsMap was closed", func() {
testErr := errors.New("test error")
- m.newStream = func(protocol.StreamID) (*stream, error) { return nil, testErr }
+ m.CloseWithError(testErr)
_, err := m.OpenStream()
Expect(err).To(MatchError(testErr))
})
+ It("doesn't reopen an already closed stream", func() {
+ m.UpdateMaxStreamLimit(100)
+ str, err := m.OpenStream()
+ Expect(err).ToNot(HaveOccurred())
+ Expect(str.StreamID()).To(Equal(protocol.StreamID(2)))
+ deleteStream(2)
+ Expect(err).ToNot(HaveOccurred())
+ str, err = m.GetOrOpenStream(2)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(str).To(BeNil())
+ })
+
Context("counting streams", func() {
- var maxNumStreams int
+ const maxOutgoingStreams = 50
BeforeEach(func() {
- maxNumStreams = int(cpm.GetMaxOutgoingStreams())
+ m.UpdateMaxStreamLimit(maxOutgoingStreams)
})
It("errors when too many streams are opened", func() {
- for i := 1; i <= maxNumStreams; i++ {
+ for i := 1; i <= maxOutgoingStreams; i++ {
_, err := m.OpenStream()
Expect(err).NotTo(HaveOccurred())
}
@@ -198,19 +188,19 @@ var _ = Describe("Streams Map", func() {
})
It("does not error when many streams are opened and closed", func() {
- for i := 2; i < 10*maxNumStreams; i++ {
+ for i := 2; i < 10*maxOutgoingStreams; i++ {
str, err := m.OpenStream()
Expect(err).NotTo(HaveOccurred())
- m.RemoveStream(str.StreamID())
+ deleteStream(str.StreamID())
}
})
It("allows many server- and client-side streams at the same time", func() {
- for i := 1; i < int(cpm.GetMaxOutgoingStreams()); i++ {
+ for i := 1; i < maxOutgoingStreams; i++ {
_, err := m.OpenStream()
Expect(err).ToNot(HaveOccurred())
}
- for i := 0; i < int(cpm.GetMaxIncomingStreams()); i++ {
+ for i := 0; i < maxOutgoingStreams; i++ {
_, err := m.GetOrOpenStream(protocol.StreamID(2*i + 1))
Expect(err).ToNot(HaveOccurred())
}
@@ -218,14 +208,14 @@ var _ = Describe("Streams Map", func() {
})
Context("opening streams synchronously", func() {
- var maxNumStreams int
+ const maxOutgoingStreams = 10
BeforeEach(func() {
- maxNumStreams = int(cpm.GetMaxOutgoingStreams())
+ m.UpdateMaxStreamLimit(maxOutgoingStreams)
})
openMaxNumStreams := func() {
- for i := 1; i <= maxNumStreams; i++ {
+ for i := 1; i <= maxOutgoingStreams; i++ {
_, err := m.OpenStream()
Expect(err).NotTo(HaveOccurred())
}
@@ -236,7 +226,7 @@ var _ = Describe("Streams Map", func() {
It("waits until another stream is closed", func() {
openMaxNumStreams()
var returned bool
- var str *stream
+ var str streamI
go func() {
defer GinkgoRecover()
var err error
@@ -246,33 +236,29 @@ var _ = Describe("Streams Map", func() {
}()
Consistently(func() bool { return returned }).Should(BeFalse())
- err := m.RemoveStream(6)
- Expect(err).ToNot(HaveOccurred())
+ deleteStream(6)
Eventually(func() bool { return returned }).Should(BeTrue())
- Expect(str.StreamID()).To(Equal(protocol.StreamID(2*maxNumStreams + 2)))
- })
-
- It("errors if the stream can't be created", func() {
- testErr := errors.New("test error")
- m.newStream = func(protocol.StreamID) (*stream, error) { return nil, testErr }
- _, err := m.OpenStreamSync()
- Expect(err).To(MatchError(testErr))
+ Expect(str.StreamID()).To(Equal(protocol.StreamID(2*maxOutgoingStreams + 2)))
})
It("stops waiting when an error is registered", func() {
- openMaxNumStreams()
testErr := errors.New("test error")
- var err error
- var returned bool
+ openMaxNumStreams()
+ for _, str := range m.streams {
+ str.(*mocks.MockStreamI).EXPECT().Cancel(testErr)
+ }
+
+ done := make(chan struct{})
go func() {
- _, err = m.OpenStreamSync()
- returned = true
+ defer GinkgoRecover()
+ _, err := m.OpenStreamSync()
+ Expect(err).To(MatchError(testErr))
+ close(done)
}()
- Consistently(func() bool { return returned }).Should(BeFalse())
+ Consistently(done).ShouldNot(BeClosed())
m.CloseWithError(testErr)
- Eventually(func() bool { return returned }).Should(BeTrue())
- Expect(err).To(MatchError(testErr))
+ Eventually(done).Should(BeClosed())
})
It("immediately returns when OpenStreamSync is called after an error was registered", func() {
@@ -294,8 +280,9 @@ var _ = Describe("Streams Map", func() {
Consistently(func() bool { return accepted }).Should(BeFalse())
})
- It("accepts stream 1 first", func() {
- var str *stream
+ It("starts with stream 1, if the crypto stream is stream 0", func() {
+ setNewStreamsMap(protocol.PerspectiveServer, versionIETFFrames)
+ var str streamI
go func() {
defer GinkgoRecover()
var err error
@@ -308,8 +295,22 @@ var _ = Describe("Streams Map", func() {
Expect(str.StreamID()).To(Equal(protocol.StreamID(1)))
})
+ It("starts with stream 3, if the crypto stream is stream 1", func() {
+ var str streamI
+ go func() {
+ defer GinkgoRecover()
+ var err error
+ str, err = m.AcceptStream()
+ Expect(err).ToNot(HaveOccurred())
+ }()
+ _, err := m.GetOrOpenStream(3)
+ Expect(err).ToNot(HaveOccurred())
+ Eventually(func() Stream { return str }).ShouldNot(BeNil())
+ Expect(str.StreamID()).To(Equal(protocol.StreamID(3)))
+ })
+
It("returns an implicitly opened stream, if a stream number is skipped", func() {
- var str *stream
+ var str streamI
go func() {
defer GinkgoRecover()
var err error
@@ -319,11 +320,11 @@ var _ = Describe("Streams Map", func() {
_, err := m.GetOrOpenStream(5)
Expect(err).ToNot(HaveOccurred())
Eventually(func() Stream { return str }).ShouldNot(BeNil())
- Expect(str.StreamID()).To(Equal(protocol.StreamID(1)))
+ Expect(str.StreamID()).To(Equal(protocol.StreamID(3)))
})
It("returns to multiple accepts", func() {
- var str1, str2 *stream
+ var str1, str2 streamI
go func() {
defer GinkgoRecover()
var err error
@@ -336,53 +337,53 @@ var _ = Describe("Streams Map", func() {
str2, err = m.AcceptStream()
Expect(err).ToNot(HaveOccurred())
}()
- _, err := m.GetOrOpenStream(3) // opens stream 1 and 3
+ _, err := m.GetOrOpenStream(5) // opens stream 3 and 5
Expect(err).ToNot(HaveOccurred())
- Eventually(func() *stream { return str1 }).ShouldNot(BeNil())
- Eventually(func() *stream { return str2 }).ShouldNot(BeNil())
+ Eventually(func() streamI { return str1 }).ShouldNot(BeNil())
+ Eventually(func() streamI { return str2 }).ShouldNot(BeNil())
Expect(str1.StreamID()).ToNot(Equal(str2.StreamID()))
- Expect(str1.StreamID() + str2.StreamID()).To(BeEquivalentTo(1 + 3))
+ Expect(str1.StreamID() + str2.StreamID()).To(BeEquivalentTo(3 + 5))
})
It("waits a new stream is available", func() {
- var str *stream
+ var str streamI
go func() {
defer GinkgoRecover()
var err error
str, err = m.AcceptStream()
Expect(err).ToNot(HaveOccurred())
}()
- Consistently(func() *stream { return str }).Should(BeNil())
- _, err := m.GetOrOpenStream(1)
+ Consistently(func() streamI { return str }).Should(BeNil())
+ _, err := m.GetOrOpenStream(3)
Expect(err).ToNot(HaveOccurred())
- Eventually(func() *stream { return str }).ShouldNot(BeNil())
- Expect(str.StreamID()).To(Equal(protocol.StreamID(1)))
+ Eventually(func() streamI { return str }).ShouldNot(BeNil())
+ Expect(str.StreamID()).To(Equal(protocol.StreamID(3)))
})
It("returns multiple streams on subsequent Accept calls, if available", func() {
- var str *stream
+ var str streamI
go func() {
defer GinkgoRecover()
var err error
str, err = m.AcceptStream()
Expect(err).ToNot(HaveOccurred())
}()
- _, err := m.GetOrOpenStream(3)
+ _, err := m.GetOrOpenStream(5)
Expect(err).ToNot(HaveOccurred())
- Eventually(func() *stream { return str }).ShouldNot(BeNil())
- Expect(str.StreamID()).To(Equal(protocol.StreamID(1)))
+ Eventually(func() streamI { return str }).ShouldNot(BeNil())
+ Expect(str.StreamID()).To(Equal(protocol.StreamID(3)))
str, err = m.AcceptStream()
Expect(err).ToNot(HaveOccurred())
- Expect(str.StreamID()).To(Equal(protocol.StreamID(3)))
+ Expect(str.StreamID()).To(Equal(protocol.StreamID(5)))
})
It("blocks after accepting a stream", func() {
var accepted bool
- _, err := m.GetOrOpenStream(1)
+ _, err := m.GetOrOpenStream(3)
Expect(err).ToNot(HaveOccurred())
str, err := m.AcceptStream()
Expect(err).ToNot(HaveOccurred())
- Expect(str.StreamID()).To(Equal(protocol.StreamID(1)))
+ Expect(str.StreamID()).To(Equal(protocol.StreamID(3)))
go func() {
defer GinkgoRecover()
_, _ = m.AcceptStream()
@@ -413,21 +414,29 @@ var _ = Describe("Streams Map", func() {
Context("as a client", func() {
BeforeEach(func() {
- setNewStreamsMap(protocol.PerspectiveClient)
+ setNewStreamsMap(protocol.PerspectiveClient, versionGQUICFrames)
+ m.UpdateMaxStreamLimit(100)
})
- Context("client-side streams, as a client", func() {
+ Context("server-side streams", func() {
It("rejects streams with odd IDs", func() {
_, err := m.GetOrOpenStream(5)
- Expect(err).To(MatchError("InvalidStreamID: attempted to open stream 5 from server-side"))
+ Expect(err).To(MatchError("InvalidStreamID: peer attempted to open stream 5"))
+ })
+
+ It("rejects streams with odds IDs, which are lower thatn the highest server-side stream", func() {
+ _, err := m.GetOrOpenStream(6)
+ Expect(err).NotTo(HaveOccurred())
+ _, err = m.GetOrOpenStream(5)
+ Expect(err).To(MatchError("InvalidStreamID: peer attempted to open stream 5"))
})
It("gets new streams", func() {
s, err := m.GetOrOpenStream(2)
Expect(err).NotTo(HaveOccurred())
Expect(s.StreamID()).To(Equal(protocol.StreamID(2)))
- Expect(m.numOutgoingStreams).To(BeEquivalentTo(1))
- Expect(m.numIncomingStreams).To(BeZero())
+ Expect(m.numOutgoingStreams).To(BeZero())
+ Expect(m.numIncomingStreams).To(BeEquivalentTo(1))
})
It("opens skipped streams", func() {
@@ -436,17 +445,41 @@ var _ = Describe("Streams Map", func() {
Expect(m.streams).To(HaveKey(protocol.StreamID(2)))
Expect(m.streams).To(HaveKey(protocol.StreamID(4)))
Expect(m.streams).To(HaveKey(protocol.StreamID(6)))
+ Expect(m.numOutgoingStreams).To(BeZero())
+ Expect(m.numIncomingStreams).To(BeEquivalentTo(3))
+ })
+
+ It("doesn't reopen an already closed stream", func() {
+ str, err := m.OpenStream()
+ Expect(err).ToNot(HaveOccurred())
+ Expect(str.StreamID()).To(Equal(protocol.StreamID(3)))
+ deleteStream(3)
+ Expect(err).ToNot(HaveOccurred())
+ str, err = m.GetOrOpenStream(3)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(str).To(BeNil())
})
})
- Context("server-side streams", func() {
- It("opens stream 1 first", func() {
+ Context("client-side streams", func() {
+ It("starts with stream 1, if the crypto stream is stream 0", func() {
+ setNewStreamsMap(protocol.PerspectiveClient, versionIETFFrames)
+ m.UpdateMaxStreamLimit(100)
s, err := m.OpenStream()
Expect(err).ToNot(HaveOccurred())
Expect(s).ToNot(BeNil())
Expect(s.StreamID()).To(BeEquivalentTo(1))
- Expect(m.numOutgoingStreams).To(BeZero())
- Expect(m.numIncomingStreams).To(BeEquivalentTo(1))
+ Expect(m.numOutgoingStreams).To(BeEquivalentTo(1))
+ Expect(m.numIncomingStreams).To(BeZero())
+ })
+
+ It("starts with stream 3, if the crypto stream is stream 1", func() {
+ s, err := m.OpenStream()
+ Expect(err).ToNot(HaveOccurred())
+ Expect(s).ToNot(BeNil())
+ Expect(s.StreamID()).To(BeEquivalentTo(3))
+ Expect(m.numOutgoingStreams).To(BeEquivalentTo(1))
+ Expect(m.numIncomingStreams).To(BeZero())
})
It("opens multiple streams", func() {
@@ -456,11 +489,21 @@ var _ = Describe("Streams Map", func() {
Expect(err).ToNot(HaveOccurred())
Expect(s2.StreamID()).To(Equal(s1.StreamID() + 2))
})
+
+ It("doesn't reopen an already closed stream", func() {
+ _, err := m.GetOrOpenStream(4)
+ Expect(err).ToNot(HaveOccurred())
+ deleteStream(4)
+ Expect(err).ToNot(HaveOccurred())
+ str, err := m.GetOrOpenStream(4)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(str).To(BeNil())
+ })
})
Context("accepting streams", func() {
It("accepts stream 2 first", func() {
- var str *stream
+ var str streamI
go func() {
defer GinkgoRecover()
var err error
@@ -469,7 +512,7 @@ var _ = Describe("Streams Map", func() {
}()
_, err := m.GetOrOpenStream(2)
Expect(err).ToNot(HaveOccurred())
- Eventually(func() *stream { return str }).ShouldNot(BeNil())
+ Eventually(func() streamI { return str }).ShouldNot(BeNil())
Expect(str.StreamID()).To(Equal(protocol.StreamID(2)))
})
})
@@ -478,101 +521,171 @@ var _ = Describe("Streams Map", func() {
Context("DoS mitigation, iterating and deleting", func() {
BeforeEach(func() {
- setNewStreamsMap(protocol.PerspectiveServer)
+ setNewStreamsMap(protocol.PerspectiveServer, versionGQUICFrames)
})
+ closeStream := func(id protocol.StreamID) {
+ str := m.streams[id]
+ ExpectWithOffset(1, str).ToNot(BeNil())
+ finishedStreams[id].Return(true)
+ }
+
Context("deleting streams", func() {
- BeforeEach(func() {
- for i := 1; i <= 5; i++ {
- err := m.putStream(&stream{streamID: protocol.StreamID(i)})
+ Context("as a server", func() {
+ BeforeEach(func() {
+ m.UpdateMaxStreamLimit(100)
+ for i := 1; i <= 5; i++ {
+ if i%2 == 1 {
+ _, err := m.openRemoteStream(protocol.StreamID(i))
+ Expect(err).ToNot(HaveOccurred())
+ } else {
+ _, err := m.OpenStream()
+ Expect(err).ToNot(HaveOccurred())
+ }
+ }
+ Expect(m.openStreams).To(Equal([]protocol.StreamID{1, 2, 3, 4, 5}))
+ Expect(m.numOutgoingStreams).To(BeEquivalentTo(2)) // 2 and 4
+ Expect(m.numIncomingStreams).To(BeEquivalentTo(3)) // 1, 3 and 5
+ })
+
+ It("does not delete streams with Close()", func() {
+ str, err := m.GetOrOpenStream(55)
Expect(err).ToNot(HaveOccurred())
- }
- Expect(m.openStreams).To(Equal([]protocol.StreamID{1, 2, 3, 4, 5}))
- })
-
- It("errors when removing non-existing stream", func() {
- err := m.RemoveStream(1337)
- Expect(err).To(MatchError("attempted to remove non-existing stream: 1337"))
- })
-
- It("removes the first stream", func() {
- err := m.RemoveStream(1)
- Expect(err).ToNot(HaveOccurred())
- Expect(m.openStreams).To(HaveLen(4))
- Expect(m.openStreams).To(Equal([]protocol.StreamID{2, 3, 4, 5}))
- })
-
- It("removes a stream in the middle", func() {
- err := m.RemoveStream(3)
- Expect(err).ToNot(HaveOccurred())
- Expect(m.openStreams).To(HaveLen(4))
- Expect(m.openStreams).To(Equal([]protocol.StreamID{1, 2, 4, 5}))
- })
-
- It("removes a stream at the end", func() {
- err := m.RemoveStream(5)
- Expect(err).ToNot(HaveOccurred())
- Expect(m.openStreams).To(HaveLen(4))
- Expect(m.openStreams).To(Equal([]protocol.StreamID{1, 2, 3, 4}))
- })
-
- It("removes all streams", func() {
- for i := 1; i <= 5; i++ {
- err := m.RemoveStream(protocol.StreamID(i))
+ str.(*mocks.MockStreamI).EXPECT().Close()
+ str.Close()
+ err = m.DeleteClosedStreams()
Expect(err).ToNot(HaveOccurred())
- }
- Expect(m.openStreams).To(BeEmpty())
+ str, err = m.GetOrOpenStream(55)
+ Expect(err).ToNot(HaveOccurred())
+ Expect(str).ToNot(BeNil())
+ })
+
+ It("removes the first stream", func() {
+ closeStream(1)
+ err := m.DeleteClosedStreams()
+ Expect(err).ToNot(HaveOccurred())
+ Expect(m.openStreams).To(HaveLen(4))
+ Expect(m.openStreams).To(Equal([]protocol.StreamID{2, 3, 4, 5}))
+ Expect(m.numOutgoingStreams).To(BeEquivalentTo(2))
+ Expect(m.numIncomingStreams).To(BeEquivalentTo(2))
+ })
+
+ It("removes a stream in the middle", func() {
+ closeStream(3)
+ err := m.DeleteClosedStreams()
+ Expect(err).ToNot(HaveOccurred())
+ Expect(m.streams).To(HaveLen(4))
+ Expect(m.openStreams).To(Equal([]protocol.StreamID{1, 2, 4, 5}))
+ Expect(m.numOutgoingStreams).To(BeEquivalentTo(2))
+ Expect(m.numIncomingStreams).To(BeEquivalentTo(2))
+ })
+
+ It("removes a client-initiated stream", func() {
+ closeStream(2)
+ err := m.DeleteClosedStreams()
+ Expect(err).ToNot(HaveOccurred())
+ Expect(m.streams).To(HaveLen(4))
+ Expect(m.openStreams).To(Equal([]protocol.StreamID{1, 3, 4, 5}))
+ Expect(m.numOutgoingStreams).To(BeEquivalentTo(1))
+ Expect(m.numIncomingStreams).To(BeEquivalentTo(3))
+ })
+
+ It("removes a stream at the end", func() {
+ closeStream(5)
+ err := m.DeleteClosedStreams()
+ Expect(err).ToNot(HaveOccurred())
+ Expect(m.openStreams).To(HaveLen(4))
+ Expect(m.openStreams).To(Equal([]protocol.StreamID{1, 2, 3, 4}))
+ Expect(m.numOutgoingStreams).To(BeEquivalentTo(2))
+ Expect(m.numIncomingStreams).To(BeEquivalentTo(2))
+ })
+
+ It("removes all streams", func() {
+ for i := 1; i <= 5; i++ {
+ closeStream(protocol.StreamID(i))
+ }
+ err := m.DeleteClosedStreams()
+ Expect(err).ToNot(HaveOccurred())
+ Expect(m.streams).To(BeEmpty())
+ Expect(m.openStreams).To(BeEmpty())
+ Expect(m.numOutgoingStreams).To(BeZero())
+ Expect(m.numIncomingStreams).To(BeZero())
+ })
+ })
+
+ Context("as a client", func() {
+ BeforeEach(func() {
+ setNewStreamsMap(protocol.PerspectiveClient, versionGQUICFrames)
+ m.UpdateMaxStreamLimit(100)
+ for i := 1; i <= 5; i++ {
+ if i%2 == 0 {
+ _, err := m.openRemoteStream(protocol.StreamID(i))
+ Expect(err).ToNot(HaveOccurred())
+ } else {
+ _, err := m.OpenStream()
+ Expect(err).ToNot(HaveOccurred())
+ }
+ }
+ Expect(m.openStreams).To(Equal([]protocol.StreamID{3, 2, 5, 4, 7}))
+ Expect(m.numOutgoingStreams).To(BeEquivalentTo(3)) // 3, 5 and 7
+ Expect(m.numIncomingStreams).To(BeEquivalentTo(2)) // 2 and 4
+ })
+
+ It("removes a stream that we initiated", func() {
+ closeStream(3)
+ err := m.DeleteClosedStreams()
+ Expect(err).ToNot(HaveOccurred())
+ Expect(m.streams).To(HaveLen(4))
+ Expect(m.openStreams).To(Equal([]protocol.StreamID{2, 5, 4, 7}))
+ Expect(m.numOutgoingStreams).To(BeEquivalentTo(2))
+ Expect(m.numIncomingStreams).To(BeEquivalentTo(2))
+ })
+
+ It("removes a stream that the server initiated", func() {
+ closeStream(2)
+ err := m.DeleteClosedStreams()
+ Expect(err).ToNot(HaveOccurred())
+ Expect(m.openStreams).To(HaveLen(4))
+ Expect(m.openStreams).To(Equal([]protocol.StreamID{3, 5, 4, 7}))
+ Expect(m.numOutgoingStreams).To(BeEquivalentTo(3))
+ Expect(m.numIncomingStreams).To(BeEquivalentTo(1))
+ })
+
+ It("removes all streams", func() {
+ closeStream(3)
+ closeStream(2)
+ closeStream(5)
+ closeStream(4)
+ closeStream(7)
+ err := m.DeleteClosedStreams()
+ Expect(err).ToNot(HaveOccurred())
+ Expect(m.streams).To(BeEmpty())
+ Expect(m.openStreams).To(BeEmpty())
+ Expect(m.numOutgoingStreams).To(BeZero())
+ Expect(m.numIncomingStreams).To(BeZero())
+ })
})
})
- Context("Iterate", func() {
- // create 3 streams, ids 1 to 3
+ Context("Ranging", func() {
+ // create 5 streams, ids 4 to 8
+ var callbackCalledForStream []protocol.StreamID
+ callback := func(str streamI) {
+ callbackCalledForStream = append(callbackCalledForStream, str.StreamID())
+ sort.Slice(callbackCalledForStream, func(i, j int) bool { return callbackCalledForStream[i] < callbackCalledForStream[j] })
+ }
+
BeforeEach(func() {
- for i := 1; i <= 3; i++ {
+ callbackCalledForStream = callbackCalledForStream[:0]
+ for i := 4; i <= 8; i++ {
err := m.putStream(&stream{streamID: protocol.StreamID(i)})
Expect(err).NotTo(HaveOccurred())
}
})
- It("executes the lambda exactly once for every stream", func() {
- var numIterations int
- callbackCalled := make(map[protocol.StreamID]bool)
- fn := func(str *stream) (bool, error) {
- callbackCalled[str.StreamID()] = true
- numIterations++
- return true, nil
- }
- err := m.Iterate(fn)
- Expect(err).ToNot(HaveOccurred())
- Expect(callbackCalled).To(HaveKey(protocol.StreamID(1)))
- Expect(callbackCalled).To(HaveKey(protocol.StreamID(2)))
- Expect(callbackCalled).To(HaveKey(protocol.StreamID(3)))
- Expect(numIterations).To(Equal(3))
- })
-
- It("stops iterating when the callback returns false", func() {
- var numIterations int
- fn := func(str *stream) (bool, error) {
- numIterations++
- return false, nil
- }
- err := m.Iterate(fn)
- Expect(err).ToNot(HaveOccurred())
- // due to map access randomization, we don't know for which stream the callback was executed
- // but it must only be executed once
- Expect(numIterations).To(Equal(1))
- })
-
- It("returns the error, if the lambda returns one", func() {
- var numIterations int
- expectedError := errors.New("test")
- fn := func(str *stream) (bool, error) {
- numIterations++
- return true, expectedError
- }
- err := m.Iterate(fn)
- Expect(err).To(MatchError(expectedError))
- Expect(numIterations).To(Equal(1))
+ It("ranges over all open streams", func() {
+ m.Range(callback)
+ Expect(callbackCalledForStream).To(Equal([]protocol.StreamID{4, 5, 6, 7, 8}))
})
})
@@ -585,13 +698,13 @@ var _ = Describe("Streams Map", func() {
lambdaCalledForStream = lambdaCalledForStream[:0]
numIterations = 0
for i := 4; i <= 8; i++ {
- err := m.putStream(&stream{streamID: protocol.StreamID(i)})
+ err := m.putStream(newStream(protocol.StreamID(i)))
Expect(err).NotTo(HaveOccurred())
}
})
It("executes the lambda exactly once for every stream", func() {
- fn := func(str *stream) (bool, error) {
+ fn := func(str streamI) (bool, error) {
lambdaCalledForStream = append(lambdaCalledForStream, str.StreamID())
numIterations++
return true, nil
@@ -604,7 +717,7 @@ var _ = Describe("Streams Map", func() {
})
It("goes around once when starting in the middle", func() {
- fn := func(str *stream) (bool, error) {
+ fn := func(str streamI) (bool, error) {
lambdaCalledForStream = append(lambdaCalledForStream, str.StreamID())
numIterations++
return true, nil
@@ -614,11 +727,11 @@ var _ = Describe("Streams Map", func() {
Expect(err).ToNot(HaveOccurred())
Expect(numIterations).To(Equal(5))
Expect(lambdaCalledForStream).To(Equal([]protocol.StreamID{7, 8, 4, 5, 6}))
- Expect(m.roundRobinIndex).To(Equal(uint32(3)))
+ Expect(m.roundRobinIndex).To(BeEquivalentTo(3))
})
It("picks up at the index+1 where it last stopped", func() {
- fn := func(str *stream) (bool, error) {
+ fn := func(str streamI) (bool, error) {
lambdaCalledForStream = append(lambdaCalledForStream, str.StreamID())
numIterations++
if str.StreamID() == 5 {
@@ -630,10 +743,10 @@ var _ = Describe("Streams Map", func() {
Expect(err).ToNot(HaveOccurred())
Expect(numIterations).To(Equal(2))
Expect(lambdaCalledForStream).To(Equal([]protocol.StreamID{4, 5}))
- Expect(m.roundRobinIndex).To(Equal(uint32(2)))
+ Expect(m.roundRobinIndex).To(BeEquivalentTo(2))
numIterations = 0
lambdaCalledForStream = lambdaCalledForStream[:0]
- fn2 := func(str *stream) (bool, error) {
+ fn2 := func(str streamI) (bool, error) {
lambdaCalledForStream = append(lambdaCalledForStream, str.StreamID())
numIterations++
if str.StreamID() == 7 {
@@ -647,46 +760,38 @@ var _ = Describe("Streams Map", func() {
Expect(lambdaCalledForStream).To(Equal([]protocol.StreamID{6, 7}))
})
- It("adjust the RoundRobinIndex when deleting an element in front", func() {
- m.roundRobinIndex = 3 // stream 7
- m.RemoveStream(5)
- Expect(m.roundRobinIndex).To(Equal(uint32(2)))
- })
+ Context("adjusting the RoundRobinIndex when deleting streams", func() {
+ /*
+ Index: 0 1 2 3 4
+ StreamID: [ 4, 5, 6, 7, 8 ]
+ */
- It("doesn't adjust the RoundRobinIndex when deleting an element at the back", func() {
- m.roundRobinIndex = 1 // stream 5
- m.RemoveStream(7)
- Expect(m.roundRobinIndex).To(BeEquivalentTo(1))
- })
-
- It("doesn't adjust the RoundRobinIndex when deleting the element it is pointing to", func() {
- m.roundRobinIndex = 3 // stream 7
- m.RemoveStream(7)
- Expect(m.roundRobinIndex).To(Equal(uint32(3)))
- })
-
- Context("Prioritizing crypto- and header streams", func() {
- BeforeEach(func() {
- err := m.putStream(&stream{streamID: 1})
- Expect(err).NotTo(HaveOccurred())
- err = m.putStream(&stream{streamID: 3})
- Expect(err).NotTo(HaveOccurred())
+ It("adjusts when deleting an element in front", func() {
+ m.roundRobinIndex = 3 // stream 7
+ deleteStream(5)
+ Expect(m.roundRobinIndex).To(BeEquivalentTo(2))
})
- It("gets crypto- and header stream first, then picks up at the round-robin position", func() {
+ It("doesn't adjust when deleting an element at the back", func() {
+ m.roundRobinIndex = 1 // stream 5
+ deleteStream(7)
+ Expect(m.roundRobinIndex).To(BeEquivalentTo(1))
+ })
+
+ It("doesn't adjust when deleting the element it is pointing to", func() {
m.roundRobinIndex = 3 // stream 7
- fn := func(str *stream) (bool, error) {
- if numIterations >= 3 {
- return false, nil
- }
- lambdaCalledForStream = append(lambdaCalledForStream, str.StreamID())
- numIterations++
- return true, nil
- }
- err := m.RoundRobinIterate(fn)
+ deleteStream(7)
+ Expect(m.roundRobinIndex).To(BeEquivalentTo(3))
+ })
+
+ It("adjusts when deleting multiple elements", func() {
+ m.roundRobinIndex = 3 // stream 7
+ closeStream(5)
+ closeStream(6)
+ closeStream(8)
+ err := m.DeleteClosedStreams()
Expect(err).ToNot(HaveOccurred())
- Expect(numIterations).To(Equal(3))
- Expect(lambdaCalledForStream).To(Equal([]protocol.StreamID{1, 3, 7}))
+ Expect(m.roundRobinIndex).To(BeEquivalentTo(1))
})
})
})
diff --git a/vendor/github.com/lucas-clemente/quic-go/unpacked_packet.go b/vendor/github.com/lucas-clemente/quic-go/unpacked_packet.go
deleted file mode 100644
index 0636b8f..0000000
--- a/vendor/github.com/lucas-clemente/quic-go/unpacked_packet.go
+++ /dev/null
@@ -1,31 +0,0 @@
-package quic
-
-import (
- "github.com/lucas-clemente/quic-go/frames"
- "github.com/lucas-clemente/quic-go/protocol"
-)
-
-type unpackedPacket struct {
- encryptionLevel protocol.EncryptionLevel
- frames []frames.Frame
-}
-
-func (u *unpackedPacket) IsRetransmittable() bool {
- for _, f := range u.frames {
- switch f.(type) {
- case *frames.StreamFrame:
- return true
- case *frames.RstStreamFrame:
- return true
- case *frames.WindowUpdateFrame:
- return true
- case *frames.BlockedFrame:
- return true
- case *frames.PingFrame:
- return true
- case *frames.GoawayFrame:
- return true
- }
- }
- return false
-}
diff --git a/vendor/github.com/lucas-clemente/quic-go/unpacked_packet_test.go b/vendor/github.com/lucas-clemente/quic-go/unpacked_packet_test.go
deleted file mode 100644
index 82112a2..0000000
--- a/vendor/github.com/lucas-clemente/quic-go/unpacked_packet_test.go
+++ /dev/null
@@ -1,46 +0,0 @@
-package quic
-
-import (
- "github.com/lucas-clemente/quic-go/frames"
- . "github.com/onsi/ginkgo"
- . "github.com/onsi/gomega"
-)
-
-var _ = Describe("Unpacked packet", func() {
- var packet *unpackedPacket
- BeforeEach(func() {
- packet = &unpackedPacket{}
- })
-
- It("says that an empty packet is not retransmittable", func() {
- Expect(packet.IsRetransmittable()).To(BeFalse())
- })
-
- It("detects the frame types", func() {
- packet.frames = []frames.Frame{&frames.AckFrame{}}
- Expect(packet.IsRetransmittable()).To(BeFalse())
- packet.frames = []frames.Frame{&frames.BlockedFrame{}}
- Expect(packet.IsRetransmittable()).To(BeTrue())
- packet.frames = []frames.Frame{&frames.GoawayFrame{}}
- Expect(packet.IsRetransmittable()).To(BeTrue())
- packet.frames = []frames.Frame{&frames.PingFrame{}}
- Expect(packet.IsRetransmittable()).To(BeTrue())
- packet.frames = []frames.Frame{&frames.StreamFrame{}}
- Expect(packet.IsRetransmittable()).To(BeTrue())
- packet.frames = []frames.Frame{&frames.RstStreamFrame{}}
- Expect(packet.IsRetransmittable()).To(BeTrue())
- packet.frames = []frames.Frame{&frames.StopWaitingFrame{}}
- Expect(packet.IsRetransmittable()).To(BeFalse())
- packet.frames = []frames.Frame{&frames.WindowUpdateFrame{}}
- Expect(packet.IsRetransmittable()).To(BeTrue())
- })
-
- It("says that a packet is retransmittable if it contains one retransmittable frame", func() {
- packet.frames = []frames.Frame{
- &frames.AckFrame{},
- &frames.WindowUpdateFrame{},
- &frames.StopWaitingFrame{},
- }
- Expect(packet.IsRetransmittable()).To(BeTrue())
- })
-})
diff --git a/vendor/github.com/lucas-clemente/quic-go/utils/float16_test.go b/vendor/github.com/lucas-clemente/quic-go/utils/float16_test.go
deleted file mode 100644
index 8e3c26f..0000000
--- a/vendor/github.com/lucas-clemente/quic-go/utils/float16_test.go
+++ /dev/null
@@ -1,150 +0,0 @@
-package utils
-
-import (
- "bytes"
- "io"
-
- . "github.com/onsi/ginkgo"
- . "github.com/onsi/gomega"
-)
-
-var _ = Describe("float16", func() {
- It("reads", func() {
- testcases := []struct {
- expected uint64
- binary uint16
- }{
- // There are fewer decoding test cases because encoding truncates, and
- // decoding returns the smallest expansion.
- // Small numbers represent themselves.
- {0, 0},
- {1, 1},
- {2, 2},
- {3, 3},
- {4, 4},
- {5, 5},
- {6, 6},
- {7, 7},
- {15, 15},
- {31, 31},
- {42, 42},
- {123, 123},
- {1234, 1234},
- // Check transition through 2^11.
- {2046, 2046},
- {2047, 2047},
- {2048, 2048},
- {2049, 2049},
- // Running out of mantissa at 2^12.
- {4094, 4094},
- {4095, 4095},
- {4096, 4096},
- {4098, 4097},
- {4100, 4098},
- // Check transition through 2^13.
- {8190, 6143},
- {8192, 6144},
- {8196, 6145},
- // Half-way through the exponents.
- {0x7FF8000, 0x87FF},
- {0x8000000, 0x8800},
- {0xFFF0000, 0x8FFF},
- {0x10000000, 0x9000},
- // Transition into the largest exponent.
- {0x1FFE0000000, 0xF7FF},
- {0x20000000000, 0xF800},
- {0x20040000000, 0xF801},
- // Transition into the max value.
- {0x3FF80000000, 0xFFFE},
- {0x3FFC0000000, 0xFFFF},
- }
- for _, testcase := range testcases {
- b := &bytes.Buffer{}
- WriteUint16(b, testcase.binary)
- val, err := ReadUfloat16(b)
- Expect(err).NotTo(HaveOccurred())
- Expect(val).To(Equal(testcase.expected))
- }
- })
-
- It("errors on eof", func() {
- _, err := ReadUfloat16(&bytes.Buffer{})
- Expect(err).To(MatchError(io.EOF))
- })
-
- It("writes", func() {
- testcases := []struct {
- decoded uint64
- encoded uint16
- }{
- // Small numbers represent themselves.
- {0, 0},
- {1, 1},
- {2, 2},
- {3, 3},
- {4, 4},
- {5, 5},
- {6, 6},
- {7, 7},
- {15, 15},
- {31, 31},
- {42, 42},
- {123, 123},
- {1234, 1234},
- // Check transition through 2^11.
- {2046, 2046},
- {2047, 2047},
- {2048, 2048},
- {2049, 2049},
- // Running out of mantissa at 2^12.
- {4094, 4094},
- {4095, 4095},
- {4096, 4096},
- {4097, 4096},
- {4098, 4097},
- {4099, 4097},
- {4100, 4098},
- {4101, 4098},
- // Check transition through 2^13.
- {8190, 6143},
- {8191, 6143},
- {8192, 6144},
- {8193, 6144},
- {8194, 6144},
- {8195, 6144},
- {8196, 6145},
- {8197, 6145},
- // Half-way through the exponents.
- {0x7FF8000, 0x87FF},
- {0x7FFFFFF, 0x87FF},
- {0x8000000, 0x8800},
- {0xFFF0000, 0x8FFF},
- {0xFFFFFFF, 0x8FFF},
- {0x10000000, 0x9000},
- // Transition into the largest exponent.
- {0x1FFFFFFFFFE, 0xF7FF},
- {0x1FFFFFFFFFF, 0xF7FF},
- {0x20000000000, 0xF800},
- {0x20000000001, 0xF800},
- {0x2003FFFFFFE, 0xF800},
- {0x2003FFFFFFF, 0xF800},
- {0x20040000000, 0xF801},
- {0x20040000001, 0xF801},
- // Transition into the max value and clamping.
- {0x3FF80000000, 0xFFFE},
- {0x3FFBFFFFFFF, 0xFFFE},
- {0x3FFC0000000, 0xFFFF},
- {0x3FFC0000001, 0xFFFF},
- {0x3FFFFFFFFFF, 0xFFFF},
- {0x40000000000, 0xFFFF},
- {0xFFFFFFFFFFFFFFFF, 0xFFFF},
- }
- for _, testcase := range testcases {
- b := &bytes.Buffer{}
- WriteUfloat16(b, testcase.decoded)
- val, err := ReadUint16(b)
- Expect(err).NotTo(HaveOccurred())
- Expect(val).To(Equal(testcase.encoded))
- }
- })
-})
diff --git a/vendor/github.com/lucas-clemente/quic-go/utils/log.go b/vendor/github.com/lucas-clemente/quic-go/utils/log.go
deleted file mode 100644
index af2b6bd..0000000
--- a/vendor/github.com/lucas-clemente/quic-go/utils/log.go
+++ /dev/null
@@ -1,90 +0,0 @@
-package utils
-
-import (
- "fmt"
- "io"
- "os"
- "strconv"
- "sync"
-)
-
-// LogLevel of quic-go
-type LogLevel uint8
-
-const (
- logEnv = "QUIC_GO_LOG_LEVEL"
-
- // LogLevelDebug enables debug logs (e.g. packet contents)
- LogLevelDebug LogLevel = iota
- // LogLevelInfo enables info logs (e.g. packets)
- LogLevelInfo
- // LogLevelError enables err logs
- LogLevelError
- // LogLevelNothing disables
- LogLevelNothing
-)
-
-var (
- logLevel = LogLevelNothing
- out io.Writer = os.Stdout
-
- mutex sync.Mutex
-)
-
-// SetLogWriter sets the log writer.
-func SetLogWriter(w io.Writer) {
- out = w
-}
-
-// SetLogLevel sets the log level
-func SetLogLevel(level LogLevel) {
- logLevel = level
-}
-
-// Debugf logs something
-func Debugf(format string, args ...interface{}) {
- if logLevel == LogLevelDebug {
- mutex.Lock()
- fmt.Fprintf(out, format+"\n", args...)
- mutex.Unlock()
- }
-}
-
-// Infof logs something
-func Infof(format string, args ...interface{}) {
- if logLevel <= LogLevelInfo {
- mutex.Lock()
- fmt.Fprintf(out, format+"\n", args...)
- mutex.Unlock()
- }
-}
-
-// Errorf logs something
-func Errorf(format string, args ...interface{}) {
- if logLevel <= LogLevelError {
- mutex.Lock()
- fmt.Fprintf(out, format+"\n", args...)
- mutex.Unlock()
- }
-}
-
-// Debug returns true if the log level is LogLevelDebug
-func Debug() bool {
- return logLevel == LogLevelDebug
-}
-
-func init() {
- readLoggingEnv()
-}
-
-func readLoggingEnv() {
- env := os.Getenv(logEnv)
- if env == "" {
- return
- }
- level, err := strconv.Atoi(env)
- if err != nil {
- return
- }
- logLevel = LogLevel(level)
-}
diff --git a/vendor/github.com/lucas-clemente/quic-go/utils/log_test.go b/vendor/github.com/lucas-clemente/quic-go/utils/log_test.go
deleted file mode 100644
index 5d29999..0000000
--- a/vendor/github.com/lucas-clemente/quic-go/utils/log_test.go
+++ /dev/null
@@ -1,80 +0,0 @@
-package utils
-
-import (
- "bytes"
- "os"
-
- . "github.com/onsi/ginkgo"
- . "github.com/onsi/gomega"
-)
-
-var _ = Describe("Log", func() {
- var (
- b *bytes.Buffer
- )
-
- BeforeEach(func() {
- b = bytes.NewBuffer([]byte{})
- out = b
- })
-
- AfterEach(func() {
- out = os.Stdout
- SetLogLevel(LogLevelNothing)
- })
-
- It("log level nothing", func() {
- SetLogLevel(LogLevelNothing)
- Debugf("debug")
- Infof("info")
- Errorf("err")
- Expect(b.Bytes()).To(Equal([]byte("")))
- })
-
- It("log level err", func() {
- SetLogLevel(LogLevelError)
- Debugf("debug")
- Infof("info")
- Errorf("err")
- Expect(b.Bytes()).To(Equal([]byte("err\n")))
- })
-
- It("log level info", func() {
- SetLogLevel(LogLevelInfo)
- Debugf("debug")
- Infof("info")
- Errorf("err")
- Expect(b.Bytes()).To(Equal([]byte("info\nerr\n")))
- })
-
- It("log level debug", func() {
- SetLogLevel(LogLevelDebug)
- Debugf("debug")
- Infof("info")
- Errorf("err")
- Expect(b.Bytes()).To(Equal([]byte("debug\ninfo\nerr\n")))
- })
-
- It("says whether debug is enabled", func() {
- Expect(Debug()).To(BeFalse())
- SetLogLevel(LogLevelDebug)
- Expect(Debug()).To(BeTrue())
- })
-
- It("reads log level from env", func() {
- Expect(logLevel).To(Equal(LogLevelNothing))
- os.Setenv(logEnv, "1")
- readLoggingEnv()
- Expect(logLevel).To(Equal(LogLevelDebug))
- })
-
- It("does not error reading invalid log levels from env", func() {
- Expect(logLevel).To(Equal(LogLevelNothing))
- os.Setenv(logEnv, "")
- readLoggingEnv()
- Expect(logLevel).To(Equal(LogLevelNothing))
- os.Setenv(logEnv, "asdf")
- readLoggingEnv()
- Expect(logLevel).To(Equal(LogLevelNothing))
- })
-})
diff --git a/vendor/github.com/magefile/mage/.gitignore b/vendor/github.com/magefile/mage/.gitignore
index 31bacd2..bdd09ea 100644
--- a/vendor/github.com/magefile/mage/.gitignore
+++ b/vendor/github.com/magefile/mage/.gitignore
@@ -13,8 +13,11 @@
# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736
.glide/
+# Magefile output
+mage_output_file.go
+
# VScode
.vscode
# stupid osx
-.DS_Store
\ No newline at end of file
+.DS_Store
diff --git a/vendor/github.com/magefile/mage/.goreleaser.yml b/vendor/github.com/magefile/mage/.goreleaser.yml
new file mode 100644
index 0000000..1f7ba27
--- /dev/null
+++ b/vendor/github.com/magefile/mage/.goreleaser.yml
@@ -0,0 +1,53 @@
+project_name: mage
+release:
+ github:
+ owner: magefile
+ name: mage
+ draft: true
+build:
+ binary: mage
+ main: .
+ ldflags: -s -w -X github.com/magefile/mage/mage.timestamp={{.Date}} -X github.com/magefile/mage/mage.commitHash={{.Commit}} -X github.com/magefile/mage/mage.gitTag={{.Version}}
+ goos:
+ - darwin
+ - linux
+ - windows
+ - freebsd
+ - netbsd
+ - openbsd
+ - dragonfly
+ goarch:
+ - amd64
+ - 386
+ - arm
+ - arm64
+ ignore:
+ - goos: openbsd
+ goarch: arm
+ goarm: 6
+ env:
+ - CGO_ENABLED=0
+archive:
+ name_template: "{{.Binary}}_{{.Version}}_{{.Os}}-{{.Arch}}"
+ replacements:
+ amd64: 64bit
+ 386: 32bit
+ arm: ARM
+ arm64: ARM64
+ darwin: macOS
+ linux: Linux
+ windows: Windows
+ openbsd: OpenBSD
+ netbsd: NetBSD
+ freebsd: FreeBSD
+ dragonfly: DragonFlyBSD
+ format: tar.gz
+ format_overrides:
+ - goos: windows
+ format: zip
+ files:
+ - LICENSE
+snapshot:
+ name_template: SNAPSHOT-{{ .Commit }}
+checksum:
+ name_template: '{{ .ProjectName }}_{{ .Version }}_checksums.txt'
diff --git a/vendor/github.com/magefile/mage/.travis.yml b/vendor/github.com/magefile/mage/.travis.yml
index 2ceffac..7b97c25 100644
--- a/vendor/github.com/magefile/mage/.travis.yml
+++ b/vendor/github.com/magefile/mage/.travis.yml
@@ -8,9 +8,9 @@ branches:
# In theory, older versions would probably work fine, but since this isn't a
# library, I'm not going to worry about older versions for now.
go:
- - 1.9
- - 1.8
- - 1.7
+ - 1.9.x
+ - 1.8.x
+ - 1.7.x
# don't call go get ./... because this hides when deps are
# not packaged into the vendor directory.
@@ -18,11 +18,4 @@ install: true
# don't call go test -v because we want to be able to only show t.Log output when
# a test fails
-script: go test -race $(go list ./... | grep -v /vendor/)
-
-# run a test for every major OS
-env:
- - GOOS=linux
- - GOOS=windows
- - GOOS=darwin
-
\ No newline at end of file
+script: go test -tags CI -race $(go list ./... | grep -v /vendor/)
\ No newline at end of file
diff --git a/vendor/github.com/magefile/mage/CONTRIBUTING.md b/vendor/github.com/magefile/mage/CONTRIBUTING.md
index 1c929d6..e1394d2 100644
--- a/vendor/github.com/magefile/mage/CONTRIBUTING.md
+++ b/vendor/github.com/magefile/mage/CONTRIBUTING.md
@@ -22,15 +22,16 @@ or other trivial change.
## Dependency Management
-Currently mage has no dependencies(!). Let's try to keep it that way. Since
-it's likely that mage will be vendored into a project, adding dependencies to
-mage adds dependencies to every project that uses mage.
+Currently mage has no dependencies(!) outside the standard libary. Let's keep
+it that way. Since it's likely that mage will be vendored into a project,
+adding dependencies to mage adds dependencies to every project that uses mage.
## Versions
-Please try to avoid using features of go and the stdlib that prevent mage from
-being buildable with old versions of Go. Definitely avoid anything that
-requires go 1.9.
+Please avoid using features of go and the stdlib that prevent mage from being
+buildable with older versions of Go. The CI tests currently check that mage is
+buildable with go 1.7 and later. You may build with whatever version you like,
+but CI has the final say.
## Testing
diff --git a/vendor/github.com/magefile/mage/README.md b/vendor/github.com/magefile/mage/README.md
index f3e0f43..63826bb 100644
--- a/vendor/github.com/magefile/mage/README.md
+++ b/vendor/github.com/magefile/mage/README.md
@@ -1,9 +1,35 @@
-mage
-
+
-Mage is a make/rake-like build tool using Go.
+## About [![Build Status](https://travis-ci.org/magefile/mage.svg?branch=master)](https://travis-ci.org/magefile/mage)
-[![Build Status](https://travis-ci.org/magefile/mage.svg?branch=master)](https://travis-ci.org/magefile/mage)
+Mage is a make/rake-like build tool using Go. You write plain-old go functions,
+and Mage automatically uses them as Makefile-like runnable targets.
+
+## Installation
+
+Mage has no dependencies outside the Go standard library, and builds with Go 1.7
+and above (possibly even lower versions, but they're not regularly tested).
+
+Install mage by running
+
+```
+go get -u -d github.com/magefile/mage
+cd $GOPATH/src/github.com/magefile/mage
+go run bootstrap.go
+```
+
+This will download the code into your GOPATH, and then run the bootstrap script
+to build mage with version infomation embedded in it. A normal `go get`
+(without -d) will build the binary correctly, but no version info will be
+embedded. If you've done this, no worries, just go to
+$GOPATH/src/github.com/magefile/mage and run `mage install` or `go run
+bootstrap.go` and a new binary will be created with the correct version
+information.
+
+The mage binary will be created in your $GOPATH/bin directory.
+
+You may also install a binary release from our
+[releases](https://github.com/magefile/mage/releases) page.
## Demo
diff --git a/vendor/github.com/magefile/mage/bootstrap.go b/vendor/github.com/magefile/mage/bootstrap.go
new file mode 100644
index 0000000..c37f6fc
--- /dev/null
+++ b/vendor/github.com/magefile/mage/bootstrap.go
@@ -0,0 +1,19 @@
+//+build ignore
+
+package main
+
+import (
+ "os"
+
+ "github.com/magefile/mage/mage"
+)
+
+// This is a bootstrap builder, to build mage when you don't already *have* mage.
+// Run it like
+// go run bootstrap.go
+// and it will install mage with all the right flags created for you.
+
+func main() {
+ os.Args = []string{os.Args[0], "-v", "install"}
+ os.Exit(mage.Main())
+}
diff --git a/vendor/github.com/magefile/mage/install_test.go b/vendor/github.com/magefile/mage/install_test.go
new file mode 100644
index 0000000..d21ad59
--- /dev/null
+++ b/vendor/github.com/magefile/mage/install_test.go
@@ -0,0 +1,31 @@
+//+build CI
+
+package main
+
+import (
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "runtime"
+ "testing"
+)
+
+func TestBootstrap(t *testing.T) {
+ dir, err := ioutil.TempDir("", "")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(dir)
+
+ s, err := run("go", "run", "bootstrap.go")
+ if err != nil {
+ t.Fatal(s)
+ }
+ name := "mage"
+ if runtime.GOOS == "windows" {
+ name += ".exe"
+ }
+ if _, err := os.Stat(filepath.Join(os.Getenv("GOPATH"), "bin", name)); err != nil {
+ t.Fatal(err)
+ }
+}
diff --git a/vendor/github.com/magefile/mage/magefile.go b/vendor/github.com/magefile/mage/magefile.go
index 591716e..2bb3ace 100644
--- a/vendor/github.com/magefile/mage/magefile.go
+++ b/vendor/github.com/magefile/mage/magefile.go
@@ -3,50 +3,72 @@
package main
import (
- "bytes"
+ "errors"
"fmt"
- "log"
+ "os"
+ "path/filepath"
+ "runtime"
+ "strings"
"time"
"github.com/magefile/mage/sh"
)
-// Runs go install for mage. This generates the the version
-// info the binary.
-func Build() error {
+// Runs "go install" for mage. This generates the version info the binary.
+func Install() error {
ldf, err := flags()
if err != nil {
return err
}
- return sh.Run("go", "install", "-ldflags="+ldf, "github.com/magefile/mage")
+ name := "mage"
+ if runtime.GOOS == "windows" {
+ name += ".exe"
+ }
+ gopath, err := sh.Output("go", "env", "GOPATH")
+ if err != nil {
+ return fmt.Errorf("can't determine GOPATH: %v", err)
+ }
+ paths := strings.Split(gopath, string([]rune{os.PathListSeparator}))
+ bin := filepath.Join(paths[0], "bin")
+ // specifically don't mkdirall, if you have an invalid gopath in the first
+ // place, that's not on us to fix.
+ if err := os.Mkdir(bin, 0700); err != nil && !os.IsExist(err) {
+ return fmt.Errorf("failed to create %q: %v", bin, err)
+ }
+ path := filepath.Join(bin, name)
+
+ // we use go build here because if someone built with go get, then `go
+ // install` turns into a no-op, and `go install -a` fails on people's
+ // machines that have go installed in a non-writeable directory (such as
+ // normal OS installs in /usr/bin)
+ return sh.RunV("go", "build", "-o", path, "-ldflags="+ldf, "github.com/magefile/mage")
}
-// Generates binaries for all supported platforms. Currently that means a
-// combination of windows, linux, and OSX in 32 bit and 64 bit formats. The
-// files will be dumped in the local directory with names according to their
-// supported platform.
-func BuildAll() error {
- ldf, err := flags()
- if err != nil {
+// Generates a new release. Expects the TAG environment variable to be set,
+// which will create a new tag with that name.
+func Release() (err error) {
+ if os.Getenv("TAG") == "" {
+ return errors.New("MSG and TAG environment variables are required")
+ }
+ if err := sh.RunV("git", "tag", "-a", "$TAG"); err != nil {
return err
}
- var ext string
- for _, OS := range []string{"windows", "darwin", "linux"} {
- if OS == "windows" {
- ext = ".exe"
- } else {
- ext = ""
- }
- for _, ARCH := range []string{"amd64", "386"} {
- log.Printf("running go build for GOOS=%s GOARCH=%s", OS, ARCH)
- env := map[string]string{"GOOS": OS, "GOARCH": ARCH}
- if err := sh.RunWith(env, "go", "build", "-o", "mage_"+OS+"_"+ARCH+ext, "--ldflags="+ldf); err != nil {
- return err
- }
- }
+ if err := sh.RunV("git", "push", "origin", "$TAG"); err != nil {
+ return err
}
- return err
+ defer func() {
+ if err != nil {
+ sh.RunV("git", "tag", "--delete", "$TAG")
+ sh.RunV("git", "push", "--delete", "origin", "$TAG")
+ }
+ }()
+ return sh.RunV("goreleaser")
+}
+
+// Remove the temporarily generated files from Release.
+func Clean() error {
+ return sh.Rm("dist")
}
func flags() (string, error) {
@@ -61,9 +83,8 @@ func flags() (string, error) {
// tag returns the git tag for the current branch or "" if none.
func tag() string {
- buf := &bytes.Buffer{}
- _, _ = sh.Exec(nil, buf, nil, "git", "describe", "--tags")
- return buf.String()
+ s, _ := sh.Output("git", "describe", "--tags")
+ return s
}
// hash returns the git hash for the current repo or "" if none.
diff --git a/vendor/github.com/magefile/mage/mg/deps.go b/vendor/github.com/magefile/mage/mg/deps.go
index 4284c23..30d6edc 100644
--- a/vendor/github.com/magefile/mage/mg/deps.go
+++ b/vendor/github.com/magefile/mage/mg/deps.go
@@ -1,11 +1,14 @@
package mg
import (
+ "context"
"fmt"
"reflect"
"runtime"
"strings"
"sync"
+
+ "github.com/magefile/mage/types"
)
type onceMap struct {
@@ -30,26 +33,47 @@ var onces = &onceMap{
m: map[string]*onceFun{},
}
-// Deps runs the given functions as dependencies of the calling function.
-// Dependencies must only be func() or func() error. The function calling Deps
-// is guaranteed that all dependent functions will be run exactly once when Deps
-// returns. Dependent functions may in turn declare their own dependencies
-// using Deps. Each dependency is run in their own goroutines.
-func Deps(fns ...interface{}) {
+// SerialDeps is like Deps except it runs each dependency serially, instead of
+// in parallel. This can be useful for resource intensive dependencies that
+// shouldn't be run at the same time.
+func SerialDeps(fns ...interface{}) {
+ checkFns(fns)
+ ctx := context.Background()
for _, f := range fns {
- switch f.(type) {
- case func(), func() error:
- // ok
- default:
- panic(fmt.Errorf("Invalid type for dependent function: %T. Dependencies must be func() or func() error", f))
- }
+ runDeps(ctx, f)
}
+}
+
+// SerialCtxDeps is like CtxDeps except it runs each dependency serially,
+// instead of in parallel. This can be useful for resource intensive
+// dependencies that shouldn't be run at the same time.
+func SerialCtxDeps(ctx context.Context, fns ...interface{}) {
+ checkFns(fns)
+ for _, f := range fns {
+ runDeps(ctx, f)
+ }
+}
+
+// CtxDeps runs the given functions as dependencies of the calling function.
+// Dependencies must only be of type: github.com/magefile/mage/types.FuncType.
+// The function calling Deps is guaranteed that all dependent functions will be
+// run exactly once when Deps returns. Dependent functions may in turn declare
+// their own dependencies using Deps. Each dependency is run in their own
+// goroutines. Each function is given the context provided if the function
+// prototype allows for it.
+func CtxDeps(ctx context.Context, fns ...interface{}) {
+ checkFns(fns)
+ runDeps(ctx, fns...)
+}
+
+// runDeps assumes you've already called checkFns.
+func runDeps(ctx context.Context, fns ...interface{}) {
mu := &sync.Mutex{}
var errs []string
var exit int
wg := &sync.WaitGroup{}
for _, f := range fns {
- fn := addDep(f)
+ fn := addDep(ctx, f)
wg.Add(1)
go func() {
defer func() {
@@ -80,6 +104,19 @@ func Deps(fns ...interface{}) {
}
}
+func checkFns(fns []interface{}) {
+ for _, f := range fns {
+ if err := types.FuncCheck(f); err != nil {
+ panic(err)
+ }
+ }
+}
+
+// Deps runs the given functions with the default runtime context
+func Deps(fns ...interface{}) {
+ CtxDeps(context.Background(), fns...)
+}
+
func changeExit(old, new int) int {
if new == 0 {
return old
@@ -95,18 +132,17 @@ func changeExit(old, new int) int {
return 1
}
-func addDep(f interface{}) *onceFun {
- var fn func() error
- switch f := f.(type) {
- case func():
- fn = func() error { f(); return nil }
- case func() error:
- fn = f
+func addDep(ctx context.Context, f interface{}) *onceFun {
+ var fn func(context.Context) error
+ if fn = types.FuncTypeWrap(f); fn == nil {
+ // should be impossible, since we already checked this
+ panic("attempted to add a dep that did not match required type")
}
n := name(f)
of := onces.LoadOrStore(n, &onceFun{
- fn: fn,
+ fn: fn,
+ ctx: ctx,
})
return of
}
@@ -117,13 +153,14 @@ func name(i interface{}) string {
type onceFun struct {
once sync.Once
- fn func() error
+ fn func(context.Context) error
+ ctx context.Context
}
func (o *onceFun) run() error {
var err error
o.once.Do(func() {
- err = o.fn()
+ err = o.fn(o.ctx)
})
return err
}
diff --git a/vendor/github.com/magefile/mage/mg/deps_test.go b/vendor/github.com/magefile/mage/mg/deps_test.go
index 0c4ea46..ea894bb 100644
--- a/vendor/github.com/magefile/mage/mg/deps_test.go
+++ b/vendor/github.com/magefile/mage/mg/deps_test.go
@@ -127,3 +127,21 @@ func TestDepTwoFatal(t *testing.T) {
}()
mg.Deps(f, g)
}
+
+func TestDepWithUnhandledFunc(t *testing.T) {
+ defer func() {
+ err := recover()
+ expected := "Invalid type for dependent function: func(string) string. Dependencies must be func(), func() error, func(context.Context) or func(context.Context) error"
+ actual, ok := err.(error)
+ if !ok {
+ t.Fatalf("Expected type string from panic")
+ }
+ if actual.Error() != expected {
+ t.Fatalf("Expected panic %v but got %v", expected, err)
+ }
+ }()
+ var NotValid func(string) string = func(a string) string {
+ return a
+ }
+ mg.Deps(NotValid)
+}
diff --git a/vendor/github.com/magefile/mage/types/funcs.go b/vendor/github.com/magefile/mage/types/funcs.go
new file mode 100644
index 0000000..9e2e133
--- /dev/null
+++ b/vendor/github.com/magefile/mage/types/funcs.go
@@ -0,0 +1,58 @@
+package types
+
+import (
+ "context"
+ "fmt"
+)
+
+// FuncType indicates a prototype of build job function
+type FuncType int
+
+// FuncTypes
+const (
+ InvalidType FuncType = iota
+ VoidType
+ ErrorType
+ ContextVoidType
+ ContextErrorType
+)
+
+// FuncCheck tests if a function is one of FuncType
+func FuncCheck(fn interface{}) error {
+ switch fn.(type) {
+ case func():
+ return nil
+ case func() error:
+ return nil
+ case func(context.Context):
+ return nil
+ case func(context.Context) error:
+ return nil
+ }
+ return fmt.Errorf("Invalid type for dependent function: %T. Dependencies must be func(), func() error, func(context.Context) or func(context.Context) error", fn)
+}
+
+// FuncTypeWrap wraps a valid FuncType to FuncContextError
+func FuncTypeWrap(fn interface{}) func(context.Context) error {
+ if FuncCheck(fn) == nil {
+ switch f := fn.(type) {
+ case func():
+ return func(context.Context) error {
+ f()
+ return nil
+ }
+ case func() error:
+ return func(context.Context) error {
+ return f()
+ }
+ case func(context.Context):
+ return func(ctx context.Context) error {
+ f(ctx)
+ return nil
+ }
+ case func(context.Context) error:
+ return f
+ }
+ }
+ return nil
+}
diff --git a/vendor/github.com/magefile/mage/types/funcs_test.go b/vendor/github.com/magefile/mage/types/funcs_test.go
new file mode 100644
index 0000000..efb7e61
--- /dev/null
+++ b/vendor/github.com/magefile/mage/types/funcs_test.go
@@ -0,0 +1,48 @@
+package types
+
+import (
+ "context"
+ "testing"
+)
+
+func TestFuncCheck(t *testing.T) {
+ if FuncCheck(func() {}) != nil {
+ t.Errorf("expected func() to be a valid FuncType")
+ }
+ if FuncCheck(func() error { return nil }) != nil {
+ t.Errorf("expected func() error to be a valid FuncType")
+ }
+ if FuncCheck(func(context.Context) {}) != nil {
+ t.Errorf("expected func(context.Context) to be a valid FuncType")
+ }
+ if FuncCheck(func(context.Context) error { return nil }) != nil {
+ t.Errorf("expected func(context.Context) error to be a valid FuncType")
+ }
+
+ // Test the Invalid case
+ if err := FuncCheck(func(int) error { return nil }); err == nil {
+ t.Errorf("expected func(int) error to not be a valid FuncType\n\tgot error: %v", err)
+ }
+}
+
+func TestFuncTypeWrap(t *testing.T) {
+ if FuncTypeWrap(func(i int) {}) != nil {
+ t.Errorf("expected func(int) to return nil")
+ }
+
+ if FuncTypeWrap(func() {}) == nil {
+ t.Errorf("expected func() to return a function")
+ }
+
+ if FuncTypeWrap(func() error { return nil }) == nil {
+ t.Errorf("expected func() error to return a function")
+ }
+
+ if FuncTypeWrap(func(context.Context) {}) == nil {
+ t.Errorf("expected func(context.Context) to return a function")
+ }
+
+ if FuncTypeWrap(func(context.Context) error { return nil }) == nil {
+ t.Errorf("expected func(context.Context) error to return a function")
+ }
+}
diff --git a/vendor/github.com/olekukonko/tablewriter/README.md b/vendor/github.com/olekukonko/tablewriter/README.md
index 4e706a5..e9665d2 100644
--- a/vendor/github.com/olekukonko/tablewriter/README.md
+++ b/vendor/github.com/olekukonko/tablewriter/README.md
@@ -199,10 +199,10 @@ table.Render()
#### Table with color
```go
data := [][]string{
- []string{"1/1/2014", "Domain name", "2233", "$10.98"},
- []string{"1/1/2014", "January Hosting", "2233", "$54.95"},
- []string{"1/4/2014", "February Hosting", "2233", "$51.00"},
- []string{"1/4/2014", "February Extra Bandwidth", "2233", "$30.00"},
+ []string{"1/1/2014", "Domain name", "2233", "$10.98"},
+ []string{"1/1/2014", "January Hosting", "2233", "$54.95"},
+ []string{"1/4/2014", "February Hosting", "2233", "$51.00"},
+ []string{"1/4/2014", "February Extra Bandwidth", "2233", "$30.00"},
}
table := tablewriter.NewWriter(os.Stdout)
@@ -210,19 +210,19 @@ table.SetHeader([]string{"Date", "Description", "CV2", "Amount"})
table.SetFooter([]string{"", "", "Total", "$146.93"}) // Add Footer
table.SetBorder(false) // Set Border to false
-table.SetHeaderAttributes(tablewriter.Add(tablewriter.Bold, tablewriter.BgGreenColor),
- tablewriter.Add(tablewriter.FgHiRedColor, tablewriter.Bold, tablewriter.BgBlackColor),
- tablewriter.Add(tablewriter.BgRedColor, tablewriter.FgWhiteColor),
- tablewriter.Add(tablewriter.BgCyanColor, tablewriter.FgWhiteColor))
+table.SetHeaderColor(tablewriter.Colors{tablewriter.Bold, tablewriter.BgGreenColor},
+ tablewriter.Colors{tablewriter.FgHiRedColor, tablewriter.Bold, tablewriter.BgBlackColor},
+ tablewriter.Colors{tablewriter.BgRedColor, tablewriter.FgWhiteColor},
+ tablewriter.Colors{tablewriter.BgCyanColor, tablewriter.FgWhiteColor})
-table.SetColumnAttributes(tablewriter.Add(tablewriter.Bold, tablewriter.FgHiBlackColor),
- tablewriter.Add(tablewriter.Bold, tablewriter.FgHiRedColor),
- tablewriter.Add(tablewriter.Bold, tablewriter.FgHiBlackColor),
- tablewriter.Add(tablewriter.Bold, tablewriter.FgBlackColor))
+table.SetColumnColor(tablewriter.Colors{tablewriter.Bold, tablewriter.FgHiBlackColor},
+ tablewriter.Colors{tablewriter.Bold, tablewriter.FgHiRedColor},
+ tablewriter.Colors{tablewriter.Bold, tablewriter.FgHiBlackColor},
+ tablewriter.Colors{tablewriter.Bold, tablewriter.FgBlackColor})
-table.SetFooterAttributes(tablewriter.Add(), tablewriter.Add(),
- tablewriter.Add(tablewriter.Bold),
- tablewriter.Add(tablewriter.FgHiRedColor))
+table.SetFooterColor(tablewriter.Colors{}, tablewriter.Colors{},
+ tablewriter.Colors{tablewriter.Bold},
+ tablewriter.Colors{tablewriter.FgHiRedColor})
table.AppendBulk(data)
table.Render()
diff --git a/vendor/github.com/templexxx/reedsolomon/.travis.yml b/vendor/github.com/templexxx/reedsolomon/.travis.yml
deleted file mode 100644
index 68d0d75..0000000
--- a/vendor/github.com/templexxx/reedsolomon/.travis.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-language: go
-go:
- - 1.9
-
-install:
- - go get github.com/templexxx/reedsolomon
-
-script:
- - go test -v
diff --git a/vendor/github.com/templexxx/reedsolomon/README.md b/vendor/github.com/templexxx/reedsolomon/README.md
deleted file mode 100644
index a21ba2f..0000000
--- a/vendor/github.com/templexxx/reedsolomon/README.md
+++ /dev/null
@@ -1,108 +0,0 @@
-# Reed-Solomon
-
-[![GoDoc][1]][2] [![MIT licensed][3]][4] [![Build Status][5]][6] [![Go Report Card][7]][8]
-
-[1]: https://godoc.org/github.com/templexxx/reedsolomon?status.svg
-[2]: https://godoc.org/github.com/templexxx/reedsolomon
-[3]: https://img.shields.io/badge/license-MIT-blue.svg
-[4]: LICENSE
-[5]: https://travis-ci.org/templexxx/reedsolomon.svg?branch=master
-[6]: https://travis-ci.org/templexxx/reedsolomon
-[7]: https://goreportcard.com/badge/github.com/templexxx/reedsolomon
-[8]: https://goreportcard.com/report/github.com/templexxx/reedsolomon
-
-
-## Introduction:
-1. Reed-Solomon Erasure Code engine in pure Go.
-2. Super Fast: more than 10GB/s per physics core ( 10+4, 4KB per vector, Macbook Pro 2.8 GHz Intel Core i7 )
-
-## Installation
-To get the package use the standard:
-```bash
-go get github.com/templexxx/reedsolomon
-```
-
-## Documentation
-See the associated [GoDoc](http://godoc.org/github.com/templexxx/reedsolomon)
-
-## Specification
-### GOARCH
-1. All arch are supported
-2. 0.1.0 need go1.9 for sync.Map in AMD64
-
-### Math
-1. Coding over in GF(2^8)
-2. Primitive Polynomial: x^8 + x^4 + x^3 + x^2 + 1 (0x1d)
-3. mathtool/gentbls.go : generator Primitive Polynomial and it's log table, exp table, multiply table, inverse table etc. We can get more info about how galois field work
-4. mathtool/cntinverse.go : calculate how many inverse matrix will have in different RS codes config
-5. Both of Cauchy and Vandermonde Matrix are supported. Vandermonde need more operations for preserving the property that any square subset of rows is invertible
-
-### Why so fast?
-These three parts will cost too much time:
-
-1. lookup galois-field tables
-2. read/write memory
-3. calculate inverse matrix in the reconstruct process
-
-SIMD will solve no.1
-
-Cache-friendly codes will help to solve no.2 & no.3, and more, use a sync.Map for cache inverse matrix, it will help to save about 1000ns when we need same matrix.
-
-## Performance
-
-Performance depends mainly on:
-
-1. CPU instruction extension( AVX2 or SSSE3 or none )
-2. number of data/parity vects
-3. unit size of calculation ( see it in rs_amd64.go )
-4. size of shards
-5. speed of memory (waste so much time on read/write mem, :D )
-6. performance of CPU
-7. the way of using ( reuse memory)
-
-And we must know the benchmark test is quite different with encoding/decoding in practice.
-
-Because in benchmark test loops, the CPU Cache will help a lot. In practice, we must reuse the memory to make the performance become as good as the benchmark test.
-
-Example of performance on my MacBook 2017 i7 2.8GHz. 10+4 (with 0.1.0).
-
-### Encoding:
-
-| Vector size | Speed (MB/S) |
-|----------------|--------------|
-| 1400B | 7655.02 |
-| 4KB | 10551.37 |
-| 64KB | 9297.25 |
-| 1MB | 6829.89 |
-| 16MB | 6312.83 |
-
-### Reconstruct (use nil to point which one need repair):
-
-| Vector size | Speed (MB/S) |
-|----------------|--------------|
-| 1400B | 4124.85 |
-| 4KB | 5715.45 |
-| 64KB | 6050.06 |
-| 1MB | 5001.21 |
-| 16MB | 5043.04 |
-
-### ReconstructWithPos (use a position list to point which one need repair, reuse the memory):
-
-| Vector size | Speed (MB/S) |
-|----------------|--------------|
-| 1400B | 6170.24 |
-| 4KB | 9444.86 |
-| 64KB | 9311.30 |
-| 1MB | 6781.06 |
-| 16MB | 6285.34 |
-
-**reconstruct benchmark tests here run with inverse matrix cache, if there is no cache, it will cost more time( about 1000ns)**
-
-## Who is using this?
-
-1. https://github.com/xtaci/kcp-go -- A Production-Grade Reliable-UDP Library for golang
-
-## Links & Thanks
-* [Klauspost ReedSolomon](https://github.com/klauspost/reedsolomon)
-* [intel ISA-L](https://github.com/01org/isa-l)
-* [GF SIMD] (http://www.ssrc.ucsc.edu/papers/plank-fast13.pdf)
diff --git a/vendor/github.com/templexxx/reedsolomon/matrix.go b/vendor/github.com/templexxx/reedsolomon/matrix.go
deleted file mode 100644
index 019328c..0000000
--- a/vendor/github.com/templexxx/reedsolomon/matrix.go
+++ /dev/null
@@ -1,156 +0,0 @@
-package reedsolomon
-
-import "errors"
-
-type matrix []byte
-
-func genEncMatrixCauchy(d, p int) matrix {
- t := d + p
- m := make([]byte, t*d)
- for i := 0; i < d; i++ {
- m[i*d+i] = byte(1)
- }
-
- d2 := d * d
- for i := d; i < t; i++ {
- for j := 0; j < d; j++ {
- d := i ^ j
- a := inverseTbl[d]
- m[d2] = byte(a)
- d2++
- }
- }
- return m
-}
-
-func gfExp(b byte, n int) byte {
- if n == 0 {
- return 1
- }
- if b == 0 {
- return 0
- }
- a := logTbl[b]
- ret := int(a) * n
- for ret >= 255 {
- ret -= 255
- }
- return byte(expTbl[ret])
-}
-
-func genVandMatrix(vm []byte, t, d int) {
- for i := 0; i < t; i++ {
- for j := 0; j < d; j++ {
- vm[i*d+j] = gfExp(byte(i), j)
- }
- }
-}
-
-func (m matrix) mul(right matrix, rows, cols int, r []byte) {
- for i := 0; i < rows; i++ {
- for j := 0; j < cols; j++ {
- var v byte
- for k := 0; k < cols; k++ {
- v ^= gfMul(m[i*cols+k], right[k*cols+j])
- }
- r[i*cols+j] = v
- }
- }
-}
-
-func genEncMatrixVand(d, p int) (matrix, error) {
- t := d + p
- buf := make([]byte, (2*t+4*d)*d)
- vm := buf[:t*d]
- genVandMatrix(vm, t, d)
- top := buf[t*d : (t+d)*d]
- copy(top, vm[:d*d])
- raw := buf[(t+d)*d : (t+3*d)*d]
- im := buf[(t+3*d)*d : (t+4*d)*d]
- err := matrix(top).invert(raw, d, im)
- if err != nil {
- return nil, err
- }
- r := buf[(t+4*d)*d : (2*t+4*d)*d]
- matrix(vm).mul(im, t, d, r)
- return matrix(r), nil
-}
-
-// [I|m'] -> [m']
-func (m matrix) subMatrix(n int, r []byte) {
- for i := 0; i < n; i++ {
- off := i * n
- copy(r[off:off+n], m[2*off+n:2*(off+n)])
- }
-}
-
-func (m matrix) invert(raw matrix, n int, im []byte) error {
- // [m] -> [m|I]
- for i := 0; i < n; i++ {
- t := i * n
- copy(raw[2*t:2*t+n], m[t:t+n])
- raw[2*t+i+n] = byte(1)
- }
- err := gauss(raw, n)
- if err != nil {
- return err
- }
- raw.subMatrix(n, im)
- return nil
-}
-
-func (m matrix) swap(i, j, n int) {
- for k := 0; k < n; k++ {
- m[i*n+k], m[j*n+k] = m[j*n+k], m[i*n+k]
- }
-}
-
-func gfMul(a, b byte) byte {
- return mulTbl[a][b]
-}
-
-var errSingular = errors.New("rs.invert: matrix is singular")
-
-// [m|I] -> [I|m']
-func gauss(m matrix, n int) error {
- n2 := 2 * n
- for i := 0; i < n; i++ {
- if m[i*n2+i] == 0 {
- for j := i + 1; j < n; j++ {
- if m[j*n2+i] != 0 {
- m.swap(i, j, n2)
- break
- }
- }
- }
- if m[i*n2+i] == 0 {
- return errSingular
- }
- if m[i*n2+i] != 1 {
- d := m[i*n2+i]
- scale := inverseTbl[d]
- for c := 0; c < n2; c++ {
- m[i*n2+c] = gfMul(m[i*n2+c], scale)
- }
- }
- for j := i + 1; j < n; j++ {
- if m[j*n2+i] != 0 {
- scale := m[j*n2+i]
- for c := 0; c < n2; c++ {
- m[j*n2+c] ^= gfMul(scale, m[i*n2+c])
- }
- }
- }
- }
- for k := 0; k < n; k++ {
- for j := 0; j < k; j++ {
- if m[j*n2+k] != 0 {
- scale := m[j*n2+k]
- for c := 0; c < n2; c++ {
- m[j*n2+c] ^= gfMul(scale, m[k*n2+c])
- }
- }
- }
- }
- return nil
-}
diff --git a/vendor/github.com/templexxx/reedsolomon/matrix_test.go b/vendor/github.com/templexxx/reedsolomon/matrix_test.go
deleted file mode 100644
index 8dc9b75..0000000
--- a/vendor/github.com/templexxx/reedsolomon/matrix_test.go
+++ /dev/null
@@ -1,146 +0,0 @@
-package reedsolomon
-
-import (
- "bytes"
- "testing"
-)
-
-func TestVerifyEncMatrixVand(t *testing.T) {
- a, err := genEncMatrixVand(4, 4)
- if err != nil {
- t.Fatal(err)
- }
- e := []byte{1, 0, 0, 0,
- 0, 1, 0, 0,
- 0, 0, 1, 0,
- 0, 0, 0, 1,
- 27, 28, 18, 20,
- 28, 27, 20, 18,
- 18, 20, 27, 28,
- 20, 18, 28, 27}
- if !bytes.Equal(a, e) {
- t.Fatal("mismatch")
- }
-}
-
-func TestVerifyEncMatrixCauchy(t *testing.T) {
- a := genEncMatrixCauchy(4, 4)
- e := []byte{1, 0, 0, 0,
- 0, 1, 0, 0,
- 0, 0, 1, 0,
- 0, 0, 0, 1,
- 71, 167, 122, 186,
- 167, 71, 186, 122,
- 122, 186, 71, 167,
- 186, 122, 167, 71}
- if !bytes.Equal(a, e) {
- t.Fatal("mismatch")
- }
-}
-
-func TestMatrixInvert(t *testing.T) {
- testCases := []struct {
- matrixData []byte
- cols int
- expect []byte
- ok bool
- expectedErr error
- }{
- {
- []byte{56, 23, 98,
- 3, 100, 200,
- 45, 201, 123},
- 3,
- []byte{175, 133, 33,
- 130, 13, 245,
- 112, 35, 126},
- true,
- nil,
- },
- {
- []byte{0, 23, 98,
- 3, 100, 200,
- 45, 201, 123},
- 3,
- []byte{245, 128, 152,
- 188, 64, 135,
- 231, 81, 239},
- true,
- nil,
- },
- {
- []byte{1, 0, 0, 0, 0,
- 0, 1, 0, 0, 0,
- 0, 0, 0, 1, 0,
- 0, 0, 0, 0, 1,
- 7, 7, 6, 6, 1},
- 5,
- []byte{1, 0, 0, 0, 0,
- 0, 1, 0, 0, 0,
- 123, 123, 1, 122, 122,
- 0, 0, 1, 0, 0,
- 0, 0, 0, 1, 0},
- true,
- nil,
- },
- {
- []byte{4, 2,
- 12, 6},
- 2,
- nil,
- false,
- errSingular,
- },
- }
-
- for i, c := range testCases {
- m := matrix(c.matrixData)
- raw := make([]byte, 2*c.cols*c.cols)
- actual := make([]byte, c.cols*c.cols)
- actualErr := m.invert(raw, c.cols, actual)
- if actualErr != nil && c.ok {
- t.Errorf("case.%d, expected to pass, but failed with: %s", i+1, actualErr.Error())
- }
- if actualErr == nil && !c.ok {
- t.Errorf("case.%d, expected to fail with \"%s\", but passed", i+1, c.expectedErr)
- }
- if actualErr != nil && !c.ok {
- if c.expectedErr != actualErr {
- t.Errorf("case.%d, expected to fail with error \"%s\", but instead failed with error \"%s\"", i+1, c.expectedErr, actualErr)
- }
- }
- if actualErr == nil && c.ok {
- if !bytes.Equal(c.expect, actual) {
- t.Errorf("case.%d, mismatch", i+1)
- }
- }
- }
-}
-
-func benchmarkInvert(b *testing.B, size int) {
- m := genEncMatrixCauchy(size, 2)
- m.swap(0, size, size)
- m.swap(1, size+1, size)
- b.ResetTimer()
- buf := make([]byte, 3*size*size)
- raw := buf[:2*size*size]
- r := buf[2*size*size:]
- for i := 0; i < b.N; i++ {
- err := m.invert(raw, size, r)
- if err != nil {
- b.Fatal(err)
- }
- }
-}
-
-func BenchmarkInvert5x5(b *testing.B) {
- benchmarkInvert(b, 5)
-}
-
-func BenchmarkInvert10x10(b *testing.B) {
- benchmarkInvert(b, 10)
-}
-
-func BenchmarkInvert20x20(b *testing.B) {
- benchmarkInvert(b, 20)
-}
diff --git a/vendor/github.com/templexxx/reedsolomon/rs.go b/vendor/github.com/templexxx/reedsolomon/rs.go
deleted file mode 100644
index e668ccf..0000000
--- a/vendor/github.com/templexxx/reedsolomon/rs.go
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- Reed-Solomon Codes over GF(2^8)
- Primitive Polynomial: x^8+x^4+x^3+x^2+1
- Galois Filed arithmetic using Intel SIMD instructions (AVX2 or SSSE3)
-*/
-
-package reedsolomon
-
-import "errors"
-
-// Encoder implements for Reed-Solomon Encoding/Reconstructing
-type Encoder interface {
- // Encode multiply generator-matrix with data
- // len(vects) must be equal with num of data+parity
- Encode(vects [][]byte) error
- // Result of reconst will be put into origin position of vects
- // it means if you lost vects[0], after reconst the vects[0]'s data will be back in vects[0]
-
- // Reconstruct repair lost data & parity
- // Set vect nil if lost
- Reconstruct(vects [][]byte) error
- // Reconstruct repair lost data
- // Set vect nil if lost
- ReconstructData(vects [][]byte) error
- // ReconstWithPos repair lost data&parity with has&lost vects position
- // Save bandwidth&disk I/O (cmp with Reconstruct, if the lost is less than num of parity)
- // As erasure codes, we must know which vect is broken,
- // so it's necessary to provide such APIs
- // len(has) must equal num of data vects
- // Example:
- // in 3+2, the whole position: [0,1,2,3,4]
- // if lost vects[0]
- // the "has" could be [1,2,3] or [1,2,4] or ...
- // then you must be sure that vects[1] vects[2] vects[3] have correct data (if the "has" is [1,2,3])
- // the "dLost" will be [0]
- // ps:
- // 1. the above lists are in increasing orders TODO support out-of-order
- // 2. each vect has same len, don't set it nil
- // so we don't need to make slice
- ReconstWithPos(vects [][]byte, has, dLost, pLost []int) error
- //// ReconstWithPos repair lost data with survived&lost vects position
- //// Don't need to append position of parity lost into "lost"
- ReconstDataWithPos(vects [][]byte, has, dLost []int) error
-}
-
-func checkCfg(d, p int) error {
- if (d <= 0) || (p <= 0) {
- return errors.New("rs.New: data or parity <= 0")
- }
- if d+p >= 256 {
- return errors.New("rs.New: data+parity >= 256")
- }
- return nil
-}
-
-// New create an Encoder (vandermonde matrix as Encoding matrix)
-func New(data, parity int) (enc Encoder, err error) {
- err = checkCfg(data, parity)
- if err != nil {
- return
- }
- e, err := genEncMatrixVand(data, parity)
- if err != nil {
- return
- }
- return newRS(data, parity, e), nil
-}
-
-// NewCauchy create an Encoder (cauchy matrix as Generator Matrix)
-func NewCauchy(data, parity int) (enc Encoder, err error) {
- err = checkCfg(data, parity)
- if err != nil {
- return
- }
- e := genEncMatrixCauchy(data, parity)
- return newRS(data, parity, e), nil
-}
-
-type encBase struct {
- data int
- parity int
- encode []byte
- gen []byte
-}
-
-func checkEnc(d, p int, vs [][]byte) (size int, err error) {
- total := len(vs)
- if d+p != total {
- err = errors.New("rs.checkER: vects not match rs args")
- return
- }
- size = len(vs[0])
- if size == 0 {
- err = errors.New("rs.checkER: vects size = 0")
- return
- }
- for i := 1; i < total; i++ {
- if len(vs[i]) != size {
- err = errors.New("rs.checkER: vects size mismatch")
- return
- }
- }
- return
-}
-
-func (e *encBase) Encode(vects [][]byte) (err error) {
- d := e.data
- p := e.parity
- _, err = checkEnc(d, p, vects)
- if err != nil {
- return
- }
- dv := vects[:d]
- pv := vects[d:]
- g := e.gen
- for i := 0; i < d; i++ {
- for j := 0; j < p; j++ {
- if i != 0 {
- mulVectAdd(g[j*d+i], dv[i], pv[j])
- } else {
- mulVect(g[j*d], dv[0], pv[j])
- }
- }
- }
- return
-}
-
-func mulVect(c byte, a, b []byte) {
- t := mulTbl[c]
- for i := 0; i < len(a); i++ {
- b[i] = t[a[i]]
- }
-}
-
-func mulVectAdd(c byte, a, b []byte) {
- t := mulTbl[c]
- for i := 0; i < len(a); i++ {
- b[i] ^= t[a[i]]
- }
-}
-
-func (e *encBase) Reconstruct(vects [][]byte) (err error) {
- return e.reconstruct(vects, false)
-}
-
-func (e *encBase) ReconstructData(vects [][]byte) (err error) {
- return e.reconstruct(vects, true)
-}
-
-func (e *encBase) ReconstWithPos(vects [][]byte, has, dLost, pLost []int) error {
- return e.reconstWithPos(vects, has, dLost, pLost, false)
-}
-
-func (e *encBase) ReconstDataWithPos(vects [][]byte, has, dLost []int) error {
- return e.reconstWithPos(vects, has, dLost, nil, true)
-}
-
-func (e *encBase) reconst(vects [][]byte, has, dLost, pLost []int, dataOnly bool) (err error) {
- d := e.data
- em := e.encode
- dCnt := len(dLost)
- size := len(vects[has[0]])
- if dCnt != 0 {
- vtmp := make([][]byte, d+dCnt)
- for i, p := range has {
- vtmp[i] = vects[p]
- }
- for i, p := range dLost {
- if len(vects[p]) == 0 {
- vects[p] = make([]byte, size)
- }
- vtmp[i+d] = vects[p]
- }
- matrixbuf := make([]byte, 4*d*d+dCnt*d)
- m := matrixbuf[:d*d]
- for i, l := range has {
- copy(m[i*d:i*d+d], em[l*d:l*d+d])
- }
- raw := matrixbuf[d*d : 3*d*d]
- im := matrixbuf[3*d*d : 4*d*d]
- err2 := matrix(m).invert(raw, d, im)
- if err2 != nil {
- return err2
- }
- g := matrixbuf[4*d*d:]
- for i, l := range dLost {
- copy(g[i*d:i*d+d], im[l*d:l*d+d])
- }
- etmp := &encBase{data: d, parity: dCnt, gen: g}
- err2 = etmp.Encode(vtmp[:d+dCnt])
- if err2 != nil {
- return err2
- }
- }
- if dataOnly {
- return
- }
- pCnt := len(pLost)
- if pCnt != 0 {
- vtmp := make([][]byte, d+pCnt)
- g := make([]byte, pCnt*d)
- for i, l := range pLost {
- copy(g[i*d:i*d+d], em[l*d:l*d+d])
- }
- for i := 0; i < d; i++ {
- vtmp[i] = vects[i]
- }
- for i, p := range pLost {
- if len(vects[p]) == 0 {
- vects[p] = make([]byte, size)
- }
- vtmp[i+d] = vects[p]
- }
- etmp := &encBase{data: d, parity: pCnt, gen: g}
- err2 := etmp.Encode(vtmp[:d+pCnt])
- if err2 != nil {
- return err2
- }
- }
- return
-}
-
-func (e *encBase) reconstWithPos(vects [][]byte, has, dLost, pLost []int, dataOnly bool) (err error) {
- d := e.data
- p := e.parity
- // TODO check more, maybe element in has show in lost & deal with len(has) > d
- if len(has) != d {
- return errors.New("rs.Reconst: not enough vects")
- }
- dCnt := len(dLost)
- if dCnt > p {
- return errors.New("rs.Reconst: not enough vects")
- }
- pCnt := len(pLost)
- if pCnt > p {
- return errors.New("rs.Reconst: not enough vects")
- }
- return e.reconst(vects, has, dLost, pLost, dataOnly)
-}
-
-func (e *encBase) reconstruct(vects [][]byte, dataOnly bool) (err error) {
- d := e.data
- p := e.parity
- t := d + p
- listBuf := make([]int, t+p)
- has := listBuf[:d]
- dLost := listBuf[d:t]
- pLost := listBuf[t : t+p]
- hasCnt, dCnt, pCnt := 0, 0, 0
- for i := 0; i < t; i++ {
- if vects[i] != nil {
- if hasCnt < d {
- has[hasCnt] = i
- hasCnt++
- }
- } else {
- if i < d {
- if dCnt < p {
- dLost[dCnt] = i
- dCnt++
- } else {
- return errors.New("rs.Reconst: not enough vects")
- }
- } else {
- if pCnt < p {
- pLost[pCnt] = i
- pCnt++
- } else {
- return errors.New("rs.Reconst: not enough vects")
- }
- }
- }
- }
- if hasCnt != d {
- return errors.New("rs.Reconst: not enough vects")
- }
- dLost = dLost[:dCnt]
- pLost = pLost[:pCnt]
- return e.reconst(vects, has, dLost, pLost, dataOnly)
-}
diff --git a/vendor/github.com/templexxx/reedsolomon/rs_amd64.go b/vendor/github.com/templexxx/reedsolomon/rs_amd64.go
deleted file mode 100644
index 75301d4..0000000
--- a/vendor/github.com/templexxx/reedsolomon/rs_amd64.go
+++ /dev/null
@@ -1,868 +0,0 @@
-package reedsolomon
-
-import (
- "errors"
- "sync"
-
- "github.com/templexxx/cpufeat"
-)
-
-// SIMD Instruction Extensions
-const (
- none = iota
- avx2
- ssse3
-)
-
-var extension = none
-
-func init() {
- getEXT()
-}
-
-func getEXT() {
- if cpufeat.X86.HasAVX2 {
- extension = avx2
- return
- } else if cpufeat.X86.HasSSSE3 {
- extension = ssse3
- return
- } else {
- extension = none
- return
- }
-}
-
-//go:noescape
-func copy32B(dst, src []byte) // Need SSE2(introduced in 2001)
-
-func initTbl(g matrix, rows, cols int, tbl []byte) {
- off := 0
- for i := 0; i < cols; i++ {
- for j := 0; j < rows; j++ {
- c := g[j*cols+i]
- t := lowhighTbl[c][:]
- copy32B(tbl[off:off+32], t)
- off += 32
- }
- }
-}
-
-// At most 3060 inverse matrix (when data=14, parity=4, calc by mathtool/cntinverse)
-// In practice, data usually below 12, parity below 5
-func okCache(data, parity int) bool {
- if data < 15 && parity < 5 { // you can change it, but the data+parity can't be bigger than 32 (tips: see the codes about make inverse matrix)
- return true
- }
- return false
-}
-
-type (
- encSSSE3 encSIMD
- encAVX2 encSIMD
- encSIMD struct {
- data int
- parity int
- encode matrix
- gen matrix
- tbl []byte
- // inverse matrix cache is design for small vect size ( < 4KB )
- // it will save time for calculating inverse matrix
- // but it's not so important for big vect size
- enableCache bool
- inverseCache iCache
- }
- iCache struct {
- sync.RWMutex
- data map[uint32][]byte
- }
-)
-
-func newRS(d, p int, em matrix) (enc Encoder) {
- g := em[d*d:]
- if extension == none {
- return &encBase{data: d, parity: p, encode: em, gen: g}
- }
- t := make([]byte, d*p*32)
- initTbl(g, p, d, t)
- ok := okCache(d, p)
- if extension == avx2 {
- e := &encAVX2{data: d, parity: p, encode: em, gen: g, tbl: t, enableCache: ok,
- inverseCache: iCache{data: make(map[uint32][]byte)}}
- return e
- }
- e := &encSSSE3{data: d, parity: p, encode: em, gen: g, tbl: t, enableCache: ok,
- inverseCache: iCache{data: make(map[uint32][]byte)}}
- return e
-}
-
-// Size of sub-vector
-const unit int = 16 * 1024
-
-func getDo(n int) int {
- if n < unit {
- c := n >> 4
- if c == 0 {
- return unit
- }
- return c << 4
- }
- return unit
-}
-
-func (e *encAVX2) Encode(vects [][]byte) (err error) {
- d := e.data
- p := e.parity
- size, err := checkEnc(d, p, vects)
- if err != nil {
- return
- }
- dv := vects[:d]
- pv := vects[d:]
- start, end := 0, 0
- do := getDo(size)
- for start < size {
- end = start + do
- if end <= size {
- e.matrixMul(start, end, dv, pv)
- start = end
- } else {
- e.matrixMulRemain(start, size, dv, pv)
- start = size
- }
- }
- return
-}
-
-//go:noescape
-func mulVectAVX2(tbl, d, p []byte)
-
-//go:noescape
-func mulVectAddAVX2(tbl, d, p []byte)
-
-func (e *encAVX2) matrixMul(start, end int, dv, pv [][]byte) {
- d := e.data
- p := e.parity
- tbl := e.tbl
- off := 0
- for i := 0; i < d; i++ {
- for j := 0; j < p; j++ {
- t := tbl[off : off+32]
- if i != 0 {
- mulVectAddAVX2(t, dv[i][start:end], pv[j][start:end])
- } else {
- mulVectAVX2(t, dv[0][start:end], pv[j][start:end])
- }
- off += 32
- }
- }
-}
-
-func (e *encAVX2) matrixMulRemain(start, end int, dv, pv [][]byte) {
- undone := end - start
- do := (undone >> 4) << 4
- d := e.data
- p := e.parity
- tbl := e.tbl
- if do >= 16 {
- end2 := start + do
- off := 0
- for i := 0; i < d; i++ {
- for j := 0; j < p; j++ {
- t := tbl[off : off+32]
- if i != 0 {
- mulVectAddAVX2(t, dv[i][start:end2], pv[j][start:end2])
- } else {
- mulVectAVX2(t, dv[0][start:end2], pv[j][start:end2])
- }
- off += 32
- }
- }
- start = end
- }
- if undone > do {
- // may recalculate some data, but still improve a lot
- start2 := end - 16
- if start2 >= 0 {
- off := 0
- for i := 0; i < d; i++ {
- for j := 0; j < p; j++ {
- t := tbl[off : off+32]
- if i != 0 {
- mulVectAddAVX2(t, dv[i][start2:end], pv[j][start2:end])
- } else {
- mulVectAVX2(t, dv[0][start2:end], pv[j][start2:end])
- }
- off += 32
- }
- }
- } else {
- g := e.gen
- for i := 0; i < d; i++ {
- for j := 0; j < p; j++ {
- if i != 0 {
- mulVectAdd(g[j*d+i], dv[i][start:], pv[j][start:])
- } else {
- mulVect(g[j*d], dv[0][start:], pv[j][start:])
- }
- }
- }
- }
- }
-}
-
-// use generator-matrix but not tbls for encoding
-// it's design for reconstructing
-// for small vects, it cost to much time on initTbl, so drop it
-// and for big vects, the tbls can't impact much, because the cache will be filled with vects' data
-func (e *encAVX2) encodeGen(vects [][]byte) (err error) {
- d := e.data
- p := e.parity
- size, err := checkEnc(d, p, vects)
- if err != nil {
- return
- }
- dv := vects[:d]
- pv := vects[d:]
- start, end := 0, 0
- do := getDo(size)
- for start < size {
- end = start + do
- if end <= size {
- e.matrixMulGen(start, end, dv, pv)
- start = end
- } else {
- e.matrixMulRemainGen(start, size, dv, pv)
- start = size
- }
- }
- return
-}
-
-func (e *encAVX2) matrixMulGen(start, end int, dv, pv [][]byte) {
- d := e.data
- p := e.parity
- g := e.gen
- for i := 0; i < d; i++ {
- for j := 0; j < p; j++ {
- t := lowhighTbl[g[j*d+i]][:]
- if i != 0 {
- mulVectAddAVX2(t, dv[i][start:end], pv[j][start:end])
- } else {
- mulVectAVX2(t, dv[0][start:end], pv[j][start:end])
- }
- }
- }
-}
-
-func (e *encAVX2) matrixMulRemainGen(start, end int, dv, pv [][]byte) {
- undone := end - start
- do := (undone >> 4) << 4
- d := e.data
- p := e.parity
- g := e.gen
- if do >= 16 {
- end2 := start + do
- for i := 0; i < d; i++ {
- for j := 0; j < p; j++ {
- t := lowhighTbl[g[j*d+i]][:]
- if i != 0 {
- mulVectAddAVX2(t, dv[i][start:end2], pv[j][start:end2])
- } else {
- mulVectAVX2(t, dv[0][start:end2], pv[j][start:end2])
- }
- }
- }
- start = end
- }
- if undone > do {
- start2 := end - 16
- if start2 >= 0 {
- for i := 0; i < d; i++ {
- for j := 0; j < p; j++ {
- t := lowhighTbl[g[j*d+i]][:]
- if i != 0 {
- mulVectAddAVX2(t, dv[i][start2:end], pv[j][start2:end])
- } else {
- mulVectAVX2(t, dv[0][start2:end], pv[j][start2:end])
- }
- }
- }
- } else {
- for i := 0; i < d; i++ {
- for j := 0; j < p; j++ {
- if i != 0 {
- mulVectAdd(g[j*d+i], dv[i][start:], pv[j][start:])
- } else {
- mulVect(g[j*d], dv[0][start:], pv[j][start:])
- }
- }
- }
- }
- }
-}
-
-func (e *encAVX2) Reconstruct(vects [][]byte) (err error) {
- return e.reconstruct(vects, false)
-}
-
-func (e *encAVX2) ReconstructData(vects [][]byte) (err error) {
- return e.reconstruct(vects, true)
-}
-
-func (e *encAVX2) ReconstWithPos(vects [][]byte, has, dLost, pLost []int) error {
- return e.reconstWithPos(vects, has, dLost, pLost, false)
-}
-
-func (e *encAVX2) ReconstDataWithPos(vects [][]byte, has, dLost []int) error {
- return e.reconstWithPos(vects, has, dLost, nil, true)
-}
-
-func (e *encAVX2) makeGen(has, dLost []int) (gen []byte, err error) {
- d := e.data
- em := e.encode
- cnt := len(dLost)
- if !e.enableCache {
- matrixbuf := make([]byte, 4*d*d+cnt*d)
- m := matrixbuf[:d*d]
- for i, l := range has {
- copy(m[i*d:i*d+d], em[l*d:l*d+d])
- }
- raw := matrixbuf[d*d : 3*d*d]
- im := matrixbuf[3*d*d : 4*d*d]
- err2 := matrix(m).invert(raw, d, im)
- if err2 != nil {
- return nil, err2
- }
- g := matrixbuf[4*d*d:]
- for i, l := range dLost {
- copy(g[i*d:i*d+d], im[l*d:l*d+d])
- }
- return g, nil
- }
- var ikey uint32
- for _, p := range has {
- ikey += 1 << uint8(p)
- }
- e.inverseCache.RLock()
- v, ok := e.inverseCache.data[ikey]
- if ok {
- im := v
- g := make([]byte, cnt*d)
- for i, l := range dLost {
- copy(g[i*d:i*d+d], im[l*d:l*d+d])
- }
- e.inverseCache.RUnlock()
- return g, nil
- }
- e.inverseCache.RUnlock()
- matrixbuf := make([]byte, 4*d*d+cnt*d)
- m := matrixbuf[:d*d]
- for i, l := range has {
- copy(m[i*d:i*d+d], em[l*d:l*d+d])
- }
- raw := matrixbuf[d*d : 3*d*d]
- im := matrixbuf[3*d*d : 4*d*d]
- err2 := matrix(m).invert(raw, d, im)
- if err2 != nil {
- return nil, err2
- }
- e.inverseCache.Lock()
- e.inverseCache.data[ikey] = im
- e.inverseCache.Unlock()
- g := matrixbuf[4*d*d:]
- for i, l := range dLost {
- copy(g[i*d:i*d+d], im[l*d:l*d+d])
- }
- return g, nil
-}
-
-func (e *encAVX2) reconst(vects [][]byte, has, dLost, pLost []int, dataOnly bool) (err error) {
- d := e.data
- em := e.encode
- dCnt := len(dLost)
- size := len(vects[has[0]])
- if dCnt != 0 {
- vtmp := make([][]byte, d+dCnt)
- for i, p := range has {
- vtmp[i] = vects[p]
- }
- for i, p := range dLost {
- if len(vects[p]) == 0 {
- vects[p] = make([]byte, size)
- }
- vtmp[i+d] = vects[p]
- }
- g, err2 := e.makeGen(has, dLost)
- if err2 != nil {
- return
- }
- etmp := &encAVX2{data: d, parity: dCnt, gen: g}
- err2 = etmp.encodeGen(vtmp)
- if err2 != nil {
- return err2
- }
- }
- if dataOnly {
- return
- }
- pCnt := len(pLost)
- if pCnt != 0 {
- g := make([]byte, pCnt*d)
- for i, l := range pLost {
- copy(g[i*d:i*d+d], em[l*d:l*d+d])
- }
- vtmp := make([][]byte, d+pCnt)
- for i := 0; i < d; i++ {
- vtmp[i] = vects[i]
- }
- for i, p := range pLost {
- if len(vects[p]) == 0 {
- vects[p] = make([]byte, size)
- }
- vtmp[i+d] = vects[p]
- }
- etmp := &encAVX2{data: d, parity: pCnt, gen: g}
- err2 := etmp.encodeGen(vtmp)
- if err2 != nil {
- return err2
- }
- }
- return
-}
-
-func (e *encAVX2) reconstWithPos(vects [][]byte, has, dLost, pLost []int, dataOnly bool) (err error) {
- d := e.data
- p := e.parity
- if len(has) != d {
- return errors.New("rs.Reconst: not enough vects")
- }
- dCnt := len(dLost)
- if dCnt > p {
- return errors.New("rs.Reconst: not enough vects")
- }
- pCnt := len(pLost)
- if pCnt > p {
- return errors.New("rs.Reconst: not enough vects")
- }
- return e.reconst(vects, has, dLost, pLost, dataOnly)
-}
-
-func (e *encAVX2) reconstruct(vects [][]byte, dataOnly bool) (err error) {
- d := e.data
- p := e.parity
- t := d + p
- listBuf := make([]int, t+p)
- has := listBuf[:d]
- dLost := listBuf[d:t]
- pLost := listBuf[t : t+p]
- hasCnt, dCnt, pCnt := 0, 0, 0
- for i := 0; i < t; i++ {
- if vects[i] != nil {
- if hasCnt < d {
- has[hasCnt] = i
- hasCnt++
- }
- } else {
- if i < d {
- if dCnt < p {
- dLost[dCnt] = i
- dCnt++
- } else {
- return errors.New("rs.Reconst: not enough vects")
- }
- } else {
- if pCnt < p {
- pLost[pCnt] = i
- pCnt++
- } else {
- return errors.New("rs.Reconst: not enough vects")
- }
- }
- }
- }
- if hasCnt != d {
- return errors.New("rs.Reconst: not enough vects")
- }
- dLost = dLost[:dCnt]
- pLost = pLost[:pCnt]
- return e.reconst(vects, has, dLost, pLost, dataOnly)
-}
-
-func (e *encSSSE3) Encode(vects [][]byte) (err error) {
- d := e.data
- p := e.parity
- size, err := checkEnc(d, p, vects)
- if err != nil {
- return
- }
- dv := vects[:d]
- pv := vects[d:]
- start, end := 0, 0
- do := getDo(size)
- for start < size {
- end = start + do
- if end <= size {
- e.matrixMul(start, end, dv, pv)
- start = end
- } else {
- e.matrixMulRemain(start, size, dv, pv)
- start = size
- }
- }
- return
-}
-
-//go:noescape
-func mulVectSSSE3(tbl, d, p []byte)
-
-//go:noescape
-func mulVectAddSSSE3(tbl, d, p []byte)
-
-func (e *encSSSE3) matrixMul(start, end int, dv, pv [][]byte) {
- d := e.data
- p := e.parity
- tbl := e.tbl
- off := 0
- for i := 0; i < d; i++ {
- for j := 0; j < p; j++ {
- t := tbl[off : off+32]
- if i != 0 {
- mulVectAddSSSE3(t, dv[i][start:end], pv[j][start:end])
- } else {
- mulVectSSSE3(t, dv[0][start:end], pv[j][start:end])
- }
- off += 32
- }
- }
-}
-
-func (e *encSSSE3) matrixMulRemain(start, end int, dv, pv [][]byte) {
- undone := end - start
- do := (undone >> 4) << 4
- d := e.data
- p := e.parity
- tbl := e.tbl
- if do >= 16 {
- end2 := start + do
- off := 0
- for i := 0; i < d; i++ {
- for j := 0; j < p; j++ {
- t := tbl[off : off+32]
- if i != 0 {
- mulVectAddSSSE3(t, dv[i][start:end2], pv[j][start:end2])
- } else {
- mulVectSSSE3(t, dv[0][start:end2], pv[j][start:end2])
- }
- off += 32
- }
- }
- start = end
- }
- if undone > do {
- start2 := end - 16
- if start2 >= 0 {
- off := 0
- for i := 0; i < d; i++ {
- for j := 0; j < p; j++ {
- t := tbl[off : off+32]
- if i != 0 {
- mulVectAddSSSE3(t, dv[i][start2:end], pv[j][start2:end])
- } else {
- mulVectSSSE3(t, dv[0][start2:end], pv[j][start2:end])
- }
- off += 32
- }
- }
- } else {
- g := e.gen
- for i := 0; i < d; i++ {
- for j := 0; j < p; j++ {
- if i != 0 {
- mulVectAdd(g[j*d+i], dv[i][start:], pv[j][start:])
- } else {
- mulVect(g[j*d], dv[0][start:], pv[j][start:])
- }
- }
- }
- }
- }
-}
-
-// use generator-matrix but not tbls for encoding
-// it's design for reconstructing
-// for small vects, it cost to much time on initTbl, so drop it
-// and for big vects, the tbls can't impact much, because the cache will be filled with vects' data
-func (e *encSSSE3) encodeGen(vects [][]byte) (err error) {
- d := e.data
- p := e.parity
- size, err := checkEnc(d, p, vects)
- if err != nil {
- return
- }
- dv := vects[:d]
- pv := vects[d:]
- start, end := 0, 0
- do := getDo(size)
- for start < size {
- end = start + do
- if end <= size {
- e.matrixMulGen(start, end, dv, pv)
- start = end
- } else {
- e.matrixMulRemainGen(start, size, dv, pv)
- start = size
- }
- }
- return
-}
-
-func (e *encSSSE3) matrixMulGen(start, end int, dv, pv [][]byte) {
- d := e.data
- p := e.parity
- g := e.gen
- for i := 0; i < d; i++ {
- for j := 0; j < p; j++ {
- t := lowhighTbl[g[j*d+i]][:]
- if i != 0 {
- mulVectAddSSSE3(t, dv[i][start:end], pv[j][start:end])
- } else {
- mulVectSSSE3(t, dv[0][start:end], pv[j][start:end])
- }
- }
- }
-}
-
-func (e *encSSSE3) matrixMulRemainGen(start, end int, dv, pv [][]byte) {
- undone := end - start
- do := (undone >> 4) << 4
- d := e.data
- p := e.parity
- g := e.gen
- if do >= 16 {
- end2 := start + do
- for i := 0; i < d; i++ {
- for j := 0; j < p; j++ {
- t := lowhighTbl[g[j*d+i]][:]
- if i != 0 {
- mulVectAddSSSE3(t, dv[i][start:end2], pv[j][start:end2])
- } else {
- mulVectSSSE3(t, dv[0][start:end2], pv[j][start:end2])
- }
- }
- }
- start = end
- }
- if undone > do {
- start2 := end - 16
- if start2 >= 0 {
- for i := 0; i < d; i++ {
- for j := 0; j < p; j++ {
- t := lowhighTbl[g[j*d+i]][:]
- if i != 0 {
- mulVectAddSSSE3(t, dv[i][start2:end], pv[j][start2:end])
- } else {
- mulVectSSSE3(t, dv[0][start2:end], pv[j][start2:end])
- }
- }
- }
- } else {
- for i := 0; i < d; i++ {
- for j := 0; j < p; j++ {
- if i != 0 {
- mulVectAdd(g[j*d+i], dv[i][start:], pv[j][start:])
- } else {
- mulVect(g[j*d], dv[0][start:], pv[j][start:])
- }
- }
- }
- }
- }
-}
-
-func (e *encSSSE3) Reconstruct(vects [][]byte) (err error) {
- return e.reconstruct(vects, false)
-}
-
-func (e *encSSSE3) ReconstructData(vects [][]byte) (err error) {
- return e.reconstruct(vects, true)
-}
-
-func (e *encSSSE3) ReconstWithPos(vects [][]byte, has, dLost, pLost []int) error {
- return e.reconstWithPos(vects, has, dLost, pLost, false)
-}
-
-func (e *encSSSE3) ReconstDataWithPos(vects [][]byte, has, dLost []int) error {
- return e.reconstWithPos(vects, has, dLost, nil, true)
-}
-
-func (e *encSSSE3) makeGen(has, dLost []int) (gen []byte, err error) {
- d := e.data
- em := e.encode
- cnt := len(dLost)
- if !e.enableCache {
- matrixbuf := make([]byte, 4*d*d+cnt*d)
- m := matrixbuf[:d*d]
- for i, l := range has {
- copy(m[i*d:i*d+d], em[l*d:l*d+d])
- }
- raw := matrixbuf[d*d : 3*d*d]
- im := matrixbuf[3*d*d : 4*d*d]
- err2 := matrix(m).invert(raw, d, im)
- if err2 != nil {
- return nil, err2
- }
- g := matrixbuf[4*d*d:]
- for i, l := range dLost {
- copy(g[i*d:i*d+d], im[l*d:l*d+d])
- }
- return g, nil
- }
- var ikey uint32
- for _, p := range has {
- ikey += 1 << uint8(p)
- }
- e.inverseCache.RLock()
- v, ok := e.inverseCache.data[ikey]
- if ok {
- im := v
- g := make([]byte, cnt*d)
- for i, l := range dLost {
- copy(g[i*d:i*d+d], im[l*d:l*d+d])
- }
- e.inverseCache.RUnlock()
- return g, nil
- }
- e.inverseCache.RUnlock()
- matrixbuf := make([]byte, 4*d*d+cnt*d)
- m := matrixbuf[:d*d]
- for i, l := range has {
- copy(m[i*d:i*d+d], em[l*d:l*d+d])
- }
- raw := matrixbuf[d*d : 3*d*d]
- im := matrixbuf[3*d*d : 4*d*d]
- err2 := matrix(m).invert(raw, d, im)
- if err2 != nil {
- return nil, err2
- }
- e.inverseCache.Lock()
- e.inverseCache.data[ikey] = im
- e.inverseCache.Unlock()
- g := matrixbuf[4*d*d:]
- for i, l := range dLost {
- copy(g[i*d:i*d+d], im[l*d:l*d+d])
- }
- return g, nil
-}
-
-func (e *encSSSE3) reconst(vects [][]byte, has, dLost, pLost []int, dataOnly bool) (err error) {
- d := e.data
- em := e.encode
- dCnt := len(dLost)
- size := len(vects[has[0]])
- if dCnt != 0 {
- vtmp := make([][]byte, d+dCnt)
- for i, p := range has {
- vtmp[i] = vects[p]
- }
- for i, p := range dLost {
- if len(vects[p]) == 0 {
- vects[p] = make([]byte, size)
- }
- vtmp[i+d] = vects[p]
- }
- g, err2 := e.makeGen(has, dLost)
- if err2 != nil {
- return
- }
- etmp := &encSSSE3{data: d, parity: dCnt, gen: g}
- err2 = etmp.encodeGen(vtmp)
- if err2 != nil {
- return err2
- }
- }
- if dataOnly {
- return
- }
- pCnt := len(pLost)
- if pCnt != 0 {
- g := make([]byte, pCnt*d)
- for i, l := range pLost {
- copy(g[i*d:i*d+d], em[l*d:l*d+d])
- }
- vtmp := make([][]byte, d+pCnt)
- for i := 0; i < d; i++ {
- vtmp[i] = vects[i]
- }
- for i, p := range pLost {
- if len(vects[p]) == 0 {
- vects[p] = make([]byte, size)
- }
- vtmp[i+d] = vects[p]
- }
- etmp := &encSSSE3{data: d, parity: pCnt, gen: g}
- err2 := etmp.encodeGen(vtmp)
- if err2 != nil {
- return err2
- }
- }
- return
-}
-
-func (e *encSSSE3) reconstWithPos(vects [][]byte, has, dLost, pLost []int, dataOnly bool) (err error) {
- d := e.data
- p := e.parity
- if len(has) != d {
- return errors.New("rs.Reconst: not enough vects")
- }
- dCnt := len(dLost)
- if dCnt > p {
- return errors.New("rs.Reconst: not enough vects")
- }
- pCnt := len(pLost)
- if pCnt > p {
- return errors.New("rs.Reconst: not enough vects")
- }
- return e.reconst(vects, has, dLost, pLost, dataOnly)
-}
-
-func (e *encSSSE3) reconstruct(vects [][]byte, dataOnly bool) (err error) {
- d := e.data
- p := e.parity
- t := d + p
- listBuf := make([]int, t+p)
- has := listBuf[:d]
- dLost := listBuf[d:t]
- pLost := listBuf[t : t+p]
- hasCnt, dCnt, pCnt := 0, 0, 0
- for i := 0; i < t; i++ {
- if vects[i] != nil {
- if hasCnt < d {
- has[hasCnt] = i
- hasCnt++
- }
- } else {
- if i < d {
- if dCnt < p {
- dLost[dCnt] = i
- dCnt++
- } else {
- return errors.New("rs.Reconst: not enough vects")
- }
- } else {
- if pCnt < p {
- pLost[pCnt] = i
- pCnt++
- } else {
- return errors.New("rs.Reconst: not enough vects")
- }
- }
- }
- }
- if hasCnt != d {
- return errors.New("rs.Reconst: not enough vects")
- }
- dLost = dLost[:dCnt]
- pLost = pLost[:pCnt]
- return e.reconst(vects, has, dLost, pLost, dataOnly)
-}
diff --git a/vendor/github.com/templexxx/reedsolomon/rs_amd64.s b/vendor/github.com/templexxx/reedsolomon/rs_amd64.s
deleted file mode 100644
index b8f4885..0000000
--- a/vendor/github.com/templexxx/reedsolomon/rs_amd64.s
+++ /dev/null
@@ -1,401 +0,0 @@
-// Reference: www.ssrc.ucsc.edu/Papers/plank-fast13.pdf
-
-#include "textflag.h"
-
-#define low_tbl Y0
-#define high_tbl Y1
-#define mask Y2
-#define in0 Y3
-#define in1 Y4
-#define in2 Y5
-#define in3 Y6
-#define in4 Y7
-#define in5 Y8
-#define in0_h Y10
-#define in1_h Y11
-#define in2_h Y12
-#define in3_h Y13
-#define in4_h Y14
-#define in5_h Y15
-
-#define in BX
-#define out DI
-#define len R8
-#define pos R9
-
-#define tmp0 R10
-
-#define low_tblx X0
-#define high_tblx X1
-#define maskx X2
-#define in0x X3
-#define in0_hx X10
-#define tmp0x X9
-#define tmp1x X11
-#define tmp2x X12
-#define tmp3x X13
-
-
-// func mulVectAVX2(tbl, d, p []byte)
-TEXT ·mulVectAVX2(SB), NOSPLIT, $0
- MOVQ i+24(FP), in
- MOVQ o+48(FP), out
- MOVQ tbl+0(FP), tmp0
- VMOVDQU (tmp0), low_tblx
- VMOVDQU 16(tmp0), high_tblx
- MOVB $0x0f, DX
- LONG $0x2069e3c4; WORD $0x00d2 // VPINSRB $0x00, EDX, XMM2, XMM2
- VPBROADCASTB maskx, maskx
- MOVQ in_len+32(FP), len
- TESTQ $31, len
- JNZ one16b
-
-ymm:
- VINSERTI128 $1, low_tblx, low_tbl, low_tbl
- VINSERTI128 $1, high_tblx, high_tbl, high_tbl
- VINSERTI128 $1, maskx, mask, mask
- TESTQ $255, len
- JNZ not_aligned
-
-// 256bytes/loop
-aligned:
- MOVQ $0, pos
-
-loop256b:
- VMOVDQU (in)(pos*1), in0
- VPSRLQ $4, in0, in0_h
- VPAND mask, in0_h, in0_h
- VPAND mask, in0, in0
- VPSHUFB in0_h, high_tbl, in0_h
- VPSHUFB in0, low_tbl, in0
- VPXOR in0, in0_h, in0
- VMOVDQU in0, (out)(pos*1)
-
- VMOVDQU 32(in)(pos*1), in1
- VPSRLQ $4, in1, in1_h
- VPAND mask, in1_h, in1_h
- VPAND mask, in1, in1
- VPSHUFB in1_h, high_tbl, in1_h
- VPSHUFB in1, low_tbl, in1
- VPXOR in1, in1_h, in1
- VMOVDQU in1, 32(out)(pos*1)
-
- VMOVDQU 64(in)(pos*1), in2
- VPSRLQ $4, in2, in2_h
- VPAND mask, in2_h, in2_h
- VPAND mask, in2, in2
- VPSHUFB in2_h, high_tbl, in2_h
- VPSHUFB in2, low_tbl, in2
- VPXOR in2, in2_h, in2
- VMOVDQU in2, 64(out)(pos*1)
-
- VMOVDQU 96(in)(pos*1), in3
- VPSRLQ $4, in3, in3_h
- VPAND mask, in3_h, in3_h
- VPAND mask, in3, in3
- VPSHUFB in3_h, high_tbl, in3_h
- VPSHUFB in3, low_tbl, in3
- VPXOR in3, in3_h, in3
- VMOVDQU in3, 96(out)(pos*1)
-
- VMOVDQU 128(in)(pos*1), in4
- VPSRLQ $4, in4, in4_h
- VPAND mask, in4_h, in4_h
- VPAND mask, in4, in4
- VPSHUFB in4_h, high_tbl, in4_h
- VPSHUFB in4, low_tbl, in4
- VPXOR in4, in4_h, in4
- VMOVDQU in4, 128(out)(pos*1)
-
- VMOVDQU 160(in)(pos*1), in5
- VPSRLQ $4, in5, in5_h
- VPAND mask, in5_h, in5_h
- VPAND mask, in5, in5
- VPSHUFB in5_h, high_tbl, in5_h
- VPSHUFB in5, low_tbl, in5
- VPXOR in5, in5_h, in5
- VMOVDQU in5, 160(out)(pos*1)
-
- VMOVDQU 192(in)(pos*1), in0
- VPSRLQ $4, in0, in0_h
- VPAND mask, in0_h, in0_h
- VPAND mask, in0, in0
- VPSHUFB in0_h, high_tbl, in0_h
- VPSHUFB in0, low_tbl, in0
- VPXOR in0, in0_h, in0
- VMOVDQU in0, 192(out)(pos*1)
-
- VMOVDQU 224(in)(pos*1), in1
- VPSRLQ $4, in1, in1_h
- VPAND mask, in1_h, in1_h
- VPAND mask, in1, in1
- VPSHUFB in1_h, high_tbl, in1_h
- VPSHUFB in1, low_tbl, in1
- VPXOR in1, in1_h, in1
- VMOVDQU in1, 224(out)(pos*1)
-
- ADDQ $256, pos
- CMPQ len, pos
- JNE loop256b
- VZEROUPPER
- RET
-
-not_aligned:
- MOVQ len, tmp0
- ANDQ $255, tmp0
-
-loop32b:
- VMOVDQU -32(in)(len*1), in0
- VPSRLQ $4, in0, in0_h
- VPAND mask, in0_h, in0_h
- VPAND mask, in0, in0
- VPSHUFB in0_h, high_tbl, in0_h
- VPSHUFB in0, low_tbl, in0
- VPXOR in0, in0_h, in0
- VMOVDQU in0, -32(out)(len*1)
- SUBQ $32, len
- SUBQ $32, tmp0
- JG loop32b
- CMPQ len, $256
- JGE aligned
- VZEROUPPER
- RET
-
-one16b:
- VMOVDQU -16(in)(len*1), in0x
- VPSRLQ $4, in0x, in0_hx
- VPAND maskx, in0x, in0x
- VPAND maskx, in0_hx, in0_hx
- VPSHUFB in0_hx, high_tblx, in0_hx
- VPSHUFB in0x, low_tblx, in0x
- VPXOR in0x, in0_hx, in0x
- VMOVDQU in0x, -16(out)(len*1)
- SUBQ $16, len
- CMPQ len, $0
- JNE ymm
- RET
-
-// func mulVectAddAVX2(tbl, d, p []byte)
-TEXT ·mulVectAddAVX2(SB), NOSPLIT, $0
- MOVQ i+24(FP), in
- MOVQ o+48(FP), out
- MOVQ tbl+0(FP), tmp0
- VMOVDQU (tmp0), low_tblx
- VMOVDQU 16(tmp0), high_tblx
- MOVB $0x0f, DX
- LONG $0x2069e3c4; WORD $0x00d2
- VPBROADCASTB maskx, maskx
- MOVQ in_len+32(FP), len
- TESTQ $31, len
- JNZ one16b
-
-ymm:
- VINSERTI128 $1, low_tblx, low_tbl, low_tbl
- VINSERTI128 $1, high_tblx, high_tbl, high_tbl
- VINSERTI128 $1, maskx, mask, mask
- TESTQ $255, len
- JNZ not_aligned
-
-aligned:
- MOVQ $0, pos
-
-loop256b:
- VMOVDQU (in)(pos*1), in0
- VPSRLQ $4, in0, in0_h
- VPAND mask, in0_h, in0_h
- VPAND mask, in0, in0
- VPSHUFB in0_h, high_tbl, in0_h
- VPSHUFB in0, low_tbl, in0
- VPXOR in0, in0_h, in0
- VPXOR (out)(pos*1), in0, in0
- VMOVDQU in0, (out)(pos*1)
-
- VMOVDQU 32(in)(pos*1), in1
- VPSRLQ $4, in1, in1_h
- VPAND mask, in1_h, in1_h
- VPAND mask, in1, in1
- VPSHUFB in1_h, high_tbl, in1_h
- VPSHUFB in1, low_tbl, in1
- VPXOR in1, in1_h, in1
- VPXOR 32(out)(pos*1), in1, in1
- VMOVDQU in1, 32(out)(pos*1)
-
- VMOVDQU 64(in)(pos*1), in2
- VPSRLQ $4, in2, in2_h
- VPAND mask, in2_h, in2_h
- VPAND mask, in2, in2
- VPSHUFB in2_h, high_tbl, in2_h
- VPSHUFB in2, low_tbl, in2
- VPXOR in2, in2_h, in2
- VPXOR 64(out)(pos*1), in2, in2
- VMOVDQU in2, 64(out)(pos*1)
-
- VMOVDQU 96(in)(pos*1), in3
- VPSRLQ $4, in3, in3_h
- VPAND mask, in3_h, in3_h
- VPAND mask, in3, in3
- VPSHUFB in3_h, high_tbl, in3_h
- VPSHUFB in3, low_tbl, in3
- VPXOR in3, in3_h, in3
- VPXOR 96(out)(pos*1), in3, in3
- VMOVDQU in3, 96(out)(pos*1)
-
- VMOVDQU 128(in)(pos*1), in4
- VPSRLQ $4, in4, in4_h
- VPAND mask, in4_h, in4_h
- VPAND mask, in4, in4
- VPSHUFB in4_h, high_tbl, in4_h
- VPSHUFB in4, low_tbl, in4
- VPXOR in4, in4_h, in4
- VPXOR 128(out)(pos*1), in4, in4
- VMOVDQU in4, 128(out)(pos*1)
-
- VMOVDQU 160(in)(pos*1), in5
- VPSRLQ $4, in5, in5_h
- VPAND mask, in5_h, in5_h
- VPAND mask, in5, in5
- VPSHUFB in5_h, high_tbl, in5_h
- VPSHUFB in5, low_tbl, in5
- VPXOR in5, in5_h, in5
- VPXOR 160(out)(pos*1), in5, in5
- VMOVDQU in5, 160(out)(pos*1)
-
- VMOVDQU 192(in)(pos*1), in0
- VPSRLQ $4, in0, in0_h
- VPAND mask, in0_h, in0_h
- VPAND mask, in0, in0
- VPSHUFB in0_h, high_tbl, in0_h
- VPSHUFB in0, low_tbl, in0
- VPXOR in0, in0_h, in0
- VPXOR 192(out)(pos*1), in0, in0
- VMOVDQU in0, 192(out)(pos*1)
-
- VMOVDQU 224(in)(pos*1), in1
- VPSRLQ $4, in1, in1_h
- VPAND mask, in1_h, in1_h
- VPAND mask, in1, in1
- VPSHUFB in1_h, high_tbl, in1_h
- VPSHUFB in1, low_tbl, in1
- VPXOR in1, in1_h, in1
- VPXOR 224(out)(pos*1), in1, in1
- VMOVDQU in1, 224(out)(pos*1)
-
- ADDQ $256, pos
- CMPQ len, pos
- JNE loop256b
- VZEROUPPER
- RET
-
-not_aligned:
- MOVQ len, tmp0
- ANDQ $255, tmp0
-
-loop32b:
- VMOVDQU -32(in)(len*1), in0
- VPSRLQ $4, in0, in0_h
- VPAND mask, in0_h, in0_h
- VPAND mask, in0, in0
- VPSHUFB in0_h, high_tbl, in0_h
- VPSHUFB in0, low_tbl, in0
- VPXOR in0, in0_h, in0
- VPXOR -32(out)(len*1), in0, in0
- VMOVDQU in0, -32(out)(len*1)
- SUBQ $32, len
- SUBQ $32, tmp0
- JG loop32b
- CMPQ len, $256
- JGE aligned
- VZEROUPPER
- RET
-
-one16b:
- VMOVDQU -16(in)(len*1), in0x
- VPSRLQ $4, in0x, in0_hx
- VPAND maskx, in0x, in0x
- VPAND maskx, in0_hx, in0_hx
- VPSHUFB in0_hx, high_tblx, in0_hx
- VPSHUFB in0x, low_tblx, in0x
- VPXOR in0x, in0_hx, in0x
- VPXOR -16(out)(len*1), in0x, in0x
- VMOVDQU in0x, -16(out)(len*1)
- SUBQ $16, len
- CMPQ len, $0
- JNE ymm
- RET
-
-// func mulVectSSSE3(tbl, d, p []byte)
-TEXT ·mulVectSSSE3(SB), NOSPLIT, $0
- MOVQ i+24(FP), in
- MOVQ o+48(FP), out
- MOVQ tbl+0(FP), tmp0
- MOVOU (tmp0), low_tblx
- MOVOU 16(tmp0), high_tblx
- MOVB $15, tmp0
- MOVQ tmp0, maskx
- PXOR tmp0x, tmp0x
- PSHUFB tmp0x, maskx
- MOVQ in_len+32(FP), len
- SHRQ $4, len
-
-loop:
- MOVOU (in), in0x
- MOVOU in0x, in0_hx
- PSRLQ $4, in0_hx
- PAND maskx, in0x
- PAND maskx, in0_hx
- MOVOU low_tblx, tmp1x
- MOVOU high_tblx, tmp2x
- PSHUFB in0x, tmp1x
- PSHUFB in0_hx, tmp2x
- PXOR tmp1x, tmp2x
- MOVOU tmp2x, (out)
- ADDQ $16, in
- ADDQ $16, out
- SUBQ $1, len
- JNZ loop
- RET
-
-// func mulVectAddSSSE3(tbl, d, p []byte)
-TEXT ·mulVectAddSSSE3(SB), NOSPLIT, $0
- MOVQ i+24(FP), in
- MOVQ o+48(FP), out
- MOVQ tbl+0(FP), tmp0
- MOVOU (tmp0), low_tblx
- MOVOU 16(tmp0), high_tblx
- MOVB $15, tmp0
- MOVQ tmp0, maskx
- PXOR tmp0x, tmp0x
- PSHUFB tmp0x, maskx
- MOVQ in_len+32(FP), len
- SHRQ $4, len
-
-loop:
- MOVOU (in), in0x
- MOVOU in0x, in0_hx
- PSRLQ $4, in0_hx
- PAND maskx, in0x
- PAND maskx, in0_hx
- MOVOU low_tblx, tmp1x
- MOVOU high_tblx, tmp2x
- PSHUFB in0x, tmp1x
- PSHUFB in0_hx, tmp2x
- PXOR tmp1x, tmp2x
- MOVOU (out), tmp3x
- PXOR tmp3x, tmp2x
- MOVOU tmp2x, (out)
- ADDQ $16, in
- ADDQ $16, out
- SUBQ $1, len
- JNZ loop
- RET
-
-// func copy32B(dst, src []byte)
-TEXT ·copy32B(SB), NOSPLIT, $0
- MOVQ dst+0(FP), SI
- MOVQ src+24(FP), DX
- MOVOU (DX), X0
- MOVOU 16(DX), X1
- MOVOU X0, (SI)
- MOVOU X1, 16(SI)
- RET
-
diff --git a/vendor/github.com/templexxx/reedsolomon/rs_other.go b/vendor/github.com/templexxx/reedsolomon/rs_other.go
deleted file mode 100644
index 0e39120..0000000
--- a/vendor/github.com/templexxx/reedsolomon/rs_other.go
+++ /dev/null
@@ -1,8 +0,0 @@
-// +build !amd64
-
-package reedsolomon
-
-func newRS(d, p int, em matrix) (enc Encoder) {
- g := em[d*d:]
- return &encBase{data: d, parity: p, encode: em, gen: g}
-}
diff --git a/vendor/github.com/templexxx/reedsolomon/rs_test.go b/vendor/github.com/templexxx/reedsolomon/rs_test.go
deleted file mode 100644
index dd1e1e1..0000000
--- a/vendor/github.com/templexxx/reedsolomon/rs_test.go
+++ /dev/null
@@ -1,309 +0,0 @@
-package reedsolomon
-
-import (
- "bytes"
- "fmt"
- "math/rand"
- "testing"
-)
-
-const (
- kb = 1024
- mb = 1024 * 1024
- testNumIn = 10
- testNumOut = 4
-)
-
-const verifySize = 256 + 32 + 16 + 15
-
-func TestVerifyEncBase(t *testing.T) {
- d := 5
- p := 5
- vects := [][]byte{
- {0, 1},
- {4, 5},
- {2, 3},
- {6, 7},
- {8, 9},
- {0, 0},
- {0, 0},
- {0, 0},
- {0, 0},
- {0, 0},
- }
- em, err := genEncMatrixVand(d, p)
- if err != nil {
- t.Fatal(err)
- }
- g := em[d*d:]
- e := &encBase{data: d, parity: p, gen: g}
- err = e.Encode(vects)
- if err != nil {
- t.Fatal(err)
- }
- if vects[5][0] != 12 || vects[5][1] != 13 {
- t.Fatal("vect 5 mismatch")
- }
- if vects[6][0] != 10 || vects[6][1] != 11 {
- t.Fatal("vect 6 mismatch")
- }
- if vects[7][0] != 14 || vects[7][1] != 15 {
- t.Fatal("vect 7 mismatch")
- }
- if vects[8][0] != 90 || vects[8][1] != 91 {
- t.Fatal("vect 8 mismatch")
- }
- if vects[9][0] != 94 || vects[9][1] != 95 {
- t.Fatal("shard 9 mismatch")
- }
-}
-
-func fillRandom(v []byte) {
- for i := 0; i < len(v); i += 7 {
- val := rand.Int63()
- for j := 0; i+j < len(v) && j < 7; j++ {
- v[i+j] = byte(val)
- val >>= 8
- }
- }
-}
-
-func verifyEnc(t *testing.T, d, p int) {
- for i := 1; i <= verifySize; i++ {
- vects1 := make([][]byte, d+p)
- vects2 := make([][]byte, d+p)
- for j := 0; j < d+p; j++ {
- vects1[j] = make([]byte, i)
- vects2[j] = make([]byte, i)
- }
- for j := 0; j < d; j++ {
- rand.Seed(int64(j))
- fillRandom(vects1[j])
- copy(vects2[j], vects1[j])
- }
- e, err := New(d, p)
- if err != nil {
- t.Fatal(err)
- }
- err = e.Encode(vects1)
- if err != nil {
- t.Fatal(err)
- }
- em, err := genEncMatrixVand(d, p)
- if err != nil {
- t.Fatal(err)
- }
- g := em[d*d:]
- e2 := &encBase{data: d, parity: p, gen: g}
- err = e2.Encode(vects2)
- for k, v1 := range vects1 {
- if !bytes.Equal(v1, vects2[k]) {
- t.Fatalf("no match enc with encBase; vect: %d; size: %d", k, i)
- }
- }
- }
-}
-
-func TestVerifyEnc(t *testing.T) {
- verifyEnc(t, testNumIn, testNumOut)
-}
-
-func verifyReconst(t *testing.T, d, p int, lost []int) {
- for i := 1; i <= verifySize; i++ {
- vects1 := make([][]byte, d+p)
- vects2 := make([][]byte, d+p)
- for j := 0; j < d+p; j++ {
- vects1[j] = make([]byte, i)
- vects2[j] = make([]byte, i)
- }
- for j := 0; j < d; j++ {
- rand.Seed(int64(j))
- fillRandom(vects1[j])
- }
- e, err := New(d, p)
- if err != nil {
- t.Fatal(err)
- }
- err = e.Encode(vects1)
- if err != nil {
- t.Fatal(err)
- }
- for j := 0; j < d+p; j++ {
- copy(vects2[j], vects1[j])
- }
- for _, i := range lost {
- vects2[i] = nil
- }
- err = e.Reconstruct(vects2)
- if err != nil {
- t.Fatal(err)
- }
- for k, v1 := range vects1 {
- if !bytes.Equal(v1, vects2[k]) {
- t.Fatalf("no match reconst; vect: %d; size: %d", k, i)
- }
- }
- }
-}
-
-func TestVerifyReconst(t *testing.T) {
- lost := []int{0, 11, 3, 4}
- verifyReconst(t, testNumIn, testNumOut, lost)
-}
-
-func benchEnc(b *testing.B, d, p, size int) {
- vects := make([][]byte, d+p)
- for j := 0; j < d+p; j++ {
- vects[j] = make([]byte, size)
- }
- for j := 0; j < d; j++ {
- rand.Seed(int64(j))
- fillRandom(vects[j])
- }
- e, err := New(d, p)
- if err != nil {
- b.Fatal(err)
- }
- err = e.Encode(vects)
- if err != nil {
- b.Fatal(err)
- }
- b.SetBytes(int64(d * size))
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
- err = e.Encode(vects)
- if err != nil {
- b.Fatal(err)
- }
- }
-}
-
-func benchEncRun(f func(*testing.B, int, int, int), d, p int, size []int) func(*testing.B) {
- return func(b *testing.B) {
- for _, s := range size {
- b.Run(fmt.Sprintf("%d+%d_%d", d, p, s), func(b *testing.B) {
- f(b, d, p, s)
- })
- }
- }
-}
-
-func BenchmarkEnc(b *testing.B) {
- s1 := []int{1350}
- b.Run("", benchEncRun(benchEnc, 10, 3, s1))
- s2 := []int{1400, 4 * kb, 64 * kb, mb, 16 * mb}
- b.Run("", benchEncRun(benchEnc, testNumIn, testNumOut, s2))
-}
-
-func benchReconst(b *testing.B, d, p, size int, lost []int) {
- vects := make([][]byte, d+p)
- for j := 0; j < d+p; j++ {
- vects[j] = make([]byte, size)
- }
- for j := 0; j < d; j++ {
- rand.Seed(int64(j))
- fillRandom(vects[j])
- }
- e, err := New(d, p)
- if err != nil {
- b.Fatal(err)
- }
- err = e.Encode(vects)
- if err != nil {
- b.Fatal(err)
- }
- for _, i := range lost {
- vects[i] = nil
- }
- err = e.Reconstruct(vects)
- if err != nil {
- b.Fatal(err)
- }
- b.SetBytes(int64(d * size))
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
- for _, i := range lost {
- vects[i] = nil
- }
- err = e.Reconstruct(vects)
- if err != nil {
- b.Fatal(err)
- }
- }
-}
-
-func benchReconstRun(f func(*testing.B, int, int, int, []int), d, p int, size, lost []int) func(*testing.B) {
- return func(b *testing.B) {
- for _, s := range size {
- b.Run(fmt.Sprintf("%d+%d_%d", d, p, s), func(b *testing.B) {
- f(b, d, p, s, lost)
- })
- }
- }
-}
-
-// Reconstruct p vects
-func BenchmarkReconst(b *testing.B) {
- l1 := []int{2, 4, 5}
- s1 := []int{1350}
- b.Run("", benchReconstRun(benchReconst, 10, 3, s1, l1))
- l2 := []int{2, 4, 7, 9}
- s2 := []int{1400, 4 * kb, 64 * kb, mb, 16 * mb}
- b.Run("", benchReconstRun(benchReconst, testNumIn, testNumOut, s2, l2))
-}
-
-func benchReconstPos(b *testing.B, d, p, size int, has, dLost, pLost []int) {
- vects := make([][]byte, d+p)
- for j := 0; j < d+p; j++ {
- vects[j] = make([]byte, size)
- }
- for j := 0; j < d; j++ {
- rand.Seed(int64(j))
- fillRandom(vects[j])
- }
- e, err := New(d, p)
- if err != nil {
- b.Fatal(err)
- }
- err = e.Encode(vects)
- if err != nil {
- b.Fatal(err)
- }
- err = e.ReconstWithPos(vects, has, dLost, pLost)
- if err != nil {
- b.Fatal(err)
- }
- b.SetBytes(int64(d * size))
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
- err = e.ReconstWithPos(vects, has, dLost, pLost)
- if err != nil {
- b.Fatal(err)
- }
- }
-}
-
-func benchReconstPosRun(f func(*testing.B, int, int, int, []int, []int, []int), d, p int, size,
- has, dLost, pLost []int) func(*testing.B) {
- return func(b *testing.B) {
- for _, s := range size {
- b.Run(fmt.Sprintf("%dx%d_%d", d, p, s), func(b *testing.B) {
- f(b, d, p, s, has, dLost, pLost)
- })
- }
- }
-}
-
-// Reconstruct p vects with position
-func BenchmarkReconstWithPos(b *testing.B) {
- h1 := []int{0, 1, 3, 6, 7, 8, 9, 10, 11, 12}
- d1 := []int{2, 4, 5}
- p1 := []int{}
- s1 := []int{1350}
- b.Run("", benchReconstPosRun(benchReconstPos, 10, 3, s1, h1, d1, p1))
- h2 := []int{0, 1, 3, 5, 6, 8, 10, 11, 12, 13}
- d2 := []int{2, 4, 7, 9}
- p2 := []int{}
- s2 := []int{1400, 4 * kb, 64 * kb, mb, 16 * mb}
- b.Run("", benchReconstPosRun(benchReconstPos, testNumIn, testNumOut, s2, h2, d2, p2))
-}
diff --git a/vendor/github.com/templexxx/reedsolomon/tbl.go b/vendor/github.com/templexxx/reedsolomon/tbl.go
deleted file mode 100644
index 4af543a..0000000
--- a/vendor/github.com/templexxx/reedsolomon/tbl.go
+++ /dev/null
@@ -1,44 +0,0 @@
-package reedsolomon
-
-var logTbl = [256]byte{
- 0, 0, 1, 25, 2, 50, 26, 198,
- 3, 223, 51, 238, 27, 104, 199, 75,
- 4, 100, 224, 14, 52, 141, 239, 129,
- 28, 193, 105, 248, 200, 8, 76, 113,
- 5, 138, 101, 47, 225, 36, 15, 33,
- 53, 147, 142, 218, 240, 18, 130, 69,
- 29, 181, 194, 125, 106, 39, 249, 185,
- 201, 154, 9, 120, 77, 228, 114, 166,
- 6, 191, 139, 98, 102, 221, 48, 253,
- 226, 152, 37, 179, 16, 145, 34, 136,
- 54, 208, 148, 206, 143, 150, 219, 189,
- 241, 210, 19, 92, 131, 56, 70, 64,
- 30, 66, 182, 163, 195, 72, 126, 110,
- 107, 58, 40, 84, 250, 133, 186, 61,
- 202, 94, 155, 159, 10, 21, 121, 43,
- 78, 212, 229, 172, 115, 243, 167, 87,
- 7, 112, 192, 247, 140, 128, 99, 13,
- 103, 74, 222, 237, 49, 197, 254, 24,
- 227, 165, 153, 119, 38, 184, 180, 124,
- 17, 68, 146, 217, 35, 32, 137, 46,
- 55, 63, 209, 91, 149, 188, 207, 205,
- 144, 135, 151, 178, 220, 252, 190, 97,
- 242, 86, 211, 171, 20, 42, 93, 158,
- 132, 60, 57, 83, 71, 109, 65, 162,
- 31, 45, 67, 216, 183, 123, 164, 118,
- 196, 23, 73, 236, 127, 12, 111, 246,
- 108, 161, 59, 82, 41, 157, 85, 170,
- 251, 96, 134, 177, 187, 204, 62, 90,
- 203, 89, 95, 176, 156, 169, 160, 81,
- 11, 245, 22, 235, 122, 117, 44, 215,
- 79, 174, 213, 233, 230, 231, 173, 232,
- 116, 214, 244, 234, 168, 80, 88, 175,
-}
-
-var expTbl = []byte{0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26, 0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9, 0x8f, 0x3, 0x6, 0xc, 0x18, 0x30, 0x60, 0xc0, 0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23, 0x46, 0x8c, 0x5, 0xa, 0x14, 0x28, 0x50, 0xa0, 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1, 0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc, 0x65, 0xca, 0x89, 0xf, 0x1e, 0x3c, 0x78, 0xf0, 0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2, 0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88, 0xd, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce, 0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc, 0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54, 0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa, 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73, 0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff, 0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4, 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41, 0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x7, 0xe, 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6, 0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x9, 0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5, 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0xb, 0x16, 0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26, 0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9, 0x8f, 0x3, 0x6, 0xc, 0x18, 0x30, 0x60, 0xc0, 0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23, 0x46, 0x8c, 0x5, 0xa, 0x14, 0x28, 0x50, 0xa0, 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1, 0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc, 0x65, 0xca, 0x89, 0xf, 0x1e, 0x3c, 0x78, 0xf0, 0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2, 0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88, 0xd, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce, 0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc, 0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54, 0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa, 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73, 0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff, 0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4, 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41, 0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x7, 0xe, 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6, 0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x9, 0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5, 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0xb, 0x16, 0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e}
-
-var inverseTbl = [256]byte{0x0, 0x1, 0x8e, 0xf4, 0x47, 0xa7, 0x7a, 0xba, 0xad, 0x9d, 0xdd, 0x98, 0x3d, 0xaa, 0x5d, 0x96, 0xd8, 0x72, 0xc0, 0x58, 0xe0, 0x3e, 0x4c, 0x66, 0x90, 0xde, 0x55, 0x80, 0xa0, 0x83, 0x4b, 0x2a, 0x6c, 0xed, 0x39, 0x51, 0x60, 0x56, 0x2c, 0x8a, 0x70, 0xd0, 0x1f, 0x4a, 0x26, 0x8b, 0x33, 0x6e, 0x48, 0x89, 0x6f, 0x2e, 0xa4, 0xc3, 0x40, 0x5e, 0x50, 0x22, 0xcf, 0xa9, 0xab, 0xc, 0x15, 0xe1, 0x36, 0x5f, 0xf8, 0xd5, 0x92, 0x4e, 0xa6, 0x4, 0x30, 0x88, 0x2b, 0x1e, 0x16, 0x67, 0x45, 0x93, 0x38, 0x23, 0x68, 0x8c, 0x81, 0x1a, 0x25, 0x61, 0x13, 0xc1, 0xcb, 0x63, 0x97, 0xe, 0x37, 0x41, 0x24, 0x57, 0xca, 0x5b, 0xb9, 0xc4, 0x17, 0x4d, 0x52, 0x8d, 0xef, 0xb3, 0x20, 0xec, 0x2f, 0x32, 0x28, 0xd1, 0x11, 0xd9, 0xe9, 0xfb, 0xda, 0x79, 0xdb, 0x77, 0x6, 0xbb, 0x84, 0xcd, 0xfe, 0xfc, 0x1b, 0x54, 0xa1, 0x1d, 0x7c, 0xcc, 0xe4, 0xb0, 0x49, 0x31, 0x27, 0x2d, 0x53, 0x69, 0x2, 0xf5, 0x18, 0xdf, 0x44, 0x4f, 0x9b, 0xbc, 0xf, 0x5c, 0xb, 0xdc, 0xbd, 0x94, 0xac, 0x9, 0xc7, 0xa2, 0x1c, 0x82, 0x9f, 0xc6, 0x34, 0xc2, 0x46, 0x5, 0xce, 0x3b, 0xd, 0x3c, 0x9c, 0x8, 0xbe, 0xb7, 0x87, 0xe5, 0xee, 0x6b, 0xeb, 0xf2, 0xbf, 0xaf, 0xc5, 0x64, 0x7, 0x7b, 0x95, 0x9a, 0xae, 0xb6, 0x12, 0x59, 0xa5, 0x35, 0x65, 0xb8, 0xa3, 0x9e, 0xd2, 0xf7, 0x62, 0x5a, 0x85, 0x7d, 0xa8, 0x3a, 0x29, 0x71, 0xc8, 0xf6, 0xf9, 0x43, 0xd7, 0xd6, 0x10, 0x73, 0x76, 0x78, 0x99, 0xa, 0x19, 0x91, 0x14, 0x3f, 0xe6, 0xf0, 0x86, 0xb1, 0xe2, 0xf1, 0xfa, 0x74, 0xf3, 0xb4, 0x6d, 0x21, 0xb2, 0x6a, 0xe3, 0xe7, 0xb5, 0xea, 0x3, 0x8f, 0xd3, 0xc9, 0x42, 0xd4, 0xe8, 0x75, 0x7f, 0xff, 0x7e, 0xfd}
-
-var mulTbl = [256][256]byte{[256]byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, [256]byte{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff}, [256]byte{0x0, 0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, 0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, 0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e, 0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, 0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0xfe, 0x1d, 0x1f, 0x19, 0x1b, 0x15, 0x17, 0x11, 0x13, 0xd, 0xf, 0x9, 0xb, 0x5, 0x7, 0x1, 0x3, 0x3d, 0x3f, 0x39, 0x3b, 0x35, 0x37, 0x31, 0x33, 0x2d, 0x2f, 0x29, 0x2b, 0x25, 0x27, 0x21, 0x23, 0x5d, 0x5f, 0x59, 0x5b, 0x55, 0x57, 0x51, 0x53, 0x4d, 0x4f, 0x49, 0x4b, 0x45, 0x47, 0x41, 0x43, 0x7d, 0x7f, 0x79, 0x7b, 0x75, 0x77, 0x71, 0x73, 0x6d, 0x6f, 0x69, 0x6b, 0x65, 0x67, 0x61, 0x63, 0x9d, 0x9f, 0x99, 0x9b, 0x95, 0x97, 0x91, 0x93, 0x8d, 0x8f, 0x89, 0x8b, 0x85, 0x87, 0x81, 0x83, 0xbd, 0xbf, 0xb9, 0xbb, 0xb5, 0xb7, 0xb1, 0xb3, 0xad, 0xaf, 0xa9, 0xab, 0xa5, 0xa7, 0xa1, 0xa3, 0xdd, 0xdf, 0xd9, 0xdb, 0xd5, 0xd7, 0xd1, 0xd3, 0xcd, 0xcf, 0xc9, 0xcb, 0xc5, 0xc7, 0xc1, 0xc3, 0xfd, 0xff, 0xf9, 0xfb, 0xf5, 0xf7, 0xf1, 0xf3, 0xed, 0xef, 0xe9, 0xeb, 0xe5, 0xe7, 0xe1, 0xe3}, [256]byte{0x0, 0x3, 0x6, 0x5, 0xc, 0xf, 0xa, 0x9, 0x18, 0x1b, 0x1e, 0x1d, 0x14, 0x17, 0x12, 0x11, 0x30, 0x33, 0x36, 0x35, 0x3c, 0x3f, 0x3a, 0x39, 0x28, 0x2b, 0x2e, 0x2d, 0x24, 0x27, 0x22, 0x21, 0x60, 0x63, 0x66, 0x65, 0x6c, 0x6f, 0x6a, 0x69, 0x78, 0x7b, 0x7e, 0x7d, 0x74, 0x77, 0x72, 0x71, 0x50, 0x53, 0x56, 0x55, 0x5c, 0x5f, 0x5a, 0x59, 0x48, 0x4b, 0x4e, 0x4d, 0x44, 0x47, 0x42, 0x41, 0xc0, 0xc3, 0xc6, 0xc5, 0xcc, 0xcf, 0xca, 0xc9, 0xd8, 0xdb, 0xde, 0xdd, 0xd4, 0xd7, 0xd2, 0xd1, 0xf0, 0xf3, 0xf6, 0xf5, 0xfc, 0xff, 0xfa, 0xf9, 0xe8, 0xeb, 0xee, 0xed, 0xe4, 0xe7, 0xe2, 0xe1, 0xa0, 0xa3, 0xa6, 0xa5, 0xac, 0xaf, 0xaa, 0xa9, 0xb8, 0xbb, 0xbe, 0xbd, 0xb4, 0xb7, 0xb2, 0xb1, 0x90, 0x93, 0x96, 0x95, 0x9c, 0x9f, 0x9a, 0x99, 0x88, 0x8b, 0x8e, 0x8d, 0x84, 0x87, 0x82, 0x81, 0x9d, 0x9e, 0x9b, 0x98, 0x91, 0x92, 0x97, 0x94, 0x85, 0x86, 0x83, 0x80, 0x89, 0x8a, 0x8f, 0x8c, 0xad, 0xae, 0xab, 0xa8, 0xa1, 0xa2, 0xa7, 0xa4, 0xb5, 0xb6, 0xb3, 0xb0, 0xb9, 0xba, 0xbf, 0xbc, 0xfd, 0xfe, 0xfb, 0xf8, 0xf1, 0xf2, 0xf7, 0xf4, 0xe5, 0xe6, 0xe3, 0xe0, 0xe9, 0xea, 0xef, 0xec, 0xcd, 0xce, 0xcb, 0xc8, 0xc1, 0xc2, 0xc7, 0xc4, 0xd5, 0xd6, 0xd3, 0xd0, 0xd9, 0xda, 0xdf, 0xdc, 0x5d, 0x5e, 0x5b, 0x58, 0x51, 0x52, 0x57, 0x54, 0x45, 0x46, 0x43, 0x40, 0x49, 0x4a, 0x4f, 0x4c, 0x6d, 0x6e, 0x6b, 0x68, 0x61, 0x62, 0x67, 0x64, 0x75, 0x76, 0x73, 0x70, 0x79, 0x7a, 0x7f, 0x7c, 0x3d, 0x3e, 0x3b, 0x38, 0x31, 0x32, 0x37, 0x34, 0x25, 0x26, 0x23, 0x20, 0x29, 0x2a, 0x2f, 0x2c, 0xd, 0xe, 0xb, 0x8, 0x1, 0x2, 0x7, 0x4, 0x15, 0x16, 0x13, 0x10, 0x19, 0x1a, 0x1f, 0x1c}, [256]byte{0x0, 0x4, 0x8, 0xc, 0x10, 0x14, 0x18, 0x1c, 0x20, 0x24, 0x28, 0x2c, 0x30, 0x34, 0x38, 0x3c, 0x40, 0x44, 0x48, 0x4c, 0x50, 0x54, 0x58, 0x5c, 0x60, 0x64, 0x68, 0x6c, 0x70, 0x74, 0x78, 0x7c, 0x80, 0x84, 0x88, 0x8c, 0x90, 0x94, 0x98, 0x9c, 0xa0, 0xa4, 0xa8, 0xac, 0xb0, 0xb4, 0xb8, 0xbc, 0xc0, 0xc4, 0xc8, 0xcc, 0xd0, 0xd4, 0xd8, 0xdc, 0xe0, 0xe4, 0xe8, 0xec, 0xf0, 0xf4, 0xf8, 0xfc, 0x1d, 0x19, 0x15, 0x11, 0xd, 0x9, 0x5, 0x1, 0x3d, 0x39, 0x35, 0x31, 0x2d, 0x29, 0x25, 0x21, 0x5d, 0x59, 0x55, 0x51, 0x4d, 0x49, 0x45, 0x41, 0x7d, 0x79, 0x75, 0x71, 0x6d, 0x69, 0x65, 0x61, 0x9d, 0x99, 0x95, 0x91, 0x8d, 0x89, 0x85, 0x81, 0xbd, 0xb9, 0xb5, 0xb1, 0xad, 0xa9, 0xa5, 0xa1, 0xdd, 0xd9, 0xd5, 0xd1, 0xcd, 0xc9, 0xc5, 0xc1, 0xfd, 0xf9, 0xf5, 0xf1, 0xed, 0xe9, 0xe5, 0xe1, 0x3a, 0x3e, 0x32, 0x36, 0x2a, 0x2e, 0x22, 0x26, 0x1a, 0x1e, 0x12, 0x16, 0xa, 0xe, 0x2, 0x6, 0x7a, 0x7e, 0x72, 0x76, 0x6a, 0x6e, 0x62, 0x66, 0x5a, 0x5e, 0x52, 0x56, 0x4a, 0x4e, 0x42, 0x46, 0xba, 0xbe, 0xb2, 0xb6, 0xaa, 0xae, 0xa2, 0xa6, 0x9a, 0x9e, 0x92, 0x96, 0x8a, 0x8e, 0x82, 0x86, 0xfa, 0xfe, 0xf2, 0xf6, 0xea, 0xee, 0xe2, 0xe6, 0xda, 0xde, 0xd2, 0xd6, 0xca, 0xce, 0xc2, 0xc6, 0x27, 0x23, 0x2f, 0x2b, 0x37, 0x33, 0x3f, 0x3b, 0x7, 0x3, 0xf, 0xb, 0x17, 0x13, 0x1f, 0x1b, 0x67, 0x63, 0x6f, 0x6b, 0x77, 0x73, 0x7f, 0x7b, 0x47, 0x43, 0x4f, 0x4b, 0x57, 0x53, 0x5f, 0x5b, 0xa7, 0xa3, 0xaf, 0xab, 0xb7, 0xb3, 0xbf, 0xbb, 0x87, 0x83, 0x8f, 0x8b, 0x97, 0x93, 0x9f, 0x9b, 0xe7, 0xe3, 0xef, 0xeb, 0xf7, 0xf3, 0xff, 0xfb, 0xc7, 0xc3, 0xcf, 0xcb, 0xd7, 0xd3, 0xdf, 0xdb}, [256]byte{0x0, 0x5, 0xa, 0xf, 0x14, 0x11, 0x1e, 0x1b, 0x28, 0x2d, 0x22, 0x27, 0x3c, 0x39, 0x36, 0x33, 0x50, 0x55, 0x5a, 0x5f, 0x44, 0x41, 0x4e, 0x4b, 0x78, 0x7d, 0x72, 0x77, 0x6c, 0x69, 0x66, 0x63, 0xa0, 0xa5, 0xaa, 0xaf, 0xb4, 0xb1, 0xbe, 0xbb, 0x88, 0x8d, 0x82, 0x87, 0x9c, 0x99, 0x96, 0x93, 0xf0, 0xf5, 0xfa, 0xff, 0xe4, 0xe1, 0xee, 0xeb, 0xd8, 0xdd, 0xd2, 0xd7, 0xcc, 0xc9, 0xc6, 0xc3, 0x5d, 0x58, 0x57, 0x52, 0x49, 0x4c, 0x43, 0x46, 0x75, 0x70, 0x7f, 0x7a, 0x61, 0x64, 0x6b, 0x6e, 0xd, 0x8, 0x7, 0x2, 0x19, 0x1c, 0x13, 0x16, 0x25, 0x20, 0x2f, 0x2a, 0x31, 0x34, 0x3b, 0x3e, 0xfd, 0xf8, 0xf7, 0xf2, 0xe9, 0xec, 0xe3, 0xe6, 0xd5, 0xd0, 0xdf, 0xda, 0xc1, 0xc4, 0xcb, 0xce, 0xad, 0xa8, 0xa7, 0xa2, 0xb9, 0xbc, 0xb3, 0xb6, 0x85, 0x80, 0x8f, 0x8a, 0x91, 0x94, 0x9b, 0x9e, 0xba, 0xbf, 0xb0, 0xb5, 0xae, 0xab, 0xa4, 0xa1, 0x92, 0x97, 0x98, 0x9d, 0x86, 0x83, 0x8c, 0x89, 0xea, 0xef, 0xe0, 0xe5, 0xfe, 0xfb, 0xf4, 0xf1, 0xc2, 0xc7, 0xc8, 0xcd, 0xd6, 0xd3, 0xdc, 0xd9, 0x1a, 0x1f, 0x10, 0x15, 0xe, 0xb, 0x4, 0x1, 0x32, 0x37, 0x38, 0x3d, 0x26, 0x23, 0x2c, 0x29, 0x4a, 0x4f, 0x40, 0x45, 0x5e, 0x5b, 0x54, 0x51, 0x62, 0x67, 0x68, 0x6d, 0x76, 0x73, 0x7c, 0x79, 0xe7, 0xe2, 0xed, 0xe8, 0xf3, 0xf6, 0xf9, 0xfc, 0xcf, 0xca, 0xc5, 0xc0, 0xdb, 0xde, 0xd1, 0xd4, 0xb7, 0xb2, 0xbd, 0xb8, 0xa3, 0xa6, 0xa9, 0xac, 0x9f, 0x9a, 0x95, 0x90, 0x8b, 0x8e, 0x81, 0x84, 0x47, 0x42, 0x4d, 0x48, 0x53, 0x56, 0x59, 0x5c, 0x6f, 0x6a, 0x65, 0x60, 0x7b, 0x7e, 0x71, 0x74, 0x17, 0x12, 0x1d, 0x18, 0x3, 0x6, 0x9, 0xc, 0x3f, 0x3a, 0x35, 0x30, 0x2b, 0x2e, 0x21, 0x24}, [256]byte{0x0, 0x6, 0xc, 0xa, 0x18, 0x1e, 0x14, 0x12, 0x30, 0x36, 0x3c, 0x3a, 0x28, 0x2e, 0x24, 0x22, 0x60, 0x66, 0x6c, 0x6a, 0x78, 0x7e, 0x74, 0x72, 0x50, 0x56, 0x5c, 0x5a, 0x48, 0x4e, 0x44, 0x42, 0xc0, 0xc6, 0xcc, 0xca, 0xd8, 0xde, 0xd4, 0xd2, 0xf0, 0xf6, 0xfc, 0xfa, 0xe8, 0xee, 0xe4, 0xe2, 0xa0, 0xa6, 0xac, 0xaa, 0xb8, 0xbe, 0xb4, 0xb2, 0x90, 0x96, 0x9c, 0x9a, 0x88, 0x8e, 0x84, 0x82, 0x9d, 0x9b, 0x91, 0x97, 0x85, 0x83, 0x89, 0x8f, 0xad, 0xab, 0xa1, 0xa7, 0xb5, 0xb3, 0xb9, 0xbf, 0xfd, 0xfb, 0xf1, 0xf7, 0xe5, 0xe3, 0xe9, 0xef, 0xcd, 0xcb, 0xc1, 0xc7, 0xd5, 0xd3, 0xd9, 0xdf, 0x5d, 0x5b, 0x51, 0x57, 0x45, 0x43, 0x49, 0x4f, 0x6d, 0x6b, 0x61, 0x67, 0x75, 0x73, 0x79, 0x7f, 0x3d, 0x3b, 0x31, 0x37, 0x25, 0x23, 0x29, 0x2f, 0xd, 0xb, 0x1, 0x7, 0x15, 0x13, 0x19, 0x1f, 0x27, 0x21, 0x2b, 0x2d, 0x3f, 0x39, 0x33, 0x35, 0x17, 0x11, 0x1b, 0x1d, 0xf, 0x9, 0x3, 0x5, 0x47, 0x41, 0x4b, 0x4d, 0x5f, 0x59, 0x53, 0x55, 0x77, 0x71, 0x7b, 0x7d, 0x6f, 0x69, 0x63, 0x65, 0xe7, 0xe1, 0xeb, 0xed, 0xff, 0xf9, 0xf3, 0xf5, 0xd7, 0xd1, 0xdb, 0xdd, 0xcf, 0xc9, 0xc3, 0xc5, 0x87, 0x81, 0x8b, 0x8d, 0x9f, 0x99, 0x93, 0x95, 0xb7, 0xb1, 0xbb, 0xbd, 0xaf, 0xa9, 0xa3, 0xa5, 0xba, 0xbc, 0xb6, 0xb0, 0xa2, 0xa4, 0xae, 0xa8, 0x8a, 0x8c, 0x86, 0x80, 0x92, 0x94, 0x9e, 0x98, 0xda, 0xdc, 0xd6, 0xd0, 0xc2, 0xc4, 0xce, 0xc8, 0xea, 0xec, 0xe6, 0xe0, 0xf2, 0xf4, 0xfe, 0xf8, 0x7a, 0x7c, 0x76, 0x70, 0x62, 0x64, 0x6e, 0x68, 0x4a, 0x4c, 0x46, 0x40, 0x52, 0x54, 0x5e, 0x58, 0x1a, 0x1c, 0x16, 0x10, 0x2, 0x4, 0xe, 0x8, 0x2a, 0x2c, 0x26, 0x20, 0x32, 0x34, 0x3e, 0x38}, [256]byte{0x0, 0x7, 0xe, 0x9, 0x1c, 0x1b, 0x12, 0x15, 0x38, 0x3f, 0x36, 0x31, 0x24, 0x23, 0x2a, 0x2d, 0x70, 0x77, 0x7e, 0x79, 0x6c, 0x6b, 0x62, 0x65, 0x48, 0x4f, 0x46, 0x41, 0x54, 0x53, 0x5a, 0x5d, 0xe0, 0xe7, 0xee, 0xe9, 0xfc, 0xfb, 0xf2, 0xf5, 0xd8, 0xdf, 0xd6, 0xd1, 0xc4, 0xc3, 0xca, 0xcd, 0x90, 0x97, 0x9e, 0x99, 0x8c, 0x8b, 0x82, 0x85, 0xa8, 0xaf, 0xa6, 0xa1, 0xb4, 0xb3, 0xba, 0xbd, 0xdd, 0xda, 0xd3, 0xd4, 0xc1, 0xc6, 0xcf, 0xc8, 0xe5, 0xe2, 0xeb, 0xec, 0xf9, 0xfe, 0xf7, 0xf0, 0xad, 0xaa, 0xa3, 0xa4, 0xb1, 0xb6, 0xbf, 0xb8, 0x95, 0x92, 0x9b, 0x9c, 0x89, 0x8e, 0x87, 0x80, 0x3d, 0x3a, 0x33, 0x34, 0x21, 0x26, 0x2f, 0x28, 0x5, 0x2, 0xb, 0xc, 0x19, 0x1e, 0x17, 0x10, 0x4d, 0x4a, 0x43, 0x44, 0x51, 0x56, 0x5f, 0x58, 0x75, 0x72, 0x7b, 0x7c, 0x69, 0x6e, 0x67, 0x60, 0xa7, 0xa0, 0xa9, 0xae, 0xbb, 0xbc, 0xb5, 0xb2, 0x9f, 0x98, 0x91, 0x96, 0x83, 0x84, 0x8d, 0x8a, 0xd7, 0xd0, 0xd9, 0xde, 0xcb, 0xcc, 0xc5, 0xc2, 0xef, 0xe8, 0xe1, 0xe6, 0xf3, 0xf4, 0xfd, 0xfa, 0x47, 0x40, 0x49, 0x4e, 0x5b, 0x5c, 0x55, 0x52, 0x7f, 0x78, 0x71, 0x76, 0x63, 0x64, 0x6d, 0x6a, 0x37, 0x30, 0x39, 0x3e, 0x2b, 0x2c, 0x25, 0x22, 0xf, 0x8, 0x1, 0x6, 0x13, 0x14, 0x1d, 0x1a, 0x7a, 0x7d, 0x74, 0x73, 0x66, 0x61, 0x68, 0x6f, 0x42, 0x45, 0x4c, 0x4b, 0x5e, 0x59, 0x50, 0x57, 0xa, 0xd, 0x4, 0x3, 0x16, 0x11, 0x18, 0x1f, 0x32, 0x35, 0x3c, 0x3b, 0x2e, 0x29, 0x20, 0x27, 0x9a, 0x9d, 0x94, 0x93, 0x86, 0x81, 0x88, 0x8f, 0xa2, 0xa5, 0xac, 0xab, 0xbe, 0xb9, 0xb0, 0xb7, 0xea, 0xed, 0xe4, 0xe3, 0xf6, 0xf1, 0xf8, 0xff, 0xd2, 0xd5, 0xdc, 0xdb, 0xce, 0xc9, 0xc0, 0xc7}, [256]byte{0x0, 0x8, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38, 0x40, 0x48, 0x50, 0x58, 0x60, 0x68, 0x70, 0x78, 0x80, 0x88, 0x90, 0x98, 0xa0, 0xa8, 0xb0, 0xb8, 0xc0, 0xc8, 0xd0, 0xd8, 0xe0, 0xe8, 0xf0, 0xf8, 0x1d, 0x15, 0xd, 0x5, 0x3d, 0x35, 0x2d, 0x25, 0x5d, 0x55, 0x4d, 0x45, 0x7d, 0x75, 0x6d, 0x65, 0x9d, 0x95, 0x8d, 0x85, 0xbd, 0xb5, 0xad, 0xa5, 0xdd, 0xd5, 0xcd, 0xc5, 0xfd, 0xf5, 0xed, 0xe5, 0x3a, 0x32, 0x2a, 0x22, 0x1a, 0x12, 0xa, 0x2, 0x7a, 0x72, 0x6a, 0x62, 0x5a, 0x52, 0x4a, 0x42, 0xba, 0xb2, 0xaa, 0xa2, 0x9a, 0x92, 0x8a, 0x82, 0xfa, 0xf2, 0xea, 0xe2, 0xda, 0xd2, 0xca, 0xc2, 0x27, 0x2f, 0x37, 0x3f, 0x7, 0xf, 0x17, 0x1f, 0x67, 0x6f, 0x77, 0x7f, 0x47, 0x4f, 0x57, 0x5f, 0xa7, 0xaf, 0xb7, 0xbf, 0x87, 0x8f, 0x97, 0x9f, 0xe7, 0xef, 0xf7, 0xff, 0xc7, 0xcf, 0xd7, 0xdf, 0x74, 0x7c, 0x64, 0x6c, 0x54, 0x5c, 0x44, 0x4c, 0x34, 0x3c, 0x24, 0x2c, 0x14, 0x1c, 0x4, 0xc, 0xf4, 0xfc, 0xe4, 0xec, 0xd4, 0xdc, 0xc4, 0xcc, 0xb4, 0xbc, 0xa4, 0xac, 0x94, 0x9c, 0x84, 0x8c, 0x69, 0x61, 0x79, 0x71, 0x49, 0x41, 0x59, 0x51, 0x29, 0x21, 0x39, 0x31, 0x9, 0x1, 0x19, 0x11, 0xe9, 0xe1, 0xf9, 0xf1, 0xc9, 0xc1, 0xd9, 0xd1, 0xa9, 0xa1, 0xb9, 0xb1, 0x89, 0x81, 0x99, 0x91, 0x4e, 0x46, 0x5e, 0x56, 0x6e, 0x66, 0x7e, 0x76, 0xe, 0x6, 0x1e, 0x16, 0x2e, 0x26, 0x3e, 0x36, 0xce, 0xc6, 0xde, 0xd6, 0xee, 0xe6, 0xfe, 0xf6, 0x8e, 0x86, 0x9e, 0x96, 0xae, 0xa6, 0xbe, 0xb6, 0x53, 0x5b, 0x43, 0x4b, 0x73, 0x7b, 0x63, 0x6b, 0x13, 0x1b, 0x3, 0xb, 0x33, 0x3b, 0x23, 0x2b, 0xd3, 0xdb, 0xc3, 0xcb, 0xf3, 0xfb, 0xe3, 0xeb, 0x93, 0x9b, 0x83, 0x8b, 0xb3, 0xbb, 0xa3, 0xab}, [256]byte{0x0, 0x9, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, 0x90, 0x99, 0x82, 0x8b, 0xb4, 0xbd, 0xa6, 0xaf, 0xd8, 0xd1, 0xca, 0xc3, 0xfc, 0xf5, 0xee, 0xe7, 0x3d, 0x34, 0x2f, 0x26, 0x19, 0x10, 0xb, 0x2, 0x75, 0x7c, 0x67, 0x6e, 0x51, 0x58, 0x43, 0x4a, 0xad, 0xa4, 0xbf, 0xb6, 0x89, 0x80, 0x9b, 0x92, 0xe5, 0xec, 0xf7, 0xfe, 0xc1, 0xc8, 0xd3, 0xda, 0x7a, 0x73, 0x68, 0x61, 0x5e, 0x57, 0x4c, 0x45, 0x32, 0x3b, 0x20, 0x29, 0x16, 0x1f, 0x4, 0xd, 0xea, 0xe3, 0xf8, 0xf1, 0xce, 0xc7, 0xdc, 0xd5, 0xa2, 0xab, 0xb0, 0xb9, 0x86, 0x8f, 0x94, 0x9d, 0x47, 0x4e, 0x55, 0x5c, 0x63, 0x6a, 0x71, 0x78, 0xf, 0x6, 0x1d, 0x14, 0x2b, 0x22, 0x39, 0x30, 0xd7, 0xde, 0xc5, 0xcc, 0xf3, 0xfa, 0xe1, 0xe8, 0x9f, 0x96, 0x8d, 0x84, 0xbb, 0xb2, 0xa9, 0xa0, 0xf4, 0xfd, 0xe6, 0xef, 0xd0, 0xd9, 0xc2, 0xcb, 0xbc, 0xb5, 0xae, 0xa7, 0x98, 0x91, 0x8a, 0x83, 0x64, 0x6d, 0x76, 0x7f, 0x40, 0x49, 0x52, 0x5b, 0x2c, 0x25, 0x3e, 0x37, 0x8, 0x1, 0x1a, 0x13, 0xc9, 0xc0, 0xdb, 0xd2, 0xed, 0xe4, 0xff, 0xf6, 0x81, 0x88, 0x93, 0x9a, 0xa5, 0xac, 0xb7, 0xbe, 0x59, 0x50, 0x4b, 0x42, 0x7d, 0x74, 0x6f, 0x66, 0x11, 0x18, 0x3, 0xa, 0x35, 0x3c, 0x27, 0x2e, 0x8e, 0x87, 0x9c, 0x95, 0xaa, 0xa3, 0xb8, 0xb1, 0xc6, 0xcf, 0xd4, 0xdd, 0xe2, 0xeb, 0xf0, 0xf9, 0x1e, 0x17, 0xc, 0x5, 0x3a, 0x33, 0x28, 0x21, 0x56, 0x5f, 0x44, 0x4d, 0x72, 0x7b, 0x60, 0x69, 0xb3, 0xba, 0xa1, 0xa8, 0x97, 0x9e, 0x85, 0x8c, 0xfb, 0xf2, 0xe9, 0xe0, 0xdf, 0xd6, 0xcd, 0xc4, 0x23, 0x2a, 0x31, 0x38, 0x7, 0xe, 0x15, 0x1c, 0x6b, 0x62, 0x79, 0x70, 0x4f, 0x46, 0x5d, 0x54}, [256]byte{0x0, 0xa, 0x14, 0x1e, 0x28, 0x22, 0x3c, 0x36, 0x50, 0x5a, 0x44, 0x4e, 0x78, 0x72, 0x6c, 0x66, 0xa0, 0xaa, 0xb4, 0xbe, 0x88, 0x82, 0x9c, 0x96, 0xf0, 0xfa, 0xe4, 0xee, 0xd8, 0xd2, 0xcc, 0xc6, 0x5d, 0x57, 0x49, 0x43, 0x75, 0x7f, 0x61, 0x6b, 0xd, 0x7, 0x19, 0x13, 0x25, 0x2f, 0x31, 0x3b, 0xfd, 0xf7, 0xe9, 0xe3, 0xd5, 0xdf, 0xc1, 0xcb, 0xad, 0xa7, 0xb9, 0xb3, 0x85, 0x8f, 0x91, 0x9b, 0xba, 0xb0, 0xae, 0xa4, 0x92, 0x98, 0x86, 0x8c, 0xea, 0xe0, 0xfe, 0xf4, 0xc2, 0xc8, 0xd6, 0xdc, 0x1a, 0x10, 0xe, 0x4, 0x32, 0x38, 0x26, 0x2c, 0x4a, 0x40, 0x5e, 0x54, 0x62, 0x68, 0x76, 0x7c, 0xe7, 0xed, 0xf3, 0xf9, 0xcf, 0xc5, 0xdb, 0xd1, 0xb7, 0xbd, 0xa3, 0xa9, 0x9f, 0x95, 0x8b, 0x81, 0x47, 0x4d, 0x53, 0x59, 0x6f, 0x65, 0x7b, 0x71, 0x17, 0x1d, 0x3, 0x9, 0x3f, 0x35, 0x2b, 0x21, 0x69, 0x63, 0x7d, 0x77, 0x41, 0x4b, 0x55, 0x5f, 0x39, 0x33, 0x2d, 0x27, 0x11, 0x1b, 0x5, 0xf, 0xc9, 0xc3, 0xdd, 0xd7, 0xe1, 0xeb, 0xf5, 0xff, 0x99, 0x93, 0x8d, 0x87, 0xb1, 0xbb, 0xa5, 0xaf, 0x34, 0x3e, 0x20, 0x2a, 0x1c, 0x16, 0x8, 0x2, 0x64, 0x6e, 0x70, 0x7a, 0x4c, 0x46, 0x58, 0x52, 0x94, 0x9e, 0x80, 0x8a, 0xbc, 0xb6, 0xa8, 0xa2, 0xc4, 0xce, 0xd0, 0xda, 0xec, 0xe6, 0xf8, 0xf2, 0xd3, 0xd9, 0xc7, 0xcd, 0xfb, 0xf1, 0xef, 0xe5, 0x83, 0x89, 0x97, 0x9d, 0xab, 0xa1, 0xbf, 0xb5, 0x73, 0x79, 0x67, 0x6d, 0x5b, 0x51, 0x4f, 0x45, 0x23, 0x29, 0x37, 0x3d, 0xb, 0x1, 0x1f, 0x15, 0x8e, 0x84, 0x9a, 0x90, 0xa6, 0xac, 0xb2, 0xb8, 0xde, 0xd4, 0xca, 0xc0, 0xf6, 0xfc, 0xe2, 0xe8, 0x2e, 0x24, 0x3a, 0x30, 0x6, 0xc, 0x12, 0x18, 0x7e, 0x74, 0x6a, 0x60, 0x56, 0x5c, 0x42, 0x48}, [256]byte{0x0, 0xb, 0x16, 0x1d, 0x2c, 0x27, 0x3a, 0x31, 0x58, 0x53, 0x4e, 0x45, 0x74, 0x7f, 0x62, 0x69, 0xb0, 0xbb, 0xa6, 0xad, 0x9c, 0x97, 0x8a, 0x81, 0xe8, 0xe3, 0xfe, 0xf5, 0xc4, 0xcf, 0xd2, 0xd9, 0x7d, 0x76, 0x6b, 0x60, 0x51, 0x5a, 0x47, 0x4c, 0x25, 0x2e, 0x33, 0x38, 0x9, 0x2, 0x1f, 0x14, 0xcd, 0xc6, 0xdb, 0xd0, 0xe1, 0xea, 0xf7, 0xfc, 0x95, 0x9e, 0x83, 0x88, 0xb9, 0xb2, 0xaf, 0xa4, 0xfa, 0xf1, 0xec, 0xe7, 0xd6, 0xdd, 0xc0, 0xcb, 0xa2, 0xa9, 0xb4, 0xbf, 0x8e, 0x85, 0x98, 0x93, 0x4a, 0x41, 0x5c, 0x57, 0x66, 0x6d, 0x70, 0x7b, 0x12, 0x19, 0x4, 0xf, 0x3e, 0x35, 0x28, 0x23, 0x87, 0x8c, 0x91, 0x9a, 0xab, 0xa0, 0xbd, 0xb6, 0xdf, 0xd4, 0xc9, 0xc2, 0xf3, 0xf8, 0xe5, 0xee, 0x37, 0x3c, 0x21, 0x2a, 0x1b, 0x10, 0xd, 0x6, 0x6f, 0x64, 0x79, 0x72, 0x43, 0x48, 0x55, 0x5e, 0xe9, 0xe2, 0xff, 0xf4, 0xc5, 0xce, 0xd3, 0xd8, 0xb1, 0xba, 0xa7, 0xac, 0x9d, 0x96, 0x8b, 0x80, 0x59, 0x52, 0x4f, 0x44, 0x75, 0x7e, 0x63, 0x68, 0x1, 0xa, 0x17, 0x1c, 0x2d, 0x26, 0x3b, 0x30, 0x94, 0x9f, 0x82, 0x89, 0xb8, 0xb3, 0xae, 0xa5, 0xcc, 0xc7, 0xda, 0xd1, 0xe0, 0xeb, 0xf6, 0xfd, 0x24, 0x2f, 0x32, 0x39, 0x8, 0x3, 0x1e, 0x15, 0x7c, 0x77, 0x6a, 0x61, 0x50, 0x5b, 0x46, 0x4d, 0x13, 0x18, 0x5, 0xe, 0x3f, 0x34, 0x29, 0x22, 0x4b, 0x40, 0x5d, 0x56, 0x67, 0x6c, 0x71, 0x7a, 0xa3, 0xa8, 0xb5, 0xbe, 0x8f, 0x84, 0x99, 0x92, 0xfb, 0xf0, 0xed, 0xe6, 0xd7, 0xdc, 0xc1, 0xca, 0x6e, 0x65, 0x78, 0x73, 0x42, 0x49, 0x54, 0x5f, 0x36, 0x3d, 0x20, 0x2b, 0x1a, 0x11, 0xc, 0x7, 0xde, 0xd5, 0xc8, 0xc3, 0xf2, 0xf9, 0xe4, 0xef, 0x86, 0x8d, 0x90, 0x9b, 0xaa, 0xa1, 0xbc, 0xb7}, [256]byte{0x0, 0xc, 0x18, 0x14, 0x30, 0x3c, 0x28, 0x24, 0x60, 0x6c, 0x78, 0x74, 0x50, 0x5c, 0x48, 0x44, 0xc0, 0xcc, 0xd8, 0xd4, 0xf0, 0xfc, 0xe8, 0xe4, 0xa0, 0xac, 0xb8, 0xb4, 0x90, 0x9c, 0x88, 0x84, 0x9d, 0x91, 0x85, 0x89, 0xad, 0xa1, 0xb5, 0xb9, 0xfd, 0xf1, 0xe5, 0xe9, 0xcd, 0xc1, 0xd5, 0xd9, 0x5d, 0x51, 0x45, 0x49, 0x6d, 0x61, 0x75, 0x79, 0x3d, 0x31, 0x25, 0x29, 0xd, 0x1, 0x15, 0x19, 0x27, 0x2b, 0x3f, 0x33, 0x17, 0x1b, 0xf, 0x3, 0x47, 0x4b, 0x5f, 0x53, 0x77, 0x7b, 0x6f, 0x63, 0xe7, 0xeb, 0xff, 0xf3, 0xd7, 0xdb, 0xcf, 0xc3, 0x87, 0x8b, 0x9f, 0x93, 0xb7, 0xbb, 0xaf, 0xa3, 0xba, 0xb6, 0xa2, 0xae, 0x8a, 0x86, 0x92, 0x9e, 0xda, 0xd6, 0xc2, 0xce, 0xea, 0xe6, 0xf2, 0xfe, 0x7a, 0x76, 0x62, 0x6e, 0x4a, 0x46, 0x52, 0x5e, 0x1a, 0x16, 0x2, 0xe, 0x2a, 0x26, 0x32, 0x3e, 0x4e, 0x42, 0x56, 0x5a, 0x7e, 0x72, 0x66, 0x6a, 0x2e, 0x22, 0x36, 0x3a, 0x1e, 0x12, 0x6, 0xa, 0x8e, 0x82, 0x96, 0x9a, 0xbe, 0xb2, 0xa6, 0xaa, 0xee, 0xe2, 0xf6, 0xfa, 0xde, 0xd2, 0xc6, 0xca, 0xd3, 0xdf, 0xcb, 0xc7, 0xe3, 0xef, 0xfb, 0xf7, 0xb3, 0xbf, 0xab, 0xa7, 0x83, 0x8f, 0x9b, 0x97, 0x13, 0x1f, 0xb, 0x7, 0x23, 0x2f, 0x3b, 0x37, 0x73, 0x7f, 0x6b, 0x67, 0x43, 0x4f, 0x5b, 0x57, 0x69, 0x65, 0x71, 0x7d, 0x59, 0x55, 0x41, 0x4d, 0x9, 0x5, 0x11, 0x1d, 0x39, 0x35, 0x21, 0x2d, 0xa9, 0xa5, 0xb1, 0xbd, 0x99, 0x95, 0x81, 0x8d, 0xc9, 0xc5, 0xd1, 0xdd, 0xf9, 0xf5, 0xe1, 0xed, 0xf4, 0xf8, 0xec, 0xe0, 0xc4, 0xc8, 0xdc, 0xd0, 0x94, 0x98, 0x8c, 0x80, 0xa4, 0xa8, 0xbc, 0xb0, 0x34, 0x38, 0x2c, 0x20, 0x4, 0x8, 0x1c, 0x10, 0x54, 0x58, 0x4c, 0x40, 0x64, 0x68, 0x7c, 0x70}, [256]byte{0x0, 0xd, 0x1a, 0x17, 0x34, 0x39, 0x2e, 0x23, 0x68, 0x65, 0x72, 0x7f, 0x5c, 0x51, 0x46, 0x4b, 0xd0, 0xdd, 0xca, 0xc7, 0xe4, 0xe9, 0xfe, 0xf3, 0xb8, 0xb5, 0xa2, 0xaf, 0x8c, 0x81, 0x96, 0x9b, 0xbd, 0xb0, 0xa7, 0xaa, 0x89, 0x84, 0x93, 0x9e, 0xd5, 0xd8, 0xcf, 0xc2, 0xe1, 0xec, 0xfb, 0xf6, 0x6d, 0x60, 0x77, 0x7a, 0x59, 0x54, 0x43, 0x4e, 0x5, 0x8, 0x1f, 0x12, 0x31, 0x3c, 0x2b, 0x26, 0x67, 0x6a, 0x7d, 0x70, 0x53, 0x5e, 0x49, 0x44, 0xf, 0x2, 0x15, 0x18, 0x3b, 0x36, 0x21, 0x2c, 0xb7, 0xba, 0xad, 0xa0, 0x83, 0x8e, 0x99, 0x94, 0xdf, 0xd2, 0xc5, 0xc8, 0xeb, 0xe6, 0xf1, 0xfc, 0xda, 0xd7, 0xc0, 0xcd, 0xee, 0xe3, 0xf4, 0xf9, 0xb2, 0xbf, 0xa8, 0xa5, 0x86, 0x8b, 0x9c, 0x91, 0xa, 0x7, 0x10, 0x1d, 0x3e, 0x33, 0x24, 0x29, 0x62, 0x6f, 0x78, 0x75, 0x56, 0x5b, 0x4c, 0x41, 0xce, 0xc3, 0xd4, 0xd9, 0xfa, 0xf7, 0xe0, 0xed, 0xa6, 0xab, 0xbc, 0xb1, 0x92, 0x9f, 0x88, 0x85, 0x1e, 0x13, 0x4, 0x9, 0x2a, 0x27, 0x30, 0x3d, 0x76, 0x7b, 0x6c, 0x61, 0x42, 0x4f, 0x58, 0x55, 0x73, 0x7e, 0x69, 0x64, 0x47, 0x4a, 0x5d, 0x50, 0x1b, 0x16, 0x1, 0xc, 0x2f, 0x22, 0x35, 0x38, 0xa3, 0xae, 0xb9, 0xb4, 0x97, 0x9a, 0x8d, 0x80, 0xcb, 0xc6, 0xd1, 0xdc, 0xff, 0xf2, 0xe5, 0xe8, 0xa9, 0xa4, 0xb3, 0xbe, 0x9d, 0x90, 0x87, 0x8a, 0xc1, 0xcc, 0xdb, 0xd6, 0xf5, 0xf8, 0xef, 0xe2, 0x79, 0x74, 0x63, 0x6e, 0x4d, 0x40, 0x57, 0x5a, 0x11, 0x1c, 0xb, 0x6, 0x25, 0x28, 0x3f, 0x32, 0x14, 0x19, 0xe, 0x3, 0x20, 0x2d, 0x3a, 0x37, 0x7c, 0x71, 0x66, 0x6b, 0x48, 0x45, 0x52, 0x5f, 0xc4, 0xc9, 0xde, 0xd3, 0xf0, 0xfd, 0xea, 0xe7, 0xac, 0xa1, 0xb6, 0xbb, 0x98, 0x95, 0x82, 0x8f}, [256]byte{0x0, 0xe, 0x1c, 0x12, 0x38, 0x36, 0x24, 0x2a, 0x70, 0x7e, 0x6c, 0x62, 0x48, 0x46, 0x54, 0x5a, 0xe0, 0xee, 0xfc, 0xf2, 0xd8, 0xd6, 0xc4, 0xca, 0x90, 0x9e, 0x8c, 0x82, 0xa8, 0xa6, 0xb4, 0xba, 0xdd, 0xd3, 0xc1, 0xcf, 0xe5, 0xeb, 0xf9, 0xf7, 0xad, 0xa3, 0xb1, 0xbf, 0x95, 0x9b, 0x89, 0x87, 0x3d, 0x33, 0x21, 0x2f, 0x5, 0xb, 0x19, 0x17, 0x4d, 0x43, 0x51, 0x5f, 0x75, 0x7b, 0x69, 0x67, 0xa7, 0xa9, 0xbb, 0xb5, 0x9f, 0x91, 0x83, 0x8d, 0xd7, 0xd9, 0xcb, 0xc5, 0xef, 0xe1, 0xf3, 0xfd, 0x47, 0x49, 0x5b, 0x55, 0x7f, 0x71, 0x63, 0x6d, 0x37, 0x39, 0x2b, 0x25, 0xf, 0x1, 0x13, 0x1d, 0x7a, 0x74, 0x66, 0x68, 0x42, 0x4c, 0x5e, 0x50, 0xa, 0x4, 0x16, 0x18, 0x32, 0x3c, 0x2e, 0x20, 0x9a, 0x94, 0x86, 0x88, 0xa2, 0xac, 0xbe, 0xb0, 0xea, 0xe4, 0xf6, 0xf8, 0xd2, 0xdc, 0xce, 0xc0, 0x53, 0x5d, 0x4f, 0x41, 0x6b, 0x65, 0x77, 0x79, 0x23, 0x2d, 0x3f, 0x31, 0x1b, 0x15, 0x7, 0x9, 0xb3, 0xbd, 0xaf, 0xa1, 0x8b, 0x85, 0x97, 0x99, 0xc3, 0xcd, 0xdf, 0xd1, 0xfb, 0xf5, 0xe7, 0xe9, 0x8e, 0x80, 0x92, 0x9c, 0xb6, 0xb8, 0xaa, 0xa4, 0xfe, 0xf0, 0xe2, 0xec, 0xc6, 0xc8, 0xda, 0xd4, 0x6e, 0x60, 0x72, 0x7c, 0x56, 0x58, 0x4a, 0x44, 0x1e, 0x10, 0x2, 0xc, 0x26, 0x28, 0x3a, 0x34, 0xf4, 0xfa, 0xe8, 0xe6, 0xcc, 0xc2, 0xd0, 0xde, 0x84, 0x8a, 0x98, 0x96, 0xbc, 0xb2, 0xa0, 0xae, 0x14, 0x1a, 0x8, 0x6, 0x2c, 0x22, 0x30, 0x3e, 0x64, 0x6a, 0x78, 0x76, 0x5c, 0x52, 0x40, 0x4e, 0x29, 0x27, 0x35, 0x3b, 0x11, 0x1f, 0xd, 0x3, 0x59, 0x57, 0x45, 0x4b, 0x61, 0x6f, 0x7d, 0x73, 0xc9, 0xc7, 0xd5, 0xdb, 0xf1, 0xff, 0xed, 0xe3, 0xb9, 0xb7, 0xa5, 0xab, 0x81, 0x8f, 0x9d, 0x93}, [256]byte{0x0, 0xf, 0x1e, 0x11, 0x3c, 0x33, 0x22, 0x2d, 0x78, 0x77, 0x66, 0x69, 0x44, 0x4b, 0x5a, 0x55, 0xf0, 0xff, 0xee, 0xe1, 0xcc, 0xc3, 0xd2, 0xdd, 0x88, 0x87, 0x96, 0x99, 0xb4, 0xbb, 0xaa, 0xa5, 0xfd, 0xf2, 0xe3, 0xec, 0xc1, 0xce, 0xdf, 0xd0, 0x85, 0x8a, 0x9b, 0x94, 0xb9, 0xb6, 0xa7, 0xa8, 0xd, 0x2, 0x13, 0x1c, 0x31, 0x3e, 0x2f, 0x20, 0x75, 0x7a, 0x6b, 0x64, 0x49, 0x46, 0x57, 0x58, 0xe7, 0xe8, 0xf9, 0xf6, 0xdb, 0xd4, 0xc5, 0xca, 0x9f, 0x90, 0x81, 0x8e, 0xa3, 0xac, 0xbd, 0xb2, 0x17, 0x18, 0x9, 0x6, 0x2b, 0x24, 0x35, 0x3a, 0x6f, 0x60, 0x71, 0x7e, 0x53, 0x5c, 0x4d, 0x42, 0x1a, 0x15, 0x4, 0xb, 0x26, 0x29, 0x38, 0x37, 0x62, 0x6d, 0x7c, 0x73, 0x5e, 0x51, 0x40, 0x4f, 0xea, 0xe5, 0xf4, 0xfb, 0xd6, 0xd9, 0xc8, 0xc7, 0x92, 0x9d, 0x8c, 0x83, 0xae, 0xa1, 0xb0, 0xbf, 0xd3, 0xdc, 0xcd, 0xc2, 0xef, 0xe0, 0xf1, 0xfe, 0xab, 0xa4, 0xb5, 0xba, 0x97, 0x98, 0x89, 0x86, 0x23, 0x2c, 0x3d, 0x32, 0x1f, 0x10, 0x1, 0xe, 0x5b, 0x54, 0x45, 0x4a, 0x67, 0x68, 0x79, 0x76, 0x2e, 0x21, 0x30, 0x3f, 0x12, 0x1d, 0xc, 0x3, 0x56, 0x59, 0x48, 0x47, 0x6a, 0x65, 0x74, 0x7b, 0xde, 0xd1, 0xc0, 0xcf, 0xe2, 0xed, 0xfc, 0xf3, 0xa6, 0xa9, 0xb8, 0xb7, 0x9a, 0x95, 0x84, 0x8b, 0x34, 0x3b, 0x2a, 0x25, 0x8, 0x7, 0x16, 0x19, 0x4c, 0x43, 0x52, 0x5d, 0x70, 0x7f, 0x6e, 0x61, 0xc4, 0xcb, 0xda, 0xd5, 0xf8, 0xf7, 0xe6, 0xe9, 0xbc, 0xb3, 0xa2, 0xad, 0x80, 0x8f, 0x9e, 0x91, 0xc9, 0xc6, 0xd7, 0xd8, 0xf5, 0xfa, 0xeb, 0xe4, 0xb1, 0xbe, 0xaf, 0xa0, 0x8d, 0x82, 0x93, 0x9c, 0x39, 0x36, 0x27, 0x28, 0x5, 0xa, 0x1b, 0x14, 0x41, 0x4e, 0x5f, 0x50, 0x7d, 0x72, 0x63, 0x6c}, [256]byte{0x0, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0, 0x1d, 0xd, 0x3d, 0x2d, 0x5d, 0x4d, 0x7d, 0x6d, 0x9d, 0x8d, 0xbd, 0xad, 0xdd, 0xcd, 0xfd, 0xed, 0x3a, 0x2a, 0x1a, 0xa, 0x7a, 0x6a, 0x5a, 0x4a, 0xba, 0xaa, 0x9a, 0x8a, 0xfa, 0xea, 0xda, 0xca, 0x27, 0x37, 0x7, 0x17, 0x67, 0x77, 0x47, 0x57, 0xa7, 0xb7, 0x87, 0x97, 0xe7, 0xf7, 0xc7, 0xd7, 0x74, 0x64, 0x54, 0x44, 0x34, 0x24, 0x14, 0x4, 0xf4, 0xe4, 0xd4, 0xc4, 0xb4, 0xa4, 0x94, 0x84, 0x69, 0x79, 0x49, 0x59, 0x29, 0x39, 0x9, 0x19, 0xe9, 0xf9, 0xc9, 0xd9, 0xa9, 0xb9, 0x89, 0x99, 0x4e, 0x5e, 0x6e, 0x7e, 0xe, 0x1e, 0x2e, 0x3e, 0xce, 0xde, 0xee, 0xfe, 0x8e, 0x9e, 0xae, 0xbe, 0x53, 0x43, 0x73, 0x63, 0x13, 0x3, 0x33, 0x23, 0xd3, 0xc3, 0xf3, 0xe3, 0x93, 0x83, 0xb3, 0xa3, 0xe8, 0xf8, 0xc8, 0xd8, 0xa8, 0xb8, 0x88, 0x98, 0x68, 0x78, 0x48, 0x58, 0x28, 0x38, 0x8, 0x18, 0xf5, 0xe5, 0xd5, 0xc5, 0xb5, 0xa5, 0x95, 0x85, 0x75, 0x65, 0x55, 0x45, 0x35, 0x25, 0x15, 0x5, 0xd2, 0xc2, 0xf2, 0xe2, 0x92, 0x82, 0xb2, 0xa2, 0x52, 0x42, 0x72, 0x62, 0x12, 0x2, 0x32, 0x22, 0xcf, 0xdf, 0xef, 0xff, 0x8f, 0x9f, 0xaf, 0xbf, 0x4f, 0x5f, 0x6f, 0x7f, 0xf, 0x1f, 0x2f, 0x3f, 0x9c, 0x8c, 0xbc, 0xac, 0xdc, 0xcc, 0xfc, 0xec, 0x1c, 0xc, 0x3c, 0x2c, 0x5c, 0x4c, 0x7c, 0x6c, 0x81, 0x91, 0xa1, 0xb1, 0xc1, 0xd1, 0xe1, 0xf1, 0x1, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, 0xa6, 0xb6, 0x86, 0x96, 0xe6, 0xf6, 0xc6, 0xd6, 0x26, 0x36, 0x6, 0x16, 0x66, 0x76, 0x46, 0x56, 0xbb, 0xab, 0x9b, 0x8b, 0xfb, 0xeb, 0xdb, 0xcb, 0x3b, 0x2b, 0x1b, 0xb, 0x7b, 0x6b, 0x5b, 0x4b}, [256]byte{0x0, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0xd, 0x1c, 0x2f, 0x3e, 0x49, 0x58, 0x6b, 0x7a, 0x85, 0x94, 0xa7, 0xb6, 0xc1, 0xd0, 0xe3, 0xf2, 0x1a, 0xb, 0x38, 0x29, 0x5e, 0x4f, 0x7c, 0x6d, 0x92, 0x83, 0xb0, 0xa1, 0xd6, 0xc7, 0xf4, 0xe5, 0x17, 0x6, 0x35, 0x24, 0x53, 0x42, 0x71, 0x60, 0x9f, 0x8e, 0xbd, 0xac, 0xdb, 0xca, 0xf9, 0xe8, 0x34, 0x25, 0x16, 0x7, 0x70, 0x61, 0x52, 0x43, 0xbc, 0xad, 0x9e, 0x8f, 0xf8, 0xe9, 0xda, 0xcb, 0x39, 0x28, 0x1b, 0xa, 0x7d, 0x6c, 0x5f, 0x4e, 0xb1, 0xa0, 0x93, 0x82, 0xf5, 0xe4, 0xd7, 0xc6, 0x2e, 0x3f, 0xc, 0x1d, 0x6a, 0x7b, 0x48, 0x59, 0xa6, 0xb7, 0x84, 0x95, 0xe2, 0xf3, 0xc0, 0xd1, 0x23, 0x32, 0x1, 0x10, 0x67, 0x76, 0x45, 0x54, 0xab, 0xba, 0x89, 0x98, 0xef, 0xfe, 0xcd, 0xdc, 0x68, 0x79, 0x4a, 0x5b, 0x2c, 0x3d, 0xe, 0x1f, 0xe0, 0xf1, 0xc2, 0xd3, 0xa4, 0xb5, 0x86, 0x97, 0x65, 0x74, 0x47, 0x56, 0x21, 0x30, 0x3, 0x12, 0xed, 0xfc, 0xcf, 0xde, 0xa9, 0xb8, 0x8b, 0x9a, 0x72, 0x63, 0x50, 0x41, 0x36, 0x27, 0x14, 0x5, 0xfa, 0xeb, 0xd8, 0xc9, 0xbe, 0xaf, 0x9c, 0x8d, 0x7f, 0x6e, 0x5d, 0x4c, 0x3b, 0x2a, 0x19, 0x8, 0xf7, 0xe6, 0xd5, 0xc4, 0xb3, 0xa2, 0x91, 0x80, 0x5c, 0x4d, 0x7e, 0x6f, 0x18, 0x9, 0x3a, 0x2b, 0xd4, 0xc5, 0xf6, 0xe7, 0x90, 0x81, 0xb2, 0xa3, 0x51, 0x40, 0x73, 0x62, 0x15, 0x4, 0x37, 0x26, 0xd9, 0xc8, 0xfb, 0xea, 0x9d, 0x8c, 0xbf, 0xae, 0x46, 0x57, 0x64, 0x75, 0x2, 0x13, 0x20, 0x31, 0xce, 0xdf, 0xec, 0xfd, 0x8a, 0x9b, 0xa8, 0xb9, 0x4b, 0x5a, 0x69, 0x78, 0xf, 0x1e, 0x2d, 0x3c, 0xc3, 0xd2, 0xe1, 0xf0, 0x87, 0x96, 0xa5, 0xb4}, [256]byte{0x0, 0x12, 0x24, 0x36, 0x48, 0x5a, 0x6c, 0x7e, 0x90, 0x82, 0xb4, 0xa6, 0xd8, 0xca, 0xfc, 0xee, 0x3d, 0x2f, 0x19, 0xb, 0x75, 0x67, 0x51, 0x43, 0xad, 0xbf, 0x89, 0x9b, 0xe5, 0xf7, 0xc1, 0xd3, 0x7a, 0x68, 0x5e, 0x4c, 0x32, 0x20, 0x16, 0x4, 0xea, 0xf8, 0xce, 0xdc, 0xa2, 0xb0, 0x86, 0x94, 0x47, 0x55, 0x63, 0x71, 0xf, 0x1d, 0x2b, 0x39, 0xd7, 0xc5, 0xf3, 0xe1, 0x9f, 0x8d, 0xbb, 0xa9, 0xf4, 0xe6, 0xd0, 0xc2, 0xbc, 0xae, 0x98, 0x8a, 0x64, 0x76, 0x40, 0x52, 0x2c, 0x3e, 0x8, 0x1a, 0xc9, 0xdb, 0xed, 0xff, 0x81, 0x93, 0xa5, 0xb7, 0x59, 0x4b, 0x7d, 0x6f, 0x11, 0x3, 0x35, 0x27, 0x8e, 0x9c, 0xaa, 0xb8, 0xc6, 0xd4, 0xe2, 0xf0, 0x1e, 0xc, 0x3a, 0x28, 0x56, 0x44, 0x72, 0x60, 0xb3, 0xa1, 0x97, 0x85, 0xfb, 0xe9, 0xdf, 0xcd, 0x23, 0x31, 0x7, 0x15, 0x6b, 0x79, 0x4f, 0x5d, 0xf5, 0xe7, 0xd1, 0xc3, 0xbd, 0xaf, 0x99, 0x8b, 0x65, 0x77, 0x41, 0x53, 0x2d, 0x3f, 0x9, 0x1b, 0xc8, 0xda, 0xec, 0xfe, 0x80, 0x92, 0xa4, 0xb6, 0x58, 0x4a, 0x7c, 0x6e, 0x10, 0x2, 0x34, 0x26, 0x8f, 0x9d, 0xab, 0xb9, 0xc7, 0xd5, 0xe3, 0xf1, 0x1f, 0xd, 0x3b, 0x29, 0x57, 0x45, 0x73, 0x61, 0xb2, 0xa0, 0x96, 0x84, 0xfa, 0xe8, 0xde, 0xcc, 0x22, 0x30, 0x6, 0x14, 0x6a, 0x78, 0x4e, 0x5c, 0x1, 0x13, 0x25, 0x37, 0x49, 0x5b, 0x6d, 0x7f, 0x91, 0x83, 0xb5, 0xa7, 0xd9, 0xcb, 0xfd, 0xef, 0x3c, 0x2e, 0x18, 0xa, 0x74, 0x66, 0x50, 0x42, 0xac, 0xbe, 0x88, 0x9a, 0xe4, 0xf6, 0xc0, 0xd2, 0x7b, 0x69, 0x5f, 0x4d, 0x33, 0x21, 0x17, 0x5, 0xeb, 0xf9, 0xcf, 0xdd, 0xa3, 0xb1, 0x87, 0x95, 0x46, 0x54, 0x62, 0x70, 0xe, 0x1c, 0x2a, 0x38, 0xd6, 0xc4, 0xf2, 0xe0, 0x9e, 0x8c, 0xba, 0xa8}, [256]byte{0x0, 0x13, 0x26, 0x35, 0x4c, 0x5f, 0x6a, 0x79, 0x98, 0x8b, 0xbe, 0xad, 0xd4, 0xc7, 0xf2, 0xe1, 0x2d, 0x3e, 0xb, 0x18, 0x61, 0x72, 0x47, 0x54, 0xb5, 0xa6, 0x93, 0x80, 0xf9, 0xea, 0xdf, 0xcc, 0x5a, 0x49, 0x7c, 0x6f, 0x16, 0x5, 0x30, 0x23, 0xc2, 0xd1, 0xe4, 0xf7, 0x8e, 0x9d, 0xa8, 0xbb, 0x77, 0x64, 0x51, 0x42, 0x3b, 0x28, 0x1d, 0xe, 0xef, 0xfc, 0xc9, 0xda, 0xa3, 0xb0, 0x85, 0x96, 0xb4, 0xa7, 0x92, 0x81, 0xf8, 0xeb, 0xde, 0xcd, 0x2c, 0x3f, 0xa, 0x19, 0x60, 0x73, 0x46, 0x55, 0x99, 0x8a, 0xbf, 0xac, 0xd5, 0xc6, 0xf3, 0xe0, 0x1, 0x12, 0x27, 0x34, 0x4d, 0x5e, 0x6b, 0x78, 0xee, 0xfd, 0xc8, 0xdb, 0xa2, 0xb1, 0x84, 0x97, 0x76, 0x65, 0x50, 0x43, 0x3a, 0x29, 0x1c, 0xf, 0xc3, 0xd0, 0xe5, 0xf6, 0x8f, 0x9c, 0xa9, 0xba, 0x5b, 0x48, 0x7d, 0x6e, 0x17, 0x4, 0x31, 0x22, 0x75, 0x66, 0x53, 0x40, 0x39, 0x2a, 0x1f, 0xc, 0xed, 0xfe, 0xcb, 0xd8, 0xa1, 0xb2, 0x87, 0x94, 0x58, 0x4b, 0x7e, 0x6d, 0x14, 0x7, 0x32, 0x21, 0xc0, 0xd3, 0xe6, 0xf5, 0x8c, 0x9f, 0xaa, 0xb9, 0x2f, 0x3c, 0x9, 0x1a, 0x63, 0x70, 0x45, 0x56, 0xb7, 0xa4, 0x91, 0x82, 0xfb, 0xe8, 0xdd, 0xce, 0x2, 0x11, 0x24, 0x37, 0x4e, 0x5d, 0x68, 0x7b, 0x9a, 0x89, 0xbc, 0xaf, 0xd6, 0xc5, 0xf0, 0xe3, 0xc1, 0xd2, 0xe7, 0xf4, 0x8d, 0x9e, 0xab, 0xb8, 0x59, 0x4a, 0x7f, 0x6c, 0x15, 0x6, 0x33, 0x20, 0xec, 0xff, 0xca, 0xd9, 0xa0, 0xb3, 0x86, 0x95, 0x74, 0x67, 0x52, 0x41, 0x38, 0x2b, 0x1e, 0xd, 0x9b, 0x88, 0xbd, 0xae, 0xd7, 0xc4, 0xf1, 0xe2, 0x3, 0x10, 0x25, 0x36, 0x4f, 0x5c, 0x69, 0x7a, 0xb6, 0xa5, 0x90, 0x83, 0xfa, 0xe9, 0xdc, 0xcf, 0x2e, 0x3d, 0x8, 0x1b, 0x62, 0x71, 0x44, 0x57}, [256]byte{0x0, 0x14, 0x28, 0x3c, 0x50, 0x44, 0x78, 0x6c, 0xa0, 0xb4, 0x88, 0x9c, 0xf0, 0xe4, 0xd8, 0xcc, 0x5d, 0x49, 0x75, 0x61, 0xd, 0x19, 0x25, 0x31, 0xfd, 0xe9, 0xd5, 0xc1, 0xad, 0xb9, 0x85, 0x91, 0xba, 0xae, 0x92, 0x86, 0xea, 0xfe, 0xc2, 0xd6, 0x1a, 0xe, 0x32, 0x26, 0x4a, 0x5e, 0x62, 0x76, 0xe7, 0xf3, 0xcf, 0xdb, 0xb7, 0xa3, 0x9f, 0x8b, 0x47, 0x53, 0x6f, 0x7b, 0x17, 0x3, 0x3f, 0x2b, 0x69, 0x7d, 0x41, 0x55, 0x39, 0x2d, 0x11, 0x5, 0xc9, 0xdd, 0xe1, 0xf5, 0x99, 0x8d, 0xb1, 0xa5, 0x34, 0x20, 0x1c, 0x8, 0x64, 0x70, 0x4c, 0x58, 0x94, 0x80, 0xbc, 0xa8, 0xc4, 0xd0, 0xec, 0xf8, 0xd3, 0xc7, 0xfb, 0xef, 0x83, 0x97, 0xab, 0xbf, 0x73, 0x67, 0x5b, 0x4f, 0x23, 0x37, 0xb, 0x1f, 0x8e, 0x9a, 0xa6, 0xb2, 0xde, 0xca, 0xf6, 0xe2, 0x2e, 0x3a, 0x6, 0x12, 0x7e, 0x6a, 0x56, 0x42, 0xd2, 0xc6, 0xfa, 0xee, 0x82, 0x96, 0xaa, 0xbe, 0x72, 0x66, 0x5a, 0x4e, 0x22, 0x36, 0xa, 0x1e, 0x8f, 0x9b, 0xa7, 0xb3, 0xdf, 0xcb, 0xf7, 0xe3, 0x2f, 0x3b, 0x7, 0x13, 0x7f, 0x6b, 0x57, 0x43, 0x68, 0x7c, 0x40, 0x54, 0x38, 0x2c, 0x10, 0x4, 0xc8, 0xdc, 0xe0, 0xf4, 0x98, 0x8c, 0xb0, 0xa4, 0x35, 0x21, 0x1d, 0x9, 0x65, 0x71, 0x4d, 0x59, 0x95, 0x81, 0xbd, 0xa9, 0xc5, 0xd1, 0xed, 0xf9, 0xbb, 0xaf, 0x93, 0x87, 0xeb, 0xff, 0xc3, 0xd7, 0x1b, 0xf, 0x33, 0x27, 0x4b, 0x5f, 0x63, 0x77, 0xe6, 0xf2, 0xce, 0xda, 0xb6, 0xa2, 0x9e, 0x8a, 0x46, 0x52, 0x6e, 0x7a, 0x16, 0x2, 0x3e, 0x2a, 0x1, 0x15, 0x29, 0x3d, 0x51, 0x45, 0x79, 0x6d, 0xa1, 0xb5, 0x89, 0x9d, 0xf1, 0xe5, 0xd9, 0xcd, 0x5c, 0x48, 0x74, 0x60, 0xc, 0x18, 0x24, 0x30, 0xfc, 0xe8, 0xd4, 0xc0, 0xac, 0xb8, 0x84, 0x90}, [256]byte{0x0, 0x15, 0x2a, 0x3f, 0x54, 0x41, 0x7e, 0x6b, 0xa8, 0xbd, 0x82, 0x97, 0xfc, 0xe9, 0xd6, 0xc3, 0x4d, 0x58, 0x67, 0x72, 0x19, 0xc, 0x33, 0x26, 0xe5, 0xf0, 0xcf, 0xda, 0xb1, 0xa4, 0x9b, 0x8e, 0x9a, 0x8f, 0xb0, 0xa5, 0xce, 0xdb, 0xe4, 0xf1, 0x32, 0x27, 0x18, 0xd, 0x66, 0x73, 0x4c, 0x59, 0xd7, 0xc2, 0xfd, 0xe8, 0x83, 0x96, 0xa9, 0xbc, 0x7f, 0x6a, 0x55, 0x40, 0x2b, 0x3e, 0x1, 0x14, 0x29, 0x3c, 0x3, 0x16, 0x7d, 0x68, 0x57, 0x42, 0x81, 0x94, 0xab, 0xbe, 0xd5, 0xc0, 0xff, 0xea, 0x64, 0x71, 0x4e, 0x5b, 0x30, 0x25, 0x1a, 0xf, 0xcc, 0xd9, 0xe6, 0xf3, 0x98, 0x8d, 0xb2, 0xa7, 0xb3, 0xa6, 0x99, 0x8c, 0xe7, 0xf2, 0xcd, 0xd8, 0x1b, 0xe, 0x31, 0x24, 0x4f, 0x5a, 0x65, 0x70, 0xfe, 0xeb, 0xd4, 0xc1, 0xaa, 0xbf, 0x80, 0x95, 0x56, 0x43, 0x7c, 0x69, 0x2, 0x17, 0x28, 0x3d, 0x52, 0x47, 0x78, 0x6d, 0x6, 0x13, 0x2c, 0x39, 0xfa, 0xef, 0xd0, 0xc5, 0xae, 0xbb, 0x84, 0x91, 0x1f, 0xa, 0x35, 0x20, 0x4b, 0x5e, 0x61, 0x74, 0xb7, 0xa2, 0x9d, 0x88, 0xe3, 0xf6, 0xc9, 0xdc, 0xc8, 0xdd, 0xe2, 0xf7, 0x9c, 0x89, 0xb6, 0xa3, 0x60, 0x75, 0x4a, 0x5f, 0x34, 0x21, 0x1e, 0xb, 0x85, 0x90, 0xaf, 0xba, 0xd1, 0xc4, 0xfb, 0xee, 0x2d, 0x38, 0x7, 0x12, 0x79, 0x6c, 0x53, 0x46, 0x7b, 0x6e, 0x51, 0x44, 0x2f, 0x3a, 0x5, 0x10, 0xd3, 0xc6, 0xf9, 0xec, 0x87, 0x92, 0xad, 0xb8, 0x36, 0x23, 0x1c, 0x9, 0x62, 0x77, 0x48, 0x5d, 0x9e, 0x8b, 0xb4, 0xa1, 0xca, 0xdf, 0xe0, 0xf5, 0xe1, 0xf4, 0xcb, 0xde, 0xb5, 0xa0, 0x9f, 0x8a, 0x49, 0x5c, 0x63, 0x76, 0x1d, 0x8, 0x37, 0x22, 0xac, 0xb9, 0x86, 0x93, 0xf8, 0xed, 0xd2, 0xc7, 0x4, 0x11, 0x2e, 0x3b, 0x50, 0x45, 0x7a, 0x6f}, [256]byte{0x0, 0x16, 0x2c, 0x3a, 0x58, 0x4e, 0x74, 0x62, 0xb0, 0xa6, 0x9c, 0x8a, 0xe8, 0xfe, 0xc4, 0xd2, 0x7d, 0x6b, 0x51, 0x47, 0x25, 0x33, 0x9, 0x1f, 0xcd, 0xdb, 0xe1, 0xf7, 0x95, 0x83, 0xb9, 0xaf, 0xfa, 0xec, 0xd6, 0xc0, 0xa2, 0xb4, 0x8e, 0x98, 0x4a, 0x5c, 0x66, 0x70, 0x12, 0x4, 0x3e, 0x28, 0x87, 0x91, 0xab, 0xbd, 0xdf, 0xc9, 0xf3, 0xe5, 0x37, 0x21, 0x1b, 0xd, 0x6f, 0x79, 0x43, 0x55, 0xe9, 0xff, 0xc5, 0xd3, 0xb1, 0xa7, 0x9d, 0x8b, 0x59, 0x4f, 0x75, 0x63, 0x1, 0x17, 0x2d, 0x3b, 0x94, 0x82, 0xb8, 0xae, 0xcc, 0xda, 0xe0, 0xf6, 0x24, 0x32, 0x8, 0x1e, 0x7c, 0x6a, 0x50, 0x46, 0x13, 0x5, 0x3f, 0x29, 0x4b, 0x5d, 0x67, 0x71, 0xa3, 0xb5, 0x8f, 0x99, 0xfb, 0xed, 0xd7, 0xc1, 0x6e, 0x78, 0x42, 0x54, 0x36, 0x20, 0x1a, 0xc, 0xde, 0xc8, 0xf2, 0xe4, 0x86, 0x90, 0xaa, 0xbc, 0xcf, 0xd9, 0xe3, 0xf5, 0x97, 0x81, 0xbb, 0xad, 0x7f, 0x69, 0x53, 0x45, 0x27, 0x31, 0xb, 0x1d, 0xb2, 0xa4, 0x9e, 0x88, 0xea, 0xfc, 0xc6, 0xd0, 0x2, 0x14, 0x2e, 0x38, 0x5a, 0x4c, 0x76, 0x60, 0x35, 0x23, 0x19, 0xf, 0x6d, 0x7b, 0x41, 0x57, 0x85, 0x93, 0xa9, 0xbf, 0xdd, 0xcb, 0xf1, 0xe7, 0x48, 0x5e, 0x64, 0x72, 0x10, 0x6, 0x3c, 0x2a, 0xf8, 0xee, 0xd4, 0xc2, 0xa0, 0xb6, 0x8c, 0x9a, 0x26, 0x30, 0xa, 0x1c, 0x7e, 0x68, 0x52, 0x44, 0x96, 0x80, 0xba, 0xac, 0xce, 0xd8, 0xe2, 0xf4, 0x5b, 0x4d, 0x77, 0x61, 0x3, 0x15, 0x2f, 0x39, 0xeb, 0xfd, 0xc7, 0xd1, 0xb3, 0xa5, 0x9f, 0x89, 0xdc, 0xca, 0xf0, 0xe6, 0x84, 0x92, 0xa8, 0xbe, 0x6c, 0x7a, 0x40, 0x56, 0x34, 0x22, 0x18, 0xe, 0xa1, 0xb7, 0x8d, 0x9b, 0xf9, 0xef, 0xd5, 0xc3, 0x11, 0x7, 0x3d, 0x2b, 0x49, 0x5f, 0x65, 0x73}, [256]byte{0x0, 0x17, 0x2e, 0x39, 0x5c, 0x4b, 0x72, 0x65, 0xb8, 0xaf, 0x96, 0x81, 0xe4, 0xf3, 0xca, 0xdd, 0x6d, 0x7a, 0x43, 0x54, 0x31, 0x26, 0x1f, 0x8, 0xd5, 0xc2, 0xfb, 0xec, 0x89, 0x9e, 0xa7, 0xb0, 0xda, 0xcd, 0xf4, 0xe3, 0x86, 0x91, 0xa8, 0xbf, 0x62, 0x75, 0x4c, 0x5b, 0x3e, 0x29, 0x10, 0x7, 0xb7, 0xa0, 0x99, 0x8e, 0xeb, 0xfc, 0xc5, 0xd2, 0xf, 0x18, 0x21, 0x36, 0x53, 0x44, 0x7d, 0x6a, 0xa9, 0xbe, 0x87, 0x90, 0xf5, 0xe2, 0xdb, 0xcc, 0x11, 0x6, 0x3f, 0x28, 0x4d, 0x5a, 0x63, 0x74, 0xc4, 0xd3, 0xea, 0xfd, 0x98, 0x8f, 0xb6, 0xa1, 0x7c, 0x6b, 0x52, 0x45, 0x20, 0x37, 0xe, 0x19, 0x73, 0x64, 0x5d, 0x4a, 0x2f, 0x38, 0x1, 0x16, 0xcb, 0xdc, 0xe5, 0xf2, 0x97, 0x80, 0xb9, 0xae, 0x1e, 0x9, 0x30, 0x27, 0x42, 0x55, 0x6c, 0x7b, 0xa6, 0xb1, 0x88, 0x9f, 0xfa, 0xed, 0xd4, 0xc3, 0x4f, 0x58, 0x61, 0x76, 0x13, 0x4, 0x3d, 0x2a, 0xf7, 0xe0, 0xd9, 0xce, 0xab, 0xbc, 0x85, 0x92, 0x22, 0x35, 0xc, 0x1b, 0x7e, 0x69, 0x50, 0x47, 0x9a, 0x8d, 0xb4, 0xa3, 0xc6, 0xd1, 0xe8, 0xff, 0x95, 0x82, 0xbb, 0xac, 0xc9, 0xde, 0xe7, 0xf0, 0x2d, 0x3a, 0x3, 0x14, 0x71, 0x66, 0x5f, 0x48, 0xf8, 0xef, 0xd6, 0xc1, 0xa4, 0xb3, 0x8a, 0x9d, 0x40, 0x57, 0x6e, 0x79, 0x1c, 0xb, 0x32, 0x25, 0xe6, 0xf1, 0xc8, 0xdf, 0xba, 0xad, 0x94, 0x83, 0x5e, 0x49, 0x70, 0x67, 0x2, 0x15, 0x2c, 0x3b, 0x8b, 0x9c, 0xa5, 0xb2, 0xd7, 0xc0, 0xf9, 0xee, 0x33, 0x24, 0x1d, 0xa, 0x6f, 0x78, 0x41, 0x56, 0x3c, 0x2b, 0x12, 0x5, 0x60, 0x77, 0x4e, 0x59, 0x84, 0x93, 0xaa, 0xbd, 0xd8, 0xcf, 0xf6, 0xe1, 0x51, 0x46, 0x7f, 0x68, 0xd, 0x1a, 0x23, 0x34, 0xe9, 0xfe, 0xc7, 0xd0, 0xb5, 0xa2, 0x9b, 0x8c}, [256]byte{0x0, 0x18, 0x30, 0x28, 0x60, 0x78, 0x50, 0x48, 0xc0, 0xd8, 0xf0, 0xe8, 0xa0, 0xb8, 0x90, 0x88, 0x9d, 0x85, 0xad, 0xb5, 0xfd, 0xe5, 0xcd, 0xd5, 0x5d, 0x45, 0x6d, 0x75, 0x3d, 0x25, 0xd, 0x15, 0x27, 0x3f, 0x17, 0xf, 0x47, 0x5f, 0x77, 0x6f, 0xe7, 0xff, 0xd7, 0xcf, 0x87, 0x9f, 0xb7, 0xaf, 0xba, 0xa2, 0x8a, 0x92, 0xda, 0xc2, 0xea, 0xf2, 0x7a, 0x62, 0x4a, 0x52, 0x1a, 0x2, 0x2a, 0x32, 0x4e, 0x56, 0x7e, 0x66, 0x2e, 0x36, 0x1e, 0x6, 0x8e, 0x96, 0xbe, 0xa6, 0xee, 0xf6, 0xde, 0xc6, 0xd3, 0xcb, 0xe3, 0xfb, 0xb3, 0xab, 0x83, 0x9b, 0x13, 0xb, 0x23, 0x3b, 0x73, 0x6b, 0x43, 0x5b, 0x69, 0x71, 0x59, 0x41, 0x9, 0x11, 0x39, 0x21, 0xa9, 0xb1, 0x99, 0x81, 0xc9, 0xd1, 0xf9, 0xe1, 0xf4, 0xec, 0xc4, 0xdc, 0x94, 0x8c, 0xa4, 0xbc, 0x34, 0x2c, 0x4, 0x1c, 0x54, 0x4c, 0x64, 0x7c, 0x9c, 0x84, 0xac, 0xb4, 0xfc, 0xe4, 0xcc, 0xd4, 0x5c, 0x44, 0x6c, 0x74, 0x3c, 0x24, 0xc, 0x14, 0x1, 0x19, 0x31, 0x29, 0x61, 0x79, 0x51, 0x49, 0xc1, 0xd9, 0xf1, 0xe9, 0xa1, 0xb9, 0x91, 0x89, 0xbb, 0xa3, 0x8b, 0x93, 0xdb, 0xc3, 0xeb, 0xf3, 0x7b, 0x63, 0x4b, 0x53, 0x1b, 0x3, 0x2b, 0x33, 0x26, 0x3e, 0x16, 0xe, 0x46, 0x5e, 0x76, 0x6e, 0xe6, 0xfe, 0xd6, 0xce, 0x86, 0x9e, 0xb6, 0xae, 0xd2, 0xca, 0xe2, 0xfa, 0xb2, 0xaa, 0x82, 0x9a, 0x12, 0xa, 0x22, 0x3a, 0x72, 0x6a, 0x42, 0x5a, 0x4f, 0x57, 0x7f, 0x67, 0x2f, 0x37, 0x1f, 0x7, 0x8f, 0x97, 0xbf, 0xa7, 0xef, 0xf7, 0xdf, 0xc7, 0xf5, 0xed, 0xc5, 0xdd, 0x95, 0x8d, 0xa5, 0xbd, 0x35, 0x2d, 0x5, 0x1d, 0x55, 0x4d, 0x65, 0x7d, 0x68, 0x70, 0x58, 0x40, 0x8, 0x10, 0x38, 0x20, 0xa8, 0xb0, 0x98, 0x80, 0xc8, 0xd0, 0xf8, 0xe0}, [256]byte{0x0, 0x19, 0x32, 0x2b, 0x64, 0x7d, 0x56, 0x4f, 0xc8, 0xd1, 0xfa, 0xe3, 0xac, 0xb5, 0x9e, 0x87, 0x8d, 0x94, 0xbf, 0xa6, 0xe9, 0xf0, 0xdb, 0xc2, 0x45, 0x5c, 0x77, 0x6e, 0x21, 0x38, 0x13, 0xa, 0x7, 0x1e, 0x35, 0x2c, 0x63, 0x7a, 0x51, 0x48, 0xcf, 0xd6, 0xfd, 0xe4, 0xab, 0xb2, 0x99, 0x80, 0x8a, 0x93, 0xb8, 0xa1, 0xee, 0xf7, 0xdc, 0xc5, 0x42, 0x5b, 0x70, 0x69, 0x26, 0x3f, 0x14, 0xd, 0xe, 0x17, 0x3c, 0x25, 0x6a, 0x73, 0x58, 0x41, 0xc6, 0xdf, 0xf4, 0xed, 0xa2, 0xbb, 0x90, 0x89, 0x83, 0x9a, 0xb1, 0xa8, 0xe7, 0xfe, 0xd5, 0xcc, 0x4b, 0x52, 0x79, 0x60, 0x2f, 0x36, 0x1d, 0x4, 0x9, 0x10, 0x3b, 0x22, 0x6d, 0x74, 0x5f, 0x46, 0xc1, 0xd8, 0xf3, 0xea, 0xa5, 0xbc, 0x97, 0x8e, 0x84, 0x9d, 0xb6, 0xaf, 0xe0, 0xf9, 0xd2, 0xcb, 0x4c, 0x55, 0x7e, 0x67, 0x28, 0x31, 0x1a, 0x3, 0x1c, 0x5, 0x2e, 0x37, 0x78, 0x61, 0x4a, 0x53, 0xd4, 0xcd, 0xe6, 0xff, 0xb0, 0xa9, 0x82, 0x9b, 0x91, 0x88, 0xa3, 0xba, 0xf5, 0xec, 0xc7, 0xde, 0x59, 0x40, 0x6b, 0x72, 0x3d, 0x24, 0xf, 0x16, 0x1b, 0x2, 0x29, 0x30, 0x7f, 0x66, 0x4d, 0x54, 0xd3, 0xca, 0xe1, 0xf8, 0xb7, 0xae, 0x85, 0x9c, 0x96, 0x8f, 0xa4, 0xbd, 0xf2, 0xeb, 0xc0, 0xd9, 0x5e, 0x47, 0x6c, 0x75, 0x3a, 0x23, 0x8, 0x11, 0x12, 0xb, 0x20, 0x39, 0x76, 0x6f, 0x44, 0x5d, 0xda, 0xc3, 0xe8, 0xf1, 0xbe, 0xa7, 0x8c, 0x95, 0x9f, 0x86, 0xad, 0xb4, 0xfb, 0xe2, 0xc9, 0xd0, 0x57, 0x4e, 0x65, 0x7c, 0x33, 0x2a, 0x1, 0x18, 0x15, 0xc, 0x27, 0x3e, 0x71, 0x68, 0x43, 0x5a, 0xdd, 0xc4, 0xef, 0xf6, 0xb9, 0xa0, 0x8b, 0x92, 0x98, 0x81, 0xaa, 0xb3, 0xfc, 0xe5, 0xce, 0xd7, 0x50, 0x49, 0x62, 0x7b, 0x34, 0x2d, 0x6, 0x1f}, [256]byte{0x0, 0x1a, 0x34, 0x2e, 0x68, 0x72, 0x5c, 0x46, 0xd0, 0xca, 0xe4, 0xfe, 0xb8, 0xa2, 0x8c, 0x96, 0xbd, 0xa7, 0x89, 0x93, 0xd5, 0xcf, 0xe1, 0xfb, 0x6d, 0x77, 0x59, 0x43, 0x5, 0x1f, 0x31, 0x2b, 0x67, 0x7d, 0x53, 0x49, 0xf, 0x15, 0x3b, 0x21, 0xb7, 0xad, 0x83, 0x99, 0xdf, 0xc5, 0xeb, 0xf1, 0xda, 0xc0, 0xee, 0xf4, 0xb2, 0xa8, 0x86, 0x9c, 0xa, 0x10, 0x3e, 0x24, 0x62, 0x78, 0x56, 0x4c, 0xce, 0xd4, 0xfa, 0xe0, 0xa6, 0xbc, 0x92, 0x88, 0x1e, 0x4, 0x2a, 0x30, 0x76, 0x6c, 0x42, 0x58, 0x73, 0x69, 0x47, 0x5d, 0x1b, 0x1, 0x2f, 0x35, 0xa3, 0xb9, 0x97, 0x8d, 0xcb, 0xd1, 0xff, 0xe5, 0xa9, 0xb3, 0x9d, 0x87, 0xc1, 0xdb, 0xf5, 0xef, 0x79, 0x63, 0x4d, 0x57, 0x11, 0xb, 0x25, 0x3f, 0x14, 0xe, 0x20, 0x3a, 0x7c, 0x66, 0x48, 0x52, 0xc4, 0xde, 0xf0, 0xea, 0xac, 0xb6, 0x98, 0x82, 0x81, 0x9b, 0xb5, 0xaf, 0xe9, 0xf3, 0xdd, 0xc7, 0x51, 0x4b, 0x65, 0x7f, 0x39, 0x23, 0xd, 0x17, 0x3c, 0x26, 0x8, 0x12, 0x54, 0x4e, 0x60, 0x7a, 0xec, 0xf6, 0xd8, 0xc2, 0x84, 0x9e, 0xb0, 0xaa, 0xe6, 0xfc, 0xd2, 0xc8, 0x8e, 0x94, 0xba, 0xa0, 0x36, 0x2c, 0x2, 0x18, 0x5e, 0x44, 0x6a, 0x70, 0x5b, 0x41, 0x6f, 0x75, 0x33, 0x29, 0x7, 0x1d, 0x8b, 0x91, 0xbf, 0xa5, 0xe3, 0xf9, 0xd7, 0xcd, 0x4f, 0x55, 0x7b, 0x61, 0x27, 0x3d, 0x13, 0x9, 0x9f, 0x85, 0xab, 0xb1, 0xf7, 0xed, 0xc3, 0xd9, 0xf2, 0xe8, 0xc6, 0xdc, 0x9a, 0x80, 0xae, 0xb4, 0x22, 0x38, 0x16, 0xc, 0x4a, 0x50, 0x7e, 0x64, 0x28, 0x32, 0x1c, 0x6, 0x40, 0x5a, 0x74, 0x6e, 0xf8, 0xe2, 0xcc, 0xd6, 0x90, 0x8a, 0xa4, 0xbe, 0x95, 0x8f, 0xa1, 0xbb, 0xfd, 0xe7, 0xc9, 0xd3, 0x45, 0x5f, 0x71, 0x6b, 0x2d, 0x37, 0x19, 0x3}, [256]byte{0x0, 0x1b, 0x36, 0x2d, 0x6c, 0x77, 0x5a, 0x41, 0xd8, 0xc3, 0xee, 0xf5, 0xb4, 0xaf, 0x82, 0x99, 0xad, 0xb6, 0x9b, 0x80, 0xc1, 0xda, 0xf7, 0xec, 0x75, 0x6e, 0x43, 0x58, 0x19, 0x2, 0x2f, 0x34, 0x47, 0x5c, 0x71, 0x6a, 0x2b, 0x30, 0x1d, 0x6, 0x9f, 0x84, 0xa9, 0xb2, 0xf3, 0xe8, 0xc5, 0xde, 0xea, 0xf1, 0xdc, 0xc7, 0x86, 0x9d, 0xb0, 0xab, 0x32, 0x29, 0x4, 0x1f, 0x5e, 0x45, 0x68, 0x73, 0x8e, 0x95, 0xb8, 0xa3, 0xe2, 0xf9, 0xd4, 0xcf, 0x56, 0x4d, 0x60, 0x7b, 0x3a, 0x21, 0xc, 0x17, 0x23, 0x38, 0x15, 0xe, 0x4f, 0x54, 0x79, 0x62, 0xfb, 0xe0, 0xcd, 0xd6, 0x97, 0x8c, 0xa1, 0xba, 0xc9, 0xd2, 0xff, 0xe4, 0xa5, 0xbe, 0x93, 0x88, 0x11, 0xa, 0x27, 0x3c, 0x7d, 0x66, 0x4b, 0x50, 0x64, 0x7f, 0x52, 0x49, 0x8, 0x13, 0x3e, 0x25, 0xbc, 0xa7, 0x8a, 0x91, 0xd0, 0xcb, 0xe6, 0xfd, 0x1, 0x1a, 0x37, 0x2c, 0x6d, 0x76, 0x5b, 0x40, 0xd9, 0xc2, 0xef, 0xf4, 0xb5, 0xae, 0x83, 0x98, 0xac, 0xb7, 0x9a, 0x81, 0xc0, 0xdb, 0xf6, 0xed, 0x74, 0x6f, 0x42, 0x59, 0x18, 0x3, 0x2e, 0x35, 0x46, 0x5d, 0x70, 0x6b, 0x2a, 0x31, 0x1c, 0x7, 0x9e, 0x85, 0xa8, 0xb3, 0xf2, 0xe9, 0xc4, 0xdf, 0xeb, 0xf0, 0xdd, 0xc6, 0x87, 0x9c, 0xb1, 0xaa, 0x33, 0x28, 0x5, 0x1e, 0x5f, 0x44, 0x69, 0x72, 0x8f, 0x94, 0xb9, 0xa2, 0xe3, 0xf8, 0xd5, 0xce, 0x57, 0x4c, 0x61, 0x7a, 0x3b, 0x20, 0xd, 0x16, 0x22, 0x39, 0x14, 0xf, 0x4e, 0x55, 0x78, 0x63, 0xfa, 0xe1, 0xcc, 0xd7, 0x96, 0x8d, 0xa0, 0xbb, 0xc8, 0xd3, 0xfe, 0xe5, 0xa4, 0xbf, 0x92, 0x89, 0x10, 0xb, 0x26, 0x3d, 0x7c, 0x67, 0x4a, 0x51, 0x65, 0x7e, 0x53, 0x48, 0x9, 0x12, 0x3f, 0x24, 0xbd, 0xa6, 0x8b, 0x90, 0xd1, 0xca, 0xe7, 0xfc}, [256]byte{0x0, 0x1c, 0x38, 0x24, 0x70, 0x6c, 0x48, 0x54, 0xe0, 0xfc, 0xd8, 0xc4, 0x90, 0x8c, 0xa8, 0xb4, 0xdd, 0xc1, 0xe5, 0xf9, 0xad, 0xb1, 0x95, 0x89, 0x3d, 0x21, 0x5, 0x19, 0x4d, 0x51, 0x75, 0x69, 0xa7, 0xbb, 0x9f, 0x83, 0xd7, 0xcb, 0xef, 0xf3, 0x47, 0x5b, 0x7f, 0x63, 0x37, 0x2b, 0xf, 0x13, 0x7a, 0x66, 0x42, 0x5e, 0xa, 0x16, 0x32, 0x2e, 0x9a, 0x86, 0xa2, 0xbe, 0xea, 0xf6, 0xd2, 0xce, 0x53, 0x4f, 0x6b, 0x77, 0x23, 0x3f, 0x1b, 0x7, 0xb3, 0xaf, 0x8b, 0x97, 0xc3, 0xdf, 0xfb, 0xe7, 0x8e, 0x92, 0xb6, 0xaa, 0xfe, 0xe2, 0xc6, 0xda, 0x6e, 0x72, 0x56, 0x4a, 0x1e, 0x2, 0x26, 0x3a, 0xf4, 0xe8, 0xcc, 0xd0, 0x84, 0x98, 0xbc, 0xa0, 0x14, 0x8, 0x2c, 0x30, 0x64, 0x78, 0x5c, 0x40, 0x29, 0x35, 0x11, 0xd, 0x59, 0x45, 0x61, 0x7d, 0xc9, 0xd5, 0xf1, 0xed, 0xb9, 0xa5, 0x81, 0x9d, 0xa6, 0xba, 0x9e, 0x82, 0xd6, 0xca, 0xee, 0xf2, 0x46, 0x5a, 0x7e, 0x62, 0x36, 0x2a, 0xe, 0x12, 0x7b, 0x67, 0x43, 0x5f, 0xb, 0x17, 0x33, 0x2f, 0x9b, 0x87, 0xa3, 0xbf, 0xeb, 0xf7, 0xd3, 0xcf, 0x1, 0x1d, 0x39, 0x25, 0x71, 0x6d, 0x49, 0x55, 0xe1, 0xfd, 0xd9, 0xc5, 0x91, 0x8d, 0xa9, 0xb5, 0xdc, 0xc0, 0xe4, 0xf8, 0xac, 0xb0, 0x94, 0x88, 0x3c, 0x20, 0x4, 0x18, 0x4c, 0x50, 0x74, 0x68, 0xf5, 0xe9, 0xcd, 0xd1, 0x85, 0x99, 0xbd, 0xa1, 0x15, 0x9, 0x2d, 0x31, 0x65, 0x79, 0x5d, 0x41, 0x28, 0x34, 0x10, 0xc, 0x58, 0x44, 0x60, 0x7c, 0xc8, 0xd4, 0xf0, 0xec, 0xb8, 0xa4, 0x80, 0x9c, 0x52, 0x4e, 0x6a, 0x76, 0x22, 0x3e, 0x1a, 0x6, 0xb2, 0xae, 0x8a, 0x96, 0xc2, 0xde, 0xfa, 0xe6, 0x8f, 0x93, 0xb7, 0xab, 0xff, 0xe3, 0xc7, 0xdb, 0x6f, 0x73, 0x57, 0x4b, 0x1f, 0x3, 0x27, 0x3b}, [256]byte{0x0, 0x1d, 0x3a, 0x27, 0x74, 0x69, 0x4e, 0x53, 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb, 0xcd, 0xd0, 0xf7, 0xea, 0xb9, 0xa4, 0x83, 0x9e, 0x25, 0x38, 0x1f, 0x2, 0x51, 0x4c, 0x6b, 0x76, 0x87, 0x9a, 0xbd, 0xa0, 0xf3, 0xee, 0xc9, 0xd4, 0x6f, 0x72, 0x55, 0x48, 0x1b, 0x6, 0x21, 0x3c, 0x4a, 0x57, 0x70, 0x6d, 0x3e, 0x23, 0x4, 0x19, 0xa2, 0xbf, 0x98, 0x85, 0xd6, 0xcb, 0xec, 0xf1, 0x13, 0xe, 0x29, 0x34, 0x67, 0x7a, 0x5d, 0x40, 0xfb, 0xe6, 0xc1, 0xdc, 0x8f, 0x92, 0xb5, 0xa8, 0xde, 0xc3, 0xe4, 0xf9, 0xaa, 0xb7, 0x90, 0x8d, 0x36, 0x2b, 0xc, 0x11, 0x42, 0x5f, 0x78, 0x65, 0x94, 0x89, 0xae, 0xb3, 0xe0, 0xfd, 0xda, 0xc7, 0x7c, 0x61, 0x46, 0x5b, 0x8, 0x15, 0x32, 0x2f, 0x59, 0x44, 0x63, 0x7e, 0x2d, 0x30, 0x17, 0xa, 0xb1, 0xac, 0x8b, 0x96, 0xc5, 0xd8, 0xff, 0xe2, 0x26, 0x3b, 0x1c, 0x1, 0x52, 0x4f, 0x68, 0x75, 0xce, 0xd3, 0xf4, 0xe9, 0xba, 0xa7, 0x80, 0x9d, 0xeb, 0xf6, 0xd1, 0xcc, 0x9f, 0x82, 0xa5, 0xb8, 0x3, 0x1e, 0x39, 0x24, 0x77, 0x6a, 0x4d, 0x50, 0xa1, 0xbc, 0x9b, 0x86, 0xd5, 0xc8, 0xef, 0xf2, 0x49, 0x54, 0x73, 0x6e, 0x3d, 0x20, 0x7, 0x1a, 0x6c, 0x71, 0x56, 0x4b, 0x18, 0x5, 0x22, 0x3f, 0x84, 0x99, 0xbe, 0xa3, 0xf0, 0xed, 0xca, 0xd7, 0x35, 0x28, 0xf, 0x12, 0x41, 0x5c, 0x7b, 0x66, 0xdd, 0xc0, 0xe7, 0xfa, 0xa9, 0xb4, 0x93, 0x8e, 0xf8, 0xe5, 0xc2, 0xdf, 0x8c, 0x91, 0xb6, 0xab, 0x10, 0xd, 0x2a, 0x37, 0x64, 0x79, 0x5e, 0x43, 0xb2, 0xaf, 0x88, 0x95, 0xc6, 0xdb, 0xfc, 0xe1, 0x5a, 0x47, 0x60, 0x7d, 0x2e, 0x33, 0x14, 0x9, 0x7f, 0x62, 0x45, 0x58, 0xb, 0x16, 0x31, 0x2c, 0x97, 0x8a, 0xad, 0xb0, 0xe3, 0xfe, 0xd9, 0xc4}, [256]byte{0x0, 0x1e, 0x3c, 0x22, 0x78, 0x66, 0x44, 0x5a, 0xf0, 0xee, 0xcc, 0xd2, 0x88, 0x96, 0xb4, 0xaa, 0xfd, 0xe3, 0xc1, 0xdf, 0x85, 0x9b, 0xb9, 0xa7, 0xd, 0x13, 0x31, 0x2f, 0x75, 0x6b, 0x49, 0x57, 0xe7, 0xf9, 0xdb, 0xc5, 0x9f, 0x81, 0xa3, 0xbd, 0x17, 0x9, 0x2b, 0x35, 0x6f, 0x71, 0x53, 0x4d, 0x1a, 0x4, 0x26, 0x38, 0x62, 0x7c, 0x5e, 0x40, 0xea, 0xf4, 0xd6, 0xc8, 0x92, 0x8c, 0xae, 0xb0, 0xd3, 0xcd, 0xef, 0xf1, 0xab, 0xb5, 0x97, 0x89, 0x23, 0x3d, 0x1f, 0x1, 0x5b, 0x45, 0x67, 0x79, 0x2e, 0x30, 0x12, 0xc, 0x56, 0x48, 0x6a, 0x74, 0xde, 0xc0, 0xe2, 0xfc, 0xa6, 0xb8, 0x9a, 0x84, 0x34, 0x2a, 0x8, 0x16, 0x4c, 0x52, 0x70, 0x6e, 0xc4, 0xda, 0xf8, 0xe6, 0xbc, 0xa2, 0x80, 0x9e, 0xc9, 0xd7, 0xf5, 0xeb, 0xb1, 0xaf, 0x8d, 0x93, 0x39, 0x27, 0x5, 0x1b, 0x41, 0x5f, 0x7d, 0x63, 0xbb, 0xa5, 0x87, 0x99, 0xc3, 0xdd, 0xff, 0xe1, 0x4b, 0x55, 0x77, 0x69, 0x33, 0x2d, 0xf, 0x11, 0x46, 0x58, 0x7a, 0x64, 0x3e, 0x20, 0x2, 0x1c, 0xb6, 0xa8, 0x8a, 0x94, 0xce, 0xd0, 0xf2, 0xec, 0x5c, 0x42, 0x60, 0x7e, 0x24, 0x3a, 0x18, 0x6, 0xac, 0xb2, 0x90, 0x8e, 0xd4, 0xca, 0xe8, 0xf6, 0xa1, 0xbf, 0x9d, 0x83, 0xd9, 0xc7, 0xe5, 0xfb, 0x51, 0x4f, 0x6d, 0x73, 0x29, 0x37, 0x15, 0xb, 0x68, 0x76, 0x54, 0x4a, 0x10, 0xe, 0x2c, 0x32, 0x98, 0x86, 0xa4, 0xba, 0xe0, 0xfe, 0xdc, 0xc2, 0x95, 0x8b, 0xa9, 0xb7, 0xed, 0xf3, 0xd1, 0xcf, 0x65, 0x7b, 0x59, 0x47, 0x1d, 0x3, 0x21, 0x3f, 0x8f, 0x91, 0xb3, 0xad, 0xf7, 0xe9, 0xcb, 0xd5, 0x7f, 0x61, 0x43, 0x5d, 0x7, 0x19, 0x3b, 0x25, 0x72, 0x6c, 0x4e, 0x50, 0xa, 0x14, 0x36, 0x28, 0x82, 0x9c, 0xbe, 0xa0, 0xfa, 0xe4, 0xc6, 0xd8}, [256]byte{0x0, 0x1f, 0x3e, 0x21, 0x7c, 0x63, 0x42, 0x5d, 0xf8, 0xe7, 0xc6, 0xd9, 0x84, 0x9b, 0xba, 0xa5, 0xed, 0xf2, 0xd3, 0xcc, 0x91, 0x8e, 0xaf, 0xb0, 0x15, 0xa, 0x2b, 0x34, 0x69, 0x76, 0x57, 0x48, 0xc7, 0xd8, 0xf9, 0xe6, 0xbb, 0xa4, 0x85, 0x9a, 0x3f, 0x20, 0x1, 0x1e, 0x43, 0x5c, 0x7d, 0x62, 0x2a, 0x35, 0x14, 0xb, 0x56, 0x49, 0x68, 0x77, 0xd2, 0xcd, 0xec, 0xf3, 0xae, 0xb1, 0x90, 0x8f, 0x93, 0x8c, 0xad, 0xb2, 0xef, 0xf0, 0xd1, 0xce, 0x6b, 0x74, 0x55, 0x4a, 0x17, 0x8, 0x29, 0x36, 0x7e, 0x61, 0x40, 0x5f, 0x2, 0x1d, 0x3c, 0x23, 0x86, 0x99, 0xb8, 0xa7, 0xfa, 0xe5, 0xc4, 0xdb, 0x54, 0x4b, 0x6a, 0x75, 0x28, 0x37, 0x16, 0x9, 0xac, 0xb3, 0x92, 0x8d, 0xd0, 0xcf, 0xee, 0xf1, 0xb9, 0xa6, 0x87, 0x98, 0xc5, 0xda, 0xfb, 0xe4, 0x41, 0x5e, 0x7f, 0x60, 0x3d, 0x22, 0x3, 0x1c, 0x3b, 0x24, 0x5, 0x1a, 0x47, 0x58, 0x79, 0x66, 0xc3, 0xdc, 0xfd, 0xe2, 0xbf, 0xa0, 0x81, 0x9e, 0xd6, 0xc9, 0xe8, 0xf7, 0xaa, 0xb5, 0x94, 0x8b, 0x2e, 0x31, 0x10, 0xf, 0x52, 0x4d, 0x6c, 0x73, 0xfc, 0xe3, 0xc2, 0xdd, 0x80, 0x9f, 0xbe, 0xa1, 0x4, 0x1b, 0x3a, 0x25, 0x78, 0x67, 0x46, 0x59, 0x11, 0xe, 0x2f, 0x30, 0x6d, 0x72, 0x53, 0x4c, 0xe9, 0xf6, 0xd7, 0xc8, 0x95, 0x8a, 0xab, 0xb4, 0xa8, 0xb7, 0x96, 0x89, 0xd4, 0xcb, 0xea, 0xf5, 0x50, 0x4f, 0x6e, 0x71, 0x2c, 0x33, 0x12, 0xd, 0x45, 0x5a, 0x7b, 0x64, 0x39, 0x26, 0x7, 0x18, 0xbd, 0xa2, 0x83, 0x9c, 0xc1, 0xde, 0xff, 0xe0, 0x6f, 0x70, 0x51, 0x4e, 0x13, 0xc, 0x2d, 0x32, 0x97, 0x88, 0xa9, 0xb6, 0xeb, 0xf4, 0xd5, 0xca, 0x82, 0x9d, 0xbc, 0xa3, 0xfe, 0xe1, 0xc0, 0xdf, 0x7a, 0x65, 0x44, 0x5b, 0x6, 0x19, 0x38, 0x27}, [256]byte{0x0, 0x20, 0x40, 0x60, 0x80, 0xa0, 0xc0, 0xe0, 0x1d, 0x3d, 0x5d, 0x7d, 0x9d, 0xbd, 0xdd, 0xfd, 0x3a, 0x1a, 0x7a, 0x5a, 0xba, 0x9a, 0xfa, 0xda, 0x27, 0x7, 0x67, 0x47, 0xa7, 0x87, 0xe7, 0xc7, 0x74, 0x54, 0x34, 0x14, 0xf4, 0xd4, 0xb4, 0x94, 0x69, 0x49, 0x29, 0x9, 0xe9, 0xc9, 0xa9, 0x89, 0x4e, 0x6e, 0xe, 0x2e, 0xce, 0xee, 0x8e, 0xae, 0x53, 0x73, 0x13, 0x33, 0xd3, 0xf3, 0x93, 0xb3, 0xe8, 0xc8, 0xa8, 0x88, 0x68, 0x48, 0x28, 0x8, 0xf5, 0xd5, 0xb5, 0x95, 0x75, 0x55, 0x35, 0x15, 0xd2, 0xf2, 0x92, 0xb2, 0x52, 0x72, 0x12, 0x32, 0xcf, 0xef, 0x8f, 0xaf, 0x4f, 0x6f, 0xf, 0x2f, 0x9c, 0xbc, 0xdc, 0xfc, 0x1c, 0x3c, 0x5c, 0x7c, 0x81, 0xa1, 0xc1, 0xe1, 0x1, 0x21, 0x41, 0x61, 0xa6, 0x86, 0xe6, 0xc6, 0x26, 0x6, 0x66, 0x46, 0xbb, 0x9b, 0xfb, 0xdb, 0x3b, 0x1b, 0x7b, 0x5b, 0xcd, 0xed, 0x8d, 0xad, 0x4d, 0x6d, 0xd, 0x2d, 0xd0, 0xf0, 0x90, 0xb0, 0x50, 0x70, 0x10, 0x30, 0xf7, 0xd7, 0xb7, 0x97, 0x77, 0x57, 0x37, 0x17, 0xea, 0xca, 0xaa, 0x8a, 0x6a, 0x4a, 0x2a, 0xa, 0xb9, 0x99, 0xf9, 0xd9, 0x39, 0x19, 0x79, 0x59, 0xa4, 0x84, 0xe4, 0xc4, 0x24, 0x4, 0x64, 0x44, 0x83, 0xa3, 0xc3, 0xe3, 0x3, 0x23, 0x43, 0x63, 0x9e, 0xbe, 0xde, 0xfe, 0x1e, 0x3e, 0x5e, 0x7e, 0x25, 0x5, 0x65, 0x45, 0xa5, 0x85, 0xe5, 0xc5, 0x38, 0x18, 0x78, 0x58, 0xb8, 0x98, 0xf8, 0xd8, 0x1f, 0x3f, 0x5f, 0x7f, 0x9f, 0xbf, 0xdf, 0xff, 0x2, 0x22, 0x42, 0x62, 0x82, 0xa2, 0xc2, 0xe2, 0x51, 0x71, 0x11, 0x31, 0xd1, 0xf1, 0x91, 0xb1, 0x4c, 0x6c, 0xc, 0x2c, 0xcc, 0xec, 0x8c, 0xac, 0x6b, 0x4b, 0x2b, 0xb, 0xeb, 0xcb, 0xab, 0x8b, 0x76, 0x56, 0x36, 0x16, 0xf6, 0xd6, 0xb6, 0x96}, [256]byte{0x0, 0x21, 0x42, 0x63, 0x84, 0xa5, 0xc6, 0xe7, 0x15, 0x34, 0x57, 0x76, 0x91, 0xb0, 0xd3, 0xf2, 0x2a, 0xb, 0x68, 0x49, 0xae, 0x8f, 0xec, 0xcd, 0x3f, 0x1e, 0x7d, 0x5c, 0xbb, 0x9a, 0xf9, 0xd8, 0x54, 0x75, 0x16, 0x37, 0xd0, 0xf1, 0x92, 0xb3, 0x41, 0x60, 0x3, 0x22, 0xc5, 0xe4, 0x87, 0xa6, 0x7e, 0x5f, 0x3c, 0x1d, 0xfa, 0xdb, 0xb8, 0x99, 0x6b, 0x4a, 0x29, 0x8, 0xef, 0xce, 0xad, 0x8c, 0xa8, 0x89, 0xea, 0xcb, 0x2c, 0xd, 0x6e, 0x4f, 0xbd, 0x9c, 0xff, 0xde, 0x39, 0x18, 0x7b, 0x5a, 0x82, 0xa3, 0xc0, 0xe1, 0x6, 0x27, 0x44, 0x65, 0x97, 0xb6, 0xd5, 0xf4, 0x13, 0x32, 0x51, 0x70, 0xfc, 0xdd, 0xbe, 0x9f, 0x78, 0x59, 0x3a, 0x1b, 0xe9, 0xc8, 0xab, 0x8a, 0x6d, 0x4c, 0x2f, 0xe, 0xd6, 0xf7, 0x94, 0xb5, 0x52, 0x73, 0x10, 0x31, 0xc3, 0xe2, 0x81, 0xa0, 0x47, 0x66, 0x5, 0x24, 0x4d, 0x6c, 0xf, 0x2e, 0xc9, 0xe8, 0x8b, 0xaa, 0x58, 0x79, 0x1a, 0x3b, 0xdc, 0xfd, 0x9e, 0xbf, 0x67, 0x46, 0x25, 0x4, 0xe3, 0xc2, 0xa1, 0x80, 0x72, 0x53, 0x30, 0x11, 0xf6, 0xd7, 0xb4, 0x95, 0x19, 0x38, 0x5b, 0x7a, 0x9d, 0xbc, 0xdf, 0xfe, 0xc, 0x2d, 0x4e, 0x6f, 0x88, 0xa9, 0xca, 0xeb, 0x33, 0x12, 0x71, 0x50, 0xb7, 0x96, 0xf5, 0xd4, 0x26, 0x7, 0x64, 0x45, 0xa2, 0x83, 0xe0, 0xc1, 0xe5, 0xc4, 0xa7, 0x86, 0x61, 0x40, 0x23, 0x2, 0xf0, 0xd1, 0xb2, 0x93, 0x74, 0x55, 0x36, 0x17, 0xcf, 0xee, 0x8d, 0xac, 0x4b, 0x6a, 0x9, 0x28, 0xda, 0xfb, 0x98, 0xb9, 0x5e, 0x7f, 0x1c, 0x3d, 0xb1, 0x90, 0xf3, 0xd2, 0x35, 0x14, 0x77, 0x56, 0xa4, 0x85, 0xe6, 0xc7, 0x20, 0x1, 0x62, 0x43, 0x9b, 0xba, 0xd9, 0xf8, 0x1f, 0x3e, 0x5d, 0x7c, 0x8e, 0xaf, 0xcc, 0xed, 0xa, 0x2b, 0x48, 0x69}, [256]byte{0x0, 0x22, 0x44, 0x66, 0x88, 0xaa, 0xcc, 0xee, 0xd, 0x2f, 0x49, 0x6b, 0x85, 0xa7, 0xc1, 0xe3, 0x1a, 0x38, 0x5e, 0x7c, 0x92, 0xb0, 0xd6, 0xf4, 0x17, 0x35, 0x53, 0x71, 0x9f, 0xbd, 0xdb, 0xf9, 0x34, 0x16, 0x70, 0x52, 0xbc, 0x9e, 0xf8, 0xda, 0x39, 0x1b, 0x7d, 0x5f, 0xb1, 0x93, 0xf5, 0xd7, 0x2e, 0xc, 0x6a, 0x48, 0xa6, 0x84, 0xe2, 0xc0, 0x23, 0x1, 0x67, 0x45, 0xab, 0x89, 0xef, 0xcd, 0x68, 0x4a, 0x2c, 0xe, 0xe0, 0xc2, 0xa4, 0x86, 0x65, 0x47, 0x21, 0x3, 0xed, 0xcf, 0xa9, 0x8b, 0x72, 0x50, 0x36, 0x14, 0xfa, 0xd8, 0xbe, 0x9c, 0x7f, 0x5d, 0x3b, 0x19, 0xf7, 0xd5, 0xb3, 0x91, 0x5c, 0x7e, 0x18, 0x3a, 0xd4, 0xf6, 0x90, 0xb2, 0x51, 0x73, 0x15, 0x37, 0xd9, 0xfb, 0x9d, 0xbf, 0x46, 0x64, 0x2, 0x20, 0xce, 0xec, 0x8a, 0xa8, 0x4b, 0x69, 0xf, 0x2d, 0xc3, 0xe1, 0x87, 0xa5, 0xd0, 0xf2, 0x94, 0xb6, 0x58, 0x7a, 0x1c, 0x3e, 0xdd, 0xff, 0x99, 0xbb, 0x55, 0x77, 0x11, 0x33, 0xca, 0xe8, 0x8e, 0xac, 0x42, 0x60, 0x6, 0x24, 0xc7, 0xe5, 0x83, 0xa1, 0x4f, 0x6d, 0xb, 0x29, 0xe4, 0xc6, 0xa0, 0x82, 0x6c, 0x4e, 0x28, 0xa, 0xe9, 0xcb, 0xad, 0x8f, 0x61, 0x43, 0x25, 0x7, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 0xf3, 0xd1, 0xb7, 0x95, 0x7b, 0x59, 0x3f, 0x1d, 0xb8, 0x9a, 0xfc, 0xde, 0x30, 0x12, 0x74, 0x56, 0xb5, 0x97, 0xf1, 0xd3, 0x3d, 0x1f, 0x79, 0x5b, 0xa2, 0x80, 0xe6, 0xc4, 0x2a, 0x8, 0x6e, 0x4c, 0xaf, 0x8d, 0xeb, 0xc9, 0x27, 0x5, 0x63, 0x41, 0x8c, 0xae, 0xc8, 0xea, 0x4, 0x26, 0x40, 0x62, 0x81, 0xa3, 0xc5, 0xe7, 0x9, 0x2b, 0x4d, 0x6f, 0x96, 0xb4, 0xd2, 0xf0, 0x1e, 0x3c, 0x5a, 0x78, 0x9b, 0xb9, 0xdf, 0xfd, 0x13, 0x31, 0x57, 0x75}, [256]byte{0x0, 0x23, 0x46, 0x65, 0x8c, 0xaf, 0xca, 0xe9, 0x5, 0x26, 0x43, 0x60, 0x89, 0xaa, 0xcf, 0xec, 0xa, 0x29, 0x4c, 0x6f, 0x86, 0xa5, 0xc0, 0xe3, 0xf, 0x2c, 0x49, 0x6a, 0x83, 0xa0, 0xc5, 0xe6, 0x14, 0x37, 0x52, 0x71, 0x98, 0xbb, 0xde, 0xfd, 0x11, 0x32, 0x57, 0x74, 0x9d, 0xbe, 0xdb, 0xf8, 0x1e, 0x3d, 0x58, 0x7b, 0x92, 0xb1, 0xd4, 0xf7, 0x1b, 0x38, 0x5d, 0x7e, 0x97, 0xb4, 0xd1, 0xf2, 0x28, 0xb, 0x6e, 0x4d, 0xa4, 0x87, 0xe2, 0xc1, 0x2d, 0xe, 0x6b, 0x48, 0xa1, 0x82, 0xe7, 0xc4, 0x22, 0x1, 0x64, 0x47, 0xae, 0x8d, 0xe8, 0xcb, 0x27, 0x4, 0x61, 0x42, 0xab, 0x88, 0xed, 0xce, 0x3c, 0x1f, 0x7a, 0x59, 0xb0, 0x93, 0xf6, 0xd5, 0x39, 0x1a, 0x7f, 0x5c, 0xb5, 0x96, 0xf3, 0xd0, 0x36, 0x15, 0x70, 0x53, 0xba, 0x99, 0xfc, 0xdf, 0x33, 0x10, 0x75, 0x56, 0xbf, 0x9c, 0xf9, 0xda, 0x50, 0x73, 0x16, 0x35, 0xdc, 0xff, 0x9a, 0xb9, 0x55, 0x76, 0x13, 0x30, 0xd9, 0xfa, 0x9f, 0xbc, 0x5a, 0x79, 0x1c, 0x3f, 0xd6, 0xf5, 0x90, 0xb3, 0x5f, 0x7c, 0x19, 0x3a, 0xd3, 0xf0, 0x95, 0xb6, 0x44, 0x67, 0x2, 0x21, 0xc8, 0xeb, 0x8e, 0xad, 0x41, 0x62, 0x7, 0x24, 0xcd, 0xee, 0x8b, 0xa8, 0x4e, 0x6d, 0x8, 0x2b, 0xc2, 0xe1, 0x84, 0xa7, 0x4b, 0x68, 0xd, 0x2e, 0xc7, 0xe4, 0x81, 0xa2, 0x78, 0x5b, 0x3e, 0x1d, 0xf4, 0xd7, 0xb2, 0x91, 0x7d, 0x5e, 0x3b, 0x18, 0xf1, 0xd2, 0xb7, 0x94, 0x72, 0x51, 0x34, 0x17, 0xfe, 0xdd, 0xb8, 0x9b, 0x77, 0x54, 0x31, 0x12, 0xfb, 0xd8, 0xbd, 0x9e, 0x6c, 0x4f, 0x2a, 0x9, 0xe0, 0xc3, 0xa6, 0x85, 0x69, 0x4a, 0x2f, 0xc, 0xe5, 0xc6, 0xa3, 0x80, 0x66, 0x45, 0x20, 0x3, 0xea, 0xc9, 0xac, 0x8f, 0x63, 0x40, 0x25, 0x6, 0xef, 0xcc, 0xa9, 0x8a}, [256]byte{0x0, 0x24, 0x48, 0x6c, 0x90, 0xb4, 0xd8, 0xfc, 0x3d, 0x19, 0x75, 0x51, 0xad, 0x89, 0xe5, 0xc1, 0x7a, 0x5e, 0x32, 0x16, 0xea, 0xce, 0xa2, 0x86, 0x47, 0x63, 0xf, 0x2b, 0xd7, 0xf3, 0x9f, 0xbb, 0xf4, 0xd0, 0xbc, 0x98, 0x64, 0x40, 0x2c, 0x8, 0xc9, 0xed, 0x81, 0xa5, 0x59, 0x7d, 0x11, 0x35, 0x8e, 0xaa, 0xc6, 0xe2, 0x1e, 0x3a, 0x56, 0x72, 0xb3, 0x97, 0xfb, 0xdf, 0x23, 0x7, 0x6b, 0x4f, 0xf5, 0xd1, 0xbd, 0x99, 0x65, 0x41, 0x2d, 0x9, 0xc8, 0xec, 0x80, 0xa4, 0x58, 0x7c, 0x10, 0x34, 0x8f, 0xab, 0xc7, 0xe3, 0x1f, 0x3b, 0x57, 0x73, 0xb2, 0x96, 0xfa, 0xde, 0x22, 0x6, 0x6a, 0x4e, 0x1, 0x25, 0x49, 0x6d, 0x91, 0xb5, 0xd9, 0xfd, 0x3c, 0x18, 0x74, 0x50, 0xac, 0x88, 0xe4, 0xc0, 0x7b, 0x5f, 0x33, 0x17, 0xeb, 0xcf, 0xa3, 0x87, 0x46, 0x62, 0xe, 0x2a, 0xd6, 0xf2, 0x9e, 0xba, 0xf7, 0xd3, 0xbf, 0x9b, 0x67, 0x43, 0x2f, 0xb, 0xca, 0xee, 0x82, 0xa6, 0x5a, 0x7e, 0x12, 0x36, 0x8d, 0xa9, 0xc5, 0xe1, 0x1d, 0x39, 0x55, 0x71, 0xb0, 0x94, 0xf8, 0xdc, 0x20, 0x4, 0x68, 0x4c, 0x3, 0x27, 0x4b, 0x6f, 0x93, 0xb7, 0xdb, 0xff, 0x3e, 0x1a, 0x76, 0x52, 0xae, 0x8a, 0xe6, 0xc2, 0x79, 0x5d, 0x31, 0x15, 0xe9, 0xcd, 0xa1, 0x85, 0x44, 0x60, 0xc, 0x28, 0xd4, 0xf0, 0x9c, 0xb8, 0x2, 0x26, 0x4a, 0x6e, 0x92, 0xb6, 0xda, 0xfe, 0x3f, 0x1b, 0x77, 0x53, 0xaf, 0x8b, 0xe7, 0xc3, 0x78, 0x5c, 0x30, 0x14, 0xe8, 0xcc, 0xa0, 0x84, 0x45, 0x61, 0xd, 0x29, 0xd5, 0xf1, 0x9d, 0xb9, 0xf6, 0xd2, 0xbe, 0x9a, 0x66, 0x42, 0x2e, 0xa, 0xcb, 0xef, 0x83, 0xa7, 0x5b, 0x7f, 0x13, 0x37, 0x8c, 0xa8, 0xc4, 0xe0, 0x1c, 0x38, 0x54, 0x70, 0xb1, 0x95, 0xf9, 0xdd, 0x21, 0x5, 0x69, 0x4d}, [256]byte{0x0, 0x25, 0x4a, 0x6f, 0x94, 0xb1, 0xde, 0xfb, 0x35, 0x10, 0x7f, 0x5a, 0xa1, 0x84, 0xeb, 0xce, 0x6a, 0x4f, 0x20, 0x5, 0xfe, 0xdb, 0xb4, 0x91, 0x5f, 0x7a, 0x15, 0x30, 0xcb, 0xee, 0x81, 0xa4, 0xd4, 0xf1, 0x9e, 0xbb, 0x40, 0x65, 0xa, 0x2f, 0xe1, 0xc4, 0xab, 0x8e, 0x75, 0x50, 0x3f, 0x1a, 0xbe, 0x9b, 0xf4, 0xd1, 0x2a, 0xf, 0x60, 0x45, 0x8b, 0xae, 0xc1, 0xe4, 0x1f, 0x3a, 0x55, 0x70, 0xb5, 0x90, 0xff, 0xda, 0x21, 0x4, 0x6b, 0x4e, 0x80, 0xa5, 0xca, 0xef, 0x14, 0x31, 0x5e, 0x7b, 0xdf, 0xfa, 0x95, 0xb0, 0x4b, 0x6e, 0x1, 0x24, 0xea, 0xcf, 0xa0, 0x85, 0x7e, 0x5b, 0x34, 0x11, 0x61, 0x44, 0x2b, 0xe, 0xf5, 0xd0, 0xbf, 0x9a, 0x54, 0x71, 0x1e, 0x3b, 0xc0, 0xe5, 0x8a, 0xaf, 0xb, 0x2e, 0x41, 0x64, 0x9f, 0xba, 0xd5, 0xf0, 0x3e, 0x1b, 0x74, 0x51, 0xaa, 0x8f, 0xe0, 0xc5, 0x77, 0x52, 0x3d, 0x18, 0xe3, 0xc6, 0xa9, 0x8c, 0x42, 0x67, 0x8, 0x2d, 0xd6, 0xf3, 0x9c, 0xb9, 0x1d, 0x38, 0x57, 0x72, 0x89, 0xac, 0xc3, 0xe6, 0x28, 0xd, 0x62, 0x47, 0xbc, 0x99, 0xf6, 0xd3, 0xa3, 0x86, 0xe9, 0xcc, 0x37, 0x12, 0x7d, 0x58, 0x96, 0xb3, 0xdc, 0xf9, 0x2, 0x27, 0x48, 0x6d, 0xc9, 0xec, 0x83, 0xa6, 0x5d, 0x78, 0x17, 0x32, 0xfc, 0xd9, 0xb6, 0x93, 0x68, 0x4d, 0x22, 0x7, 0xc2, 0xe7, 0x88, 0xad, 0x56, 0x73, 0x1c, 0x39, 0xf7, 0xd2, 0xbd, 0x98, 0x63, 0x46, 0x29, 0xc, 0xa8, 0x8d, 0xe2, 0xc7, 0x3c, 0x19, 0x76, 0x53, 0x9d, 0xb8, 0xd7, 0xf2, 0x9, 0x2c, 0x43, 0x66, 0x16, 0x33, 0x5c, 0x79, 0x82, 0xa7, 0xc8, 0xed, 0x23, 0x6, 0x69, 0x4c, 0xb7, 0x92, 0xfd, 0xd8, 0x7c, 0x59, 0x36, 0x13, 0xe8, 0xcd, 0xa2, 0x87, 0x49, 0x6c, 0x3, 0x26, 0xdd, 0xf8, 0x97, 0xb2}, [256]byte{0x0, 0x26, 0x4c, 0x6a, 0x98, 0xbe, 0xd4, 0xf2, 0x2d, 0xb, 0x61, 0x47, 0xb5, 0x93, 0xf9, 0xdf, 0x5a, 0x7c, 0x16, 0x30, 0xc2, 0xe4, 0x8e, 0xa8, 0x77, 0x51, 0x3b, 0x1d, 0xef, 0xc9, 0xa3, 0x85, 0xb4, 0x92, 0xf8, 0xde, 0x2c, 0xa, 0x60, 0x46, 0x99, 0xbf, 0xd5, 0xf3, 0x1, 0x27, 0x4d, 0x6b, 0xee, 0xc8, 0xa2, 0x84, 0x76, 0x50, 0x3a, 0x1c, 0xc3, 0xe5, 0x8f, 0xa9, 0x5b, 0x7d, 0x17, 0x31, 0x75, 0x53, 0x39, 0x1f, 0xed, 0xcb, 0xa1, 0x87, 0x58, 0x7e, 0x14, 0x32, 0xc0, 0xe6, 0x8c, 0xaa, 0x2f, 0x9, 0x63, 0x45, 0xb7, 0x91, 0xfb, 0xdd, 0x2, 0x24, 0x4e, 0x68, 0x9a, 0xbc, 0xd6, 0xf0, 0xc1, 0xe7, 0x8d, 0xab, 0x59, 0x7f, 0x15, 0x33, 0xec, 0xca, 0xa0, 0x86, 0x74, 0x52, 0x38, 0x1e, 0x9b, 0xbd, 0xd7, 0xf1, 0x3, 0x25, 0x4f, 0x69, 0xb6, 0x90, 0xfa, 0xdc, 0x2e, 0x8, 0x62, 0x44, 0xea, 0xcc, 0xa6, 0x80, 0x72, 0x54, 0x3e, 0x18, 0xc7, 0xe1, 0x8b, 0xad, 0x5f, 0x79, 0x13, 0x35, 0xb0, 0x96, 0xfc, 0xda, 0x28, 0xe, 0x64, 0x42, 0x9d, 0xbb, 0xd1, 0xf7, 0x5, 0x23, 0x49, 0x6f, 0x5e, 0x78, 0x12, 0x34, 0xc6, 0xe0, 0x8a, 0xac, 0x73, 0x55, 0x3f, 0x19, 0xeb, 0xcd, 0xa7, 0x81, 0x4, 0x22, 0x48, 0x6e, 0x9c, 0xba, 0xd0, 0xf6, 0x29, 0xf, 0x65, 0x43, 0xb1, 0x97, 0xfd, 0xdb, 0x9f, 0xb9, 0xd3, 0xf5, 0x7, 0x21, 0x4b, 0x6d, 0xb2, 0x94, 0xfe, 0xd8, 0x2a, 0xc, 0x66, 0x40, 0xc5, 0xe3, 0x89, 0xaf, 0x5d, 0x7b, 0x11, 0x37, 0xe8, 0xce, 0xa4, 0x82, 0x70, 0x56, 0x3c, 0x1a, 0x2b, 0xd, 0x67, 0x41, 0xb3, 0x95, 0xff, 0xd9, 0x6, 0x20, 0x4a, 0x6c, 0x9e, 0xb8, 0xd2, 0xf4, 0x71, 0x57, 0x3d, 0x1b, 0xe9, 0xcf, 0xa5, 0x83, 0x5c, 0x7a, 0x10, 0x36, 0xc4, 0xe2, 0x88, 0xae}, [256]byte{0x0, 0x27, 0x4e, 0x69, 0x9c, 0xbb, 0xd2, 0xf5, 0x25, 0x2, 0x6b, 0x4c, 0xb9, 0x9e, 0xf7, 0xd0, 0x4a, 0x6d, 0x4, 0x23, 0xd6, 0xf1, 0x98, 0xbf, 0x6f, 0x48, 0x21, 0x6, 0xf3, 0xd4, 0xbd, 0x9a, 0x94, 0xb3, 0xda, 0xfd, 0x8, 0x2f, 0x46, 0x61, 0xb1, 0x96, 0xff, 0xd8, 0x2d, 0xa, 0x63, 0x44, 0xde, 0xf9, 0x90, 0xb7, 0x42, 0x65, 0xc, 0x2b, 0xfb, 0xdc, 0xb5, 0x92, 0x67, 0x40, 0x29, 0xe, 0x35, 0x12, 0x7b, 0x5c, 0xa9, 0x8e, 0xe7, 0xc0, 0x10, 0x37, 0x5e, 0x79, 0x8c, 0xab, 0xc2, 0xe5, 0x7f, 0x58, 0x31, 0x16, 0xe3, 0xc4, 0xad, 0x8a, 0x5a, 0x7d, 0x14, 0x33, 0xc6, 0xe1, 0x88, 0xaf, 0xa1, 0x86, 0xef, 0xc8, 0x3d, 0x1a, 0x73, 0x54, 0x84, 0xa3, 0xca, 0xed, 0x18, 0x3f, 0x56, 0x71, 0xeb, 0xcc, 0xa5, 0x82, 0x77, 0x50, 0x39, 0x1e, 0xce, 0xe9, 0x80, 0xa7, 0x52, 0x75, 0x1c, 0x3b, 0x6a, 0x4d, 0x24, 0x3, 0xf6, 0xd1, 0xb8, 0x9f, 0x4f, 0x68, 0x1, 0x26, 0xd3, 0xf4, 0x9d, 0xba, 0x20, 0x7, 0x6e, 0x49, 0xbc, 0x9b, 0xf2, 0xd5, 0x5, 0x22, 0x4b, 0x6c, 0x99, 0xbe, 0xd7, 0xf0, 0xfe, 0xd9, 0xb0, 0x97, 0x62, 0x45, 0x2c, 0xb, 0xdb, 0xfc, 0x95, 0xb2, 0x47, 0x60, 0x9, 0x2e, 0xb4, 0x93, 0xfa, 0xdd, 0x28, 0xf, 0x66, 0x41, 0x91, 0xb6, 0xdf, 0xf8, 0xd, 0x2a, 0x43, 0x64, 0x5f, 0x78, 0x11, 0x36, 0xc3, 0xe4, 0x8d, 0xaa, 0x7a, 0x5d, 0x34, 0x13, 0xe6, 0xc1, 0xa8, 0x8f, 0x15, 0x32, 0x5b, 0x7c, 0x89, 0xae, 0xc7, 0xe0, 0x30, 0x17, 0x7e, 0x59, 0xac, 0x8b, 0xe2, 0xc5, 0xcb, 0xec, 0x85, 0xa2, 0x57, 0x70, 0x19, 0x3e, 0xee, 0xc9, 0xa0, 0x87, 0x72, 0x55, 0x3c, 0x1b, 0x81, 0xa6, 0xcf, 0xe8, 0x1d, 0x3a, 0x53, 0x74, 0xa4, 0x83, 0xea, 0xcd, 0x38, 0x1f, 0x76, 0x51}, [256]byte{0x0, 0x28, 0x50, 0x78, 0xa0, 0x88, 0xf0, 0xd8, 0x5d, 0x75, 0xd, 0x25, 0xfd, 0xd5, 0xad, 0x85, 0xba, 0x92, 0xea, 0xc2, 0x1a, 0x32, 0x4a, 0x62, 0xe7, 0xcf, 0xb7, 0x9f, 0x47, 0x6f, 0x17, 0x3f, 0x69, 0x41, 0x39, 0x11, 0xc9, 0xe1, 0x99, 0xb1, 0x34, 0x1c, 0x64, 0x4c, 0x94, 0xbc, 0xc4, 0xec, 0xd3, 0xfb, 0x83, 0xab, 0x73, 0x5b, 0x23, 0xb, 0x8e, 0xa6, 0xde, 0xf6, 0x2e, 0x6, 0x7e, 0x56, 0xd2, 0xfa, 0x82, 0xaa, 0x72, 0x5a, 0x22, 0xa, 0x8f, 0xa7, 0xdf, 0xf7, 0x2f, 0x7, 0x7f, 0x57, 0x68, 0x40, 0x38, 0x10, 0xc8, 0xe0, 0x98, 0xb0, 0x35, 0x1d, 0x65, 0x4d, 0x95, 0xbd, 0xc5, 0xed, 0xbb, 0x93, 0xeb, 0xc3, 0x1b, 0x33, 0x4b, 0x63, 0xe6, 0xce, 0xb6, 0x9e, 0x46, 0x6e, 0x16, 0x3e, 0x1, 0x29, 0x51, 0x79, 0xa1, 0x89, 0xf1, 0xd9, 0x5c, 0x74, 0xc, 0x24, 0xfc, 0xd4, 0xac, 0x84, 0xb9, 0x91, 0xe9, 0xc1, 0x19, 0x31, 0x49, 0x61, 0xe4, 0xcc, 0xb4, 0x9c, 0x44, 0x6c, 0x14, 0x3c, 0x3, 0x2b, 0x53, 0x7b, 0xa3, 0x8b, 0xf3, 0xdb, 0x5e, 0x76, 0xe, 0x26, 0xfe, 0xd6, 0xae, 0x86, 0xd0, 0xf8, 0x80, 0xa8, 0x70, 0x58, 0x20, 0x8, 0x8d, 0xa5, 0xdd, 0xf5, 0x2d, 0x5, 0x7d, 0x55, 0x6a, 0x42, 0x3a, 0x12, 0xca, 0xe2, 0x9a, 0xb2, 0x37, 0x1f, 0x67, 0x4f, 0x97, 0xbf, 0xc7, 0xef, 0x6b, 0x43, 0x3b, 0x13, 0xcb, 0xe3, 0x9b, 0xb3, 0x36, 0x1e, 0x66, 0x4e, 0x96, 0xbe, 0xc6, 0xee, 0xd1, 0xf9, 0x81, 0xa9, 0x71, 0x59, 0x21, 0x9, 0x8c, 0xa4, 0xdc, 0xf4, 0x2c, 0x4, 0x7c, 0x54, 0x2, 0x2a, 0x52, 0x7a, 0xa2, 0x8a, 0xf2, 0xda, 0x5f, 0x77, 0xf, 0x27, 0xff, 0xd7, 0xaf, 0x87, 0xb8, 0x90, 0xe8, 0xc0, 0x18, 0x30, 0x48, 0x60, 0xe5, 0xcd, 0xb5, 0x9d, 0x45, 0x6d, 0x15, 0x3d}, [256]byte{0x0, 0x29, 0x52, 0x7b, 0xa4, 0x8d, 0xf6, 0xdf, 0x55, 0x7c, 0x7, 0x2e, 0xf1, 0xd8, 0xa3, 0x8a, 0xaa, 0x83, 0xf8, 0xd1, 0xe, 0x27, 0x5c, 0x75, 0xff, 0xd6, 0xad, 0x84, 0x5b, 0x72, 0x9, 0x20, 0x49, 0x60, 0x1b, 0x32, 0xed, 0xc4, 0xbf, 0x96, 0x1c, 0x35, 0x4e, 0x67, 0xb8, 0x91, 0xea, 0xc3, 0xe3, 0xca, 0xb1, 0x98, 0x47, 0x6e, 0x15, 0x3c, 0xb6, 0x9f, 0xe4, 0xcd, 0x12, 0x3b, 0x40, 0x69, 0x92, 0xbb, 0xc0, 0xe9, 0x36, 0x1f, 0x64, 0x4d, 0xc7, 0xee, 0x95, 0xbc, 0x63, 0x4a, 0x31, 0x18, 0x38, 0x11, 0x6a, 0x43, 0x9c, 0xb5, 0xce, 0xe7, 0x6d, 0x44, 0x3f, 0x16, 0xc9, 0xe0, 0x9b, 0xb2, 0xdb, 0xf2, 0x89, 0xa0, 0x7f, 0x56, 0x2d, 0x4, 0x8e, 0xa7, 0xdc, 0xf5, 0x2a, 0x3, 0x78, 0x51, 0x71, 0x58, 0x23, 0xa, 0xd5, 0xfc, 0x87, 0xae, 0x24, 0xd, 0x76, 0x5f, 0x80, 0xa9, 0xd2, 0xfb, 0x39, 0x10, 0x6b, 0x42, 0x9d, 0xb4, 0xcf, 0xe6, 0x6c, 0x45, 0x3e, 0x17, 0xc8, 0xe1, 0x9a, 0xb3, 0x93, 0xba, 0xc1, 0xe8, 0x37, 0x1e, 0x65, 0x4c, 0xc6, 0xef, 0x94, 0xbd, 0x62, 0x4b, 0x30, 0x19, 0x70, 0x59, 0x22, 0xb, 0xd4, 0xfd, 0x86, 0xaf, 0x25, 0xc, 0x77, 0x5e, 0x81, 0xa8, 0xd3, 0xfa, 0xda, 0xf3, 0x88, 0xa1, 0x7e, 0x57, 0x2c, 0x5, 0x8f, 0xa6, 0xdd, 0xf4, 0x2b, 0x2, 0x79, 0x50, 0xab, 0x82, 0xf9, 0xd0, 0xf, 0x26, 0x5d, 0x74, 0xfe, 0xd7, 0xac, 0x85, 0x5a, 0x73, 0x8, 0x21, 0x1, 0x28, 0x53, 0x7a, 0xa5, 0x8c, 0xf7, 0xde, 0x54, 0x7d, 0x6, 0x2f, 0xf0, 0xd9, 0xa2, 0x8b, 0xe2, 0xcb, 0xb0, 0x99, 0x46, 0x6f, 0x14, 0x3d, 0xb7, 0x9e, 0xe5, 0xcc, 0x13, 0x3a, 0x41, 0x68, 0x48, 0x61, 0x1a, 0x33, 0xec, 0xc5, 0xbe, 0x97, 0x1d, 0x34, 0x4f, 0x66, 0xb9, 0x90, 0xeb, 0xc2}, [256]byte{0x0, 0x2a, 0x54, 0x7e, 0xa8, 0x82, 0xfc, 0xd6, 0x4d, 0x67, 0x19, 0x33, 0xe5, 0xcf, 0xb1, 0x9b, 0x9a, 0xb0, 0xce, 0xe4, 0x32, 0x18, 0x66, 0x4c, 0xd7, 0xfd, 0x83, 0xa9, 0x7f, 0x55, 0x2b, 0x1, 0x29, 0x3, 0x7d, 0x57, 0x81, 0xab, 0xd5, 0xff, 0x64, 0x4e, 0x30, 0x1a, 0xcc, 0xe6, 0x98, 0xb2, 0xb3, 0x99, 0xe7, 0xcd, 0x1b, 0x31, 0x4f, 0x65, 0xfe, 0xd4, 0xaa, 0x80, 0x56, 0x7c, 0x2, 0x28, 0x52, 0x78, 0x6, 0x2c, 0xfa, 0xd0, 0xae, 0x84, 0x1f, 0x35, 0x4b, 0x61, 0xb7, 0x9d, 0xe3, 0xc9, 0xc8, 0xe2, 0x9c, 0xb6, 0x60, 0x4a, 0x34, 0x1e, 0x85, 0xaf, 0xd1, 0xfb, 0x2d, 0x7, 0x79, 0x53, 0x7b, 0x51, 0x2f, 0x5, 0xd3, 0xf9, 0x87, 0xad, 0x36, 0x1c, 0x62, 0x48, 0x9e, 0xb4, 0xca, 0xe0, 0xe1, 0xcb, 0xb5, 0x9f, 0x49, 0x63, 0x1d, 0x37, 0xac, 0x86, 0xf8, 0xd2, 0x4, 0x2e, 0x50, 0x7a, 0xa4, 0x8e, 0xf0, 0xda, 0xc, 0x26, 0x58, 0x72, 0xe9, 0xc3, 0xbd, 0x97, 0x41, 0x6b, 0x15, 0x3f, 0x3e, 0x14, 0x6a, 0x40, 0x96, 0xbc, 0xc2, 0xe8, 0x73, 0x59, 0x27, 0xd, 0xdb, 0xf1, 0x8f, 0xa5, 0x8d, 0xa7, 0xd9, 0xf3, 0x25, 0xf, 0x71, 0x5b, 0xc0, 0xea, 0x94, 0xbe, 0x68, 0x42, 0x3c, 0x16, 0x17, 0x3d, 0x43, 0x69, 0xbf, 0x95, 0xeb, 0xc1, 0x5a, 0x70, 0xe, 0x24, 0xf2, 0xd8, 0xa6, 0x8c, 0xf6, 0xdc, 0xa2, 0x88, 0x5e, 0x74, 0xa, 0x20, 0xbb, 0x91, 0xef, 0xc5, 0x13, 0x39, 0x47, 0x6d, 0x6c, 0x46, 0x38, 0x12, 0xc4, 0xee, 0x90, 0xba, 0x21, 0xb, 0x75, 0x5f, 0x89, 0xa3, 0xdd, 0xf7, 0xdf, 0xf5, 0x8b, 0xa1, 0x77, 0x5d, 0x23, 0x9, 0x92, 0xb8, 0xc6, 0xec, 0x3a, 0x10, 0x6e, 0x44, 0x45, 0x6f, 0x11, 0x3b, 0xed, 0xc7, 0xb9, 0x93, 0x8, 0x22, 0x5c, 0x76, 0xa0, 0x8a, 0xf4, 0xde}, [256]byte{0x0, 0x2b, 0x56, 0x7d, 0xac, 0x87, 0xfa, 0xd1, 0x45, 0x6e, 0x13, 0x38, 0xe9, 0xc2, 0xbf, 0x94, 0x8a, 0xa1, 0xdc, 0xf7, 0x26, 0xd, 0x70, 0x5b, 0xcf, 0xe4, 0x99, 0xb2, 0x63, 0x48, 0x35, 0x1e, 0x9, 0x22, 0x5f, 0x74, 0xa5, 0x8e, 0xf3, 0xd8, 0x4c, 0x67, 0x1a, 0x31, 0xe0, 0xcb, 0xb6, 0x9d, 0x83, 0xa8, 0xd5, 0xfe, 0x2f, 0x4, 0x79, 0x52, 0xc6, 0xed, 0x90, 0xbb, 0x6a, 0x41, 0x3c, 0x17, 0x12, 0x39, 0x44, 0x6f, 0xbe, 0x95, 0xe8, 0xc3, 0x57, 0x7c, 0x1, 0x2a, 0xfb, 0xd0, 0xad, 0x86, 0x98, 0xb3, 0xce, 0xe5, 0x34, 0x1f, 0x62, 0x49, 0xdd, 0xf6, 0x8b, 0xa0, 0x71, 0x5a, 0x27, 0xc, 0x1b, 0x30, 0x4d, 0x66, 0xb7, 0x9c, 0xe1, 0xca, 0x5e, 0x75, 0x8, 0x23, 0xf2, 0xd9, 0xa4, 0x8f, 0x91, 0xba, 0xc7, 0xec, 0x3d, 0x16, 0x6b, 0x40, 0xd4, 0xff, 0x82, 0xa9, 0x78, 0x53, 0x2e, 0x5, 0x24, 0xf, 0x72, 0x59, 0x88, 0xa3, 0xde, 0xf5, 0x61, 0x4a, 0x37, 0x1c, 0xcd, 0xe6, 0x9b, 0xb0, 0xae, 0x85, 0xf8, 0xd3, 0x2, 0x29, 0x54, 0x7f, 0xeb, 0xc0, 0xbd, 0x96, 0x47, 0x6c, 0x11, 0x3a, 0x2d, 0x6, 0x7b, 0x50, 0x81, 0xaa, 0xd7, 0xfc, 0x68, 0x43, 0x3e, 0x15, 0xc4, 0xef, 0x92, 0xb9, 0xa7, 0x8c, 0xf1, 0xda, 0xb, 0x20, 0x5d, 0x76, 0xe2, 0xc9, 0xb4, 0x9f, 0x4e, 0x65, 0x18, 0x33, 0x36, 0x1d, 0x60, 0x4b, 0x9a, 0xb1, 0xcc, 0xe7, 0x73, 0x58, 0x25, 0xe, 0xdf, 0xf4, 0x89, 0xa2, 0xbc, 0x97, 0xea, 0xc1, 0x10, 0x3b, 0x46, 0x6d, 0xf9, 0xd2, 0xaf, 0x84, 0x55, 0x7e, 0x3, 0x28, 0x3f, 0x14, 0x69, 0x42, 0x93, 0xb8, 0xc5, 0xee, 0x7a, 0x51, 0x2c, 0x7, 0xd6, 0xfd, 0x80, 0xab, 0xb5, 0x9e, 0xe3, 0xc8, 0x19, 0x32, 0x4f, 0x64, 0xf0, 0xdb, 0xa6, 0x8d, 0x5c, 0x77, 0xa, 0x21}, [256]byte{0x0, 0x2c, 0x58, 0x74, 0xb0, 0x9c, 0xe8, 0xc4, 0x7d, 0x51, 0x25, 0x9, 0xcd, 0xe1, 0x95, 0xb9, 0xfa, 0xd6, 0xa2, 0x8e, 0x4a, 0x66, 0x12, 0x3e, 0x87, 0xab, 0xdf, 0xf3, 0x37, 0x1b, 0x6f, 0x43, 0xe9, 0xc5, 0xb1, 0x9d, 0x59, 0x75, 0x1, 0x2d, 0x94, 0xb8, 0xcc, 0xe0, 0x24, 0x8, 0x7c, 0x50, 0x13, 0x3f, 0x4b, 0x67, 0xa3, 0x8f, 0xfb, 0xd7, 0x6e, 0x42, 0x36, 0x1a, 0xde, 0xf2, 0x86, 0xaa, 0xcf, 0xe3, 0x97, 0xbb, 0x7f, 0x53, 0x27, 0xb, 0xb2, 0x9e, 0xea, 0xc6, 0x2, 0x2e, 0x5a, 0x76, 0x35, 0x19, 0x6d, 0x41, 0x85, 0xa9, 0xdd, 0xf1, 0x48, 0x64, 0x10, 0x3c, 0xf8, 0xd4, 0xa0, 0x8c, 0x26, 0xa, 0x7e, 0x52, 0x96, 0xba, 0xce, 0xe2, 0x5b, 0x77, 0x3, 0x2f, 0xeb, 0xc7, 0xb3, 0x9f, 0xdc, 0xf0, 0x84, 0xa8, 0x6c, 0x40, 0x34, 0x18, 0xa1, 0x8d, 0xf9, 0xd5, 0x11, 0x3d, 0x49, 0x65, 0x83, 0xaf, 0xdb, 0xf7, 0x33, 0x1f, 0x6b, 0x47, 0xfe, 0xd2, 0xa6, 0x8a, 0x4e, 0x62, 0x16, 0x3a, 0x79, 0x55, 0x21, 0xd, 0xc9, 0xe5, 0x91, 0xbd, 0x4, 0x28, 0x5c, 0x70, 0xb4, 0x98, 0xec, 0xc0, 0x6a, 0x46, 0x32, 0x1e, 0xda, 0xf6, 0x82, 0xae, 0x17, 0x3b, 0x4f, 0x63, 0xa7, 0x8b, 0xff, 0xd3, 0x90, 0xbc, 0xc8, 0xe4, 0x20, 0xc, 0x78, 0x54, 0xed, 0xc1, 0xb5, 0x99, 0x5d, 0x71, 0x5, 0x29, 0x4c, 0x60, 0x14, 0x38, 0xfc, 0xd0, 0xa4, 0x88, 0x31, 0x1d, 0x69, 0x45, 0x81, 0xad, 0xd9, 0xf5, 0xb6, 0x9a, 0xee, 0xc2, 0x6, 0x2a, 0x5e, 0x72, 0xcb, 0xe7, 0x93, 0xbf, 0x7b, 0x57, 0x23, 0xf, 0xa5, 0x89, 0xfd, 0xd1, 0x15, 0x39, 0x4d, 0x61, 0xd8, 0xf4, 0x80, 0xac, 0x68, 0x44, 0x30, 0x1c, 0x5f, 0x73, 0x7, 0x2b, 0xef, 0xc3, 0xb7, 0x9b, 0x22, 0xe, 0x7a, 0x56, 0x92, 0xbe, 0xca, 0xe6}, [256]byte{0x0, 0x2d, 0x5a, 0x77, 0xb4, 0x99, 0xee, 0xc3, 0x75, 0x58, 0x2f, 0x2, 0xc1, 0xec, 0x9b, 0xb6, 0xea, 0xc7, 0xb0, 0x9d, 0x5e, 0x73, 0x4, 0x29, 0x9f, 0xb2, 0xc5, 0xe8, 0x2b, 0x6, 0x71, 0x5c, 0xc9, 0xe4, 0x93, 0xbe, 0x7d, 0x50, 0x27, 0xa, 0xbc, 0x91, 0xe6, 0xcb, 0x8, 0x25, 0x52, 0x7f, 0x23, 0xe, 0x79, 0x54, 0x97, 0xba, 0xcd, 0xe0, 0x56, 0x7b, 0xc, 0x21, 0xe2, 0xcf, 0xb8, 0x95, 0x8f, 0xa2, 0xd5, 0xf8, 0x3b, 0x16, 0x61, 0x4c, 0xfa, 0xd7, 0xa0, 0x8d, 0x4e, 0x63, 0x14, 0x39, 0x65, 0x48, 0x3f, 0x12, 0xd1, 0xfc, 0x8b, 0xa6, 0x10, 0x3d, 0x4a, 0x67, 0xa4, 0x89, 0xfe, 0xd3, 0x46, 0x6b, 0x1c, 0x31, 0xf2, 0xdf, 0xa8, 0x85, 0x33, 0x1e, 0x69, 0x44, 0x87, 0xaa, 0xdd, 0xf0, 0xac, 0x81, 0xf6, 0xdb, 0x18, 0x35, 0x42, 0x6f, 0xd9, 0xf4, 0x83, 0xae, 0x6d, 0x40, 0x37, 0x1a, 0x3, 0x2e, 0x59, 0x74, 0xb7, 0x9a, 0xed, 0xc0, 0x76, 0x5b, 0x2c, 0x1, 0xc2, 0xef, 0x98, 0xb5, 0xe9, 0xc4, 0xb3, 0x9e, 0x5d, 0x70, 0x7, 0x2a, 0x9c, 0xb1, 0xc6, 0xeb, 0x28, 0x5, 0x72, 0x5f, 0xca, 0xe7, 0x90, 0xbd, 0x7e, 0x53, 0x24, 0x9, 0xbf, 0x92, 0xe5, 0xc8, 0xb, 0x26, 0x51, 0x7c, 0x20, 0xd, 0x7a, 0x57, 0x94, 0xb9, 0xce, 0xe3, 0x55, 0x78, 0xf, 0x22, 0xe1, 0xcc, 0xbb, 0x96, 0x8c, 0xa1, 0xd6, 0xfb, 0x38, 0x15, 0x62, 0x4f, 0xf9, 0xd4, 0xa3, 0x8e, 0x4d, 0x60, 0x17, 0x3a, 0x66, 0x4b, 0x3c, 0x11, 0xd2, 0xff, 0x88, 0xa5, 0x13, 0x3e, 0x49, 0x64, 0xa7, 0x8a, 0xfd, 0xd0, 0x45, 0x68, 0x1f, 0x32, 0xf1, 0xdc, 0xab, 0x86, 0x30, 0x1d, 0x6a, 0x47, 0x84, 0xa9, 0xde, 0xf3, 0xaf, 0x82, 0xf5, 0xd8, 0x1b, 0x36, 0x41, 0x6c, 0xda, 0xf7, 0x80, 0xad, 0x6e, 0x43, 0x34, 0x19}, [256]byte{0x0, 0x2e, 0x5c, 0x72, 0xb8, 0x96, 0xe4, 0xca, 0x6d, 0x43, 0x31, 0x1f, 0xd5, 0xfb, 0x89, 0xa7, 0xda, 0xf4, 0x86, 0xa8, 0x62, 0x4c, 0x3e, 0x10, 0xb7, 0x99, 0xeb, 0xc5, 0xf, 0x21, 0x53, 0x7d, 0xa9, 0x87, 0xf5, 0xdb, 0x11, 0x3f, 0x4d, 0x63, 0xc4, 0xea, 0x98, 0xb6, 0x7c, 0x52, 0x20, 0xe, 0x73, 0x5d, 0x2f, 0x1, 0xcb, 0xe5, 0x97, 0xb9, 0x1e, 0x30, 0x42, 0x6c, 0xa6, 0x88, 0xfa, 0xd4, 0x4f, 0x61, 0x13, 0x3d, 0xf7, 0xd9, 0xab, 0x85, 0x22, 0xc, 0x7e, 0x50, 0x9a, 0xb4, 0xc6, 0xe8, 0x95, 0xbb, 0xc9, 0xe7, 0x2d, 0x3, 0x71, 0x5f, 0xf8, 0xd6, 0xa4, 0x8a, 0x40, 0x6e, 0x1c, 0x32, 0xe6, 0xc8, 0xba, 0x94, 0x5e, 0x70, 0x2, 0x2c, 0x8b, 0xa5, 0xd7, 0xf9, 0x33, 0x1d, 0x6f, 0x41, 0x3c, 0x12, 0x60, 0x4e, 0x84, 0xaa, 0xd8, 0xf6, 0x51, 0x7f, 0xd, 0x23, 0xe9, 0xc7, 0xb5, 0x9b, 0x9e, 0xb0, 0xc2, 0xec, 0x26, 0x8, 0x7a, 0x54, 0xf3, 0xdd, 0xaf, 0x81, 0x4b, 0x65, 0x17, 0x39, 0x44, 0x6a, 0x18, 0x36, 0xfc, 0xd2, 0xa0, 0x8e, 0x29, 0x7, 0x75, 0x5b, 0x91, 0xbf, 0xcd, 0xe3, 0x37, 0x19, 0x6b, 0x45, 0x8f, 0xa1, 0xd3, 0xfd, 0x5a, 0x74, 0x6, 0x28, 0xe2, 0xcc, 0xbe, 0x90, 0xed, 0xc3, 0xb1, 0x9f, 0x55, 0x7b, 0x9, 0x27, 0x80, 0xae, 0xdc, 0xf2, 0x38, 0x16, 0x64, 0x4a, 0xd1, 0xff, 0x8d, 0xa3, 0x69, 0x47, 0x35, 0x1b, 0xbc, 0x92, 0xe0, 0xce, 0x4, 0x2a, 0x58, 0x76, 0xb, 0x25, 0x57, 0x79, 0xb3, 0x9d, 0xef, 0xc1, 0x66, 0x48, 0x3a, 0x14, 0xde, 0xf0, 0x82, 0xac, 0x78, 0x56, 0x24, 0xa, 0xc0, 0xee, 0x9c, 0xb2, 0x15, 0x3b, 0x49, 0x67, 0xad, 0x83, 0xf1, 0xdf, 0xa2, 0x8c, 0xfe, 0xd0, 0x1a, 0x34, 0x46, 0x68, 0xcf, 0xe1, 0x93, 0xbd, 0x77, 0x59, 0x2b, 0x5}, [256]byte{0x0, 0x2f, 0x5e, 0x71, 0xbc, 0x93, 0xe2, 0xcd, 0x65, 0x4a, 0x3b, 0x14, 0xd9, 0xf6, 0x87, 0xa8, 0xca, 0xe5, 0x94, 0xbb, 0x76, 0x59, 0x28, 0x7, 0xaf, 0x80, 0xf1, 0xde, 0x13, 0x3c, 0x4d, 0x62, 0x89, 0xa6, 0xd7, 0xf8, 0x35, 0x1a, 0x6b, 0x44, 0xec, 0xc3, 0xb2, 0x9d, 0x50, 0x7f, 0xe, 0x21, 0x43, 0x6c, 0x1d, 0x32, 0xff, 0xd0, 0xa1, 0x8e, 0x26, 0x9, 0x78, 0x57, 0x9a, 0xb5, 0xc4, 0xeb, 0xf, 0x20, 0x51, 0x7e, 0xb3, 0x9c, 0xed, 0xc2, 0x6a, 0x45, 0x34, 0x1b, 0xd6, 0xf9, 0x88, 0xa7, 0xc5, 0xea, 0x9b, 0xb4, 0x79, 0x56, 0x27, 0x8, 0xa0, 0x8f, 0xfe, 0xd1, 0x1c, 0x33, 0x42, 0x6d, 0x86, 0xa9, 0xd8, 0xf7, 0x3a, 0x15, 0x64, 0x4b, 0xe3, 0xcc, 0xbd, 0x92, 0x5f, 0x70, 0x1, 0x2e, 0x4c, 0x63, 0x12, 0x3d, 0xf0, 0xdf, 0xae, 0x81, 0x29, 0x6, 0x77, 0x58, 0x95, 0xba, 0xcb, 0xe4, 0x1e, 0x31, 0x40, 0x6f, 0xa2, 0x8d, 0xfc, 0xd3, 0x7b, 0x54, 0x25, 0xa, 0xc7, 0xe8, 0x99, 0xb6, 0xd4, 0xfb, 0x8a, 0xa5, 0x68, 0x47, 0x36, 0x19, 0xb1, 0x9e, 0xef, 0xc0, 0xd, 0x22, 0x53, 0x7c, 0x97, 0xb8, 0xc9, 0xe6, 0x2b, 0x4, 0x75, 0x5a, 0xf2, 0xdd, 0xac, 0x83, 0x4e, 0x61, 0x10, 0x3f, 0x5d, 0x72, 0x3, 0x2c, 0xe1, 0xce, 0xbf, 0x90, 0x38, 0x17, 0x66, 0x49, 0x84, 0xab, 0xda, 0xf5, 0x11, 0x3e, 0x4f, 0x60, 0xad, 0x82, 0xf3, 0xdc, 0x74, 0x5b, 0x2a, 0x5, 0xc8, 0xe7, 0x96, 0xb9, 0xdb, 0xf4, 0x85, 0xaa, 0x67, 0x48, 0x39, 0x16, 0xbe, 0x91, 0xe0, 0xcf, 0x2, 0x2d, 0x5c, 0x73, 0x98, 0xb7, 0xc6, 0xe9, 0x24, 0xb, 0x7a, 0x55, 0xfd, 0xd2, 0xa3, 0x8c, 0x41, 0x6e, 0x1f, 0x30, 0x52, 0x7d, 0xc, 0x23, 0xee, 0xc1, 0xb0, 0x9f, 0x37, 0x18, 0x69, 0x46, 0x8b, 0xa4, 0xd5, 0xfa}, [256]byte{0x0, 0x30, 0x60, 0x50, 0xc0, 0xf0, 0xa0, 0x90, 0x9d, 0xad, 0xfd, 0xcd, 0x5d, 0x6d, 0x3d, 0xd, 0x27, 0x17, 0x47, 0x77, 0xe7, 0xd7, 0x87, 0xb7, 0xba, 0x8a, 0xda, 0xea, 0x7a, 0x4a, 0x1a, 0x2a, 0x4e, 0x7e, 0x2e, 0x1e, 0x8e, 0xbe, 0xee, 0xde, 0xd3, 0xe3, 0xb3, 0x83, 0x13, 0x23, 0x73, 0x43, 0x69, 0x59, 0x9, 0x39, 0xa9, 0x99, 0xc9, 0xf9, 0xf4, 0xc4, 0x94, 0xa4, 0x34, 0x4, 0x54, 0x64, 0x9c, 0xac, 0xfc, 0xcc, 0x5c, 0x6c, 0x3c, 0xc, 0x1, 0x31, 0x61, 0x51, 0xc1, 0xf1, 0xa1, 0x91, 0xbb, 0x8b, 0xdb, 0xeb, 0x7b, 0x4b, 0x1b, 0x2b, 0x26, 0x16, 0x46, 0x76, 0xe6, 0xd6, 0x86, 0xb6, 0xd2, 0xe2, 0xb2, 0x82, 0x12, 0x22, 0x72, 0x42, 0x4f, 0x7f, 0x2f, 0x1f, 0x8f, 0xbf, 0xef, 0xdf, 0xf5, 0xc5, 0x95, 0xa5, 0x35, 0x5, 0x55, 0x65, 0x68, 0x58, 0x8, 0x38, 0xa8, 0x98, 0xc8, 0xf8, 0x25, 0x15, 0x45, 0x75, 0xe5, 0xd5, 0x85, 0xb5, 0xb8, 0x88, 0xd8, 0xe8, 0x78, 0x48, 0x18, 0x28, 0x2, 0x32, 0x62, 0x52, 0xc2, 0xf2, 0xa2, 0x92, 0x9f, 0xaf, 0xff, 0xcf, 0x5f, 0x6f, 0x3f, 0xf, 0x6b, 0x5b, 0xb, 0x3b, 0xab, 0x9b, 0xcb, 0xfb, 0xf6, 0xc6, 0x96, 0xa6, 0x36, 0x6, 0x56, 0x66, 0x4c, 0x7c, 0x2c, 0x1c, 0x8c, 0xbc, 0xec, 0xdc, 0xd1, 0xe1, 0xb1, 0x81, 0x11, 0x21, 0x71, 0x41, 0xb9, 0x89, 0xd9, 0xe9, 0x79, 0x49, 0x19, 0x29, 0x24, 0x14, 0x44, 0x74, 0xe4, 0xd4, 0x84, 0xb4, 0x9e, 0xae, 0xfe, 0xce, 0x5e, 0x6e, 0x3e, 0xe, 0x3, 0x33, 0x63, 0x53, 0xc3, 0xf3, 0xa3, 0x93, 0xf7, 0xc7, 0x97, 0xa7, 0x37, 0x7, 0x57, 0x67, 0x6a, 0x5a, 0xa, 0x3a, 0xaa, 0x9a, 0xca, 0xfa, 0xd0, 0xe0, 0xb0, 0x80, 0x10, 0x20, 0x70, 0x40, 0x4d, 0x7d, 0x2d, 0x1d, 0x8d, 0xbd, 0xed, 0xdd}, [256]byte{0x0, 0x31, 0x62, 0x53, 0xc4, 0xf5, 0xa6, 0x97, 0x95, 0xa4, 0xf7, 0xc6, 0x51, 0x60, 0x33, 0x2, 0x37, 0x6, 0x55, 0x64, 0xf3, 0xc2, 0x91, 0xa0, 0xa2, 0x93, 0xc0, 0xf1, 0x66, 0x57, 0x4, 0x35, 0x6e, 0x5f, 0xc, 0x3d, 0xaa, 0x9b, 0xc8, 0xf9, 0xfb, 0xca, 0x99, 0xa8, 0x3f, 0xe, 0x5d, 0x6c, 0x59, 0x68, 0x3b, 0xa, 0x9d, 0xac, 0xff, 0xce, 0xcc, 0xfd, 0xae, 0x9f, 0x8, 0x39, 0x6a, 0x5b, 0xdc, 0xed, 0xbe, 0x8f, 0x18, 0x29, 0x7a, 0x4b, 0x49, 0x78, 0x2b, 0x1a, 0x8d, 0xbc, 0xef, 0xde, 0xeb, 0xda, 0x89, 0xb8, 0x2f, 0x1e, 0x4d, 0x7c, 0x7e, 0x4f, 0x1c, 0x2d, 0xba, 0x8b, 0xd8, 0xe9, 0xb2, 0x83, 0xd0, 0xe1, 0x76, 0x47, 0x14, 0x25, 0x27, 0x16, 0x45, 0x74, 0xe3, 0xd2, 0x81, 0xb0, 0x85, 0xb4, 0xe7, 0xd6, 0x41, 0x70, 0x23, 0x12, 0x10, 0x21, 0x72, 0x43, 0xd4, 0xe5, 0xb6, 0x87, 0xa5, 0x94, 0xc7, 0xf6, 0x61, 0x50, 0x3, 0x32, 0x30, 0x1, 0x52, 0x63, 0xf4, 0xc5, 0x96, 0xa7, 0x92, 0xa3, 0xf0, 0xc1, 0x56, 0x67, 0x34, 0x5, 0x7, 0x36, 0x65, 0x54, 0xc3, 0xf2, 0xa1, 0x90, 0xcb, 0xfa, 0xa9, 0x98, 0xf, 0x3e, 0x6d, 0x5c, 0x5e, 0x6f, 0x3c, 0xd, 0x9a, 0xab, 0xf8, 0xc9, 0xfc, 0xcd, 0x9e, 0xaf, 0x38, 0x9, 0x5a, 0x6b, 0x69, 0x58, 0xb, 0x3a, 0xad, 0x9c, 0xcf, 0xfe, 0x79, 0x48, 0x1b, 0x2a, 0xbd, 0x8c, 0xdf, 0xee, 0xec, 0xdd, 0x8e, 0xbf, 0x28, 0x19, 0x4a, 0x7b, 0x4e, 0x7f, 0x2c, 0x1d, 0x8a, 0xbb, 0xe8, 0xd9, 0xdb, 0xea, 0xb9, 0x88, 0x1f, 0x2e, 0x7d, 0x4c, 0x17, 0x26, 0x75, 0x44, 0xd3, 0xe2, 0xb1, 0x80, 0x82, 0xb3, 0xe0, 0xd1, 0x46, 0x77, 0x24, 0x15, 0x20, 0x11, 0x42, 0x73, 0xe4, 0xd5, 0x86, 0xb7, 0xb5, 0x84, 0xd7, 0xe6, 0x71, 0x40, 0x13, 0x22}, [256]byte{0x0, 0x32, 0x64, 0x56, 0xc8, 0xfa, 0xac, 0x9e, 0x8d, 0xbf, 0xe9, 0xdb, 0x45, 0x77, 0x21, 0x13, 0x7, 0x35, 0x63, 0x51, 0xcf, 0xfd, 0xab, 0x99, 0x8a, 0xb8, 0xee, 0xdc, 0x42, 0x70, 0x26, 0x14, 0xe, 0x3c, 0x6a, 0x58, 0xc6, 0xf4, 0xa2, 0x90, 0x83, 0xb1, 0xe7, 0xd5, 0x4b, 0x79, 0x2f, 0x1d, 0x9, 0x3b, 0x6d, 0x5f, 0xc1, 0xf3, 0xa5, 0x97, 0x84, 0xb6, 0xe0, 0xd2, 0x4c, 0x7e, 0x28, 0x1a, 0x1c, 0x2e, 0x78, 0x4a, 0xd4, 0xe6, 0xb0, 0x82, 0x91, 0xa3, 0xf5, 0xc7, 0x59, 0x6b, 0x3d, 0xf, 0x1b, 0x29, 0x7f, 0x4d, 0xd3, 0xe1, 0xb7, 0x85, 0x96, 0xa4, 0xf2, 0xc0, 0x5e, 0x6c, 0x3a, 0x8, 0x12, 0x20, 0x76, 0x44, 0xda, 0xe8, 0xbe, 0x8c, 0x9f, 0xad, 0xfb, 0xc9, 0x57, 0x65, 0x33, 0x1, 0x15, 0x27, 0x71, 0x43, 0xdd, 0xef, 0xb9, 0x8b, 0x98, 0xaa, 0xfc, 0xce, 0x50, 0x62, 0x34, 0x6, 0x38, 0xa, 0x5c, 0x6e, 0xf0, 0xc2, 0x94, 0xa6, 0xb5, 0x87, 0xd1, 0xe3, 0x7d, 0x4f, 0x19, 0x2b, 0x3f, 0xd, 0x5b, 0x69, 0xf7, 0xc5, 0x93, 0xa1, 0xb2, 0x80, 0xd6, 0xe4, 0x7a, 0x48, 0x1e, 0x2c, 0x36, 0x4, 0x52, 0x60, 0xfe, 0xcc, 0x9a, 0xa8, 0xbb, 0x89, 0xdf, 0xed, 0x73, 0x41, 0x17, 0x25, 0x31, 0x3, 0x55, 0x67, 0xf9, 0xcb, 0x9d, 0xaf, 0xbc, 0x8e, 0xd8, 0xea, 0x74, 0x46, 0x10, 0x22, 0x24, 0x16, 0x40, 0x72, 0xec, 0xde, 0x88, 0xba, 0xa9, 0x9b, 0xcd, 0xff, 0x61, 0x53, 0x5, 0x37, 0x23, 0x11, 0x47, 0x75, 0xeb, 0xd9, 0x8f, 0xbd, 0xae, 0x9c, 0xca, 0xf8, 0x66, 0x54, 0x2, 0x30, 0x2a, 0x18, 0x4e, 0x7c, 0xe2, 0xd0, 0x86, 0xb4, 0xa7, 0x95, 0xc3, 0xf1, 0x6f, 0x5d, 0xb, 0x39, 0x2d, 0x1f, 0x49, 0x7b, 0xe5, 0xd7, 0x81, 0xb3, 0xa0, 0x92, 0xc4, 0xf6, 0x68, 0x5a, 0xc, 0x3e}, [256]byte{0x0, 0x33, 0x66, 0x55, 0xcc, 0xff, 0xaa, 0x99, 0x85, 0xb6, 0xe3, 0xd0, 0x49, 0x7a, 0x2f, 0x1c, 0x17, 0x24, 0x71, 0x42, 0xdb, 0xe8, 0xbd, 0x8e, 0x92, 0xa1, 0xf4, 0xc7, 0x5e, 0x6d, 0x38, 0xb, 0x2e, 0x1d, 0x48, 0x7b, 0xe2, 0xd1, 0x84, 0xb7, 0xab, 0x98, 0xcd, 0xfe, 0x67, 0x54, 0x1, 0x32, 0x39, 0xa, 0x5f, 0x6c, 0xf5, 0xc6, 0x93, 0xa0, 0xbc, 0x8f, 0xda, 0xe9, 0x70, 0x43, 0x16, 0x25, 0x5c, 0x6f, 0x3a, 0x9, 0x90, 0xa3, 0xf6, 0xc5, 0xd9, 0xea, 0xbf, 0x8c, 0x15, 0x26, 0x73, 0x40, 0x4b, 0x78, 0x2d, 0x1e, 0x87, 0xb4, 0xe1, 0xd2, 0xce, 0xfd, 0xa8, 0x9b, 0x2, 0x31, 0x64, 0x57, 0x72, 0x41, 0x14, 0x27, 0xbe, 0x8d, 0xd8, 0xeb, 0xf7, 0xc4, 0x91, 0xa2, 0x3b, 0x8, 0x5d, 0x6e, 0x65, 0x56, 0x3, 0x30, 0xa9, 0x9a, 0xcf, 0xfc, 0xe0, 0xd3, 0x86, 0xb5, 0x2c, 0x1f, 0x4a, 0x79, 0xb8, 0x8b, 0xde, 0xed, 0x74, 0x47, 0x12, 0x21, 0x3d, 0xe, 0x5b, 0x68, 0xf1, 0xc2, 0x97, 0xa4, 0xaf, 0x9c, 0xc9, 0xfa, 0x63, 0x50, 0x5, 0x36, 0x2a, 0x19, 0x4c, 0x7f, 0xe6, 0xd5, 0x80, 0xb3, 0x96, 0xa5, 0xf0, 0xc3, 0x5a, 0x69, 0x3c, 0xf, 0x13, 0x20, 0x75, 0x46, 0xdf, 0xec, 0xb9, 0x8a, 0x81, 0xb2, 0xe7, 0xd4, 0x4d, 0x7e, 0x2b, 0x18, 0x4, 0x37, 0x62, 0x51, 0xc8, 0xfb, 0xae, 0x9d, 0xe4, 0xd7, 0x82, 0xb1, 0x28, 0x1b, 0x4e, 0x7d, 0x61, 0x52, 0x7, 0x34, 0xad, 0x9e, 0xcb, 0xf8, 0xf3, 0xc0, 0x95, 0xa6, 0x3f, 0xc, 0x59, 0x6a, 0x76, 0x45, 0x10, 0x23, 0xba, 0x89, 0xdc, 0xef, 0xca, 0xf9, 0xac, 0x9f, 0x6, 0x35, 0x60, 0x53, 0x4f, 0x7c, 0x29, 0x1a, 0x83, 0xb0, 0xe5, 0xd6, 0xdd, 0xee, 0xbb, 0x88, 0x11, 0x22, 0x77, 0x44, 0x58, 0x6b, 0x3e, 0xd, 0x94, 0xa7, 0xf2, 0xc1}, [256]byte{0x0, 0x34, 0x68, 0x5c, 0xd0, 0xe4, 0xb8, 0x8c, 0xbd, 0x89, 0xd5, 0xe1, 0x6d, 0x59, 0x5, 0x31, 0x67, 0x53, 0xf, 0x3b, 0xb7, 0x83, 0xdf, 0xeb, 0xda, 0xee, 0xb2, 0x86, 0xa, 0x3e, 0x62, 0x56, 0xce, 0xfa, 0xa6, 0x92, 0x1e, 0x2a, 0x76, 0x42, 0x73, 0x47, 0x1b, 0x2f, 0xa3, 0x97, 0xcb, 0xff, 0xa9, 0x9d, 0xc1, 0xf5, 0x79, 0x4d, 0x11, 0x25, 0x14, 0x20, 0x7c, 0x48, 0xc4, 0xf0, 0xac, 0x98, 0x81, 0xb5, 0xe9, 0xdd, 0x51, 0x65, 0x39, 0xd, 0x3c, 0x8, 0x54, 0x60, 0xec, 0xd8, 0x84, 0xb0, 0xe6, 0xd2, 0x8e, 0xba, 0x36, 0x2, 0x5e, 0x6a, 0x5b, 0x6f, 0x33, 0x7, 0x8b, 0xbf, 0xe3, 0xd7, 0x4f, 0x7b, 0x27, 0x13, 0x9f, 0xab, 0xf7, 0xc3, 0xf2, 0xc6, 0x9a, 0xae, 0x22, 0x16, 0x4a, 0x7e, 0x28, 0x1c, 0x40, 0x74, 0xf8, 0xcc, 0x90, 0xa4, 0x95, 0xa1, 0xfd, 0xc9, 0x45, 0x71, 0x2d, 0x19, 0x1f, 0x2b, 0x77, 0x43, 0xcf, 0xfb, 0xa7, 0x93, 0xa2, 0x96, 0xca, 0xfe, 0x72, 0x46, 0x1a, 0x2e, 0x78, 0x4c, 0x10, 0x24, 0xa8, 0x9c, 0xc0, 0xf4, 0xc5, 0xf1, 0xad, 0x99, 0x15, 0x21, 0x7d, 0x49, 0xd1, 0xe5, 0xb9, 0x8d, 0x1, 0x35, 0x69, 0x5d, 0x6c, 0x58, 0x4, 0x30, 0xbc, 0x88, 0xd4, 0xe0, 0xb6, 0x82, 0xde, 0xea, 0x66, 0x52, 0xe, 0x3a, 0xb, 0x3f, 0x63, 0x57, 0xdb, 0xef, 0xb3, 0x87, 0x9e, 0xaa, 0xf6, 0xc2, 0x4e, 0x7a, 0x26, 0x12, 0x23, 0x17, 0x4b, 0x7f, 0xf3, 0xc7, 0x9b, 0xaf, 0xf9, 0xcd, 0x91, 0xa5, 0x29, 0x1d, 0x41, 0x75, 0x44, 0x70, 0x2c, 0x18, 0x94, 0xa0, 0xfc, 0xc8, 0x50, 0x64, 0x38, 0xc, 0x80, 0xb4, 0xe8, 0xdc, 0xed, 0xd9, 0x85, 0xb1, 0x3d, 0x9, 0x55, 0x61, 0x37, 0x3, 0x5f, 0x6b, 0xe7, 0xd3, 0x8f, 0xbb, 0x8a, 0xbe, 0xe2, 0xd6, 0x5a, 0x6e, 0x32, 0x6}, [256]byte{0x0, 0x35, 0x6a, 0x5f, 0xd4, 0xe1, 0xbe, 0x8b, 0xb5, 0x80, 0xdf, 0xea, 0x61, 0x54, 0xb, 0x3e, 0x77, 0x42, 0x1d, 0x28, 0xa3, 0x96, 0xc9, 0xfc, 0xc2, 0xf7, 0xa8, 0x9d, 0x16, 0x23, 0x7c, 0x49, 0xee, 0xdb, 0x84, 0xb1, 0x3a, 0xf, 0x50, 0x65, 0x5b, 0x6e, 0x31, 0x4, 0x8f, 0xba, 0xe5, 0xd0, 0x99, 0xac, 0xf3, 0xc6, 0x4d, 0x78, 0x27, 0x12, 0x2c, 0x19, 0x46, 0x73, 0xf8, 0xcd, 0x92, 0xa7, 0xc1, 0xf4, 0xab, 0x9e, 0x15, 0x20, 0x7f, 0x4a, 0x74, 0x41, 0x1e, 0x2b, 0xa0, 0x95, 0xca, 0xff, 0xb6, 0x83, 0xdc, 0xe9, 0x62, 0x57, 0x8, 0x3d, 0x3, 0x36, 0x69, 0x5c, 0xd7, 0xe2, 0xbd, 0x88, 0x2f, 0x1a, 0x45, 0x70, 0xfb, 0xce, 0x91, 0xa4, 0x9a, 0xaf, 0xf0, 0xc5, 0x4e, 0x7b, 0x24, 0x11, 0x58, 0x6d, 0x32, 0x7, 0x8c, 0xb9, 0xe6, 0xd3, 0xed, 0xd8, 0x87, 0xb2, 0x39, 0xc, 0x53, 0x66, 0x9f, 0xaa, 0xf5, 0xc0, 0x4b, 0x7e, 0x21, 0x14, 0x2a, 0x1f, 0x40, 0x75, 0xfe, 0xcb, 0x94, 0xa1, 0xe8, 0xdd, 0x82, 0xb7, 0x3c, 0x9, 0x56, 0x63, 0x5d, 0x68, 0x37, 0x2, 0x89, 0xbc, 0xe3, 0xd6, 0x71, 0x44, 0x1b, 0x2e, 0xa5, 0x90, 0xcf, 0xfa, 0xc4, 0xf1, 0xae, 0x9b, 0x10, 0x25, 0x7a, 0x4f, 0x6, 0x33, 0x6c, 0x59, 0xd2, 0xe7, 0xb8, 0x8d, 0xb3, 0x86, 0xd9, 0xec, 0x67, 0x52, 0xd, 0x38, 0x5e, 0x6b, 0x34, 0x1, 0x8a, 0xbf, 0xe0, 0xd5, 0xeb, 0xde, 0x81, 0xb4, 0x3f, 0xa, 0x55, 0x60, 0x29, 0x1c, 0x43, 0x76, 0xfd, 0xc8, 0x97, 0xa2, 0x9c, 0xa9, 0xf6, 0xc3, 0x48, 0x7d, 0x22, 0x17, 0xb0, 0x85, 0xda, 0xef, 0x64, 0x51, 0xe, 0x3b, 0x5, 0x30, 0x6f, 0x5a, 0xd1, 0xe4, 0xbb, 0x8e, 0xc7, 0xf2, 0xad, 0x98, 0x13, 0x26, 0x79, 0x4c, 0x72, 0x47, 0x18, 0x2d, 0xa6, 0x93, 0xcc, 0xf9}, [256]byte{0x0, 0x36, 0x6c, 0x5a, 0xd8, 0xee, 0xb4, 0x82, 0xad, 0x9b, 0xc1, 0xf7, 0x75, 0x43, 0x19, 0x2f, 0x47, 0x71, 0x2b, 0x1d, 0x9f, 0xa9, 0xf3, 0xc5, 0xea, 0xdc, 0x86, 0xb0, 0x32, 0x4, 0x5e, 0x68, 0x8e, 0xb8, 0xe2, 0xd4, 0x56, 0x60, 0x3a, 0xc, 0x23, 0x15, 0x4f, 0x79, 0xfb, 0xcd, 0x97, 0xa1, 0xc9, 0xff, 0xa5, 0x93, 0x11, 0x27, 0x7d, 0x4b, 0x64, 0x52, 0x8, 0x3e, 0xbc, 0x8a, 0xd0, 0xe6, 0x1, 0x37, 0x6d, 0x5b, 0xd9, 0xef, 0xb5, 0x83, 0xac, 0x9a, 0xc0, 0xf6, 0x74, 0x42, 0x18, 0x2e, 0x46, 0x70, 0x2a, 0x1c, 0x9e, 0xa8, 0xf2, 0xc4, 0xeb, 0xdd, 0x87, 0xb1, 0x33, 0x5, 0x5f, 0x69, 0x8f, 0xb9, 0xe3, 0xd5, 0x57, 0x61, 0x3b, 0xd, 0x22, 0x14, 0x4e, 0x78, 0xfa, 0xcc, 0x96, 0xa0, 0xc8, 0xfe, 0xa4, 0x92, 0x10, 0x26, 0x7c, 0x4a, 0x65, 0x53, 0x9, 0x3f, 0xbd, 0x8b, 0xd1, 0xe7, 0x2, 0x34, 0x6e, 0x58, 0xda, 0xec, 0xb6, 0x80, 0xaf, 0x99, 0xc3, 0xf5, 0x77, 0x41, 0x1b, 0x2d, 0x45, 0x73, 0x29, 0x1f, 0x9d, 0xab, 0xf1, 0xc7, 0xe8, 0xde, 0x84, 0xb2, 0x30, 0x6, 0x5c, 0x6a, 0x8c, 0xba, 0xe0, 0xd6, 0x54, 0x62, 0x38, 0xe, 0x21, 0x17, 0x4d, 0x7b, 0xf9, 0xcf, 0x95, 0xa3, 0xcb, 0xfd, 0xa7, 0x91, 0x13, 0x25, 0x7f, 0x49, 0x66, 0x50, 0xa, 0x3c, 0xbe, 0x88, 0xd2, 0xe4, 0x3, 0x35, 0x6f, 0x59, 0xdb, 0xed, 0xb7, 0x81, 0xae, 0x98, 0xc2, 0xf4, 0x76, 0x40, 0x1a, 0x2c, 0x44, 0x72, 0x28, 0x1e, 0x9c, 0xaa, 0xf0, 0xc6, 0xe9, 0xdf, 0x85, 0xb3, 0x31, 0x7, 0x5d, 0x6b, 0x8d, 0xbb, 0xe1, 0xd7, 0x55, 0x63, 0x39, 0xf, 0x20, 0x16, 0x4c, 0x7a, 0xf8, 0xce, 0x94, 0xa2, 0xca, 0xfc, 0xa6, 0x90, 0x12, 0x24, 0x7e, 0x48, 0x67, 0x51, 0xb, 0x3d, 0xbf, 0x89, 0xd3, 0xe5}, [256]byte{0x0, 0x37, 0x6e, 0x59, 0xdc, 0xeb, 0xb2, 0x85, 0xa5, 0x92, 0xcb, 0xfc, 0x79, 0x4e, 0x17, 0x20, 0x57, 0x60, 0x39, 0xe, 0x8b, 0xbc, 0xe5, 0xd2, 0xf2, 0xc5, 0x9c, 0xab, 0x2e, 0x19, 0x40, 0x77, 0xae, 0x99, 0xc0, 0xf7, 0x72, 0x45, 0x1c, 0x2b, 0xb, 0x3c, 0x65, 0x52, 0xd7, 0xe0, 0xb9, 0x8e, 0xf9, 0xce, 0x97, 0xa0, 0x25, 0x12, 0x4b, 0x7c, 0x5c, 0x6b, 0x32, 0x5, 0x80, 0xb7, 0xee, 0xd9, 0x41, 0x76, 0x2f, 0x18, 0x9d, 0xaa, 0xf3, 0xc4, 0xe4, 0xd3, 0x8a, 0xbd, 0x38, 0xf, 0x56, 0x61, 0x16, 0x21, 0x78, 0x4f, 0xca, 0xfd, 0xa4, 0x93, 0xb3, 0x84, 0xdd, 0xea, 0x6f, 0x58, 0x1, 0x36, 0xef, 0xd8, 0x81, 0xb6, 0x33, 0x4, 0x5d, 0x6a, 0x4a, 0x7d, 0x24, 0x13, 0x96, 0xa1, 0xf8, 0xcf, 0xb8, 0x8f, 0xd6, 0xe1, 0x64, 0x53, 0xa, 0x3d, 0x1d, 0x2a, 0x73, 0x44, 0xc1, 0xf6, 0xaf, 0x98, 0x82, 0xb5, 0xec, 0xdb, 0x5e, 0x69, 0x30, 0x7, 0x27, 0x10, 0x49, 0x7e, 0xfb, 0xcc, 0x95, 0xa2, 0xd5, 0xe2, 0xbb, 0x8c, 0x9, 0x3e, 0x67, 0x50, 0x70, 0x47, 0x1e, 0x29, 0xac, 0x9b, 0xc2, 0xf5, 0x2c, 0x1b, 0x42, 0x75, 0xf0, 0xc7, 0x9e, 0xa9, 0x89, 0xbe, 0xe7, 0xd0, 0x55, 0x62, 0x3b, 0xc, 0x7b, 0x4c, 0x15, 0x22, 0xa7, 0x90, 0xc9, 0xfe, 0xde, 0xe9, 0xb0, 0x87, 0x2, 0x35, 0x6c, 0x5b, 0xc3, 0xf4, 0xad, 0x9a, 0x1f, 0x28, 0x71, 0x46, 0x66, 0x51, 0x8, 0x3f, 0xba, 0x8d, 0xd4, 0xe3, 0x94, 0xa3, 0xfa, 0xcd, 0x48, 0x7f, 0x26, 0x11, 0x31, 0x6, 0x5f, 0x68, 0xed, 0xda, 0x83, 0xb4, 0x6d, 0x5a, 0x3, 0x34, 0xb1, 0x86, 0xdf, 0xe8, 0xc8, 0xff, 0xa6, 0x91, 0x14, 0x23, 0x7a, 0x4d, 0x3a, 0xd, 0x54, 0x63, 0xe6, 0xd1, 0x88, 0xbf, 0x9f, 0xa8, 0xf1, 0xc6, 0x43, 0x74, 0x2d, 0x1a}, [256]byte{0x0, 0x38, 0x70, 0x48, 0xe0, 0xd8, 0x90, 0xa8, 0xdd, 0xe5, 0xad, 0x95, 0x3d, 0x5, 0x4d, 0x75, 0xa7, 0x9f, 0xd7, 0xef, 0x47, 0x7f, 0x37, 0xf, 0x7a, 0x42, 0xa, 0x32, 0x9a, 0xa2, 0xea, 0xd2, 0x53, 0x6b, 0x23, 0x1b, 0xb3, 0x8b, 0xc3, 0xfb, 0x8e, 0xb6, 0xfe, 0xc6, 0x6e, 0x56, 0x1e, 0x26, 0xf4, 0xcc, 0x84, 0xbc, 0x14, 0x2c, 0x64, 0x5c, 0x29, 0x11, 0x59, 0x61, 0xc9, 0xf1, 0xb9, 0x81, 0xa6, 0x9e, 0xd6, 0xee, 0x46, 0x7e, 0x36, 0xe, 0x7b, 0x43, 0xb, 0x33, 0x9b, 0xa3, 0xeb, 0xd3, 0x1, 0x39, 0x71, 0x49, 0xe1, 0xd9, 0x91, 0xa9, 0xdc, 0xe4, 0xac, 0x94, 0x3c, 0x4, 0x4c, 0x74, 0xf5, 0xcd, 0x85, 0xbd, 0x15, 0x2d, 0x65, 0x5d, 0x28, 0x10, 0x58, 0x60, 0xc8, 0xf0, 0xb8, 0x80, 0x52, 0x6a, 0x22, 0x1a, 0xb2, 0x8a, 0xc2, 0xfa, 0x8f, 0xb7, 0xff, 0xc7, 0x6f, 0x57, 0x1f, 0x27, 0x51, 0x69, 0x21, 0x19, 0xb1, 0x89, 0xc1, 0xf9, 0x8c, 0xb4, 0xfc, 0xc4, 0x6c, 0x54, 0x1c, 0x24, 0xf6, 0xce, 0x86, 0xbe, 0x16, 0x2e, 0x66, 0x5e, 0x2b, 0x13, 0x5b, 0x63, 0xcb, 0xf3, 0xbb, 0x83, 0x2, 0x3a, 0x72, 0x4a, 0xe2, 0xda, 0x92, 0xaa, 0xdf, 0xe7, 0xaf, 0x97, 0x3f, 0x7, 0x4f, 0x77, 0xa5, 0x9d, 0xd5, 0xed, 0x45, 0x7d, 0x35, 0xd, 0x78, 0x40, 0x8, 0x30, 0x98, 0xa0, 0xe8, 0xd0, 0xf7, 0xcf, 0x87, 0xbf, 0x17, 0x2f, 0x67, 0x5f, 0x2a, 0x12, 0x5a, 0x62, 0xca, 0xf2, 0xba, 0x82, 0x50, 0x68, 0x20, 0x18, 0xb0, 0x88, 0xc0, 0xf8, 0x8d, 0xb5, 0xfd, 0xc5, 0x6d, 0x55, 0x1d, 0x25, 0xa4, 0x9c, 0xd4, 0xec, 0x44, 0x7c, 0x34, 0xc, 0x79, 0x41, 0x9, 0x31, 0x99, 0xa1, 0xe9, 0xd1, 0x3, 0x3b, 0x73, 0x4b, 0xe3, 0xdb, 0x93, 0xab, 0xde, 0xe6, 0xae, 0x96, 0x3e, 0x6, 0x4e, 0x76}, [256]byte{0x0, 0x39, 0x72, 0x4b, 0xe4, 0xdd, 0x96, 0xaf, 0xd5, 0xec, 0xa7, 0x9e, 0x31, 0x8, 0x43, 0x7a, 0xb7, 0x8e, 0xc5, 0xfc, 0x53, 0x6a, 0x21, 0x18, 0x62, 0x5b, 0x10, 0x29, 0x86, 0xbf, 0xf4, 0xcd, 0x73, 0x4a, 0x1, 0x38, 0x97, 0xae, 0xe5, 0xdc, 0xa6, 0x9f, 0xd4, 0xed, 0x42, 0x7b, 0x30, 0x9, 0xc4, 0xfd, 0xb6, 0x8f, 0x20, 0x19, 0x52, 0x6b, 0x11, 0x28, 0x63, 0x5a, 0xf5, 0xcc, 0x87, 0xbe, 0xe6, 0xdf, 0x94, 0xad, 0x2, 0x3b, 0x70, 0x49, 0x33, 0xa, 0x41, 0x78, 0xd7, 0xee, 0xa5, 0x9c, 0x51, 0x68, 0x23, 0x1a, 0xb5, 0x8c, 0xc7, 0xfe, 0x84, 0xbd, 0xf6, 0xcf, 0x60, 0x59, 0x12, 0x2b, 0x95, 0xac, 0xe7, 0xde, 0x71, 0x48, 0x3, 0x3a, 0x40, 0x79, 0x32, 0xb, 0xa4, 0x9d, 0xd6, 0xef, 0x22, 0x1b, 0x50, 0x69, 0xc6, 0xff, 0xb4, 0x8d, 0xf7, 0xce, 0x85, 0xbc, 0x13, 0x2a, 0x61, 0x58, 0xd1, 0xe8, 0xa3, 0x9a, 0x35, 0xc, 0x47, 0x7e, 0x4, 0x3d, 0x76, 0x4f, 0xe0, 0xd9, 0x92, 0xab, 0x66, 0x5f, 0x14, 0x2d, 0x82, 0xbb, 0xf0, 0xc9, 0xb3, 0x8a, 0xc1, 0xf8, 0x57, 0x6e, 0x25, 0x1c, 0xa2, 0x9b, 0xd0, 0xe9, 0x46, 0x7f, 0x34, 0xd, 0x77, 0x4e, 0x5, 0x3c, 0x93, 0xaa, 0xe1, 0xd8, 0x15, 0x2c, 0x67, 0x5e, 0xf1, 0xc8, 0x83, 0xba, 0xc0, 0xf9, 0xb2, 0x8b, 0x24, 0x1d, 0x56, 0x6f, 0x37, 0xe, 0x45, 0x7c, 0xd3, 0xea, 0xa1, 0x98, 0xe2, 0xdb, 0x90, 0xa9, 0x6, 0x3f, 0x74, 0x4d, 0x80, 0xb9, 0xf2, 0xcb, 0x64, 0x5d, 0x16, 0x2f, 0x55, 0x6c, 0x27, 0x1e, 0xb1, 0x88, 0xc3, 0xfa, 0x44, 0x7d, 0x36, 0xf, 0xa0, 0x99, 0xd2, 0xeb, 0x91, 0xa8, 0xe3, 0xda, 0x75, 0x4c, 0x7, 0x3e, 0xf3, 0xca, 0x81, 0xb8, 0x17, 0x2e, 0x65, 0x5c, 0x26, 0x1f, 0x54, 0x6d, 0xc2, 0xfb, 0xb0, 0x89}, [256]byte{0x0, 0x3a, 0x74, 0x4e, 0xe8, 0xd2, 0x9c, 0xa6, 0xcd, 0xf7, 0xb9, 0x83, 0x25, 0x1f, 0x51, 0x6b, 0x87, 0xbd, 0xf3, 0xc9, 0x6f, 0x55, 0x1b, 0x21, 0x4a, 0x70, 0x3e, 0x4, 0xa2, 0x98, 0xd6, 0xec, 0x13, 0x29, 0x67, 0x5d, 0xfb, 0xc1, 0x8f, 0xb5, 0xde, 0xe4, 0xaa, 0x90, 0x36, 0xc, 0x42, 0x78, 0x94, 0xae, 0xe0, 0xda, 0x7c, 0x46, 0x8, 0x32, 0x59, 0x63, 0x2d, 0x17, 0xb1, 0x8b, 0xc5, 0xff, 0x26, 0x1c, 0x52, 0x68, 0xce, 0xf4, 0xba, 0x80, 0xeb, 0xd1, 0x9f, 0xa5, 0x3, 0x39, 0x77, 0x4d, 0xa1, 0x9b, 0xd5, 0xef, 0x49, 0x73, 0x3d, 0x7, 0x6c, 0x56, 0x18, 0x22, 0x84, 0xbe, 0xf0, 0xca, 0x35, 0xf, 0x41, 0x7b, 0xdd, 0xe7, 0xa9, 0x93, 0xf8, 0xc2, 0x8c, 0xb6, 0x10, 0x2a, 0x64, 0x5e, 0xb2, 0x88, 0xc6, 0xfc, 0x5a, 0x60, 0x2e, 0x14, 0x7f, 0x45, 0xb, 0x31, 0x97, 0xad, 0xe3, 0xd9, 0x4c, 0x76, 0x38, 0x2, 0xa4, 0x9e, 0xd0, 0xea, 0x81, 0xbb, 0xf5, 0xcf, 0x69, 0x53, 0x1d, 0x27, 0xcb, 0xf1, 0xbf, 0x85, 0x23, 0x19, 0x57, 0x6d, 0x6, 0x3c, 0x72, 0x48, 0xee, 0xd4, 0x9a, 0xa0, 0x5f, 0x65, 0x2b, 0x11, 0xb7, 0x8d, 0xc3, 0xf9, 0x92, 0xa8, 0xe6, 0xdc, 0x7a, 0x40, 0xe, 0x34, 0xd8, 0xe2, 0xac, 0x96, 0x30, 0xa, 0x44, 0x7e, 0x15, 0x2f, 0x61, 0x5b, 0xfd, 0xc7, 0x89, 0xb3, 0x6a, 0x50, 0x1e, 0x24, 0x82, 0xb8, 0xf6, 0xcc, 0xa7, 0x9d, 0xd3, 0xe9, 0x4f, 0x75, 0x3b, 0x1, 0xed, 0xd7, 0x99, 0xa3, 0x5, 0x3f, 0x71, 0x4b, 0x20, 0x1a, 0x54, 0x6e, 0xc8, 0xf2, 0xbc, 0x86, 0x79, 0x43, 0xd, 0x37, 0x91, 0xab, 0xe5, 0xdf, 0xb4, 0x8e, 0xc0, 0xfa, 0x5c, 0x66, 0x28, 0x12, 0xfe, 0xc4, 0x8a, 0xb0, 0x16, 0x2c, 0x62, 0x58, 0x33, 0x9, 0x47, 0x7d, 0xdb, 0xe1, 0xaf, 0x95}, [256]byte{0x0, 0x3b, 0x76, 0x4d, 0xec, 0xd7, 0x9a, 0xa1, 0xc5, 0xfe, 0xb3, 0x88, 0x29, 0x12, 0x5f, 0x64, 0x97, 0xac, 0xe1, 0xda, 0x7b, 0x40, 0xd, 0x36, 0x52, 0x69, 0x24, 0x1f, 0xbe, 0x85, 0xc8, 0xf3, 0x33, 0x8, 0x45, 0x7e, 0xdf, 0xe4, 0xa9, 0x92, 0xf6, 0xcd, 0x80, 0xbb, 0x1a, 0x21, 0x6c, 0x57, 0xa4, 0x9f, 0xd2, 0xe9, 0x48, 0x73, 0x3e, 0x5, 0x61, 0x5a, 0x17, 0x2c, 0x8d, 0xb6, 0xfb, 0xc0, 0x66, 0x5d, 0x10, 0x2b, 0x8a, 0xb1, 0xfc, 0xc7, 0xa3, 0x98, 0xd5, 0xee, 0x4f, 0x74, 0x39, 0x2, 0xf1, 0xca, 0x87, 0xbc, 0x1d, 0x26, 0x6b, 0x50, 0x34, 0xf, 0x42, 0x79, 0xd8, 0xe3, 0xae, 0x95, 0x55, 0x6e, 0x23, 0x18, 0xb9, 0x82, 0xcf, 0xf4, 0x90, 0xab, 0xe6, 0xdd, 0x7c, 0x47, 0xa, 0x31, 0xc2, 0xf9, 0xb4, 0x8f, 0x2e, 0x15, 0x58, 0x63, 0x7, 0x3c, 0x71, 0x4a, 0xeb, 0xd0, 0x9d, 0xa6, 0xcc, 0xf7, 0xba, 0x81, 0x20, 0x1b, 0x56, 0x6d, 0x9, 0x32, 0x7f, 0x44, 0xe5, 0xde, 0x93, 0xa8, 0x5b, 0x60, 0x2d, 0x16, 0xb7, 0x8c, 0xc1, 0xfa, 0x9e, 0xa5, 0xe8, 0xd3, 0x72, 0x49, 0x4, 0x3f, 0xff, 0xc4, 0x89, 0xb2, 0x13, 0x28, 0x65, 0x5e, 0x3a, 0x1, 0x4c, 0x77, 0xd6, 0xed, 0xa0, 0x9b, 0x68, 0x53, 0x1e, 0x25, 0x84, 0xbf, 0xf2, 0xc9, 0xad, 0x96, 0xdb, 0xe0, 0x41, 0x7a, 0x37, 0xc, 0xaa, 0x91, 0xdc, 0xe7, 0x46, 0x7d, 0x30, 0xb, 0x6f, 0x54, 0x19, 0x22, 0x83, 0xb8, 0xf5, 0xce, 0x3d, 0x6, 0x4b, 0x70, 0xd1, 0xea, 0xa7, 0x9c, 0xf8, 0xc3, 0x8e, 0xb5, 0x14, 0x2f, 0x62, 0x59, 0x99, 0xa2, 0xef, 0xd4, 0x75, 0x4e, 0x3, 0x38, 0x5c, 0x67, 0x2a, 0x11, 0xb0, 0x8b, 0xc6, 0xfd, 0xe, 0x35, 0x78, 0x43, 0xe2, 0xd9, 0x94, 0xaf, 0xcb, 0xf0, 0xbd, 0x86, 0x27, 0x1c, 0x51, 0x6a}, [256]byte{0x0, 0x3c, 0x78, 0x44, 0xf0, 0xcc, 0x88, 0xb4, 0xfd, 0xc1, 0x85, 0xb9, 0xd, 0x31, 0x75, 0x49, 0xe7, 0xdb, 0x9f, 0xa3, 0x17, 0x2b, 0x6f, 0x53, 0x1a, 0x26, 0x62, 0x5e, 0xea, 0xd6, 0x92, 0xae, 0xd3, 0xef, 0xab, 0x97, 0x23, 0x1f, 0x5b, 0x67, 0x2e, 0x12, 0x56, 0x6a, 0xde, 0xe2, 0xa6, 0x9a, 0x34, 0x8, 0x4c, 0x70, 0xc4, 0xf8, 0xbc, 0x80, 0xc9, 0xf5, 0xb1, 0x8d, 0x39, 0x5, 0x41, 0x7d, 0xbb, 0x87, 0xc3, 0xff, 0x4b, 0x77, 0x33, 0xf, 0x46, 0x7a, 0x3e, 0x2, 0xb6, 0x8a, 0xce, 0xf2, 0x5c, 0x60, 0x24, 0x18, 0xac, 0x90, 0xd4, 0xe8, 0xa1, 0x9d, 0xd9, 0xe5, 0x51, 0x6d, 0x29, 0x15, 0x68, 0x54, 0x10, 0x2c, 0x98, 0xa4, 0xe0, 0xdc, 0x95, 0xa9, 0xed, 0xd1, 0x65, 0x59, 0x1d, 0x21, 0x8f, 0xb3, 0xf7, 0xcb, 0x7f, 0x43, 0x7, 0x3b, 0x72, 0x4e, 0xa, 0x36, 0x82, 0xbe, 0xfa, 0xc6, 0x6b, 0x57, 0x13, 0x2f, 0x9b, 0xa7, 0xe3, 0xdf, 0x96, 0xaa, 0xee, 0xd2, 0x66, 0x5a, 0x1e, 0x22, 0x8c, 0xb0, 0xf4, 0xc8, 0x7c, 0x40, 0x4, 0x38, 0x71, 0x4d, 0x9, 0x35, 0x81, 0xbd, 0xf9, 0xc5, 0xb8, 0x84, 0xc0, 0xfc, 0x48, 0x74, 0x30, 0xc, 0x45, 0x79, 0x3d, 0x1, 0xb5, 0x89, 0xcd, 0xf1, 0x5f, 0x63, 0x27, 0x1b, 0xaf, 0x93, 0xd7, 0xeb, 0xa2, 0x9e, 0xda, 0xe6, 0x52, 0x6e, 0x2a, 0x16, 0xd0, 0xec, 0xa8, 0x94, 0x20, 0x1c, 0x58, 0x64, 0x2d, 0x11, 0x55, 0x69, 0xdd, 0xe1, 0xa5, 0x99, 0x37, 0xb, 0x4f, 0x73, 0xc7, 0xfb, 0xbf, 0x83, 0xca, 0xf6, 0xb2, 0x8e, 0x3a, 0x6, 0x42, 0x7e, 0x3, 0x3f, 0x7b, 0x47, 0xf3, 0xcf, 0x8b, 0xb7, 0xfe, 0xc2, 0x86, 0xba, 0xe, 0x32, 0x76, 0x4a, 0xe4, 0xd8, 0x9c, 0xa0, 0x14, 0x28, 0x6c, 0x50, 0x19, 0x25, 0x61, 0x5d, 0xe9, 0xd5, 0x91, 0xad}, [256]byte{0x0, 0x3d, 0x7a, 0x47, 0xf4, 0xc9, 0x8e, 0xb3, 0xf5, 0xc8, 0x8f, 0xb2, 0x1, 0x3c, 0x7b, 0x46, 0xf7, 0xca, 0x8d, 0xb0, 0x3, 0x3e, 0x79, 0x44, 0x2, 0x3f, 0x78, 0x45, 0xf6, 0xcb, 0x8c, 0xb1, 0xf3, 0xce, 0x89, 0xb4, 0x7, 0x3a, 0x7d, 0x40, 0x6, 0x3b, 0x7c, 0x41, 0xf2, 0xcf, 0x88, 0xb5, 0x4, 0x39, 0x7e, 0x43, 0xf0, 0xcd, 0x8a, 0xb7, 0xf1, 0xcc, 0x8b, 0xb6, 0x5, 0x38, 0x7f, 0x42, 0xfb, 0xc6, 0x81, 0xbc, 0xf, 0x32, 0x75, 0x48, 0xe, 0x33, 0x74, 0x49, 0xfa, 0xc7, 0x80, 0xbd, 0xc, 0x31, 0x76, 0x4b, 0xf8, 0xc5, 0x82, 0xbf, 0xf9, 0xc4, 0x83, 0xbe, 0xd, 0x30, 0x77, 0x4a, 0x8, 0x35, 0x72, 0x4f, 0xfc, 0xc1, 0x86, 0xbb, 0xfd, 0xc0, 0x87, 0xba, 0x9, 0x34, 0x73, 0x4e, 0xff, 0xc2, 0x85, 0xb8, 0xb, 0x36, 0x71, 0x4c, 0xa, 0x37, 0x70, 0x4d, 0xfe, 0xc3, 0x84, 0xb9, 0xeb, 0xd6, 0x91, 0xac, 0x1f, 0x22, 0x65, 0x58, 0x1e, 0x23, 0x64, 0x59, 0xea, 0xd7, 0x90, 0xad, 0x1c, 0x21, 0x66, 0x5b, 0xe8, 0xd5, 0x92, 0xaf, 0xe9, 0xd4, 0x93, 0xae, 0x1d, 0x20, 0x67, 0x5a, 0x18, 0x25, 0x62, 0x5f, 0xec, 0xd1, 0x96, 0xab, 0xed, 0xd0, 0x97, 0xaa, 0x19, 0x24, 0x63, 0x5e, 0xef, 0xd2, 0x95, 0xa8, 0x1b, 0x26, 0x61, 0x5c, 0x1a, 0x27, 0x60, 0x5d, 0xee, 0xd3, 0x94, 0xa9, 0x10, 0x2d, 0x6a, 0x57, 0xe4, 0xd9, 0x9e, 0xa3, 0xe5, 0xd8, 0x9f, 0xa2, 0x11, 0x2c, 0x6b, 0x56, 0xe7, 0xda, 0x9d, 0xa0, 0x13, 0x2e, 0x69, 0x54, 0x12, 0x2f, 0x68, 0x55, 0xe6, 0xdb, 0x9c, 0xa1, 0xe3, 0xde, 0x99, 0xa4, 0x17, 0x2a, 0x6d, 0x50, 0x16, 0x2b, 0x6c, 0x51, 0xe2, 0xdf, 0x98, 0xa5, 0x14, 0x29, 0x6e, 0x53, 0xe0, 0xdd, 0x9a, 0xa7, 0xe1, 0xdc, 0x9b, 0xa6, 0x15, 0x28, 0x6f, 0x52}, [256]byte{0x0, 0x3e, 0x7c, 0x42, 0xf8, 0xc6, 0x84, 0xba, 0xed, 0xd3, 0x91, 0xaf, 0x15, 0x2b, 0x69, 0x57, 0xc7, 0xf9, 0xbb, 0x85, 0x3f, 0x1, 0x43, 0x7d, 0x2a, 0x14, 0x56, 0x68, 0xd2, 0xec, 0xae, 0x90, 0x93, 0xad, 0xef, 0xd1, 0x6b, 0x55, 0x17, 0x29, 0x7e, 0x40, 0x2, 0x3c, 0x86, 0xb8, 0xfa, 0xc4, 0x54, 0x6a, 0x28, 0x16, 0xac, 0x92, 0xd0, 0xee, 0xb9, 0x87, 0xc5, 0xfb, 0x41, 0x7f, 0x3d, 0x3, 0x3b, 0x5, 0x47, 0x79, 0xc3, 0xfd, 0xbf, 0x81, 0xd6, 0xe8, 0xaa, 0x94, 0x2e, 0x10, 0x52, 0x6c, 0xfc, 0xc2, 0x80, 0xbe, 0x4, 0x3a, 0x78, 0x46, 0x11, 0x2f, 0x6d, 0x53, 0xe9, 0xd7, 0x95, 0xab, 0xa8, 0x96, 0xd4, 0xea, 0x50, 0x6e, 0x2c, 0x12, 0x45, 0x7b, 0x39, 0x7, 0xbd, 0x83, 0xc1, 0xff, 0x6f, 0x51, 0x13, 0x2d, 0x97, 0xa9, 0xeb, 0xd5, 0x82, 0xbc, 0xfe, 0xc0, 0x7a, 0x44, 0x6, 0x38, 0x76, 0x48, 0xa, 0x34, 0x8e, 0xb0, 0xf2, 0xcc, 0x9b, 0xa5, 0xe7, 0xd9, 0x63, 0x5d, 0x1f, 0x21, 0xb1, 0x8f, 0xcd, 0xf3, 0x49, 0x77, 0x35, 0xb, 0x5c, 0x62, 0x20, 0x1e, 0xa4, 0x9a, 0xd8, 0xe6, 0xe5, 0xdb, 0x99, 0xa7, 0x1d, 0x23, 0x61, 0x5f, 0x8, 0x36, 0x74, 0x4a, 0xf0, 0xce, 0x8c, 0xb2, 0x22, 0x1c, 0x5e, 0x60, 0xda, 0xe4, 0xa6, 0x98, 0xcf, 0xf1, 0xb3, 0x8d, 0x37, 0x9, 0x4b, 0x75, 0x4d, 0x73, 0x31, 0xf, 0xb5, 0x8b, 0xc9, 0xf7, 0xa0, 0x9e, 0xdc, 0xe2, 0x58, 0x66, 0x24, 0x1a, 0x8a, 0xb4, 0xf6, 0xc8, 0x72, 0x4c, 0xe, 0x30, 0x67, 0x59, 0x1b, 0x25, 0x9f, 0xa1, 0xe3, 0xdd, 0xde, 0xe0, 0xa2, 0x9c, 0x26, 0x18, 0x5a, 0x64, 0x33, 0xd, 0x4f, 0x71, 0xcb, 0xf5, 0xb7, 0x89, 0x19, 0x27, 0x65, 0x5b, 0xe1, 0xdf, 0x9d, 0xa3, 0xf4, 0xca, 0x88, 0xb6, 0xc, 0x32, 0x70, 0x4e}, [256]byte{0x0, 0x3f, 0x7e, 0x41, 0xfc, 0xc3, 0x82, 0xbd, 0xe5, 0xda, 0x9b, 0xa4, 0x19, 0x26, 0x67, 0x58, 0xd7, 0xe8, 0xa9, 0x96, 0x2b, 0x14, 0x55, 0x6a, 0x32, 0xd, 0x4c, 0x73, 0xce, 0xf1, 0xb0, 0x8f, 0xb3, 0x8c, 0xcd, 0xf2, 0x4f, 0x70, 0x31, 0xe, 0x56, 0x69, 0x28, 0x17, 0xaa, 0x95, 0xd4, 0xeb, 0x64, 0x5b, 0x1a, 0x25, 0x98, 0xa7, 0xe6, 0xd9, 0x81, 0xbe, 0xff, 0xc0, 0x7d, 0x42, 0x3, 0x3c, 0x7b, 0x44, 0x5, 0x3a, 0x87, 0xb8, 0xf9, 0xc6, 0x9e, 0xa1, 0xe0, 0xdf, 0x62, 0x5d, 0x1c, 0x23, 0xac, 0x93, 0xd2, 0xed, 0x50, 0x6f, 0x2e, 0x11, 0x49, 0x76, 0x37, 0x8, 0xb5, 0x8a, 0xcb, 0xf4, 0xc8, 0xf7, 0xb6, 0x89, 0x34, 0xb, 0x4a, 0x75, 0x2d, 0x12, 0x53, 0x6c, 0xd1, 0xee, 0xaf, 0x90, 0x1f, 0x20, 0x61, 0x5e, 0xe3, 0xdc, 0x9d, 0xa2, 0xfa, 0xc5, 0x84, 0xbb, 0x6, 0x39, 0x78, 0x47, 0xf6, 0xc9, 0x88, 0xb7, 0xa, 0x35, 0x74, 0x4b, 0x13, 0x2c, 0x6d, 0x52, 0xef, 0xd0, 0x91, 0xae, 0x21, 0x1e, 0x5f, 0x60, 0xdd, 0xe2, 0xa3, 0x9c, 0xc4, 0xfb, 0xba, 0x85, 0x38, 0x7, 0x46, 0x79, 0x45, 0x7a, 0x3b, 0x4, 0xb9, 0x86, 0xc7, 0xf8, 0xa0, 0x9f, 0xde, 0xe1, 0x5c, 0x63, 0x22, 0x1d, 0x92, 0xad, 0xec, 0xd3, 0x6e, 0x51, 0x10, 0x2f, 0x77, 0x48, 0x9, 0x36, 0x8b, 0xb4, 0xf5, 0xca, 0x8d, 0xb2, 0xf3, 0xcc, 0x71, 0x4e, 0xf, 0x30, 0x68, 0x57, 0x16, 0x29, 0x94, 0xab, 0xea, 0xd5, 0x5a, 0x65, 0x24, 0x1b, 0xa6, 0x99, 0xd8, 0xe7, 0xbf, 0x80, 0xc1, 0xfe, 0x43, 0x7c, 0x3d, 0x2, 0x3e, 0x1, 0x40, 0x7f, 0xc2, 0xfd, 0xbc, 0x83, 0xdb, 0xe4, 0xa5, 0x9a, 0x27, 0x18, 0x59, 0x66, 0xe9, 0xd6, 0x97, 0xa8, 0x15, 0x2a, 0x6b, 0x54, 0xc, 0x33, 0x72, 0x4d, 0xf0, 0xcf, 0x8e, 0xb1}, [256]byte{0x0, 0x40, 0x80, 0xc0, 0x1d, 0x5d, 0x9d, 0xdd, 0x3a, 0x7a, 0xba, 0xfa, 0x27, 0x67, 0xa7, 0xe7, 0x74, 0x34, 0xf4, 0xb4, 0x69, 0x29, 0xe9, 0xa9, 0x4e, 0xe, 0xce, 0x8e, 0x53, 0x13, 0xd3, 0x93, 0xe8, 0xa8, 0x68, 0x28, 0xf5, 0xb5, 0x75, 0x35, 0xd2, 0x92, 0x52, 0x12, 0xcf, 0x8f, 0x4f, 0xf, 0x9c, 0xdc, 0x1c, 0x5c, 0x81, 0xc1, 0x1, 0x41, 0xa6, 0xe6, 0x26, 0x66, 0xbb, 0xfb, 0x3b, 0x7b, 0xcd, 0x8d, 0x4d, 0xd, 0xd0, 0x90, 0x50, 0x10, 0xf7, 0xb7, 0x77, 0x37, 0xea, 0xaa, 0x6a, 0x2a, 0xb9, 0xf9, 0x39, 0x79, 0xa4, 0xe4, 0x24, 0x64, 0x83, 0xc3, 0x3, 0x43, 0x9e, 0xde, 0x1e, 0x5e, 0x25, 0x65, 0xa5, 0xe5, 0x38, 0x78, 0xb8, 0xf8, 0x1f, 0x5f, 0x9f, 0xdf, 0x2, 0x42, 0x82, 0xc2, 0x51, 0x11, 0xd1, 0x91, 0x4c, 0xc, 0xcc, 0x8c, 0x6b, 0x2b, 0xeb, 0xab, 0x76, 0x36, 0xf6, 0xb6, 0x87, 0xc7, 0x7, 0x47, 0x9a, 0xda, 0x1a, 0x5a, 0xbd, 0xfd, 0x3d, 0x7d, 0xa0, 0xe0, 0x20, 0x60, 0xf3, 0xb3, 0x73, 0x33, 0xee, 0xae, 0x6e, 0x2e, 0xc9, 0x89, 0x49, 0x9, 0xd4, 0x94, 0x54, 0x14, 0x6f, 0x2f, 0xef, 0xaf, 0x72, 0x32, 0xf2, 0xb2, 0x55, 0x15, 0xd5, 0x95, 0x48, 0x8, 0xc8, 0x88, 0x1b, 0x5b, 0x9b, 0xdb, 0x6, 0x46, 0x86, 0xc6, 0x21, 0x61, 0xa1, 0xe1, 0x3c, 0x7c, 0xbc, 0xfc, 0x4a, 0xa, 0xca, 0x8a, 0x57, 0x17, 0xd7, 0x97, 0x70, 0x30, 0xf0, 0xb0, 0x6d, 0x2d, 0xed, 0xad, 0x3e, 0x7e, 0xbe, 0xfe, 0x23, 0x63, 0xa3, 0xe3, 0x4, 0x44, 0x84, 0xc4, 0x19, 0x59, 0x99, 0xd9, 0xa2, 0xe2, 0x22, 0x62, 0xbf, 0xff, 0x3f, 0x7f, 0x98, 0xd8, 0x18, 0x58, 0x85, 0xc5, 0x5, 0x45, 0xd6, 0x96, 0x56, 0x16, 0xcb, 0x8b, 0x4b, 0xb, 0xec, 0xac, 0x6c, 0x2c, 0xf1, 0xb1, 0x71, 0x31}, [256]byte{0x0, 0x41, 0x82, 0xc3, 0x19, 0x58, 0x9b, 0xda, 0x32, 0x73, 0xb0, 0xf1, 0x2b, 0x6a, 0xa9, 0xe8, 0x64, 0x25, 0xe6, 0xa7, 0x7d, 0x3c, 0xff, 0xbe, 0x56, 0x17, 0xd4, 0x95, 0x4f, 0xe, 0xcd, 0x8c, 0xc8, 0x89, 0x4a, 0xb, 0xd1, 0x90, 0x53, 0x12, 0xfa, 0xbb, 0x78, 0x39, 0xe3, 0xa2, 0x61, 0x20, 0xac, 0xed, 0x2e, 0x6f, 0xb5, 0xf4, 0x37, 0x76, 0x9e, 0xdf, 0x1c, 0x5d, 0x87, 0xc6, 0x5, 0x44, 0x8d, 0xcc, 0xf, 0x4e, 0x94, 0xd5, 0x16, 0x57, 0xbf, 0xfe, 0x3d, 0x7c, 0xa6, 0xe7, 0x24, 0x65, 0xe9, 0xa8, 0x6b, 0x2a, 0xf0, 0xb1, 0x72, 0x33, 0xdb, 0x9a, 0x59, 0x18, 0xc2, 0x83, 0x40, 0x1, 0x45, 0x4, 0xc7, 0x86, 0x5c, 0x1d, 0xde, 0x9f, 0x77, 0x36, 0xf5, 0xb4, 0x6e, 0x2f, 0xec, 0xad, 0x21, 0x60, 0xa3, 0xe2, 0x38, 0x79, 0xba, 0xfb, 0x13, 0x52, 0x91, 0xd0, 0xa, 0x4b, 0x88, 0xc9, 0x7, 0x46, 0x85, 0xc4, 0x1e, 0x5f, 0x9c, 0xdd, 0x35, 0x74, 0xb7, 0xf6, 0x2c, 0x6d, 0xae, 0xef, 0x63, 0x22, 0xe1, 0xa0, 0x7a, 0x3b, 0xf8, 0xb9, 0x51, 0x10, 0xd3, 0x92, 0x48, 0x9, 0xca, 0x8b, 0xcf, 0x8e, 0x4d, 0xc, 0xd6, 0x97, 0x54, 0x15, 0xfd, 0xbc, 0x7f, 0x3e, 0xe4, 0xa5, 0x66, 0x27, 0xab, 0xea, 0x29, 0x68, 0xb2, 0xf3, 0x30, 0x71, 0x99, 0xd8, 0x1b, 0x5a, 0x80, 0xc1, 0x2, 0x43, 0x8a, 0xcb, 0x8, 0x49, 0x93, 0xd2, 0x11, 0x50, 0xb8, 0xf9, 0x3a, 0x7b, 0xa1, 0xe0, 0x23, 0x62, 0xee, 0xaf, 0x6c, 0x2d, 0xf7, 0xb6, 0x75, 0x34, 0xdc, 0x9d, 0x5e, 0x1f, 0xc5, 0x84, 0x47, 0x6, 0x42, 0x3, 0xc0, 0x81, 0x5b, 0x1a, 0xd9, 0x98, 0x70, 0x31, 0xf2, 0xb3, 0x69, 0x28, 0xeb, 0xaa, 0x26, 0x67, 0xa4, 0xe5, 0x3f, 0x7e, 0xbd, 0xfc, 0x14, 0x55, 0x96, 0xd7, 0xd, 0x4c, 0x8f, 0xce}, [256]byte{0x0, 0x42, 0x84, 0xc6, 0x15, 0x57, 0x91, 0xd3, 0x2a, 0x68, 0xae, 0xec, 0x3f, 0x7d, 0xbb, 0xf9, 0x54, 0x16, 0xd0, 0x92, 0x41, 0x3, 0xc5, 0x87, 0x7e, 0x3c, 0xfa, 0xb8, 0x6b, 0x29, 0xef, 0xad, 0xa8, 0xea, 0x2c, 0x6e, 0xbd, 0xff, 0x39, 0x7b, 0x82, 0xc0, 0x6, 0x44, 0x97, 0xd5, 0x13, 0x51, 0xfc, 0xbe, 0x78, 0x3a, 0xe9, 0xab, 0x6d, 0x2f, 0xd6, 0x94, 0x52, 0x10, 0xc3, 0x81, 0x47, 0x5, 0x4d, 0xf, 0xc9, 0x8b, 0x58, 0x1a, 0xdc, 0x9e, 0x67, 0x25, 0xe3, 0xa1, 0x72, 0x30, 0xf6, 0xb4, 0x19, 0x5b, 0x9d, 0xdf, 0xc, 0x4e, 0x88, 0xca, 0x33, 0x71, 0xb7, 0xf5, 0x26, 0x64, 0xa2, 0xe0, 0xe5, 0xa7, 0x61, 0x23, 0xf0, 0xb2, 0x74, 0x36, 0xcf, 0x8d, 0x4b, 0x9, 0xda, 0x98, 0x5e, 0x1c, 0xb1, 0xf3, 0x35, 0x77, 0xa4, 0xe6, 0x20, 0x62, 0x9b, 0xd9, 0x1f, 0x5d, 0x8e, 0xcc, 0xa, 0x48, 0x9a, 0xd8, 0x1e, 0x5c, 0x8f, 0xcd, 0xb, 0x49, 0xb0, 0xf2, 0x34, 0x76, 0xa5, 0xe7, 0x21, 0x63, 0xce, 0x8c, 0x4a, 0x8, 0xdb, 0x99, 0x5f, 0x1d, 0xe4, 0xa6, 0x60, 0x22, 0xf1, 0xb3, 0x75, 0x37, 0x32, 0x70, 0xb6, 0xf4, 0x27, 0x65, 0xa3, 0xe1, 0x18, 0x5a, 0x9c, 0xde, 0xd, 0x4f, 0x89, 0xcb, 0x66, 0x24, 0xe2, 0xa0, 0x73, 0x31, 0xf7, 0xb5, 0x4c, 0xe, 0xc8, 0x8a, 0x59, 0x1b, 0xdd, 0x9f, 0xd7, 0x95, 0x53, 0x11, 0xc2, 0x80, 0x46, 0x4, 0xfd, 0xbf, 0x79, 0x3b, 0xe8, 0xaa, 0x6c, 0x2e, 0x83, 0xc1, 0x7, 0x45, 0x96, 0xd4, 0x12, 0x50, 0xa9, 0xeb, 0x2d, 0x6f, 0xbc, 0xfe, 0x38, 0x7a, 0x7f, 0x3d, 0xfb, 0xb9, 0x6a, 0x28, 0xee, 0xac, 0x55, 0x17, 0xd1, 0x93, 0x40, 0x2, 0xc4, 0x86, 0x2b, 0x69, 0xaf, 0xed, 0x3e, 0x7c, 0xba, 0xf8, 0x1, 0x43, 0x85, 0xc7, 0x14, 0x56, 0x90, 0xd2}, [256]byte{0x0, 0x43, 0x86, 0xc5, 0x11, 0x52, 0x97, 0xd4, 0x22, 0x61, 0xa4, 0xe7, 0x33, 0x70, 0xb5, 0xf6, 0x44, 0x7, 0xc2, 0x81, 0x55, 0x16, 0xd3, 0x90, 0x66, 0x25, 0xe0, 0xa3, 0x77, 0x34, 0xf1, 0xb2, 0x88, 0xcb, 0xe, 0x4d, 0x99, 0xda, 0x1f, 0x5c, 0xaa, 0xe9, 0x2c, 0x6f, 0xbb, 0xf8, 0x3d, 0x7e, 0xcc, 0x8f, 0x4a, 0x9, 0xdd, 0x9e, 0x5b, 0x18, 0xee, 0xad, 0x68, 0x2b, 0xff, 0xbc, 0x79, 0x3a, 0xd, 0x4e, 0x8b, 0xc8, 0x1c, 0x5f, 0x9a, 0xd9, 0x2f, 0x6c, 0xa9, 0xea, 0x3e, 0x7d, 0xb8, 0xfb, 0x49, 0xa, 0xcf, 0x8c, 0x58, 0x1b, 0xde, 0x9d, 0x6b, 0x28, 0xed, 0xae, 0x7a, 0x39, 0xfc, 0xbf, 0x85, 0xc6, 0x3, 0x40, 0x94, 0xd7, 0x12, 0x51, 0xa7, 0xe4, 0x21, 0x62, 0xb6, 0xf5, 0x30, 0x73, 0xc1, 0x82, 0x47, 0x4, 0xd0, 0x93, 0x56, 0x15, 0xe3, 0xa0, 0x65, 0x26, 0xf2, 0xb1, 0x74, 0x37, 0x1a, 0x59, 0x9c, 0xdf, 0xb, 0x48, 0x8d, 0xce, 0x38, 0x7b, 0xbe, 0xfd, 0x29, 0x6a, 0xaf, 0xec, 0x5e, 0x1d, 0xd8, 0x9b, 0x4f, 0xc, 0xc9, 0x8a, 0x7c, 0x3f, 0xfa, 0xb9, 0x6d, 0x2e, 0xeb, 0xa8, 0x92, 0xd1, 0x14, 0x57, 0x83, 0xc0, 0x5, 0x46, 0xb0, 0xf3, 0x36, 0x75, 0xa1, 0xe2, 0x27, 0x64, 0xd6, 0x95, 0x50, 0x13, 0xc7, 0x84, 0x41, 0x2, 0xf4, 0xb7, 0x72, 0x31, 0xe5, 0xa6, 0x63, 0x20, 0x17, 0x54, 0x91, 0xd2, 0x6, 0x45, 0x80, 0xc3, 0x35, 0x76, 0xb3, 0xf0, 0x24, 0x67, 0xa2, 0xe1, 0x53, 0x10, 0xd5, 0x96, 0x42, 0x1, 0xc4, 0x87, 0x71, 0x32, 0xf7, 0xb4, 0x60, 0x23, 0xe6, 0xa5, 0x9f, 0xdc, 0x19, 0x5a, 0x8e, 0xcd, 0x8, 0x4b, 0xbd, 0xfe, 0x3b, 0x78, 0xac, 0xef, 0x2a, 0x69, 0xdb, 0x98, 0x5d, 0x1e, 0xca, 0x89, 0x4c, 0xf, 0xf9, 0xba, 0x7f, 0x3c, 0xe8, 0xab, 0x6e, 0x2d}, [256]byte{0x0, 0x44, 0x88, 0xcc, 0xd, 0x49, 0x85, 0xc1, 0x1a, 0x5e, 0x92, 0xd6, 0x17, 0x53, 0x9f, 0xdb, 0x34, 0x70, 0xbc, 0xf8, 0x39, 0x7d, 0xb1, 0xf5, 0x2e, 0x6a, 0xa6, 0xe2, 0x23, 0x67, 0xab, 0xef, 0x68, 0x2c, 0xe0, 0xa4, 0x65, 0x21, 0xed, 0xa9, 0x72, 0x36, 0xfa, 0xbe, 0x7f, 0x3b, 0xf7, 0xb3, 0x5c, 0x18, 0xd4, 0x90, 0x51, 0x15, 0xd9, 0x9d, 0x46, 0x2, 0xce, 0x8a, 0x4b, 0xf, 0xc3, 0x87, 0xd0, 0x94, 0x58, 0x1c, 0xdd, 0x99, 0x55, 0x11, 0xca, 0x8e, 0x42, 0x6, 0xc7, 0x83, 0x4f, 0xb, 0xe4, 0xa0, 0x6c, 0x28, 0xe9, 0xad, 0x61, 0x25, 0xfe, 0xba, 0x76, 0x32, 0xf3, 0xb7, 0x7b, 0x3f, 0xb8, 0xfc, 0x30, 0x74, 0xb5, 0xf1, 0x3d, 0x79, 0xa2, 0xe6, 0x2a, 0x6e, 0xaf, 0xeb, 0x27, 0x63, 0x8c, 0xc8, 0x4, 0x40, 0x81, 0xc5, 0x9, 0x4d, 0x96, 0xd2, 0x1e, 0x5a, 0x9b, 0xdf, 0x13, 0x57, 0xbd, 0xf9, 0x35, 0x71, 0xb0, 0xf4, 0x38, 0x7c, 0xa7, 0xe3, 0x2f, 0x6b, 0xaa, 0xee, 0x22, 0x66, 0x89, 0xcd, 0x1, 0x45, 0x84, 0xc0, 0xc, 0x48, 0x93, 0xd7, 0x1b, 0x5f, 0x9e, 0xda, 0x16, 0x52, 0xd5, 0x91, 0x5d, 0x19, 0xd8, 0x9c, 0x50, 0x14, 0xcf, 0x8b, 0x47, 0x3, 0xc2, 0x86, 0x4a, 0xe, 0xe1, 0xa5, 0x69, 0x2d, 0xec, 0xa8, 0x64, 0x20, 0xfb, 0xbf, 0x73, 0x37, 0xf6, 0xb2, 0x7e, 0x3a, 0x6d, 0x29, 0xe5, 0xa1, 0x60, 0x24, 0xe8, 0xac, 0x77, 0x33, 0xff, 0xbb, 0x7a, 0x3e, 0xf2, 0xb6, 0x59, 0x1d, 0xd1, 0x95, 0x54, 0x10, 0xdc, 0x98, 0x43, 0x7, 0xcb, 0x8f, 0x4e, 0xa, 0xc6, 0x82, 0x5, 0x41, 0x8d, 0xc9, 0x8, 0x4c, 0x80, 0xc4, 0x1f, 0x5b, 0x97, 0xd3, 0x12, 0x56, 0x9a, 0xde, 0x31, 0x75, 0xb9, 0xfd, 0x3c, 0x78, 0xb4, 0xf0, 0x2b, 0x6f, 0xa3, 0xe7, 0x26, 0x62, 0xae, 0xea}, [256]byte{0x0, 0x45, 0x8a, 0xcf, 0x9, 0x4c, 0x83, 0xc6, 0x12, 0x57, 0x98, 0xdd, 0x1b, 0x5e, 0x91, 0xd4, 0x24, 0x61, 0xae, 0xeb, 0x2d, 0x68, 0xa7, 0xe2, 0x36, 0x73, 0xbc, 0xf9, 0x3f, 0x7a, 0xb5, 0xf0, 0x48, 0xd, 0xc2, 0x87, 0x41, 0x4, 0xcb, 0x8e, 0x5a, 0x1f, 0xd0, 0x95, 0x53, 0x16, 0xd9, 0x9c, 0x6c, 0x29, 0xe6, 0xa3, 0x65, 0x20, 0xef, 0xaa, 0x7e, 0x3b, 0xf4, 0xb1, 0x77, 0x32, 0xfd, 0xb8, 0x90, 0xd5, 0x1a, 0x5f, 0x99, 0xdc, 0x13, 0x56, 0x82, 0xc7, 0x8, 0x4d, 0x8b, 0xce, 0x1, 0x44, 0xb4, 0xf1, 0x3e, 0x7b, 0xbd, 0xf8, 0x37, 0x72, 0xa6, 0xe3, 0x2c, 0x69, 0xaf, 0xea, 0x25, 0x60, 0xd8, 0x9d, 0x52, 0x17, 0xd1, 0x94, 0x5b, 0x1e, 0xca, 0x8f, 0x40, 0x5, 0xc3, 0x86, 0x49, 0xc, 0xfc, 0xb9, 0x76, 0x33, 0xf5, 0xb0, 0x7f, 0x3a, 0xee, 0xab, 0x64, 0x21, 0xe7, 0xa2, 0x6d, 0x28, 0x3d, 0x78, 0xb7, 0xf2, 0x34, 0x71, 0xbe, 0xfb, 0x2f, 0x6a, 0xa5, 0xe0, 0x26, 0x63, 0xac, 0xe9, 0x19, 0x5c, 0x93, 0xd6, 0x10, 0x55, 0x9a, 0xdf, 0xb, 0x4e, 0x81, 0xc4, 0x2, 0x47, 0x88, 0xcd, 0x75, 0x30, 0xff, 0xba, 0x7c, 0x39, 0xf6, 0xb3, 0x67, 0x22, 0xed, 0xa8, 0x6e, 0x2b, 0xe4, 0xa1, 0x51, 0x14, 0xdb, 0x9e, 0x58, 0x1d, 0xd2, 0x97, 0x43, 0x6, 0xc9, 0x8c, 0x4a, 0xf, 0xc0, 0x85, 0xad, 0xe8, 0x27, 0x62, 0xa4, 0xe1, 0x2e, 0x6b, 0xbf, 0xfa, 0x35, 0x70, 0xb6, 0xf3, 0x3c, 0x79, 0x89, 0xcc, 0x3, 0x46, 0x80, 0xc5, 0xa, 0x4f, 0x9b, 0xde, 0x11, 0x54, 0x92, 0xd7, 0x18, 0x5d, 0xe5, 0xa0, 0x6f, 0x2a, 0xec, 0xa9, 0x66, 0x23, 0xf7, 0xb2, 0x7d, 0x38, 0xfe, 0xbb, 0x74, 0x31, 0xc1, 0x84, 0x4b, 0xe, 0xc8, 0x8d, 0x42, 0x7, 0xd3, 0x96, 0x59, 0x1c, 0xda, 0x9f, 0x50, 0x15}, [256]byte{0x0, 0x46, 0x8c, 0xca, 0x5, 0x43, 0x89, 0xcf, 0xa, 0x4c, 0x86, 0xc0, 0xf, 0x49, 0x83, 0xc5, 0x14, 0x52, 0x98, 0xde, 0x11, 0x57, 0x9d, 0xdb, 0x1e, 0x58, 0x92, 0xd4, 0x1b, 0x5d, 0x97, 0xd1, 0x28, 0x6e, 0xa4, 0xe2, 0x2d, 0x6b, 0xa1, 0xe7, 0x22, 0x64, 0xae, 0xe8, 0x27, 0x61, 0xab, 0xed, 0x3c, 0x7a, 0xb0, 0xf6, 0x39, 0x7f, 0xb5, 0xf3, 0x36, 0x70, 0xba, 0xfc, 0x33, 0x75, 0xbf, 0xf9, 0x50, 0x16, 0xdc, 0x9a, 0x55, 0x13, 0xd9, 0x9f, 0x5a, 0x1c, 0xd6, 0x90, 0x5f, 0x19, 0xd3, 0x95, 0x44, 0x2, 0xc8, 0x8e, 0x41, 0x7, 0xcd, 0x8b, 0x4e, 0x8, 0xc2, 0x84, 0x4b, 0xd, 0xc7, 0x81, 0x78, 0x3e, 0xf4, 0xb2, 0x7d, 0x3b, 0xf1, 0xb7, 0x72, 0x34, 0xfe, 0xb8, 0x77, 0x31, 0xfb, 0xbd, 0x6c, 0x2a, 0xe0, 0xa6, 0x69, 0x2f, 0xe5, 0xa3, 0x66, 0x20, 0xea, 0xac, 0x63, 0x25, 0xef, 0xa9, 0xa0, 0xe6, 0x2c, 0x6a, 0xa5, 0xe3, 0x29, 0x6f, 0xaa, 0xec, 0x26, 0x60, 0xaf, 0xe9, 0x23, 0x65, 0xb4, 0xf2, 0x38, 0x7e, 0xb1, 0xf7, 0x3d, 0x7b, 0xbe, 0xf8, 0x32, 0x74, 0xbb, 0xfd, 0x37, 0x71, 0x88, 0xce, 0x4, 0x42, 0x8d, 0xcb, 0x1, 0x47, 0x82, 0xc4, 0xe, 0x48, 0x87, 0xc1, 0xb, 0x4d, 0x9c, 0xda, 0x10, 0x56, 0x99, 0xdf, 0x15, 0x53, 0x96, 0xd0, 0x1a, 0x5c, 0x93, 0xd5, 0x1f, 0x59, 0xf0, 0xb6, 0x7c, 0x3a, 0xf5, 0xb3, 0x79, 0x3f, 0xfa, 0xbc, 0x76, 0x30, 0xff, 0xb9, 0x73, 0x35, 0xe4, 0xa2, 0x68, 0x2e, 0xe1, 0xa7, 0x6d, 0x2b, 0xee, 0xa8, 0x62, 0x24, 0xeb, 0xad, 0x67, 0x21, 0xd8, 0x9e, 0x54, 0x12, 0xdd, 0x9b, 0x51, 0x17, 0xd2, 0x94, 0x5e, 0x18, 0xd7, 0x91, 0x5b, 0x1d, 0xcc, 0x8a, 0x40, 0x6, 0xc9, 0x8f, 0x45, 0x3, 0xc6, 0x80, 0x4a, 0xc, 0xc3, 0x85, 0x4f, 0x9}, [256]byte{0x0, 0x47, 0x8e, 0xc9, 0x1, 0x46, 0x8f, 0xc8, 0x2, 0x45, 0x8c, 0xcb, 0x3, 0x44, 0x8d, 0xca, 0x4, 0x43, 0x8a, 0xcd, 0x5, 0x42, 0x8b, 0xcc, 0x6, 0x41, 0x88, 0xcf, 0x7, 0x40, 0x89, 0xce, 0x8, 0x4f, 0x86, 0xc1, 0x9, 0x4e, 0x87, 0xc0, 0xa, 0x4d, 0x84, 0xc3, 0xb, 0x4c, 0x85, 0xc2, 0xc, 0x4b, 0x82, 0xc5, 0xd, 0x4a, 0x83, 0xc4, 0xe, 0x49, 0x80, 0xc7, 0xf, 0x48, 0x81, 0xc6, 0x10, 0x57, 0x9e, 0xd9, 0x11, 0x56, 0x9f, 0xd8, 0x12, 0x55, 0x9c, 0xdb, 0x13, 0x54, 0x9d, 0xda, 0x14, 0x53, 0x9a, 0xdd, 0x15, 0x52, 0x9b, 0xdc, 0x16, 0x51, 0x98, 0xdf, 0x17, 0x50, 0x99, 0xde, 0x18, 0x5f, 0x96, 0xd1, 0x19, 0x5e, 0x97, 0xd0, 0x1a, 0x5d, 0x94, 0xd3, 0x1b, 0x5c, 0x95, 0xd2, 0x1c, 0x5b, 0x92, 0xd5, 0x1d, 0x5a, 0x93, 0xd4, 0x1e, 0x59, 0x90, 0xd7, 0x1f, 0x58, 0x91, 0xd6, 0x20, 0x67, 0xae, 0xe9, 0x21, 0x66, 0xaf, 0xe8, 0x22, 0x65, 0xac, 0xeb, 0x23, 0x64, 0xad, 0xea, 0x24, 0x63, 0xaa, 0xed, 0x25, 0x62, 0xab, 0xec, 0x26, 0x61, 0xa8, 0xef, 0x27, 0x60, 0xa9, 0xee, 0x28, 0x6f, 0xa6, 0xe1, 0x29, 0x6e, 0xa7, 0xe0, 0x2a, 0x6d, 0xa4, 0xe3, 0x2b, 0x6c, 0xa5, 0xe2, 0x2c, 0x6b, 0xa2, 0xe5, 0x2d, 0x6a, 0xa3, 0xe4, 0x2e, 0x69, 0xa0, 0xe7, 0x2f, 0x68, 0xa1, 0xe6, 0x30, 0x77, 0xbe, 0xf9, 0x31, 0x76, 0xbf, 0xf8, 0x32, 0x75, 0xbc, 0xfb, 0x33, 0x74, 0xbd, 0xfa, 0x34, 0x73, 0xba, 0xfd, 0x35, 0x72, 0xbb, 0xfc, 0x36, 0x71, 0xb8, 0xff, 0x37, 0x70, 0xb9, 0xfe, 0x38, 0x7f, 0xb6, 0xf1, 0x39, 0x7e, 0xb7, 0xf0, 0x3a, 0x7d, 0xb4, 0xf3, 0x3b, 0x7c, 0xb5, 0xf2, 0x3c, 0x7b, 0xb2, 0xf5, 0x3d, 0x7a, 0xb3, 0xf4, 0x3e, 0x79, 0xb0, 0xf7, 0x3f, 0x78, 0xb1, 0xf6}, [256]byte{0x0, 0x48, 0x90, 0xd8, 0x3d, 0x75, 0xad, 0xe5, 0x7a, 0x32, 0xea, 0xa2, 0x47, 0xf, 0xd7, 0x9f, 0xf4, 0xbc, 0x64, 0x2c, 0xc9, 0x81, 0x59, 0x11, 0x8e, 0xc6, 0x1e, 0x56, 0xb3, 0xfb, 0x23, 0x6b, 0xf5, 0xbd, 0x65, 0x2d, 0xc8, 0x80, 0x58, 0x10, 0x8f, 0xc7, 0x1f, 0x57, 0xb2, 0xfa, 0x22, 0x6a, 0x1, 0x49, 0x91, 0xd9, 0x3c, 0x74, 0xac, 0xe4, 0x7b, 0x33, 0xeb, 0xa3, 0x46, 0xe, 0xd6, 0x9e, 0xf7, 0xbf, 0x67, 0x2f, 0xca, 0x82, 0x5a, 0x12, 0x8d, 0xc5, 0x1d, 0x55, 0xb0, 0xf8, 0x20, 0x68, 0x3, 0x4b, 0x93, 0xdb, 0x3e, 0x76, 0xae, 0xe6, 0x79, 0x31, 0xe9, 0xa1, 0x44, 0xc, 0xd4, 0x9c, 0x2, 0x4a, 0x92, 0xda, 0x3f, 0x77, 0xaf, 0xe7, 0x78, 0x30, 0xe8, 0xa0, 0x45, 0xd, 0xd5, 0x9d, 0xf6, 0xbe, 0x66, 0x2e, 0xcb, 0x83, 0x5b, 0x13, 0x8c, 0xc4, 0x1c, 0x54, 0xb1, 0xf9, 0x21, 0x69, 0xf3, 0xbb, 0x63, 0x2b, 0xce, 0x86, 0x5e, 0x16, 0x89, 0xc1, 0x19, 0x51, 0xb4, 0xfc, 0x24, 0x6c, 0x7, 0x4f, 0x97, 0xdf, 0x3a, 0x72, 0xaa, 0xe2, 0x7d, 0x35, 0xed, 0xa5, 0x40, 0x8, 0xd0, 0x98, 0x6, 0x4e, 0x96, 0xde, 0x3b, 0x73, 0xab, 0xe3, 0x7c, 0x34, 0xec, 0xa4, 0x41, 0x9, 0xd1, 0x99, 0xf2, 0xba, 0x62, 0x2a, 0xcf, 0x87, 0x5f, 0x17, 0x88, 0xc0, 0x18, 0x50, 0xb5, 0xfd, 0x25, 0x6d, 0x4, 0x4c, 0x94, 0xdc, 0x39, 0x71, 0xa9, 0xe1, 0x7e, 0x36, 0xee, 0xa6, 0x43, 0xb, 0xd3, 0x9b, 0xf0, 0xb8, 0x60, 0x28, 0xcd, 0x85, 0x5d, 0x15, 0x8a, 0xc2, 0x1a, 0x52, 0xb7, 0xff, 0x27, 0x6f, 0xf1, 0xb9, 0x61, 0x29, 0xcc, 0x84, 0x5c, 0x14, 0x8b, 0xc3, 0x1b, 0x53, 0xb6, 0xfe, 0x26, 0x6e, 0x5, 0x4d, 0x95, 0xdd, 0x38, 0x70, 0xa8, 0xe0, 0x7f, 0x37, 0xef, 0xa7, 0x42, 0xa, 0xd2, 0x9a}, [256]byte{0x0, 0x49, 0x92, 0xdb, 0x39, 0x70, 0xab, 0xe2, 0x72, 0x3b, 0xe0, 0xa9, 0x4b, 0x2, 0xd9, 0x90, 0xe4, 0xad, 0x76, 0x3f, 0xdd, 0x94, 0x4f, 0x6, 0x96, 0xdf, 0x4, 0x4d, 0xaf, 0xe6, 0x3d, 0x74, 0xd5, 0x9c, 0x47, 0xe, 0xec, 0xa5, 0x7e, 0x37, 0xa7, 0xee, 0x35, 0x7c, 0x9e, 0xd7, 0xc, 0x45, 0x31, 0x78, 0xa3, 0xea, 0x8, 0x41, 0x9a, 0xd3, 0x43, 0xa, 0xd1, 0x98, 0x7a, 0x33, 0xe8, 0xa1, 0xb7, 0xfe, 0x25, 0x6c, 0x8e, 0xc7, 0x1c, 0x55, 0xc5, 0x8c, 0x57, 0x1e, 0xfc, 0xb5, 0x6e, 0x27, 0x53, 0x1a, 0xc1, 0x88, 0x6a, 0x23, 0xf8, 0xb1, 0x21, 0x68, 0xb3, 0xfa, 0x18, 0x51, 0x8a, 0xc3, 0x62, 0x2b, 0xf0, 0xb9, 0x5b, 0x12, 0xc9, 0x80, 0x10, 0x59, 0x82, 0xcb, 0x29, 0x60, 0xbb, 0xf2, 0x86, 0xcf, 0x14, 0x5d, 0xbf, 0xf6, 0x2d, 0x64, 0xf4, 0xbd, 0x66, 0x2f, 0xcd, 0x84, 0x5f, 0x16, 0x73, 0x3a, 0xe1, 0xa8, 0x4a, 0x3, 0xd8, 0x91, 0x1, 0x48, 0x93, 0xda, 0x38, 0x71, 0xaa, 0xe3, 0x97, 0xde, 0x5, 0x4c, 0xae, 0xe7, 0x3c, 0x75, 0xe5, 0xac, 0x77, 0x3e, 0xdc, 0x95, 0x4e, 0x7, 0xa6, 0xef, 0x34, 0x7d, 0x9f, 0xd6, 0xd, 0x44, 0xd4, 0x9d, 0x46, 0xf, 0xed, 0xa4, 0x7f, 0x36, 0x42, 0xb, 0xd0, 0x99, 0x7b, 0x32, 0xe9, 0xa0, 0x30, 0x79, 0xa2, 0xeb, 0x9, 0x40, 0x9b, 0xd2, 0xc4, 0x8d, 0x56, 0x1f, 0xfd, 0xb4, 0x6f, 0x26, 0xb6, 0xff, 0x24, 0x6d, 0x8f, 0xc6, 0x1d, 0x54, 0x20, 0x69, 0xb2, 0xfb, 0x19, 0x50, 0x8b, 0xc2, 0x52, 0x1b, 0xc0, 0x89, 0x6b, 0x22, 0xf9, 0xb0, 0x11, 0x58, 0x83, 0xca, 0x28, 0x61, 0xba, 0xf3, 0x63, 0x2a, 0xf1, 0xb8, 0x5a, 0x13, 0xc8, 0x81, 0xf5, 0xbc, 0x67, 0x2e, 0xcc, 0x85, 0x5e, 0x17, 0x87, 0xce, 0x15, 0x5c, 0xbe, 0xf7, 0x2c, 0x65}, [256]byte{0x0, 0x4a, 0x94, 0xde, 0x35, 0x7f, 0xa1, 0xeb, 0x6a, 0x20, 0xfe, 0xb4, 0x5f, 0x15, 0xcb, 0x81, 0xd4, 0x9e, 0x40, 0xa, 0xe1, 0xab, 0x75, 0x3f, 0xbe, 0xf4, 0x2a, 0x60, 0x8b, 0xc1, 0x1f, 0x55, 0xb5, 0xff, 0x21, 0x6b, 0x80, 0xca, 0x14, 0x5e, 0xdf, 0x95, 0x4b, 0x1, 0xea, 0xa0, 0x7e, 0x34, 0x61, 0x2b, 0xf5, 0xbf, 0x54, 0x1e, 0xc0, 0x8a, 0xb, 0x41, 0x9f, 0xd5, 0x3e, 0x74, 0xaa, 0xe0, 0x77, 0x3d, 0xe3, 0xa9, 0x42, 0x8, 0xd6, 0x9c, 0x1d, 0x57, 0x89, 0xc3, 0x28, 0x62, 0xbc, 0xf6, 0xa3, 0xe9, 0x37, 0x7d, 0x96, 0xdc, 0x2, 0x48, 0xc9, 0x83, 0x5d, 0x17, 0xfc, 0xb6, 0x68, 0x22, 0xc2, 0x88, 0x56, 0x1c, 0xf7, 0xbd, 0x63, 0x29, 0xa8, 0xe2, 0x3c, 0x76, 0x9d, 0xd7, 0x9, 0x43, 0x16, 0x5c, 0x82, 0xc8, 0x23, 0x69, 0xb7, 0xfd, 0x7c, 0x36, 0xe8, 0xa2, 0x49, 0x3, 0xdd, 0x97, 0xee, 0xa4, 0x7a, 0x30, 0xdb, 0x91, 0x4f, 0x5, 0x84, 0xce, 0x10, 0x5a, 0xb1, 0xfb, 0x25, 0x6f, 0x3a, 0x70, 0xae, 0xe4, 0xf, 0x45, 0x9b, 0xd1, 0x50, 0x1a, 0xc4, 0x8e, 0x65, 0x2f, 0xf1, 0xbb, 0x5b, 0x11, 0xcf, 0x85, 0x6e, 0x24, 0xfa, 0xb0, 0x31, 0x7b, 0xa5, 0xef, 0x4, 0x4e, 0x90, 0xda, 0x8f, 0xc5, 0x1b, 0x51, 0xba, 0xf0, 0x2e, 0x64, 0xe5, 0xaf, 0x71, 0x3b, 0xd0, 0x9a, 0x44, 0xe, 0x99, 0xd3, 0xd, 0x47, 0xac, 0xe6, 0x38, 0x72, 0xf3, 0xb9, 0x67, 0x2d, 0xc6, 0x8c, 0x52, 0x18, 0x4d, 0x7, 0xd9, 0x93, 0x78, 0x32, 0xec, 0xa6, 0x27, 0x6d, 0xb3, 0xf9, 0x12, 0x58, 0x86, 0xcc, 0x2c, 0x66, 0xb8, 0xf2, 0x19, 0x53, 0x8d, 0xc7, 0x46, 0xc, 0xd2, 0x98, 0x73, 0x39, 0xe7, 0xad, 0xf8, 0xb2, 0x6c, 0x26, 0xcd, 0x87, 0x59, 0x13, 0x92, 0xd8, 0x6, 0x4c, 0xa7, 0xed, 0x33, 0x79}, [256]byte{0x0, 0x4b, 0x96, 0xdd, 0x31, 0x7a, 0xa7, 0xec, 0x62, 0x29, 0xf4, 0xbf, 0x53, 0x18, 0xc5, 0x8e, 0xc4, 0x8f, 0x52, 0x19, 0xf5, 0xbe, 0x63, 0x28, 0xa6, 0xed, 0x30, 0x7b, 0x97, 0xdc, 0x1, 0x4a, 0x95, 0xde, 0x3, 0x48, 0xa4, 0xef, 0x32, 0x79, 0xf7, 0xbc, 0x61, 0x2a, 0xc6, 0x8d, 0x50, 0x1b, 0x51, 0x1a, 0xc7, 0x8c, 0x60, 0x2b, 0xf6, 0xbd, 0x33, 0x78, 0xa5, 0xee, 0x2, 0x49, 0x94, 0xdf, 0x37, 0x7c, 0xa1, 0xea, 0x6, 0x4d, 0x90, 0xdb, 0x55, 0x1e, 0xc3, 0x88, 0x64, 0x2f, 0xf2, 0xb9, 0xf3, 0xb8, 0x65, 0x2e, 0xc2, 0x89, 0x54, 0x1f, 0x91, 0xda, 0x7, 0x4c, 0xa0, 0xeb, 0x36, 0x7d, 0xa2, 0xe9, 0x34, 0x7f, 0x93, 0xd8, 0x5, 0x4e, 0xc0, 0x8b, 0x56, 0x1d, 0xf1, 0xba, 0x67, 0x2c, 0x66, 0x2d, 0xf0, 0xbb, 0x57, 0x1c, 0xc1, 0x8a, 0x4, 0x4f, 0x92, 0xd9, 0x35, 0x7e, 0xa3, 0xe8, 0x6e, 0x25, 0xf8, 0xb3, 0x5f, 0x14, 0xc9, 0x82, 0xc, 0x47, 0x9a, 0xd1, 0x3d, 0x76, 0xab, 0xe0, 0xaa, 0xe1, 0x3c, 0x77, 0x9b, 0xd0, 0xd, 0x46, 0xc8, 0x83, 0x5e, 0x15, 0xf9, 0xb2, 0x6f, 0x24, 0xfb, 0xb0, 0x6d, 0x26, 0xca, 0x81, 0x5c, 0x17, 0x99, 0xd2, 0xf, 0x44, 0xa8, 0xe3, 0x3e, 0x75, 0x3f, 0x74, 0xa9, 0xe2, 0xe, 0x45, 0x98, 0xd3, 0x5d, 0x16, 0xcb, 0x80, 0x6c, 0x27, 0xfa, 0xb1, 0x59, 0x12, 0xcf, 0x84, 0x68, 0x23, 0xfe, 0xb5, 0x3b, 0x70, 0xad, 0xe6, 0xa, 0x41, 0x9c, 0xd7, 0x9d, 0xd6, 0xb, 0x40, 0xac, 0xe7, 0x3a, 0x71, 0xff, 0xb4, 0x69, 0x22, 0xce, 0x85, 0x58, 0x13, 0xcc, 0x87, 0x5a, 0x11, 0xfd, 0xb6, 0x6b, 0x20, 0xae, 0xe5, 0x38, 0x73, 0x9f, 0xd4, 0x9, 0x42, 0x8, 0x43, 0x9e, 0xd5, 0x39, 0x72, 0xaf, 0xe4, 0x6a, 0x21, 0xfc, 0xb7, 0x5b, 0x10, 0xcd, 0x86}, [256]byte{0x0, 0x4c, 0x98, 0xd4, 0x2d, 0x61, 0xb5, 0xf9, 0x5a, 0x16, 0xc2, 0x8e, 0x77, 0x3b, 0xef, 0xa3, 0xb4, 0xf8, 0x2c, 0x60, 0x99, 0xd5, 0x1, 0x4d, 0xee, 0xa2, 0x76, 0x3a, 0xc3, 0x8f, 0x5b, 0x17, 0x75, 0x39, 0xed, 0xa1, 0x58, 0x14, 0xc0, 0x8c, 0x2f, 0x63, 0xb7, 0xfb, 0x2, 0x4e, 0x9a, 0xd6, 0xc1, 0x8d, 0x59, 0x15, 0xec, 0xa0, 0x74, 0x38, 0x9b, 0xd7, 0x3, 0x4f, 0xb6, 0xfa, 0x2e, 0x62, 0xea, 0xa6, 0x72, 0x3e, 0xc7, 0x8b, 0x5f, 0x13, 0xb0, 0xfc, 0x28, 0x64, 0x9d, 0xd1, 0x5, 0x49, 0x5e, 0x12, 0xc6, 0x8a, 0x73, 0x3f, 0xeb, 0xa7, 0x4, 0x48, 0x9c, 0xd0, 0x29, 0x65, 0xb1, 0xfd, 0x9f, 0xd3, 0x7, 0x4b, 0xb2, 0xfe, 0x2a, 0x66, 0xc5, 0x89, 0x5d, 0x11, 0xe8, 0xa4, 0x70, 0x3c, 0x2b, 0x67, 0xb3, 0xff, 0x6, 0x4a, 0x9e, 0xd2, 0x71, 0x3d, 0xe9, 0xa5, 0x5c, 0x10, 0xc4, 0x88, 0xc9, 0x85, 0x51, 0x1d, 0xe4, 0xa8, 0x7c, 0x30, 0x93, 0xdf, 0xb, 0x47, 0xbe, 0xf2, 0x26, 0x6a, 0x7d, 0x31, 0xe5, 0xa9, 0x50, 0x1c, 0xc8, 0x84, 0x27, 0x6b, 0xbf, 0xf3, 0xa, 0x46, 0x92, 0xde, 0xbc, 0xf0, 0x24, 0x68, 0x91, 0xdd, 0x9, 0x45, 0xe6, 0xaa, 0x7e, 0x32, 0xcb, 0x87, 0x53, 0x1f, 0x8, 0x44, 0x90, 0xdc, 0x25, 0x69, 0xbd, 0xf1, 0x52, 0x1e, 0xca, 0x86, 0x7f, 0x33, 0xe7, 0xab, 0x23, 0x6f, 0xbb, 0xf7, 0xe, 0x42, 0x96, 0xda, 0x79, 0x35, 0xe1, 0xad, 0x54, 0x18, 0xcc, 0x80, 0x97, 0xdb, 0xf, 0x43, 0xba, 0xf6, 0x22, 0x6e, 0xcd, 0x81, 0x55, 0x19, 0xe0, 0xac, 0x78, 0x34, 0x56, 0x1a, 0xce, 0x82, 0x7b, 0x37, 0xe3, 0xaf, 0xc, 0x40, 0x94, 0xd8, 0x21, 0x6d, 0xb9, 0xf5, 0xe2, 0xae, 0x7a, 0x36, 0xcf, 0x83, 0x57, 0x1b, 0xb8, 0xf4, 0x20, 0x6c, 0x95, 0xd9, 0xd, 0x41}, [256]byte{0x0, 0x4d, 0x9a, 0xd7, 0x29, 0x64, 0xb3, 0xfe, 0x52, 0x1f, 0xc8, 0x85, 0x7b, 0x36, 0xe1, 0xac, 0xa4, 0xe9, 0x3e, 0x73, 0x8d, 0xc0, 0x17, 0x5a, 0xf6, 0xbb, 0x6c, 0x21, 0xdf, 0x92, 0x45, 0x8, 0x55, 0x18, 0xcf, 0x82, 0x7c, 0x31, 0xe6, 0xab, 0x7, 0x4a, 0x9d, 0xd0, 0x2e, 0x63, 0xb4, 0xf9, 0xf1, 0xbc, 0x6b, 0x26, 0xd8, 0x95, 0x42, 0xf, 0xa3, 0xee, 0x39, 0x74, 0x8a, 0xc7, 0x10, 0x5d, 0xaa, 0xe7, 0x30, 0x7d, 0x83, 0xce, 0x19, 0x54, 0xf8, 0xb5, 0x62, 0x2f, 0xd1, 0x9c, 0x4b, 0x6, 0xe, 0x43, 0x94, 0xd9, 0x27, 0x6a, 0xbd, 0xf0, 0x5c, 0x11, 0xc6, 0x8b, 0x75, 0x38, 0xef, 0xa2, 0xff, 0xb2, 0x65, 0x28, 0xd6, 0x9b, 0x4c, 0x1, 0xad, 0xe0, 0x37, 0x7a, 0x84, 0xc9, 0x1e, 0x53, 0x5b, 0x16, 0xc1, 0x8c, 0x72, 0x3f, 0xe8, 0xa5, 0x9, 0x44, 0x93, 0xde, 0x20, 0x6d, 0xba, 0xf7, 0x49, 0x4, 0xd3, 0x9e, 0x60, 0x2d, 0xfa, 0xb7, 0x1b, 0x56, 0x81, 0xcc, 0x32, 0x7f, 0xa8, 0xe5, 0xed, 0xa0, 0x77, 0x3a, 0xc4, 0x89, 0x5e, 0x13, 0xbf, 0xf2, 0x25, 0x68, 0x96, 0xdb, 0xc, 0x41, 0x1c, 0x51, 0x86, 0xcb, 0x35, 0x78, 0xaf, 0xe2, 0x4e, 0x3, 0xd4, 0x99, 0x67, 0x2a, 0xfd, 0xb0, 0xb8, 0xf5, 0x22, 0x6f, 0x91, 0xdc, 0xb, 0x46, 0xea, 0xa7, 0x70, 0x3d, 0xc3, 0x8e, 0x59, 0x14, 0xe3, 0xae, 0x79, 0x34, 0xca, 0x87, 0x50, 0x1d, 0xb1, 0xfc, 0x2b, 0x66, 0x98, 0xd5, 0x2, 0x4f, 0x47, 0xa, 0xdd, 0x90, 0x6e, 0x23, 0xf4, 0xb9, 0x15, 0x58, 0x8f, 0xc2, 0x3c, 0x71, 0xa6, 0xeb, 0xb6, 0xfb, 0x2c, 0x61, 0x9f, 0xd2, 0x5, 0x48, 0xe4, 0xa9, 0x7e, 0x33, 0xcd, 0x80, 0x57, 0x1a, 0x12, 0x5f, 0x88, 0xc5, 0x3b, 0x76, 0xa1, 0xec, 0x40, 0xd, 0xda, 0x97, 0x69, 0x24, 0xf3, 0xbe}, [256]byte{0x0, 0x4e, 0x9c, 0xd2, 0x25, 0x6b, 0xb9, 0xf7, 0x4a, 0x4, 0xd6, 0x98, 0x6f, 0x21, 0xf3, 0xbd, 0x94, 0xda, 0x8, 0x46, 0xb1, 0xff, 0x2d, 0x63, 0xde, 0x90, 0x42, 0xc, 0xfb, 0xb5, 0x67, 0x29, 0x35, 0x7b, 0xa9, 0xe7, 0x10, 0x5e, 0x8c, 0xc2, 0x7f, 0x31, 0xe3, 0xad, 0x5a, 0x14, 0xc6, 0x88, 0xa1, 0xef, 0x3d, 0x73, 0x84, 0xca, 0x18, 0x56, 0xeb, 0xa5, 0x77, 0x39, 0xce, 0x80, 0x52, 0x1c, 0x6a, 0x24, 0xf6, 0xb8, 0x4f, 0x1, 0xd3, 0x9d, 0x20, 0x6e, 0xbc, 0xf2, 0x5, 0x4b, 0x99, 0xd7, 0xfe, 0xb0, 0x62, 0x2c, 0xdb, 0x95, 0x47, 0x9, 0xb4, 0xfa, 0x28, 0x66, 0x91, 0xdf, 0xd, 0x43, 0x5f, 0x11, 0xc3, 0x8d, 0x7a, 0x34, 0xe6, 0xa8, 0x15, 0x5b, 0x89, 0xc7, 0x30, 0x7e, 0xac, 0xe2, 0xcb, 0x85, 0x57, 0x19, 0xee, 0xa0, 0x72, 0x3c, 0x81, 0xcf, 0x1d, 0x53, 0xa4, 0xea, 0x38, 0x76, 0xd4, 0x9a, 0x48, 0x6, 0xf1, 0xbf, 0x6d, 0x23, 0x9e, 0xd0, 0x2, 0x4c, 0xbb, 0xf5, 0x27, 0x69, 0x40, 0xe, 0xdc, 0x92, 0x65, 0x2b, 0xf9, 0xb7, 0xa, 0x44, 0x96, 0xd8, 0x2f, 0x61, 0xb3, 0xfd, 0xe1, 0xaf, 0x7d, 0x33, 0xc4, 0x8a, 0x58, 0x16, 0xab, 0xe5, 0x37, 0x79, 0x8e, 0xc0, 0x12, 0x5c, 0x75, 0x3b, 0xe9, 0xa7, 0x50, 0x1e, 0xcc, 0x82, 0x3f, 0x71, 0xa3, 0xed, 0x1a, 0x54, 0x86, 0xc8, 0xbe, 0xf0, 0x22, 0x6c, 0x9b, 0xd5, 0x7, 0x49, 0xf4, 0xba, 0x68, 0x26, 0xd1, 0x9f, 0x4d, 0x3, 0x2a, 0x64, 0xb6, 0xf8, 0xf, 0x41, 0x93, 0xdd, 0x60, 0x2e, 0xfc, 0xb2, 0x45, 0xb, 0xd9, 0x97, 0x8b, 0xc5, 0x17, 0x59, 0xae, 0xe0, 0x32, 0x7c, 0xc1, 0x8f, 0x5d, 0x13, 0xe4, 0xaa, 0x78, 0x36, 0x1f, 0x51, 0x83, 0xcd, 0x3a, 0x74, 0xa6, 0xe8, 0x55, 0x1b, 0xc9, 0x87, 0x70, 0x3e, 0xec, 0xa2}, [256]byte{0x0, 0x4f, 0x9e, 0xd1, 0x21, 0x6e, 0xbf, 0xf0, 0x42, 0xd, 0xdc, 0x93, 0x63, 0x2c, 0xfd, 0xb2, 0x84, 0xcb, 0x1a, 0x55, 0xa5, 0xea, 0x3b, 0x74, 0xc6, 0x89, 0x58, 0x17, 0xe7, 0xa8, 0x79, 0x36, 0x15, 0x5a, 0x8b, 0xc4, 0x34, 0x7b, 0xaa, 0xe5, 0x57, 0x18, 0xc9, 0x86, 0x76, 0x39, 0xe8, 0xa7, 0x91, 0xde, 0xf, 0x40, 0xb0, 0xff, 0x2e, 0x61, 0xd3, 0x9c, 0x4d, 0x2, 0xf2, 0xbd, 0x6c, 0x23, 0x2a, 0x65, 0xb4, 0xfb, 0xb, 0x44, 0x95, 0xda, 0x68, 0x27, 0xf6, 0xb9, 0x49, 0x6, 0xd7, 0x98, 0xae, 0xe1, 0x30, 0x7f, 0x8f, 0xc0, 0x11, 0x5e, 0xec, 0xa3, 0x72, 0x3d, 0xcd, 0x82, 0x53, 0x1c, 0x3f, 0x70, 0xa1, 0xee, 0x1e, 0x51, 0x80, 0xcf, 0x7d, 0x32, 0xe3, 0xac, 0x5c, 0x13, 0xc2, 0x8d, 0xbb, 0xf4, 0x25, 0x6a, 0x9a, 0xd5, 0x4, 0x4b, 0xf9, 0xb6, 0x67, 0x28, 0xd8, 0x97, 0x46, 0x9, 0x54, 0x1b, 0xca, 0x85, 0x75, 0x3a, 0xeb, 0xa4, 0x16, 0x59, 0x88, 0xc7, 0x37, 0x78, 0xa9, 0xe6, 0xd0, 0x9f, 0x4e, 0x1, 0xf1, 0xbe, 0x6f, 0x20, 0x92, 0xdd, 0xc, 0x43, 0xb3, 0xfc, 0x2d, 0x62, 0x41, 0xe, 0xdf, 0x90, 0x60, 0x2f, 0xfe, 0xb1, 0x3, 0x4c, 0x9d, 0xd2, 0x22, 0x6d, 0xbc, 0xf3, 0xc5, 0x8a, 0x5b, 0x14, 0xe4, 0xab, 0x7a, 0x35, 0x87, 0xc8, 0x19, 0x56, 0xa6, 0xe9, 0x38, 0x77, 0x7e, 0x31, 0xe0, 0xaf, 0x5f, 0x10, 0xc1, 0x8e, 0x3c, 0x73, 0xa2, 0xed, 0x1d, 0x52, 0x83, 0xcc, 0xfa, 0xb5, 0x64, 0x2b, 0xdb, 0x94, 0x45, 0xa, 0xb8, 0xf7, 0x26, 0x69, 0x99, 0xd6, 0x7, 0x48, 0x6b, 0x24, 0xf5, 0xba, 0x4a, 0x5, 0xd4, 0x9b, 0x29, 0x66, 0xb7, 0xf8, 0x8, 0x47, 0x96, 0xd9, 0xef, 0xa0, 0x71, 0x3e, 0xce, 0x81, 0x50, 0x1f, 0xad, 0xe2, 0x33, 0x7c, 0x8c, 0xc3, 0x12, 0x5d}, [256]byte{0x0, 0x50, 0xa0, 0xf0, 0x5d, 0xd, 0xfd, 0xad, 0xba, 0xea, 0x1a, 0x4a, 0xe7, 0xb7, 0x47, 0x17, 0x69, 0x39, 0xc9, 0x99, 0x34, 0x64, 0x94, 0xc4, 0xd3, 0x83, 0x73, 0x23, 0x8e, 0xde, 0x2e, 0x7e, 0xd2, 0x82, 0x72, 0x22, 0x8f, 0xdf, 0x2f, 0x7f, 0x68, 0x38, 0xc8, 0x98, 0x35, 0x65, 0x95, 0xc5, 0xbb, 0xeb, 0x1b, 0x4b, 0xe6, 0xb6, 0x46, 0x16, 0x1, 0x51, 0xa1, 0xf1, 0x5c, 0xc, 0xfc, 0xac, 0xb9, 0xe9, 0x19, 0x49, 0xe4, 0xb4, 0x44, 0x14, 0x3, 0x53, 0xa3, 0xf3, 0x5e, 0xe, 0xfe, 0xae, 0xd0, 0x80, 0x70, 0x20, 0x8d, 0xdd, 0x2d, 0x7d, 0x6a, 0x3a, 0xca, 0x9a, 0x37, 0x67, 0x97, 0xc7, 0x6b, 0x3b, 0xcb, 0x9b, 0x36, 0x66, 0x96, 0xc6, 0xd1, 0x81, 0x71, 0x21, 0x8c, 0xdc, 0x2c, 0x7c, 0x2, 0x52, 0xa2, 0xf2, 0x5f, 0xf, 0xff, 0xaf, 0xb8, 0xe8, 0x18, 0x48, 0xe5, 0xb5, 0x45, 0x15, 0x6f, 0x3f, 0xcf, 0x9f, 0x32, 0x62, 0x92, 0xc2, 0xd5, 0x85, 0x75, 0x25, 0x88, 0xd8, 0x28, 0x78, 0x6, 0x56, 0xa6, 0xf6, 0x5b, 0xb, 0xfb, 0xab, 0xbc, 0xec, 0x1c, 0x4c, 0xe1, 0xb1, 0x41, 0x11, 0xbd, 0xed, 0x1d, 0x4d, 0xe0, 0xb0, 0x40, 0x10, 0x7, 0x57, 0xa7, 0xf7, 0x5a, 0xa, 0xfa, 0xaa, 0xd4, 0x84, 0x74, 0x24, 0x89, 0xd9, 0x29, 0x79, 0x6e, 0x3e, 0xce, 0x9e, 0x33, 0x63, 0x93, 0xc3, 0xd6, 0x86, 0x76, 0x26, 0x8b, 0xdb, 0x2b, 0x7b, 0x6c, 0x3c, 0xcc, 0x9c, 0x31, 0x61, 0x91, 0xc1, 0xbf, 0xef, 0x1f, 0x4f, 0xe2, 0xb2, 0x42, 0x12, 0x5, 0x55, 0xa5, 0xf5, 0x58, 0x8, 0xf8, 0xa8, 0x4, 0x54, 0xa4, 0xf4, 0x59, 0x9, 0xf9, 0xa9, 0xbe, 0xee, 0x1e, 0x4e, 0xe3, 0xb3, 0x43, 0x13, 0x6d, 0x3d, 0xcd, 0x9d, 0x30, 0x60, 0x90, 0xc0, 0xd7, 0x87, 0x77, 0x27, 0x8a, 0xda, 0x2a, 0x7a}, [256]byte{0x0, 0x51, 0xa2, 0xf3, 0x59, 0x8, 0xfb, 0xaa, 0xb2, 0xe3, 0x10, 0x41, 0xeb, 0xba, 0x49, 0x18, 0x79, 0x28, 0xdb, 0x8a, 0x20, 0x71, 0x82, 0xd3, 0xcb, 0x9a, 0x69, 0x38, 0x92, 0xc3, 0x30, 0x61, 0xf2, 0xa3, 0x50, 0x1, 0xab, 0xfa, 0x9, 0x58, 0x40, 0x11, 0xe2, 0xb3, 0x19, 0x48, 0xbb, 0xea, 0x8b, 0xda, 0x29, 0x78, 0xd2, 0x83, 0x70, 0x21, 0x39, 0x68, 0x9b, 0xca, 0x60, 0x31, 0xc2, 0x93, 0xf9, 0xa8, 0x5b, 0xa, 0xa0, 0xf1, 0x2, 0x53, 0x4b, 0x1a, 0xe9, 0xb8, 0x12, 0x43, 0xb0, 0xe1, 0x80, 0xd1, 0x22, 0x73, 0xd9, 0x88, 0x7b, 0x2a, 0x32, 0x63, 0x90, 0xc1, 0x6b, 0x3a, 0xc9, 0x98, 0xb, 0x5a, 0xa9, 0xf8, 0x52, 0x3, 0xf0, 0xa1, 0xb9, 0xe8, 0x1b, 0x4a, 0xe0, 0xb1, 0x42, 0x13, 0x72, 0x23, 0xd0, 0x81, 0x2b, 0x7a, 0x89, 0xd8, 0xc0, 0x91, 0x62, 0x33, 0x99, 0xc8, 0x3b, 0x6a, 0xef, 0xbe, 0x4d, 0x1c, 0xb6, 0xe7, 0x14, 0x45, 0x5d, 0xc, 0xff, 0xae, 0x4, 0x55, 0xa6, 0xf7, 0x96, 0xc7, 0x34, 0x65, 0xcf, 0x9e, 0x6d, 0x3c, 0x24, 0x75, 0x86, 0xd7, 0x7d, 0x2c, 0xdf, 0x8e, 0x1d, 0x4c, 0xbf, 0xee, 0x44, 0x15, 0xe6, 0xb7, 0xaf, 0xfe, 0xd, 0x5c, 0xf6, 0xa7, 0x54, 0x5, 0x64, 0x35, 0xc6, 0x97, 0x3d, 0x6c, 0x9f, 0xce, 0xd6, 0x87, 0x74, 0x25, 0x8f, 0xde, 0x2d, 0x7c, 0x16, 0x47, 0xb4, 0xe5, 0x4f, 0x1e, 0xed, 0xbc, 0xa4, 0xf5, 0x6, 0x57, 0xfd, 0xac, 0x5f, 0xe, 0x6f, 0x3e, 0xcd, 0x9c, 0x36, 0x67, 0x94, 0xc5, 0xdd, 0x8c, 0x7f, 0x2e, 0x84, 0xd5, 0x26, 0x77, 0xe4, 0xb5, 0x46, 0x17, 0xbd, 0xec, 0x1f, 0x4e, 0x56, 0x7, 0xf4, 0xa5, 0xf, 0x5e, 0xad, 0xfc, 0x9d, 0xcc, 0x3f, 0x6e, 0xc4, 0x95, 0x66, 0x37, 0x2f, 0x7e, 0x8d, 0xdc, 0x76, 0x27, 0xd4, 0x85}, [256]byte{0x0, 0x52, 0xa4, 0xf6, 0x55, 0x7, 0xf1, 0xa3, 0xaa, 0xf8, 0xe, 0x5c, 0xff, 0xad, 0x5b, 0x9, 0x49, 0x1b, 0xed, 0xbf, 0x1c, 0x4e, 0xb8, 0xea, 0xe3, 0xb1, 0x47, 0x15, 0xb6, 0xe4, 0x12, 0x40, 0x92, 0xc0, 0x36, 0x64, 0xc7, 0x95, 0x63, 0x31, 0x38, 0x6a, 0x9c, 0xce, 0x6d, 0x3f, 0xc9, 0x9b, 0xdb, 0x89, 0x7f, 0x2d, 0x8e, 0xdc, 0x2a, 0x78, 0x71, 0x23, 0xd5, 0x87, 0x24, 0x76, 0x80, 0xd2, 0x39, 0x6b, 0x9d, 0xcf, 0x6c, 0x3e, 0xc8, 0x9a, 0x93, 0xc1, 0x37, 0x65, 0xc6, 0x94, 0x62, 0x30, 0x70, 0x22, 0xd4, 0x86, 0x25, 0x77, 0x81, 0xd3, 0xda, 0x88, 0x7e, 0x2c, 0x8f, 0xdd, 0x2b, 0x79, 0xab, 0xf9, 0xf, 0x5d, 0xfe, 0xac, 0x5a, 0x8, 0x1, 0x53, 0xa5, 0xf7, 0x54, 0x6, 0xf0, 0xa2, 0xe2, 0xb0, 0x46, 0x14, 0xb7, 0xe5, 0x13, 0x41, 0x48, 0x1a, 0xec, 0xbe, 0x1d, 0x4f, 0xb9, 0xeb, 0x72, 0x20, 0xd6, 0x84, 0x27, 0x75, 0x83, 0xd1, 0xd8, 0x8a, 0x7c, 0x2e, 0x8d, 0xdf, 0x29, 0x7b, 0x3b, 0x69, 0x9f, 0xcd, 0x6e, 0x3c, 0xca, 0x98, 0x91, 0xc3, 0x35, 0x67, 0xc4, 0x96, 0x60, 0x32, 0xe0, 0xb2, 0x44, 0x16, 0xb5, 0xe7, 0x11, 0x43, 0x4a, 0x18, 0xee, 0xbc, 0x1f, 0x4d, 0xbb, 0xe9, 0xa9, 0xfb, 0xd, 0x5f, 0xfc, 0xae, 0x58, 0xa, 0x3, 0x51, 0xa7, 0xf5, 0x56, 0x4, 0xf2, 0xa0, 0x4b, 0x19, 0xef, 0xbd, 0x1e, 0x4c, 0xba, 0xe8, 0xe1, 0xb3, 0x45, 0x17, 0xb4, 0xe6, 0x10, 0x42, 0x2, 0x50, 0xa6, 0xf4, 0x57, 0x5, 0xf3, 0xa1, 0xa8, 0xfa, 0xc, 0x5e, 0xfd, 0xaf, 0x59, 0xb, 0xd9, 0x8b, 0x7d, 0x2f, 0x8c, 0xde, 0x28, 0x7a, 0x73, 0x21, 0xd7, 0x85, 0x26, 0x74, 0x82, 0xd0, 0x90, 0xc2, 0x34, 0x66, 0xc5, 0x97, 0x61, 0x33, 0x3a, 0x68, 0x9e, 0xcc, 0x6f, 0x3d, 0xcb, 0x99}, [256]byte{0x0, 0x53, 0xa6, 0xf5, 0x51, 0x2, 0xf7, 0xa4, 0xa2, 0xf1, 0x4, 0x57, 0xf3, 0xa0, 0x55, 0x6, 0x59, 0xa, 0xff, 0xac, 0x8, 0x5b, 0xae, 0xfd, 0xfb, 0xa8, 0x5d, 0xe, 0xaa, 0xf9, 0xc, 0x5f, 0xb2, 0xe1, 0x14, 0x47, 0xe3, 0xb0, 0x45, 0x16, 0x10, 0x43, 0xb6, 0xe5, 0x41, 0x12, 0xe7, 0xb4, 0xeb, 0xb8, 0x4d, 0x1e, 0xba, 0xe9, 0x1c, 0x4f, 0x49, 0x1a, 0xef, 0xbc, 0x18, 0x4b, 0xbe, 0xed, 0x79, 0x2a, 0xdf, 0x8c, 0x28, 0x7b, 0x8e, 0xdd, 0xdb, 0x88, 0x7d, 0x2e, 0x8a, 0xd9, 0x2c, 0x7f, 0x20, 0x73, 0x86, 0xd5, 0x71, 0x22, 0xd7, 0x84, 0x82, 0xd1, 0x24, 0x77, 0xd3, 0x80, 0x75, 0x26, 0xcb, 0x98, 0x6d, 0x3e, 0x9a, 0xc9, 0x3c, 0x6f, 0x69, 0x3a, 0xcf, 0x9c, 0x38, 0x6b, 0x9e, 0xcd, 0x92, 0xc1, 0x34, 0x67, 0xc3, 0x90, 0x65, 0x36, 0x30, 0x63, 0x96, 0xc5, 0x61, 0x32, 0xc7, 0x94, 0xf2, 0xa1, 0x54, 0x7, 0xa3, 0xf0, 0x5, 0x56, 0x50, 0x3, 0xf6, 0xa5, 0x1, 0x52, 0xa7, 0xf4, 0xab, 0xf8, 0xd, 0x5e, 0xfa, 0xa9, 0x5c, 0xf, 0x9, 0x5a, 0xaf, 0xfc, 0x58, 0xb, 0xfe, 0xad, 0x40, 0x13, 0xe6, 0xb5, 0x11, 0x42, 0xb7, 0xe4, 0xe2, 0xb1, 0x44, 0x17, 0xb3, 0xe0, 0x15, 0x46, 0x19, 0x4a, 0xbf, 0xec, 0x48, 0x1b, 0xee, 0xbd, 0xbb, 0xe8, 0x1d, 0x4e, 0xea, 0xb9, 0x4c, 0x1f, 0x8b, 0xd8, 0x2d, 0x7e, 0xda, 0x89, 0x7c, 0x2f, 0x29, 0x7a, 0x8f, 0xdc, 0x78, 0x2b, 0xde, 0x8d, 0xd2, 0x81, 0x74, 0x27, 0x83, 0xd0, 0x25, 0x76, 0x70, 0x23, 0xd6, 0x85, 0x21, 0x72, 0x87, 0xd4, 0x39, 0x6a, 0x9f, 0xcc, 0x68, 0x3b, 0xce, 0x9d, 0x9b, 0xc8, 0x3d, 0x6e, 0xca, 0x99, 0x6c, 0x3f, 0x60, 0x33, 0xc6, 0x95, 0x31, 0x62, 0x97, 0xc4, 0xc2, 0x91, 0x64, 0x37, 0x93, 0xc0, 0x35, 0x66}, [256]byte{0x0, 0x54, 0xa8, 0xfc, 0x4d, 0x19, 0xe5, 0xb1, 0x9a, 0xce, 0x32, 0x66, 0xd7, 0x83, 0x7f, 0x2b, 0x29, 0x7d, 0x81, 0xd5, 0x64, 0x30, 0xcc, 0x98, 0xb3, 0xe7, 0x1b, 0x4f, 0xfe, 0xaa, 0x56, 0x2, 0x52, 0x6, 0xfa, 0xae, 0x1f, 0x4b, 0xb7, 0xe3, 0xc8, 0x9c, 0x60, 0x34, 0x85, 0xd1, 0x2d, 0x79, 0x7b, 0x2f, 0xd3, 0x87, 0x36, 0x62, 0x9e, 0xca, 0xe1, 0xb5, 0x49, 0x1d, 0xac, 0xf8, 0x4, 0x50, 0xa4, 0xf0, 0xc, 0x58, 0xe9, 0xbd, 0x41, 0x15, 0x3e, 0x6a, 0x96, 0xc2, 0x73, 0x27, 0xdb, 0x8f, 0x8d, 0xd9, 0x25, 0x71, 0xc0, 0x94, 0x68, 0x3c, 0x17, 0x43, 0xbf, 0xeb, 0x5a, 0xe, 0xf2, 0xa6, 0xf6, 0xa2, 0x5e, 0xa, 0xbb, 0xef, 0x13, 0x47, 0x6c, 0x38, 0xc4, 0x90, 0x21, 0x75, 0x89, 0xdd, 0xdf, 0x8b, 0x77, 0x23, 0x92, 0xc6, 0x3a, 0x6e, 0x45, 0x11, 0xed, 0xb9, 0x8, 0x5c, 0xa0, 0xf4, 0x55, 0x1, 0xfd, 0xa9, 0x18, 0x4c, 0xb0, 0xe4, 0xcf, 0x9b, 0x67, 0x33, 0x82, 0xd6, 0x2a, 0x7e, 0x7c, 0x28, 0xd4, 0x80, 0x31, 0x65, 0x99, 0xcd, 0xe6, 0xb2, 0x4e, 0x1a, 0xab, 0xff, 0x3, 0x57, 0x7, 0x53, 0xaf, 0xfb, 0x4a, 0x1e, 0xe2, 0xb6, 0x9d, 0xc9, 0x35, 0x61, 0xd0, 0x84, 0x78, 0x2c, 0x2e, 0x7a, 0x86, 0xd2, 0x63, 0x37, 0xcb, 0x9f, 0xb4, 0xe0, 0x1c, 0x48, 0xf9, 0xad, 0x51, 0x5, 0xf1, 0xa5, 0x59, 0xd, 0xbc, 0xe8, 0x14, 0x40, 0x6b, 0x3f, 0xc3, 0x97, 0x26, 0x72, 0x8e, 0xda, 0xd8, 0x8c, 0x70, 0x24, 0x95, 0xc1, 0x3d, 0x69, 0x42, 0x16, 0xea, 0xbe, 0xf, 0x5b, 0xa7, 0xf3, 0xa3, 0xf7, 0xb, 0x5f, 0xee, 0xba, 0x46, 0x12, 0x39, 0x6d, 0x91, 0xc5, 0x74, 0x20, 0xdc, 0x88, 0x8a, 0xde, 0x22, 0x76, 0xc7, 0x93, 0x6f, 0x3b, 0x10, 0x44, 0xb8, 0xec, 0x5d, 0x9, 0xf5, 0xa1}, [256]byte{0x0, 0x55, 0xaa, 0xff, 0x49, 0x1c, 0xe3, 0xb6, 0x92, 0xc7, 0x38, 0x6d, 0xdb, 0x8e, 0x71, 0x24, 0x39, 0x6c, 0x93, 0xc6, 0x70, 0x25, 0xda, 0x8f, 0xab, 0xfe, 0x1, 0x54, 0xe2, 0xb7, 0x48, 0x1d, 0x72, 0x27, 0xd8, 0x8d, 0x3b, 0x6e, 0x91, 0xc4, 0xe0, 0xb5, 0x4a, 0x1f, 0xa9, 0xfc, 0x3, 0x56, 0x4b, 0x1e, 0xe1, 0xb4, 0x2, 0x57, 0xa8, 0xfd, 0xd9, 0x8c, 0x73, 0x26, 0x90, 0xc5, 0x3a, 0x6f, 0xe4, 0xb1, 0x4e, 0x1b, 0xad, 0xf8, 0x7, 0x52, 0x76, 0x23, 0xdc, 0x89, 0x3f, 0x6a, 0x95, 0xc0, 0xdd, 0x88, 0x77, 0x22, 0x94, 0xc1, 0x3e, 0x6b, 0x4f, 0x1a, 0xe5, 0xb0, 0x6, 0x53, 0xac, 0xf9, 0x96, 0xc3, 0x3c, 0x69, 0xdf, 0x8a, 0x75, 0x20, 0x4, 0x51, 0xae, 0xfb, 0x4d, 0x18, 0xe7, 0xb2, 0xaf, 0xfa, 0x5, 0x50, 0xe6, 0xb3, 0x4c, 0x19, 0x3d, 0x68, 0x97, 0xc2, 0x74, 0x21, 0xde, 0x8b, 0xd5, 0x80, 0x7f, 0x2a, 0x9c, 0xc9, 0x36, 0x63, 0x47, 0x12, 0xed, 0xb8, 0xe, 0x5b, 0xa4, 0xf1, 0xec, 0xb9, 0x46, 0x13, 0xa5, 0xf0, 0xf, 0x5a, 0x7e, 0x2b, 0xd4, 0x81, 0x37, 0x62, 0x9d, 0xc8, 0xa7, 0xf2, 0xd, 0x58, 0xee, 0xbb, 0x44, 0x11, 0x35, 0x60, 0x9f, 0xca, 0x7c, 0x29, 0xd6, 0x83, 0x9e, 0xcb, 0x34, 0x61, 0xd7, 0x82, 0x7d, 0x28, 0xc, 0x59, 0xa6, 0xf3, 0x45, 0x10, 0xef, 0xba, 0x31, 0x64, 0x9b, 0xce, 0x78, 0x2d, 0xd2, 0x87, 0xa3, 0xf6, 0x9, 0x5c, 0xea, 0xbf, 0x40, 0x15, 0x8, 0x5d, 0xa2, 0xf7, 0x41, 0x14, 0xeb, 0xbe, 0x9a, 0xcf, 0x30, 0x65, 0xd3, 0x86, 0x79, 0x2c, 0x43, 0x16, 0xe9, 0xbc, 0xa, 0x5f, 0xa0, 0xf5, 0xd1, 0x84, 0x7b, 0x2e, 0x98, 0xcd, 0x32, 0x67, 0x7a, 0x2f, 0xd0, 0x85, 0x33, 0x66, 0x99, 0xcc, 0xe8, 0xbd, 0x42, 0x17, 0xa1, 0xf4, 0xb, 0x5e}, [256]byte{0x0, 0x56, 0xac, 0xfa, 0x45, 0x13, 0xe9, 0xbf, 0x8a, 0xdc, 0x26, 0x70, 0xcf, 0x99, 0x63, 0x35, 0x9, 0x5f, 0xa5, 0xf3, 0x4c, 0x1a, 0xe0, 0xb6, 0x83, 0xd5, 0x2f, 0x79, 0xc6, 0x90, 0x6a, 0x3c, 0x12, 0x44, 0xbe, 0xe8, 0x57, 0x1, 0xfb, 0xad, 0x98, 0xce, 0x34, 0x62, 0xdd, 0x8b, 0x71, 0x27, 0x1b, 0x4d, 0xb7, 0xe1, 0x5e, 0x8, 0xf2, 0xa4, 0x91, 0xc7, 0x3d, 0x6b, 0xd4, 0x82, 0x78, 0x2e, 0x24, 0x72, 0x88, 0xde, 0x61, 0x37, 0xcd, 0x9b, 0xae, 0xf8, 0x2, 0x54, 0xeb, 0xbd, 0x47, 0x11, 0x2d, 0x7b, 0x81, 0xd7, 0x68, 0x3e, 0xc4, 0x92, 0xa7, 0xf1, 0xb, 0x5d, 0xe2, 0xb4, 0x4e, 0x18, 0x36, 0x60, 0x9a, 0xcc, 0x73, 0x25, 0xdf, 0x89, 0xbc, 0xea, 0x10, 0x46, 0xf9, 0xaf, 0x55, 0x3, 0x3f, 0x69, 0x93, 0xc5, 0x7a, 0x2c, 0xd6, 0x80, 0xb5, 0xe3, 0x19, 0x4f, 0xf0, 0xa6, 0x5c, 0xa, 0x48, 0x1e, 0xe4, 0xb2, 0xd, 0x5b, 0xa1, 0xf7, 0xc2, 0x94, 0x6e, 0x38, 0x87, 0xd1, 0x2b, 0x7d, 0x41, 0x17, 0xed, 0xbb, 0x4, 0x52, 0xa8, 0xfe, 0xcb, 0x9d, 0x67, 0x31, 0x8e, 0xd8, 0x22, 0x74, 0x5a, 0xc, 0xf6, 0xa0, 0x1f, 0x49, 0xb3, 0xe5, 0xd0, 0x86, 0x7c, 0x2a, 0x95, 0xc3, 0x39, 0x6f, 0x53, 0x5, 0xff, 0xa9, 0x16, 0x40, 0xba, 0xec, 0xd9, 0x8f, 0x75, 0x23, 0x9c, 0xca, 0x30, 0x66, 0x6c, 0x3a, 0xc0, 0x96, 0x29, 0x7f, 0x85, 0xd3, 0xe6, 0xb0, 0x4a, 0x1c, 0xa3, 0xf5, 0xf, 0x59, 0x65, 0x33, 0xc9, 0x9f, 0x20, 0x76, 0x8c, 0xda, 0xef, 0xb9, 0x43, 0x15, 0xaa, 0xfc, 0x6, 0x50, 0x7e, 0x28, 0xd2, 0x84, 0x3b, 0x6d, 0x97, 0xc1, 0xf4, 0xa2, 0x58, 0xe, 0xb1, 0xe7, 0x1d, 0x4b, 0x77, 0x21, 0xdb, 0x8d, 0x32, 0x64, 0x9e, 0xc8, 0xfd, 0xab, 0x51, 0x7, 0xb8, 0xee, 0x14, 0x42}, [256]byte{0x0, 0x57, 0xae, 0xf9, 0x41, 0x16, 0xef, 0xb8, 0x82, 0xd5, 0x2c, 0x7b, 0xc3, 0x94, 0x6d, 0x3a, 0x19, 0x4e, 0xb7, 0xe0, 0x58, 0xf, 0xf6, 0xa1, 0x9b, 0xcc, 0x35, 0x62, 0xda, 0x8d, 0x74, 0x23, 0x32, 0x65, 0x9c, 0xcb, 0x73, 0x24, 0xdd, 0x8a, 0xb0, 0xe7, 0x1e, 0x49, 0xf1, 0xa6, 0x5f, 0x8, 0x2b, 0x7c, 0x85, 0xd2, 0x6a, 0x3d, 0xc4, 0x93, 0xa9, 0xfe, 0x7, 0x50, 0xe8, 0xbf, 0x46, 0x11, 0x64, 0x33, 0xca, 0x9d, 0x25, 0x72, 0x8b, 0xdc, 0xe6, 0xb1, 0x48, 0x1f, 0xa7, 0xf0, 0x9, 0x5e, 0x7d, 0x2a, 0xd3, 0x84, 0x3c, 0x6b, 0x92, 0xc5, 0xff, 0xa8, 0x51, 0x6, 0xbe, 0xe9, 0x10, 0x47, 0x56, 0x1, 0xf8, 0xaf, 0x17, 0x40, 0xb9, 0xee, 0xd4, 0x83, 0x7a, 0x2d, 0x95, 0xc2, 0x3b, 0x6c, 0x4f, 0x18, 0xe1, 0xb6, 0xe, 0x59, 0xa0, 0xf7, 0xcd, 0x9a, 0x63, 0x34, 0x8c, 0xdb, 0x22, 0x75, 0xc8, 0x9f, 0x66, 0x31, 0x89, 0xde, 0x27, 0x70, 0x4a, 0x1d, 0xe4, 0xb3, 0xb, 0x5c, 0xa5, 0xf2, 0xd1, 0x86, 0x7f, 0x28, 0x90, 0xc7, 0x3e, 0x69, 0x53, 0x4, 0xfd, 0xaa, 0x12, 0x45, 0xbc, 0xeb, 0xfa, 0xad, 0x54, 0x3, 0xbb, 0xec, 0x15, 0x42, 0x78, 0x2f, 0xd6, 0x81, 0x39, 0x6e, 0x97, 0xc0, 0xe3, 0xb4, 0x4d, 0x1a, 0xa2, 0xf5, 0xc, 0x5b, 0x61, 0x36, 0xcf, 0x98, 0x20, 0x77, 0x8e, 0xd9, 0xac, 0xfb, 0x2, 0x55, 0xed, 0xba, 0x43, 0x14, 0x2e, 0x79, 0x80, 0xd7, 0x6f, 0x38, 0xc1, 0x96, 0xb5, 0xe2, 0x1b, 0x4c, 0xf4, 0xa3, 0x5a, 0xd, 0x37, 0x60, 0x99, 0xce, 0x76, 0x21, 0xd8, 0x8f, 0x9e, 0xc9, 0x30, 0x67, 0xdf, 0x88, 0x71, 0x26, 0x1c, 0x4b, 0xb2, 0xe5, 0x5d, 0xa, 0xf3, 0xa4, 0x87, 0xd0, 0x29, 0x7e, 0xc6, 0x91, 0x68, 0x3f, 0x5, 0x52, 0xab, 0xfc, 0x44, 0x13, 0xea, 0xbd}, [256]byte{0x0, 0x58, 0xb0, 0xe8, 0x7d, 0x25, 0xcd, 0x95, 0xfa, 0xa2, 0x4a, 0x12, 0x87, 0xdf, 0x37, 0x6f, 0xe9, 0xb1, 0x59, 0x1, 0x94, 0xcc, 0x24, 0x7c, 0x13, 0x4b, 0xa3, 0xfb, 0x6e, 0x36, 0xde, 0x86, 0xcf, 0x97, 0x7f, 0x27, 0xb2, 0xea, 0x2, 0x5a, 0x35, 0x6d, 0x85, 0xdd, 0x48, 0x10, 0xf8, 0xa0, 0x26, 0x7e, 0x96, 0xce, 0x5b, 0x3, 0xeb, 0xb3, 0xdc, 0x84, 0x6c, 0x34, 0xa1, 0xf9, 0x11, 0x49, 0x83, 0xdb, 0x33, 0x6b, 0xfe, 0xa6, 0x4e, 0x16, 0x79, 0x21, 0xc9, 0x91, 0x4, 0x5c, 0xb4, 0xec, 0x6a, 0x32, 0xda, 0x82, 0x17, 0x4f, 0xa7, 0xff, 0x90, 0xc8, 0x20, 0x78, 0xed, 0xb5, 0x5d, 0x5, 0x4c, 0x14, 0xfc, 0xa4, 0x31, 0x69, 0x81, 0xd9, 0xb6, 0xee, 0x6, 0x5e, 0xcb, 0x93, 0x7b, 0x23, 0xa5, 0xfd, 0x15, 0x4d, 0xd8, 0x80, 0x68, 0x30, 0x5f, 0x7, 0xef, 0xb7, 0x22, 0x7a, 0x92, 0xca, 0x1b, 0x43, 0xab, 0xf3, 0x66, 0x3e, 0xd6, 0x8e, 0xe1, 0xb9, 0x51, 0x9, 0x9c, 0xc4, 0x2c, 0x74, 0xf2, 0xaa, 0x42, 0x1a, 0x8f, 0xd7, 0x3f, 0x67, 0x8, 0x50, 0xb8, 0xe0, 0x75, 0x2d, 0xc5, 0x9d, 0xd4, 0x8c, 0x64, 0x3c, 0xa9, 0xf1, 0x19, 0x41, 0x2e, 0x76, 0x9e, 0xc6, 0x53, 0xb, 0xe3, 0xbb, 0x3d, 0x65, 0x8d, 0xd5, 0x40, 0x18, 0xf0, 0xa8, 0xc7, 0x9f, 0x77, 0x2f, 0xba, 0xe2, 0xa, 0x52, 0x98, 0xc0, 0x28, 0x70, 0xe5, 0xbd, 0x55, 0xd, 0x62, 0x3a, 0xd2, 0x8a, 0x1f, 0x47, 0xaf, 0xf7, 0x71, 0x29, 0xc1, 0x99, 0xc, 0x54, 0xbc, 0xe4, 0x8b, 0xd3, 0x3b, 0x63, 0xf6, 0xae, 0x46, 0x1e, 0x57, 0xf, 0xe7, 0xbf, 0x2a, 0x72, 0x9a, 0xc2, 0xad, 0xf5, 0x1d, 0x45, 0xd0, 0x88, 0x60, 0x38, 0xbe, 0xe6, 0xe, 0x56, 0xc3, 0x9b, 0x73, 0x2b, 0x44, 0x1c, 0xf4, 0xac, 0x39, 0x61, 0x89, 0xd1}, [256]byte{0x0, 0x59, 0xb2, 0xeb, 0x79, 0x20, 0xcb, 0x92, 0xf2, 0xab, 0x40, 0x19, 0x8b, 0xd2, 0x39, 0x60, 0xf9, 0xa0, 0x4b, 0x12, 0x80, 0xd9, 0x32, 0x6b, 0xb, 0x52, 0xb9, 0xe0, 0x72, 0x2b, 0xc0, 0x99, 0xef, 0xb6, 0x5d, 0x4, 0x96, 0xcf, 0x24, 0x7d, 0x1d, 0x44, 0xaf, 0xf6, 0x64, 0x3d, 0xd6, 0x8f, 0x16, 0x4f, 0xa4, 0xfd, 0x6f, 0x36, 0xdd, 0x84, 0xe4, 0xbd, 0x56, 0xf, 0x9d, 0xc4, 0x2f, 0x76, 0xc3, 0x9a, 0x71, 0x28, 0xba, 0xe3, 0x8, 0x51, 0x31, 0x68, 0x83, 0xda, 0x48, 0x11, 0xfa, 0xa3, 0x3a, 0x63, 0x88, 0xd1, 0x43, 0x1a, 0xf1, 0xa8, 0xc8, 0x91, 0x7a, 0x23, 0xb1, 0xe8, 0x3, 0x5a, 0x2c, 0x75, 0x9e, 0xc7, 0x55, 0xc, 0xe7, 0xbe, 0xde, 0x87, 0x6c, 0x35, 0xa7, 0xfe, 0x15, 0x4c, 0xd5, 0x8c, 0x67, 0x3e, 0xac, 0xf5, 0x1e, 0x47, 0x27, 0x7e, 0x95, 0xcc, 0x5e, 0x7, 0xec, 0xb5, 0x9b, 0xc2, 0x29, 0x70, 0xe2, 0xbb, 0x50, 0x9, 0x69, 0x30, 0xdb, 0x82, 0x10, 0x49, 0xa2, 0xfb, 0x62, 0x3b, 0xd0, 0x89, 0x1b, 0x42, 0xa9, 0xf0, 0x90, 0xc9, 0x22, 0x7b, 0xe9, 0xb0, 0x5b, 0x2, 0x74, 0x2d, 0xc6, 0x9f, 0xd, 0x54, 0xbf, 0xe6, 0x86, 0xdf, 0x34, 0x6d, 0xff, 0xa6, 0x4d, 0x14, 0x8d, 0xd4, 0x3f, 0x66, 0xf4, 0xad, 0x46, 0x1f, 0x7f, 0x26, 0xcd, 0x94, 0x6, 0x5f, 0xb4, 0xed, 0x58, 0x1, 0xea, 0xb3, 0x21, 0x78, 0x93, 0xca, 0xaa, 0xf3, 0x18, 0x41, 0xd3, 0x8a, 0x61, 0x38, 0xa1, 0xf8, 0x13, 0x4a, 0xd8, 0x81, 0x6a, 0x33, 0x53, 0xa, 0xe1, 0xb8, 0x2a, 0x73, 0x98, 0xc1, 0xb7, 0xee, 0x5, 0x5c, 0xce, 0x97, 0x7c, 0x25, 0x45, 0x1c, 0xf7, 0xae, 0x3c, 0x65, 0x8e, 0xd7, 0x4e, 0x17, 0xfc, 0xa5, 0x37, 0x6e, 0x85, 0xdc, 0xbc, 0xe5, 0xe, 0x57, 0xc5, 0x9c, 0x77, 0x2e}, [256]byte{0x0, 0x5a, 0xb4, 0xee, 0x75, 0x2f, 0xc1, 0x9b, 0xea, 0xb0, 0x5e, 0x4, 0x9f, 0xc5, 0x2b, 0x71, 0xc9, 0x93, 0x7d, 0x27, 0xbc, 0xe6, 0x8, 0x52, 0x23, 0x79, 0x97, 0xcd, 0x56, 0xc, 0xe2, 0xb8, 0x8f, 0xd5, 0x3b, 0x61, 0xfa, 0xa0, 0x4e, 0x14, 0x65, 0x3f, 0xd1, 0x8b, 0x10, 0x4a, 0xa4, 0xfe, 0x46, 0x1c, 0xf2, 0xa8, 0x33, 0x69, 0x87, 0xdd, 0xac, 0xf6, 0x18, 0x42, 0xd9, 0x83, 0x6d, 0x37, 0x3, 0x59, 0xb7, 0xed, 0x76, 0x2c, 0xc2, 0x98, 0xe9, 0xb3, 0x5d, 0x7, 0x9c, 0xc6, 0x28, 0x72, 0xca, 0x90, 0x7e, 0x24, 0xbf, 0xe5, 0xb, 0x51, 0x20, 0x7a, 0x94, 0xce, 0x55, 0xf, 0xe1, 0xbb, 0x8c, 0xd6, 0x38, 0x62, 0xf9, 0xa3, 0x4d, 0x17, 0x66, 0x3c, 0xd2, 0x88, 0x13, 0x49, 0xa7, 0xfd, 0x45, 0x1f, 0xf1, 0xab, 0x30, 0x6a, 0x84, 0xde, 0xaf, 0xf5, 0x1b, 0x41, 0xda, 0x80, 0x6e, 0x34, 0x6, 0x5c, 0xb2, 0xe8, 0x73, 0x29, 0xc7, 0x9d, 0xec, 0xb6, 0x58, 0x2, 0x99, 0xc3, 0x2d, 0x77, 0xcf, 0x95, 0x7b, 0x21, 0xba, 0xe0, 0xe, 0x54, 0x25, 0x7f, 0x91, 0xcb, 0x50, 0xa, 0xe4, 0xbe, 0x89, 0xd3, 0x3d, 0x67, 0xfc, 0xa6, 0x48, 0x12, 0x63, 0x39, 0xd7, 0x8d, 0x16, 0x4c, 0xa2, 0xf8, 0x40, 0x1a, 0xf4, 0xae, 0x35, 0x6f, 0x81, 0xdb, 0xaa, 0xf0, 0x1e, 0x44, 0xdf, 0x85, 0x6b, 0x31, 0x5, 0x5f, 0xb1, 0xeb, 0x70, 0x2a, 0xc4, 0x9e, 0xef, 0xb5, 0x5b, 0x1, 0x9a, 0xc0, 0x2e, 0x74, 0xcc, 0x96, 0x78, 0x22, 0xb9, 0xe3, 0xd, 0x57, 0x26, 0x7c, 0x92, 0xc8, 0x53, 0x9, 0xe7, 0xbd, 0x8a, 0xd0, 0x3e, 0x64, 0xff, 0xa5, 0x4b, 0x11, 0x60, 0x3a, 0xd4, 0x8e, 0x15, 0x4f, 0xa1, 0xfb, 0x43, 0x19, 0xf7, 0xad, 0x36, 0x6c, 0x82, 0xd8, 0xa9, 0xf3, 0x1d, 0x47, 0xdc, 0x86, 0x68, 0x32}, [256]byte{0x0, 0x5b, 0xb6, 0xed, 0x71, 0x2a, 0xc7, 0x9c, 0xe2, 0xb9, 0x54, 0xf, 0x93, 0xc8, 0x25, 0x7e, 0xd9, 0x82, 0x6f, 0x34, 0xa8, 0xf3, 0x1e, 0x45, 0x3b, 0x60, 0x8d, 0xd6, 0x4a, 0x11, 0xfc, 0xa7, 0xaf, 0xf4, 0x19, 0x42, 0xde, 0x85, 0x68, 0x33, 0x4d, 0x16, 0xfb, 0xa0, 0x3c, 0x67, 0x8a, 0xd1, 0x76, 0x2d, 0xc0, 0x9b, 0x7, 0x5c, 0xb1, 0xea, 0x94, 0xcf, 0x22, 0x79, 0xe5, 0xbe, 0x53, 0x8, 0x43, 0x18, 0xf5, 0xae, 0x32, 0x69, 0x84, 0xdf, 0xa1, 0xfa, 0x17, 0x4c, 0xd0, 0x8b, 0x66, 0x3d, 0x9a, 0xc1, 0x2c, 0x77, 0xeb, 0xb0, 0x5d, 0x6, 0x78, 0x23, 0xce, 0x95, 0x9, 0x52, 0xbf, 0xe4, 0xec, 0xb7, 0x5a, 0x1, 0x9d, 0xc6, 0x2b, 0x70, 0xe, 0x55, 0xb8, 0xe3, 0x7f, 0x24, 0xc9, 0x92, 0x35, 0x6e, 0x83, 0xd8, 0x44, 0x1f, 0xf2, 0xa9, 0xd7, 0x8c, 0x61, 0x3a, 0xa6, 0xfd, 0x10, 0x4b, 0x86, 0xdd, 0x30, 0x6b, 0xf7, 0xac, 0x41, 0x1a, 0x64, 0x3f, 0xd2, 0x89, 0x15, 0x4e, 0xa3, 0xf8, 0x5f, 0x4, 0xe9, 0xb2, 0x2e, 0x75, 0x98, 0xc3, 0xbd, 0xe6, 0xb, 0x50, 0xcc, 0x97, 0x7a, 0x21, 0x29, 0x72, 0x9f, 0xc4, 0x58, 0x3, 0xee, 0xb5, 0xcb, 0x90, 0x7d, 0x26, 0xba, 0xe1, 0xc, 0x57, 0xf0, 0xab, 0x46, 0x1d, 0x81, 0xda, 0x37, 0x6c, 0x12, 0x49, 0xa4, 0xff, 0x63, 0x38, 0xd5, 0x8e, 0xc5, 0x9e, 0x73, 0x28, 0xb4, 0xef, 0x2, 0x59, 0x27, 0x7c, 0x91, 0xca, 0x56, 0xd, 0xe0, 0xbb, 0x1c, 0x47, 0xaa, 0xf1, 0x6d, 0x36, 0xdb, 0x80, 0xfe, 0xa5, 0x48, 0x13, 0x8f, 0xd4, 0x39, 0x62, 0x6a, 0x31, 0xdc, 0x87, 0x1b, 0x40, 0xad, 0xf6, 0x88, 0xd3, 0x3e, 0x65, 0xf9, 0xa2, 0x4f, 0x14, 0xb3, 0xe8, 0x5, 0x5e, 0xc2, 0x99, 0x74, 0x2f, 0x51, 0xa, 0xe7, 0xbc, 0x20, 0x7b, 0x96, 0xcd}, [256]byte{0x0, 0x5c, 0xb8, 0xe4, 0x6d, 0x31, 0xd5, 0x89, 0xda, 0x86, 0x62, 0x3e, 0xb7, 0xeb, 0xf, 0x53, 0xa9, 0xf5, 0x11, 0x4d, 0xc4, 0x98, 0x7c, 0x20, 0x73, 0x2f, 0xcb, 0x97, 0x1e, 0x42, 0xa6, 0xfa, 0x4f, 0x13, 0xf7, 0xab, 0x22, 0x7e, 0x9a, 0xc6, 0x95, 0xc9, 0x2d, 0x71, 0xf8, 0xa4, 0x40, 0x1c, 0xe6, 0xba, 0x5e, 0x2, 0x8b, 0xd7, 0x33, 0x6f, 0x3c, 0x60, 0x84, 0xd8, 0x51, 0xd, 0xe9, 0xb5, 0x9e, 0xc2, 0x26, 0x7a, 0xf3, 0xaf, 0x4b, 0x17, 0x44, 0x18, 0xfc, 0xa0, 0x29, 0x75, 0x91, 0xcd, 0x37, 0x6b, 0x8f, 0xd3, 0x5a, 0x6, 0xe2, 0xbe, 0xed, 0xb1, 0x55, 0x9, 0x80, 0xdc, 0x38, 0x64, 0xd1, 0x8d, 0x69, 0x35, 0xbc, 0xe0, 0x4, 0x58, 0xb, 0x57, 0xb3, 0xef, 0x66, 0x3a, 0xde, 0x82, 0x78, 0x24, 0xc0, 0x9c, 0x15, 0x49, 0xad, 0xf1, 0xa2, 0xfe, 0x1a, 0x46, 0xcf, 0x93, 0x77, 0x2b, 0x21, 0x7d, 0x99, 0xc5, 0x4c, 0x10, 0xf4, 0xa8, 0xfb, 0xa7, 0x43, 0x1f, 0x96, 0xca, 0x2e, 0x72, 0x88, 0xd4, 0x30, 0x6c, 0xe5, 0xb9, 0x5d, 0x1, 0x52, 0xe, 0xea, 0xb6, 0x3f, 0x63, 0x87, 0xdb, 0x6e, 0x32, 0xd6, 0x8a, 0x3, 0x5f, 0xbb, 0xe7, 0xb4, 0xe8, 0xc, 0x50, 0xd9, 0x85, 0x61, 0x3d, 0xc7, 0x9b, 0x7f, 0x23, 0xaa, 0xf6, 0x12, 0x4e, 0x1d, 0x41, 0xa5, 0xf9, 0x70, 0x2c, 0xc8, 0x94, 0xbf, 0xe3, 0x7, 0x5b, 0xd2, 0x8e, 0x6a, 0x36, 0x65, 0x39, 0xdd, 0x81, 0x8, 0x54, 0xb0, 0xec, 0x16, 0x4a, 0xae, 0xf2, 0x7b, 0x27, 0xc3, 0x9f, 0xcc, 0x90, 0x74, 0x28, 0xa1, 0xfd, 0x19, 0x45, 0xf0, 0xac, 0x48, 0x14, 0x9d, 0xc1, 0x25, 0x79, 0x2a, 0x76, 0x92, 0xce, 0x47, 0x1b, 0xff, 0xa3, 0x59, 0x5, 0xe1, 0xbd, 0x34, 0x68, 0x8c, 0xd0, 0x83, 0xdf, 0x3b, 0x67, 0xee, 0xb2, 0x56, 0xa}, [256]byte{0x0, 0x5d, 0xba, 0xe7, 0x69, 0x34, 0xd3, 0x8e, 0xd2, 0x8f, 0x68, 0x35, 0xbb, 0xe6, 0x1, 0x5c, 0xb9, 0xe4, 0x3, 0x5e, 0xd0, 0x8d, 0x6a, 0x37, 0x6b, 0x36, 0xd1, 0x8c, 0x2, 0x5f, 0xb8, 0xe5, 0x6f, 0x32, 0xd5, 0x88, 0x6, 0x5b, 0xbc, 0xe1, 0xbd, 0xe0, 0x7, 0x5a, 0xd4, 0x89, 0x6e, 0x33, 0xd6, 0x8b, 0x6c, 0x31, 0xbf, 0xe2, 0x5, 0x58, 0x4, 0x59, 0xbe, 0xe3, 0x6d, 0x30, 0xd7, 0x8a, 0xde, 0x83, 0x64, 0x39, 0xb7, 0xea, 0xd, 0x50, 0xc, 0x51, 0xb6, 0xeb, 0x65, 0x38, 0xdf, 0x82, 0x67, 0x3a, 0xdd, 0x80, 0xe, 0x53, 0xb4, 0xe9, 0xb5, 0xe8, 0xf, 0x52, 0xdc, 0x81, 0x66, 0x3b, 0xb1, 0xec, 0xb, 0x56, 0xd8, 0x85, 0x62, 0x3f, 0x63, 0x3e, 0xd9, 0x84, 0xa, 0x57, 0xb0, 0xed, 0x8, 0x55, 0xb2, 0xef, 0x61, 0x3c, 0xdb, 0x86, 0xda, 0x87, 0x60, 0x3d, 0xb3, 0xee, 0x9, 0x54, 0xa1, 0xfc, 0x1b, 0x46, 0xc8, 0x95, 0x72, 0x2f, 0x73, 0x2e, 0xc9, 0x94, 0x1a, 0x47, 0xa0, 0xfd, 0x18, 0x45, 0xa2, 0xff, 0x71, 0x2c, 0xcb, 0x96, 0xca, 0x97, 0x70, 0x2d, 0xa3, 0xfe, 0x19, 0x44, 0xce, 0x93, 0x74, 0x29, 0xa7, 0xfa, 0x1d, 0x40, 0x1c, 0x41, 0xa6, 0xfb, 0x75, 0x28, 0xcf, 0x92, 0x77, 0x2a, 0xcd, 0x90, 0x1e, 0x43, 0xa4, 0xf9, 0xa5, 0xf8, 0x1f, 0x42, 0xcc, 0x91, 0x76, 0x2b, 0x7f, 0x22, 0xc5, 0x98, 0x16, 0x4b, 0xac, 0xf1, 0xad, 0xf0, 0x17, 0x4a, 0xc4, 0x99, 0x7e, 0x23, 0xc6, 0x9b, 0x7c, 0x21, 0xaf, 0xf2, 0x15, 0x48, 0x14, 0x49, 0xae, 0xf3, 0x7d, 0x20, 0xc7, 0x9a, 0x10, 0x4d, 0xaa, 0xf7, 0x79, 0x24, 0xc3, 0x9e, 0xc2, 0x9f, 0x78, 0x25, 0xab, 0xf6, 0x11, 0x4c, 0xa9, 0xf4, 0x13, 0x4e, 0xc0, 0x9d, 0x7a, 0x27, 0x7b, 0x26, 0xc1, 0x9c, 0x12, 0x4f, 0xa8, 0xf5}, [256]byte{0x0, 0x5e, 0xbc, 0xe2, 0x65, 0x3b, 0xd9, 0x87, 0xca, 0x94, 0x76, 0x28, 0xaf, 0xf1, 0x13, 0x4d, 0x89, 0xd7, 0x35, 0x6b, 0xec, 0xb2, 0x50, 0xe, 0x43, 0x1d, 0xff, 0xa1, 0x26, 0x78, 0x9a, 0xc4, 0xf, 0x51, 0xb3, 0xed, 0x6a, 0x34, 0xd6, 0x88, 0xc5, 0x9b, 0x79, 0x27, 0xa0, 0xfe, 0x1c, 0x42, 0x86, 0xd8, 0x3a, 0x64, 0xe3, 0xbd, 0x5f, 0x1, 0x4c, 0x12, 0xf0, 0xae, 0x29, 0x77, 0x95, 0xcb, 0x1e, 0x40, 0xa2, 0xfc, 0x7b, 0x25, 0xc7, 0x99, 0xd4, 0x8a, 0x68, 0x36, 0xb1, 0xef, 0xd, 0x53, 0x97, 0xc9, 0x2b, 0x75, 0xf2, 0xac, 0x4e, 0x10, 0x5d, 0x3, 0xe1, 0xbf, 0x38, 0x66, 0x84, 0xda, 0x11, 0x4f, 0xad, 0xf3, 0x74, 0x2a, 0xc8, 0x96, 0xdb, 0x85, 0x67, 0x39, 0xbe, 0xe0, 0x2, 0x5c, 0x98, 0xc6, 0x24, 0x7a, 0xfd, 0xa3, 0x41, 0x1f, 0x52, 0xc, 0xee, 0xb0, 0x37, 0x69, 0x8b, 0xd5, 0x3c, 0x62, 0x80, 0xde, 0x59, 0x7, 0xe5, 0xbb, 0xf6, 0xa8, 0x4a, 0x14, 0x93, 0xcd, 0x2f, 0x71, 0xb5, 0xeb, 0x9, 0x57, 0xd0, 0x8e, 0x6c, 0x32, 0x7f, 0x21, 0xc3, 0x9d, 0x1a, 0x44, 0xa6, 0xf8, 0x33, 0x6d, 0x8f, 0xd1, 0x56, 0x8, 0xea, 0xb4, 0xf9, 0xa7, 0x45, 0x1b, 0x9c, 0xc2, 0x20, 0x7e, 0xba, 0xe4, 0x6, 0x58, 0xdf, 0x81, 0x63, 0x3d, 0x70, 0x2e, 0xcc, 0x92, 0x15, 0x4b, 0xa9, 0xf7, 0x22, 0x7c, 0x9e, 0xc0, 0x47, 0x19, 0xfb, 0xa5, 0xe8, 0xb6, 0x54, 0xa, 0x8d, 0xd3, 0x31, 0x6f, 0xab, 0xf5, 0x17, 0x49, 0xce, 0x90, 0x72, 0x2c, 0x61, 0x3f, 0xdd, 0x83, 0x4, 0x5a, 0xb8, 0xe6, 0x2d, 0x73, 0x91, 0xcf, 0x48, 0x16, 0xf4, 0xaa, 0xe7, 0xb9, 0x5b, 0x5, 0x82, 0xdc, 0x3e, 0x60, 0xa4, 0xfa, 0x18, 0x46, 0xc1, 0x9f, 0x7d, 0x23, 0x6e, 0x30, 0xd2, 0x8c, 0xb, 0x55, 0xb7, 0xe9}, [256]byte{0x0, 0x5f, 0xbe, 0xe1, 0x61, 0x3e, 0xdf, 0x80, 0xc2, 0x9d, 0x7c, 0x23, 0xa3, 0xfc, 0x1d, 0x42, 0x99, 0xc6, 0x27, 0x78, 0xf8, 0xa7, 0x46, 0x19, 0x5b, 0x4, 0xe5, 0xba, 0x3a, 0x65, 0x84, 0xdb, 0x2f, 0x70, 0x91, 0xce, 0x4e, 0x11, 0xf0, 0xaf, 0xed, 0xb2, 0x53, 0xc, 0x8c, 0xd3, 0x32, 0x6d, 0xb6, 0xe9, 0x8, 0x57, 0xd7, 0x88, 0x69, 0x36, 0x74, 0x2b, 0xca, 0x95, 0x15, 0x4a, 0xab, 0xf4, 0x5e, 0x1, 0xe0, 0xbf, 0x3f, 0x60, 0x81, 0xde, 0x9c, 0xc3, 0x22, 0x7d, 0xfd, 0xa2, 0x43, 0x1c, 0xc7, 0x98, 0x79, 0x26, 0xa6, 0xf9, 0x18, 0x47, 0x5, 0x5a, 0xbb, 0xe4, 0x64, 0x3b, 0xda, 0x85, 0x71, 0x2e, 0xcf, 0x90, 0x10, 0x4f, 0xae, 0xf1, 0xb3, 0xec, 0xd, 0x52, 0xd2, 0x8d, 0x6c, 0x33, 0xe8, 0xb7, 0x56, 0x9, 0x89, 0xd6, 0x37, 0x68, 0x2a, 0x75, 0x94, 0xcb, 0x4b, 0x14, 0xf5, 0xaa, 0xbc, 0xe3, 0x2, 0x5d, 0xdd, 0x82, 0x63, 0x3c, 0x7e, 0x21, 0xc0, 0x9f, 0x1f, 0x40, 0xa1, 0xfe, 0x25, 0x7a, 0x9b, 0xc4, 0x44, 0x1b, 0xfa, 0xa5, 0xe7, 0xb8, 0x59, 0x6, 0x86, 0xd9, 0x38, 0x67, 0x93, 0xcc, 0x2d, 0x72, 0xf2, 0xad, 0x4c, 0x13, 0x51, 0xe, 0xef, 0xb0, 0x30, 0x6f, 0x8e, 0xd1, 0xa, 0x55, 0xb4, 0xeb, 0x6b, 0x34, 0xd5, 0x8a, 0xc8, 0x97, 0x76, 0x29, 0xa9, 0xf6, 0x17, 0x48, 0xe2, 0xbd, 0x5c, 0x3, 0x83, 0xdc, 0x3d, 0x62, 0x20, 0x7f, 0x9e, 0xc1, 0x41, 0x1e, 0xff, 0xa0, 0x7b, 0x24, 0xc5, 0x9a, 0x1a, 0x45, 0xa4, 0xfb, 0xb9, 0xe6, 0x7, 0x58, 0xd8, 0x87, 0x66, 0x39, 0xcd, 0x92, 0x73, 0x2c, 0xac, 0xf3, 0x12, 0x4d, 0xf, 0x50, 0xb1, 0xee, 0x6e, 0x31, 0xd0, 0x8f, 0x54, 0xb, 0xea, 0xb5, 0x35, 0x6a, 0x8b, 0xd4, 0x96, 0xc9, 0x28, 0x77, 0xf7, 0xa8, 0x49, 0x16}, [256]byte{0x0, 0x60, 0xc0, 0xa0, 0x9d, 0xfd, 0x5d, 0x3d, 0x27, 0x47, 0xe7, 0x87, 0xba, 0xda, 0x7a, 0x1a, 0x4e, 0x2e, 0x8e, 0xee, 0xd3, 0xb3, 0x13, 0x73, 0x69, 0x9, 0xa9, 0xc9, 0xf4, 0x94, 0x34, 0x54, 0x9c, 0xfc, 0x5c, 0x3c, 0x1, 0x61, 0xc1, 0xa1, 0xbb, 0xdb, 0x7b, 0x1b, 0x26, 0x46, 0xe6, 0x86, 0xd2, 0xb2, 0x12, 0x72, 0x4f, 0x2f, 0x8f, 0xef, 0xf5, 0x95, 0x35, 0x55, 0x68, 0x8, 0xa8, 0xc8, 0x25, 0x45, 0xe5, 0x85, 0xb8, 0xd8, 0x78, 0x18, 0x2, 0x62, 0xc2, 0xa2, 0x9f, 0xff, 0x5f, 0x3f, 0x6b, 0xb, 0xab, 0xcb, 0xf6, 0x96, 0x36, 0x56, 0x4c, 0x2c, 0x8c, 0xec, 0xd1, 0xb1, 0x11, 0x71, 0xb9, 0xd9, 0x79, 0x19, 0x24, 0x44, 0xe4, 0x84, 0x9e, 0xfe, 0x5e, 0x3e, 0x3, 0x63, 0xc3, 0xa3, 0xf7, 0x97, 0x37, 0x57, 0x6a, 0xa, 0xaa, 0xca, 0xd0, 0xb0, 0x10, 0x70, 0x4d, 0x2d, 0x8d, 0xed, 0x4a, 0x2a, 0x8a, 0xea, 0xd7, 0xb7, 0x17, 0x77, 0x6d, 0xd, 0xad, 0xcd, 0xf0, 0x90, 0x30, 0x50, 0x4, 0x64, 0xc4, 0xa4, 0x99, 0xf9, 0x59, 0x39, 0x23, 0x43, 0xe3, 0x83, 0xbe, 0xde, 0x7e, 0x1e, 0xd6, 0xb6, 0x16, 0x76, 0x4b, 0x2b, 0x8b, 0xeb, 0xf1, 0x91, 0x31, 0x51, 0x6c, 0xc, 0xac, 0xcc, 0x98, 0xf8, 0x58, 0x38, 0x5, 0x65, 0xc5, 0xa5, 0xbf, 0xdf, 0x7f, 0x1f, 0x22, 0x42, 0xe2, 0x82, 0x6f, 0xf, 0xaf, 0xcf, 0xf2, 0x92, 0x32, 0x52, 0x48, 0x28, 0x88, 0xe8, 0xd5, 0xb5, 0x15, 0x75, 0x21, 0x41, 0xe1, 0x81, 0xbc, 0xdc, 0x7c, 0x1c, 0x6, 0x66, 0xc6, 0xa6, 0x9b, 0xfb, 0x5b, 0x3b, 0xf3, 0x93, 0x33, 0x53, 0x6e, 0xe, 0xae, 0xce, 0xd4, 0xb4, 0x14, 0x74, 0x49, 0x29, 0x89, 0xe9, 0xbd, 0xdd, 0x7d, 0x1d, 0x20, 0x40, 0xe0, 0x80, 0x9a, 0xfa, 0x5a, 0x3a, 0x7, 0x67, 0xc7, 0xa7}, [256]byte{0x0, 0x61, 0xc2, 0xa3, 0x99, 0xf8, 0x5b, 0x3a, 0x2f, 0x4e, 0xed, 0x8c, 0xb6, 0xd7, 0x74, 0x15, 0x5e, 0x3f, 0x9c, 0xfd, 0xc7, 0xa6, 0x5, 0x64, 0x71, 0x10, 0xb3, 0xd2, 0xe8, 0x89, 0x2a, 0x4b, 0xbc, 0xdd, 0x7e, 0x1f, 0x25, 0x44, 0xe7, 0x86, 0x93, 0xf2, 0x51, 0x30, 0xa, 0x6b, 0xc8, 0xa9, 0xe2, 0x83, 0x20, 0x41, 0x7b, 0x1a, 0xb9, 0xd8, 0xcd, 0xac, 0xf, 0x6e, 0x54, 0x35, 0x96, 0xf7, 0x65, 0x4, 0xa7, 0xc6, 0xfc, 0x9d, 0x3e, 0x5f, 0x4a, 0x2b, 0x88, 0xe9, 0xd3, 0xb2, 0x11, 0x70, 0x3b, 0x5a, 0xf9, 0x98, 0xa2, 0xc3, 0x60, 0x1, 0x14, 0x75, 0xd6, 0xb7, 0x8d, 0xec, 0x4f, 0x2e, 0xd9, 0xb8, 0x1b, 0x7a, 0x40, 0x21, 0x82, 0xe3, 0xf6, 0x97, 0x34, 0x55, 0x6f, 0xe, 0xad, 0xcc, 0x87, 0xe6, 0x45, 0x24, 0x1e, 0x7f, 0xdc, 0xbd, 0xa8, 0xc9, 0x6a, 0xb, 0x31, 0x50, 0xf3, 0x92, 0xca, 0xab, 0x8, 0x69, 0x53, 0x32, 0x91, 0xf0, 0xe5, 0x84, 0x27, 0x46, 0x7c, 0x1d, 0xbe, 0xdf, 0x94, 0xf5, 0x56, 0x37, 0xd, 0x6c, 0xcf, 0xae, 0xbb, 0xda, 0x79, 0x18, 0x22, 0x43, 0xe0, 0x81, 0x76, 0x17, 0xb4, 0xd5, 0xef, 0x8e, 0x2d, 0x4c, 0x59, 0x38, 0x9b, 0xfa, 0xc0, 0xa1, 0x2, 0x63, 0x28, 0x49, 0xea, 0x8b, 0xb1, 0xd0, 0x73, 0x12, 0x7, 0x66, 0xc5, 0xa4, 0x9e, 0xff, 0x5c, 0x3d, 0xaf, 0xce, 0x6d, 0xc, 0x36, 0x57, 0xf4, 0x95, 0x80, 0xe1, 0x42, 0x23, 0x19, 0x78, 0xdb, 0xba, 0xf1, 0x90, 0x33, 0x52, 0x68, 0x9, 0xaa, 0xcb, 0xde, 0xbf, 0x1c, 0x7d, 0x47, 0x26, 0x85, 0xe4, 0x13, 0x72, 0xd1, 0xb0, 0x8a, 0xeb, 0x48, 0x29, 0x3c, 0x5d, 0xfe, 0x9f, 0xa5, 0xc4, 0x67, 0x6, 0x4d, 0x2c, 0x8f, 0xee, 0xd4, 0xb5, 0x16, 0x77, 0x62, 0x3, 0xa0, 0xc1, 0xfb, 0x9a, 0x39, 0x58}, [256]byte{0x0, 0x62, 0xc4, 0xa6, 0x95, 0xf7, 0x51, 0x33, 0x37, 0x55, 0xf3, 0x91, 0xa2, 0xc0, 0x66, 0x4, 0x6e, 0xc, 0xaa, 0xc8, 0xfb, 0x99, 0x3f, 0x5d, 0x59, 0x3b, 0x9d, 0xff, 0xcc, 0xae, 0x8, 0x6a, 0xdc, 0xbe, 0x18, 0x7a, 0x49, 0x2b, 0x8d, 0xef, 0xeb, 0x89, 0x2f, 0x4d, 0x7e, 0x1c, 0xba, 0xd8, 0xb2, 0xd0, 0x76, 0x14, 0x27, 0x45, 0xe3, 0x81, 0x85, 0xe7, 0x41, 0x23, 0x10, 0x72, 0xd4, 0xb6, 0xa5, 0xc7, 0x61, 0x3, 0x30, 0x52, 0xf4, 0x96, 0x92, 0xf0, 0x56, 0x34, 0x7, 0x65, 0xc3, 0xa1, 0xcb, 0xa9, 0xf, 0x6d, 0x5e, 0x3c, 0x9a, 0xf8, 0xfc, 0x9e, 0x38, 0x5a, 0x69, 0xb, 0xad, 0xcf, 0x79, 0x1b, 0xbd, 0xdf, 0xec, 0x8e, 0x28, 0x4a, 0x4e, 0x2c, 0x8a, 0xe8, 0xdb, 0xb9, 0x1f, 0x7d, 0x17, 0x75, 0xd3, 0xb1, 0x82, 0xe0, 0x46, 0x24, 0x20, 0x42, 0xe4, 0x86, 0xb5, 0xd7, 0x71, 0x13, 0x57, 0x35, 0x93, 0xf1, 0xc2, 0xa0, 0x6, 0x64, 0x60, 0x2, 0xa4, 0xc6, 0xf5, 0x97, 0x31, 0x53, 0x39, 0x5b, 0xfd, 0x9f, 0xac, 0xce, 0x68, 0xa, 0xe, 0x6c, 0xca, 0xa8, 0x9b, 0xf9, 0x5f, 0x3d, 0x8b, 0xe9, 0x4f, 0x2d, 0x1e, 0x7c, 0xda, 0xb8, 0xbc, 0xde, 0x78, 0x1a, 0x29, 0x4b, 0xed, 0x8f, 0xe5, 0x87, 0x21, 0x43, 0x70, 0x12, 0xb4, 0xd6, 0xd2, 0xb0, 0x16, 0x74, 0x47, 0x25, 0x83, 0xe1, 0xf2, 0x90, 0x36, 0x54, 0x67, 0x5, 0xa3, 0xc1, 0xc5, 0xa7, 0x1, 0x63, 0x50, 0x32, 0x94, 0xf6, 0x9c, 0xfe, 0x58, 0x3a, 0x9, 0x6b, 0xcd, 0xaf, 0xab, 0xc9, 0x6f, 0xd, 0x3e, 0x5c, 0xfa, 0x98, 0x2e, 0x4c, 0xea, 0x88, 0xbb, 0xd9, 0x7f, 0x1d, 0x19, 0x7b, 0xdd, 0xbf, 0x8c, 0xee, 0x48, 0x2a, 0x40, 0x22, 0x84, 0xe6, 0xd5, 0xb7, 0x11, 0x73, 0x77, 0x15, 0xb3, 0xd1, 0xe2, 0x80, 0x26, 0x44}, [256]byte{0x0, 0x63, 0xc6, 0xa5, 0x91, 0xf2, 0x57, 0x34, 0x3f, 0x5c, 0xf9, 0x9a, 0xae, 0xcd, 0x68, 0xb, 0x7e, 0x1d, 0xb8, 0xdb, 0xef, 0x8c, 0x29, 0x4a, 0x41, 0x22, 0x87, 0xe4, 0xd0, 0xb3, 0x16, 0x75, 0xfc, 0x9f, 0x3a, 0x59, 0x6d, 0xe, 0xab, 0xc8, 0xc3, 0xa0, 0x5, 0x66, 0x52, 0x31, 0x94, 0xf7, 0x82, 0xe1, 0x44, 0x27, 0x13, 0x70, 0xd5, 0xb6, 0xbd, 0xde, 0x7b, 0x18, 0x2c, 0x4f, 0xea, 0x89, 0xe5, 0x86, 0x23, 0x40, 0x74, 0x17, 0xb2, 0xd1, 0xda, 0xb9, 0x1c, 0x7f, 0x4b, 0x28, 0x8d, 0xee, 0x9b, 0xf8, 0x5d, 0x3e, 0xa, 0x69, 0xcc, 0xaf, 0xa4, 0xc7, 0x62, 0x1, 0x35, 0x56, 0xf3, 0x90, 0x19, 0x7a, 0xdf, 0xbc, 0x88, 0xeb, 0x4e, 0x2d, 0x26, 0x45, 0xe0, 0x83, 0xb7, 0xd4, 0x71, 0x12, 0x67, 0x4, 0xa1, 0xc2, 0xf6, 0x95, 0x30, 0x53, 0x58, 0x3b, 0x9e, 0xfd, 0xc9, 0xaa, 0xf, 0x6c, 0xd7, 0xb4, 0x11, 0x72, 0x46, 0x25, 0x80, 0xe3, 0xe8, 0x8b, 0x2e, 0x4d, 0x79, 0x1a, 0xbf, 0xdc, 0xa9, 0xca, 0x6f, 0xc, 0x38, 0x5b, 0xfe, 0x9d, 0x96, 0xf5, 0x50, 0x33, 0x7, 0x64, 0xc1, 0xa2, 0x2b, 0x48, 0xed, 0x8e, 0xba, 0xd9, 0x7c, 0x1f, 0x14, 0x77, 0xd2, 0xb1, 0x85, 0xe6, 0x43, 0x20, 0x55, 0x36, 0x93, 0xf0, 0xc4, 0xa7, 0x2, 0x61, 0x6a, 0x9, 0xac, 0xcf, 0xfb, 0x98, 0x3d, 0x5e, 0x32, 0x51, 0xf4, 0x97, 0xa3, 0xc0, 0x65, 0x6, 0xd, 0x6e, 0xcb, 0xa8, 0x9c, 0xff, 0x5a, 0x39, 0x4c, 0x2f, 0x8a, 0xe9, 0xdd, 0xbe, 0x1b, 0x78, 0x73, 0x10, 0xb5, 0xd6, 0xe2, 0x81, 0x24, 0x47, 0xce, 0xad, 0x8, 0x6b, 0x5f, 0x3c, 0x99, 0xfa, 0xf1, 0x92, 0x37, 0x54, 0x60, 0x3, 0xa6, 0xc5, 0xb0, 0xd3, 0x76, 0x15, 0x21, 0x42, 0xe7, 0x84, 0x8f, 0xec, 0x49, 0x2a, 0x1e, 0x7d, 0xd8, 0xbb}, [256]byte{0x0, 0x64, 0xc8, 0xac, 0x8d, 0xe9, 0x45, 0x21, 0x7, 0x63, 0xcf, 0xab, 0x8a, 0xee, 0x42, 0x26, 0xe, 0x6a, 0xc6, 0xa2, 0x83, 0xe7, 0x4b, 0x2f, 0x9, 0x6d, 0xc1, 0xa5, 0x84, 0xe0, 0x4c, 0x28, 0x1c, 0x78, 0xd4, 0xb0, 0x91, 0xf5, 0x59, 0x3d, 0x1b, 0x7f, 0xd3, 0xb7, 0x96, 0xf2, 0x5e, 0x3a, 0x12, 0x76, 0xda, 0xbe, 0x9f, 0xfb, 0x57, 0x33, 0x15, 0x71, 0xdd, 0xb9, 0x98, 0xfc, 0x50, 0x34, 0x38, 0x5c, 0xf0, 0x94, 0xb5, 0xd1, 0x7d, 0x19, 0x3f, 0x5b, 0xf7, 0x93, 0xb2, 0xd6, 0x7a, 0x1e, 0x36, 0x52, 0xfe, 0x9a, 0xbb, 0xdf, 0x73, 0x17, 0x31, 0x55, 0xf9, 0x9d, 0xbc, 0xd8, 0x74, 0x10, 0x24, 0x40, 0xec, 0x88, 0xa9, 0xcd, 0x61, 0x5, 0x23, 0x47, 0xeb, 0x8f, 0xae, 0xca, 0x66, 0x2, 0x2a, 0x4e, 0xe2, 0x86, 0xa7, 0xc3, 0x6f, 0xb, 0x2d, 0x49, 0xe5, 0x81, 0xa0, 0xc4, 0x68, 0xc, 0x70, 0x14, 0xb8, 0xdc, 0xfd, 0x99, 0x35, 0x51, 0x77, 0x13, 0xbf, 0xdb, 0xfa, 0x9e, 0x32, 0x56, 0x7e, 0x1a, 0xb6, 0xd2, 0xf3, 0x97, 0x3b, 0x5f, 0x79, 0x1d, 0xb1, 0xd5, 0xf4, 0x90, 0x3c, 0x58, 0x6c, 0x8, 0xa4, 0xc0, 0xe1, 0x85, 0x29, 0x4d, 0x6b, 0xf, 0xa3, 0xc7, 0xe6, 0x82, 0x2e, 0x4a, 0x62, 0x6, 0xaa, 0xce, 0xef, 0x8b, 0x27, 0x43, 0x65, 0x1, 0xad, 0xc9, 0xe8, 0x8c, 0x20, 0x44, 0x48, 0x2c, 0x80, 0xe4, 0xc5, 0xa1, 0xd, 0x69, 0x4f, 0x2b, 0x87, 0xe3, 0xc2, 0xa6, 0xa, 0x6e, 0x46, 0x22, 0x8e, 0xea, 0xcb, 0xaf, 0x3, 0x67, 0x41, 0x25, 0x89, 0xed, 0xcc, 0xa8, 0x4, 0x60, 0x54, 0x30, 0x9c, 0xf8, 0xd9, 0xbd, 0x11, 0x75, 0x53, 0x37, 0x9b, 0xff, 0xde, 0xba, 0x16, 0x72, 0x5a, 0x3e, 0x92, 0xf6, 0xd7, 0xb3, 0x1f, 0x7b, 0x5d, 0x39, 0x95, 0xf1, 0xd0, 0xb4, 0x18, 0x7c}, [256]byte{0x0, 0x65, 0xca, 0xaf, 0x89, 0xec, 0x43, 0x26, 0xf, 0x6a, 0xc5, 0xa0, 0x86, 0xe3, 0x4c, 0x29, 0x1e, 0x7b, 0xd4, 0xb1, 0x97, 0xf2, 0x5d, 0x38, 0x11, 0x74, 0xdb, 0xbe, 0x98, 0xfd, 0x52, 0x37, 0x3c, 0x59, 0xf6, 0x93, 0xb5, 0xd0, 0x7f, 0x1a, 0x33, 0x56, 0xf9, 0x9c, 0xba, 0xdf, 0x70, 0x15, 0x22, 0x47, 0xe8, 0x8d, 0xab, 0xce, 0x61, 0x4, 0x2d, 0x48, 0xe7, 0x82, 0xa4, 0xc1, 0x6e, 0xb, 0x78, 0x1d, 0xb2, 0xd7, 0xf1, 0x94, 0x3b, 0x5e, 0x77, 0x12, 0xbd, 0xd8, 0xfe, 0x9b, 0x34, 0x51, 0x66, 0x3, 0xac, 0xc9, 0xef, 0x8a, 0x25, 0x40, 0x69, 0xc, 0xa3, 0xc6, 0xe0, 0x85, 0x2a, 0x4f, 0x44, 0x21, 0x8e, 0xeb, 0xcd, 0xa8, 0x7, 0x62, 0x4b, 0x2e, 0x81, 0xe4, 0xc2, 0xa7, 0x8, 0x6d, 0x5a, 0x3f, 0x90, 0xf5, 0xd3, 0xb6, 0x19, 0x7c, 0x55, 0x30, 0x9f, 0xfa, 0xdc, 0xb9, 0x16, 0x73, 0xf0, 0x95, 0x3a, 0x5f, 0x79, 0x1c, 0xb3, 0xd6, 0xff, 0x9a, 0x35, 0x50, 0x76, 0x13, 0xbc, 0xd9, 0xee, 0x8b, 0x24, 0x41, 0x67, 0x2, 0xad, 0xc8, 0xe1, 0x84, 0x2b, 0x4e, 0x68, 0xd, 0xa2, 0xc7, 0xcc, 0xa9, 0x6, 0x63, 0x45, 0x20, 0x8f, 0xea, 0xc3, 0xa6, 0x9, 0x6c, 0x4a, 0x2f, 0x80, 0xe5, 0xd2, 0xb7, 0x18, 0x7d, 0x5b, 0x3e, 0x91, 0xf4, 0xdd, 0xb8, 0x17, 0x72, 0x54, 0x31, 0x9e, 0xfb, 0x88, 0xed, 0x42, 0x27, 0x1, 0x64, 0xcb, 0xae, 0x87, 0xe2, 0x4d, 0x28, 0xe, 0x6b, 0xc4, 0xa1, 0x96, 0xf3, 0x5c, 0x39, 0x1f, 0x7a, 0xd5, 0xb0, 0x99, 0xfc, 0x53, 0x36, 0x10, 0x75, 0xda, 0xbf, 0xb4, 0xd1, 0x7e, 0x1b, 0x3d, 0x58, 0xf7, 0x92, 0xbb, 0xde, 0x71, 0x14, 0x32, 0x57, 0xf8, 0x9d, 0xaa, 0xcf, 0x60, 0x5, 0x23, 0x46, 0xe9, 0x8c, 0xa5, 0xc0, 0x6f, 0xa, 0x2c, 0x49, 0xe6, 0x83}, [256]byte{0x0, 0x66, 0xcc, 0xaa, 0x85, 0xe3, 0x49, 0x2f, 0x17, 0x71, 0xdb, 0xbd, 0x92, 0xf4, 0x5e, 0x38, 0x2e, 0x48, 0xe2, 0x84, 0xab, 0xcd, 0x67, 0x1, 0x39, 0x5f, 0xf5, 0x93, 0xbc, 0xda, 0x70, 0x16, 0x5c, 0x3a, 0x90, 0xf6, 0xd9, 0xbf, 0x15, 0x73, 0x4b, 0x2d, 0x87, 0xe1, 0xce, 0xa8, 0x2, 0x64, 0x72, 0x14, 0xbe, 0xd8, 0xf7, 0x91, 0x3b, 0x5d, 0x65, 0x3, 0xa9, 0xcf, 0xe0, 0x86, 0x2c, 0x4a, 0xb8, 0xde, 0x74, 0x12, 0x3d, 0x5b, 0xf1, 0x97, 0xaf, 0xc9, 0x63, 0x5, 0x2a, 0x4c, 0xe6, 0x80, 0x96, 0xf0, 0x5a, 0x3c, 0x13, 0x75, 0xdf, 0xb9, 0x81, 0xe7, 0x4d, 0x2b, 0x4, 0x62, 0xc8, 0xae, 0xe4, 0x82, 0x28, 0x4e, 0x61, 0x7, 0xad, 0xcb, 0xf3, 0x95, 0x3f, 0x59, 0x76, 0x10, 0xba, 0xdc, 0xca, 0xac, 0x6, 0x60, 0x4f, 0x29, 0x83, 0xe5, 0xdd, 0xbb, 0x11, 0x77, 0x58, 0x3e, 0x94, 0xf2, 0x6d, 0xb, 0xa1, 0xc7, 0xe8, 0x8e, 0x24, 0x42, 0x7a, 0x1c, 0xb6, 0xd0, 0xff, 0x99, 0x33, 0x55, 0x43, 0x25, 0x8f, 0xe9, 0xc6, 0xa0, 0xa, 0x6c, 0x54, 0x32, 0x98, 0xfe, 0xd1, 0xb7, 0x1d, 0x7b, 0x31, 0x57, 0xfd, 0x9b, 0xb4, 0xd2, 0x78, 0x1e, 0x26, 0x40, 0xea, 0x8c, 0xa3, 0xc5, 0x6f, 0x9, 0x1f, 0x79, 0xd3, 0xb5, 0x9a, 0xfc, 0x56, 0x30, 0x8, 0x6e, 0xc4, 0xa2, 0x8d, 0xeb, 0x41, 0x27, 0xd5, 0xb3, 0x19, 0x7f, 0x50, 0x36, 0x9c, 0xfa, 0xc2, 0xa4, 0xe, 0x68, 0x47, 0x21, 0x8b, 0xed, 0xfb, 0x9d, 0x37, 0x51, 0x7e, 0x18, 0xb2, 0xd4, 0xec, 0x8a, 0x20, 0x46, 0x69, 0xf, 0xa5, 0xc3, 0x89, 0xef, 0x45, 0x23, 0xc, 0x6a, 0xc0, 0xa6, 0x9e, 0xf8, 0x52, 0x34, 0x1b, 0x7d, 0xd7, 0xb1, 0xa7, 0xc1, 0x6b, 0xd, 0x22, 0x44, 0xee, 0x88, 0xb0, 0xd6, 0x7c, 0x1a, 0x35, 0x53, 0xf9, 0x9f}, [256]byte{0x0, 0x67, 0xce, 0xa9, 0x81, 0xe6, 0x4f, 0x28, 0x1f, 0x78, 0xd1, 0xb6, 0x9e, 0xf9, 0x50, 0x37, 0x3e, 0x59, 0xf0, 0x97, 0xbf, 0xd8, 0x71, 0x16, 0x21, 0x46, 0xef, 0x88, 0xa0, 0xc7, 0x6e, 0x9, 0x7c, 0x1b, 0xb2, 0xd5, 0xfd, 0x9a, 0x33, 0x54, 0x63, 0x4, 0xad, 0xca, 0xe2, 0x85, 0x2c, 0x4b, 0x42, 0x25, 0x8c, 0xeb, 0xc3, 0xa4, 0xd, 0x6a, 0x5d, 0x3a, 0x93, 0xf4, 0xdc, 0xbb, 0x12, 0x75, 0xf8, 0x9f, 0x36, 0x51, 0x79, 0x1e, 0xb7, 0xd0, 0xe7, 0x80, 0x29, 0x4e, 0x66, 0x1, 0xa8, 0xcf, 0xc6, 0xa1, 0x8, 0x6f, 0x47, 0x20, 0x89, 0xee, 0xd9, 0xbe, 0x17, 0x70, 0x58, 0x3f, 0x96, 0xf1, 0x84, 0xe3, 0x4a, 0x2d, 0x5, 0x62, 0xcb, 0xac, 0x9b, 0xfc, 0x55, 0x32, 0x1a, 0x7d, 0xd4, 0xb3, 0xba, 0xdd, 0x74, 0x13, 0x3b, 0x5c, 0xf5, 0x92, 0xa5, 0xc2, 0x6b, 0xc, 0x24, 0x43, 0xea, 0x8d, 0xed, 0x8a, 0x23, 0x44, 0x6c, 0xb, 0xa2, 0xc5, 0xf2, 0x95, 0x3c, 0x5b, 0x73, 0x14, 0xbd, 0xda, 0xd3, 0xb4, 0x1d, 0x7a, 0x52, 0x35, 0x9c, 0xfb, 0xcc, 0xab, 0x2, 0x65, 0x4d, 0x2a, 0x83, 0xe4, 0x91, 0xf6, 0x5f, 0x38, 0x10, 0x77, 0xde, 0xb9, 0x8e, 0xe9, 0x40, 0x27, 0xf, 0x68, 0xc1, 0xa6, 0xaf, 0xc8, 0x61, 0x6, 0x2e, 0x49, 0xe0, 0x87, 0xb0, 0xd7, 0x7e, 0x19, 0x31, 0x56, 0xff, 0x98, 0x15, 0x72, 0xdb, 0xbc, 0x94, 0xf3, 0x5a, 0x3d, 0xa, 0x6d, 0xc4, 0xa3, 0x8b, 0xec, 0x45, 0x22, 0x2b, 0x4c, 0xe5, 0x82, 0xaa, 0xcd, 0x64, 0x3, 0x34, 0x53, 0xfa, 0x9d, 0xb5, 0xd2, 0x7b, 0x1c, 0x69, 0xe, 0xa7, 0xc0, 0xe8, 0x8f, 0x26, 0x41, 0x76, 0x11, 0xb8, 0xdf, 0xf7, 0x90, 0x39, 0x5e, 0x57, 0x30, 0x99, 0xfe, 0xd6, 0xb1, 0x18, 0x7f, 0x48, 0x2f, 0x86, 0xe1, 0xc9, 0xae, 0x7, 0x60}, [256]byte{0x0, 0x68, 0xd0, 0xb8, 0xbd, 0xd5, 0x6d, 0x5, 0x67, 0xf, 0xb7, 0xdf, 0xda, 0xb2, 0xa, 0x62, 0xce, 0xa6, 0x1e, 0x76, 0x73, 0x1b, 0xa3, 0xcb, 0xa9, 0xc1, 0x79, 0x11, 0x14, 0x7c, 0xc4, 0xac, 0x81, 0xe9, 0x51, 0x39, 0x3c, 0x54, 0xec, 0x84, 0xe6, 0x8e, 0x36, 0x5e, 0x5b, 0x33, 0x8b, 0xe3, 0x4f, 0x27, 0x9f, 0xf7, 0xf2, 0x9a, 0x22, 0x4a, 0x28, 0x40, 0xf8, 0x90, 0x95, 0xfd, 0x45, 0x2d, 0x1f, 0x77, 0xcf, 0xa7, 0xa2, 0xca, 0x72, 0x1a, 0x78, 0x10, 0xa8, 0xc0, 0xc5, 0xad, 0x15, 0x7d, 0xd1, 0xb9, 0x1, 0x69, 0x6c, 0x4, 0xbc, 0xd4, 0xb6, 0xde, 0x66, 0xe, 0xb, 0x63, 0xdb, 0xb3, 0x9e, 0xf6, 0x4e, 0x26, 0x23, 0x4b, 0xf3, 0x9b, 0xf9, 0x91, 0x29, 0x41, 0x44, 0x2c, 0x94, 0xfc, 0x50, 0x38, 0x80, 0xe8, 0xed, 0x85, 0x3d, 0x55, 0x37, 0x5f, 0xe7, 0x8f, 0x8a, 0xe2, 0x5a, 0x32, 0x3e, 0x56, 0xee, 0x86, 0x83, 0xeb, 0x53, 0x3b, 0x59, 0x31, 0x89, 0xe1, 0xe4, 0x8c, 0x34, 0x5c, 0xf0, 0x98, 0x20, 0x48, 0x4d, 0x25, 0x9d, 0xf5, 0x97, 0xff, 0x47, 0x2f, 0x2a, 0x42, 0xfa, 0x92, 0xbf, 0xd7, 0x6f, 0x7, 0x2, 0x6a, 0xd2, 0xba, 0xd8, 0xb0, 0x8, 0x60, 0x65, 0xd, 0xb5, 0xdd, 0x71, 0x19, 0xa1, 0xc9, 0xcc, 0xa4, 0x1c, 0x74, 0x16, 0x7e, 0xc6, 0xae, 0xab, 0xc3, 0x7b, 0x13, 0x21, 0x49, 0xf1, 0x99, 0x9c, 0xf4, 0x4c, 0x24, 0x46, 0x2e, 0x96, 0xfe, 0xfb, 0x93, 0x2b, 0x43, 0xef, 0x87, 0x3f, 0x57, 0x52, 0x3a, 0x82, 0xea, 0x88, 0xe0, 0x58, 0x30, 0x35, 0x5d, 0xe5, 0x8d, 0xa0, 0xc8, 0x70, 0x18, 0x1d, 0x75, 0xcd, 0xa5, 0xc7, 0xaf, 0x17, 0x7f, 0x7a, 0x12, 0xaa, 0xc2, 0x6e, 0x6, 0xbe, 0xd6, 0xd3, 0xbb, 0x3, 0x6b, 0x9, 0x61, 0xd9, 0xb1, 0xb4, 0xdc, 0x64, 0xc}, [256]byte{0x0, 0x69, 0xd2, 0xbb, 0xb9, 0xd0, 0x6b, 0x2, 0x6f, 0x6, 0xbd, 0xd4, 0xd6, 0xbf, 0x4, 0x6d, 0xde, 0xb7, 0xc, 0x65, 0x67, 0xe, 0xb5, 0xdc, 0xb1, 0xd8, 0x63, 0xa, 0x8, 0x61, 0xda, 0xb3, 0xa1, 0xc8, 0x73, 0x1a, 0x18, 0x71, 0xca, 0xa3, 0xce, 0xa7, 0x1c, 0x75, 0x77, 0x1e, 0xa5, 0xcc, 0x7f, 0x16, 0xad, 0xc4, 0xc6, 0xaf, 0x14, 0x7d, 0x10, 0x79, 0xc2, 0xab, 0xa9, 0xc0, 0x7b, 0x12, 0x5f, 0x36, 0x8d, 0xe4, 0xe6, 0x8f, 0x34, 0x5d, 0x30, 0x59, 0xe2, 0x8b, 0x89, 0xe0, 0x5b, 0x32, 0x81, 0xe8, 0x53, 0x3a, 0x38, 0x51, 0xea, 0x83, 0xee, 0x87, 0x3c, 0x55, 0x57, 0x3e, 0x85, 0xec, 0xfe, 0x97, 0x2c, 0x45, 0x47, 0x2e, 0x95, 0xfc, 0x91, 0xf8, 0x43, 0x2a, 0x28, 0x41, 0xfa, 0x93, 0x20, 0x49, 0xf2, 0x9b, 0x99, 0xf0, 0x4b, 0x22, 0x4f, 0x26, 0x9d, 0xf4, 0xf6, 0x9f, 0x24, 0x4d, 0xbe, 0xd7, 0x6c, 0x5, 0x7, 0x6e, 0xd5, 0xbc, 0xd1, 0xb8, 0x3, 0x6a, 0x68, 0x1, 0xba, 0xd3, 0x60, 0x9, 0xb2, 0xdb, 0xd9, 0xb0, 0xb, 0x62, 0xf, 0x66, 0xdd, 0xb4, 0xb6, 0xdf, 0x64, 0xd, 0x1f, 0x76, 0xcd, 0xa4, 0xa6, 0xcf, 0x74, 0x1d, 0x70, 0x19, 0xa2, 0xcb, 0xc9, 0xa0, 0x1b, 0x72, 0xc1, 0xa8, 0x13, 0x7a, 0x78, 0x11, 0xaa, 0xc3, 0xae, 0xc7, 0x7c, 0x15, 0x17, 0x7e, 0xc5, 0xac, 0xe1, 0x88, 0x33, 0x5a, 0x58, 0x31, 0x8a, 0xe3, 0x8e, 0xe7, 0x5c, 0x35, 0x37, 0x5e, 0xe5, 0x8c, 0x3f, 0x56, 0xed, 0x84, 0x86, 0xef, 0x54, 0x3d, 0x50, 0x39, 0x82, 0xeb, 0xe9, 0x80, 0x3b, 0x52, 0x40, 0x29, 0x92, 0xfb, 0xf9, 0x90, 0x2b, 0x42, 0x2f, 0x46, 0xfd, 0x94, 0x96, 0xff, 0x44, 0x2d, 0x9e, 0xf7, 0x4c, 0x25, 0x27, 0x4e, 0xf5, 0x9c, 0xf1, 0x98, 0x23, 0x4a, 0x48, 0x21, 0x9a, 0xf3}, [256]byte{0x0, 0x6a, 0xd4, 0xbe, 0xb5, 0xdf, 0x61, 0xb, 0x77, 0x1d, 0xa3, 0xc9, 0xc2, 0xa8, 0x16, 0x7c, 0xee, 0x84, 0x3a, 0x50, 0x5b, 0x31, 0x8f, 0xe5, 0x99, 0xf3, 0x4d, 0x27, 0x2c, 0x46, 0xf8, 0x92, 0xc1, 0xab, 0x15, 0x7f, 0x74, 0x1e, 0xa0, 0xca, 0xb6, 0xdc, 0x62, 0x8, 0x3, 0x69, 0xd7, 0xbd, 0x2f, 0x45, 0xfb, 0x91, 0x9a, 0xf0, 0x4e, 0x24, 0x58, 0x32, 0x8c, 0xe6, 0xed, 0x87, 0x39, 0x53, 0x9f, 0xf5, 0x4b, 0x21, 0x2a, 0x40, 0xfe, 0x94, 0xe8, 0x82, 0x3c, 0x56, 0x5d, 0x37, 0x89, 0xe3, 0x71, 0x1b, 0xa5, 0xcf, 0xc4, 0xae, 0x10, 0x7a, 0x6, 0x6c, 0xd2, 0xb8, 0xb3, 0xd9, 0x67, 0xd, 0x5e, 0x34, 0x8a, 0xe0, 0xeb, 0x81, 0x3f, 0x55, 0x29, 0x43, 0xfd, 0x97, 0x9c, 0xf6, 0x48, 0x22, 0xb0, 0xda, 0x64, 0xe, 0x5, 0x6f, 0xd1, 0xbb, 0xc7, 0xad, 0x13, 0x79, 0x72, 0x18, 0xa6, 0xcc, 0x23, 0x49, 0xf7, 0x9d, 0x96, 0xfc, 0x42, 0x28, 0x54, 0x3e, 0x80, 0xea, 0xe1, 0x8b, 0x35, 0x5f, 0xcd, 0xa7, 0x19, 0x73, 0x78, 0x12, 0xac, 0xc6, 0xba, 0xd0, 0x6e, 0x4, 0xf, 0x65, 0xdb, 0xb1, 0xe2, 0x88, 0x36, 0x5c, 0x57, 0x3d, 0x83, 0xe9, 0x95, 0xff, 0x41, 0x2b, 0x20, 0x4a, 0xf4, 0x9e, 0xc, 0x66, 0xd8, 0xb2, 0xb9, 0xd3, 0x6d, 0x7, 0x7b, 0x11, 0xaf, 0xc5, 0xce, 0xa4, 0x1a, 0x70, 0xbc, 0xd6, 0x68, 0x2, 0x9, 0x63, 0xdd, 0xb7, 0xcb, 0xa1, 0x1f, 0x75, 0x7e, 0x14, 0xaa, 0xc0, 0x52, 0x38, 0x86, 0xec, 0xe7, 0x8d, 0x33, 0x59, 0x25, 0x4f, 0xf1, 0x9b, 0x90, 0xfa, 0x44, 0x2e, 0x7d, 0x17, 0xa9, 0xc3, 0xc8, 0xa2, 0x1c, 0x76, 0xa, 0x60, 0xde, 0xb4, 0xbf, 0xd5, 0x6b, 0x1, 0x93, 0xf9, 0x47, 0x2d, 0x26, 0x4c, 0xf2, 0x98, 0xe4, 0x8e, 0x30, 0x5a, 0x51, 0x3b, 0x85, 0xef}, [256]byte{0x0, 0x6b, 0xd6, 0xbd, 0xb1, 0xda, 0x67, 0xc, 0x7f, 0x14, 0xa9, 0xc2, 0xce, 0xa5, 0x18, 0x73, 0xfe, 0x95, 0x28, 0x43, 0x4f, 0x24, 0x99, 0xf2, 0x81, 0xea, 0x57, 0x3c, 0x30, 0x5b, 0xe6, 0x8d, 0xe1, 0x8a, 0x37, 0x5c, 0x50, 0x3b, 0x86, 0xed, 0x9e, 0xf5, 0x48, 0x23, 0x2f, 0x44, 0xf9, 0x92, 0x1f, 0x74, 0xc9, 0xa2, 0xae, 0xc5, 0x78, 0x13, 0x60, 0xb, 0xb6, 0xdd, 0xd1, 0xba, 0x7, 0x6c, 0xdf, 0xb4, 0x9, 0x62, 0x6e, 0x5, 0xb8, 0xd3, 0xa0, 0xcb, 0x76, 0x1d, 0x11, 0x7a, 0xc7, 0xac, 0x21, 0x4a, 0xf7, 0x9c, 0x90, 0xfb, 0x46, 0x2d, 0x5e, 0x35, 0x88, 0xe3, 0xef, 0x84, 0x39, 0x52, 0x3e, 0x55, 0xe8, 0x83, 0x8f, 0xe4, 0x59, 0x32, 0x41, 0x2a, 0x97, 0xfc, 0xf0, 0x9b, 0x26, 0x4d, 0xc0, 0xab, 0x16, 0x7d, 0x71, 0x1a, 0xa7, 0xcc, 0xbf, 0xd4, 0x69, 0x2, 0xe, 0x65, 0xd8, 0xb3, 0xa3, 0xc8, 0x75, 0x1e, 0x12, 0x79, 0xc4, 0xaf, 0xdc, 0xb7, 0xa, 0x61, 0x6d, 0x6, 0xbb, 0xd0, 0x5d, 0x36, 0x8b, 0xe0, 0xec, 0x87, 0x3a, 0x51, 0x22, 0x49, 0xf4, 0x9f, 0x93, 0xf8, 0x45, 0x2e, 0x42, 0x29, 0x94, 0xff, 0xf3, 0x98, 0x25, 0x4e, 0x3d, 0x56, 0xeb, 0x80, 0x8c, 0xe7, 0x5a, 0x31, 0xbc, 0xd7, 0x6a, 0x1, 0xd, 0x66, 0xdb, 0xb0, 0xc3, 0xa8, 0x15, 0x7e, 0x72, 0x19, 0xa4, 0xcf, 0x7c, 0x17, 0xaa, 0xc1, 0xcd, 0xa6, 0x1b, 0x70, 0x3, 0x68, 0xd5, 0xbe, 0xb2, 0xd9, 0x64, 0xf, 0x82, 0xe9, 0x54, 0x3f, 0x33, 0x58, 0xe5, 0x8e, 0xfd, 0x96, 0x2b, 0x40, 0x4c, 0x27, 0x9a, 0xf1, 0x9d, 0xf6, 0x4b, 0x20, 0x2c, 0x47, 0xfa, 0x91, 0xe2, 0x89, 0x34, 0x5f, 0x53, 0x38, 0x85, 0xee, 0x63, 0x8, 0xb5, 0xde, 0xd2, 0xb9, 0x4, 0x6f, 0x1c, 0x77, 0xca, 0xa1, 0xad, 0xc6, 0x7b, 0x10}, [256]byte{0x0, 0x6c, 0xd8, 0xb4, 0xad, 0xc1, 0x75, 0x19, 0x47, 0x2b, 0x9f, 0xf3, 0xea, 0x86, 0x32, 0x5e, 0x8e, 0xe2, 0x56, 0x3a, 0x23, 0x4f, 0xfb, 0x97, 0xc9, 0xa5, 0x11, 0x7d, 0x64, 0x8, 0xbc, 0xd0, 0x1, 0x6d, 0xd9, 0xb5, 0xac, 0xc0, 0x74, 0x18, 0x46, 0x2a, 0x9e, 0xf2, 0xeb, 0x87, 0x33, 0x5f, 0x8f, 0xe3, 0x57, 0x3b, 0x22, 0x4e, 0xfa, 0x96, 0xc8, 0xa4, 0x10, 0x7c, 0x65, 0x9, 0xbd, 0xd1, 0x2, 0x6e, 0xda, 0xb6, 0xaf, 0xc3, 0x77, 0x1b, 0x45, 0x29, 0x9d, 0xf1, 0xe8, 0x84, 0x30, 0x5c, 0x8c, 0xe0, 0x54, 0x38, 0x21, 0x4d, 0xf9, 0x95, 0xcb, 0xa7, 0x13, 0x7f, 0x66, 0xa, 0xbe, 0xd2, 0x3, 0x6f, 0xdb, 0xb7, 0xae, 0xc2, 0x76, 0x1a, 0x44, 0x28, 0x9c, 0xf0, 0xe9, 0x85, 0x31, 0x5d, 0x8d, 0xe1, 0x55, 0x39, 0x20, 0x4c, 0xf8, 0x94, 0xca, 0xa6, 0x12, 0x7e, 0x67, 0xb, 0xbf, 0xd3, 0x4, 0x68, 0xdc, 0xb0, 0xa9, 0xc5, 0x71, 0x1d, 0x43, 0x2f, 0x9b, 0xf7, 0xee, 0x82, 0x36, 0x5a, 0x8a, 0xe6, 0x52, 0x3e, 0x27, 0x4b, 0xff, 0x93, 0xcd, 0xa1, 0x15, 0x79, 0x60, 0xc, 0xb8, 0xd4, 0x5, 0x69, 0xdd, 0xb1, 0xa8, 0xc4, 0x70, 0x1c, 0x42, 0x2e, 0x9a, 0xf6, 0xef, 0x83, 0x37, 0x5b, 0x8b, 0xe7, 0x53, 0x3f, 0x26, 0x4a, 0xfe, 0x92, 0xcc, 0xa0, 0x14, 0x78, 0x61, 0xd, 0xb9, 0xd5, 0x6, 0x6a, 0xde, 0xb2, 0xab, 0xc7, 0x73, 0x1f, 0x41, 0x2d, 0x99, 0xf5, 0xec, 0x80, 0x34, 0x58, 0x88, 0xe4, 0x50, 0x3c, 0x25, 0x49, 0xfd, 0x91, 0xcf, 0xa3, 0x17, 0x7b, 0x62, 0xe, 0xba, 0xd6, 0x7, 0x6b, 0xdf, 0xb3, 0xaa, 0xc6, 0x72, 0x1e, 0x40, 0x2c, 0x98, 0xf4, 0xed, 0x81, 0x35, 0x59, 0x89, 0xe5, 0x51, 0x3d, 0x24, 0x48, 0xfc, 0x90, 0xce, 0xa2, 0x16, 0x7a, 0x63, 0xf, 0xbb, 0xd7}, [256]byte{0x0, 0x6d, 0xda, 0xb7, 0xa9, 0xc4, 0x73, 0x1e, 0x4f, 0x22, 0x95, 0xf8, 0xe6, 0x8b, 0x3c, 0x51, 0x9e, 0xf3, 0x44, 0x29, 0x37, 0x5a, 0xed, 0x80, 0xd1, 0xbc, 0xb, 0x66, 0x78, 0x15, 0xa2, 0xcf, 0x21, 0x4c, 0xfb, 0x96, 0x88, 0xe5, 0x52, 0x3f, 0x6e, 0x3, 0xb4, 0xd9, 0xc7, 0xaa, 0x1d, 0x70, 0xbf, 0xd2, 0x65, 0x8, 0x16, 0x7b, 0xcc, 0xa1, 0xf0, 0x9d, 0x2a, 0x47, 0x59, 0x34, 0x83, 0xee, 0x42, 0x2f, 0x98, 0xf5, 0xeb, 0x86, 0x31, 0x5c, 0xd, 0x60, 0xd7, 0xba, 0xa4, 0xc9, 0x7e, 0x13, 0xdc, 0xb1, 0x6, 0x6b, 0x75, 0x18, 0xaf, 0xc2, 0x93, 0xfe, 0x49, 0x24, 0x3a, 0x57, 0xe0, 0x8d, 0x63, 0xe, 0xb9, 0xd4, 0xca, 0xa7, 0x10, 0x7d, 0x2c, 0x41, 0xf6, 0x9b, 0x85, 0xe8, 0x5f, 0x32, 0xfd, 0x90, 0x27, 0x4a, 0x54, 0x39, 0x8e, 0xe3, 0xb2, 0xdf, 0x68, 0x5, 0x1b, 0x76, 0xc1, 0xac, 0x84, 0xe9, 0x5e, 0x33, 0x2d, 0x40, 0xf7, 0x9a, 0xcb, 0xa6, 0x11, 0x7c, 0x62, 0xf, 0xb8, 0xd5, 0x1a, 0x77, 0xc0, 0xad, 0xb3, 0xde, 0x69, 0x4, 0x55, 0x38, 0x8f, 0xe2, 0xfc, 0x91, 0x26, 0x4b, 0xa5, 0xc8, 0x7f, 0x12, 0xc, 0x61, 0xd6, 0xbb, 0xea, 0x87, 0x30, 0x5d, 0x43, 0x2e, 0x99, 0xf4, 0x3b, 0x56, 0xe1, 0x8c, 0x92, 0xff, 0x48, 0x25, 0x74, 0x19, 0xae, 0xc3, 0xdd, 0xb0, 0x7, 0x6a, 0xc6, 0xab, 0x1c, 0x71, 0x6f, 0x2, 0xb5, 0xd8, 0x89, 0xe4, 0x53, 0x3e, 0x20, 0x4d, 0xfa, 0x97, 0x58, 0x35, 0x82, 0xef, 0xf1, 0x9c, 0x2b, 0x46, 0x17, 0x7a, 0xcd, 0xa0, 0xbe, 0xd3, 0x64, 0x9, 0xe7, 0x8a, 0x3d, 0x50, 0x4e, 0x23, 0x94, 0xf9, 0xa8, 0xc5, 0x72, 0x1f, 0x1, 0x6c, 0xdb, 0xb6, 0x79, 0x14, 0xa3, 0xce, 0xd0, 0xbd, 0xa, 0x67, 0x36, 0x5b, 0xec, 0x81, 0x9f, 0xf2, 0x45, 0x28}, [256]byte{0x0, 0x6e, 0xdc, 0xb2, 0xa5, 0xcb, 0x79, 0x17, 0x57, 0x39, 0x8b, 0xe5, 0xf2, 0x9c, 0x2e, 0x40, 0xae, 0xc0, 0x72, 0x1c, 0xb, 0x65, 0xd7, 0xb9, 0xf9, 0x97, 0x25, 0x4b, 0x5c, 0x32, 0x80, 0xee, 0x41, 0x2f, 0x9d, 0xf3, 0xe4, 0x8a, 0x38, 0x56, 0x16, 0x78, 0xca, 0xa4, 0xb3, 0xdd, 0x6f, 0x1, 0xef, 0x81, 0x33, 0x5d, 0x4a, 0x24, 0x96, 0xf8, 0xb8, 0xd6, 0x64, 0xa, 0x1d, 0x73, 0xc1, 0xaf, 0x82, 0xec, 0x5e, 0x30, 0x27, 0x49, 0xfb, 0x95, 0xd5, 0xbb, 0x9, 0x67, 0x70, 0x1e, 0xac, 0xc2, 0x2c, 0x42, 0xf0, 0x9e, 0x89, 0xe7, 0x55, 0x3b, 0x7b, 0x15, 0xa7, 0xc9, 0xde, 0xb0, 0x2, 0x6c, 0xc3, 0xad, 0x1f, 0x71, 0x66, 0x8, 0xba, 0xd4, 0x94, 0xfa, 0x48, 0x26, 0x31, 0x5f, 0xed, 0x83, 0x6d, 0x3, 0xb1, 0xdf, 0xc8, 0xa6, 0x14, 0x7a, 0x3a, 0x54, 0xe6, 0x88, 0x9f, 0xf1, 0x43, 0x2d, 0x19, 0x77, 0xc5, 0xab, 0xbc, 0xd2, 0x60, 0xe, 0x4e, 0x20, 0x92, 0xfc, 0xeb, 0x85, 0x37, 0x59, 0xb7, 0xd9, 0x6b, 0x5, 0x12, 0x7c, 0xce, 0xa0, 0xe0, 0x8e, 0x3c, 0x52, 0x45, 0x2b, 0x99, 0xf7, 0x58, 0x36, 0x84, 0xea, 0xfd, 0x93, 0x21, 0x4f, 0xf, 0x61, 0xd3, 0xbd, 0xaa, 0xc4, 0x76, 0x18, 0xf6, 0x98, 0x2a, 0x44, 0x53, 0x3d, 0x8f, 0xe1, 0xa1, 0xcf, 0x7d, 0x13, 0x4, 0x6a, 0xd8, 0xb6, 0x9b, 0xf5, 0x47, 0x29, 0x3e, 0x50, 0xe2, 0x8c, 0xcc, 0xa2, 0x10, 0x7e, 0x69, 0x7, 0xb5, 0xdb, 0x35, 0x5b, 0xe9, 0x87, 0x90, 0xfe, 0x4c, 0x22, 0x62, 0xc, 0xbe, 0xd0, 0xc7, 0xa9, 0x1b, 0x75, 0xda, 0xb4, 0x6, 0x68, 0x7f, 0x11, 0xa3, 0xcd, 0x8d, 0xe3, 0x51, 0x3f, 0x28, 0x46, 0xf4, 0x9a, 0x74, 0x1a, 0xa8, 0xc6, 0xd1, 0xbf, 0xd, 0x63, 0x23, 0x4d, 0xff, 0x91, 0x86, 0xe8, 0x5a, 0x34}, [256]byte{0x0, 0x6f, 0xde, 0xb1, 0xa1, 0xce, 0x7f, 0x10, 0x5f, 0x30, 0x81, 0xee, 0xfe, 0x91, 0x20, 0x4f, 0xbe, 0xd1, 0x60, 0xf, 0x1f, 0x70, 0xc1, 0xae, 0xe1, 0x8e, 0x3f, 0x50, 0x40, 0x2f, 0x9e, 0xf1, 0x61, 0xe, 0xbf, 0xd0, 0xc0, 0xaf, 0x1e, 0x71, 0x3e, 0x51, 0xe0, 0x8f, 0x9f, 0xf0, 0x41, 0x2e, 0xdf, 0xb0, 0x1, 0x6e, 0x7e, 0x11, 0xa0, 0xcf, 0x80, 0xef, 0x5e, 0x31, 0x21, 0x4e, 0xff, 0x90, 0xc2, 0xad, 0x1c, 0x73, 0x63, 0xc, 0xbd, 0xd2, 0x9d, 0xf2, 0x43, 0x2c, 0x3c, 0x53, 0xe2, 0x8d, 0x7c, 0x13, 0xa2, 0xcd, 0xdd, 0xb2, 0x3, 0x6c, 0x23, 0x4c, 0xfd, 0x92, 0x82, 0xed, 0x5c, 0x33, 0xa3, 0xcc, 0x7d, 0x12, 0x2, 0x6d, 0xdc, 0xb3, 0xfc, 0x93, 0x22, 0x4d, 0x5d, 0x32, 0x83, 0xec, 0x1d, 0x72, 0xc3, 0xac, 0xbc, 0xd3, 0x62, 0xd, 0x42, 0x2d, 0x9c, 0xf3, 0xe3, 0x8c, 0x3d, 0x52, 0x99, 0xf6, 0x47, 0x28, 0x38, 0x57, 0xe6, 0x89, 0xc6, 0xa9, 0x18, 0x77, 0x67, 0x8, 0xb9, 0xd6, 0x27, 0x48, 0xf9, 0x96, 0x86, 0xe9, 0x58, 0x37, 0x78, 0x17, 0xa6, 0xc9, 0xd9, 0xb6, 0x7, 0x68, 0xf8, 0x97, 0x26, 0x49, 0x59, 0x36, 0x87, 0xe8, 0xa7, 0xc8, 0x79, 0x16, 0x6, 0x69, 0xd8, 0xb7, 0x46, 0x29, 0x98, 0xf7, 0xe7, 0x88, 0x39, 0x56, 0x19, 0x76, 0xc7, 0xa8, 0xb8, 0xd7, 0x66, 0x9, 0x5b, 0x34, 0x85, 0xea, 0xfa, 0x95, 0x24, 0x4b, 0x4, 0x6b, 0xda, 0xb5, 0xa5, 0xca, 0x7b, 0x14, 0xe5, 0x8a, 0x3b, 0x54, 0x44, 0x2b, 0x9a, 0xf5, 0xba, 0xd5, 0x64, 0xb, 0x1b, 0x74, 0xc5, 0xaa, 0x3a, 0x55, 0xe4, 0x8b, 0x9b, 0xf4, 0x45, 0x2a, 0x65, 0xa, 0xbb, 0xd4, 0xc4, 0xab, 0x1a, 0x75, 0x84, 0xeb, 0x5a, 0x35, 0x25, 0x4a, 0xfb, 0x94, 0xdb, 0xb4, 0x5, 0x6a, 0x7a, 0x15, 0xa4, 0xcb}, [256]byte{0x0, 0x70, 0xe0, 0x90, 0xdd, 0xad, 0x3d, 0x4d, 0xa7, 0xd7, 0x47, 0x37, 0x7a, 0xa, 0x9a, 0xea, 0x53, 0x23, 0xb3, 0xc3, 0x8e, 0xfe, 0x6e, 0x1e, 0xf4, 0x84, 0x14, 0x64, 0x29, 0x59, 0xc9, 0xb9, 0xa6, 0xd6, 0x46, 0x36, 0x7b, 0xb, 0x9b, 0xeb, 0x1, 0x71, 0xe1, 0x91, 0xdc, 0xac, 0x3c, 0x4c, 0xf5, 0x85, 0x15, 0x65, 0x28, 0x58, 0xc8, 0xb8, 0x52, 0x22, 0xb2, 0xc2, 0x8f, 0xff, 0x6f, 0x1f, 0x51, 0x21, 0xb1, 0xc1, 0x8c, 0xfc, 0x6c, 0x1c, 0xf6, 0x86, 0x16, 0x66, 0x2b, 0x5b, 0xcb, 0xbb, 0x2, 0x72, 0xe2, 0x92, 0xdf, 0xaf, 0x3f, 0x4f, 0xa5, 0xd5, 0x45, 0x35, 0x78, 0x8, 0x98, 0xe8, 0xf7, 0x87, 0x17, 0x67, 0x2a, 0x5a, 0xca, 0xba, 0x50, 0x20, 0xb0, 0xc0, 0x8d, 0xfd, 0x6d, 0x1d, 0xa4, 0xd4, 0x44, 0x34, 0x79, 0x9, 0x99, 0xe9, 0x3, 0x73, 0xe3, 0x93, 0xde, 0xae, 0x3e, 0x4e, 0xa2, 0xd2, 0x42, 0x32, 0x7f, 0xf, 0x9f, 0xef, 0x5, 0x75, 0xe5, 0x95, 0xd8, 0xa8, 0x38, 0x48, 0xf1, 0x81, 0x11, 0x61, 0x2c, 0x5c, 0xcc, 0xbc, 0x56, 0x26, 0xb6, 0xc6, 0x8b, 0xfb, 0x6b, 0x1b, 0x4, 0x74, 0xe4, 0x94, 0xd9, 0xa9, 0x39, 0x49, 0xa3, 0xd3, 0x43, 0x33, 0x7e, 0xe, 0x9e, 0xee, 0x57, 0x27, 0xb7, 0xc7, 0x8a, 0xfa, 0x6a, 0x1a, 0xf0, 0x80, 0x10, 0x60, 0x2d, 0x5d, 0xcd, 0xbd, 0xf3, 0x83, 0x13, 0x63, 0x2e, 0x5e, 0xce, 0xbe, 0x54, 0x24, 0xb4, 0xc4, 0x89, 0xf9, 0x69, 0x19, 0xa0, 0xd0, 0x40, 0x30, 0x7d, 0xd, 0x9d, 0xed, 0x7, 0x77, 0xe7, 0x97, 0xda, 0xaa, 0x3a, 0x4a, 0x55, 0x25, 0xb5, 0xc5, 0x88, 0xf8, 0x68, 0x18, 0xf2, 0x82, 0x12, 0x62, 0x2f, 0x5f, 0xcf, 0xbf, 0x6, 0x76, 0xe6, 0x96, 0xdb, 0xab, 0x3b, 0x4b, 0xa1, 0xd1, 0x41, 0x31, 0x7c, 0xc, 0x9c, 0xec}, [256]byte{0x0, 0x71, 0xe2, 0x93, 0xd9, 0xa8, 0x3b, 0x4a, 0xaf, 0xde, 0x4d, 0x3c, 0x76, 0x7, 0x94, 0xe5, 0x43, 0x32, 0xa1, 0xd0, 0x9a, 0xeb, 0x78, 0x9, 0xec, 0x9d, 0xe, 0x7f, 0x35, 0x44, 0xd7, 0xa6, 0x86, 0xf7, 0x64, 0x15, 0x5f, 0x2e, 0xbd, 0xcc, 0x29, 0x58, 0xcb, 0xba, 0xf0, 0x81, 0x12, 0x63, 0xc5, 0xb4, 0x27, 0x56, 0x1c, 0x6d, 0xfe, 0x8f, 0x6a, 0x1b, 0x88, 0xf9, 0xb3, 0xc2, 0x51, 0x20, 0x11, 0x60, 0xf3, 0x82, 0xc8, 0xb9, 0x2a, 0x5b, 0xbe, 0xcf, 0x5c, 0x2d, 0x67, 0x16, 0x85, 0xf4, 0x52, 0x23, 0xb0, 0xc1, 0x8b, 0xfa, 0x69, 0x18, 0xfd, 0x8c, 0x1f, 0x6e, 0x24, 0x55, 0xc6, 0xb7, 0x97, 0xe6, 0x75, 0x4, 0x4e, 0x3f, 0xac, 0xdd, 0x38, 0x49, 0xda, 0xab, 0xe1, 0x90, 0x3, 0x72, 0xd4, 0xa5, 0x36, 0x47, 0xd, 0x7c, 0xef, 0x9e, 0x7b, 0xa, 0x99, 0xe8, 0xa2, 0xd3, 0x40, 0x31, 0x22, 0x53, 0xc0, 0xb1, 0xfb, 0x8a, 0x19, 0x68, 0x8d, 0xfc, 0x6f, 0x1e, 0x54, 0x25, 0xb6, 0xc7, 0x61, 0x10, 0x83, 0xf2, 0xb8, 0xc9, 0x5a, 0x2b, 0xce, 0xbf, 0x2c, 0x5d, 0x17, 0x66, 0xf5, 0x84, 0xa4, 0xd5, 0x46, 0x37, 0x7d, 0xc, 0x9f, 0xee, 0xb, 0x7a, 0xe9, 0x98, 0xd2, 0xa3, 0x30, 0x41, 0xe7, 0x96, 0x5, 0x74, 0x3e, 0x4f, 0xdc, 0xad, 0x48, 0x39, 0xaa, 0xdb, 0x91, 0xe0, 0x73, 0x2, 0x33, 0x42, 0xd1, 0xa0, 0xea, 0x9b, 0x8, 0x79, 0x9c, 0xed, 0x7e, 0xf, 0x45, 0x34, 0xa7, 0xd6, 0x70, 0x1, 0x92, 0xe3, 0xa9, 0xd8, 0x4b, 0x3a, 0xdf, 0xae, 0x3d, 0x4c, 0x6, 0x77, 0xe4, 0x95, 0xb5, 0xc4, 0x57, 0x26, 0x6c, 0x1d, 0x8e, 0xff, 0x1a, 0x6b, 0xf8, 0x89, 0xc3, 0xb2, 0x21, 0x50, 0xf6, 0x87, 0x14, 0x65, 0x2f, 0x5e, 0xcd, 0xbc, 0x59, 0x28, 0xbb, 0xca, 0x80, 0xf1, 0x62, 0x13}, [256]byte{0x0, 0x72, 0xe4, 0x96, 0xd5, 0xa7, 0x31, 0x43, 0xb7, 0xc5, 0x53, 0x21, 0x62, 0x10, 0x86, 0xf4, 0x73, 0x1, 0x97, 0xe5, 0xa6, 0xd4, 0x42, 0x30, 0xc4, 0xb6, 0x20, 0x52, 0x11, 0x63, 0xf5, 0x87, 0xe6, 0x94, 0x2, 0x70, 0x33, 0x41, 0xd7, 0xa5, 0x51, 0x23, 0xb5, 0xc7, 0x84, 0xf6, 0x60, 0x12, 0x95, 0xe7, 0x71, 0x3, 0x40, 0x32, 0xa4, 0xd6, 0x22, 0x50, 0xc6, 0xb4, 0xf7, 0x85, 0x13, 0x61, 0xd1, 0xa3, 0x35, 0x47, 0x4, 0x76, 0xe0, 0x92, 0x66, 0x14, 0x82, 0xf0, 0xb3, 0xc1, 0x57, 0x25, 0xa2, 0xd0, 0x46, 0x34, 0x77, 0x5, 0x93, 0xe1, 0x15, 0x67, 0xf1, 0x83, 0xc0, 0xb2, 0x24, 0x56, 0x37, 0x45, 0xd3, 0xa1, 0xe2, 0x90, 0x6, 0x74, 0x80, 0xf2, 0x64, 0x16, 0x55, 0x27, 0xb1, 0xc3, 0x44, 0x36, 0xa0, 0xd2, 0x91, 0xe3, 0x75, 0x7, 0xf3, 0x81, 0x17, 0x65, 0x26, 0x54, 0xc2, 0xb0, 0xbf, 0xcd, 0x5b, 0x29, 0x6a, 0x18, 0x8e, 0xfc, 0x8, 0x7a, 0xec, 0x9e, 0xdd, 0xaf, 0x39, 0x4b, 0xcc, 0xbe, 0x28, 0x5a, 0x19, 0x6b, 0xfd, 0x8f, 0x7b, 0x9, 0x9f, 0xed, 0xae, 0xdc, 0x4a, 0x38, 0x59, 0x2b, 0xbd, 0xcf, 0x8c, 0xfe, 0x68, 0x1a, 0xee, 0x9c, 0xa, 0x78, 0x3b, 0x49, 0xdf, 0xad, 0x2a, 0x58, 0xce, 0xbc, 0xff, 0x8d, 0x1b, 0x69, 0x9d, 0xef, 0x79, 0xb, 0x48, 0x3a, 0xac, 0xde, 0x6e, 0x1c, 0x8a, 0xf8, 0xbb, 0xc9, 0x5f, 0x2d, 0xd9, 0xab, 0x3d, 0x4f, 0xc, 0x7e, 0xe8, 0x9a, 0x1d, 0x6f, 0xf9, 0x8b, 0xc8, 0xba, 0x2c, 0x5e, 0xaa, 0xd8, 0x4e, 0x3c, 0x7f, 0xd, 0x9b, 0xe9, 0x88, 0xfa, 0x6c, 0x1e, 0x5d, 0x2f, 0xb9, 0xcb, 0x3f, 0x4d, 0xdb, 0xa9, 0xea, 0x98, 0xe, 0x7c, 0xfb, 0x89, 0x1f, 0x6d, 0x2e, 0x5c, 0xca, 0xb8, 0x4c, 0x3e, 0xa8, 0xda, 0x99, 0xeb, 0x7d, 0xf}, [256]byte{0x0, 0x73, 0xe6, 0x95, 0xd1, 0xa2, 0x37, 0x44, 0xbf, 0xcc, 0x59, 0x2a, 0x6e, 0x1d, 0x88, 0xfb, 0x63, 0x10, 0x85, 0xf6, 0xb2, 0xc1, 0x54, 0x27, 0xdc, 0xaf, 0x3a, 0x49, 0xd, 0x7e, 0xeb, 0x98, 0xc6, 0xb5, 0x20, 0x53, 0x17, 0x64, 0xf1, 0x82, 0x79, 0xa, 0x9f, 0xec, 0xa8, 0xdb, 0x4e, 0x3d, 0xa5, 0xd6, 0x43, 0x30, 0x74, 0x7, 0x92, 0xe1, 0x1a, 0x69, 0xfc, 0x8f, 0xcb, 0xb8, 0x2d, 0x5e, 0x91, 0xe2, 0x77, 0x4, 0x40, 0x33, 0xa6, 0xd5, 0x2e, 0x5d, 0xc8, 0xbb, 0xff, 0x8c, 0x19, 0x6a, 0xf2, 0x81, 0x14, 0x67, 0x23, 0x50, 0xc5, 0xb6, 0x4d, 0x3e, 0xab, 0xd8, 0x9c, 0xef, 0x7a, 0x9, 0x57, 0x24, 0xb1, 0xc2, 0x86, 0xf5, 0x60, 0x13, 0xe8, 0x9b, 0xe, 0x7d, 0x39, 0x4a, 0xdf, 0xac, 0x34, 0x47, 0xd2, 0xa1, 0xe5, 0x96, 0x3, 0x70, 0x8b, 0xf8, 0x6d, 0x1e, 0x5a, 0x29, 0xbc, 0xcf, 0x3f, 0x4c, 0xd9, 0xaa, 0xee, 0x9d, 0x8, 0x7b, 0x80, 0xf3, 0x66, 0x15, 0x51, 0x22, 0xb7, 0xc4, 0x5c, 0x2f, 0xba, 0xc9, 0x8d, 0xfe, 0x6b, 0x18, 0xe3, 0x90, 0x5, 0x76, 0x32, 0x41, 0xd4, 0xa7, 0xf9, 0x8a, 0x1f, 0x6c, 0x28, 0x5b, 0xce, 0xbd, 0x46, 0x35, 0xa0, 0xd3, 0x97, 0xe4, 0x71, 0x2, 0x9a, 0xe9, 0x7c, 0xf, 0x4b, 0x38, 0xad, 0xde, 0x25, 0x56, 0xc3, 0xb0, 0xf4, 0x87, 0x12, 0x61, 0xae, 0xdd, 0x48, 0x3b, 0x7f, 0xc, 0x99, 0xea, 0x11, 0x62, 0xf7, 0x84, 0xc0, 0xb3, 0x26, 0x55, 0xcd, 0xbe, 0x2b, 0x58, 0x1c, 0x6f, 0xfa, 0x89, 0x72, 0x1, 0x94, 0xe7, 0xa3, 0xd0, 0x45, 0x36, 0x68, 0x1b, 0x8e, 0xfd, 0xb9, 0xca, 0x5f, 0x2c, 0xd7, 0xa4, 0x31, 0x42, 0x6, 0x75, 0xe0, 0x93, 0xb, 0x78, 0xed, 0x9e, 0xda, 0xa9, 0x3c, 0x4f, 0xb4, 0xc7, 0x52, 0x21, 0x65, 0x16, 0x83, 0xf0}, [256]byte{0x0, 0x74, 0xe8, 0x9c, 0xcd, 0xb9, 0x25, 0x51, 0x87, 0xf3, 0x6f, 0x1b, 0x4a, 0x3e, 0xa2, 0xd6, 0x13, 0x67, 0xfb, 0x8f, 0xde, 0xaa, 0x36, 0x42, 0x94, 0xe0, 0x7c, 0x8, 0x59, 0x2d, 0xb1, 0xc5, 0x26, 0x52, 0xce, 0xba, 0xeb, 0x9f, 0x3, 0x77, 0xa1, 0xd5, 0x49, 0x3d, 0x6c, 0x18, 0x84, 0xf0, 0x35, 0x41, 0xdd, 0xa9, 0xf8, 0x8c, 0x10, 0x64, 0xb2, 0xc6, 0x5a, 0x2e, 0x7f, 0xb, 0x97, 0xe3, 0x4c, 0x38, 0xa4, 0xd0, 0x81, 0xf5, 0x69, 0x1d, 0xcb, 0xbf, 0x23, 0x57, 0x6, 0x72, 0xee, 0x9a, 0x5f, 0x2b, 0xb7, 0xc3, 0x92, 0xe6, 0x7a, 0xe, 0xd8, 0xac, 0x30, 0x44, 0x15, 0x61, 0xfd, 0x89, 0x6a, 0x1e, 0x82, 0xf6, 0xa7, 0xd3, 0x4f, 0x3b, 0xed, 0x99, 0x5, 0x71, 0x20, 0x54, 0xc8, 0xbc, 0x79, 0xd, 0x91, 0xe5, 0xb4, 0xc0, 0x5c, 0x28, 0xfe, 0x8a, 0x16, 0x62, 0x33, 0x47, 0xdb, 0xaf, 0x98, 0xec, 0x70, 0x4, 0x55, 0x21, 0xbd, 0xc9, 0x1f, 0x6b, 0xf7, 0x83, 0xd2, 0xa6, 0x3a, 0x4e, 0x8b, 0xff, 0x63, 0x17, 0x46, 0x32, 0xae, 0xda, 0xc, 0x78, 0xe4, 0x90, 0xc1, 0xb5, 0x29, 0x5d, 0xbe, 0xca, 0x56, 0x22, 0x73, 0x7, 0x9b, 0xef, 0x39, 0x4d, 0xd1, 0xa5, 0xf4, 0x80, 0x1c, 0x68, 0xad, 0xd9, 0x45, 0x31, 0x60, 0x14, 0x88, 0xfc, 0x2a, 0x5e, 0xc2, 0xb6, 0xe7, 0x93, 0xf, 0x7b, 0xd4, 0xa0, 0x3c, 0x48, 0x19, 0x6d, 0xf1, 0x85, 0x53, 0x27, 0xbb, 0xcf, 0x9e, 0xea, 0x76, 0x2, 0xc7, 0xb3, 0x2f, 0x5b, 0xa, 0x7e, 0xe2, 0x96, 0x40, 0x34, 0xa8, 0xdc, 0x8d, 0xf9, 0x65, 0x11, 0xf2, 0x86, 0x1a, 0x6e, 0x3f, 0x4b, 0xd7, 0xa3, 0x75, 0x1, 0x9d, 0xe9, 0xb8, 0xcc, 0x50, 0x24, 0xe1, 0x95, 0x9, 0x7d, 0x2c, 0x58, 0xc4, 0xb0, 0x66, 0x12, 0x8e, 0xfa, 0xab, 0xdf, 0x43, 0x37}, [256]byte{0x0, 0x75, 0xea, 0x9f, 0xc9, 0xbc, 0x23, 0x56, 0x8f, 0xfa, 0x65, 0x10, 0x46, 0x33, 0xac, 0xd9, 0x3, 0x76, 0xe9, 0x9c, 0xca, 0xbf, 0x20, 0x55, 0x8c, 0xf9, 0x66, 0x13, 0x45, 0x30, 0xaf, 0xda, 0x6, 0x73, 0xec, 0x99, 0xcf, 0xba, 0x25, 0x50, 0x89, 0xfc, 0x63, 0x16, 0x40, 0x35, 0xaa, 0xdf, 0x5, 0x70, 0xef, 0x9a, 0xcc, 0xb9, 0x26, 0x53, 0x8a, 0xff, 0x60, 0x15, 0x43, 0x36, 0xa9, 0xdc, 0xc, 0x79, 0xe6, 0x93, 0xc5, 0xb0, 0x2f, 0x5a, 0x83, 0xf6, 0x69, 0x1c, 0x4a, 0x3f, 0xa0, 0xd5, 0xf, 0x7a, 0xe5, 0x90, 0xc6, 0xb3, 0x2c, 0x59, 0x80, 0xf5, 0x6a, 0x1f, 0x49, 0x3c, 0xa3, 0xd6, 0xa, 0x7f, 0xe0, 0x95, 0xc3, 0xb6, 0x29, 0x5c, 0x85, 0xf0, 0x6f, 0x1a, 0x4c, 0x39, 0xa6, 0xd3, 0x9, 0x7c, 0xe3, 0x96, 0xc0, 0xb5, 0x2a, 0x5f, 0x86, 0xf3, 0x6c, 0x19, 0x4f, 0x3a, 0xa5, 0xd0, 0x18, 0x6d, 0xf2, 0x87, 0xd1, 0xa4, 0x3b, 0x4e, 0x97, 0xe2, 0x7d, 0x8, 0x5e, 0x2b, 0xb4, 0xc1, 0x1b, 0x6e, 0xf1, 0x84, 0xd2, 0xa7, 0x38, 0x4d, 0x94, 0xe1, 0x7e, 0xb, 0x5d, 0x28, 0xb7, 0xc2, 0x1e, 0x6b, 0xf4, 0x81, 0xd7, 0xa2, 0x3d, 0x48, 0x91, 0xe4, 0x7b, 0xe, 0x58, 0x2d, 0xb2, 0xc7, 0x1d, 0x68, 0xf7, 0x82, 0xd4, 0xa1, 0x3e, 0x4b, 0x92, 0xe7, 0x78, 0xd, 0x5b, 0x2e, 0xb1, 0xc4, 0x14, 0x61, 0xfe, 0x8b, 0xdd, 0xa8, 0x37, 0x42, 0x9b, 0xee, 0x71, 0x4, 0x52, 0x27, 0xb8, 0xcd, 0x17, 0x62, 0xfd, 0x88, 0xde, 0xab, 0x34, 0x41, 0x98, 0xed, 0x72, 0x7, 0x51, 0x24, 0xbb, 0xce, 0x12, 0x67, 0xf8, 0x8d, 0xdb, 0xae, 0x31, 0x44, 0x9d, 0xe8, 0x77, 0x2, 0x54, 0x21, 0xbe, 0xcb, 0x11, 0x64, 0xfb, 0x8e, 0xd8, 0xad, 0x32, 0x47, 0x9e, 0xeb, 0x74, 0x1, 0x57, 0x22, 0xbd, 0xc8}, [256]byte{0x0, 0x76, 0xec, 0x9a, 0xc5, 0xb3, 0x29, 0x5f, 0x97, 0xe1, 0x7b, 0xd, 0x52, 0x24, 0xbe, 0xc8, 0x33, 0x45, 0xdf, 0xa9, 0xf6, 0x80, 0x1a, 0x6c, 0xa4, 0xd2, 0x48, 0x3e, 0x61, 0x17, 0x8d, 0xfb, 0x66, 0x10, 0x8a, 0xfc, 0xa3, 0xd5, 0x4f, 0x39, 0xf1, 0x87, 0x1d, 0x6b, 0x34, 0x42, 0xd8, 0xae, 0x55, 0x23, 0xb9, 0xcf, 0x90, 0xe6, 0x7c, 0xa, 0xc2, 0xb4, 0x2e, 0x58, 0x7, 0x71, 0xeb, 0x9d, 0xcc, 0xba, 0x20, 0x56, 0x9, 0x7f, 0xe5, 0x93, 0x5b, 0x2d, 0xb7, 0xc1, 0x9e, 0xe8, 0x72, 0x4, 0xff, 0x89, 0x13, 0x65, 0x3a, 0x4c, 0xd6, 0xa0, 0x68, 0x1e, 0x84, 0xf2, 0xad, 0xdb, 0x41, 0x37, 0xaa, 0xdc, 0x46, 0x30, 0x6f, 0x19, 0x83, 0xf5, 0x3d, 0x4b, 0xd1, 0xa7, 0xf8, 0x8e, 0x14, 0x62, 0x99, 0xef, 0x75, 0x3, 0x5c, 0x2a, 0xb0, 0xc6, 0xe, 0x78, 0xe2, 0x94, 0xcb, 0xbd, 0x27, 0x51, 0x85, 0xf3, 0x69, 0x1f, 0x40, 0x36, 0xac, 0xda, 0x12, 0x64, 0xfe, 0x88, 0xd7, 0xa1, 0x3b, 0x4d, 0xb6, 0xc0, 0x5a, 0x2c, 0x73, 0x5, 0x9f, 0xe9, 0x21, 0x57, 0xcd, 0xbb, 0xe4, 0x92, 0x8, 0x7e, 0xe3, 0x95, 0xf, 0x79, 0x26, 0x50, 0xca, 0xbc, 0x74, 0x2, 0x98, 0xee, 0xb1, 0xc7, 0x5d, 0x2b, 0xd0, 0xa6, 0x3c, 0x4a, 0x15, 0x63, 0xf9, 0x8f, 0x47, 0x31, 0xab, 0xdd, 0x82, 0xf4, 0x6e, 0x18, 0x49, 0x3f, 0xa5, 0xd3, 0x8c, 0xfa, 0x60, 0x16, 0xde, 0xa8, 0x32, 0x44, 0x1b, 0x6d, 0xf7, 0x81, 0x7a, 0xc, 0x96, 0xe0, 0xbf, 0xc9, 0x53, 0x25, 0xed, 0x9b, 0x1, 0x77, 0x28, 0x5e, 0xc4, 0xb2, 0x2f, 0x59, 0xc3, 0xb5, 0xea, 0x9c, 0x6, 0x70, 0xb8, 0xce, 0x54, 0x22, 0x7d, 0xb, 0x91, 0xe7, 0x1c, 0x6a, 0xf0, 0x86, 0xd9, 0xaf, 0x35, 0x43, 0x8b, 0xfd, 0x67, 0x11, 0x4e, 0x38, 0xa2, 0xd4}, [256]byte{0x0, 0x77, 0xee, 0x99, 0xc1, 0xb6, 0x2f, 0x58, 0x9f, 0xe8, 0x71, 0x6, 0x5e, 0x29, 0xb0, 0xc7, 0x23, 0x54, 0xcd, 0xba, 0xe2, 0x95, 0xc, 0x7b, 0xbc, 0xcb, 0x52, 0x25, 0x7d, 0xa, 0x93, 0xe4, 0x46, 0x31, 0xa8, 0xdf, 0x87, 0xf0, 0x69, 0x1e, 0xd9, 0xae, 0x37, 0x40, 0x18, 0x6f, 0xf6, 0x81, 0x65, 0x12, 0x8b, 0xfc, 0xa4, 0xd3, 0x4a, 0x3d, 0xfa, 0x8d, 0x14, 0x63, 0x3b, 0x4c, 0xd5, 0xa2, 0x8c, 0xfb, 0x62, 0x15, 0x4d, 0x3a, 0xa3, 0xd4, 0x13, 0x64, 0xfd, 0x8a, 0xd2, 0xa5, 0x3c, 0x4b, 0xaf, 0xd8, 0x41, 0x36, 0x6e, 0x19, 0x80, 0xf7, 0x30, 0x47, 0xde, 0xa9, 0xf1, 0x86, 0x1f, 0x68, 0xca, 0xbd, 0x24, 0x53, 0xb, 0x7c, 0xe5, 0x92, 0x55, 0x22, 0xbb, 0xcc, 0x94, 0xe3, 0x7a, 0xd, 0xe9, 0x9e, 0x7, 0x70, 0x28, 0x5f, 0xc6, 0xb1, 0x76, 0x1, 0x98, 0xef, 0xb7, 0xc0, 0x59, 0x2e, 0x5, 0x72, 0xeb, 0x9c, 0xc4, 0xb3, 0x2a, 0x5d, 0x9a, 0xed, 0x74, 0x3, 0x5b, 0x2c, 0xb5, 0xc2, 0x26, 0x51, 0xc8, 0xbf, 0xe7, 0x90, 0x9, 0x7e, 0xb9, 0xce, 0x57, 0x20, 0x78, 0xf, 0x96, 0xe1, 0x43, 0x34, 0xad, 0xda, 0x82, 0xf5, 0x6c, 0x1b, 0xdc, 0xab, 0x32, 0x45, 0x1d, 0x6a, 0xf3, 0x84, 0x60, 0x17, 0x8e, 0xf9, 0xa1, 0xd6, 0x4f, 0x38, 0xff, 0x88, 0x11, 0x66, 0x3e, 0x49, 0xd0, 0xa7, 0x89, 0xfe, 0x67, 0x10, 0x48, 0x3f, 0xa6, 0xd1, 0x16, 0x61, 0xf8, 0x8f, 0xd7, 0xa0, 0x39, 0x4e, 0xaa, 0xdd, 0x44, 0x33, 0x6b, 0x1c, 0x85, 0xf2, 0x35, 0x42, 0xdb, 0xac, 0xf4, 0x83, 0x1a, 0x6d, 0xcf, 0xb8, 0x21, 0x56, 0xe, 0x79, 0xe0, 0x97, 0x50, 0x27, 0xbe, 0xc9, 0x91, 0xe6, 0x7f, 0x8, 0xec, 0x9b, 0x2, 0x75, 0x2d, 0x5a, 0xc3, 0xb4, 0x73, 0x4, 0x9d, 0xea, 0xb2, 0xc5, 0x5c, 0x2b}, [256]byte{0x0, 0x78, 0xf0, 0x88, 0xfd, 0x85, 0xd, 0x75, 0xe7, 0x9f, 0x17, 0x6f, 0x1a, 0x62, 0xea, 0x92, 0xd3, 0xab, 0x23, 0x5b, 0x2e, 0x56, 0xde, 0xa6, 0x34, 0x4c, 0xc4, 0xbc, 0xc9, 0xb1, 0x39, 0x41, 0xbb, 0xc3, 0x4b, 0x33, 0x46, 0x3e, 0xb6, 0xce, 0x5c, 0x24, 0xac, 0xd4, 0xa1, 0xd9, 0x51, 0x29, 0x68, 0x10, 0x98, 0xe0, 0x95, 0xed, 0x65, 0x1d, 0x8f, 0xf7, 0x7f, 0x7, 0x72, 0xa, 0x82, 0xfa, 0x6b, 0x13, 0x9b, 0xe3, 0x96, 0xee, 0x66, 0x1e, 0x8c, 0xf4, 0x7c, 0x4, 0x71, 0x9, 0x81, 0xf9, 0xb8, 0xc0, 0x48, 0x30, 0x45, 0x3d, 0xb5, 0xcd, 0x5f, 0x27, 0xaf, 0xd7, 0xa2, 0xda, 0x52, 0x2a, 0xd0, 0xa8, 0x20, 0x58, 0x2d, 0x55, 0xdd, 0xa5, 0x37, 0x4f, 0xc7, 0xbf, 0xca, 0xb2, 0x3a, 0x42, 0x3, 0x7b, 0xf3, 0x8b, 0xfe, 0x86, 0xe, 0x76, 0xe4, 0x9c, 0x14, 0x6c, 0x19, 0x61, 0xe9, 0x91, 0xd6, 0xae, 0x26, 0x5e, 0x2b, 0x53, 0xdb, 0xa3, 0x31, 0x49, 0xc1, 0xb9, 0xcc, 0xb4, 0x3c, 0x44, 0x5, 0x7d, 0xf5, 0x8d, 0xf8, 0x80, 0x8, 0x70, 0xe2, 0x9a, 0x12, 0x6a, 0x1f, 0x67, 0xef, 0x97, 0x6d, 0x15, 0x9d, 0xe5, 0x90, 0xe8, 0x60, 0x18, 0x8a, 0xf2, 0x7a, 0x2, 0x77, 0xf, 0x87, 0xff, 0xbe, 0xc6, 0x4e, 0x36, 0x43, 0x3b, 0xb3, 0xcb, 0x59, 0x21, 0xa9, 0xd1, 0xa4, 0xdc, 0x54, 0x2c, 0xbd, 0xc5, 0x4d, 0x35, 0x40, 0x38, 0xb0, 0xc8, 0x5a, 0x22, 0xaa, 0xd2, 0xa7, 0xdf, 0x57, 0x2f, 0x6e, 0x16, 0x9e, 0xe6, 0x93, 0xeb, 0x63, 0x1b, 0x89, 0xf1, 0x79, 0x1, 0x74, 0xc, 0x84, 0xfc, 0x6, 0x7e, 0xf6, 0x8e, 0xfb, 0x83, 0xb, 0x73, 0xe1, 0x99, 0x11, 0x69, 0x1c, 0x64, 0xec, 0x94, 0xd5, 0xad, 0x25, 0x5d, 0x28, 0x50, 0xd8, 0xa0, 0x32, 0x4a, 0xc2, 0xba, 0xcf, 0xb7, 0x3f, 0x47}, [256]byte{0x0, 0x79, 0xf2, 0x8b, 0xf9, 0x80, 0xb, 0x72, 0xef, 0x96, 0x1d, 0x64, 0x16, 0x6f, 0xe4, 0x9d, 0xc3, 0xba, 0x31, 0x48, 0x3a, 0x43, 0xc8, 0xb1, 0x2c, 0x55, 0xde, 0xa7, 0xd5, 0xac, 0x27, 0x5e, 0x9b, 0xe2, 0x69, 0x10, 0x62, 0x1b, 0x90, 0xe9, 0x74, 0xd, 0x86, 0xff, 0x8d, 0xf4, 0x7f, 0x6, 0x58, 0x21, 0xaa, 0xd3, 0xa1, 0xd8, 0x53, 0x2a, 0xb7, 0xce, 0x45, 0x3c, 0x4e, 0x37, 0xbc, 0xc5, 0x2b, 0x52, 0xd9, 0xa0, 0xd2, 0xab, 0x20, 0x59, 0xc4, 0xbd, 0x36, 0x4f, 0x3d, 0x44, 0xcf, 0xb6, 0xe8, 0x91, 0x1a, 0x63, 0x11, 0x68, 0xe3, 0x9a, 0x7, 0x7e, 0xf5, 0x8c, 0xfe, 0x87, 0xc, 0x75, 0xb0, 0xc9, 0x42, 0x3b, 0x49, 0x30, 0xbb, 0xc2, 0x5f, 0x26, 0xad, 0xd4, 0xa6, 0xdf, 0x54, 0x2d, 0x73, 0xa, 0x81, 0xf8, 0x8a, 0xf3, 0x78, 0x1, 0x9c, 0xe5, 0x6e, 0x17, 0x65, 0x1c, 0x97, 0xee, 0x56, 0x2f, 0xa4, 0xdd, 0xaf, 0xd6, 0x5d, 0x24, 0xb9, 0xc0, 0x4b, 0x32, 0x40, 0x39, 0xb2, 0xcb, 0x95, 0xec, 0x67, 0x1e, 0x6c, 0x15, 0x9e, 0xe7, 0x7a, 0x3, 0x88, 0xf1, 0x83, 0xfa, 0x71, 0x8, 0xcd, 0xb4, 0x3f, 0x46, 0x34, 0x4d, 0xc6, 0xbf, 0x22, 0x5b, 0xd0, 0xa9, 0xdb, 0xa2, 0x29, 0x50, 0xe, 0x77, 0xfc, 0x85, 0xf7, 0x8e, 0x5, 0x7c, 0xe1, 0x98, 0x13, 0x6a, 0x18, 0x61, 0xea, 0x93, 0x7d, 0x4, 0x8f, 0xf6, 0x84, 0xfd, 0x76, 0xf, 0x92, 0xeb, 0x60, 0x19, 0x6b, 0x12, 0x99, 0xe0, 0xbe, 0xc7, 0x4c, 0x35, 0x47, 0x3e, 0xb5, 0xcc, 0x51, 0x28, 0xa3, 0xda, 0xa8, 0xd1, 0x5a, 0x23, 0xe6, 0x9f, 0x14, 0x6d, 0x1f, 0x66, 0xed, 0x94, 0x9, 0x70, 0xfb, 0x82, 0xf0, 0x89, 0x2, 0x7b, 0x25, 0x5c, 0xd7, 0xae, 0xdc, 0xa5, 0x2e, 0x57, 0xca, 0xb3, 0x38, 0x41, 0x33, 0x4a, 0xc1, 0xb8}, [256]byte{0x0, 0x7a, 0xf4, 0x8e, 0xf5, 0x8f, 0x1, 0x7b, 0xf7, 0x8d, 0x3, 0x79, 0x2, 0x78, 0xf6, 0x8c, 0xf3, 0x89, 0x7, 0x7d, 0x6, 0x7c, 0xf2, 0x88, 0x4, 0x7e, 0xf0, 0x8a, 0xf1, 0x8b, 0x5, 0x7f, 0xfb, 0x81, 0xf, 0x75, 0xe, 0x74, 0xfa, 0x80, 0xc, 0x76, 0xf8, 0x82, 0xf9, 0x83, 0xd, 0x77, 0x8, 0x72, 0xfc, 0x86, 0xfd, 0x87, 0x9, 0x73, 0xff, 0x85, 0xb, 0x71, 0xa, 0x70, 0xfe, 0x84, 0xeb, 0x91, 0x1f, 0x65, 0x1e, 0x64, 0xea, 0x90, 0x1c, 0x66, 0xe8, 0x92, 0xe9, 0x93, 0x1d, 0x67, 0x18, 0x62, 0xec, 0x96, 0xed, 0x97, 0x19, 0x63, 0xef, 0x95, 0x1b, 0x61, 0x1a, 0x60, 0xee, 0x94, 0x10, 0x6a, 0xe4, 0x9e, 0xe5, 0x9f, 0x11, 0x6b, 0xe7, 0x9d, 0x13, 0x69, 0x12, 0x68, 0xe6, 0x9c, 0xe3, 0x99, 0x17, 0x6d, 0x16, 0x6c, 0xe2, 0x98, 0x14, 0x6e, 0xe0, 0x9a, 0xe1, 0x9b, 0x15, 0x6f, 0xcb, 0xb1, 0x3f, 0x45, 0x3e, 0x44, 0xca, 0xb0, 0x3c, 0x46, 0xc8, 0xb2, 0xc9, 0xb3, 0x3d, 0x47, 0x38, 0x42, 0xcc, 0xb6, 0xcd, 0xb7, 0x39, 0x43, 0xcf, 0xb5, 0x3b, 0x41, 0x3a, 0x40, 0xce, 0xb4, 0x30, 0x4a, 0xc4, 0xbe, 0xc5, 0xbf, 0x31, 0x4b, 0xc7, 0xbd, 0x33, 0x49, 0x32, 0x48, 0xc6, 0xbc, 0xc3, 0xb9, 0x37, 0x4d, 0x36, 0x4c, 0xc2, 0xb8, 0x34, 0x4e, 0xc0, 0xba, 0xc1, 0xbb, 0x35, 0x4f, 0x20, 0x5a, 0xd4, 0xae, 0xd5, 0xaf, 0x21, 0x5b, 0xd7, 0xad, 0x23, 0x59, 0x22, 0x58, 0xd6, 0xac, 0xd3, 0xa9, 0x27, 0x5d, 0x26, 0x5c, 0xd2, 0xa8, 0x24, 0x5e, 0xd0, 0xaa, 0xd1, 0xab, 0x25, 0x5f, 0xdb, 0xa1, 0x2f, 0x55, 0x2e, 0x54, 0xda, 0xa0, 0x2c, 0x56, 0xd8, 0xa2, 0xd9, 0xa3, 0x2d, 0x57, 0x28, 0x52, 0xdc, 0xa6, 0xdd, 0xa7, 0x29, 0x53, 0xdf, 0xa5, 0x2b, 0x51, 0x2a, 0x50, 0xde, 0xa4}, [256]byte{0x0, 0x7b, 0xf6, 0x8d, 0xf1, 0x8a, 0x7, 0x7c, 0xff, 0x84, 0x9, 0x72, 0xe, 0x75, 0xf8, 0x83, 0xe3, 0x98, 0x15, 0x6e, 0x12, 0x69, 0xe4, 0x9f, 0x1c, 0x67, 0xea, 0x91, 0xed, 0x96, 0x1b, 0x60, 0xdb, 0xa0, 0x2d, 0x56, 0x2a, 0x51, 0xdc, 0xa7, 0x24, 0x5f, 0xd2, 0xa9, 0xd5, 0xae, 0x23, 0x58, 0x38, 0x43, 0xce, 0xb5, 0xc9, 0xb2, 0x3f, 0x44, 0xc7, 0xbc, 0x31, 0x4a, 0x36, 0x4d, 0xc0, 0xbb, 0xab, 0xd0, 0x5d, 0x26, 0x5a, 0x21, 0xac, 0xd7, 0x54, 0x2f, 0xa2, 0xd9, 0xa5, 0xde, 0x53, 0x28, 0x48, 0x33, 0xbe, 0xc5, 0xb9, 0xc2, 0x4f, 0x34, 0xb7, 0xcc, 0x41, 0x3a, 0x46, 0x3d, 0xb0, 0xcb, 0x70, 0xb, 0x86, 0xfd, 0x81, 0xfa, 0x77, 0xc, 0x8f, 0xf4, 0x79, 0x2, 0x7e, 0x5, 0x88, 0xf3, 0x93, 0xe8, 0x65, 0x1e, 0x62, 0x19, 0x94, 0xef, 0x6c, 0x17, 0x9a, 0xe1, 0x9d, 0xe6, 0x6b, 0x10, 0x4b, 0x30, 0xbd, 0xc6, 0xba, 0xc1, 0x4c, 0x37, 0xb4, 0xcf, 0x42, 0x39, 0x45, 0x3e, 0xb3, 0xc8, 0xa8, 0xd3, 0x5e, 0x25, 0x59, 0x22, 0xaf, 0xd4, 0x57, 0x2c, 0xa1, 0xda, 0xa6, 0xdd, 0x50, 0x2b, 0x90, 0xeb, 0x66, 0x1d, 0x61, 0x1a, 0x97, 0xec, 0x6f, 0x14, 0x99, 0xe2, 0x9e, 0xe5, 0x68, 0x13, 0x73, 0x8, 0x85, 0xfe, 0x82, 0xf9, 0x74, 0xf, 0x8c, 0xf7, 0x7a, 0x1, 0x7d, 0x6, 0x8b, 0xf0, 0xe0, 0x9b, 0x16, 0x6d, 0x11, 0x6a, 0xe7, 0x9c, 0x1f, 0x64, 0xe9, 0x92, 0xee, 0x95, 0x18, 0x63, 0x3, 0x78, 0xf5, 0x8e, 0xf2, 0x89, 0x4, 0x7f, 0xfc, 0x87, 0xa, 0x71, 0xd, 0x76, 0xfb, 0x80, 0x3b, 0x40, 0xcd, 0xb6, 0xca, 0xb1, 0x3c, 0x47, 0xc4, 0xbf, 0x32, 0x49, 0x35, 0x4e, 0xc3, 0xb8, 0xd8, 0xa3, 0x2e, 0x55, 0x29, 0x52, 0xdf, 0xa4, 0x27, 0x5c, 0xd1, 0xaa, 0xd6, 0xad, 0x20, 0x5b}, [256]byte{0x0, 0x7c, 0xf8, 0x84, 0xed, 0x91, 0x15, 0x69, 0xc7, 0xbb, 0x3f, 0x43, 0x2a, 0x56, 0xd2, 0xae, 0x93, 0xef, 0x6b, 0x17, 0x7e, 0x2, 0x86, 0xfa, 0x54, 0x28, 0xac, 0xd0, 0xb9, 0xc5, 0x41, 0x3d, 0x3b, 0x47, 0xc3, 0xbf, 0xd6, 0xaa, 0x2e, 0x52, 0xfc, 0x80, 0x4, 0x78, 0x11, 0x6d, 0xe9, 0x95, 0xa8, 0xd4, 0x50, 0x2c, 0x45, 0x39, 0xbd, 0xc1, 0x6f, 0x13, 0x97, 0xeb, 0x82, 0xfe, 0x7a, 0x6, 0x76, 0xa, 0x8e, 0xf2, 0x9b, 0xe7, 0x63, 0x1f, 0xb1, 0xcd, 0x49, 0x35, 0x5c, 0x20, 0xa4, 0xd8, 0xe5, 0x99, 0x1d, 0x61, 0x8, 0x74, 0xf0, 0x8c, 0x22, 0x5e, 0xda, 0xa6, 0xcf, 0xb3, 0x37, 0x4b, 0x4d, 0x31, 0xb5, 0xc9, 0xa0, 0xdc, 0x58, 0x24, 0x8a, 0xf6, 0x72, 0xe, 0x67, 0x1b, 0x9f, 0xe3, 0xde, 0xa2, 0x26, 0x5a, 0x33, 0x4f, 0xcb, 0xb7, 0x19, 0x65, 0xe1, 0x9d, 0xf4, 0x88, 0xc, 0x70, 0xec, 0x90, 0x14, 0x68, 0x1, 0x7d, 0xf9, 0x85, 0x2b, 0x57, 0xd3, 0xaf, 0xc6, 0xba, 0x3e, 0x42, 0x7f, 0x3, 0x87, 0xfb, 0x92, 0xee, 0x6a, 0x16, 0xb8, 0xc4, 0x40, 0x3c, 0x55, 0x29, 0xad, 0xd1, 0xd7, 0xab, 0x2f, 0x53, 0x3a, 0x46, 0xc2, 0xbe, 0x10, 0x6c, 0xe8, 0x94, 0xfd, 0x81, 0x5, 0x79, 0x44, 0x38, 0xbc, 0xc0, 0xa9, 0xd5, 0x51, 0x2d, 0x83, 0xff, 0x7b, 0x7, 0x6e, 0x12, 0x96, 0xea, 0x9a, 0xe6, 0x62, 0x1e, 0x77, 0xb, 0x8f, 0xf3, 0x5d, 0x21, 0xa5, 0xd9, 0xb0, 0xcc, 0x48, 0x34, 0x9, 0x75, 0xf1, 0x8d, 0xe4, 0x98, 0x1c, 0x60, 0xce, 0xb2, 0x36, 0x4a, 0x23, 0x5f, 0xdb, 0xa7, 0xa1, 0xdd, 0x59, 0x25, 0x4c, 0x30, 0xb4, 0xc8, 0x66, 0x1a, 0x9e, 0xe2, 0x8b, 0xf7, 0x73, 0xf, 0x32, 0x4e, 0xca, 0xb6, 0xdf, 0xa3, 0x27, 0x5b, 0xf5, 0x89, 0xd, 0x71, 0x18, 0x64, 0xe0, 0x9c}, [256]byte{0x0, 0x7d, 0xfa, 0x87, 0xe9, 0x94, 0x13, 0x6e, 0xcf, 0xb2, 0x35, 0x48, 0x26, 0x5b, 0xdc, 0xa1, 0x83, 0xfe, 0x79, 0x4, 0x6a, 0x17, 0x90, 0xed, 0x4c, 0x31, 0xb6, 0xcb, 0xa5, 0xd8, 0x5f, 0x22, 0x1b, 0x66, 0xe1, 0x9c, 0xf2, 0x8f, 0x8, 0x75, 0xd4, 0xa9, 0x2e, 0x53, 0x3d, 0x40, 0xc7, 0xba, 0x98, 0xe5, 0x62, 0x1f, 0x71, 0xc, 0x8b, 0xf6, 0x57, 0x2a, 0xad, 0xd0, 0xbe, 0xc3, 0x44, 0x39, 0x36, 0x4b, 0xcc, 0xb1, 0xdf, 0xa2, 0x25, 0x58, 0xf9, 0x84, 0x3, 0x7e, 0x10, 0x6d, 0xea, 0x97, 0xb5, 0xc8, 0x4f, 0x32, 0x5c, 0x21, 0xa6, 0xdb, 0x7a, 0x7, 0x80, 0xfd, 0x93, 0xee, 0x69, 0x14, 0x2d, 0x50, 0xd7, 0xaa, 0xc4, 0xb9, 0x3e, 0x43, 0xe2, 0x9f, 0x18, 0x65, 0xb, 0x76, 0xf1, 0x8c, 0xae, 0xd3, 0x54, 0x29, 0x47, 0x3a, 0xbd, 0xc0, 0x61, 0x1c, 0x9b, 0xe6, 0x88, 0xf5, 0x72, 0xf, 0x6c, 0x11, 0x96, 0xeb, 0x85, 0xf8, 0x7f, 0x2, 0xa3, 0xde, 0x59, 0x24, 0x4a, 0x37, 0xb0, 0xcd, 0xef, 0x92, 0x15, 0x68, 0x6, 0x7b, 0xfc, 0x81, 0x20, 0x5d, 0xda, 0xa7, 0xc9, 0xb4, 0x33, 0x4e, 0x77, 0xa, 0x8d, 0xf0, 0x9e, 0xe3, 0x64, 0x19, 0xb8, 0xc5, 0x42, 0x3f, 0x51, 0x2c, 0xab, 0xd6, 0xf4, 0x89, 0xe, 0x73, 0x1d, 0x60, 0xe7, 0x9a, 0x3b, 0x46, 0xc1, 0xbc, 0xd2, 0xaf, 0x28, 0x55, 0x5a, 0x27, 0xa0, 0xdd, 0xb3, 0xce, 0x49, 0x34, 0x95, 0xe8, 0x6f, 0x12, 0x7c, 0x1, 0x86, 0xfb, 0xd9, 0xa4, 0x23, 0x5e, 0x30, 0x4d, 0xca, 0xb7, 0x16, 0x6b, 0xec, 0x91, 0xff, 0x82, 0x5, 0x78, 0x41, 0x3c, 0xbb, 0xc6, 0xa8, 0xd5, 0x52, 0x2f, 0x8e, 0xf3, 0x74, 0x9, 0x67, 0x1a, 0x9d, 0xe0, 0xc2, 0xbf, 0x38, 0x45, 0x2b, 0x56, 0xd1, 0xac, 0xd, 0x70, 0xf7, 0x8a, 0xe4, 0x99, 0x1e, 0x63}, [256]byte{0x0, 0x7e, 0xfc, 0x82, 0xe5, 0x9b, 0x19, 0x67, 0xd7, 0xa9, 0x2b, 0x55, 0x32, 0x4c, 0xce, 0xb0, 0xb3, 0xcd, 0x4f, 0x31, 0x56, 0x28, 0xaa, 0xd4, 0x64, 0x1a, 0x98, 0xe6, 0x81, 0xff, 0x7d, 0x3, 0x7b, 0x5, 0x87, 0xf9, 0x9e, 0xe0, 0x62, 0x1c, 0xac, 0xd2, 0x50, 0x2e, 0x49, 0x37, 0xb5, 0xcb, 0xc8, 0xb6, 0x34, 0x4a, 0x2d, 0x53, 0xd1, 0xaf, 0x1f, 0x61, 0xe3, 0x9d, 0xfa, 0x84, 0x6, 0x78, 0xf6, 0x88, 0xa, 0x74, 0x13, 0x6d, 0xef, 0x91, 0x21, 0x5f, 0xdd, 0xa3, 0xc4, 0xba, 0x38, 0x46, 0x45, 0x3b, 0xb9, 0xc7, 0xa0, 0xde, 0x5c, 0x22, 0x92, 0xec, 0x6e, 0x10, 0x77, 0x9, 0x8b, 0xf5, 0x8d, 0xf3, 0x71, 0xf, 0x68, 0x16, 0x94, 0xea, 0x5a, 0x24, 0xa6, 0xd8, 0xbf, 0xc1, 0x43, 0x3d, 0x3e, 0x40, 0xc2, 0xbc, 0xdb, 0xa5, 0x27, 0x59, 0xe9, 0x97, 0x15, 0x6b, 0xc, 0x72, 0xf0, 0x8e, 0xf1, 0x8f, 0xd, 0x73, 0x14, 0x6a, 0xe8, 0x96, 0x26, 0x58, 0xda, 0xa4, 0xc3, 0xbd, 0x3f, 0x41, 0x42, 0x3c, 0xbe, 0xc0, 0xa7, 0xd9, 0x5b, 0x25, 0x95, 0xeb, 0x69, 0x17, 0x70, 0xe, 0x8c, 0xf2, 0x8a, 0xf4, 0x76, 0x8, 0x6f, 0x11, 0x93, 0xed, 0x5d, 0x23, 0xa1, 0xdf, 0xb8, 0xc6, 0x44, 0x3a, 0x39, 0x47, 0xc5, 0xbb, 0xdc, 0xa2, 0x20, 0x5e, 0xee, 0x90, 0x12, 0x6c, 0xb, 0x75, 0xf7, 0x89, 0x7, 0x79, 0xfb, 0x85, 0xe2, 0x9c, 0x1e, 0x60, 0xd0, 0xae, 0x2c, 0x52, 0x35, 0x4b, 0xc9, 0xb7, 0xb4, 0xca, 0x48, 0x36, 0x51, 0x2f, 0xad, 0xd3, 0x63, 0x1d, 0x9f, 0xe1, 0x86, 0xf8, 0x7a, 0x4, 0x7c, 0x2, 0x80, 0xfe, 0x99, 0xe7, 0x65, 0x1b, 0xab, 0xd5, 0x57, 0x29, 0x4e, 0x30, 0xb2, 0xcc, 0xcf, 0xb1, 0x33, 0x4d, 0x2a, 0x54, 0xd6, 0xa8, 0x18, 0x66, 0xe4, 0x9a, 0xfd, 0x83, 0x1, 0x7f}, [256]byte{0x0, 0x7f, 0xfe, 0x81, 0xe1, 0x9e, 0x1f, 0x60, 0xdf, 0xa0, 0x21, 0x5e, 0x3e, 0x41, 0xc0, 0xbf, 0xa3, 0xdc, 0x5d, 0x22, 0x42, 0x3d, 0xbc, 0xc3, 0x7c, 0x3, 0x82, 0xfd, 0x9d, 0xe2, 0x63, 0x1c, 0x5b, 0x24, 0xa5, 0xda, 0xba, 0xc5, 0x44, 0x3b, 0x84, 0xfb, 0x7a, 0x5, 0x65, 0x1a, 0x9b, 0xe4, 0xf8, 0x87, 0x6, 0x79, 0x19, 0x66, 0xe7, 0x98, 0x27, 0x58, 0xd9, 0xa6, 0xc6, 0xb9, 0x38, 0x47, 0xb6, 0xc9, 0x48, 0x37, 0x57, 0x28, 0xa9, 0xd6, 0x69, 0x16, 0x97, 0xe8, 0x88, 0xf7, 0x76, 0x9, 0x15, 0x6a, 0xeb, 0x94, 0xf4, 0x8b, 0xa, 0x75, 0xca, 0xb5, 0x34, 0x4b, 0x2b, 0x54, 0xd5, 0xaa, 0xed, 0x92, 0x13, 0x6c, 0xc, 0x73, 0xf2, 0x8d, 0x32, 0x4d, 0xcc, 0xb3, 0xd3, 0xac, 0x2d, 0x52, 0x4e, 0x31, 0xb0, 0xcf, 0xaf, 0xd0, 0x51, 0x2e, 0x91, 0xee, 0x6f, 0x10, 0x70, 0xf, 0x8e, 0xf1, 0x71, 0xe, 0x8f, 0xf0, 0x90, 0xef, 0x6e, 0x11, 0xae, 0xd1, 0x50, 0x2f, 0x4f, 0x30, 0xb1, 0xce, 0xd2, 0xad, 0x2c, 0x53, 0x33, 0x4c, 0xcd, 0xb2, 0xd, 0x72, 0xf3, 0x8c, 0xec, 0x93, 0x12, 0x6d, 0x2a, 0x55, 0xd4, 0xab, 0xcb, 0xb4, 0x35, 0x4a, 0xf5, 0x8a, 0xb, 0x74, 0x14, 0x6b, 0xea, 0x95, 0x89, 0xf6, 0x77, 0x8, 0x68, 0x17, 0x96, 0xe9, 0x56, 0x29, 0xa8, 0xd7, 0xb7, 0xc8, 0x49, 0x36, 0xc7, 0xb8, 0x39, 0x46, 0x26, 0x59, 0xd8, 0xa7, 0x18, 0x67, 0xe6, 0x99, 0xf9, 0x86, 0x7, 0x78, 0x64, 0x1b, 0x9a, 0xe5, 0x85, 0xfa, 0x7b, 0x4, 0xbb, 0xc4, 0x45, 0x3a, 0x5a, 0x25, 0xa4, 0xdb, 0x9c, 0xe3, 0x62, 0x1d, 0x7d, 0x2, 0x83, 0xfc, 0x43, 0x3c, 0xbd, 0xc2, 0xa2, 0xdd, 0x5c, 0x23, 0x3f, 0x40, 0xc1, 0xbe, 0xde, 0xa1, 0x20, 0x5f, 0xe0, 0x9f, 0x1e, 0x61, 0x1, 0x7e, 0xff, 0x80}, [256]byte{0x0, 0x80, 0x1d, 0x9d, 0x3a, 0xba, 0x27, 0xa7, 0x74, 0xf4, 0x69, 0xe9, 0x4e, 0xce, 0x53, 0xd3, 0xe8, 0x68, 0xf5, 0x75, 0xd2, 0x52, 0xcf, 0x4f, 0x9c, 0x1c, 0x81, 0x1, 0xa6, 0x26, 0xbb, 0x3b, 0xcd, 0x4d, 0xd0, 0x50, 0xf7, 0x77, 0xea, 0x6a, 0xb9, 0x39, 0xa4, 0x24, 0x83, 0x3, 0x9e, 0x1e, 0x25, 0xa5, 0x38, 0xb8, 0x1f, 0x9f, 0x2, 0x82, 0x51, 0xd1, 0x4c, 0xcc, 0x6b, 0xeb, 0x76, 0xf6, 0x87, 0x7, 0x9a, 0x1a, 0xbd, 0x3d, 0xa0, 0x20, 0xf3, 0x73, 0xee, 0x6e, 0xc9, 0x49, 0xd4, 0x54, 0x6f, 0xef, 0x72, 0xf2, 0x55, 0xd5, 0x48, 0xc8, 0x1b, 0x9b, 0x6, 0x86, 0x21, 0xa1, 0x3c, 0xbc, 0x4a, 0xca, 0x57, 0xd7, 0x70, 0xf0, 0x6d, 0xed, 0x3e, 0xbe, 0x23, 0xa3, 0x4, 0x84, 0x19, 0x99, 0xa2, 0x22, 0xbf, 0x3f, 0x98, 0x18, 0x85, 0x5, 0xd6, 0x56, 0xcb, 0x4b, 0xec, 0x6c, 0xf1, 0x71, 0x13, 0x93, 0xe, 0x8e, 0x29, 0xa9, 0x34, 0xb4, 0x67, 0xe7, 0x7a, 0xfa, 0x5d, 0xdd, 0x40, 0xc0, 0xfb, 0x7b, 0xe6, 0x66, 0xc1, 0x41, 0xdc, 0x5c, 0x8f, 0xf, 0x92, 0x12, 0xb5, 0x35, 0xa8, 0x28, 0xde, 0x5e, 0xc3, 0x43, 0xe4, 0x64, 0xf9, 0x79, 0xaa, 0x2a, 0xb7, 0x37, 0x90, 0x10, 0x8d, 0xd, 0x36, 0xb6, 0x2b, 0xab, 0xc, 0x8c, 0x11, 0x91, 0x42, 0xc2, 0x5f, 0xdf, 0x78, 0xf8, 0x65, 0xe5, 0x94, 0x14, 0x89, 0x9, 0xae, 0x2e, 0xb3, 0x33, 0xe0, 0x60, 0xfd, 0x7d, 0xda, 0x5a, 0xc7, 0x47, 0x7c, 0xfc, 0x61, 0xe1, 0x46, 0xc6, 0x5b, 0xdb, 0x8, 0x88, 0x15, 0x95, 0x32, 0xb2, 0x2f, 0xaf, 0x59, 0xd9, 0x44, 0xc4, 0x63, 0xe3, 0x7e, 0xfe, 0x2d, 0xad, 0x30, 0xb0, 0x17, 0x97, 0xa, 0x8a, 0xb1, 0x31, 0xac, 0x2c, 0x8b, 0xb, 0x96, 0x16, 0xc5, 0x45, 0xd8, 0x58, 0xff, 0x7f, 0xe2, 0x62}, [256]byte{0x0, 0x81, 0x1f, 0x9e, 0x3e, 0xbf, 0x21, 0xa0, 0x7c, 0xfd, 0x63, 0xe2, 0x42, 0xc3, 0x5d, 0xdc, 0xf8, 0x79, 0xe7, 0x66, 0xc6, 0x47, 0xd9, 0x58, 0x84, 0x5, 0x9b, 0x1a, 0xba, 0x3b, 0xa5, 0x24, 0xed, 0x6c, 0xf2, 0x73, 0xd3, 0x52, 0xcc, 0x4d, 0x91, 0x10, 0x8e, 0xf, 0xaf, 0x2e, 0xb0, 0x31, 0x15, 0x94, 0xa, 0x8b, 0x2b, 0xaa, 0x34, 0xb5, 0x69, 0xe8, 0x76, 0xf7, 0x57, 0xd6, 0x48, 0xc9, 0xc7, 0x46, 0xd8, 0x59, 0xf9, 0x78, 0xe6, 0x67, 0xbb, 0x3a, 0xa4, 0x25, 0x85, 0x4, 0x9a, 0x1b, 0x3f, 0xbe, 0x20, 0xa1, 0x1, 0x80, 0x1e, 0x9f, 0x43, 0xc2, 0x5c, 0xdd, 0x7d, 0xfc, 0x62, 0xe3, 0x2a, 0xab, 0x35, 0xb4, 0x14, 0x95, 0xb, 0x8a, 0x56, 0xd7, 0x49, 0xc8, 0x68, 0xe9, 0x77, 0xf6, 0xd2, 0x53, 0xcd, 0x4c, 0xec, 0x6d, 0xf3, 0x72, 0xae, 0x2f, 0xb1, 0x30, 0x90, 0x11, 0x8f, 0xe, 0x93, 0x12, 0x8c, 0xd, 0xad, 0x2c, 0xb2, 0x33, 0xef, 0x6e, 0xf0, 0x71, 0xd1, 0x50, 0xce, 0x4f, 0x6b, 0xea, 0x74, 0xf5, 0x55, 0xd4, 0x4a, 0xcb, 0x17, 0x96, 0x8, 0x89, 0x29, 0xa8, 0x36, 0xb7, 0x7e, 0xff, 0x61, 0xe0, 0x40, 0xc1, 0x5f, 0xde, 0x2, 0x83, 0x1d, 0x9c, 0x3c, 0xbd, 0x23, 0xa2, 0x86, 0x7, 0x99, 0x18, 0xb8, 0x39, 0xa7, 0x26, 0xfa, 0x7b, 0xe5, 0x64, 0xc4, 0x45, 0xdb, 0x5a, 0x54, 0xd5, 0x4b, 0xca, 0x6a, 0xeb, 0x75, 0xf4, 0x28, 0xa9, 0x37, 0xb6, 0x16, 0x97, 0x9, 0x88, 0xac, 0x2d, 0xb3, 0x32, 0x92, 0x13, 0x8d, 0xc, 0xd0, 0x51, 0xcf, 0x4e, 0xee, 0x6f, 0xf1, 0x70, 0xb9, 0x38, 0xa6, 0x27, 0x87, 0x6, 0x98, 0x19, 0xc5, 0x44, 0xda, 0x5b, 0xfb, 0x7a, 0xe4, 0x65, 0x41, 0xc0, 0x5e, 0xdf, 0x7f, 0xfe, 0x60, 0xe1, 0x3d, 0xbc, 0x22, 0xa3, 0x3, 0x82, 0x1c, 0x9d}, [256]byte{0x0, 0x82, 0x19, 0x9b, 0x32, 0xb0, 0x2b, 0xa9, 0x64, 0xe6, 0x7d, 0xff, 0x56, 0xd4, 0x4f, 0xcd, 0xc8, 0x4a, 0xd1, 0x53, 0xfa, 0x78, 0xe3, 0x61, 0xac, 0x2e, 0xb5, 0x37, 0x9e, 0x1c, 0x87, 0x5, 0x8d, 0xf, 0x94, 0x16, 0xbf, 0x3d, 0xa6, 0x24, 0xe9, 0x6b, 0xf0, 0x72, 0xdb, 0x59, 0xc2, 0x40, 0x45, 0xc7, 0x5c, 0xde, 0x77, 0xf5, 0x6e, 0xec, 0x21, 0xa3, 0x38, 0xba, 0x13, 0x91, 0xa, 0x88, 0x7, 0x85, 0x1e, 0x9c, 0x35, 0xb7, 0x2c, 0xae, 0x63, 0xe1, 0x7a, 0xf8, 0x51, 0xd3, 0x48, 0xca, 0xcf, 0x4d, 0xd6, 0x54, 0xfd, 0x7f, 0xe4, 0x66, 0xab, 0x29, 0xb2, 0x30, 0x99, 0x1b, 0x80, 0x2, 0x8a, 0x8, 0x93, 0x11, 0xb8, 0x3a, 0xa1, 0x23, 0xee, 0x6c, 0xf7, 0x75, 0xdc, 0x5e, 0xc5, 0x47, 0x42, 0xc0, 0x5b, 0xd9, 0x70, 0xf2, 0x69, 0xeb, 0x26, 0xa4, 0x3f, 0xbd, 0x14, 0x96, 0xd, 0x8f, 0xe, 0x8c, 0x17, 0x95, 0x3c, 0xbe, 0x25, 0xa7, 0x6a, 0xe8, 0x73, 0xf1, 0x58, 0xda, 0x41, 0xc3, 0xc6, 0x44, 0xdf, 0x5d, 0xf4, 0x76, 0xed, 0x6f, 0xa2, 0x20, 0xbb, 0x39, 0x90, 0x12, 0x89, 0xb, 0x83, 0x1, 0x9a, 0x18, 0xb1, 0x33, 0xa8, 0x2a, 0xe7, 0x65, 0xfe, 0x7c, 0xd5, 0x57, 0xcc, 0x4e, 0x4b, 0xc9, 0x52, 0xd0, 0x79, 0xfb, 0x60, 0xe2, 0x2f, 0xad, 0x36, 0xb4, 0x1d, 0x9f, 0x4, 0x86, 0x9, 0x8b, 0x10, 0x92, 0x3b, 0xb9, 0x22, 0xa0, 0x6d, 0xef, 0x74, 0xf6, 0x5f, 0xdd, 0x46, 0xc4, 0xc1, 0x43, 0xd8, 0x5a, 0xf3, 0x71, 0xea, 0x68, 0xa5, 0x27, 0xbc, 0x3e, 0x97, 0x15, 0x8e, 0xc, 0x84, 0x6, 0x9d, 0x1f, 0xb6, 0x34, 0xaf, 0x2d, 0xe0, 0x62, 0xf9, 0x7b, 0xd2, 0x50, 0xcb, 0x49, 0x4c, 0xce, 0x55, 0xd7, 0x7e, 0xfc, 0x67, 0xe5, 0x28, 0xaa, 0x31, 0xb3, 0x1a, 0x98, 0x3, 0x81}, [256]byte{0x0, 0x83, 0x1b, 0x98, 0x36, 0xb5, 0x2d, 0xae, 0x6c, 0xef, 0x77, 0xf4, 0x5a, 0xd9, 0x41, 0xc2, 0xd8, 0x5b, 0xc3, 0x40, 0xee, 0x6d, 0xf5, 0x76, 0xb4, 0x37, 0xaf, 0x2c, 0x82, 0x1, 0x99, 0x1a, 0xad, 0x2e, 0xb6, 0x35, 0x9b, 0x18, 0x80, 0x3, 0xc1, 0x42, 0xda, 0x59, 0xf7, 0x74, 0xec, 0x6f, 0x75, 0xf6, 0x6e, 0xed, 0x43, 0xc0, 0x58, 0xdb, 0x19, 0x9a, 0x2, 0x81, 0x2f, 0xac, 0x34, 0xb7, 0x47, 0xc4, 0x5c, 0xdf, 0x71, 0xf2, 0x6a, 0xe9, 0x2b, 0xa8, 0x30, 0xb3, 0x1d, 0x9e, 0x6, 0x85, 0x9f, 0x1c, 0x84, 0x7, 0xa9, 0x2a, 0xb2, 0x31, 0xf3, 0x70, 0xe8, 0x6b, 0xc5, 0x46, 0xde, 0x5d, 0xea, 0x69, 0xf1, 0x72, 0xdc, 0x5f, 0xc7, 0x44, 0x86, 0x5, 0x9d, 0x1e, 0xb0, 0x33, 0xab, 0x28, 0x32, 0xb1, 0x29, 0xaa, 0x4, 0x87, 0x1f, 0x9c, 0x5e, 0xdd, 0x45, 0xc6, 0x68, 0xeb, 0x73, 0xf0, 0x8e, 0xd, 0x95, 0x16, 0xb8, 0x3b, 0xa3, 0x20, 0xe2, 0x61, 0xf9, 0x7a, 0xd4, 0x57, 0xcf, 0x4c, 0x56, 0xd5, 0x4d, 0xce, 0x60, 0xe3, 0x7b, 0xf8, 0x3a, 0xb9, 0x21, 0xa2, 0xc, 0x8f, 0x17, 0x94, 0x23, 0xa0, 0x38, 0xbb, 0x15, 0x96, 0xe, 0x8d, 0x4f, 0xcc, 0x54, 0xd7, 0x79, 0xfa, 0x62, 0xe1, 0xfb, 0x78, 0xe0, 0x63, 0xcd, 0x4e, 0xd6, 0x55, 0x97, 0x14, 0x8c, 0xf, 0xa1, 0x22, 0xba, 0x39, 0xc9, 0x4a, 0xd2, 0x51, 0xff, 0x7c, 0xe4, 0x67, 0xa5, 0x26, 0xbe, 0x3d, 0x93, 0x10, 0x88, 0xb, 0x11, 0x92, 0xa, 0x89, 0x27, 0xa4, 0x3c, 0xbf, 0x7d, 0xfe, 0x66, 0xe5, 0x4b, 0xc8, 0x50, 0xd3, 0x64, 0xe7, 0x7f, 0xfc, 0x52, 0xd1, 0x49, 0xca, 0x8, 0x8b, 0x13, 0x90, 0x3e, 0xbd, 0x25, 0xa6, 0xbc, 0x3f, 0xa7, 0x24, 0x8a, 0x9, 0x91, 0x12, 0xd0, 0x53, 0xcb, 0x48, 0xe6, 0x65, 0xfd, 0x7e}, [256]byte{0x0, 0x84, 0x15, 0x91, 0x2a, 0xae, 0x3f, 0xbb, 0x54, 0xd0, 0x41, 0xc5, 0x7e, 0xfa, 0x6b, 0xef, 0xa8, 0x2c, 0xbd, 0x39, 0x82, 0x6, 0x97, 0x13, 0xfc, 0x78, 0xe9, 0x6d, 0xd6, 0x52, 0xc3, 0x47, 0x4d, 0xc9, 0x58, 0xdc, 0x67, 0xe3, 0x72, 0xf6, 0x19, 0x9d, 0xc, 0x88, 0x33, 0xb7, 0x26, 0xa2, 0xe5, 0x61, 0xf0, 0x74, 0xcf, 0x4b, 0xda, 0x5e, 0xb1, 0x35, 0xa4, 0x20, 0x9b, 0x1f, 0x8e, 0xa, 0x9a, 0x1e, 0x8f, 0xb, 0xb0, 0x34, 0xa5, 0x21, 0xce, 0x4a, 0xdb, 0x5f, 0xe4, 0x60, 0xf1, 0x75, 0x32, 0xb6, 0x27, 0xa3, 0x18, 0x9c, 0xd, 0x89, 0x66, 0xe2, 0x73, 0xf7, 0x4c, 0xc8, 0x59, 0xdd, 0xd7, 0x53, 0xc2, 0x46, 0xfd, 0x79, 0xe8, 0x6c, 0x83, 0x7, 0x96, 0x12, 0xa9, 0x2d, 0xbc, 0x38, 0x7f, 0xfb, 0x6a, 0xee, 0x55, 0xd1, 0x40, 0xc4, 0x2b, 0xaf, 0x3e, 0xba, 0x1, 0x85, 0x14, 0x90, 0x29, 0xad, 0x3c, 0xb8, 0x3, 0x87, 0x16, 0x92, 0x7d, 0xf9, 0x68, 0xec, 0x57, 0xd3, 0x42, 0xc6, 0x81, 0x5, 0x94, 0x10, 0xab, 0x2f, 0xbe, 0x3a, 0xd5, 0x51, 0xc0, 0x44, 0xff, 0x7b, 0xea, 0x6e, 0x64, 0xe0, 0x71, 0xf5, 0x4e, 0xca, 0x5b, 0xdf, 0x30, 0xb4, 0x25, 0xa1, 0x1a, 0x9e, 0xf, 0x8b, 0xcc, 0x48, 0xd9, 0x5d, 0xe6, 0x62, 0xf3, 0x77, 0x98, 0x1c, 0x8d, 0x9, 0xb2, 0x36, 0xa7, 0x23, 0xb3, 0x37, 0xa6, 0x22, 0x99, 0x1d, 0x8c, 0x8, 0xe7, 0x63, 0xf2, 0x76, 0xcd, 0x49, 0xd8, 0x5c, 0x1b, 0x9f, 0xe, 0x8a, 0x31, 0xb5, 0x24, 0xa0, 0x4f, 0xcb, 0x5a, 0xde, 0x65, 0xe1, 0x70, 0xf4, 0xfe, 0x7a, 0xeb, 0x6f, 0xd4, 0x50, 0xc1, 0x45, 0xaa, 0x2e, 0xbf, 0x3b, 0x80, 0x4, 0x95, 0x11, 0x56, 0xd2, 0x43, 0xc7, 0x7c, 0xf8, 0x69, 0xed, 0x2, 0x86, 0x17, 0x93, 0x28, 0xac, 0x3d, 0xb9}, [256]byte{0x0, 0x85, 0x17, 0x92, 0x2e, 0xab, 0x39, 0xbc, 0x5c, 0xd9, 0x4b, 0xce, 0x72, 0xf7, 0x65, 0xe0, 0xb8, 0x3d, 0xaf, 0x2a, 0x96, 0x13, 0x81, 0x4, 0xe4, 0x61, 0xf3, 0x76, 0xca, 0x4f, 0xdd, 0x58, 0x6d, 0xe8, 0x7a, 0xff, 0x43, 0xc6, 0x54, 0xd1, 0x31, 0xb4, 0x26, 0xa3, 0x1f, 0x9a, 0x8, 0x8d, 0xd5, 0x50, 0xc2, 0x47, 0xfb, 0x7e, 0xec, 0x69, 0x89, 0xc, 0x9e, 0x1b, 0xa7, 0x22, 0xb0, 0x35, 0xda, 0x5f, 0xcd, 0x48, 0xf4, 0x71, 0xe3, 0x66, 0x86, 0x3, 0x91, 0x14, 0xa8, 0x2d, 0xbf, 0x3a, 0x62, 0xe7, 0x75, 0xf0, 0x4c, 0xc9, 0x5b, 0xde, 0x3e, 0xbb, 0x29, 0xac, 0x10, 0x95, 0x7, 0x82, 0xb7, 0x32, 0xa0, 0x25, 0x99, 0x1c, 0x8e, 0xb, 0xeb, 0x6e, 0xfc, 0x79, 0xc5, 0x40, 0xd2, 0x57, 0xf, 0x8a, 0x18, 0x9d, 0x21, 0xa4, 0x36, 0xb3, 0x53, 0xd6, 0x44, 0xc1, 0x7d, 0xf8, 0x6a, 0xef, 0xa9, 0x2c, 0xbe, 0x3b, 0x87, 0x2, 0x90, 0x15, 0xf5, 0x70, 0xe2, 0x67, 0xdb, 0x5e, 0xcc, 0x49, 0x11, 0x94, 0x6, 0x83, 0x3f, 0xba, 0x28, 0xad, 0x4d, 0xc8, 0x5a, 0xdf, 0x63, 0xe6, 0x74, 0xf1, 0xc4, 0x41, 0xd3, 0x56, 0xea, 0x6f, 0xfd, 0x78, 0x98, 0x1d, 0x8f, 0xa, 0xb6, 0x33, 0xa1, 0x24, 0x7c, 0xf9, 0x6b, 0xee, 0x52, 0xd7, 0x45, 0xc0, 0x20, 0xa5, 0x37, 0xb2, 0xe, 0x8b, 0x19, 0x9c, 0x73, 0xf6, 0x64, 0xe1, 0x5d, 0xd8, 0x4a, 0xcf, 0x2f, 0xaa, 0x38, 0xbd, 0x1, 0x84, 0x16, 0x93, 0xcb, 0x4e, 0xdc, 0x59, 0xe5, 0x60, 0xf2, 0x77, 0x97, 0x12, 0x80, 0x5, 0xb9, 0x3c, 0xae, 0x2b, 0x1e, 0x9b, 0x9, 0x8c, 0x30, 0xb5, 0x27, 0xa2, 0x42, 0xc7, 0x55, 0xd0, 0x6c, 0xe9, 0x7b, 0xfe, 0xa6, 0x23, 0xb1, 0x34, 0x88, 0xd, 0x9f, 0x1a, 0xfa, 0x7f, 0xed, 0x68, 0xd4, 0x51, 0xc3, 0x46}, [256]byte{0x0, 0x86, 0x11, 0x97, 0x22, 0xa4, 0x33, 0xb5, 0x44, 0xc2, 0x55, 0xd3, 0x66, 0xe0, 0x77, 0xf1, 0x88, 0xe, 0x99, 0x1f, 0xaa, 0x2c, 0xbb, 0x3d, 0xcc, 0x4a, 0xdd, 0x5b, 0xee, 0x68, 0xff, 0x79, 0xd, 0x8b, 0x1c, 0x9a, 0x2f, 0xa9, 0x3e, 0xb8, 0x49, 0xcf, 0x58, 0xde, 0x6b, 0xed, 0x7a, 0xfc, 0x85, 0x3, 0x94, 0x12, 0xa7, 0x21, 0xb6, 0x30, 0xc1, 0x47, 0xd0, 0x56, 0xe3, 0x65, 0xf2, 0x74, 0x1a, 0x9c, 0xb, 0x8d, 0x38, 0xbe, 0x29, 0xaf, 0x5e, 0xd8, 0x4f, 0xc9, 0x7c, 0xfa, 0x6d, 0xeb, 0x92, 0x14, 0x83, 0x5, 0xb0, 0x36, 0xa1, 0x27, 0xd6, 0x50, 0xc7, 0x41, 0xf4, 0x72, 0xe5, 0x63, 0x17, 0x91, 0x6, 0x80, 0x35, 0xb3, 0x24, 0xa2, 0x53, 0xd5, 0x42, 0xc4, 0x71, 0xf7, 0x60, 0xe6, 0x9f, 0x19, 0x8e, 0x8, 0xbd, 0x3b, 0xac, 0x2a, 0xdb, 0x5d, 0xca, 0x4c, 0xf9, 0x7f, 0xe8, 0x6e, 0x34, 0xb2, 0x25, 0xa3, 0x16, 0x90, 0x7, 0x81, 0x70, 0xf6, 0x61, 0xe7, 0x52, 0xd4, 0x43, 0xc5, 0xbc, 0x3a, 0xad, 0x2b, 0x9e, 0x18, 0x8f, 0x9, 0xf8, 0x7e, 0xe9, 0x6f, 0xda, 0x5c, 0xcb, 0x4d, 0x39, 0xbf, 0x28, 0xae, 0x1b, 0x9d, 0xa, 0x8c, 0x7d, 0xfb, 0x6c, 0xea, 0x5f, 0xd9, 0x4e, 0xc8, 0xb1, 0x37, 0xa0, 0x26, 0x93, 0x15, 0x82, 0x4, 0xf5, 0x73, 0xe4, 0x62, 0xd7, 0x51, 0xc6, 0x40, 0x2e, 0xa8, 0x3f, 0xb9, 0xc, 0x8a, 0x1d, 0x9b, 0x6a, 0xec, 0x7b, 0xfd, 0x48, 0xce, 0x59, 0xdf, 0xa6, 0x20, 0xb7, 0x31, 0x84, 0x2, 0x95, 0x13, 0xe2, 0x64, 0xf3, 0x75, 0xc0, 0x46, 0xd1, 0x57, 0x23, 0xa5, 0x32, 0xb4, 0x1, 0x87, 0x10, 0x96, 0x67, 0xe1, 0x76, 0xf0, 0x45, 0xc3, 0x54, 0xd2, 0xab, 0x2d, 0xba, 0x3c, 0x89, 0xf, 0x98, 0x1e, 0xef, 0x69, 0xfe, 0x78, 0xcd, 0x4b, 0xdc, 0x5a}, [256]byte{0x0, 0x87, 0x13, 0x94, 0x26, 0xa1, 0x35, 0xb2, 0x4c, 0xcb, 0x5f, 0xd8, 0x6a, 0xed, 0x79, 0xfe, 0x98, 0x1f, 0x8b, 0xc, 0xbe, 0x39, 0xad, 0x2a, 0xd4, 0x53, 0xc7, 0x40, 0xf2, 0x75, 0xe1, 0x66, 0x2d, 0xaa, 0x3e, 0xb9, 0xb, 0x8c, 0x18, 0x9f, 0x61, 0xe6, 0x72, 0xf5, 0x47, 0xc0, 0x54, 0xd3, 0xb5, 0x32, 0xa6, 0x21, 0x93, 0x14, 0x80, 0x7, 0xf9, 0x7e, 0xea, 0x6d, 0xdf, 0x58, 0xcc, 0x4b, 0x5a, 0xdd, 0x49, 0xce, 0x7c, 0xfb, 0x6f, 0xe8, 0x16, 0x91, 0x5, 0x82, 0x30, 0xb7, 0x23, 0xa4, 0xc2, 0x45, 0xd1, 0x56, 0xe4, 0x63, 0xf7, 0x70, 0x8e, 0x9, 0x9d, 0x1a, 0xa8, 0x2f, 0xbb, 0x3c, 0x77, 0xf0, 0x64, 0xe3, 0x51, 0xd6, 0x42, 0xc5, 0x3b, 0xbc, 0x28, 0xaf, 0x1d, 0x9a, 0xe, 0x89, 0xef, 0x68, 0xfc, 0x7b, 0xc9, 0x4e, 0xda, 0x5d, 0xa3, 0x24, 0xb0, 0x37, 0x85, 0x2, 0x96, 0x11, 0xb4, 0x33, 0xa7, 0x20, 0x92, 0x15, 0x81, 0x6, 0xf8, 0x7f, 0xeb, 0x6c, 0xde, 0x59, 0xcd, 0x4a, 0x2c, 0xab, 0x3f, 0xb8, 0xa, 0x8d, 0x19, 0x9e, 0x60, 0xe7, 0x73, 0xf4, 0x46, 0xc1, 0x55, 0xd2, 0x99, 0x1e, 0x8a, 0xd, 0xbf, 0x38, 0xac, 0x2b, 0xd5, 0x52, 0xc6, 0x41, 0xf3, 0x74, 0xe0, 0x67, 0x1, 0x86, 0x12, 0x95, 0x27, 0xa0, 0x34, 0xb3, 0x4d, 0xca, 0x5e, 0xd9, 0x6b, 0xec, 0x78, 0xff, 0xee, 0x69, 0xfd, 0x7a, 0xc8, 0x4f, 0xdb, 0x5c, 0xa2, 0x25, 0xb1, 0x36, 0x84, 0x3, 0x97, 0x10, 0x76, 0xf1, 0x65, 0xe2, 0x50, 0xd7, 0x43, 0xc4, 0x3a, 0xbd, 0x29, 0xae, 0x1c, 0x9b, 0xf, 0x88, 0xc3, 0x44, 0xd0, 0x57, 0xe5, 0x62, 0xf6, 0x71, 0x8f, 0x8, 0x9c, 0x1b, 0xa9, 0x2e, 0xba, 0x3d, 0x5b, 0xdc, 0x48, 0xcf, 0x7d, 0xfa, 0x6e, 0xe9, 0x17, 0x90, 0x4, 0x83, 0x31, 0xb6, 0x22, 0xa5}, [256]byte{0x0, 0x88, 0xd, 0x85, 0x1a, 0x92, 0x17, 0x9f, 0x34, 0xbc, 0x39, 0xb1, 0x2e, 0xa6, 0x23, 0xab, 0x68, 0xe0, 0x65, 0xed, 0x72, 0xfa, 0x7f, 0xf7, 0x5c, 0xd4, 0x51, 0xd9, 0x46, 0xce, 0x4b, 0xc3, 0xd0, 0x58, 0xdd, 0x55, 0xca, 0x42, 0xc7, 0x4f, 0xe4, 0x6c, 0xe9, 0x61, 0xfe, 0x76, 0xf3, 0x7b, 0xb8, 0x30, 0xb5, 0x3d, 0xa2, 0x2a, 0xaf, 0x27, 0x8c, 0x4, 0x81, 0x9, 0x96, 0x1e, 0x9b, 0x13, 0xbd, 0x35, 0xb0, 0x38, 0xa7, 0x2f, 0xaa, 0x22, 0x89, 0x1, 0x84, 0xc, 0x93, 0x1b, 0x9e, 0x16, 0xd5, 0x5d, 0xd8, 0x50, 0xcf, 0x47, 0xc2, 0x4a, 0xe1, 0x69, 0xec, 0x64, 0xfb, 0x73, 0xf6, 0x7e, 0x6d, 0xe5, 0x60, 0xe8, 0x77, 0xff, 0x7a, 0xf2, 0x59, 0xd1, 0x54, 0xdc, 0x43, 0xcb, 0x4e, 0xc6, 0x5, 0x8d, 0x8, 0x80, 0x1f, 0x97, 0x12, 0x9a, 0x31, 0xb9, 0x3c, 0xb4, 0x2b, 0xa3, 0x26, 0xae, 0x67, 0xef, 0x6a, 0xe2, 0x7d, 0xf5, 0x70, 0xf8, 0x53, 0xdb, 0x5e, 0xd6, 0x49, 0xc1, 0x44, 0xcc, 0xf, 0x87, 0x2, 0x8a, 0x15, 0x9d, 0x18, 0x90, 0x3b, 0xb3, 0x36, 0xbe, 0x21, 0xa9, 0x2c, 0xa4, 0xb7, 0x3f, 0xba, 0x32, 0xad, 0x25, 0xa0, 0x28, 0x83, 0xb, 0x8e, 0x6, 0x99, 0x11, 0x94, 0x1c, 0xdf, 0x57, 0xd2, 0x5a, 0xc5, 0x4d, 0xc8, 0x40, 0xeb, 0x63, 0xe6, 0x6e, 0xf1, 0x79, 0xfc, 0x74, 0xda, 0x52, 0xd7, 0x5f, 0xc0, 0x48, 0xcd, 0x45, 0xee, 0x66, 0xe3, 0x6b, 0xf4, 0x7c, 0xf9, 0x71, 0xb2, 0x3a, 0xbf, 0x37, 0xa8, 0x20, 0xa5, 0x2d, 0x86, 0xe, 0x8b, 0x3, 0x9c, 0x14, 0x91, 0x19, 0xa, 0x82, 0x7, 0x8f, 0x10, 0x98, 0x1d, 0x95, 0x3e, 0xb6, 0x33, 0xbb, 0x24, 0xac, 0x29, 0xa1, 0x62, 0xea, 0x6f, 0xe7, 0x78, 0xf0, 0x75, 0xfd, 0x56, 0xde, 0x5b, 0xd3, 0x4c, 0xc4, 0x41, 0xc9}, [256]byte{0x0, 0x89, 0xf, 0x86, 0x1e, 0x97, 0x11, 0x98, 0x3c, 0xb5, 0x33, 0xba, 0x22, 0xab, 0x2d, 0xa4, 0x78, 0xf1, 0x77, 0xfe, 0x66, 0xef, 0x69, 0xe0, 0x44, 0xcd, 0x4b, 0xc2, 0x5a, 0xd3, 0x55, 0xdc, 0xf0, 0x79, 0xff, 0x76, 0xee, 0x67, 0xe1, 0x68, 0xcc, 0x45, 0xc3, 0x4a, 0xd2, 0x5b, 0xdd, 0x54, 0x88, 0x1, 0x87, 0xe, 0x96, 0x1f, 0x99, 0x10, 0xb4, 0x3d, 0xbb, 0x32, 0xaa, 0x23, 0xa5, 0x2c, 0xfd, 0x74, 0xf2, 0x7b, 0xe3, 0x6a, 0xec, 0x65, 0xc1, 0x48, 0xce, 0x47, 0xdf, 0x56, 0xd0, 0x59, 0x85, 0xc, 0x8a, 0x3, 0x9b, 0x12, 0x94, 0x1d, 0xb9, 0x30, 0xb6, 0x3f, 0xa7, 0x2e, 0xa8, 0x21, 0xd, 0x84, 0x2, 0x8b, 0x13, 0x9a, 0x1c, 0x95, 0x31, 0xb8, 0x3e, 0xb7, 0x2f, 0xa6, 0x20, 0xa9, 0x75, 0xfc, 0x7a, 0xf3, 0x6b, 0xe2, 0x64, 0xed, 0x49, 0xc0, 0x46, 0xcf, 0x57, 0xde, 0x58, 0xd1, 0xe7, 0x6e, 0xe8, 0x61, 0xf9, 0x70, 0xf6, 0x7f, 0xdb, 0x52, 0xd4, 0x5d, 0xc5, 0x4c, 0xca, 0x43, 0x9f, 0x16, 0x90, 0x19, 0x81, 0x8, 0x8e, 0x7, 0xa3, 0x2a, 0xac, 0x25, 0xbd, 0x34, 0xb2, 0x3b, 0x17, 0x9e, 0x18, 0x91, 0x9, 0x80, 0x6, 0x8f, 0x2b, 0xa2, 0x24, 0xad, 0x35, 0xbc, 0x3a, 0xb3, 0x6f, 0xe6, 0x60, 0xe9, 0x71, 0xf8, 0x7e, 0xf7, 0x53, 0xda, 0x5c, 0xd5, 0x4d, 0xc4, 0x42, 0xcb, 0x1a, 0x93, 0x15, 0x9c, 0x4, 0x8d, 0xb, 0x82, 0x26, 0xaf, 0x29, 0xa0, 0x38, 0xb1, 0x37, 0xbe, 0x62, 0xeb, 0x6d, 0xe4, 0x7c, 0xf5, 0x73, 0xfa, 0x5e, 0xd7, 0x51, 0xd8, 0x40, 0xc9, 0x4f, 0xc6, 0xea, 0x63, 0xe5, 0x6c, 0xf4, 0x7d, 0xfb, 0x72, 0xd6, 0x5f, 0xd9, 0x50, 0xc8, 0x41, 0xc7, 0x4e, 0x92, 0x1b, 0x9d, 0x14, 0x8c, 0x5, 0x83, 0xa, 0xae, 0x27, 0xa1, 0x28, 0xb0, 0x39, 0xbf, 0x36}, [256]byte{0x0, 0x8a, 0x9, 0x83, 0x12, 0x98, 0x1b, 0x91, 0x24, 0xae, 0x2d, 0xa7, 0x36, 0xbc, 0x3f, 0xb5, 0x48, 0xc2, 0x41, 0xcb, 0x5a, 0xd0, 0x53, 0xd9, 0x6c, 0xe6, 0x65, 0xef, 0x7e, 0xf4, 0x77, 0xfd, 0x90, 0x1a, 0x99, 0x13, 0x82, 0x8, 0x8b, 0x1, 0xb4, 0x3e, 0xbd, 0x37, 0xa6, 0x2c, 0xaf, 0x25, 0xd8, 0x52, 0xd1, 0x5b, 0xca, 0x40, 0xc3, 0x49, 0xfc, 0x76, 0xf5, 0x7f, 0xee, 0x64, 0xe7, 0x6d, 0x3d, 0xb7, 0x34, 0xbe, 0x2f, 0xa5, 0x26, 0xac, 0x19, 0x93, 0x10, 0x9a, 0xb, 0x81, 0x2, 0x88, 0x75, 0xff, 0x7c, 0xf6, 0x67, 0xed, 0x6e, 0xe4, 0x51, 0xdb, 0x58, 0xd2, 0x43, 0xc9, 0x4a, 0xc0, 0xad, 0x27, 0xa4, 0x2e, 0xbf, 0x35, 0xb6, 0x3c, 0x89, 0x3, 0x80, 0xa, 0x9b, 0x11, 0x92, 0x18, 0xe5, 0x6f, 0xec, 0x66, 0xf7, 0x7d, 0xfe, 0x74, 0xc1, 0x4b, 0xc8, 0x42, 0xd3, 0x59, 0xda, 0x50, 0x7a, 0xf0, 0x73, 0xf9, 0x68, 0xe2, 0x61, 0xeb, 0x5e, 0xd4, 0x57, 0xdd, 0x4c, 0xc6, 0x45, 0xcf, 0x32, 0xb8, 0x3b, 0xb1, 0x20, 0xaa, 0x29, 0xa3, 0x16, 0x9c, 0x1f, 0x95, 0x4, 0x8e, 0xd, 0x87, 0xea, 0x60, 0xe3, 0x69, 0xf8, 0x72, 0xf1, 0x7b, 0xce, 0x44, 0xc7, 0x4d, 0xdc, 0x56, 0xd5, 0x5f, 0xa2, 0x28, 0xab, 0x21, 0xb0, 0x3a, 0xb9, 0x33, 0x86, 0xc, 0x8f, 0x5, 0x94, 0x1e, 0x9d, 0x17, 0x47, 0xcd, 0x4e, 0xc4, 0x55, 0xdf, 0x5c, 0xd6, 0x63, 0xe9, 0x6a, 0xe0, 0x71, 0xfb, 0x78, 0xf2, 0xf, 0x85, 0x6, 0x8c, 0x1d, 0x97, 0x14, 0x9e, 0x2b, 0xa1, 0x22, 0xa8, 0x39, 0xb3, 0x30, 0xba, 0xd7, 0x5d, 0xde, 0x54, 0xc5, 0x4f, 0xcc, 0x46, 0xf3, 0x79, 0xfa, 0x70, 0xe1, 0x6b, 0xe8, 0x62, 0x9f, 0x15, 0x96, 0x1c, 0x8d, 0x7, 0x84, 0xe, 0xbb, 0x31, 0xb2, 0x38, 0xa9, 0x23, 0xa0, 0x2a}, [256]byte{0x0, 0x8b, 0xb, 0x80, 0x16, 0x9d, 0x1d, 0x96, 0x2c, 0xa7, 0x27, 0xac, 0x3a, 0xb1, 0x31, 0xba, 0x58, 0xd3, 0x53, 0xd8, 0x4e, 0xc5, 0x45, 0xce, 0x74, 0xff, 0x7f, 0xf4, 0x62, 0xe9, 0x69, 0xe2, 0xb0, 0x3b, 0xbb, 0x30, 0xa6, 0x2d, 0xad, 0x26, 0x9c, 0x17, 0x97, 0x1c, 0x8a, 0x1, 0x81, 0xa, 0xe8, 0x63, 0xe3, 0x68, 0xfe, 0x75, 0xf5, 0x7e, 0xc4, 0x4f, 0xcf, 0x44, 0xd2, 0x59, 0xd9, 0x52, 0x7d, 0xf6, 0x76, 0xfd, 0x6b, 0xe0, 0x60, 0xeb, 0x51, 0xda, 0x5a, 0xd1, 0x47, 0xcc, 0x4c, 0xc7, 0x25, 0xae, 0x2e, 0xa5, 0x33, 0xb8, 0x38, 0xb3, 0x9, 0x82, 0x2, 0x89, 0x1f, 0x94, 0x14, 0x9f, 0xcd, 0x46, 0xc6, 0x4d, 0xdb, 0x50, 0xd0, 0x5b, 0xe1, 0x6a, 0xea, 0x61, 0xf7, 0x7c, 0xfc, 0x77, 0x95, 0x1e, 0x9e, 0x15, 0x83, 0x8, 0x88, 0x3, 0xb9, 0x32, 0xb2, 0x39, 0xaf, 0x24, 0xa4, 0x2f, 0xfa, 0x71, 0xf1, 0x7a, 0xec, 0x67, 0xe7, 0x6c, 0xd6, 0x5d, 0xdd, 0x56, 0xc0, 0x4b, 0xcb, 0x40, 0xa2, 0x29, 0xa9, 0x22, 0xb4, 0x3f, 0xbf, 0x34, 0x8e, 0x5, 0x85, 0xe, 0x98, 0x13, 0x93, 0x18, 0x4a, 0xc1, 0x41, 0xca, 0x5c, 0xd7, 0x57, 0xdc, 0x66, 0xed, 0x6d, 0xe6, 0x70, 0xfb, 0x7b, 0xf0, 0x12, 0x99, 0x19, 0x92, 0x4, 0x8f, 0xf, 0x84, 0x3e, 0xb5, 0x35, 0xbe, 0x28, 0xa3, 0x23, 0xa8, 0x87, 0xc, 0x8c, 0x7, 0x91, 0x1a, 0x9a, 0x11, 0xab, 0x20, 0xa0, 0x2b, 0xbd, 0x36, 0xb6, 0x3d, 0xdf, 0x54, 0xd4, 0x5f, 0xc9, 0x42, 0xc2, 0x49, 0xf3, 0x78, 0xf8, 0x73, 0xe5, 0x6e, 0xee, 0x65, 0x37, 0xbc, 0x3c, 0xb7, 0x21, 0xaa, 0x2a, 0xa1, 0x1b, 0x90, 0x10, 0x9b, 0xd, 0x86, 0x6, 0x8d, 0x6f, 0xe4, 0x64, 0xef, 0x79, 0xf2, 0x72, 0xf9, 0x43, 0xc8, 0x48, 0xc3, 0x55, 0xde, 0x5e, 0xd5}, [256]byte{0x0, 0x8c, 0x5, 0x89, 0xa, 0x86, 0xf, 0x83, 0x14, 0x98, 0x11, 0x9d, 0x1e, 0x92, 0x1b, 0x97, 0x28, 0xa4, 0x2d, 0xa1, 0x22, 0xae, 0x27, 0xab, 0x3c, 0xb0, 0x39, 0xb5, 0x36, 0xba, 0x33, 0xbf, 0x50, 0xdc, 0x55, 0xd9, 0x5a, 0xd6, 0x5f, 0xd3, 0x44, 0xc8, 0x41, 0xcd, 0x4e, 0xc2, 0x4b, 0xc7, 0x78, 0xf4, 0x7d, 0xf1, 0x72, 0xfe, 0x77, 0xfb, 0x6c, 0xe0, 0x69, 0xe5, 0x66, 0xea, 0x63, 0xef, 0xa0, 0x2c, 0xa5, 0x29, 0xaa, 0x26, 0xaf, 0x23, 0xb4, 0x38, 0xb1, 0x3d, 0xbe, 0x32, 0xbb, 0x37, 0x88, 0x4, 0x8d, 0x1, 0x82, 0xe, 0x87, 0xb, 0x9c, 0x10, 0x99, 0x15, 0x96, 0x1a, 0x93, 0x1f, 0xf0, 0x7c, 0xf5, 0x79, 0xfa, 0x76, 0xff, 0x73, 0xe4, 0x68, 0xe1, 0x6d, 0xee, 0x62, 0xeb, 0x67, 0xd8, 0x54, 0xdd, 0x51, 0xd2, 0x5e, 0xd7, 0x5b, 0xcc, 0x40, 0xc9, 0x45, 0xc6, 0x4a, 0xc3, 0x4f, 0x5d, 0xd1, 0x58, 0xd4, 0x57, 0xdb, 0x52, 0xde, 0x49, 0xc5, 0x4c, 0xc0, 0x43, 0xcf, 0x46, 0xca, 0x75, 0xf9, 0x70, 0xfc, 0x7f, 0xf3, 0x7a, 0xf6, 0x61, 0xed, 0x64, 0xe8, 0x6b, 0xe7, 0x6e, 0xe2, 0xd, 0x81, 0x8, 0x84, 0x7, 0x8b, 0x2, 0x8e, 0x19, 0x95, 0x1c, 0x90, 0x13, 0x9f, 0x16, 0x9a, 0x25, 0xa9, 0x20, 0xac, 0x2f, 0xa3, 0x2a, 0xa6, 0x31, 0xbd, 0x34, 0xb8, 0x3b, 0xb7, 0x3e, 0xb2, 0xfd, 0x71, 0xf8, 0x74, 0xf7, 0x7b, 0xf2, 0x7e, 0xe9, 0x65, 0xec, 0x60, 0xe3, 0x6f, 0xe6, 0x6a, 0xd5, 0x59, 0xd0, 0x5c, 0xdf, 0x53, 0xda, 0x56, 0xc1, 0x4d, 0xc4, 0x48, 0xcb, 0x47, 0xce, 0x42, 0xad, 0x21, 0xa8, 0x24, 0xa7, 0x2b, 0xa2, 0x2e, 0xb9, 0x35, 0xbc, 0x30, 0xb3, 0x3f, 0xb6, 0x3a, 0x85, 0x9, 0x80, 0xc, 0x8f, 0x3, 0x8a, 0x6, 0x91, 0x1d, 0x94, 0x18, 0x9b, 0x17, 0x9e, 0x12}, [256]byte{0x0, 0x8d, 0x7, 0x8a, 0xe, 0x83, 0x9, 0x84, 0x1c, 0x91, 0x1b, 0x96, 0x12, 0x9f, 0x15, 0x98, 0x38, 0xb5, 0x3f, 0xb2, 0x36, 0xbb, 0x31, 0xbc, 0x24, 0xa9, 0x23, 0xae, 0x2a, 0xa7, 0x2d, 0xa0, 0x70, 0xfd, 0x77, 0xfa, 0x7e, 0xf3, 0x79, 0xf4, 0x6c, 0xe1, 0x6b, 0xe6, 0x62, 0xef, 0x65, 0xe8, 0x48, 0xc5, 0x4f, 0xc2, 0x46, 0xcb, 0x41, 0xcc, 0x54, 0xd9, 0x53, 0xde, 0x5a, 0xd7, 0x5d, 0xd0, 0xe0, 0x6d, 0xe7, 0x6a, 0xee, 0x63, 0xe9, 0x64, 0xfc, 0x71, 0xfb, 0x76, 0xf2, 0x7f, 0xf5, 0x78, 0xd8, 0x55, 0xdf, 0x52, 0xd6, 0x5b, 0xd1, 0x5c, 0xc4, 0x49, 0xc3, 0x4e, 0xca, 0x47, 0xcd, 0x40, 0x90, 0x1d, 0x97, 0x1a, 0x9e, 0x13, 0x99, 0x14, 0x8c, 0x1, 0x8b, 0x6, 0x82, 0xf, 0x85, 0x8, 0xa8, 0x25, 0xaf, 0x22, 0xa6, 0x2b, 0xa1, 0x2c, 0xb4, 0x39, 0xb3, 0x3e, 0xba, 0x37, 0xbd, 0x30, 0xdd, 0x50, 0xda, 0x57, 0xd3, 0x5e, 0xd4, 0x59, 0xc1, 0x4c, 0xc6, 0x4b, 0xcf, 0x42, 0xc8, 0x45, 0xe5, 0x68, 0xe2, 0x6f, 0xeb, 0x66, 0xec, 0x61, 0xf9, 0x74, 0xfe, 0x73, 0xf7, 0x7a, 0xf0, 0x7d, 0xad, 0x20, 0xaa, 0x27, 0xa3, 0x2e, 0xa4, 0x29, 0xb1, 0x3c, 0xb6, 0x3b, 0xbf, 0x32, 0xb8, 0x35, 0x95, 0x18, 0x92, 0x1f, 0x9b, 0x16, 0x9c, 0x11, 0x89, 0x4, 0x8e, 0x3, 0x87, 0xa, 0x80, 0xd, 0x3d, 0xb0, 0x3a, 0xb7, 0x33, 0xbe, 0x34, 0xb9, 0x21, 0xac, 0x26, 0xab, 0x2f, 0xa2, 0x28, 0xa5, 0x5, 0x88, 0x2, 0x8f, 0xb, 0x86, 0xc, 0x81, 0x19, 0x94, 0x1e, 0x93, 0x17, 0x9a, 0x10, 0x9d, 0x4d, 0xc0, 0x4a, 0xc7, 0x43, 0xce, 0x44, 0xc9, 0x51, 0xdc, 0x56, 0xdb, 0x5f, 0xd2, 0x58, 0xd5, 0x75, 0xf8, 0x72, 0xff, 0x7b, 0xf6, 0x7c, 0xf1, 0x69, 0xe4, 0x6e, 0xe3, 0x67, 0xea, 0x60, 0xed}, [256]byte{0x0, 0x8e, 0x1, 0x8f, 0x2, 0x8c, 0x3, 0x8d, 0x4, 0x8a, 0x5, 0x8b, 0x6, 0x88, 0x7, 0x89, 0x8, 0x86, 0x9, 0x87, 0xa, 0x84, 0xb, 0x85, 0xc, 0x82, 0xd, 0x83, 0xe, 0x80, 0xf, 0x81, 0x10, 0x9e, 0x11, 0x9f, 0x12, 0x9c, 0x13, 0x9d, 0x14, 0x9a, 0x15, 0x9b, 0x16, 0x98, 0x17, 0x99, 0x18, 0x96, 0x19, 0x97, 0x1a, 0x94, 0x1b, 0x95, 0x1c, 0x92, 0x1d, 0x93, 0x1e, 0x90, 0x1f, 0x91, 0x20, 0xae, 0x21, 0xaf, 0x22, 0xac, 0x23, 0xad, 0x24, 0xaa, 0x25, 0xab, 0x26, 0xa8, 0x27, 0xa9, 0x28, 0xa6, 0x29, 0xa7, 0x2a, 0xa4, 0x2b, 0xa5, 0x2c, 0xa2, 0x2d, 0xa3, 0x2e, 0xa0, 0x2f, 0xa1, 0x30, 0xbe, 0x31, 0xbf, 0x32, 0xbc, 0x33, 0xbd, 0x34, 0xba, 0x35, 0xbb, 0x36, 0xb8, 0x37, 0xb9, 0x38, 0xb6, 0x39, 0xb7, 0x3a, 0xb4, 0x3b, 0xb5, 0x3c, 0xb2, 0x3d, 0xb3, 0x3e, 0xb0, 0x3f, 0xb1, 0x40, 0xce, 0x41, 0xcf, 0x42, 0xcc, 0x43, 0xcd, 0x44, 0xca, 0x45, 0xcb, 0x46, 0xc8, 0x47, 0xc9, 0x48, 0xc6, 0x49, 0xc7, 0x4a, 0xc4, 0x4b, 0xc5, 0x4c, 0xc2, 0x4d, 0xc3, 0x4e, 0xc0, 0x4f, 0xc1, 0x50, 0xde, 0x51, 0xdf, 0x52, 0xdc, 0x53, 0xdd, 0x54, 0xda, 0x55, 0xdb, 0x56, 0xd8, 0x57, 0xd9, 0x58, 0xd6, 0x59, 0xd7, 0x5a, 0xd4, 0x5b, 0xd5, 0x5c, 0xd2, 0x5d, 0xd3, 0x5e, 0xd0, 0x5f, 0xd1, 0x60, 0xee, 0x61, 0xef, 0x62, 0xec, 0x63, 0xed, 0x64, 0xea, 0x65, 0xeb, 0x66, 0xe8, 0x67, 0xe9, 0x68, 0xe6, 0x69, 0xe7, 0x6a, 0xe4, 0x6b, 0xe5, 0x6c, 0xe2, 0x6d, 0xe3, 0x6e, 0xe0, 0x6f, 0xe1, 0x70, 0xfe, 0x71, 0xff, 0x72, 0xfc, 0x73, 0xfd, 0x74, 0xfa, 0x75, 0xfb, 0x76, 0xf8, 0x77, 0xf9, 0x78, 0xf6, 0x79, 0xf7, 0x7a, 0xf4, 0x7b, 0xf5, 0x7c, 0xf2, 0x7d, 0xf3, 0x7e, 0xf0, 0x7f, 0xf1}, [256]byte{0x0, 0x8f, 0x3, 0x8c, 0x6, 0x89, 0x5, 0x8a, 0xc, 0x83, 0xf, 0x80, 0xa, 0x85, 0x9, 0x86, 0x18, 0x97, 0x1b, 0x94, 0x1e, 0x91, 0x1d, 0x92, 0x14, 0x9b, 0x17, 0x98, 0x12, 0x9d, 0x11, 0x9e, 0x30, 0xbf, 0x33, 0xbc, 0x36, 0xb9, 0x35, 0xba, 0x3c, 0xb3, 0x3f, 0xb0, 0x3a, 0xb5, 0x39, 0xb6, 0x28, 0xa7, 0x2b, 0xa4, 0x2e, 0xa1, 0x2d, 0xa2, 0x24, 0xab, 0x27, 0xa8, 0x22, 0xad, 0x21, 0xae, 0x60, 0xef, 0x63, 0xec, 0x66, 0xe9, 0x65, 0xea, 0x6c, 0xe3, 0x6f, 0xe0, 0x6a, 0xe5, 0x69, 0xe6, 0x78, 0xf7, 0x7b, 0xf4, 0x7e, 0xf1, 0x7d, 0xf2, 0x74, 0xfb, 0x77, 0xf8, 0x72, 0xfd, 0x71, 0xfe, 0x50, 0xdf, 0x53, 0xdc, 0x56, 0xd9, 0x55, 0xda, 0x5c, 0xd3, 0x5f, 0xd0, 0x5a, 0xd5, 0x59, 0xd6, 0x48, 0xc7, 0x4b, 0xc4, 0x4e, 0xc1, 0x4d, 0xc2, 0x44, 0xcb, 0x47, 0xc8, 0x42, 0xcd, 0x41, 0xce, 0xc0, 0x4f, 0xc3, 0x4c, 0xc6, 0x49, 0xc5, 0x4a, 0xcc, 0x43, 0xcf, 0x40, 0xca, 0x45, 0xc9, 0x46, 0xd8, 0x57, 0xdb, 0x54, 0xde, 0x51, 0xdd, 0x52, 0xd4, 0x5b, 0xd7, 0x58, 0xd2, 0x5d, 0xd1, 0x5e, 0xf0, 0x7f, 0xf3, 0x7c, 0xf6, 0x79, 0xf5, 0x7a, 0xfc, 0x73, 0xff, 0x70, 0xfa, 0x75, 0xf9, 0x76, 0xe8, 0x67, 0xeb, 0x64, 0xee, 0x61, 0xed, 0x62, 0xe4, 0x6b, 0xe7, 0x68, 0xe2, 0x6d, 0xe1, 0x6e, 0xa0, 0x2f, 0xa3, 0x2c, 0xa6, 0x29, 0xa5, 0x2a, 0xac, 0x23, 0xaf, 0x20, 0xaa, 0x25, 0xa9, 0x26, 0xb8, 0x37, 0xbb, 0x34, 0xbe, 0x31, 0xbd, 0x32, 0xb4, 0x3b, 0xb7, 0x38, 0xb2, 0x3d, 0xb1, 0x3e, 0x90, 0x1f, 0x93, 0x1c, 0x96, 0x19, 0x95, 0x1a, 0x9c, 0x13, 0x9f, 0x10, 0x9a, 0x15, 0x99, 0x16, 0x88, 0x7, 0x8b, 0x4, 0x8e, 0x1, 0x8d, 0x2, 0x84, 0xb, 0x87, 0x8, 0x82, 0xd, 0x81, 0xe}, [256]byte{0x0, 0x90, 0x3d, 0xad, 0x7a, 0xea, 0x47, 0xd7, 0xf4, 0x64, 0xc9, 0x59, 0x8e, 0x1e, 0xb3, 0x23, 0xf5, 0x65, 0xc8, 0x58, 0x8f, 0x1f, 0xb2, 0x22, 0x1, 0x91, 0x3c, 0xac, 0x7b, 0xeb, 0x46, 0xd6, 0xf7, 0x67, 0xca, 0x5a, 0x8d, 0x1d, 0xb0, 0x20, 0x3, 0x93, 0x3e, 0xae, 0x79, 0xe9, 0x44, 0xd4, 0x2, 0x92, 0x3f, 0xaf, 0x78, 0xe8, 0x45, 0xd5, 0xf6, 0x66, 0xcb, 0x5b, 0x8c, 0x1c, 0xb1, 0x21, 0xf3, 0x63, 0xce, 0x5e, 0x89, 0x19, 0xb4, 0x24, 0x7, 0x97, 0x3a, 0xaa, 0x7d, 0xed, 0x40, 0xd0, 0x6, 0x96, 0x3b, 0xab, 0x7c, 0xec, 0x41, 0xd1, 0xf2, 0x62, 0xcf, 0x5f, 0x88, 0x18, 0xb5, 0x25, 0x4, 0x94, 0x39, 0xa9, 0x7e, 0xee, 0x43, 0xd3, 0xf0, 0x60, 0xcd, 0x5d, 0x8a, 0x1a, 0xb7, 0x27, 0xf1, 0x61, 0xcc, 0x5c, 0x8b, 0x1b, 0xb6, 0x26, 0x5, 0x95, 0x38, 0xa8, 0x7f, 0xef, 0x42, 0xd2, 0xfb, 0x6b, 0xc6, 0x56, 0x81, 0x11, 0xbc, 0x2c, 0xf, 0x9f, 0x32, 0xa2, 0x75, 0xe5, 0x48, 0xd8, 0xe, 0x9e, 0x33, 0xa3, 0x74, 0xe4, 0x49, 0xd9, 0xfa, 0x6a, 0xc7, 0x57, 0x80, 0x10, 0xbd, 0x2d, 0xc, 0x9c, 0x31, 0xa1, 0x76, 0xe6, 0x4b, 0xdb, 0xf8, 0x68, 0xc5, 0x55, 0x82, 0x12, 0xbf, 0x2f, 0xf9, 0x69, 0xc4, 0x54, 0x83, 0x13, 0xbe, 0x2e, 0xd, 0x9d, 0x30, 0xa0, 0x77, 0xe7, 0x4a, 0xda, 0x8, 0x98, 0x35, 0xa5, 0x72, 0xe2, 0x4f, 0xdf, 0xfc, 0x6c, 0xc1, 0x51, 0x86, 0x16, 0xbb, 0x2b, 0xfd, 0x6d, 0xc0, 0x50, 0x87, 0x17, 0xba, 0x2a, 0x9, 0x99, 0x34, 0xa4, 0x73, 0xe3, 0x4e, 0xde, 0xff, 0x6f, 0xc2, 0x52, 0x85, 0x15, 0xb8, 0x28, 0xb, 0x9b, 0x36, 0xa6, 0x71, 0xe1, 0x4c, 0xdc, 0xa, 0x9a, 0x37, 0xa7, 0x70, 0xe0, 0x4d, 0xdd, 0xfe, 0x6e, 0xc3, 0x53, 0x84, 0x14, 0xb9, 0x29}, [256]byte{0x0, 0x91, 0x3f, 0xae, 0x7e, 0xef, 0x41, 0xd0, 0xfc, 0x6d, 0xc3, 0x52, 0x82, 0x13, 0xbd, 0x2c, 0xe5, 0x74, 0xda, 0x4b, 0x9b, 0xa, 0xa4, 0x35, 0x19, 0x88, 0x26, 0xb7, 0x67, 0xf6, 0x58, 0xc9, 0xd7, 0x46, 0xe8, 0x79, 0xa9, 0x38, 0x96, 0x7, 0x2b, 0xba, 0x14, 0x85, 0x55, 0xc4, 0x6a, 0xfb, 0x32, 0xa3, 0xd, 0x9c, 0x4c, 0xdd, 0x73, 0xe2, 0xce, 0x5f, 0xf1, 0x60, 0xb0, 0x21, 0x8f, 0x1e, 0xb3, 0x22, 0x8c, 0x1d, 0xcd, 0x5c, 0xf2, 0x63, 0x4f, 0xde, 0x70, 0xe1, 0x31, 0xa0, 0xe, 0x9f, 0x56, 0xc7, 0x69, 0xf8, 0x28, 0xb9, 0x17, 0x86, 0xaa, 0x3b, 0x95, 0x4, 0xd4, 0x45, 0xeb, 0x7a, 0x64, 0xf5, 0x5b, 0xca, 0x1a, 0x8b, 0x25, 0xb4, 0x98, 0x9, 0xa7, 0x36, 0xe6, 0x77, 0xd9, 0x48, 0x81, 0x10, 0xbe, 0x2f, 0xff, 0x6e, 0xc0, 0x51, 0x7d, 0xec, 0x42, 0xd3, 0x3, 0x92, 0x3c, 0xad, 0x7b, 0xea, 0x44, 0xd5, 0x5, 0x94, 0x3a, 0xab, 0x87, 0x16, 0xb8, 0x29, 0xf9, 0x68, 0xc6, 0x57, 0x9e, 0xf, 0xa1, 0x30, 0xe0, 0x71, 0xdf, 0x4e, 0x62, 0xf3, 0x5d, 0xcc, 0x1c, 0x8d, 0x23, 0xb2, 0xac, 0x3d, 0x93, 0x2, 0xd2, 0x43, 0xed, 0x7c, 0x50, 0xc1, 0x6f, 0xfe, 0x2e, 0xbf, 0x11, 0x80, 0x49, 0xd8, 0x76, 0xe7, 0x37, 0xa6, 0x8, 0x99, 0xb5, 0x24, 0x8a, 0x1b, 0xcb, 0x5a, 0xf4, 0x65, 0xc8, 0x59, 0xf7, 0x66, 0xb6, 0x27, 0x89, 0x18, 0x34, 0xa5, 0xb, 0x9a, 0x4a, 0xdb, 0x75, 0xe4, 0x2d, 0xbc, 0x12, 0x83, 0x53, 0xc2, 0x6c, 0xfd, 0xd1, 0x40, 0xee, 0x7f, 0xaf, 0x3e, 0x90, 0x1, 0x1f, 0x8e, 0x20, 0xb1, 0x61, 0xf0, 0x5e, 0xcf, 0xe3, 0x72, 0xdc, 0x4d, 0x9d, 0xc, 0xa2, 0x33, 0xfa, 0x6b, 0xc5, 0x54, 0x84, 0x15, 0xbb, 0x2a, 0x6, 0x97, 0x39, 0xa8, 0x78, 0xe9, 0x47, 0xd6}, [256]byte{0x0, 0x92, 0x39, 0xab, 0x72, 0xe0, 0x4b, 0xd9, 0xe4, 0x76, 0xdd, 0x4f, 0x96, 0x4, 0xaf, 0x3d, 0xd5, 0x47, 0xec, 0x7e, 0xa7, 0x35, 0x9e, 0xc, 0x31, 0xa3, 0x8, 0x9a, 0x43, 0xd1, 0x7a, 0xe8, 0xb7, 0x25, 0x8e, 0x1c, 0xc5, 0x57, 0xfc, 0x6e, 0x53, 0xc1, 0x6a, 0xf8, 0x21, 0xb3, 0x18, 0x8a, 0x62, 0xf0, 0x5b, 0xc9, 0x10, 0x82, 0x29, 0xbb, 0x86, 0x14, 0xbf, 0x2d, 0xf4, 0x66, 0xcd, 0x5f, 0x73, 0xe1, 0x4a, 0xd8, 0x1, 0x93, 0x38, 0xaa, 0x97, 0x5, 0xae, 0x3c, 0xe5, 0x77, 0xdc, 0x4e, 0xa6, 0x34, 0x9f, 0xd, 0xd4, 0x46, 0xed, 0x7f, 0x42, 0xd0, 0x7b, 0xe9, 0x30, 0xa2, 0x9, 0x9b, 0xc4, 0x56, 0xfd, 0x6f, 0xb6, 0x24, 0x8f, 0x1d, 0x20, 0xb2, 0x19, 0x8b, 0x52, 0xc0, 0x6b, 0xf9, 0x11, 0x83, 0x28, 0xba, 0x63, 0xf1, 0x5a, 0xc8, 0xf5, 0x67, 0xcc, 0x5e, 0x87, 0x15, 0xbe, 0x2c, 0xe6, 0x74, 0xdf, 0x4d, 0x94, 0x6, 0xad, 0x3f, 0x2, 0x90, 0x3b, 0xa9, 0x70, 0xe2, 0x49, 0xdb, 0x33, 0xa1, 0xa, 0x98, 0x41, 0xd3, 0x78, 0xea, 0xd7, 0x45, 0xee, 0x7c, 0xa5, 0x37, 0x9c, 0xe, 0x51, 0xc3, 0x68, 0xfa, 0x23, 0xb1, 0x1a, 0x88, 0xb5, 0x27, 0x8c, 0x1e, 0xc7, 0x55, 0xfe, 0x6c, 0x84, 0x16, 0xbd, 0x2f, 0xf6, 0x64, 0xcf, 0x5d, 0x60, 0xf2, 0x59, 0xcb, 0x12, 0x80, 0x2b, 0xb9, 0x95, 0x7, 0xac, 0x3e, 0xe7, 0x75, 0xde, 0x4c, 0x71, 0xe3, 0x48, 0xda, 0x3, 0x91, 0x3a, 0xa8, 0x40, 0xd2, 0x79, 0xeb, 0x32, 0xa0, 0xb, 0x99, 0xa4, 0x36, 0x9d, 0xf, 0xd6, 0x44, 0xef, 0x7d, 0x22, 0xb0, 0x1b, 0x89, 0x50, 0xc2, 0x69, 0xfb, 0xc6, 0x54, 0xff, 0x6d, 0xb4, 0x26, 0x8d, 0x1f, 0xf7, 0x65, 0xce, 0x5c, 0x85, 0x17, 0xbc, 0x2e, 0x13, 0x81, 0x2a, 0xb8, 0x61, 0xf3, 0x58, 0xca}, [256]byte{0x0, 0x93, 0x3b, 0xa8, 0x76, 0xe5, 0x4d, 0xde, 0xec, 0x7f, 0xd7, 0x44, 0x9a, 0x9, 0xa1, 0x32, 0xc5, 0x56, 0xfe, 0x6d, 0xb3, 0x20, 0x88, 0x1b, 0x29, 0xba, 0x12, 0x81, 0x5f, 0xcc, 0x64, 0xf7, 0x97, 0x4, 0xac, 0x3f, 0xe1, 0x72, 0xda, 0x49, 0x7b, 0xe8, 0x40, 0xd3, 0xd, 0x9e, 0x36, 0xa5, 0x52, 0xc1, 0x69, 0xfa, 0x24, 0xb7, 0x1f, 0x8c, 0xbe, 0x2d, 0x85, 0x16, 0xc8, 0x5b, 0xf3, 0x60, 0x33, 0xa0, 0x8, 0x9b, 0x45, 0xd6, 0x7e, 0xed, 0xdf, 0x4c, 0xe4, 0x77, 0xa9, 0x3a, 0x92, 0x1, 0xf6, 0x65, 0xcd, 0x5e, 0x80, 0x13, 0xbb, 0x28, 0x1a, 0x89, 0x21, 0xb2, 0x6c, 0xff, 0x57, 0xc4, 0xa4, 0x37, 0x9f, 0xc, 0xd2, 0x41, 0xe9, 0x7a, 0x48, 0xdb, 0x73, 0xe0, 0x3e, 0xad, 0x5, 0x96, 0x61, 0xf2, 0x5a, 0xc9, 0x17, 0x84, 0x2c, 0xbf, 0x8d, 0x1e, 0xb6, 0x25, 0xfb, 0x68, 0xc0, 0x53, 0x66, 0xf5, 0x5d, 0xce, 0x10, 0x83, 0x2b, 0xb8, 0x8a, 0x19, 0xb1, 0x22, 0xfc, 0x6f, 0xc7, 0x54, 0xa3, 0x30, 0x98, 0xb, 0xd5, 0x46, 0xee, 0x7d, 0x4f, 0xdc, 0x74, 0xe7, 0x39, 0xaa, 0x2, 0x91, 0xf1, 0x62, 0xca, 0x59, 0x87, 0x14, 0xbc, 0x2f, 0x1d, 0x8e, 0x26, 0xb5, 0x6b, 0xf8, 0x50, 0xc3, 0x34, 0xa7, 0xf, 0x9c, 0x42, 0xd1, 0x79, 0xea, 0xd8, 0x4b, 0xe3, 0x70, 0xae, 0x3d, 0x95, 0x6, 0x55, 0xc6, 0x6e, 0xfd, 0x23, 0xb0, 0x18, 0x8b, 0xb9, 0x2a, 0x82, 0x11, 0xcf, 0x5c, 0xf4, 0x67, 0x90, 0x3, 0xab, 0x38, 0xe6, 0x75, 0xdd, 0x4e, 0x7c, 0xef, 0x47, 0xd4, 0xa, 0x99, 0x31, 0xa2, 0xc2, 0x51, 0xf9, 0x6a, 0xb4, 0x27, 0x8f, 0x1c, 0x2e, 0xbd, 0x15, 0x86, 0x58, 0xcb, 0x63, 0xf0, 0x7, 0x94, 0x3c, 0xaf, 0x71, 0xe2, 0x4a, 0xd9, 0xeb, 0x78, 0xd0, 0x43, 0x9d, 0xe, 0xa6, 0x35}, [256]byte{0x0, 0x94, 0x35, 0xa1, 0x6a, 0xfe, 0x5f, 0xcb, 0xd4, 0x40, 0xe1, 0x75, 0xbe, 0x2a, 0x8b, 0x1f, 0xb5, 0x21, 0x80, 0x14, 0xdf, 0x4b, 0xea, 0x7e, 0x61, 0xf5, 0x54, 0xc0, 0xb, 0x9f, 0x3e, 0xaa, 0x77, 0xe3, 0x42, 0xd6, 0x1d, 0x89, 0x28, 0xbc, 0xa3, 0x37, 0x96, 0x2, 0xc9, 0x5d, 0xfc, 0x68, 0xc2, 0x56, 0xf7, 0x63, 0xa8, 0x3c, 0x9d, 0x9, 0x16, 0x82, 0x23, 0xb7, 0x7c, 0xe8, 0x49, 0xdd, 0xee, 0x7a, 0xdb, 0x4f, 0x84, 0x10, 0xb1, 0x25, 0x3a, 0xae, 0xf, 0x9b, 0x50, 0xc4, 0x65, 0xf1, 0x5b, 0xcf, 0x6e, 0xfa, 0x31, 0xa5, 0x4, 0x90, 0x8f, 0x1b, 0xba, 0x2e, 0xe5, 0x71, 0xd0, 0x44, 0x99, 0xd, 0xac, 0x38, 0xf3, 0x67, 0xc6, 0x52, 0x4d, 0xd9, 0x78, 0xec, 0x27, 0xb3, 0x12, 0x86, 0x2c, 0xb8, 0x19, 0x8d, 0x46, 0xd2, 0x73, 0xe7, 0xf8, 0x6c, 0xcd, 0x59, 0x92, 0x6, 0xa7, 0x33, 0xc1, 0x55, 0xf4, 0x60, 0xab, 0x3f, 0x9e, 0xa, 0x15, 0x81, 0x20, 0xb4, 0x7f, 0xeb, 0x4a, 0xde, 0x74, 0xe0, 0x41, 0xd5, 0x1e, 0x8a, 0x2b, 0xbf, 0xa0, 0x34, 0x95, 0x1, 0xca, 0x5e, 0xff, 0x6b, 0xb6, 0x22, 0x83, 0x17, 0xdc, 0x48, 0xe9, 0x7d, 0x62, 0xf6, 0x57, 0xc3, 0x8, 0x9c, 0x3d, 0xa9, 0x3, 0x97, 0x36, 0xa2, 0x69, 0xfd, 0x5c, 0xc8, 0xd7, 0x43, 0xe2, 0x76, 0xbd, 0x29, 0x88, 0x1c, 0x2f, 0xbb, 0x1a, 0x8e, 0x45, 0xd1, 0x70, 0xe4, 0xfb, 0x6f, 0xce, 0x5a, 0x91, 0x5, 0xa4, 0x30, 0x9a, 0xe, 0xaf, 0x3b, 0xf0, 0x64, 0xc5, 0x51, 0x4e, 0xda, 0x7b, 0xef, 0x24, 0xb0, 0x11, 0x85, 0x58, 0xcc, 0x6d, 0xf9, 0x32, 0xa6, 0x7, 0x93, 0x8c, 0x18, 0xb9, 0x2d, 0xe6, 0x72, 0xd3, 0x47, 0xed, 0x79, 0xd8, 0x4c, 0x87, 0x13, 0xb2, 0x26, 0x39, 0xad, 0xc, 0x98, 0x53, 0xc7, 0x66, 0xf2}, [256]byte{0x0, 0x95, 0x37, 0xa2, 0x6e, 0xfb, 0x59, 0xcc, 0xdc, 0x49, 0xeb, 0x7e, 0xb2, 0x27, 0x85, 0x10, 0xa5, 0x30, 0x92, 0x7, 0xcb, 0x5e, 0xfc, 0x69, 0x79, 0xec, 0x4e, 0xdb, 0x17, 0x82, 0x20, 0xb5, 0x57, 0xc2, 0x60, 0xf5, 0x39, 0xac, 0xe, 0x9b, 0x8b, 0x1e, 0xbc, 0x29, 0xe5, 0x70, 0xd2, 0x47, 0xf2, 0x67, 0xc5, 0x50, 0x9c, 0x9, 0xab, 0x3e, 0x2e, 0xbb, 0x19, 0x8c, 0x40, 0xd5, 0x77, 0xe2, 0xae, 0x3b, 0x99, 0xc, 0xc0, 0x55, 0xf7, 0x62, 0x72, 0xe7, 0x45, 0xd0, 0x1c, 0x89, 0x2b, 0xbe, 0xb, 0x9e, 0x3c, 0xa9, 0x65, 0xf0, 0x52, 0xc7, 0xd7, 0x42, 0xe0, 0x75, 0xb9, 0x2c, 0x8e, 0x1b, 0xf9, 0x6c, 0xce, 0x5b, 0x97, 0x2, 0xa0, 0x35, 0x25, 0xb0, 0x12, 0x87, 0x4b, 0xde, 0x7c, 0xe9, 0x5c, 0xc9, 0x6b, 0xfe, 0x32, 0xa7, 0x5, 0x90, 0x80, 0x15, 0xb7, 0x22, 0xee, 0x7b, 0xd9, 0x4c, 0x41, 0xd4, 0x76, 0xe3, 0x2f, 0xba, 0x18, 0x8d, 0x9d, 0x8, 0xaa, 0x3f, 0xf3, 0x66, 0xc4, 0x51, 0xe4, 0x71, 0xd3, 0x46, 0x8a, 0x1f, 0xbd, 0x28, 0x38, 0xad, 0xf, 0x9a, 0x56, 0xc3, 0x61, 0xf4, 0x16, 0x83, 0x21, 0xb4, 0x78, 0xed, 0x4f, 0xda, 0xca, 0x5f, 0xfd, 0x68, 0xa4, 0x31, 0x93, 0x6, 0xb3, 0x26, 0x84, 0x11, 0xdd, 0x48, 0xea, 0x7f, 0x6f, 0xfa, 0x58, 0xcd, 0x1, 0x94, 0x36, 0xa3, 0xef, 0x7a, 0xd8, 0x4d, 0x81, 0x14, 0xb6, 0x23, 0x33, 0xa6, 0x4, 0x91, 0x5d, 0xc8, 0x6a, 0xff, 0x4a, 0xdf, 0x7d, 0xe8, 0x24, 0xb1, 0x13, 0x86, 0x96, 0x3, 0xa1, 0x34, 0xf8, 0x6d, 0xcf, 0x5a, 0xb8, 0x2d, 0x8f, 0x1a, 0xd6, 0x43, 0xe1, 0x74, 0x64, 0xf1, 0x53, 0xc6, 0xa, 0x9f, 0x3d, 0xa8, 0x1d, 0x88, 0x2a, 0xbf, 0x73, 0xe6, 0x44, 0xd1, 0xc1, 0x54, 0xf6, 0x63, 0xaf, 0x3a, 0x98, 0xd}, [256]byte{0x0, 0x96, 0x31, 0xa7, 0x62, 0xf4, 0x53, 0xc5, 0xc4, 0x52, 0xf5, 0x63, 0xa6, 0x30, 0x97, 0x1, 0x95, 0x3, 0xa4, 0x32, 0xf7, 0x61, 0xc6, 0x50, 0x51, 0xc7, 0x60, 0xf6, 0x33, 0xa5, 0x2, 0x94, 0x37, 0xa1, 0x6, 0x90, 0x55, 0xc3, 0x64, 0xf2, 0xf3, 0x65, 0xc2, 0x54, 0x91, 0x7, 0xa0, 0x36, 0xa2, 0x34, 0x93, 0x5, 0xc0, 0x56, 0xf1, 0x67, 0x66, 0xf0, 0x57, 0xc1, 0x4, 0x92, 0x35, 0xa3, 0x6e, 0xf8, 0x5f, 0xc9, 0xc, 0x9a, 0x3d, 0xab, 0xaa, 0x3c, 0x9b, 0xd, 0xc8, 0x5e, 0xf9, 0x6f, 0xfb, 0x6d, 0xca, 0x5c, 0x99, 0xf, 0xa8, 0x3e, 0x3f, 0xa9, 0xe, 0x98, 0x5d, 0xcb, 0x6c, 0xfa, 0x59, 0xcf, 0x68, 0xfe, 0x3b, 0xad, 0xa, 0x9c, 0x9d, 0xb, 0xac, 0x3a, 0xff, 0x69, 0xce, 0x58, 0xcc, 0x5a, 0xfd, 0x6b, 0xae, 0x38, 0x9f, 0x9, 0x8, 0x9e, 0x39, 0xaf, 0x6a, 0xfc, 0x5b, 0xcd, 0xdc, 0x4a, 0xed, 0x7b, 0xbe, 0x28, 0x8f, 0x19, 0x18, 0x8e, 0x29, 0xbf, 0x7a, 0xec, 0x4b, 0xdd, 0x49, 0xdf, 0x78, 0xee, 0x2b, 0xbd, 0x1a, 0x8c, 0x8d, 0x1b, 0xbc, 0x2a, 0xef, 0x79, 0xde, 0x48, 0xeb, 0x7d, 0xda, 0x4c, 0x89, 0x1f, 0xb8, 0x2e, 0x2f, 0xb9, 0x1e, 0x88, 0x4d, 0xdb, 0x7c, 0xea, 0x7e, 0xe8, 0x4f, 0xd9, 0x1c, 0x8a, 0x2d, 0xbb, 0xba, 0x2c, 0x8b, 0x1d, 0xd8, 0x4e, 0xe9, 0x7f, 0xb2, 0x24, 0x83, 0x15, 0xd0, 0x46, 0xe1, 0x77, 0x76, 0xe0, 0x47, 0xd1, 0x14, 0x82, 0x25, 0xb3, 0x27, 0xb1, 0x16, 0x80, 0x45, 0xd3, 0x74, 0xe2, 0xe3, 0x75, 0xd2, 0x44, 0x81, 0x17, 0xb0, 0x26, 0x85, 0x13, 0xb4, 0x22, 0xe7, 0x71, 0xd6, 0x40, 0x41, 0xd7, 0x70, 0xe6, 0x23, 0xb5, 0x12, 0x84, 0x10, 0x86, 0x21, 0xb7, 0x72, 0xe4, 0x43, 0xd5, 0xd4, 0x42, 0xe5, 0x73, 0xb6, 0x20, 0x87, 0x11}, [256]byte{0x0, 0x97, 0x33, 0xa4, 0x66, 0xf1, 0x55, 0xc2, 0xcc, 0x5b, 0xff, 0x68, 0xaa, 0x3d, 0x99, 0xe, 0x85, 0x12, 0xb6, 0x21, 0xe3, 0x74, 0xd0, 0x47, 0x49, 0xde, 0x7a, 0xed, 0x2f, 0xb8, 0x1c, 0x8b, 0x17, 0x80, 0x24, 0xb3, 0x71, 0xe6, 0x42, 0xd5, 0xdb, 0x4c, 0xe8, 0x7f, 0xbd, 0x2a, 0x8e, 0x19, 0x92, 0x5, 0xa1, 0x36, 0xf4, 0x63, 0xc7, 0x50, 0x5e, 0xc9, 0x6d, 0xfa, 0x38, 0xaf, 0xb, 0x9c, 0x2e, 0xb9, 0x1d, 0x8a, 0x48, 0xdf, 0x7b, 0xec, 0xe2, 0x75, 0xd1, 0x46, 0x84, 0x13, 0xb7, 0x20, 0xab, 0x3c, 0x98, 0xf, 0xcd, 0x5a, 0xfe, 0x69, 0x67, 0xf0, 0x54, 0xc3, 0x1, 0x96, 0x32, 0xa5, 0x39, 0xae, 0xa, 0x9d, 0x5f, 0xc8, 0x6c, 0xfb, 0xf5, 0x62, 0xc6, 0x51, 0x93, 0x4, 0xa0, 0x37, 0xbc, 0x2b, 0x8f, 0x18, 0xda, 0x4d, 0xe9, 0x7e, 0x70, 0xe7, 0x43, 0xd4, 0x16, 0x81, 0x25, 0xb2, 0x5c, 0xcb, 0x6f, 0xf8, 0x3a, 0xad, 0x9, 0x9e, 0x90, 0x7, 0xa3, 0x34, 0xf6, 0x61, 0xc5, 0x52, 0xd9, 0x4e, 0xea, 0x7d, 0xbf, 0x28, 0x8c, 0x1b, 0x15, 0x82, 0x26, 0xb1, 0x73, 0xe4, 0x40, 0xd7, 0x4b, 0xdc, 0x78, 0xef, 0x2d, 0xba, 0x1e, 0x89, 0x87, 0x10, 0xb4, 0x23, 0xe1, 0x76, 0xd2, 0x45, 0xce, 0x59, 0xfd, 0x6a, 0xa8, 0x3f, 0x9b, 0xc, 0x2, 0x95, 0x31, 0xa6, 0x64, 0xf3, 0x57, 0xc0, 0x72, 0xe5, 0x41, 0xd6, 0x14, 0x83, 0x27, 0xb0, 0xbe, 0x29, 0x8d, 0x1a, 0xd8, 0x4f, 0xeb, 0x7c, 0xf7, 0x60, 0xc4, 0x53, 0x91, 0x6, 0xa2, 0x35, 0x3b, 0xac, 0x8, 0x9f, 0x5d, 0xca, 0x6e, 0xf9, 0x65, 0xf2, 0x56, 0xc1, 0x3, 0x94, 0x30, 0xa7, 0xa9, 0x3e, 0x9a, 0xd, 0xcf, 0x58, 0xfc, 0x6b, 0xe0, 0x77, 0xd3, 0x44, 0x86, 0x11, 0xb5, 0x22, 0x2c, 0xbb, 0x1f, 0x88, 0x4a, 0xdd, 0x79, 0xee}, [256]byte{0x0, 0x98, 0x2d, 0xb5, 0x5a, 0xc2, 0x77, 0xef, 0xb4, 0x2c, 0x99, 0x1, 0xee, 0x76, 0xc3, 0x5b, 0x75, 0xed, 0x58, 0xc0, 0x2f, 0xb7, 0x2, 0x9a, 0xc1, 0x59, 0xec, 0x74, 0x9b, 0x3, 0xb6, 0x2e, 0xea, 0x72, 0xc7, 0x5f, 0xb0, 0x28, 0x9d, 0x5, 0x5e, 0xc6, 0x73, 0xeb, 0x4, 0x9c, 0x29, 0xb1, 0x9f, 0x7, 0xb2, 0x2a, 0xc5, 0x5d, 0xe8, 0x70, 0x2b, 0xb3, 0x6, 0x9e, 0x71, 0xe9, 0x5c, 0xc4, 0xc9, 0x51, 0xe4, 0x7c, 0x93, 0xb, 0xbe, 0x26, 0x7d, 0xe5, 0x50, 0xc8, 0x27, 0xbf, 0xa, 0x92, 0xbc, 0x24, 0x91, 0x9, 0xe6, 0x7e, 0xcb, 0x53, 0x8, 0x90, 0x25, 0xbd, 0x52, 0xca, 0x7f, 0xe7, 0x23, 0xbb, 0xe, 0x96, 0x79, 0xe1, 0x54, 0xcc, 0x97, 0xf, 0xba, 0x22, 0xcd, 0x55, 0xe0, 0x78, 0x56, 0xce, 0x7b, 0xe3, 0xc, 0x94, 0x21, 0xb9, 0xe2, 0x7a, 0xcf, 0x57, 0xb8, 0x20, 0x95, 0xd, 0x8f, 0x17, 0xa2, 0x3a, 0xd5, 0x4d, 0xf8, 0x60, 0x3b, 0xa3, 0x16, 0x8e, 0x61, 0xf9, 0x4c, 0xd4, 0xfa, 0x62, 0xd7, 0x4f, 0xa0, 0x38, 0x8d, 0x15, 0x4e, 0xd6, 0x63, 0xfb, 0x14, 0x8c, 0x39, 0xa1, 0x65, 0xfd, 0x48, 0xd0, 0x3f, 0xa7, 0x12, 0x8a, 0xd1, 0x49, 0xfc, 0x64, 0x8b, 0x13, 0xa6, 0x3e, 0x10, 0x88, 0x3d, 0xa5, 0x4a, 0xd2, 0x67, 0xff, 0xa4, 0x3c, 0x89, 0x11, 0xfe, 0x66, 0xd3, 0x4b, 0x46, 0xde, 0x6b, 0xf3, 0x1c, 0x84, 0x31, 0xa9, 0xf2, 0x6a, 0xdf, 0x47, 0xa8, 0x30, 0x85, 0x1d, 0x33, 0xab, 0x1e, 0x86, 0x69, 0xf1, 0x44, 0xdc, 0x87, 0x1f, 0xaa, 0x32, 0xdd, 0x45, 0xf0, 0x68, 0xac, 0x34, 0x81, 0x19, 0xf6, 0x6e, 0xdb, 0x43, 0x18, 0x80, 0x35, 0xad, 0x42, 0xda, 0x6f, 0xf7, 0xd9, 0x41, 0xf4, 0x6c, 0x83, 0x1b, 0xae, 0x36, 0x6d, 0xf5, 0x40, 0xd8, 0x37, 0xaf, 0x1a, 0x82}, [256]byte{0x0, 0x99, 0x2f, 0xb6, 0x5e, 0xc7, 0x71, 0xe8, 0xbc, 0x25, 0x93, 0xa, 0xe2, 0x7b, 0xcd, 0x54, 0x65, 0xfc, 0x4a, 0xd3, 0x3b, 0xa2, 0x14, 0x8d, 0xd9, 0x40, 0xf6, 0x6f, 0x87, 0x1e, 0xa8, 0x31, 0xca, 0x53, 0xe5, 0x7c, 0x94, 0xd, 0xbb, 0x22, 0x76, 0xef, 0x59, 0xc0, 0x28, 0xb1, 0x7, 0x9e, 0xaf, 0x36, 0x80, 0x19, 0xf1, 0x68, 0xde, 0x47, 0x13, 0x8a, 0x3c, 0xa5, 0x4d, 0xd4, 0x62, 0xfb, 0x89, 0x10, 0xa6, 0x3f, 0xd7, 0x4e, 0xf8, 0x61, 0x35, 0xac, 0x1a, 0x83, 0x6b, 0xf2, 0x44, 0xdd, 0xec, 0x75, 0xc3, 0x5a, 0xb2, 0x2b, 0x9d, 0x4, 0x50, 0xc9, 0x7f, 0xe6, 0xe, 0x97, 0x21, 0xb8, 0x43, 0xda, 0x6c, 0xf5, 0x1d, 0x84, 0x32, 0xab, 0xff, 0x66, 0xd0, 0x49, 0xa1, 0x38, 0x8e, 0x17, 0x26, 0xbf, 0x9, 0x90, 0x78, 0xe1, 0x57, 0xce, 0x9a, 0x3, 0xb5, 0x2c, 0xc4, 0x5d, 0xeb, 0x72, 0xf, 0x96, 0x20, 0xb9, 0x51, 0xc8, 0x7e, 0xe7, 0xb3, 0x2a, 0x9c, 0x5, 0xed, 0x74, 0xc2, 0x5b, 0x6a, 0xf3, 0x45, 0xdc, 0x34, 0xad, 0x1b, 0x82, 0xd6, 0x4f, 0xf9, 0x60, 0x88, 0x11, 0xa7, 0x3e, 0xc5, 0x5c, 0xea, 0x73, 0x9b, 0x2, 0xb4, 0x2d, 0x79, 0xe0, 0x56, 0xcf, 0x27, 0xbe, 0x8, 0x91, 0xa0, 0x39, 0x8f, 0x16, 0xfe, 0x67, 0xd1, 0x48, 0x1c, 0x85, 0x33, 0xaa, 0x42, 0xdb, 0x6d, 0xf4, 0x86, 0x1f, 0xa9, 0x30, 0xd8, 0x41, 0xf7, 0x6e, 0x3a, 0xa3, 0x15, 0x8c, 0x64, 0xfd, 0x4b, 0xd2, 0xe3, 0x7a, 0xcc, 0x55, 0xbd, 0x24, 0x92, 0xb, 0x5f, 0xc6, 0x70, 0xe9, 0x1, 0x98, 0x2e, 0xb7, 0x4c, 0xd5, 0x63, 0xfa, 0x12, 0x8b, 0x3d, 0xa4, 0xf0, 0x69, 0xdf, 0x46, 0xae, 0x37, 0x81, 0x18, 0x29, 0xb0, 0x6, 0x9f, 0x77, 0xee, 0x58, 0xc1, 0x95, 0xc, 0xba, 0x23, 0xcb, 0x52, 0xe4, 0x7d}, [256]byte{0x0, 0x9a, 0x29, 0xb3, 0x52, 0xc8, 0x7b, 0xe1, 0xa4, 0x3e, 0x8d, 0x17, 0xf6, 0x6c, 0xdf, 0x45, 0x55, 0xcf, 0x7c, 0xe6, 0x7, 0x9d, 0x2e, 0xb4, 0xf1, 0x6b, 0xd8, 0x42, 0xa3, 0x39, 0x8a, 0x10, 0xaa, 0x30, 0x83, 0x19, 0xf8, 0x62, 0xd1, 0x4b, 0xe, 0x94, 0x27, 0xbd, 0x5c, 0xc6, 0x75, 0xef, 0xff, 0x65, 0xd6, 0x4c, 0xad, 0x37, 0x84, 0x1e, 0x5b, 0xc1, 0x72, 0xe8, 0x9, 0x93, 0x20, 0xba, 0x49, 0xd3, 0x60, 0xfa, 0x1b, 0x81, 0x32, 0xa8, 0xed, 0x77, 0xc4, 0x5e, 0xbf, 0x25, 0x96, 0xc, 0x1c, 0x86, 0x35, 0xaf, 0x4e, 0xd4, 0x67, 0xfd, 0xb8, 0x22, 0x91, 0xb, 0xea, 0x70, 0xc3, 0x59, 0xe3, 0x79, 0xca, 0x50, 0xb1, 0x2b, 0x98, 0x2, 0x47, 0xdd, 0x6e, 0xf4, 0x15, 0x8f, 0x3c, 0xa6, 0xb6, 0x2c, 0x9f, 0x5, 0xe4, 0x7e, 0xcd, 0x57, 0x12, 0x88, 0x3b, 0xa1, 0x40, 0xda, 0x69, 0xf3, 0x92, 0x8, 0xbb, 0x21, 0xc0, 0x5a, 0xe9, 0x73, 0x36, 0xac, 0x1f, 0x85, 0x64, 0xfe, 0x4d, 0xd7, 0xc7, 0x5d, 0xee, 0x74, 0x95, 0xf, 0xbc, 0x26, 0x63, 0xf9, 0x4a, 0xd0, 0x31, 0xab, 0x18, 0x82, 0x38, 0xa2, 0x11, 0x8b, 0x6a, 0xf0, 0x43, 0xd9, 0x9c, 0x6, 0xb5, 0x2f, 0xce, 0x54, 0xe7, 0x7d, 0x6d, 0xf7, 0x44, 0xde, 0x3f, 0xa5, 0x16, 0x8c, 0xc9, 0x53, 0xe0, 0x7a, 0x9b, 0x1, 0xb2, 0x28, 0xdb, 0x41, 0xf2, 0x68, 0x89, 0x13, 0xa0, 0x3a, 0x7f, 0xe5, 0x56, 0xcc, 0x2d, 0xb7, 0x4, 0x9e, 0x8e, 0x14, 0xa7, 0x3d, 0xdc, 0x46, 0xf5, 0x6f, 0x2a, 0xb0, 0x3, 0x99, 0x78, 0xe2, 0x51, 0xcb, 0x71, 0xeb, 0x58, 0xc2, 0x23, 0xb9, 0xa, 0x90, 0xd5, 0x4f, 0xfc, 0x66, 0x87, 0x1d, 0xae, 0x34, 0x24, 0xbe, 0xd, 0x97, 0x76, 0xec, 0x5f, 0xc5, 0x80, 0x1a, 0xa9, 0x33, 0xd2, 0x48, 0xfb, 0x61}, [256]byte{0x0, 0x9b, 0x2b, 0xb0, 0x56, 0xcd, 0x7d, 0xe6, 0xac, 0x37, 0x87, 0x1c, 0xfa, 0x61, 0xd1, 0x4a, 0x45, 0xde, 0x6e, 0xf5, 0x13, 0x88, 0x38, 0xa3, 0xe9, 0x72, 0xc2, 0x59, 0xbf, 0x24, 0x94, 0xf, 0x8a, 0x11, 0xa1, 0x3a, 0xdc, 0x47, 0xf7, 0x6c, 0x26, 0xbd, 0xd, 0x96, 0x70, 0xeb, 0x5b, 0xc0, 0xcf, 0x54, 0xe4, 0x7f, 0x99, 0x2, 0xb2, 0x29, 0x63, 0xf8, 0x48, 0xd3, 0x35, 0xae, 0x1e, 0x85, 0x9, 0x92, 0x22, 0xb9, 0x5f, 0xc4, 0x74, 0xef, 0xa5, 0x3e, 0x8e, 0x15, 0xf3, 0x68, 0xd8, 0x43, 0x4c, 0xd7, 0x67, 0xfc, 0x1a, 0x81, 0x31, 0xaa, 0xe0, 0x7b, 0xcb, 0x50, 0xb6, 0x2d, 0x9d, 0x6, 0x83, 0x18, 0xa8, 0x33, 0xd5, 0x4e, 0xfe, 0x65, 0x2f, 0xb4, 0x4, 0x9f, 0x79, 0xe2, 0x52, 0xc9, 0xc6, 0x5d, 0xed, 0x76, 0x90, 0xb, 0xbb, 0x20, 0x6a, 0xf1, 0x41, 0xda, 0x3c, 0xa7, 0x17, 0x8c, 0x12, 0x89, 0x39, 0xa2, 0x44, 0xdf, 0x6f, 0xf4, 0xbe, 0x25, 0x95, 0xe, 0xe8, 0x73, 0xc3, 0x58, 0x57, 0xcc, 0x7c, 0xe7, 0x1, 0x9a, 0x2a, 0xb1, 0xfb, 0x60, 0xd0, 0x4b, 0xad, 0x36, 0x86, 0x1d, 0x98, 0x3, 0xb3, 0x28, 0xce, 0x55, 0xe5, 0x7e, 0x34, 0xaf, 0x1f, 0x84, 0x62, 0xf9, 0x49, 0xd2, 0xdd, 0x46, 0xf6, 0x6d, 0x8b, 0x10, 0xa0, 0x3b, 0x71, 0xea, 0x5a, 0xc1, 0x27, 0xbc, 0xc, 0x97, 0x1b, 0x80, 0x30, 0xab, 0x4d, 0xd6, 0x66, 0xfd, 0xb7, 0x2c, 0x9c, 0x7, 0xe1, 0x7a, 0xca, 0x51, 0x5e, 0xc5, 0x75, 0xee, 0x8, 0x93, 0x23, 0xb8, 0xf2, 0x69, 0xd9, 0x42, 0xa4, 0x3f, 0x8f, 0x14, 0x91, 0xa, 0xba, 0x21, 0xc7, 0x5c, 0xec, 0x77, 0x3d, 0xa6, 0x16, 0x8d, 0x6b, 0xf0, 0x40, 0xdb, 0xd4, 0x4f, 0xff, 0x64, 0x82, 0x19, 0xa9, 0x32, 0x78, 0xe3, 0x53, 0xc8, 0x2e, 0xb5, 0x5, 0x9e}, [256]byte{0x0, 0x9c, 0x25, 0xb9, 0x4a, 0xd6, 0x6f, 0xf3, 0x94, 0x8, 0xb1, 0x2d, 0xde, 0x42, 0xfb, 0x67, 0x35, 0xa9, 0x10, 0x8c, 0x7f, 0xe3, 0x5a, 0xc6, 0xa1, 0x3d, 0x84, 0x18, 0xeb, 0x77, 0xce, 0x52, 0x6a, 0xf6, 0x4f, 0xd3, 0x20, 0xbc, 0x5, 0x99, 0xfe, 0x62, 0xdb, 0x47, 0xb4, 0x28, 0x91, 0xd, 0x5f, 0xc3, 0x7a, 0xe6, 0x15, 0x89, 0x30, 0xac, 0xcb, 0x57, 0xee, 0x72, 0x81, 0x1d, 0xa4, 0x38, 0xd4, 0x48, 0xf1, 0x6d, 0x9e, 0x2, 0xbb, 0x27, 0x40, 0xdc, 0x65, 0xf9, 0xa, 0x96, 0x2f, 0xb3, 0xe1, 0x7d, 0xc4, 0x58, 0xab, 0x37, 0x8e, 0x12, 0x75, 0xe9, 0x50, 0xcc, 0x3f, 0xa3, 0x1a, 0x86, 0xbe, 0x22, 0x9b, 0x7, 0xf4, 0x68, 0xd1, 0x4d, 0x2a, 0xb6, 0xf, 0x93, 0x60, 0xfc, 0x45, 0xd9, 0x8b, 0x17, 0xae, 0x32, 0xc1, 0x5d, 0xe4, 0x78, 0x1f, 0x83, 0x3a, 0xa6, 0x55, 0xc9, 0x70, 0xec, 0xb5, 0x29, 0x90, 0xc, 0xff, 0x63, 0xda, 0x46, 0x21, 0xbd, 0x4, 0x98, 0x6b, 0xf7, 0x4e, 0xd2, 0x80, 0x1c, 0xa5, 0x39, 0xca, 0x56, 0xef, 0x73, 0x14, 0x88, 0x31, 0xad, 0x5e, 0xc2, 0x7b, 0xe7, 0xdf, 0x43, 0xfa, 0x66, 0x95, 0x9, 0xb0, 0x2c, 0x4b, 0xd7, 0x6e, 0xf2, 0x1, 0x9d, 0x24, 0xb8, 0xea, 0x76, 0xcf, 0x53, 0xa0, 0x3c, 0x85, 0x19, 0x7e, 0xe2, 0x5b, 0xc7, 0x34, 0xa8, 0x11, 0x8d, 0x61, 0xfd, 0x44, 0xd8, 0x2b, 0xb7, 0xe, 0x92, 0xf5, 0x69, 0xd0, 0x4c, 0xbf, 0x23, 0x9a, 0x6, 0x54, 0xc8, 0x71, 0xed, 0x1e, 0x82, 0x3b, 0xa7, 0xc0, 0x5c, 0xe5, 0x79, 0x8a, 0x16, 0xaf, 0x33, 0xb, 0x97, 0x2e, 0xb2, 0x41, 0xdd, 0x64, 0xf8, 0x9f, 0x3, 0xba, 0x26, 0xd5, 0x49, 0xf0, 0x6c, 0x3e, 0xa2, 0x1b, 0x87, 0x74, 0xe8, 0x51, 0xcd, 0xaa, 0x36, 0x8f, 0x13, 0xe0, 0x7c, 0xc5, 0x59}, [256]byte{0x0, 0x9d, 0x27, 0xba, 0x4e, 0xd3, 0x69, 0xf4, 0x9c, 0x1, 0xbb, 0x26, 0xd2, 0x4f, 0xf5, 0x68, 0x25, 0xb8, 0x2, 0x9f, 0x6b, 0xf6, 0x4c, 0xd1, 0xb9, 0x24, 0x9e, 0x3, 0xf7, 0x6a, 0xd0, 0x4d, 0x4a, 0xd7, 0x6d, 0xf0, 0x4, 0x99, 0x23, 0xbe, 0xd6, 0x4b, 0xf1, 0x6c, 0x98, 0x5, 0xbf, 0x22, 0x6f, 0xf2, 0x48, 0xd5, 0x21, 0xbc, 0x6, 0x9b, 0xf3, 0x6e, 0xd4, 0x49, 0xbd, 0x20, 0x9a, 0x7, 0x94, 0x9, 0xb3, 0x2e, 0xda, 0x47, 0xfd, 0x60, 0x8, 0x95, 0x2f, 0xb2, 0x46, 0xdb, 0x61, 0xfc, 0xb1, 0x2c, 0x96, 0xb, 0xff, 0x62, 0xd8, 0x45, 0x2d, 0xb0, 0xa, 0x97, 0x63, 0xfe, 0x44, 0xd9, 0xde, 0x43, 0xf9, 0x64, 0x90, 0xd, 0xb7, 0x2a, 0x42, 0xdf, 0x65, 0xf8, 0xc, 0x91, 0x2b, 0xb6, 0xfb, 0x66, 0xdc, 0x41, 0xb5, 0x28, 0x92, 0xf, 0x67, 0xfa, 0x40, 0xdd, 0x29, 0xb4, 0xe, 0x93, 0x35, 0xa8, 0x12, 0x8f, 0x7b, 0xe6, 0x5c, 0xc1, 0xa9, 0x34, 0x8e, 0x13, 0xe7, 0x7a, 0xc0, 0x5d, 0x10, 0x8d, 0x37, 0xaa, 0x5e, 0xc3, 0x79, 0xe4, 0x8c, 0x11, 0xab, 0x36, 0xc2, 0x5f, 0xe5, 0x78, 0x7f, 0xe2, 0x58, 0xc5, 0x31, 0xac, 0x16, 0x8b, 0xe3, 0x7e, 0xc4, 0x59, 0xad, 0x30, 0x8a, 0x17, 0x5a, 0xc7, 0x7d, 0xe0, 0x14, 0x89, 0x33, 0xae, 0xc6, 0x5b, 0xe1, 0x7c, 0x88, 0x15, 0xaf, 0x32, 0xa1, 0x3c, 0x86, 0x1b, 0xef, 0x72, 0xc8, 0x55, 0x3d, 0xa0, 0x1a, 0x87, 0x73, 0xee, 0x54, 0xc9, 0x84, 0x19, 0xa3, 0x3e, 0xca, 0x57, 0xed, 0x70, 0x18, 0x85, 0x3f, 0xa2, 0x56, 0xcb, 0x71, 0xec, 0xeb, 0x76, 0xcc, 0x51, 0xa5, 0x38, 0x82, 0x1f, 0x77, 0xea, 0x50, 0xcd, 0x39, 0xa4, 0x1e, 0x83, 0xce, 0x53, 0xe9, 0x74, 0x80, 0x1d, 0xa7, 0x3a, 0x52, 0xcf, 0x75, 0xe8, 0x1c, 0x81, 0x3b, 0xa6}, [256]byte{0x0, 0x9e, 0x21, 0xbf, 0x42, 0xdc, 0x63, 0xfd, 0x84, 0x1a, 0xa5, 0x3b, 0xc6, 0x58, 0xe7, 0x79, 0x15, 0x8b, 0x34, 0xaa, 0x57, 0xc9, 0x76, 0xe8, 0x91, 0xf, 0xb0, 0x2e, 0xd3, 0x4d, 0xf2, 0x6c, 0x2a, 0xb4, 0xb, 0x95, 0x68, 0xf6, 0x49, 0xd7, 0xae, 0x30, 0x8f, 0x11, 0xec, 0x72, 0xcd, 0x53, 0x3f, 0xa1, 0x1e, 0x80, 0x7d, 0xe3, 0x5c, 0xc2, 0xbb, 0x25, 0x9a, 0x4, 0xf9, 0x67, 0xd8, 0x46, 0x54, 0xca, 0x75, 0xeb, 0x16, 0x88, 0x37, 0xa9, 0xd0, 0x4e, 0xf1, 0x6f, 0x92, 0xc, 0xb3, 0x2d, 0x41, 0xdf, 0x60, 0xfe, 0x3, 0x9d, 0x22, 0xbc, 0xc5, 0x5b, 0xe4, 0x7a, 0x87, 0x19, 0xa6, 0x38, 0x7e, 0xe0, 0x5f, 0xc1, 0x3c, 0xa2, 0x1d, 0x83, 0xfa, 0x64, 0xdb, 0x45, 0xb8, 0x26, 0x99, 0x7, 0x6b, 0xf5, 0x4a, 0xd4, 0x29, 0xb7, 0x8, 0x96, 0xef, 0x71, 0xce, 0x50, 0xad, 0x33, 0x8c, 0x12, 0xa8, 0x36, 0x89, 0x17, 0xea, 0x74, 0xcb, 0x55, 0x2c, 0xb2, 0xd, 0x93, 0x6e, 0xf0, 0x4f, 0xd1, 0xbd, 0x23, 0x9c, 0x2, 0xff, 0x61, 0xde, 0x40, 0x39, 0xa7, 0x18, 0x86, 0x7b, 0xe5, 0x5a, 0xc4, 0x82, 0x1c, 0xa3, 0x3d, 0xc0, 0x5e, 0xe1, 0x7f, 0x6, 0x98, 0x27, 0xb9, 0x44, 0xda, 0x65, 0xfb, 0x97, 0x9, 0xb6, 0x28, 0xd5, 0x4b, 0xf4, 0x6a, 0x13, 0x8d, 0x32, 0xac, 0x51, 0xcf, 0x70, 0xee, 0xfc, 0x62, 0xdd, 0x43, 0xbe, 0x20, 0x9f, 0x1, 0x78, 0xe6, 0x59, 0xc7, 0x3a, 0xa4, 0x1b, 0x85, 0xe9, 0x77, 0xc8, 0x56, 0xab, 0x35, 0x8a, 0x14, 0x6d, 0xf3, 0x4c, 0xd2, 0x2f, 0xb1, 0xe, 0x90, 0xd6, 0x48, 0xf7, 0x69, 0x94, 0xa, 0xb5, 0x2b, 0x52, 0xcc, 0x73, 0xed, 0x10, 0x8e, 0x31, 0xaf, 0xc3, 0x5d, 0xe2, 0x7c, 0x81, 0x1f, 0xa0, 0x3e, 0x47, 0xd9, 0x66, 0xf8, 0x5, 0x9b, 0x24, 0xba}, [256]byte{0x0, 0x9f, 0x23, 0xbc, 0x46, 0xd9, 0x65, 0xfa, 0x8c, 0x13, 0xaf, 0x30, 0xca, 0x55, 0xe9, 0x76, 0x5, 0x9a, 0x26, 0xb9, 0x43, 0xdc, 0x60, 0xff, 0x89, 0x16, 0xaa, 0x35, 0xcf, 0x50, 0xec, 0x73, 0xa, 0x95, 0x29, 0xb6, 0x4c, 0xd3, 0x6f, 0xf0, 0x86, 0x19, 0xa5, 0x3a, 0xc0, 0x5f, 0xe3, 0x7c, 0xf, 0x90, 0x2c, 0xb3, 0x49, 0xd6, 0x6a, 0xf5, 0x83, 0x1c, 0xa0, 0x3f, 0xc5, 0x5a, 0xe6, 0x79, 0x14, 0x8b, 0x37, 0xa8, 0x52, 0xcd, 0x71, 0xee, 0x98, 0x7, 0xbb, 0x24, 0xde, 0x41, 0xfd, 0x62, 0x11, 0x8e, 0x32, 0xad, 0x57, 0xc8, 0x74, 0xeb, 0x9d, 0x2, 0xbe, 0x21, 0xdb, 0x44, 0xf8, 0x67, 0x1e, 0x81, 0x3d, 0xa2, 0x58, 0xc7, 0x7b, 0xe4, 0x92, 0xd, 0xb1, 0x2e, 0xd4, 0x4b, 0xf7, 0x68, 0x1b, 0x84, 0x38, 0xa7, 0x5d, 0xc2, 0x7e, 0xe1, 0x97, 0x8, 0xb4, 0x2b, 0xd1, 0x4e, 0xf2, 0x6d, 0x28, 0xb7, 0xb, 0x94, 0x6e, 0xf1, 0x4d, 0xd2, 0xa4, 0x3b, 0x87, 0x18, 0xe2, 0x7d, 0xc1, 0x5e, 0x2d, 0xb2, 0xe, 0x91, 0x6b, 0xf4, 0x48, 0xd7, 0xa1, 0x3e, 0x82, 0x1d, 0xe7, 0x78, 0xc4, 0x5b, 0x22, 0xbd, 0x1, 0x9e, 0x64, 0xfb, 0x47, 0xd8, 0xae, 0x31, 0x8d, 0x12, 0xe8, 0x77, 0xcb, 0x54, 0x27, 0xb8, 0x4, 0x9b, 0x61, 0xfe, 0x42, 0xdd, 0xab, 0x34, 0x88, 0x17, 0xed, 0x72, 0xce, 0x51, 0x3c, 0xa3, 0x1f, 0x80, 0x7a, 0xe5, 0x59, 0xc6, 0xb0, 0x2f, 0x93, 0xc, 0xf6, 0x69, 0xd5, 0x4a, 0x39, 0xa6, 0x1a, 0x85, 0x7f, 0xe0, 0x5c, 0xc3, 0xb5, 0x2a, 0x96, 0x9, 0xf3, 0x6c, 0xd0, 0x4f, 0x36, 0xa9, 0x15, 0x8a, 0x70, 0xef, 0x53, 0xcc, 0xba, 0x25, 0x99, 0x6, 0xfc, 0x63, 0xdf, 0x40, 0x33, 0xac, 0x10, 0x8f, 0x75, 0xea, 0x56, 0xc9, 0xbf, 0x20, 0x9c, 0x3, 0xf9, 0x66, 0xda, 0x45}, [256]byte{0x0, 0xa0, 0x5d, 0xfd, 0xba, 0x1a, 0xe7, 0x47, 0x69, 0xc9, 0x34, 0x94, 0xd3, 0x73, 0x8e, 0x2e, 0xd2, 0x72, 0x8f, 0x2f, 0x68, 0xc8, 0x35, 0x95, 0xbb, 0x1b, 0xe6, 0x46, 0x1, 0xa1, 0x5c, 0xfc, 0xb9, 0x19, 0xe4, 0x44, 0x3, 0xa3, 0x5e, 0xfe, 0xd0, 0x70, 0x8d, 0x2d, 0x6a, 0xca, 0x37, 0x97, 0x6b, 0xcb, 0x36, 0x96, 0xd1, 0x71, 0x8c, 0x2c, 0x2, 0xa2, 0x5f, 0xff, 0xb8, 0x18, 0xe5, 0x45, 0x6f, 0xcf, 0x32, 0x92, 0xd5, 0x75, 0x88, 0x28, 0x6, 0xa6, 0x5b, 0xfb, 0xbc, 0x1c, 0xe1, 0x41, 0xbd, 0x1d, 0xe0, 0x40, 0x7, 0xa7, 0x5a, 0xfa, 0xd4, 0x74, 0x89, 0x29, 0x6e, 0xce, 0x33, 0x93, 0xd6, 0x76, 0x8b, 0x2b, 0x6c, 0xcc, 0x31, 0x91, 0xbf, 0x1f, 0xe2, 0x42, 0x5, 0xa5, 0x58, 0xf8, 0x4, 0xa4, 0x59, 0xf9, 0xbe, 0x1e, 0xe3, 0x43, 0x6d, 0xcd, 0x30, 0x90, 0xd7, 0x77, 0x8a, 0x2a, 0xde, 0x7e, 0x83, 0x23, 0x64, 0xc4, 0x39, 0x99, 0xb7, 0x17, 0xea, 0x4a, 0xd, 0xad, 0x50, 0xf0, 0xc, 0xac, 0x51, 0xf1, 0xb6, 0x16, 0xeb, 0x4b, 0x65, 0xc5, 0x38, 0x98, 0xdf, 0x7f, 0x82, 0x22, 0x67, 0xc7, 0x3a, 0x9a, 0xdd, 0x7d, 0x80, 0x20, 0xe, 0xae, 0x53, 0xf3, 0xb4, 0x14, 0xe9, 0x49, 0xb5, 0x15, 0xe8, 0x48, 0xf, 0xaf, 0x52, 0xf2, 0xdc, 0x7c, 0x81, 0x21, 0x66, 0xc6, 0x3b, 0x9b, 0xb1, 0x11, 0xec, 0x4c, 0xb, 0xab, 0x56, 0xf6, 0xd8, 0x78, 0x85, 0x25, 0x62, 0xc2, 0x3f, 0x9f, 0x63, 0xc3, 0x3e, 0x9e, 0xd9, 0x79, 0x84, 0x24, 0xa, 0xaa, 0x57, 0xf7, 0xb0, 0x10, 0xed, 0x4d, 0x8, 0xa8, 0x55, 0xf5, 0xb2, 0x12, 0xef, 0x4f, 0x61, 0xc1, 0x3c, 0x9c, 0xdb, 0x7b, 0x86, 0x26, 0xda, 0x7a, 0x87, 0x27, 0x60, 0xc0, 0x3d, 0x9d, 0xb3, 0x13, 0xee, 0x4e, 0x9, 0xa9, 0x54, 0xf4}, [256]byte{0x0, 0xa1, 0x5f, 0xfe, 0xbe, 0x1f, 0xe1, 0x40, 0x61, 0xc0, 0x3e, 0x9f, 0xdf, 0x7e, 0x80, 0x21, 0xc2, 0x63, 0x9d, 0x3c, 0x7c, 0xdd, 0x23, 0x82, 0xa3, 0x2, 0xfc, 0x5d, 0x1d, 0xbc, 0x42, 0xe3, 0x99, 0x38, 0xc6, 0x67, 0x27, 0x86, 0x78, 0xd9, 0xf8, 0x59, 0xa7, 0x6, 0x46, 0xe7, 0x19, 0xb8, 0x5b, 0xfa, 0x4, 0xa5, 0xe5, 0x44, 0xba, 0x1b, 0x3a, 0x9b, 0x65, 0xc4, 0x84, 0x25, 0xdb, 0x7a, 0x2f, 0x8e, 0x70, 0xd1, 0x91, 0x30, 0xce, 0x6f, 0x4e, 0xef, 0x11, 0xb0, 0xf0, 0x51, 0xaf, 0xe, 0xed, 0x4c, 0xb2, 0x13, 0x53, 0xf2, 0xc, 0xad, 0x8c, 0x2d, 0xd3, 0x72, 0x32, 0x93, 0x6d, 0xcc, 0xb6, 0x17, 0xe9, 0x48, 0x8, 0xa9, 0x57, 0xf6, 0xd7, 0x76, 0x88, 0x29, 0x69, 0xc8, 0x36, 0x97, 0x74, 0xd5, 0x2b, 0x8a, 0xca, 0x6b, 0x95, 0x34, 0x15, 0xb4, 0x4a, 0xeb, 0xab, 0xa, 0xf4, 0x55, 0x5e, 0xff, 0x1, 0xa0, 0xe0, 0x41, 0xbf, 0x1e, 0x3f, 0x9e, 0x60, 0xc1, 0x81, 0x20, 0xde, 0x7f, 0x9c, 0x3d, 0xc3, 0x62, 0x22, 0x83, 0x7d, 0xdc, 0xfd, 0x5c, 0xa2, 0x3, 0x43, 0xe2, 0x1c, 0xbd, 0xc7, 0x66, 0x98, 0x39, 0x79, 0xd8, 0x26, 0x87, 0xa6, 0x7, 0xf9, 0x58, 0x18, 0xb9, 0x47, 0xe6, 0x5, 0xa4, 0x5a, 0xfb, 0xbb, 0x1a, 0xe4, 0x45, 0x64, 0xc5, 0x3b, 0x9a, 0xda, 0x7b, 0x85, 0x24, 0x71, 0xd0, 0x2e, 0x8f, 0xcf, 0x6e, 0x90, 0x31, 0x10, 0xb1, 0x4f, 0xee, 0xae, 0xf, 0xf1, 0x50, 0xb3, 0x12, 0xec, 0x4d, 0xd, 0xac, 0x52, 0xf3, 0xd2, 0x73, 0x8d, 0x2c, 0x6c, 0xcd, 0x33, 0x92, 0xe8, 0x49, 0xb7, 0x16, 0x56, 0xf7, 0x9, 0xa8, 0x89, 0x28, 0xd6, 0x77, 0x37, 0x96, 0x68, 0xc9, 0x2a, 0x8b, 0x75, 0xd4, 0x94, 0x35, 0xcb, 0x6a, 0x4b, 0xea, 0x14, 0xb5, 0xf5, 0x54, 0xaa, 0xb}, [256]byte{0x0, 0xa2, 0x59, 0xfb, 0xb2, 0x10, 0xeb, 0x49, 0x79, 0xdb, 0x20, 0x82, 0xcb, 0x69, 0x92, 0x30, 0xf2, 0x50, 0xab, 0x9, 0x40, 0xe2, 0x19, 0xbb, 0x8b, 0x29, 0xd2, 0x70, 0x39, 0x9b, 0x60, 0xc2, 0xf9, 0x5b, 0xa0, 0x2, 0x4b, 0xe9, 0x12, 0xb0, 0x80, 0x22, 0xd9, 0x7b, 0x32, 0x90, 0x6b, 0xc9, 0xb, 0xa9, 0x52, 0xf0, 0xb9, 0x1b, 0xe0, 0x42, 0x72, 0xd0, 0x2b, 0x89, 0xc0, 0x62, 0x99, 0x3b, 0xef, 0x4d, 0xb6, 0x14, 0x5d, 0xff, 0x4, 0xa6, 0x96, 0x34, 0xcf, 0x6d, 0x24, 0x86, 0x7d, 0xdf, 0x1d, 0xbf, 0x44, 0xe6, 0xaf, 0xd, 0xf6, 0x54, 0x64, 0xc6, 0x3d, 0x9f, 0xd6, 0x74, 0x8f, 0x2d, 0x16, 0xb4, 0x4f, 0xed, 0xa4, 0x6, 0xfd, 0x5f, 0x6f, 0xcd, 0x36, 0x94, 0xdd, 0x7f, 0x84, 0x26, 0xe4, 0x46, 0xbd, 0x1f, 0x56, 0xf4, 0xf, 0xad, 0x9d, 0x3f, 0xc4, 0x66, 0x2f, 0x8d, 0x76, 0xd4, 0xc3, 0x61, 0x9a, 0x38, 0x71, 0xd3, 0x28, 0x8a, 0xba, 0x18, 0xe3, 0x41, 0x8, 0xaa, 0x51, 0xf3, 0x31, 0x93, 0x68, 0xca, 0x83, 0x21, 0xda, 0x78, 0x48, 0xea, 0x11, 0xb3, 0xfa, 0x58, 0xa3, 0x1, 0x3a, 0x98, 0x63, 0xc1, 0x88, 0x2a, 0xd1, 0x73, 0x43, 0xe1, 0x1a, 0xb8, 0xf1, 0x53, 0xa8, 0xa, 0xc8, 0x6a, 0x91, 0x33, 0x7a, 0xd8, 0x23, 0x81, 0xb1, 0x13, 0xe8, 0x4a, 0x3, 0xa1, 0x5a, 0xf8, 0x2c, 0x8e, 0x75, 0xd7, 0x9e, 0x3c, 0xc7, 0x65, 0x55, 0xf7, 0xc, 0xae, 0xe7, 0x45, 0xbe, 0x1c, 0xde, 0x7c, 0x87, 0x25, 0x6c, 0xce, 0x35, 0x97, 0xa7, 0x5, 0xfe, 0x5c, 0x15, 0xb7, 0x4c, 0xee, 0xd5, 0x77, 0x8c, 0x2e, 0x67, 0xc5, 0x3e, 0x9c, 0xac, 0xe, 0xf5, 0x57, 0x1e, 0xbc, 0x47, 0xe5, 0x27, 0x85, 0x7e, 0xdc, 0x95, 0x37, 0xcc, 0x6e, 0x5e, 0xfc, 0x7, 0xa5, 0xec, 0x4e, 0xb5, 0x17}, [256]byte{0x0, 0xa3, 0x5b, 0xf8, 0xb6, 0x15, 0xed, 0x4e, 0x71, 0xd2, 0x2a, 0x89, 0xc7, 0x64, 0x9c, 0x3f, 0xe2, 0x41, 0xb9, 0x1a, 0x54, 0xf7, 0xf, 0xac, 0x93, 0x30, 0xc8, 0x6b, 0x25, 0x86, 0x7e, 0xdd, 0xd9, 0x7a, 0x82, 0x21, 0x6f, 0xcc, 0x34, 0x97, 0xa8, 0xb, 0xf3, 0x50, 0x1e, 0xbd, 0x45, 0xe6, 0x3b, 0x98, 0x60, 0xc3, 0x8d, 0x2e, 0xd6, 0x75, 0x4a, 0xe9, 0x11, 0xb2, 0xfc, 0x5f, 0xa7, 0x4, 0xaf, 0xc, 0xf4, 0x57, 0x19, 0xba, 0x42, 0xe1, 0xde, 0x7d, 0x85, 0x26, 0x68, 0xcb, 0x33, 0x90, 0x4d, 0xee, 0x16, 0xb5, 0xfb, 0x58, 0xa0, 0x3, 0x3c, 0x9f, 0x67, 0xc4, 0x8a, 0x29, 0xd1, 0x72, 0x76, 0xd5, 0x2d, 0x8e, 0xc0, 0x63, 0x9b, 0x38, 0x7, 0xa4, 0x5c, 0xff, 0xb1, 0x12, 0xea, 0x49, 0x94, 0x37, 0xcf, 0x6c, 0x22, 0x81, 0x79, 0xda, 0xe5, 0x46, 0xbe, 0x1d, 0x53, 0xf0, 0x8, 0xab, 0x43, 0xe0, 0x18, 0xbb, 0xf5, 0x56, 0xae, 0xd, 0x32, 0x91, 0x69, 0xca, 0x84, 0x27, 0xdf, 0x7c, 0xa1, 0x2, 0xfa, 0x59, 0x17, 0xb4, 0x4c, 0xef, 0xd0, 0x73, 0x8b, 0x28, 0x66, 0xc5, 0x3d, 0x9e, 0x9a, 0x39, 0xc1, 0x62, 0x2c, 0x8f, 0x77, 0xd4, 0xeb, 0x48, 0xb0, 0x13, 0x5d, 0xfe, 0x6, 0xa5, 0x78, 0xdb, 0x23, 0x80, 0xce, 0x6d, 0x95, 0x36, 0x9, 0xaa, 0x52, 0xf1, 0xbf, 0x1c, 0xe4, 0x47, 0xec, 0x4f, 0xb7, 0x14, 0x5a, 0xf9, 0x1, 0xa2, 0x9d, 0x3e, 0xc6, 0x65, 0x2b, 0x88, 0x70, 0xd3, 0xe, 0xad, 0x55, 0xf6, 0xb8, 0x1b, 0xe3, 0x40, 0x7f, 0xdc, 0x24, 0x87, 0xc9, 0x6a, 0x92, 0x31, 0x35, 0x96, 0x6e, 0xcd, 0x83, 0x20, 0xd8, 0x7b, 0x44, 0xe7, 0x1f, 0xbc, 0xf2, 0x51, 0xa9, 0xa, 0xd7, 0x74, 0x8c, 0x2f, 0x61, 0xc2, 0x3a, 0x99, 0xa6, 0x5, 0xfd, 0x5e, 0x10, 0xb3, 0x4b, 0xe8}, [256]byte{0x0, 0xa4, 0x55, 0xf1, 0xaa, 0xe, 0xff, 0x5b, 0x49, 0xed, 0x1c, 0xb8, 0xe3, 0x47, 0xb6, 0x12, 0x92, 0x36, 0xc7, 0x63, 0x38, 0x9c, 0x6d, 0xc9, 0xdb, 0x7f, 0x8e, 0x2a, 0x71, 0xd5, 0x24, 0x80, 0x39, 0x9d, 0x6c, 0xc8, 0x93, 0x37, 0xc6, 0x62, 0x70, 0xd4, 0x25, 0x81, 0xda, 0x7e, 0x8f, 0x2b, 0xab, 0xf, 0xfe, 0x5a, 0x1, 0xa5, 0x54, 0xf0, 0xe2, 0x46, 0xb7, 0x13, 0x48, 0xec, 0x1d, 0xb9, 0x72, 0xd6, 0x27, 0x83, 0xd8, 0x7c, 0x8d, 0x29, 0x3b, 0x9f, 0x6e, 0xca, 0x91, 0x35, 0xc4, 0x60, 0xe0, 0x44, 0xb5, 0x11, 0x4a, 0xee, 0x1f, 0xbb, 0xa9, 0xd, 0xfc, 0x58, 0x3, 0xa7, 0x56, 0xf2, 0x4b, 0xef, 0x1e, 0xba, 0xe1, 0x45, 0xb4, 0x10, 0x2, 0xa6, 0x57, 0xf3, 0xa8, 0xc, 0xfd, 0x59, 0xd9, 0x7d, 0x8c, 0x28, 0x73, 0xd7, 0x26, 0x82, 0x90, 0x34, 0xc5, 0x61, 0x3a, 0x9e, 0x6f, 0xcb, 0xe4, 0x40, 0xb1, 0x15, 0x4e, 0xea, 0x1b, 0xbf, 0xad, 0x9, 0xf8, 0x5c, 0x7, 0xa3, 0x52, 0xf6, 0x76, 0xd2, 0x23, 0x87, 0xdc, 0x78, 0x89, 0x2d, 0x3f, 0x9b, 0x6a, 0xce, 0x95, 0x31, 0xc0, 0x64, 0xdd, 0x79, 0x88, 0x2c, 0x77, 0xd3, 0x22, 0x86, 0x94, 0x30, 0xc1, 0x65, 0x3e, 0x9a, 0x6b, 0xcf, 0x4f, 0xeb, 0x1a, 0xbe, 0xe5, 0x41, 0xb0, 0x14, 0x6, 0xa2, 0x53, 0xf7, 0xac, 0x8, 0xf9, 0x5d, 0x96, 0x32, 0xc3, 0x67, 0x3c, 0x98, 0x69, 0xcd, 0xdf, 0x7b, 0x8a, 0x2e, 0x75, 0xd1, 0x20, 0x84, 0x4, 0xa0, 0x51, 0xf5, 0xae, 0xa, 0xfb, 0x5f, 0x4d, 0xe9, 0x18, 0xbc, 0xe7, 0x43, 0xb2, 0x16, 0xaf, 0xb, 0xfa, 0x5e, 0x5, 0xa1, 0x50, 0xf4, 0xe6, 0x42, 0xb3, 0x17, 0x4c, 0xe8, 0x19, 0xbd, 0x3d, 0x99, 0x68, 0xcc, 0x97, 0x33, 0xc2, 0x66, 0x74, 0xd0, 0x21, 0x85, 0xde, 0x7a, 0x8b, 0x2f}, [256]byte{0x0, 0xa5, 0x57, 0xf2, 0xae, 0xb, 0xf9, 0x5c, 0x41, 0xe4, 0x16, 0xb3, 0xef, 0x4a, 0xb8, 0x1d, 0x82, 0x27, 0xd5, 0x70, 0x2c, 0x89, 0x7b, 0xde, 0xc3, 0x66, 0x94, 0x31, 0x6d, 0xc8, 0x3a, 0x9f, 0x19, 0xbc, 0x4e, 0xeb, 0xb7, 0x12, 0xe0, 0x45, 0x58, 0xfd, 0xf, 0xaa, 0xf6, 0x53, 0xa1, 0x4, 0x9b, 0x3e, 0xcc, 0x69, 0x35, 0x90, 0x62, 0xc7, 0xda, 0x7f, 0x8d, 0x28, 0x74, 0xd1, 0x23, 0x86, 0x32, 0x97, 0x65, 0xc0, 0x9c, 0x39, 0xcb, 0x6e, 0x73, 0xd6, 0x24, 0x81, 0xdd, 0x78, 0x8a, 0x2f, 0xb0, 0x15, 0xe7, 0x42, 0x1e, 0xbb, 0x49, 0xec, 0xf1, 0x54, 0xa6, 0x3, 0x5f, 0xfa, 0x8, 0xad, 0x2b, 0x8e, 0x7c, 0xd9, 0x85, 0x20, 0xd2, 0x77, 0x6a, 0xcf, 0x3d, 0x98, 0xc4, 0x61, 0x93, 0x36, 0xa9, 0xc, 0xfe, 0x5b, 0x7, 0xa2, 0x50, 0xf5, 0xe8, 0x4d, 0xbf, 0x1a, 0x46, 0xe3, 0x11, 0xb4, 0x64, 0xc1, 0x33, 0x96, 0xca, 0x6f, 0x9d, 0x38, 0x25, 0x80, 0x72, 0xd7, 0x8b, 0x2e, 0xdc, 0x79, 0xe6, 0x43, 0xb1, 0x14, 0x48, 0xed, 0x1f, 0xba, 0xa7, 0x2, 0xf0, 0x55, 0x9, 0xac, 0x5e, 0xfb, 0x7d, 0xd8, 0x2a, 0x8f, 0xd3, 0x76, 0x84, 0x21, 0x3c, 0x99, 0x6b, 0xce, 0x92, 0x37, 0xc5, 0x60, 0xff, 0x5a, 0xa8, 0xd, 0x51, 0xf4, 0x6, 0xa3, 0xbe, 0x1b, 0xe9, 0x4c, 0x10, 0xb5, 0x47, 0xe2, 0x56, 0xf3, 0x1, 0xa4, 0xf8, 0x5d, 0xaf, 0xa, 0x17, 0xb2, 0x40, 0xe5, 0xb9, 0x1c, 0xee, 0x4b, 0xd4, 0x71, 0x83, 0x26, 0x7a, 0xdf, 0x2d, 0x88, 0x95, 0x30, 0xc2, 0x67, 0x3b, 0x9e, 0x6c, 0xc9, 0x4f, 0xea, 0x18, 0xbd, 0xe1, 0x44, 0xb6, 0x13, 0xe, 0xab, 0x59, 0xfc, 0xa0, 0x5, 0xf7, 0x52, 0xcd, 0x68, 0x9a, 0x3f, 0x63, 0xc6, 0x34, 0x91, 0x8c, 0x29, 0xdb, 0x7e, 0x22, 0x87, 0x75, 0xd0}, [256]byte{0x0, 0xa6, 0x51, 0xf7, 0xa2, 0x4, 0xf3, 0x55, 0x59, 0xff, 0x8, 0xae, 0xfb, 0x5d, 0xaa, 0xc, 0xb2, 0x14, 0xe3, 0x45, 0x10, 0xb6, 0x41, 0xe7, 0xeb, 0x4d, 0xba, 0x1c, 0x49, 0xef, 0x18, 0xbe, 0x79, 0xdf, 0x28, 0x8e, 0xdb, 0x7d, 0x8a, 0x2c, 0x20, 0x86, 0x71, 0xd7, 0x82, 0x24, 0xd3, 0x75, 0xcb, 0x6d, 0x9a, 0x3c, 0x69, 0xcf, 0x38, 0x9e, 0x92, 0x34, 0xc3, 0x65, 0x30, 0x96, 0x61, 0xc7, 0xf2, 0x54, 0xa3, 0x5, 0x50, 0xf6, 0x1, 0xa7, 0xab, 0xd, 0xfa, 0x5c, 0x9, 0xaf, 0x58, 0xfe, 0x40, 0xe6, 0x11, 0xb7, 0xe2, 0x44, 0xb3, 0x15, 0x19, 0xbf, 0x48, 0xee, 0xbb, 0x1d, 0xea, 0x4c, 0x8b, 0x2d, 0xda, 0x7c, 0x29, 0x8f, 0x78, 0xde, 0xd2, 0x74, 0x83, 0x25, 0x70, 0xd6, 0x21, 0x87, 0x39, 0x9f, 0x68, 0xce, 0x9b, 0x3d, 0xca, 0x6c, 0x60, 0xc6, 0x31, 0x97, 0xc2, 0x64, 0x93, 0x35, 0xf9, 0x5f, 0xa8, 0xe, 0x5b, 0xfd, 0xa, 0xac, 0xa0, 0x6, 0xf1, 0x57, 0x2, 0xa4, 0x53, 0xf5, 0x4b, 0xed, 0x1a, 0xbc, 0xe9, 0x4f, 0xb8, 0x1e, 0x12, 0xb4, 0x43, 0xe5, 0xb0, 0x16, 0xe1, 0x47, 0x80, 0x26, 0xd1, 0x77, 0x22, 0x84, 0x73, 0xd5, 0xd9, 0x7f, 0x88, 0x2e, 0x7b, 0xdd, 0x2a, 0x8c, 0x32, 0x94, 0x63, 0xc5, 0x90, 0x36, 0xc1, 0x67, 0x6b, 0xcd, 0x3a, 0x9c, 0xc9, 0x6f, 0x98, 0x3e, 0xb, 0xad, 0x5a, 0xfc, 0xa9, 0xf, 0xf8, 0x5e, 0x52, 0xf4, 0x3, 0xa5, 0xf0, 0x56, 0xa1, 0x7, 0xb9, 0x1f, 0xe8, 0x4e, 0x1b, 0xbd, 0x4a, 0xec, 0xe0, 0x46, 0xb1, 0x17, 0x42, 0xe4, 0x13, 0xb5, 0x72, 0xd4, 0x23, 0x85, 0xd0, 0x76, 0x81, 0x27, 0x2b, 0x8d, 0x7a, 0xdc, 0x89, 0x2f, 0xd8, 0x7e, 0xc0, 0x66, 0x91, 0x37, 0x62, 0xc4, 0x33, 0x95, 0x99, 0x3f, 0xc8, 0x6e, 0x3b, 0x9d, 0x6a, 0xcc}, [256]byte{0x0, 0xa7, 0x53, 0xf4, 0xa6, 0x1, 0xf5, 0x52, 0x51, 0xf6, 0x2, 0xa5, 0xf7, 0x50, 0xa4, 0x3, 0xa2, 0x5, 0xf1, 0x56, 0x4, 0xa3, 0x57, 0xf0, 0xf3, 0x54, 0xa0, 0x7, 0x55, 0xf2, 0x6, 0xa1, 0x59, 0xfe, 0xa, 0xad, 0xff, 0x58, 0xac, 0xb, 0x8, 0xaf, 0x5b, 0xfc, 0xae, 0x9, 0xfd, 0x5a, 0xfb, 0x5c, 0xa8, 0xf, 0x5d, 0xfa, 0xe, 0xa9, 0xaa, 0xd, 0xf9, 0x5e, 0xc, 0xab, 0x5f, 0xf8, 0xb2, 0x15, 0xe1, 0x46, 0x14, 0xb3, 0x47, 0xe0, 0xe3, 0x44, 0xb0, 0x17, 0x45, 0xe2, 0x16, 0xb1, 0x10, 0xb7, 0x43, 0xe4, 0xb6, 0x11, 0xe5, 0x42, 0x41, 0xe6, 0x12, 0xb5, 0xe7, 0x40, 0xb4, 0x13, 0xeb, 0x4c, 0xb8, 0x1f, 0x4d, 0xea, 0x1e, 0xb9, 0xba, 0x1d, 0xe9, 0x4e, 0x1c, 0xbb, 0x4f, 0xe8, 0x49, 0xee, 0x1a, 0xbd, 0xef, 0x48, 0xbc, 0x1b, 0x18, 0xbf, 0x4b, 0xec, 0xbe, 0x19, 0xed, 0x4a, 0x79, 0xde, 0x2a, 0x8d, 0xdf, 0x78, 0x8c, 0x2b, 0x28, 0x8f, 0x7b, 0xdc, 0x8e, 0x29, 0xdd, 0x7a, 0xdb, 0x7c, 0x88, 0x2f, 0x7d, 0xda, 0x2e, 0x89, 0x8a, 0x2d, 0xd9, 0x7e, 0x2c, 0x8b, 0x7f, 0xd8, 0x20, 0x87, 0x73, 0xd4, 0x86, 0x21, 0xd5, 0x72, 0x71, 0xd6, 0x22, 0x85, 0xd7, 0x70, 0x84, 0x23, 0x82, 0x25, 0xd1, 0x76, 0x24, 0x83, 0x77, 0xd0, 0xd3, 0x74, 0x80, 0x27, 0x75, 0xd2, 0x26, 0x81, 0xcb, 0x6c, 0x98, 0x3f, 0x6d, 0xca, 0x3e, 0x99, 0x9a, 0x3d, 0xc9, 0x6e, 0x3c, 0x9b, 0x6f, 0xc8, 0x69, 0xce, 0x3a, 0x9d, 0xcf, 0x68, 0x9c, 0x3b, 0x38, 0x9f, 0x6b, 0xcc, 0x9e, 0x39, 0xcd, 0x6a, 0x92, 0x35, 0xc1, 0x66, 0x34, 0x93, 0x67, 0xc0, 0xc3, 0x64, 0x90, 0x37, 0x65, 0xc2, 0x36, 0x91, 0x30, 0x97, 0x63, 0xc4, 0x96, 0x31, 0xc5, 0x62, 0x61, 0xc6, 0x32, 0x95, 0xc7, 0x60, 0x94, 0x33}, [256]byte{0x0, 0xa8, 0x4d, 0xe5, 0x9a, 0x32, 0xd7, 0x7f, 0x29, 0x81, 0x64, 0xcc, 0xb3, 0x1b, 0xfe, 0x56, 0x52, 0xfa, 0x1f, 0xb7, 0xc8, 0x60, 0x85, 0x2d, 0x7b, 0xd3, 0x36, 0x9e, 0xe1, 0x49, 0xac, 0x4, 0xa4, 0xc, 0xe9, 0x41, 0x3e, 0x96, 0x73, 0xdb, 0x8d, 0x25, 0xc0, 0x68, 0x17, 0xbf, 0x5a, 0xf2, 0xf6, 0x5e, 0xbb, 0x13, 0x6c, 0xc4, 0x21, 0x89, 0xdf, 0x77, 0x92, 0x3a, 0x45, 0xed, 0x8, 0xa0, 0x55, 0xfd, 0x18, 0xb0, 0xcf, 0x67, 0x82, 0x2a, 0x7c, 0xd4, 0x31, 0x99, 0xe6, 0x4e, 0xab, 0x3, 0x7, 0xaf, 0x4a, 0xe2, 0x9d, 0x35, 0xd0, 0x78, 0x2e, 0x86, 0x63, 0xcb, 0xb4, 0x1c, 0xf9, 0x51, 0xf1, 0x59, 0xbc, 0x14, 0x6b, 0xc3, 0x26, 0x8e, 0xd8, 0x70, 0x95, 0x3d, 0x42, 0xea, 0xf, 0xa7, 0xa3, 0xb, 0xee, 0x46, 0x39, 0x91, 0x74, 0xdc, 0x8a, 0x22, 0xc7, 0x6f, 0x10, 0xb8, 0x5d, 0xf5, 0xaa, 0x2, 0xe7, 0x4f, 0x30, 0x98, 0x7d, 0xd5, 0x83, 0x2b, 0xce, 0x66, 0x19, 0xb1, 0x54, 0xfc, 0xf8, 0x50, 0xb5, 0x1d, 0x62, 0xca, 0x2f, 0x87, 0xd1, 0x79, 0x9c, 0x34, 0x4b, 0xe3, 0x6, 0xae, 0xe, 0xa6, 0x43, 0xeb, 0x94, 0x3c, 0xd9, 0x71, 0x27, 0x8f, 0x6a, 0xc2, 0xbd, 0x15, 0xf0, 0x58, 0x5c, 0xf4, 0x11, 0xb9, 0xc6, 0x6e, 0x8b, 0x23, 0x75, 0xdd, 0x38, 0x90, 0xef, 0x47, 0xa2, 0xa, 0xff, 0x57, 0xb2, 0x1a, 0x65, 0xcd, 0x28, 0x80, 0xd6, 0x7e, 0x9b, 0x33, 0x4c, 0xe4, 0x1, 0xa9, 0xad, 0x5, 0xe0, 0x48, 0x37, 0x9f, 0x7a, 0xd2, 0x84, 0x2c, 0xc9, 0x61, 0x1e, 0xb6, 0x53, 0xfb, 0x5b, 0xf3, 0x16, 0xbe, 0xc1, 0x69, 0x8c, 0x24, 0x72, 0xda, 0x3f, 0x97, 0xe8, 0x40, 0xa5, 0xd, 0x9, 0xa1, 0x44, 0xec, 0x93, 0x3b, 0xde, 0x76, 0x20, 0x88, 0x6d, 0xc5, 0xba, 0x12, 0xf7, 0x5f}, [256]byte{0x0, 0xa9, 0x4f, 0xe6, 0x9e, 0x37, 0xd1, 0x78, 0x21, 0x88, 0x6e, 0xc7, 0xbf, 0x16, 0xf0, 0x59, 0x42, 0xeb, 0xd, 0xa4, 0xdc, 0x75, 0x93, 0x3a, 0x63, 0xca, 0x2c, 0x85, 0xfd, 0x54, 0xb2, 0x1b, 0x84, 0x2d, 0xcb, 0x62, 0x1a, 0xb3, 0x55, 0xfc, 0xa5, 0xc, 0xea, 0x43, 0x3b, 0x92, 0x74, 0xdd, 0xc6, 0x6f, 0x89, 0x20, 0x58, 0xf1, 0x17, 0xbe, 0xe7, 0x4e, 0xa8, 0x1, 0x79, 0xd0, 0x36, 0x9f, 0x15, 0xbc, 0x5a, 0xf3, 0x8b, 0x22, 0xc4, 0x6d, 0x34, 0x9d, 0x7b, 0xd2, 0xaa, 0x3, 0xe5, 0x4c, 0x57, 0xfe, 0x18, 0xb1, 0xc9, 0x60, 0x86, 0x2f, 0x76, 0xdf, 0x39, 0x90, 0xe8, 0x41, 0xa7, 0xe, 0x91, 0x38, 0xde, 0x77, 0xf, 0xa6, 0x40, 0xe9, 0xb0, 0x19, 0xff, 0x56, 0x2e, 0x87, 0x61, 0xc8, 0xd3, 0x7a, 0x9c, 0x35, 0x4d, 0xe4, 0x2, 0xab, 0xf2, 0x5b, 0xbd, 0x14, 0x6c, 0xc5, 0x23, 0x8a, 0x2a, 0x83, 0x65, 0xcc, 0xb4, 0x1d, 0xfb, 0x52, 0xb, 0xa2, 0x44, 0xed, 0x95, 0x3c, 0xda, 0x73, 0x68, 0xc1, 0x27, 0x8e, 0xf6, 0x5f, 0xb9, 0x10, 0x49, 0xe0, 0x6, 0xaf, 0xd7, 0x7e, 0x98, 0x31, 0xae, 0x7, 0xe1, 0x48, 0x30, 0x99, 0x7f, 0xd6, 0x8f, 0x26, 0xc0, 0x69, 0x11, 0xb8, 0x5e, 0xf7, 0xec, 0x45, 0xa3, 0xa, 0x72, 0xdb, 0x3d, 0x94, 0xcd, 0x64, 0x82, 0x2b, 0x53, 0xfa, 0x1c, 0xb5, 0x3f, 0x96, 0x70, 0xd9, 0xa1, 0x8, 0xee, 0x47, 0x1e, 0xb7, 0x51, 0xf8, 0x80, 0x29, 0xcf, 0x66, 0x7d, 0xd4, 0x32, 0x9b, 0xe3, 0x4a, 0xac, 0x5, 0x5c, 0xf5, 0x13, 0xba, 0xc2, 0x6b, 0x8d, 0x24, 0xbb, 0x12, 0xf4, 0x5d, 0x25, 0x8c, 0x6a, 0xc3, 0x9a, 0x33, 0xd5, 0x7c, 0x4, 0xad, 0x4b, 0xe2, 0xf9, 0x50, 0xb6, 0x1f, 0x67, 0xce, 0x28, 0x81, 0xd8, 0x71, 0x97, 0x3e, 0x46, 0xef, 0x9, 0xa0}, [256]byte{0x0, 0xaa, 0x49, 0xe3, 0x92, 0x38, 0xdb, 0x71, 0x39, 0x93, 0x70, 0xda, 0xab, 0x1, 0xe2, 0x48, 0x72, 0xd8, 0x3b, 0x91, 0xe0, 0x4a, 0xa9, 0x3, 0x4b, 0xe1, 0x2, 0xa8, 0xd9, 0x73, 0x90, 0x3a, 0xe4, 0x4e, 0xad, 0x7, 0x76, 0xdc, 0x3f, 0x95, 0xdd, 0x77, 0x94, 0x3e, 0x4f, 0xe5, 0x6, 0xac, 0x96, 0x3c, 0xdf, 0x75, 0x4, 0xae, 0x4d, 0xe7, 0xaf, 0x5, 0xe6, 0x4c, 0x3d, 0x97, 0x74, 0xde, 0xd5, 0x7f, 0x9c, 0x36, 0x47, 0xed, 0xe, 0xa4, 0xec, 0x46, 0xa5, 0xf, 0x7e, 0xd4, 0x37, 0x9d, 0xa7, 0xd, 0xee, 0x44, 0x35, 0x9f, 0x7c, 0xd6, 0x9e, 0x34, 0xd7, 0x7d, 0xc, 0xa6, 0x45, 0xef, 0x31, 0x9b, 0x78, 0xd2, 0xa3, 0x9, 0xea, 0x40, 0x8, 0xa2, 0x41, 0xeb, 0x9a, 0x30, 0xd3, 0x79, 0x43, 0xe9, 0xa, 0xa0, 0xd1, 0x7b, 0x98, 0x32, 0x7a, 0xd0, 0x33, 0x99, 0xe8, 0x42, 0xa1, 0xb, 0xb7, 0x1d, 0xfe, 0x54, 0x25, 0x8f, 0x6c, 0xc6, 0x8e, 0x24, 0xc7, 0x6d, 0x1c, 0xb6, 0x55, 0xff, 0xc5, 0x6f, 0x8c, 0x26, 0x57, 0xfd, 0x1e, 0xb4, 0xfc, 0x56, 0xb5, 0x1f, 0x6e, 0xc4, 0x27, 0x8d, 0x53, 0xf9, 0x1a, 0xb0, 0xc1, 0x6b, 0x88, 0x22, 0x6a, 0xc0, 0x23, 0x89, 0xf8, 0x52, 0xb1, 0x1b, 0x21, 0x8b, 0x68, 0xc2, 0xb3, 0x19, 0xfa, 0x50, 0x18, 0xb2, 0x51, 0xfb, 0x8a, 0x20, 0xc3, 0x69, 0x62, 0xc8, 0x2b, 0x81, 0xf0, 0x5a, 0xb9, 0x13, 0x5b, 0xf1, 0x12, 0xb8, 0xc9, 0x63, 0x80, 0x2a, 0x10, 0xba, 0x59, 0xf3, 0x82, 0x28, 0xcb, 0x61, 0x29, 0x83, 0x60, 0xca, 0xbb, 0x11, 0xf2, 0x58, 0x86, 0x2c, 0xcf, 0x65, 0x14, 0xbe, 0x5d, 0xf7, 0xbf, 0x15, 0xf6, 0x5c, 0x2d, 0x87, 0x64, 0xce, 0xf4, 0x5e, 0xbd, 0x17, 0x66, 0xcc, 0x2f, 0x85, 0xcd, 0x67, 0x84, 0x2e, 0x5f, 0xf5, 0x16, 0xbc}, [256]byte{0x0, 0xab, 0x4b, 0xe0, 0x96, 0x3d, 0xdd, 0x76, 0x31, 0x9a, 0x7a, 0xd1, 0xa7, 0xc, 0xec, 0x47, 0x62, 0xc9, 0x29, 0x82, 0xf4, 0x5f, 0xbf, 0x14, 0x53, 0xf8, 0x18, 0xb3, 0xc5, 0x6e, 0x8e, 0x25, 0xc4, 0x6f, 0x8f, 0x24, 0x52, 0xf9, 0x19, 0xb2, 0xf5, 0x5e, 0xbe, 0x15, 0x63, 0xc8, 0x28, 0x83, 0xa6, 0xd, 0xed, 0x46, 0x30, 0x9b, 0x7b, 0xd0, 0x97, 0x3c, 0xdc, 0x77, 0x1, 0xaa, 0x4a, 0xe1, 0x95, 0x3e, 0xde, 0x75, 0x3, 0xa8, 0x48, 0xe3, 0xa4, 0xf, 0xef, 0x44, 0x32, 0x99, 0x79, 0xd2, 0xf7, 0x5c, 0xbc, 0x17, 0x61, 0xca, 0x2a, 0x81, 0xc6, 0x6d, 0x8d, 0x26, 0x50, 0xfb, 0x1b, 0xb0, 0x51, 0xfa, 0x1a, 0xb1, 0xc7, 0x6c, 0x8c, 0x27, 0x60, 0xcb, 0x2b, 0x80, 0xf6, 0x5d, 0xbd, 0x16, 0x33, 0x98, 0x78, 0xd3, 0xa5, 0xe, 0xee, 0x45, 0x2, 0xa9, 0x49, 0xe2, 0x94, 0x3f, 0xdf, 0x74, 0x37, 0x9c, 0x7c, 0xd7, 0xa1, 0xa, 0xea, 0x41, 0x6, 0xad, 0x4d, 0xe6, 0x90, 0x3b, 0xdb, 0x70, 0x55, 0xfe, 0x1e, 0xb5, 0xc3, 0x68, 0x88, 0x23, 0x64, 0xcf, 0x2f, 0x84, 0xf2, 0x59, 0xb9, 0x12, 0xf3, 0x58, 0xb8, 0x13, 0x65, 0xce, 0x2e, 0x85, 0xc2, 0x69, 0x89, 0x22, 0x54, 0xff, 0x1f, 0xb4, 0x91, 0x3a, 0xda, 0x71, 0x7, 0xac, 0x4c, 0xe7, 0xa0, 0xb, 0xeb, 0x40, 0x36, 0x9d, 0x7d, 0xd6, 0xa2, 0x9, 0xe9, 0x42, 0x34, 0x9f, 0x7f, 0xd4, 0x93, 0x38, 0xd8, 0x73, 0x5, 0xae, 0x4e, 0xe5, 0xc0, 0x6b, 0x8b, 0x20, 0x56, 0xfd, 0x1d, 0xb6, 0xf1, 0x5a, 0xba, 0x11, 0x67, 0xcc, 0x2c, 0x87, 0x66, 0xcd, 0x2d, 0x86, 0xf0, 0x5b, 0xbb, 0x10, 0x57, 0xfc, 0x1c, 0xb7, 0xc1, 0x6a, 0x8a, 0x21, 0x4, 0xaf, 0x4f, 0xe4, 0x92, 0x39, 0xd9, 0x72, 0x35, 0x9e, 0x7e, 0xd5, 0xa3, 0x8, 0xe8, 0x43}, [256]byte{0x0, 0xac, 0x45, 0xe9, 0x8a, 0x26, 0xcf, 0x63, 0x9, 0xa5, 0x4c, 0xe0, 0x83, 0x2f, 0xc6, 0x6a, 0x12, 0xbe, 0x57, 0xfb, 0x98, 0x34, 0xdd, 0x71, 0x1b, 0xb7, 0x5e, 0xf2, 0x91, 0x3d, 0xd4, 0x78, 0x24, 0x88, 0x61, 0xcd, 0xae, 0x2, 0xeb, 0x47, 0x2d, 0x81, 0x68, 0xc4, 0xa7, 0xb, 0xe2, 0x4e, 0x36, 0x9a, 0x73, 0xdf, 0xbc, 0x10, 0xf9, 0x55, 0x3f, 0x93, 0x7a, 0xd6, 0xb5, 0x19, 0xf0, 0x5c, 0x48, 0xe4, 0xd, 0xa1, 0xc2, 0x6e, 0x87, 0x2b, 0x41, 0xed, 0x4, 0xa8, 0xcb, 0x67, 0x8e, 0x22, 0x5a, 0xf6, 0x1f, 0xb3, 0xd0, 0x7c, 0x95, 0x39, 0x53, 0xff, 0x16, 0xba, 0xd9, 0x75, 0x9c, 0x30, 0x6c, 0xc0, 0x29, 0x85, 0xe6, 0x4a, 0xa3, 0xf, 0x65, 0xc9, 0x20, 0x8c, 0xef, 0x43, 0xaa, 0x6, 0x7e, 0xd2, 0x3b, 0x97, 0xf4, 0x58, 0xb1, 0x1d, 0x77, 0xdb, 0x32, 0x9e, 0xfd, 0x51, 0xb8, 0x14, 0x90, 0x3c, 0xd5, 0x79, 0x1a, 0xb6, 0x5f, 0xf3, 0x99, 0x35, 0xdc, 0x70, 0x13, 0xbf, 0x56, 0xfa, 0x82, 0x2e, 0xc7, 0x6b, 0x8, 0xa4, 0x4d, 0xe1, 0x8b, 0x27, 0xce, 0x62, 0x1, 0xad, 0x44, 0xe8, 0xb4, 0x18, 0xf1, 0x5d, 0x3e, 0x92, 0x7b, 0xd7, 0xbd, 0x11, 0xf8, 0x54, 0x37, 0x9b, 0x72, 0xde, 0xa6, 0xa, 0xe3, 0x4f, 0x2c, 0x80, 0x69, 0xc5, 0xaf, 0x3, 0xea, 0x46, 0x25, 0x89, 0x60, 0xcc, 0xd8, 0x74, 0x9d, 0x31, 0x52, 0xfe, 0x17, 0xbb, 0xd1, 0x7d, 0x94, 0x38, 0x5b, 0xf7, 0x1e, 0xb2, 0xca, 0x66, 0x8f, 0x23, 0x40, 0xec, 0x5, 0xa9, 0xc3, 0x6f, 0x86, 0x2a, 0x49, 0xe5, 0xc, 0xa0, 0xfc, 0x50, 0xb9, 0x15, 0x76, 0xda, 0x33, 0x9f, 0xf5, 0x59, 0xb0, 0x1c, 0x7f, 0xd3, 0x3a, 0x96, 0xee, 0x42, 0xab, 0x7, 0x64, 0xc8, 0x21, 0x8d, 0xe7, 0x4b, 0xa2, 0xe, 0x6d, 0xc1, 0x28, 0x84}, [256]byte{0x0, 0xad, 0x47, 0xea, 0x8e, 0x23, 0xc9, 0x64, 0x1, 0xac, 0x46, 0xeb, 0x8f, 0x22, 0xc8, 0x65, 0x2, 0xaf, 0x45, 0xe8, 0x8c, 0x21, 0xcb, 0x66, 0x3, 0xae, 0x44, 0xe9, 0x8d, 0x20, 0xca, 0x67, 0x4, 0xa9, 0x43, 0xee, 0x8a, 0x27, 0xcd, 0x60, 0x5, 0xa8, 0x42, 0xef, 0x8b, 0x26, 0xcc, 0x61, 0x6, 0xab, 0x41, 0xec, 0x88, 0x25, 0xcf, 0x62, 0x7, 0xaa, 0x40, 0xed, 0x89, 0x24, 0xce, 0x63, 0x8, 0xa5, 0x4f, 0xe2, 0x86, 0x2b, 0xc1, 0x6c, 0x9, 0xa4, 0x4e, 0xe3, 0x87, 0x2a, 0xc0, 0x6d, 0xa, 0xa7, 0x4d, 0xe0, 0x84, 0x29, 0xc3, 0x6e, 0xb, 0xa6, 0x4c, 0xe1, 0x85, 0x28, 0xc2, 0x6f, 0xc, 0xa1, 0x4b, 0xe6, 0x82, 0x2f, 0xc5, 0x68, 0xd, 0xa0, 0x4a, 0xe7, 0x83, 0x2e, 0xc4, 0x69, 0xe, 0xa3, 0x49, 0xe4, 0x80, 0x2d, 0xc7, 0x6a, 0xf, 0xa2, 0x48, 0xe5, 0x81, 0x2c, 0xc6, 0x6b, 0x10, 0xbd, 0x57, 0xfa, 0x9e, 0x33, 0xd9, 0x74, 0x11, 0xbc, 0x56, 0xfb, 0x9f, 0x32, 0xd8, 0x75, 0x12, 0xbf, 0x55, 0xf8, 0x9c, 0x31, 0xdb, 0x76, 0x13, 0xbe, 0x54, 0xf9, 0x9d, 0x30, 0xda, 0x77, 0x14, 0xb9, 0x53, 0xfe, 0x9a, 0x37, 0xdd, 0x70, 0x15, 0xb8, 0x52, 0xff, 0x9b, 0x36, 0xdc, 0x71, 0x16, 0xbb, 0x51, 0xfc, 0x98, 0x35, 0xdf, 0x72, 0x17, 0xba, 0x50, 0xfd, 0x99, 0x34, 0xde, 0x73, 0x18, 0xb5, 0x5f, 0xf2, 0x96, 0x3b, 0xd1, 0x7c, 0x19, 0xb4, 0x5e, 0xf3, 0x97, 0x3a, 0xd0, 0x7d, 0x1a, 0xb7, 0x5d, 0xf0, 0x94, 0x39, 0xd3, 0x7e, 0x1b, 0xb6, 0x5c, 0xf1, 0x95, 0x38, 0xd2, 0x7f, 0x1c, 0xb1, 0x5b, 0xf6, 0x92, 0x3f, 0xd5, 0x78, 0x1d, 0xb0, 0x5a, 0xf7, 0x93, 0x3e, 0xd4, 0x79, 0x1e, 0xb3, 0x59, 0xf4, 0x90, 0x3d, 0xd7, 0x7a, 0x1f, 0xb2, 0x58, 0xf5, 0x91, 0x3c, 0xd6, 0x7b}, [256]byte{0x0, 0xae, 0x41, 0xef, 0x82, 0x2c, 0xc3, 0x6d, 0x19, 0xb7, 0x58, 0xf6, 0x9b, 0x35, 0xda, 0x74, 0x32, 0x9c, 0x73, 0xdd, 0xb0, 0x1e, 0xf1, 0x5f, 0x2b, 0x85, 0x6a, 0xc4, 0xa9, 0x7, 0xe8, 0x46, 0x64, 0xca, 0x25, 0x8b, 0xe6, 0x48, 0xa7, 0x9, 0x7d, 0xd3, 0x3c, 0x92, 0xff, 0x51, 0xbe, 0x10, 0x56, 0xf8, 0x17, 0xb9, 0xd4, 0x7a, 0x95, 0x3b, 0x4f, 0xe1, 0xe, 0xa0, 0xcd, 0x63, 0x8c, 0x22, 0xc8, 0x66, 0x89, 0x27, 0x4a, 0xe4, 0xb, 0xa5, 0xd1, 0x7f, 0x90, 0x3e, 0x53, 0xfd, 0x12, 0xbc, 0xfa, 0x54, 0xbb, 0x15, 0x78, 0xd6, 0x39, 0x97, 0xe3, 0x4d, 0xa2, 0xc, 0x61, 0xcf, 0x20, 0x8e, 0xac, 0x2, 0xed, 0x43, 0x2e, 0x80, 0x6f, 0xc1, 0xb5, 0x1b, 0xf4, 0x5a, 0x37, 0x99, 0x76, 0xd8, 0x9e, 0x30, 0xdf, 0x71, 0x1c, 0xb2, 0x5d, 0xf3, 0x87, 0x29, 0xc6, 0x68, 0x5, 0xab, 0x44, 0xea, 0x8d, 0x23, 0xcc, 0x62, 0xf, 0xa1, 0x4e, 0xe0, 0x94, 0x3a, 0xd5, 0x7b, 0x16, 0xb8, 0x57, 0xf9, 0xbf, 0x11, 0xfe, 0x50, 0x3d, 0x93, 0x7c, 0xd2, 0xa6, 0x8, 0xe7, 0x49, 0x24, 0x8a, 0x65, 0xcb, 0xe9, 0x47, 0xa8, 0x6, 0x6b, 0xc5, 0x2a, 0x84, 0xf0, 0x5e, 0xb1, 0x1f, 0x72, 0xdc, 0x33, 0x9d, 0xdb, 0x75, 0x9a, 0x34, 0x59, 0xf7, 0x18, 0xb6, 0xc2, 0x6c, 0x83, 0x2d, 0x40, 0xee, 0x1, 0xaf, 0x45, 0xeb, 0x4, 0xaa, 0xc7, 0x69, 0x86, 0x28, 0x5c, 0xf2, 0x1d, 0xb3, 0xde, 0x70, 0x9f, 0x31, 0x77, 0xd9, 0x36, 0x98, 0xf5, 0x5b, 0xb4, 0x1a, 0x6e, 0xc0, 0x2f, 0x81, 0xec, 0x42, 0xad, 0x3, 0x21, 0x8f, 0x60, 0xce, 0xa3, 0xd, 0xe2, 0x4c, 0x38, 0x96, 0x79, 0xd7, 0xba, 0x14, 0xfb, 0x55, 0x13, 0xbd, 0x52, 0xfc, 0x91, 0x3f, 0xd0, 0x7e, 0xa, 0xa4, 0x4b, 0xe5, 0x88, 0x26, 0xc9, 0x67}, [256]byte{0x0, 0xaf, 0x43, 0xec, 0x86, 0x29, 0xc5, 0x6a, 0x11, 0xbe, 0x52, 0xfd, 0x97, 0x38, 0xd4, 0x7b, 0x22, 0x8d, 0x61, 0xce, 0xa4, 0xb, 0xe7, 0x48, 0x33, 0x9c, 0x70, 0xdf, 0xb5, 0x1a, 0xf6, 0x59, 0x44, 0xeb, 0x7, 0xa8, 0xc2, 0x6d, 0x81, 0x2e, 0x55, 0xfa, 0x16, 0xb9, 0xd3, 0x7c, 0x90, 0x3f, 0x66, 0xc9, 0x25, 0x8a, 0xe0, 0x4f, 0xa3, 0xc, 0x77, 0xd8, 0x34, 0x9b, 0xf1, 0x5e, 0xb2, 0x1d, 0x88, 0x27, 0xcb, 0x64, 0xe, 0xa1, 0x4d, 0xe2, 0x99, 0x36, 0xda, 0x75, 0x1f, 0xb0, 0x5c, 0xf3, 0xaa, 0x5, 0xe9, 0x46, 0x2c, 0x83, 0x6f, 0xc0, 0xbb, 0x14, 0xf8, 0x57, 0x3d, 0x92, 0x7e, 0xd1, 0xcc, 0x63, 0x8f, 0x20, 0x4a, 0xe5, 0x9, 0xa6, 0xdd, 0x72, 0x9e, 0x31, 0x5b, 0xf4, 0x18, 0xb7, 0xee, 0x41, 0xad, 0x2, 0x68, 0xc7, 0x2b, 0x84, 0xff, 0x50, 0xbc, 0x13, 0x79, 0xd6, 0x3a, 0x95, 0xd, 0xa2, 0x4e, 0xe1, 0x8b, 0x24, 0xc8, 0x67, 0x1c, 0xb3, 0x5f, 0xf0, 0x9a, 0x35, 0xd9, 0x76, 0x2f, 0x80, 0x6c, 0xc3, 0xa9, 0x6, 0xea, 0x45, 0x3e, 0x91, 0x7d, 0xd2, 0xb8, 0x17, 0xfb, 0x54, 0x49, 0xe6, 0xa, 0xa5, 0xcf, 0x60, 0x8c, 0x23, 0x58, 0xf7, 0x1b, 0xb4, 0xde, 0x71, 0x9d, 0x32, 0x6b, 0xc4, 0x28, 0x87, 0xed, 0x42, 0xae, 0x1, 0x7a, 0xd5, 0x39, 0x96, 0xfc, 0x53, 0xbf, 0x10, 0x85, 0x2a, 0xc6, 0x69, 0x3, 0xac, 0x40, 0xef, 0x94, 0x3b, 0xd7, 0x78, 0x12, 0xbd, 0x51, 0xfe, 0xa7, 0x8, 0xe4, 0x4b, 0x21, 0x8e, 0x62, 0xcd, 0xb6, 0x19, 0xf5, 0x5a, 0x30, 0x9f, 0x73, 0xdc, 0xc1, 0x6e, 0x82, 0x2d, 0x47, 0xe8, 0x4, 0xab, 0xd0, 0x7f, 0x93, 0x3c, 0x56, 0xf9, 0x15, 0xba, 0xe3, 0x4c, 0xa0, 0xf, 0x65, 0xca, 0x26, 0x89, 0xf2, 0x5d, 0xb1, 0x1e, 0x74, 0xdb, 0x37, 0x98}, [256]byte{0x0, 0xb0, 0x7d, 0xcd, 0xfa, 0x4a, 0x87, 0x37, 0xe9, 0x59, 0x94, 0x24, 0x13, 0xa3, 0x6e, 0xde, 0xcf, 0x7f, 0xb2, 0x2, 0x35, 0x85, 0x48, 0xf8, 0x26, 0x96, 0x5b, 0xeb, 0xdc, 0x6c, 0xa1, 0x11, 0x83, 0x33, 0xfe, 0x4e, 0x79, 0xc9, 0x4, 0xb4, 0x6a, 0xda, 0x17, 0xa7, 0x90, 0x20, 0xed, 0x5d, 0x4c, 0xfc, 0x31, 0x81, 0xb6, 0x6, 0xcb, 0x7b, 0xa5, 0x15, 0xd8, 0x68, 0x5f, 0xef, 0x22, 0x92, 0x1b, 0xab, 0x66, 0xd6, 0xe1, 0x51, 0x9c, 0x2c, 0xf2, 0x42, 0x8f, 0x3f, 0x8, 0xb8, 0x75, 0xc5, 0xd4, 0x64, 0xa9, 0x19, 0x2e, 0x9e, 0x53, 0xe3, 0x3d, 0x8d, 0x40, 0xf0, 0xc7, 0x77, 0xba, 0xa, 0x98, 0x28, 0xe5, 0x55, 0x62, 0xd2, 0x1f, 0xaf, 0x71, 0xc1, 0xc, 0xbc, 0x8b, 0x3b, 0xf6, 0x46, 0x57, 0xe7, 0x2a, 0x9a, 0xad, 0x1d, 0xd0, 0x60, 0xbe, 0xe, 0xc3, 0x73, 0x44, 0xf4, 0x39, 0x89, 0x36, 0x86, 0x4b, 0xfb, 0xcc, 0x7c, 0xb1, 0x1, 0xdf, 0x6f, 0xa2, 0x12, 0x25, 0x95, 0x58, 0xe8, 0xf9, 0x49, 0x84, 0x34, 0x3, 0xb3, 0x7e, 0xce, 0x10, 0xa0, 0x6d, 0xdd, 0xea, 0x5a, 0x97, 0x27, 0xb5, 0x5, 0xc8, 0x78, 0x4f, 0xff, 0x32, 0x82, 0x5c, 0xec, 0x21, 0x91, 0xa6, 0x16, 0xdb, 0x6b, 0x7a, 0xca, 0x7, 0xb7, 0x80, 0x30, 0xfd, 0x4d, 0x93, 0x23, 0xee, 0x5e, 0x69, 0xd9, 0x14, 0xa4, 0x2d, 0x9d, 0x50, 0xe0, 0xd7, 0x67, 0xaa, 0x1a, 0xc4, 0x74, 0xb9, 0x9, 0x3e, 0x8e, 0x43, 0xf3, 0xe2, 0x52, 0x9f, 0x2f, 0x18, 0xa8, 0x65, 0xd5, 0xb, 0xbb, 0x76, 0xc6, 0xf1, 0x41, 0x8c, 0x3c, 0xae, 0x1e, 0xd3, 0x63, 0x54, 0xe4, 0x29, 0x99, 0x47, 0xf7, 0x3a, 0x8a, 0xbd, 0xd, 0xc0, 0x70, 0x61, 0xd1, 0x1c, 0xac, 0x9b, 0x2b, 0xe6, 0x56, 0x88, 0x38, 0xf5, 0x45, 0x72, 0xc2, 0xf, 0xbf}, [256]byte{0x0, 0xb1, 0x7f, 0xce, 0xfe, 0x4f, 0x81, 0x30, 0xe1, 0x50, 0x9e, 0x2f, 0x1f, 0xae, 0x60, 0xd1, 0xdf, 0x6e, 0xa0, 0x11, 0x21, 0x90, 0x5e, 0xef, 0x3e, 0x8f, 0x41, 0xf0, 0xc0, 0x71, 0xbf, 0xe, 0xa3, 0x12, 0xdc, 0x6d, 0x5d, 0xec, 0x22, 0x93, 0x42, 0xf3, 0x3d, 0x8c, 0xbc, 0xd, 0xc3, 0x72, 0x7c, 0xcd, 0x3, 0xb2, 0x82, 0x33, 0xfd, 0x4c, 0x9d, 0x2c, 0xe2, 0x53, 0x63, 0xd2, 0x1c, 0xad, 0x5b, 0xea, 0x24, 0x95, 0xa5, 0x14, 0xda, 0x6b, 0xba, 0xb, 0xc5, 0x74, 0x44, 0xf5, 0x3b, 0x8a, 0x84, 0x35, 0xfb, 0x4a, 0x7a, 0xcb, 0x5, 0xb4, 0x65, 0xd4, 0x1a, 0xab, 0x9b, 0x2a, 0xe4, 0x55, 0xf8, 0x49, 0x87, 0x36, 0x6, 0xb7, 0x79, 0xc8, 0x19, 0xa8, 0x66, 0xd7, 0xe7, 0x56, 0x98, 0x29, 0x27, 0x96, 0x58, 0xe9, 0xd9, 0x68, 0xa6, 0x17, 0xc6, 0x77, 0xb9, 0x8, 0x38, 0x89, 0x47, 0xf6, 0xb6, 0x7, 0xc9, 0x78, 0x48, 0xf9, 0x37, 0x86, 0x57, 0xe6, 0x28, 0x99, 0xa9, 0x18, 0xd6, 0x67, 0x69, 0xd8, 0x16, 0xa7, 0x97, 0x26, 0xe8, 0x59, 0x88, 0x39, 0xf7, 0x46, 0x76, 0xc7, 0x9, 0xb8, 0x15, 0xa4, 0x6a, 0xdb, 0xeb, 0x5a, 0x94, 0x25, 0xf4, 0x45, 0x8b, 0x3a, 0xa, 0xbb, 0x75, 0xc4, 0xca, 0x7b, 0xb5, 0x4, 0x34, 0x85, 0x4b, 0xfa, 0x2b, 0x9a, 0x54, 0xe5, 0xd5, 0x64, 0xaa, 0x1b, 0xed, 0x5c, 0x92, 0x23, 0x13, 0xa2, 0x6c, 0xdd, 0xc, 0xbd, 0x73, 0xc2, 0xf2, 0x43, 0x8d, 0x3c, 0x32, 0x83, 0x4d, 0xfc, 0xcc, 0x7d, 0xb3, 0x2, 0xd3, 0x62, 0xac, 0x1d, 0x2d, 0x9c, 0x52, 0xe3, 0x4e, 0xff, 0x31, 0x80, 0xb0, 0x1, 0xcf, 0x7e, 0xaf, 0x1e, 0xd0, 0x61, 0x51, 0xe0, 0x2e, 0x9f, 0x91, 0x20, 0xee, 0x5f, 0x6f, 0xde, 0x10, 0xa1, 0x70, 0xc1, 0xf, 0xbe, 0x8e, 0x3f, 0xf1, 0x40}, [256]byte{0x0, 0xb2, 0x79, 0xcb, 0xf2, 0x40, 0x8b, 0x39, 0xf9, 0x4b, 0x80, 0x32, 0xb, 0xb9, 0x72, 0xc0, 0xef, 0x5d, 0x96, 0x24, 0x1d, 0xaf, 0x64, 0xd6, 0x16, 0xa4, 0x6f, 0xdd, 0xe4, 0x56, 0x9d, 0x2f, 0xc3, 0x71, 0xba, 0x8, 0x31, 0x83, 0x48, 0xfa, 0x3a, 0x88, 0x43, 0xf1, 0xc8, 0x7a, 0xb1, 0x3, 0x2c, 0x9e, 0x55, 0xe7, 0xde, 0x6c, 0xa7, 0x15, 0xd5, 0x67, 0xac, 0x1e, 0x27, 0x95, 0x5e, 0xec, 0x9b, 0x29, 0xe2, 0x50, 0x69, 0xdb, 0x10, 0xa2, 0x62, 0xd0, 0x1b, 0xa9, 0x90, 0x22, 0xe9, 0x5b, 0x74, 0xc6, 0xd, 0xbf, 0x86, 0x34, 0xff, 0x4d, 0x8d, 0x3f, 0xf4, 0x46, 0x7f, 0xcd, 0x6, 0xb4, 0x58, 0xea, 0x21, 0x93, 0xaa, 0x18, 0xd3, 0x61, 0xa1, 0x13, 0xd8, 0x6a, 0x53, 0xe1, 0x2a, 0x98, 0xb7, 0x5, 0xce, 0x7c, 0x45, 0xf7, 0x3c, 0x8e, 0x4e, 0xfc, 0x37, 0x85, 0xbc, 0xe, 0xc5, 0x77, 0x2b, 0x99, 0x52, 0xe0, 0xd9, 0x6b, 0xa0, 0x12, 0xd2, 0x60, 0xab, 0x19, 0x20, 0x92, 0x59, 0xeb, 0xc4, 0x76, 0xbd, 0xf, 0x36, 0x84, 0x4f, 0xfd, 0x3d, 0x8f, 0x44, 0xf6, 0xcf, 0x7d, 0xb6, 0x4, 0xe8, 0x5a, 0x91, 0x23, 0x1a, 0xa8, 0x63, 0xd1, 0x11, 0xa3, 0x68, 0xda, 0xe3, 0x51, 0x9a, 0x28, 0x7, 0xb5, 0x7e, 0xcc, 0xf5, 0x47, 0x8c, 0x3e, 0xfe, 0x4c, 0x87, 0x35, 0xc, 0xbe, 0x75, 0xc7, 0xb0, 0x2, 0xc9, 0x7b, 0x42, 0xf0, 0x3b, 0x89, 0x49, 0xfb, 0x30, 0x82, 0xbb, 0x9, 0xc2, 0x70, 0x5f, 0xed, 0x26, 0x94, 0xad, 0x1f, 0xd4, 0x66, 0xa6, 0x14, 0xdf, 0x6d, 0x54, 0xe6, 0x2d, 0x9f, 0x73, 0xc1, 0xa, 0xb8, 0x81, 0x33, 0xf8, 0x4a, 0x8a, 0x38, 0xf3, 0x41, 0x78, 0xca, 0x1, 0xb3, 0x9c, 0x2e, 0xe5, 0x57, 0x6e, 0xdc, 0x17, 0xa5, 0x65, 0xd7, 0x1c, 0xae, 0x97, 0x25, 0xee, 0x5c}, [256]byte{0x0, 0xb3, 0x7b, 0xc8, 0xf6, 0x45, 0x8d, 0x3e, 0xf1, 0x42, 0x8a, 0x39, 0x7, 0xb4, 0x7c, 0xcf, 0xff, 0x4c, 0x84, 0x37, 0x9, 0xba, 0x72, 0xc1, 0xe, 0xbd, 0x75, 0xc6, 0xf8, 0x4b, 0x83, 0x30, 0xe3, 0x50, 0x98, 0x2b, 0x15, 0xa6, 0x6e, 0xdd, 0x12, 0xa1, 0x69, 0xda, 0xe4, 0x57, 0x9f, 0x2c, 0x1c, 0xaf, 0x67, 0xd4, 0xea, 0x59, 0x91, 0x22, 0xed, 0x5e, 0x96, 0x25, 0x1b, 0xa8, 0x60, 0xd3, 0xdb, 0x68, 0xa0, 0x13, 0x2d, 0x9e, 0x56, 0xe5, 0x2a, 0x99, 0x51, 0xe2, 0xdc, 0x6f, 0xa7, 0x14, 0x24, 0x97, 0x5f, 0xec, 0xd2, 0x61, 0xa9, 0x1a, 0xd5, 0x66, 0xae, 0x1d, 0x23, 0x90, 0x58, 0xeb, 0x38, 0x8b, 0x43, 0xf0, 0xce, 0x7d, 0xb5, 0x6, 0xc9, 0x7a, 0xb2, 0x1, 0x3f, 0x8c, 0x44, 0xf7, 0xc7, 0x74, 0xbc, 0xf, 0x31, 0x82, 0x4a, 0xf9, 0x36, 0x85, 0x4d, 0xfe, 0xc0, 0x73, 0xbb, 0x8, 0xab, 0x18, 0xd0, 0x63, 0x5d, 0xee, 0x26, 0x95, 0x5a, 0xe9, 0x21, 0x92, 0xac, 0x1f, 0xd7, 0x64, 0x54, 0xe7, 0x2f, 0x9c, 0xa2, 0x11, 0xd9, 0x6a, 0xa5, 0x16, 0xde, 0x6d, 0x53, 0xe0, 0x28, 0x9b, 0x48, 0xfb, 0x33, 0x80, 0xbe, 0xd, 0xc5, 0x76, 0xb9, 0xa, 0xc2, 0x71, 0x4f, 0xfc, 0x34, 0x87, 0xb7, 0x4, 0xcc, 0x7f, 0x41, 0xf2, 0x3a, 0x89, 0x46, 0xf5, 0x3d, 0x8e, 0xb0, 0x3, 0xcb, 0x78, 0x70, 0xc3, 0xb, 0xb8, 0x86, 0x35, 0xfd, 0x4e, 0x81, 0x32, 0xfa, 0x49, 0x77, 0xc4, 0xc, 0xbf, 0x8f, 0x3c, 0xf4, 0x47, 0x79, 0xca, 0x2, 0xb1, 0x7e, 0xcd, 0x5, 0xb6, 0x88, 0x3b, 0xf3, 0x40, 0x93, 0x20, 0xe8, 0x5b, 0x65, 0xd6, 0x1e, 0xad, 0x62, 0xd1, 0x19, 0xaa, 0x94, 0x27, 0xef, 0x5c, 0x6c, 0xdf, 0x17, 0xa4, 0x9a, 0x29, 0xe1, 0x52, 0x9d, 0x2e, 0xe6, 0x55, 0x6b, 0xd8, 0x10, 0xa3}, [256]byte{0x0, 0xb4, 0x75, 0xc1, 0xea, 0x5e, 0x9f, 0x2b, 0xc9, 0x7d, 0xbc, 0x8, 0x23, 0x97, 0x56, 0xe2, 0x8f, 0x3b, 0xfa, 0x4e, 0x65, 0xd1, 0x10, 0xa4, 0x46, 0xf2, 0x33, 0x87, 0xac, 0x18, 0xd9, 0x6d, 0x3, 0xb7, 0x76, 0xc2, 0xe9, 0x5d, 0x9c, 0x28, 0xca, 0x7e, 0xbf, 0xb, 0x20, 0x94, 0x55, 0xe1, 0x8c, 0x38, 0xf9, 0x4d, 0x66, 0xd2, 0x13, 0xa7, 0x45, 0xf1, 0x30, 0x84, 0xaf, 0x1b, 0xda, 0x6e, 0x6, 0xb2, 0x73, 0xc7, 0xec, 0x58, 0x99, 0x2d, 0xcf, 0x7b, 0xba, 0xe, 0x25, 0x91, 0x50, 0xe4, 0x89, 0x3d, 0xfc, 0x48, 0x63, 0xd7, 0x16, 0xa2, 0x40, 0xf4, 0x35, 0x81, 0xaa, 0x1e, 0xdf, 0x6b, 0x5, 0xb1, 0x70, 0xc4, 0xef, 0x5b, 0x9a, 0x2e, 0xcc, 0x78, 0xb9, 0xd, 0x26, 0x92, 0x53, 0xe7, 0x8a, 0x3e, 0xff, 0x4b, 0x60, 0xd4, 0x15, 0xa1, 0x43, 0xf7, 0x36, 0x82, 0xa9, 0x1d, 0xdc, 0x68, 0xc, 0xb8, 0x79, 0xcd, 0xe6, 0x52, 0x93, 0x27, 0xc5, 0x71, 0xb0, 0x4, 0x2f, 0x9b, 0x5a, 0xee, 0x83, 0x37, 0xf6, 0x42, 0x69, 0xdd, 0x1c, 0xa8, 0x4a, 0xfe, 0x3f, 0x8b, 0xa0, 0x14, 0xd5, 0x61, 0xf, 0xbb, 0x7a, 0xce, 0xe5, 0x51, 0x90, 0x24, 0xc6, 0x72, 0xb3, 0x7, 0x2c, 0x98, 0x59, 0xed, 0x80, 0x34, 0xf5, 0x41, 0x6a, 0xde, 0x1f, 0xab, 0x49, 0xfd, 0x3c, 0x88, 0xa3, 0x17, 0xd6, 0x62, 0xa, 0xbe, 0x7f, 0xcb, 0xe0, 0x54, 0x95, 0x21, 0xc3, 0x77, 0xb6, 0x2, 0x29, 0x9d, 0x5c, 0xe8, 0x85, 0x31, 0xf0, 0x44, 0x6f, 0xdb, 0x1a, 0xae, 0x4c, 0xf8, 0x39, 0x8d, 0xa6, 0x12, 0xd3, 0x67, 0x9, 0xbd, 0x7c, 0xc8, 0xe3, 0x57, 0x96, 0x22, 0xc0, 0x74, 0xb5, 0x1, 0x2a, 0x9e, 0x5f, 0xeb, 0x86, 0x32, 0xf3, 0x47, 0x6c, 0xd8, 0x19, 0xad, 0x4f, 0xfb, 0x3a, 0x8e, 0xa5, 0x11, 0xd0, 0x64}, [256]byte{0x0, 0xb5, 0x77, 0xc2, 0xee, 0x5b, 0x99, 0x2c, 0xc1, 0x74, 0xb6, 0x3, 0x2f, 0x9a, 0x58, 0xed, 0x9f, 0x2a, 0xe8, 0x5d, 0x71, 0xc4, 0x6, 0xb3, 0x5e, 0xeb, 0x29, 0x9c, 0xb0, 0x5, 0xc7, 0x72, 0x23, 0x96, 0x54, 0xe1, 0xcd, 0x78, 0xba, 0xf, 0xe2, 0x57, 0x95, 0x20, 0xc, 0xb9, 0x7b, 0xce, 0xbc, 0x9, 0xcb, 0x7e, 0x52, 0xe7, 0x25, 0x90, 0x7d, 0xc8, 0xa, 0xbf, 0x93, 0x26, 0xe4, 0x51, 0x46, 0xf3, 0x31, 0x84, 0xa8, 0x1d, 0xdf, 0x6a, 0x87, 0x32, 0xf0, 0x45, 0x69, 0xdc, 0x1e, 0xab, 0xd9, 0x6c, 0xae, 0x1b, 0x37, 0x82, 0x40, 0xf5, 0x18, 0xad, 0x6f, 0xda, 0xf6, 0x43, 0x81, 0x34, 0x65, 0xd0, 0x12, 0xa7, 0x8b, 0x3e, 0xfc, 0x49, 0xa4, 0x11, 0xd3, 0x66, 0x4a, 0xff, 0x3d, 0x88, 0xfa, 0x4f, 0x8d, 0x38, 0x14, 0xa1, 0x63, 0xd6, 0x3b, 0x8e, 0x4c, 0xf9, 0xd5, 0x60, 0xa2, 0x17, 0x8c, 0x39, 0xfb, 0x4e, 0x62, 0xd7, 0x15, 0xa0, 0x4d, 0xf8, 0x3a, 0x8f, 0xa3, 0x16, 0xd4, 0x61, 0x13, 0xa6, 0x64, 0xd1, 0xfd, 0x48, 0x8a, 0x3f, 0xd2, 0x67, 0xa5, 0x10, 0x3c, 0x89, 0x4b, 0xfe, 0xaf, 0x1a, 0xd8, 0x6d, 0x41, 0xf4, 0x36, 0x83, 0x6e, 0xdb, 0x19, 0xac, 0x80, 0x35, 0xf7, 0x42, 0x30, 0x85, 0x47, 0xf2, 0xde, 0x6b, 0xa9, 0x1c, 0xf1, 0x44, 0x86, 0x33, 0x1f, 0xaa, 0x68, 0xdd, 0xca, 0x7f, 0xbd, 0x8, 0x24, 0x91, 0x53, 0xe6, 0xb, 0xbe, 0x7c, 0xc9, 0xe5, 0x50, 0x92, 0x27, 0x55, 0xe0, 0x22, 0x97, 0xbb, 0xe, 0xcc, 0x79, 0x94, 0x21, 0xe3, 0x56, 0x7a, 0xcf, 0xd, 0xb8, 0xe9, 0x5c, 0x9e, 0x2b, 0x7, 0xb2, 0x70, 0xc5, 0x28, 0x9d, 0x5f, 0xea, 0xc6, 0x73, 0xb1, 0x4, 0x76, 0xc3, 0x1, 0xb4, 0x98, 0x2d, 0xef, 0x5a, 0xb7, 0x2, 0xc0, 0x75, 0x59, 0xec, 0x2e, 0x9b}, [256]byte{0x0, 0xb6, 0x71, 0xc7, 0xe2, 0x54, 0x93, 0x25, 0xd9, 0x6f, 0xa8, 0x1e, 0x3b, 0x8d, 0x4a, 0xfc, 0xaf, 0x19, 0xde, 0x68, 0x4d, 0xfb, 0x3c, 0x8a, 0x76, 0xc0, 0x7, 0xb1, 0x94, 0x22, 0xe5, 0x53, 0x43, 0xf5, 0x32, 0x84, 0xa1, 0x17, 0xd0, 0x66, 0x9a, 0x2c, 0xeb, 0x5d, 0x78, 0xce, 0x9, 0xbf, 0xec, 0x5a, 0x9d, 0x2b, 0xe, 0xb8, 0x7f, 0xc9, 0x35, 0x83, 0x44, 0xf2, 0xd7, 0x61, 0xa6, 0x10, 0x86, 0x30, 0xf7, 0x41, 0x64, 0xd2, 0x15, 0xa3, 0x5f, 0xe9, 0x2e, 0x98, 0xbd, 0xb, 0xcc, 0x7a, 0x29, 0x9f, 0x58, 0xee, 0xcb, 0x7d, 0xba, 0xc, 0xf0, 0x46, 0x81, 0x37, 0x12, 0xa4, 0x63, 0xd5, 0xc5, 0x73, 0xb4, 0x2, 0x27, 0x91, 0x56, 0xe0, 0x1c, 0xaa, 0x6d, 0xdb, 0xfe, 0x48, 0x8f, 0x39, 0x6a, 0xdc, 0x1b, 0xad, 0x88, 0x3e, 0xf9, 0x4f, 0xb3, 0x5, 0xc2, 0x74, 0x51, 0xe7, 0x20, 0x96, 0x11, 0xa7, 0x60, 0xd6, 0xf3, 0x45, 0x82, 0x34, 0xc8, 0x7e, 0xb9, 0xf, 0x2a, 0x9c, 0x5b, 0xed, 0xbe, 0x8, 0xcf, 0x79, 0x5c, 0xea, 0x2d, 0x9b, 0x67, 0xd1, 0x16, 0xa0, 0x85, 0x33, 0xf4, 0x42, 0x52, 0xe4, 0x23, 0x95, 0xb0, 0x6, 0xc1, 0x77, 0x8b, 0x3d, 0xfa, 0x4c, 0x69, 0xdf, 0x18, 0xae, 0xfd, 0x4b, 0x8c, 0x3a, 0x1f, 0xa9, 0x6e, 0xd8, 0x24, 0x92, 0x55, 0xe3, 0xc6, 0x70, 0xb7, 0x1, 0x97, 0x21, 0xe6, 0x50, 0x75, 0xc3, 0x4, 0xb2, 0x4e, 0xf8, 0x3f, 0x89, 0xac, 0x1a, 0xdd, 0x6b, 0x38, 0x8e, 0x49, 0xff, 0xda, 0x6c, 0xab, 0x1d, 0xe1, 0x57, 0x90, 0x26, 0x3, 0xb5, 0x72, 0xc4, 0xd4, 0x62, 0xa5, 0x13, 0x36, 0x80, 0x47, 0xf1, 0xd, 0xbb, 0x7c, 0xca, 0xef, 0x59, 0x9e, 0x28, 0x7b, 0xcd, 0xa, 0xbc, 0x99, 0x2f, 0xe8, 0x5e, 0xa2, 0x14, 0xd3, 0x65, 0x40, 0xf6, 0x31, 0x87}, [256]byte{0x0, 0xb7, 0x73, 0xc4, 0xe6, 0x51, 0x95, 0x22, 0xd1, 0x66, 0xa2, 0x15, 0x37, 0x80, 0x44, 0xf3, 0xbf, 0x8, 0xcc, 0x7b, 0x59, 0xee, 0x2a, 0x9d, 0x6e, 0xd9, 0x1d, 0xaa, 0x88, 0x3f, 0xfb, 0x4c, 0x63, 0xd4, 0x10, 0xa7, 0x85, 0x32, 0xf6, 0x41, 0xb2, 0x5, 0xc1, 0x76, 0x54, 0xe3, 0x27, 0x90, 0xdc, 0x6b, 0xaf, 0x18, 0x3a, 0x8d, 0x49, 0xfe, 0xd, 0xba, 0x7e, 0xc9, 0xeb, 0x5c, 0x98, 0x2f, 0xc6, 0x71, 0xb5, 0x2, 0x20, 0x97, 0x53, 0xe4, 0x17, 0xa0, 0x64, 0xd3, 0xf1, 0x46, 0x82, 0x35, 0x79, 0xce, 0xa, 0xbd, 0x9f, 0x28, 0xec, 0x5b, 0xa8, 0x1f, 0xdb, 0x6c, 0x4e, 0xf9, 0x3d, 0x8a, 0xa5, 0x12, 0xd6, 0x61, 0x43, 0xf4, 0x30, 0x87, 0x74, 0xc3, 0x7, 0xb0, 0x92, 0x25, 0xe1, 0x56, 0x1a, 0xad, 0x69, 0xde, 0xfc, 0x4b, 0x8f, 0x38, 0xcb, 0x7c, 0xb8, 0xf, 0x2d, 0x9a, 0x5e, 0xe9, 0x91, 0x26, 0xe2, 0x55, 0x77, 0xc0, 0x4, 0xb3, 0x40, 0xf7, 0x33, 0x84, 0xa6, 0x11, 0xd5, 0x62, 0x2e, 0x99, 0x5d, 0xea, 0xc8, 0x7f, 0xbb, 0xc, 0xff, 0x48, 0x8c, 0x3b, 0x19, 0xae, 0x6a, 0xdd, 0xf2, 0x45, 0x81, 0x36, 0x14, 0xa3, 0x67, 0xd0, 0x23, 0x94, 0x50, 0xe7, 0xc5, 0x72, 0xb6, 0x1, 0x4d, 0xfa, 0x3e, 0x89, 0xab, 0x1c, 0xd8, 0x6f, 0x9c, 0x2b, 0xef, 0x58, 0x7a, 0xcd, 0x9, 0xbe, 0x57, 0xe0, 0x24, 0x93, 0xb1, 0x6, 0xc2, 0x75, 0x86, 0x31, 0xf5, 0x42, 0x60, 0xd7, 0x13, 0xa4, 0xe8, 0x5f, 0x9b, 0x2c, 0xe, 0xb9, 0x7d, 0xca, 0x39, 0x8e, 0x4a, 0xfd, 0xdf, 0x68, 0xac, 0x1b, 0x34, 0x83, 0x47, 0xf0, 0xd2, 0x65, 0xa1, 0x16, 0xe5, 0x52, 0x96, 0x21, 0x3, 0xb4, 0x70, 0xc7, 0x8b, 0x3c, 0xf8, 0x4f, 0x6d, 0xda, 0x1e, 0xa9, 0x5a, 0xed, 0x29, 0x9e, 0xbc, 0xb, 0xcf, 0x78}, [256]byte{0x0, 0xb8, 0x6d, 0xd5, 0xda, 0x62, 0xb7, 0xf, 0xa9, 0x11, 0xc4, 0x7c, 0x73, 0xcb, 0x1e, 0xa6, 0x4f, 0xf7, 0x22, 0x9a, 0x95, 0x2d, 0xf8, 0x40, 0xe6, 0x5e, 0x8b, 0x33, 0x3c, 0x84, 0x51, 0xe9, 0x9e, 0x26, 0xf3, 0x4b, 0x44, 0xfc, 0x29, 0x91, 0x37, 0x8f, 0x5a, 0xe2, 0xed, 0x55, 0x80, 0x38, 0xd1, 0x69, 0xbc, 0x4, 0xb, 0xb3, 0x66, 0xde, 0x78, 0xc0, 0x15, 0xad, 0xa2, 0x1a, 0xcf, 0x77, 0x21, 0x99, 0x4c, 0xf4, 0xfb, 0x43, 0x96, 0x2e, 0x88, 0x30, 0xe5, 0x5d, 0x52, 0xea, 0x3f, 0x87, 0x6e, 0xd6, 0x3, 0xbb, 0xb4, 0xc, 0xd9, 0x61, 0xc7, 0x7f, 0xaa, 0x12, 0x1d, 0xa5, 0x70, 0xc8, 0xbf, 0x7, 0xd2, 0x6a, 0x65, 0xdd, 0x8, 0xb0, 0x16, 0xae, 0x7b, 0xc3, 0xcc, 0x74, 0xa1, 0x19, 0xf0, 0x48, 0x9d, 0x25, 0x2a, 0x92, 0x47, 0xff, 0x59, 0xe1, 0x34, 0x8c, 0x83, 0x3b, 0xee, 0x56, 0x42, 0xfa, 0x2f, 0x97, 0x98, 0x20, 0xf5, 0x4d, 0xeb, 0x53, 0x86, 0x3e, 0x31, 0x89, 0x5c, 0xe4, 0xd, 0xb5, 0x60, 0xd8, 0xd7, 0x6f, 0xba, 0x2, 0xa4, 0x1c, 0xc9, 0x71, 0x7e, 0xc6, 0x13, 0xab, 0xdc, 0x64, 0xb1, 0x9, 0x6, 0xbe, 0x6b, 0xd3, 0x75, 0xcd, 0x18, 0xa0, 0xaf, 0x17, 0xc2, 0x7a, 0x93, 0x2b, 0xfe, 0x46, 0x49, 0xf1, 0x24, 0x9c, 0x3a, 0x82, 0x57, 0xef, 0xe0, 0x58, 0x8d, 0x35, 0x63, 0xdb, 0xe, 0xb6, 0xb9, 0x1, 0xd4, 0x6c, 0xca, 0x72, 0xa7, 0x1f, 0x10, 0xa8, 0x7d, 0xc5, 0x2c, 0x94, 0x41, 0xf9, 0xf6, 0x4e, 0x9b, 0x23, 0x85, 0x3d, 0xe8, 0x50, 0x5f, 0xe7, 0x32, 0x8a, 0xfd, 0x45, 0x90, 0x28, 0x27, 0x9f, 0x4a, 0xf2, 0x54, 0xec, 0x39, 0x81, 0x8e, 0x36, 0xe3, 0x5b, 0xb2, 0xa, 0xdf, 0x67, 0x68, 0xd0, 0x5, 0xbd, 0x1b, 0xa3, 0x76, 0xce, 0xc1, 0x79, 0xac, 0x14}, [256]byte{0x0, 0xb9, 0x6f, 0xd6, 0xde, 0x67, 0xb1, 0x8, 0xa1, 0x18, 0xce, 0x77, 0x7f, 0xc6, 0x10, 0xa9, 0x5f, 0xe6, 0x30, 0x89, 0x81, 0x38, 0xee, 0x57, 0xfe, 0x47, 0x91, 0x28, 0x20, 0x99, 0x4f, 0xf6, 0xbe, 0x7, 0xd1, 0x68, 0x60, 0xd9, 0xf, 0xb6, 0x1f, 0xa6, 0x70, 0xc9, 0xc1, 0x78, 0xae, 0x17, 0xe1, 0x58, 0x8e, 0x37, 0x3f, 0x86, 0x50, 0xe9, 0x40, 0xf9, 0x2f, 0x96, 0x9e, 0x27, 0xf1, 0x48, 0x61, 0xd8, 0xe, 0xb7, 0xbf, 0x6, 0xd0, 0x69, 0xc0, 0x79, 0xaf, 0x16, 0x1e, 0xa7, 0x71, 0xc8, 0x3e, 0x87, 0x51, 0xe8, 0xe0, 0x59, 0x8f, 0x36, 0x9f, 0x26, 0xf0, 0x49, 0x41, 0xf8, 0x2e, 0x97, 0xdf, 0x66, 0xb0, 0x9, 0x1, 0xb8, 0x6e, 0xd7, 0x7e, 0xc7, 0x11, 0xa8, 0xa0, 0x19, 0xcf, 0x76, 0x80, 0x39, 0xef, 0x56, 0x5e, 0xe7, 0x31, 0x88, 0x21, 0x98, 0x4e, 0xf7, 0xff, 0x46, 0x90, 0x29, 0xc2, 0x7b, 0xad, 0x14, 0x1c, 0xa5, 0x73, 0xca, 0x63, 0xda, 0xc, 0xb5, 0xbd, 0x4, 0xd2, 0x6b, 0x9d, 0x24, 0xf2, 0x4b, 0x43, 0xfa, 0x2c, 0x95, 0x3c, 0x85, 0x53, 0xea, 0xe2, 0x5b, 0x8d, 0x34, 0x7c, 0xc5, 0x13, 0xaa, 0xa2, 0x1b, 0xcd, 0x74, 0xdd, 0x64, 0xb2, 0xb, 0x3, 0xba, 0x6c, 0xd5, 0x23, 0x9a, 0x4c, 0xf5, 0xfd, 0x44, 0x92, 0x2b, 0x82, 0x3b, 0xed, 0x54, 0x5c, 0xe5, 0x33, 0x8a, 0xa3, 0x1a, 0xcc, 0x75, 0x7d, 0xc4, 0x12, 0xab, 0x2, 0xbb, 0x6d, 0xd4, 0xdc, 0x65, 0xb3, 0xa, 0xfc, 0x45, 0x93, 0x2a, 0x22, 0x9b, 0x4d, 0xf4, 0x5d, 0xe4, 0x32, 0x8b, 0x83, 0x3a, 0xec, 0x55, 0x1d, 0xa4, 0x72, 0xcb, 0xc3, 0x7a, 0xac, 0x15, 0xbc, 0x5, 0xd3, 0x6a, 0x62, 0xdb, 0xd, 0xb4, 0x42, 0xfb, 0x2d, 0x94, 0x9c, 0x25, 0xf3, 0x4a, 0xe3, 0x5a, 0x8c, 0x35, 0x3d, 0x84, 0x52, 0xeb}, [256]byte{0x0, 0xba, 0x69, 0xd3, 0xd2, 0x68, 0xbb, 0x1, 0xb9, 0x3, 0xd0, 0x6a, 0x6b, 0xd1, 0x2, 0xb8, 0x6f, 0xd5, 0x6, 0xbc, 0xbd, 0x7, 0xd4, 0x6e, 0xd6, 0x6c, 0xbf, 0x5, 0x4, 0xbe, 0x6d, 0xd7, 0xde, 0x64, 0xb7, 0xd, 0xc, 0xb6, 0x65, 0xdf, 0x67, 0xdd, 0xe, 0xb4, 0xb5, 0xf, 0xdc, 0x66, 0xb1, 0xb, 0xd8, 0x62, 0x63, 0xd9, 0xa, 0xb0, 0x8, 0xb2, 0x61, 0xdb, 0xda, 0x60, 0xb3, 0x9, 0xa1, 0x1b, 0xc8, 0x72, 0x73, 0xc9, 0x1a, 0xa0, 0x18, 0xa2, 0x71, 0xcb, 0xca, 0x70, 0xa3, 0x19, 0xce, 0x74, 0xa7, 0x1d, 0x1c, 0xa6, 0x75, 0xcf, 0x77, 0xcd, 0x1e, 0xa4, 0xa5, 0x1f, 0xcc, 0x76, 0x7f, 0xc5, 0x16, 0xac, 0xad, 0x17, 0xc4, 0x7e, 0xc6, 0x7c, 0xaf, 0x15, 0x14, 0xae, 0x7d, 0xc7, 0x10, 0xaa, 0x79, 0xc3, 0xc2, 0x78, 0xab, 0x11, 0xa9, 0x13, 0xc0, 0x7a, 0x7b, 0xc1, 0x12, 0xa8, 0x5f, 0xe5, 0x36, 0x8c, 0x8d, 0x37, 0xe4, 0x5e, 0xe6, 0x5c, 0x8f, 0x35, 0x34, 0x8e, 0x5d, 0xe7, 0x30, 0x8a, 0x59, 0xe3, 0xe2, 0x58, 0x8b, 0x31, 0x89, 0x33, 0xe0, 0x5a, 0x5b, 0xe1, 0x32, 0x88, 0x81, 0x3b, 0xe8, 0x52, 0x53, 0xe9, 0x3a, 0x80, 0x38, 0x82, 0x51, 0xeb, 0xea, 0x50, 0x83, 0x39, 0xee, 0x54, 0x87, 0x3d, 0x3c, 0x86, 0x55, 0xef, 0x57, 0xed, 0x3e, 0x84, 0x85, 0x3f, 0xec, 0x56, 0xfe, 0x44, 0x97, 0x2d, 0x2c, 0x96, 0x45, 0xff, 0x47, 0xfd, 0x2e, 0x94, 0x95, 0x2f, 0xfc, 0x46, 0x91, 0x2b, 0xf8, 0x42, 0x43, 0xf9, 0x2a, 0x90, 0x28, 0x92, 0x41, 0xfb, 0xfa, 0x40, 0x93, 0x29, 0x20, 0x9a, 0x49, 0xf3, 0xf2, 0x48, 0x9b, 0x21, 0x99, 0x23, 0xf0, 0x4a, 0x4b, 0xf1, 0x22, 0x98, 0x4f, 0xf5, 0x26, 0x9c, 0x9d, 0x27, 0xf4, 0x4e, 0xf6, 0x4c, 0x9f, 0x25, 0x24, 0x9e, 0x4d, 0xf7}, [256]byte{0x0, 0xbb, 0x6b, 0xd0, 0xd6, 0x6d, 0xbd, 0x6, 0xb1, 0xa, 0xda, 0x61, 0x67, 0xdc, 0xc, 0xb7, 0x7f, 0xc4, 0x14, 0xaf, 0xa9, 0x12, 0xc2, 0x79, 0xce, 0x75, 0xa5, 0x1e, 0x18, 0xa3, 0x73, 0xc8, 0xfe, 0x45, 0x95, 0x2e, 0x28, 0x93, 0x43, 0xf8, 0x4f, 0xf4, 0x24, 0x9f, 0x99, 0x22, 0xf2, 0x49, 0x81, 0x3a, 0xea, 0x51, 0x57, 0xec, 0x3c, 0x87, 0x30, 0x8b, 0x5b, 0xe0, 0xe6, 0x5d, 0x8d, 0x36, 0xe1, 0x5a, 0x8a, 0x31, 0x37, 0x8c, 0x5c, 0xe7, 0x50, 0xeb, 0x3b, 0x80, 0x86, 0x3d, 0xed, 0x56, 0x9e, 0x25, 0xf5, 0x4e, 0x48, 0xf3, 0x23, 0x98, 0x2f, 0x94, 0x44, 0xff, 0xf9, 0x42, 0x92, 0x29, 0x1f, 0xa4, 0x74, 0xcf, 0xc9, 0x72, 0xa2, 0x19, 0xae, 0x15, 0xc5, 0x7e, 0x78, 0xc3, 0x13, 0xa8, 0x60, 0xdb, 0xb, 0xb0, 0xb6, 0xd, 0xdd, 0x66, 0xd1, 0x6a, 0xba, 0x1, 0x7, 0xbc, 0x6c, 0xd7, 0xdf, 0x64, 0xb4, 0xf, 0x9, 0xb2, 0x62, 0xd9, 0x6e, 0xd5, 0x5, 0xbe, 0xb8, 0x3, 0xd3, 0x68, 0xa0, 0x1b, 0xcb, 0x70, 0x76, 0xcd, 0x1d, 0xa6, 0x11, 0xaa, 0x7a, 0xc1, 0xc7, 0x7c, 0xac, 0x17, 0x21, 0x9a, 0x4a, 0xf1, 0xf7, 0x4c, 0x9c, 0x27, 0x90, 0x2b, 0xfb, 0x40, 0x46, 0xfd, 0x2d, 0x96, 0x5e, 0xe5, 0x35, 0x8e, 0x88, 0x33, 0xe3, 0x58, 0xef, 0x54, 0x84, 0x3f, 0x39, 0x82, 0x52, 0xe9, 0x3e, 0x85, 0x55, 0xee, 0xe8, 0x53, 0x83, 0x38, 0x8f, 0x34, 0xe4, 0x5f, 0x59, 0xe2, 0x32, 0x89, 0x41, 0xfa, 0x2a, 0x91, 0x97, 0x2c, 0xfc, 0x47, 0xf0, 0x4b, 0x9b, 0x20, 0x26, 0x9d, 0x4d, 0xf6, 0xc0, 0x7b, 0xab, 0x10, 0x16, 0xad, 0x7d, 0xc6, 0x71, 0xca, 0x1a, 0xa1, 0xa7, 0x1c, 0xcc, 0x77, 0xbf, 0x4, 0xd4, 0x6f, 0x69, 0xd2, 0x2, 0xb9, 0xe, 0xb5, 0x65, 0xde, 0xd8, 0x63, 0xb3, 0x8}, [256]byte{0x0, 0xbc, 0x65, 0xd9, 0xca, 0x76, 0xaf, 0x13, 0x89, 0x35, 0xec, 0x50, 0x43, 0xff, 0x26, 0x9a, 0xf, 0xb3, 0x6a, 0xd6, 0xc5, 0x79, 0xa0, 0x1c, 0x86, 0x3a, 0xe3, 0x5f, 0x4c, 0xf0, 0x29, 0x95, 0x1e, 0xa2, 0x7b, 0xc7, 0xd4, 0x68, 0xb1, 0xd, 0x97, 0x2b, 0xf2, 0x4e, 0x5d, 0xe1, 0x38, 0x84, 0x11, 0xad, 0x74, 0xc8, 0xdb, 0x67, 0xbe, 0x2, 0x98, 0x24, 0xfd, 0x41, 0x52, 0xee, 0x37, 0x8b, 0x3c, 0x80, 0x59, 0xe5, 0xf6, 0x4a, 0x93, 0x2f, 0xb5, 0x9, 0xd0, 0x6c, 0x7f, 0xc3, 0x1a, 0xa6, 0x33, 0x8f, 0x56, 0xea, 0xf9, 0x45, 0x9c, 0x20, 0xba, 0x6, 0xdf, 0x63, 0x70, 0xcc, 0x15, 0xa9, 0x22, 0x9e, 0x47, 0xfb, 0xe8, 0x54, 0x8d, 0x31, 0xab, 0x17, 0xce, 0x72, 0x61, 0xdd, 0x4, 0xb8, 0x2d, 0x91, 0x48, 0xf4, 0xe7, 0x5b, 0x82, 0x3e, 0xa4, 0x18, 0xc1, 0x7d, 0x6e, 0xd2, 0xb, 0xb7, 0x78, 0xc4, 0x1d, 0xa1, 0xb2, 0xe, 0xd7, 0x6b, 0xf1, 0x4d, 0x94, 0x28, 0x3b, 0x87, 0x5e, 0xe2, 0x77, 0xcb, 0x12, 0xae, 0xbd, 0x1, 0xd8, 0x64, 0xfe, 0x42, 0x9b, 0x27, 0x34, 0x88, 0x51, 0xed, 0x66, 0xda, 0x3, 0xbf, 0xac, 0x10, 0xc9, 0x75, 0xef, 0x53, 0x8a, 0x36, 0x25, 0x99, 0x40, 0xfc, 0x69, 0xd5, 0xc, 0xb0, 0xa3, 0x1f, 0xc6, 0x7a, 0xe0, 0x5c, 0x85, 0x39, 0x2a, 0x96, 0x4f, 0xf3, 0x44, 0xf8, 0x21, 0x9d, 0x8e, 0x32, 0xeb, 0x57, 0xcd, 0x71, 0xa8, 0x14, 0x7, 0xbb, 0x62, 0xde, 0x4b, 0xf7, 0x2e, 0x92, 0x81, 0x3d, 0xe4, 0x58, 0xc2, 0x7e, 0xa7, 0x1b, 0x8, 0xb4, 0x6d, 0xd1, 0x5a, 0xe6, 0x3f, 0x83, 0x90, 0x2c, 0xf5, 0x49, 0xd3, 0x6f, 0xb6, 0xa, 0x19, 0xa5, 0x7c, 0xc0, 0x55, 0xe9, 0x30, 0x8c, 0x9f, 0x23, 0xfa, 0x46, 0xdc, 0x60, 0xb9, 0x5, 0x16, 0xaa, 0x73, 0xcf}, [256]byte{0x0, 0xbd, 0x67, 0xda, 0xce, 0x73, 0xa9, 0x14, 0x81, 0x3c, 0xe6, 0x5b, 0x4f, 0xf2, 0x28, 0x95, 0x1f, 0xa2, 0x78, 0xc5, 0xd1, 0x6c, 0xb6, 0xb, 0x9e, 0x23, 0xf9, 0x44, 0x50, 0xed, 0x37, 0x8a, 0x3e, 0x83, 0x59, 0xe4, 0xf0, 0x4d, 0x97, 0x2a, 0xbf, 0x2, 0xd8, 0x65, 0x71, 0xcc, 0x16, 0xab, 0x21, 0x9c, 0x46, 0xfb, 0xef, 0x52, 0x88, 0x35, 0xa0, 0x1d, 0xc7, 0x7a, 0x6e, 0xd3, 0x9, 0xb4, 0x7c, 0xc1, 0x1b, 0xa6, 0xb2, 0xf, 0xd5, 0x68, 0xfd, 0x40, 0x9a, 0x27, 0x33, 0x8e, 0x54, 0xe9, 0x63, 0xde, 0x4, 0xb9, 0xad, 0x10, 0xca, 0x77, 0xe2, 0x5f, 0x85, 0x38, 0x2c, 0x91, 0x4b, 0xf6, 0x42, 0xff, 0x25, 0x98, 0x8c, 0x31, 0xeb, 0x56, 0xc3, 0x7e, 0xa4, 0x19, 0xd, 0xb0, 0x6a, 0xd7, 0x5d, 0xe0, 0x3a, 0x87, 0x93, 0x2e, 0xf4, 0x49, 0xdc, 0x61, 0xbb, 0x6, 0x12, 0xaf, 0x75, 0xc8, 0xf8, 0x45, 0x9f, 0x22, 0x36, 0x8b, 0x51, 0xec, 0x79, 0xc4, 0x1e, 0xa3, 0xb7, 0xa, 0xd0, 0x6d, 0xe7, 0x5a, 0x80, 0x3d, 0x29, 0x94, 0x4e, 0xf3, 0x66, 0xdb, 0x1, 0xbc, 0xa8, 0x15, 0xcf, 0x72, 0xc6, 0x7b, 0xa1, 0x1c, 0x8, 0xb5, 0x6f, 0xd2, 0x47, 0xfa, 0x20, 0x9d, 0x89, 0x34, 0xee, 0x53, 0xd9, 0x64, 0xbe, 0x3, 0x17, 0xaa, 0x70, 0xcd, 0x58, 0xe5, 0x3f, 0x82, 0x96, 0x2b, 0xf1, 0x4c, 0x84, 0x39, 0xe3, 0x5e, 0x4a, 0xf7, 0x2d, 0x90, 0x5, 0xb8, 0x62, 0xdf, 0xcb, 0x76, 0xac, 0x11, 0x9b, 0x26, 0xfc, 0x41, 0x55, 0xe8, 0x32, 0x8f, 0x1a, 0xa7, 0x7d, 0xc0, 0xd4, 0x69, 0xb3, 0xe, 0xba, 0x7, 0xdd, 0x60, 0x74, 0xc9, 0x13, 0xae, 0x3b, 0x86, 0x5c, 0xe1, 0xf5, 0x48, 0x92, 0x2f, 0xa5, 0x18, 0xc2, 0x7f, 0x6b, 0xd6, 0xc, 0xb1, 0x24, 0x99, 0x43, 0xfe, 0xea, 0x57, 0x8d, 0x30}, [256]byte{0x0, 0xbe, 0x61, 0xdf, 0xc2, 0x7c, 0xa3, 0x1d, 0x99, 0x27, 0xf8, 0x46, 0x5b, 0xe5, 0x3a, 0x84, 0x2f, 0x91, 0x4e, 0xf0, 0xed, 0x53, 0x8c, 0x32, 0xb6, 0x8, 0xd7, 0x69, 0x74, 0xca, 0x15, 0xab, 0x5e, 0xe0, 0x3f, 0x81, 0x9c, 0x22, 0xfd, 0x43, 0xc7, 0x79, 0xa6, 0x18, 0x5, 0xbb, 0x64, 0xda, 0x71, 0xcf, 0x10, 0xae, 0xb3, 0xd, 0xd2, 0x6c, 0xe8, 0x56, 0x89, 0x37, 0x2a, 0x94, 0x4b, 0xf5, 0xbc, 0x2, 0xdd, 0x63, 0x7e, 0xc0, 0x1f, 0xa1, 0x25, 0x9b, 0x44, 0xfa, 0xe7, 0x59, 0x86, 0x38, 0x93, 0x2d, 0xf2, 0x4c, 0x51, 0xef, 0x30, 0x8e, 0xa, 0xb4, 0x6b, 0xd5, 0xc8, 0x76, 0xa9, 0x17, 0xe2, 0x5c, 0x83, 0x3d, 0x20, 0x9e, 0x41, 0xff, 0x7b, 0xc5, 0x1a, 0xa4, 0xb9, 0x7, 0xd8, 0x66, 0xcd, 0x73, 0xac, 0x12, 0xf, 0xb1, 0x6e, 0xd0, 0x54, 0xea, 0x35, 0x8b, 0x96, 0x28, 0xf7, 0x49, 0x65, 0xdb, 0x4, 0xba, 0xa7, 0x19, 0xc6, 0x78, 0xfc, 0x42, 0x9d, 0x23, 0x3e, 0x80, 0x5f, 0xe1, 0x4a, 0xf4, 0x2b, 0x95, 0x88, 0x36, 0xe9, 0x57, 0xd3, 0x6d, 0xb2, 0xc, 0x11, 0xaf, 0x70, 0xce, 0x3b, 0x85, 0x5a, 0xe4, 0xf9, 0x47, 0x98, 0x26, 0xa2, 0x1c, 0xc3, 0x7d, 0x60, 0xde, 0x1, 0xbf, 0x14, 0xaa, 0x75, 0xcb, 0xd6, 0x68, 0xb7, 0x9, 0x8d, 0x33, 0xec, 0x52, 0x4f, 0xf1, 0x2e, 0x90, 0xd9, 0x67, 0xb8, 0x6, 0x1b, 0xa5, 0x7a, 0xc4, 0x40, 0xfe, 0x21, 0x9f, 0x82, 0x3c, 0xe3, 0x5d, 0xf6, 0x48, 0x97, 0x29, 0x34, 0x8a, 0x55, 0xeb, 0x6f, 0xd1, 0xe, 0xb0, 0xad, 0x13, 0xcc, 0x72, 0x87, 0x39, 0xe6, 0x58, 0x45, 0xfb, 0x24, 0x9a, 0x1e, 0xa0, 0x7f, 0xc1, 0xdc, 0x62, 0xbd, 0x3, 0xa8, 0x16, 0xc9, 0x77, 0x6a, 0xd4, 0xb, 0xb5, 0x31, 0x8f, 0x50, 0xee, 0xf3, 0x4d, 0x92, 0x2c}, [256]byte{0x0, 0xbf, 0x63, 0xdc, 0xc6, 0x79, 0xa5, 0x1a, 0x91, 0x2e, 0xf2, 0x4d, 0x57, 0xe8, 0x34, 0x8b, 0x3f, 0x80, 0x5c, 0xe3, 0xf9, 0x46, 0x9a, 0x25, 0xae, 0x11, 0xcd, 0x72, 0x68, 0xd7, 0xb, 0xb4, 0x7e, 0xc1, 0x1d, 0xa2, 0xb8, 0x7, 0xdb, 0x64, 0xef, 0x50, 0x8c, 0x33, 0x29, 0x96, 0x4a, 0xf5, 0x41, 0xfe, 0x22, 0x9d, 0x87, 0x38, 0xe4, 0x5b, 0xd0, 0x6f, 0xb3, 0xc, 0x16, 0xa9, 0x75, 0xca, 0xfc, 0x43, 0x9f, 0x20, 0x3a, 0x85, 0x59, 0xe6, 0x6d, 0xd2, 0xe, 0xb1, 0xab, 0x14, 0xc8, 0x77, 0xc3, 0x7c, 0xa0, 0x1f, 0x5, 0xba, 0x66, 0xd9, 0x52, 0xed, 0x31, 0x8e, 0x94, 0x2b, 0xf7, 0x48, 0x82, 0x3d, 0xe1, 0x5e, 0x44, 0xfb, 0x27, 0x98, 0x13, 0xac, 0x70, 0xcf, 0xd5, 0x6a, 0xb6, 0x9, 0xbd, 0x2, 0xde, 0x61, 0x7b, 0xc4, 0x18, 0xa7, 0x2c, 0x93, 0x4f, 0xf0, 0xea, 0x55, 0x89, 0x36, 0xe5, 0x5a, 0x86, 0x39, 0x23, 0x9c, 0x40, 0xff, 0x74, 0xcb, 0x17, 0xa8, 0xb2, 0xd, 0xd1, 0x6e, 0xda, 0x65, 0xb9, 0x6, 0x1c, 0xa3, 0x7f, 0xc0, 0x4b, 0xf4, 0x28, 0x97, 0x8d, 0x32, 0xee, 0x51, 0x9b, 0x24, 0xf8, 0x47, 0x5d, 0xe2, 0x3e, 0x81, 0xa, 0xb5, 0x69, 0xd6, 0xcc, 0x73, 0xaf, 0x10, 0xa4, 0x1b, 0xc7, 0x78, 0x62, 0xdd, 0x1, 0xbe, 0x35, 0x8a, 0x56, 0xe9, 0xf3, 0x4c, 0x90, 0x2f, 0x19, 0xa6, 0x7a, 0xc5, 0xdf, 0x60, 0xbc, 0x3, 0x88, 0x37, 0xeb, 0x54, 0x4e, 0xf1, 0x2d, 0x92, 0x26, 0x99, 0x45, 0xfa, 0xe0, 0x5f, 0x83, 0x3c, 0xb7, 0x8, 0xd4, 0x6b, 0x71, 0xce, 0x12, 0xad, 0x67, 0xd8, 0x4, 0xbb, 0xa1, 0x1e, 0xc2, 0x7d, 0xf6, 0x49, 0x95, 0x2a, 0x30, 0x8f, 0x53, 0xec, 0x58, 0xe7, 0x3b, 0x84, 0x9e, 0x21, 0xfd, 0x42, 0xc9, 0x76, 0xaa, 0x15, 0xf, 0xb0, 0x6c, 0xd3}, [256]byte{0x0, 0xc0, 0x9d, 0x5d, 0x27, 0xe7, 0xba, 0x7a, 0x4e, 0x8e, 0xd3, 0x13, 0x69, 0xa9, 0xf4, 0x34, 0x9c, 0x5c, 0x1, 0xc1, 0xbb, 0x7b, 0x26, 0xe6, 0xd2, 0x12, 0x4f, 0x8f, 0xf5, 0x35, 0x68, 0xa8, 0x25, 0xe5, 0xb8, 0x78, 0x2, 0xc2, 0x9f, 0x5f, 0x6b, 0xab, 0xf6, 0x36, 0x4c, 0x8c, 0xd1, 0x11, 0xb9, 0x79, 0x24, 0xe4, 0x9e, 0x5e, 0x3, 0xc3, 0xf7, 0x37, 0x6a, 0xaa, 0xd0, 0x10, 0x4d, 0x8d, 0x4a, 0x8a, 0xd7, 0x17, 0x6d, 0xad, 0xf0, 0x30, 0x4, 0xc4, 0x99, 0x59, 0x23, 0xe3, 0xbe, 0x7e, 0xd6, 0x16, 0x4b, 0x8b, 0xf1, 0x31, 0x6c, 0xac, 0x98, 0x58, 0x5, 0xc5, 0xbf, 0x7f, 0x22, 0xe2, 0x6f, 0xaf, 0xf2, 0x32, 0x48, 0x88, 0xd5, 0x15, 0x21, 0xe1, 0xbc, 0x7c, 0x6, 0xc6, 0x9b, 0x5b, 0xf3, 0x33, 0x6e, 0xae, 0xd4, 0x14, 0x49, 0x89, 0xbd, 0x7d, 0x20, 0xe0, 0x9a, 0x5a, 0x7, 0xc7, 0x94, 0x54, 0x9, 0xc9, 0xb3, 0x73, 0x2e, 0xee, 0xda, 0x1a, 0x47, 0x87, 0xfd, 0x3d, 0x60, 0xa0, 0x8, 0xc8, 0x95, 0x55, 0x2f, 0xef, 0xb2, 0x72, 0x46, 0x86, 0xdb, 0x1b, 0x61, 0xa1, 0xfc, 0x3c, 0xb1, 0x71, 0x2c, 0xec, 0x96, 0x56, 0xb, 0xcb, 0xff, 0x3f, 0x62, 0xa2, 0xd8, 0x18, 0x45, 0x85, 0x2d, 0xed, 0xb0, 0x70, 0xa, 0xca, 0x97, 0x57, 0x63, 0xa3, 0xfe, 0x3e, 0x44, 0x84, 0xd9, 0x19, 0xde, 0x1e, 0x43, 0x83, 0xf9, 0x39, 0x64, 0xa4, 0x90, 0x50, 0xd, 0xcd, 0xb7, 0x77, 0x2a, 0xea, 0x42, 0x82, 0xdf, 0x1f, 0x65, 0xa5, 0xf8, 0x38, 0xc, 0xcc, 0x91, 0x51, 0x2b, 0xeb, 0xb6, 0x76, 0xfb, 0x3b, 0x66, 0xa6, 0xdc, 0x1c, 0x41, 0x81, 0xb5, 0x75, 0x28, 0xe8, 0x92, 0x52, 0xf, 0xcf, 0x67, 0xa7, 0xfa, 0x3a, 0x40, 0x80, 0xdd, 0x1d, 0x29, 0xe9, 0xb4, 0x74, 0xe, 0xce, 0x93, 0x53}, [256]byte{0x0, 0xc1, 0x9f, 0x5e, 0x23, 0xe2, 0xbc, 0x7d, 0x46, 0x87, 0xd9, 0x18, 0x65, 0xa4, 0xfa, 0x3b, 0x8c, 0x4d, 0x13, 0xd2, 0xaf, 0x6e, 0x30, 0xf1, 0xca, 0xb, 0x55, 0x94, 0xe9, 0x28, 0x76, 0xb7, 0x5, 0xc4, 0x9a, 0x5b, 0x26, 0xe7, 0xb9, 0x78, 0x43, 0x82, 0xdc, 0x1d, 0x60, 0xa1, 0xff, 0x3e, 0x89, 0x48, 0x16, 0xd7, 0xaa, 0x6b, 0x35, 0xf4, 0xcf, 0xe, 0x50, 0x91, 0xec, 0x2d, 0x73, 0xb2, 0xa, 0xcb, 0x95, 0x54, 0x29, 0xe8, 0xb6, 0x77, 0x4c, 0x8d, 0xd3, 0x12, 0x6f, 0xae, 0xf0, 0x31, 0x86, 0x47, 0x19, 0xd8, 0xa5, 0x64, 0x3a, 0xfb, 0xc0, 0x1, 0x5f, 0x9e, 0xe3, 0x22, 0x7c, 0xbd, 0xf, 0xce, 0x90, 0x51, 0x2c, 0xed, 0xb3, 0x72, 0x49, 0x88, 0xd6, 0x17, 0x6a, 0xab, 0xf5, 0x34, 0x83, 0x42, 0x1c, 0xdd, 0xa0, 0x61, 0x3f, 0xfe, 0xc5, 0x4, 0x5a, 0x9b, 0xe6, 0x27, 0x79, 0xb8, 0x14, 0xd5, 0x8b, 0x4a, 0x37, 0xf6, 0xa8, 0x69, 0x52, 0x93, 0xcd, 0xc, 0x71, 0xb0, 0xee, 0x2f, 0x98, 0x59, 0x7, 0xc6, 0xbb, 0x7a, 0x24, 0xe5, 0xde, 0x1f, 0x41, 0x80, 0xfd, 0x3c, 0x62, 0xa3, 0x11, 0xd0, 0x8e, 0x4f, 0x32, 0xf3, 0xad, 0x6c, 0x57, 0x96, 0xc8, 0x9, 0x74, 0xb5, 0xeb, 0x2a, 0x9d, 0x5c, 0x2, 0xc3, 0xbe, 0x7f, 0x21, 0xe0, 0xdb, 0x1a, 0x44, 0x85, 0xf8, 0x39, 0x67, 0xa6, 0x1e, 0xdf, 0x81, 0x40, 0x3d, 0xfc, 0xa2, 0x63, 0x58, 0x99, 0xc7, 0x6, 0x7b, 0xba, 0xe4, 0x25, 0x92, 0x53, 0xd, 0xcc, 0xb1, 0x70, 0x2e, 0xef, 0xd4, 0x15, 0x4b, 0x8a, 0xf7, 0x36, 0x68, 0xa9, 0x1b, 0xda, 0x84, 0x45, 0x38, 0xf9, 0xa7, 0x66, 0x5d, 0x9c, 0xc2, 0x3, 0x7e, 0xbf, 0xe1, 0x20, 0x97, 0x56, 0x8, 0xc9, 0xb4, 0x75, 0x2b, 0xea, 0xd1, 0x10, 0x4e, 0x8f, 0xf2, 0x33, 0x6d, 0xac}, [256]byte{0x0, 0xc2, 0x99, 0x5b, 0x2f, 0xed, 0xb6, 0x74, 0x5e, 0x9c, 0xc7, 0x5, 0x71, 0xb3, 0xe8, 0x2a, 0xbc, 0x7e, 0x25, 0xe7, 0x93, 0x51, 0xa, 0xc8, 0xe2, 0x20, 0x7b, 0xb9, 0xcd, 0xf, 0x54, 0x96, 0x65, 0xa7, 0xfc, 0x3e, 0x4a, 0x88, 0xd3, 0x11, 0x3b, 0xf9, 0xa2, 0x60, 0x14, 0xd6, 0x8d, 0x4f, 0xd9, 0x1b, 0x40, 0x82, 0xf6, 0x34, 0x6f, 0xad, 0x87, 0x45, 0x1e, 0xdc, 0xa8, 0x6a, 0x31, 0xf3, 0xca, 0x8, 0x53, 0x91, 0xe5, 0x27, 0x7c, 0xbe, 0x94, 0x56, 0xd, 0xcf, 0xbb, 0x79, 0x22, 0xe0, 0x76, 0xb4, 0xef, 0x2d, 0x59, 0x9b, 0xc0, 0x2, 0x28, 0xea, 0xb1, 0x73, 0x7, 0xc5, 0x9e, 0x5c, 0xaf, 0x6d, 0x36, 0xf4, 0x80, 0x42, 0x19, 0xdb, 0xf1, 0x33, 0x68, 0xaa, 0xde, 0x1c, 0x47, 0x85, 0x13, 0xd1, 0x8a, 0x48, 0x3c, 0xfe, 0xa5, 0x67, 0x4d, 0x8f, 0xd4, 0x16, 0x62, 0xa0, 0xfb, 0x39, 0x89, 0x4b, 0x10, 0xd2, 0xa6, 0x64, 0x3f, 0xfd, 0xd7, 0x15, 0x4e, 0x8c, 0xf8, 0x3a, 0x61, 0xa3, 0x35, 0xf7, 0xac, 0x6e, 0x1a, 0xd8, 0x83, 0x41, 0x6b, 0xa9, 0xf2, 0x30, 0x44, 0x86, 0xdd, 0x1f, 0xec, 0x2e, 0x75, 0xb7, 0xc3, 0x1, 0x5a, 0x98, 0xb2, 0x70, 0x2b, 0xe9, 0x9d, 0x5f, 0x4, 0xc6, 0x50, 0x92, 0xc9, 0xb, 0x7f, 0xbd, 0xe6, 0x24, 0xe, 0xcc, 0x97, 0x55, 0x21, 0xe3, 0xb8, 0x7a, 0x43, 0x81, 0xda, 0x18, 0x6c, 0xae, 0xf5, 0x37, 0x1d, 0xdf, 0x84, 0x46, 0x32, 0xf0, 0xab, 0x69, 0xff, 0x3d, 0x66, 0xa4, 0xd0, 0x12, 0x49, 0x8b, 0xa1, 0x63, 0x38, 0xfa, 0x8e, 0x4c, 0x17, 0xd5, 0x26, 0xe4, 0xbf, 0x7d, 0x9, 0xcb, 0x90, 0x52, 0x78, 0xba, 0xe1, 0x23, 0x57, 0x95, 0xce, 0xc, 0x9a, 0x58, 0x3, 0xc1, 0xb5, 0x77, 0x2c, 0xee, 0xc4, 0x6, 0x5d, 0x9f, 0xeb, 0x29, 0x72, 0xb0}, [256]byte{0x0, 0xc3, 0x9b, 0x58, 0x2b, 0xe8, 0xb0, 0x73, 0x56, 0x95, 0xcd, 0xe, 0x7d, 0xbe, 0xe6, 0x25, 0xac, 0x6f, 0x37, 0xf4, 0x87, 0x44, 0x1c, 0xdf, 0xfa, 0x39, 0x61, 0xa2, 0xd1, 0x12, 0x4a, 0x89, 0x45, 0x86, 0xde, 0x1d, 0x6e, 0xad, 0xf5, 0x36, 0x13, 0xd0, 0x88, 0x4b, 0x38, 0xfb, 0xa3, 0x60, 0xe9, 0x2a, 0x72, 0xb1, 0xc2, 0x1, 0x59, 0x9a, 0xbf, 0x7c, 0x24, 0xe7, 0x94, 0x57, 0xf, 0xcc, 0x8a, 0x49, 0x11, 0xd2, 0xa1, 0x62, 0x3a, 0xf9, 0xdc, 0x1f, 0x47, 0x84, 0xf7, 0x34, 0x6c, 0xaf, 0x26, 0xe5, 0xbd, 0x7e, 0xd, 0xce, 0x96, 0x55, 0x70, 0xb3, 0xeb, 0x28, 0x5b, 0x98, 0xc0, 0x3, 0xcf, 0xc, 0x54, 0x97, 0xe4, 0x27, 0x7f, 0xbc, 0x99, 0x5a, 0x2, 0xc1, 0xb2, 0x71, 0x29, 0xea, 0x63, 0xa0, 0xf8, 0x3b, 0x48, 0x8b, 0xd3, 0x10, 0x35, 0xf6, 0xae, 0x6d, 0x1e, 0xdd, 0x85, 0x46, 0x9, 0xca, 0x92, 0x51, 0x22, 0xe1, 0xb9, 0x7a, 0x5f, 0x9c, 0xc4, 0x7, 0x74, 0xb7, 0xef, 0x2c, 0xa5, 0x66, 0x3e, 0xfd, 0x8e, 0x4d, 0x15, 0xd6, 0xf3, 0x30, 0x68, 0xab, 0xd8, 0x1b, 0x43, 0x80, 0x4c, 0x8f, 0xd7, 0x14, 0x67, 0xa4, 0xfc, 0x3f, 0x1a, 0xd9, 0x81, 0x42, 0x31, 0xf2, 0xaa, 0x69, 0xe0, 0x23, 0x7b, 0xb8, 0xcb, 0x8, 0x50, 0x93, 0xb6, 0x75, 0x2d, 0xee, 0x9d, 0x5e, 0x6, 0xc5, 0x83, 0x40, 0x18, 0xdb, 0xa8, 0x6b, 0x33, 0xf0, 0xd5, 0x16, 0x4e, 0x8d, 0xfe, 0x3d, 0x65, 0xa6, 0x2f, 0xec, 0xb4, 0x77, 0x4, 0xc7, 0x9f, 0x5c, 0x79, 0xba, 0xe2, 0x21, 0x52, 0x91, 0xc9, 0xa, 0xc6, 0x5, 0x5d, 0x9e, 0xed, 0x2e, 0x76, 0xb5, 0x90, 0x53, 0xb, 0xc8, 0xbb, 0x78, 0x20, 0xe3, 0x6a, 0xa9, 0xf1, 0x32, 0x41, 0x82, 0xda, 0x19, 0x3c, 0xff, 0xa7, 0x64, 0x17, 0xd4, 0x8c, 0x4f}, [256]byte{0x0, 0xc4, 0x95, 0x51, 0x37, 0xf3, 0xa2, 0x66, 0x6e, 0xaa, 0xfb, 0x3f, 0x59, 0x9d, 0xcc, 0x8, 0xdc, 0x18, 0x49, 0x8d, 0xeb, 0x2f, 0x7e, 0xba, 0xb2, 0x76, 0x27, 0xe3, 0x85, 0x41, 0x10, 0xd4, 0xa5, 0x61, 0x30, 0xf4, 0x92, 0x56, 0x7, 0xc3, 0xcb, 0xf, 0x5e, 0x9a, 0xfc, 0x38, 0x69, 0xad, 0x79, 0xbd, 0xec, 0x28, 0x4e, 0x8a, 0xdb, 0x1f, 0x17, 0xd3, 0x82, 0x46, 0x20, 0xe4, 0xb5, 0x71, 0x57, 0x93, 0xc2, 0x6, 0x60, 0xa4, 0xf5, 0x31, 0x39, 0xfd, 0xac, 0x68, 0xe, 0xca, 0x9b, 0x5f, 0x8b, 0x4f, 0x1e, 0xda, 0xbc, 0x78, 0x29, 0xed, 0xe5, 0x21, 0x70, 0xb4, 0xd2, 0x16, 0x47, 0x83, 0xf2, 0x36, 0x67, 0xa3, 0xc5, 0x1, 0x50, 0x94, 0x9c, 0x58, 0x9, 0xcd, 0xab, 0x6f, 0x3e, 0xfa, 0x2e, 0xea, 0xbb, 0x7f, 0x19, 0xdd, 0x8c, 0x48, 0x40, 0x84, 0xd5, 0x11, 0x77, 0xb3, 0xe2, 0x26, 0xae, 0x6a, 0x3b, 0xff, 0x99, 0x5d, 0xc, 0xc8, 0xc0, 0x4, 0x55, 0x91, 0xf7, 0x33, 0x62, 0xa6, 0x72, 0xb6, 0xe7, 0x23, 0x45, 0x81, 0xd0, 0x14, 0x1c, 0xd8, 0x89, 0x4d, 0x2b, 0xef, 0xbe, 0x7a, 0xb, 0xcf, 0x9e, 0x5a, 0x3c, 0xf8, 0xa9, 0x6d, 0x65, 0xa1, 0xf0, 0x34, 0x52, 0x96, 0xc7, 0x3, 0xd7, 0x13, 0x42, 0x86, 0xe0, 0x24, 0x75, 0xb1, 0xb9, 0x7d, 0x2c, 0xe8, 0x8e, 0x4a, 0x1b, 0xdf, 0xf9, 0x3d, 0x6c, 0xa8, 0xce, 0xa, 0x5b, 0x9f, 0x97, 0x53, 0x2, 0xc6, 0xa0, 0x64, 0x35, 0xf1, 0x25, 0xe1, 0xb0, 0x74, 0x12, 0xd6, 0x87, 0x43, 0x4b, 0x8f, 0xde, 0x1a, 0x7c, 0xb8, 0xe9, 0x2d, 0x5c, 0x98, 0xc9, 0xd, 0x6b, 0xaf, 0xfe, 0x3a, 0x32, 0xf6, 0xa7, 0x63, 0x5, 0xc1, 0x90, 0x54, 0x80, 0x44, 0x15, 0xd1, 0xb7, 0x73, 0x22, 0xe6, 0xee, 0x2a, 0x7b, 0xbf, 0xd9, 0x1d, 0x4c, 0x88}, [256]byte{0x0, 0xc5, 0x97, 0x52, 0x33, 0xf6, 0xa4, 0x61, 0x66, 0xa3, 0xf1, 0x34, 0x55, 0x90, 0xc2, 0x7, 0xcc, 0x9, 0x5b, 0x9e, 0xff, 0x3a, 0x68, 0xad, 0xaa, 0x6f, 0x3d, 0xf8, 0x99, 0x5c, 0xe, 0xcb, 0x85, 0x40, 0x12, 0xd7, 0xb6, 0x73, 0x21, 0xe4, 0xe3, 0x26, 0x74, 0xb1, 0xd0, 0x15, 0x47, 0x82, 0x49, 0x8c, 0xde, 0x1b, 0x7a, 0xbf, 0xed, 0x28, 0x2f, 0xea, 0xb8, 0x7d, 0x1c, 0xd9, 0x8b, 0x4e, 0x17, 0xd2, 0x80, 0x45, 0x24, 0xe1, 0xb3, 0x76, 0x71, 0xb4, 0xe6, 0x23, 0x42, 0x87, 0xd5, 0x10, 0xdb, 0x1e, 0x4c, 0x89, 0xe8, 0x2d, 0x7f, 0xba, 0xbd, 0x78, 0x2a, 0xef, 0x8e, 0x4b, 0x19, 0xdc, 0x92, 0x57, 0x5, 0xc0, 0xa1, 0x64, 0x36, 0xf3, 0xf4, 0x31, 0x63, 0xa6, 0xc7, 0x2, 0x50, 0x95, 0x5e, 0x9b, 0xc9, 0xc, 0x6d, 0xa8, 0xfa, 0x3f, 0x38, 0xfd, 0xaf, 0x6a, 0xb, 0xce, 0x9c, 0x59, 0x2e, 0xeb, 0xb9, 0x7c, 0x1d, 0xd8, 0x8a, 0x4f, 0x48, 0x8d, 0xdf, 0x1a, 0x7b, 0xbe, 0xec, 0x29, 0xe2, 0x27, 0x75, 0xb0, 0xd1, 0x14, 0x46, 0x83, 0x84, 0x41, 0x13, 0xd6, 0xb7, 0x72, 0x20, 0xe5, 0xab, 0x6e, 0x3c, 0xf9, 0x98, 0x5d, 0xf, 0xca, 0xcd, 0x8, 0x5a, 0x9f, 0xfe, 0x3b, 0x69, 0xac, 0x67, 0xa2, 0xf0, 0x35, 0x54, 0x91, 0xc3, 0x6, 0x1, 0xc4, 0x96, 0x53, 0x32, 0xf7, 0xa5, 0x60, 0x39, 0xfc, 0xae, 0x6b, 0xa, 0xcf, 0x9d, 0x58, 0x5f, 0x9a, 0xc8, 0xd, 0x6c, 0xa9, 0xfb, 0x3e, 0xf5, 0x30, 0x62, 0xa7, 0xc6, 0x3, 0x51, 0x94, 0x93, 0x56, 0x4, 0xc1, 0xa0, 0x65, 0x37, 0xf2, 0xbc, 0x79, 0x2b, 0xee, 0x8f, 0x4a, 0x18, 0xdd, 0xda, 0x1f, 0x4d, 0x88, 0xe9, 0x2c, 0x7e, 0xbb, 0x70, 0xb5, 0xe7, 0x22, 0x43, 0x86, 0xd4, 0x11, 0x16, 0xd3, 0x81, 0x44, 0x25, 0xe0, 0xb2, 0x77}, [256]byte{0x0, 0xc6, 0x91, 0x57, 0x3f, 0xf9, 0xae, 0x68, 0x7e, 0xb8, 0xef, 0x29, 0x41, 0x87, 0xd0, 0x16, 0xfc, 0x3a, 0x6d, 0xab, 0xc3, 0x5, 0x52, 0x94, 0x82, 0x44, 0x13, 0xd5, 0xbd, 0x7b, 0x2c, 0xea, 0xe5, 0x23, 0x74, 0xb2, 0xda, 0x1c, 0x4b, 0x8d, 0x9b, 0x5d, 0xa, 0xcc, 0xa4, 0x62, 0x35, 0xf3, 0x19, 0xdf, 0x88, 0x4e, 0x26, 0xe0, 0xb7, 0x71, 0x67, 0xa1, 0xf6, 0x30, 0x58, 0x9e, 0xc9, 0xf, 0xd7, 0x11, 0x46, 0x80, 0xe8, 0x2e, 0x79, 0xbf, 0xa9, 0x6f, 0x38, 0xfe, 0x96, 0x50, 0x7, 0xc1, 0x2b, 0xed, 0xba, 0x7c, 0x14, 0xd2, 0x85, 0x43, 0x55, 0x93, 0xc4, 0x2, 0x6a, 0xac, 0xfb, 0x3d, 0x32, 0xf4, 0xa3, 0x65, 0xd, 0xcb, 0x9c, 0x5a, 0x4c, 0x8a, 0xdd, 0x1b, 0x73, 0xb5, 0xe2, 0x24, 0xce, 0x8, 0x5f, 0x99, 0xf1, 0x37, 0x60, 0xa6, 0xb0, 0x76, 0x21, 0xe7, 0x8f, 0x49, 0x1e, 0xd8, 0xb3, 0x75, 0x22, 0xe4, 0x8c, 0x4a, 0x1d, 0xdb, 0xcd, 0xb, 0x5c, 0x9a, 0xf2, 0x34, 0x63, 0xa5, 0x4f, 0x89, 0xde, 0x18, 0x70, 0xb6, 0xe1, 0x27, 0x31, 0xf7, 0xa0, 0x66, 0xe, 0xc8, 0x9f, 0x59, 0x56, 0x90, 0xc7, 0x1, 0x69, 0xaf, 0xf8, 0x3e, 0x28, 0xee, 0xb9, 0x7f, 0x17, 0xd1, 0x86, 0x40, 0xaa, 0x6c, 0x3b, 0xfd, 0x95, 0x53, 0x4, 0xc2, 0xd4, 0x12, 0x45, 0x83, 0xeb, 0x2d, 0x7a, 0xbc, 0x64, 0xa2, 0xf5, 0x33, 0x5b, 0x9d, 0xca, 0xc, 0x1a, 0xdc, 0x8b, 0x4d, 0x25, 0xe3, 0xb4, 0x72, 0x98, 0x5e, 0x9, 0xcf, 0xa7, 0x61, 0x36, 0xf0, 0xe6, 0x20, 0x77, 0xb1, 0xd9, 0x1f, 0x48, 0x8e, 0x81, 0x47, 0x10, 0xd6, 0xbe, 0x78, 0x2f, 0xe9, 0xff, 0x39, 0x6e, 0xa8, 0xc0, 0x6, 0x51, 0x97, 0x7d, 0xbb, 0xec, 0x2a, 0x42, 0x84, 0xd3, 0x15, 0x3, 0xc5, 0x92, 0x54, 0x3c, 0xfa, 0xad, 0x6b}, [256]byte{0x0, 0xc7, 0x93, 0x54, 0x3b, 0xfc, 0xa8, 0x6f, 0x76, 0xb1, 0xe5, 0x22, 0x4d, 0x8a, 0xde, 0x19, 0xec, 0x2b, 0x7f, 0xb8, 0xd7, 0x10, 0x44, 0x83, 0x9a, 0x5d, 0x9, 0xce, 0xa1, 0x66, 0x32, 0xf5, 0xc5, 0x2, 0x56, 0x91, 0xfe, 0x39, 0x6d, 0xaa, 0xb3, 0x74, 0x20, 0xe7, 0x88, 0x4f, 0x1b, 0xdc, 0x29, 0xee, 0xba, 0x7d, 0x12, 0xd5, 0x81, 0x46, 0x5f, 0x98, 0xcc, 0xb, 0x64, 0xa3, 0xf7, 0x30, 0x97, 0x50, 0x4, 0xc3, 0xac, 0x6b, 0x3f, 0xf8, 0xe1, 0x26, 0x72, 0xb5, 0xda, 0x1d, 0x49, 0x8e, 0x7b, 0xbc, 0xe8, 0x2f, 0x40, 0x87, 0xd3, 0x14, 0xd, 0xca, 0x9e, 0x59, 0x36, 0xf1, 0xa5, 0x62, 0x52, 0x95, 0xc1, 0x6, 0x69, 0xae, 0xfa, 0x3d, 0x24, 0xe3, 0xb7, 0x70, 0x1f, 0xd8, 0x8c, 0x4b, 0xbe, 0x79, 0x2d, 0xea, 0x85, 0x42, 0x16, 0xd1, 0xc8, 0xf, 0x5b, 0x9c, 0xf3, 0x34, 0x60, 0xa7, 0x33, 0xf4, 0xa0, 0x67, 0x8, 0xcf, 0x9b, 0x5c, 0x45, 0x82, 0xd6, 0x11, 0x7e, 0xb9, 0xed, 0x2a, 0xdf, 0x18, 0x4c, 0x8b, 0xe4, 0x23, 0x77, 0xb0, 0xa9, 0x6e, 0x3a, 0xfd, 0x92, 0x55, 0x1, 0xc6, 0xf6, 0x31, 0x65, 0xa2, 0xcd, 0xa, 0x5e, 0x99, 0x80, 0x47, 0x13, 0xd4, 0xbb, 0x7c, 0x28, 0xef, 0x1a, 0xdd, 0x89, 0x4e, 0x21, 0xe6, 0xb2, 0x75, 0x6c, 0xab, 0xff, 0x38, 0x57, 0x90, 0xc4, 0x3, 0xa4, 0x63, 0x37, 0xf0, 0x9f, 0x58, 0xc, 0xcb, 0xd2, 0x15, 0x41, 0x86, 0xe9, 0x2e, 0x7a, 0xbd, 0x48, 0x8f, 0xdb, 0x1c, 0x73, 0xb4, 0xe0, 0x27, 0x3e, 0xf9, 0xad, 0x6a, 0x5, 0xc2, 0x96, 0x51, 0x61, 0xa6, 0xf2, 0x35, 0x5a, 0x9d, 0xc9, 0xe, 0x17, 0xd0, 0x84, 0x43, 0x2c, 0xeb, 0xbf, 0x78, 0x8d, 0x4a, 0x1e, 0xd9, 0xb6, 0x71, 0x25, 0xe2, 0xfb, 0x3c, 0x68, 0xaf, 0xc0, 0x7, 0x53, 0x94}, [256]byte{0x0, 0xc8, 0x8d, 0x45, 0x7, 0xcf, 0x8a, 0x42, 0xe, 0xc6, 0x83, 0x4b, 0x9, 0xc1, 0x84, 0x4c, 0x1c, 0xd4, 0x91, 0x59, 0x1b, 0xd3, 0x96, 0x5e, 0x12, 0xda, 0x9f, 0x57, 0x15, 0xdd, 0x98, 0x50, 0x38, 0xf0, 0xb5, 0x7d, 0x3f, 0xf7, 0xb2, 0x7a, 0x36, 0xfe, 0xbb, 0x73, 0x31, 0xf9, 0xbc, 0x74, 0x24, 0xec, 0xa9, 0x61, 0x23, 0xeb, 0xae, 0x66, 0x2a, 0xe2, 0xa7, 0x6f, 0x2d, 0xe5, 0xa0, 0x68, 0x70, 0xb8, 0xfd, 0x35, 0x77, 0xbf, 0xfa, 0x32, 0x7e, 0xb6, 0xf3, 0x3b, 0x79, 0xb1, 0xf4, 0x3c, 0x6c, 0xa4, 0xe1, 0x29, 0x6b, 0xa3, 0xe6, 0x2e, 0x62, 0xaa, 0xef, 0x27, 0x65, 0xad, 0xe8, 0x20, 0x48, 0x80, 0xc5, 0xd, 0x4f, 0x87, 0xc2, 0xa, 0x46, 0x8e, 0xcb, 0x3, 0x41, 0x89, 0xcc, 0x4, 0x54, 0x9c, 0xd9, 0x11, 0x53, 0x9b, 0xde, 0x16, 0x5a, 0x92, 0xd7, 0x1f, 0x5d, 0x95, 0xd0, 0x18, 0xe0, 0x28, 0x6d, 0xa5, 0xe7, 0x2f, 0x6a, 0xa2, 0xee, 0x26, 0x63, 0xab, 0xe9, 0x21, 0x64, 0xac, 0xfc, 0x34, 0x71, 0xb9, 0xfb, 0x33, 0x76, 0xbe, 0xf2, 0x3a, 0x7f, 0xb7, 0xf5, 0x3d, 0x78, 0xb0, 0xd8, 0x10, 0x55, 0x9d, 0xdf, 0x17, 0x52, 0x9a, 0xd6, 0x1e, 0x5b, 0x93, 0xd1, 0x19, 0x5c, 0x94, 0xc4, 0xc, 0x49, 0x81, 0xc3, 0xb, 0x4e, 0x86, 0xca, 0x2, 0x47, 0x8f, 0xcd, 0x5, 0x40, 0x88, 0x90, 0x58, 0x1d, 0xd5, 0x97, 0x5f, 0x1a, 0xd2, 0x9e, 0x56, 0x13, 0xdb, 0x99, 0x51, 0x14, 0xdc, 0x8c, 0x44, 0x1, 0xc9, 0x8b, 0x43, 0x6, 0xce, 0x82, 0x4a, 0xf, 0xc7, 0x85, 0x4d, 0x8, 0xc0, 0xa8, 0x60, 0x25, 0xed, 0xaf, 0x67, 0x22, 0xea, 0xa6, 0x6e, 0x2b, 0xe3, 0xa1, 0x69, 0x2c, 0xe4, 0xb4, 0x7c, 0x39, 0xf1, 0xb3, 0x7b, 0x3e, 0xf6, 0xba, 0x72, 0x37, 0xff, 0xbd, 0x75, 0x30, 0xf8}, [256]byte{0x0, 0xc9, 0x8f, 0x46, 0x3, 0xca, 0x8c, 0x45, 0x6, 0xcf, 0x89, 0x40, 0x5, 0xcc, 0x8a, 0x43, 0xc, 0xc5, 0x83, 0x4a, 0xf, 0xc6, 0x80, 0x49, 0xa, 0xc3, 0x85, 0x4c, 0x9, 0xc0, 0x86, 0x4f, 0x18, 0xd1, 0x97, 0x5e, 0x1b, 0xd2, 0x94, 0x5d, 0x1e, 0xd7, 0x91, 0x58, 0x1d, 0xd4, 0x92, 0x5b, 0x14, 0xdd, 0x9b, 0x52, 0x17, 0xde, 0x98, 0x51, 0x12, 0xdb, 0x9d, 0x54, 0x11, 0xd8, 0x9e, 0x57, 0x30, 0xf9, 0xbf, 0x76, 0x33, 0xfa, 0xbc, 0x75, 0x36, 0xff, 0xb9, 0x70, 0x35, 0xfc, 0xba, 0x73, 0x3c, 0xf5, 0xb3, 0x7a, 0x3f, 0xf6, 0xb0, 0x79, 0x3a, 0xf3, 0xb5, 0x7c, 0x39, 0xf0, 0xb6, 0x7f, 0x28, 0xe1, 0xa7, 0x6e, 0x2b, 0xe2, 0xa4, 0x6d, 0x2e, 0xe7, 0xa1, 0x68, 0x2d, 0xe4, 0xa2, 0x6b, 0x24, 0xed, 0xab, 0x62, 0x27, 0xee, 0xa8, 0x61, 0x22, 0xeb, 0xad, 0x64, 0x21, 0xe8, 0xae, 0x67, 0x60, 0xa9, 0xef, 0x26, 0x63, 0xaa, 0xec, 0x25, 0x66, 0xaf, 0xe9, 0x20, 0x65, 0xac, 0xea, 0x23, 0x6c, 0xa5, 0xe3, 0x2a, 0x6f, 0xa6, 0xe0, 0x29, 0x6a, 0xa3, 0xe5, 0x2c, 0x69, 0xa0, 0xe6, 0x2f, 0x78, 0xb1, 0xf7, 0x3e, 0x7b, 0xb2, 0xf4, 0x3d, 0x7e, 0xb7, 0xf1, 0x38, 0x7d, 0xb4, 0xf2, 0x3b, 0x74, 0xbd, 0xfb, 0x32, 0x77, 0xbe, 0xf8, 0x31, 0x72, 0xbb, 0xfd, 0x34, 0x71, 0xb8, 0xfe, 0x37, 0x50, 0x99, 0xdf, 0x16, 0x53, 0x9a, 0xdc, 0x15, 0x56, 0x9f, 0xd9, 0x10, 0x55, 0x9c, 0xda, 0x13, 0x5c, 0x95, 0xd3, 0x1a, 0x5f, 0x96, 0xd0, 0x19, 0x5a, 0x93, 0xd5, 0x1c, 0x59, 0x90, 0xd6, 0x1f, 0x48, 0x81, 0xc7, 0xe, 0x4b, 0x82, 0xc4, 0xd, 0x4e, 0x87, 0xc1, 0x8, 0x4d, 0x84, 0xc2, 0xb, 0x44, 0x8d, 0xcb, 0x2, 0x47, 0x8e, 0xc8, 0x1, 0x42, 0x8b, 0xcd, 0x4, 0x41, 0x88, 0xce, 0x7}, [256]byte{0x0, 0xca, 0x89, 0x43, 0xf, 0xc5, 0x86, 0x4c, 0x1e, 0xd4, 0x97, 0x5d, 0x11, 0xdb, 0x98, 0x52, 0x3c, 0xf6, 0xb5, 0x7f, 0x33, 0xf9, 0xba, 0x70, 0x22, 0xe8, 0xab, 0x61, 0x2d, 0xe7, 0xa4, 0x6e, 0x78, 0xb2, 0xf1, 0x3b, 0x77, 0xbd, 0xfe, 0x34, 0x66, 0xac, 0xef, 0x25, 0x69, 0xa3, 0xe0, 0x2a, 0x44, 0x8e, 0xcd, 0x7, 0x4b, 0x81, 0xc2, 0x8, 0x5a, 0x90, 0xd3, 0x19, 0x55, 0x9f, 0xdc, 0x16, 0xf0, 0x3a, 0x79, 0xb3, 0xff, 0x35, 0x76, 0xbc, 0xee, 0x24, 0x67, 0xad, 0xe1, 0x2b, 0x68, 0xa2, 0xcc, 0x6, 0x45, 0x8f, 0xc3, 0x9, 0x4a, 0x80, 0xd2, 0x18, 0x5b, 0x91, 0xdd, 0x17, 0x54, 0x9e, 0x88, 0x42, 0x1, 0xcb, 0x87, 0x4d, 0xe, 0xc4, 0x96, 0x5c, 0x1f, 0xd5, 0x99, 0x53, 0x10, 0xda, 0xb4, 0x7e, 0x3d, 0xf7, 0xbb, 0x71, 0x32, 0xf8, 0xaa, 0x60, 0x23, 0xe9, 0xa5, 0x6f, 0x2c, 0xe6, 0xfd, 0x37, 0x74, 0xbe, 0xf2, 0x38, 0x7b, 0xb1, 0xe3, 0x29, 0x6a, 0xa0, 0xec, 0x26, 0x65, 0xaf, 0xc1, 0xb, 0x48, 0x82, 0xce, 0x4, 0x47, 0x8d, 0xdf, 0x15, 0x56, 0x9c, 0xd0, 0x1a, 0x59, 0x93, 0x85, 0x4f, 0xc, 0xc6, 0x8a, 0x40, 0x3, 0xc9, 0x9b, 0x51, 0x12, 0xd8, 0x94, 0x5e, 0x1d, 0xd7, 0xb9, 0x73, 0x30, 0xfa, 0xb6, 0x7c, 0x3f, 0xf5, 0xa7, 0x6d, 0x2e, 0xe4, 0xa8, 0x62, 0x21, 0xeb, 0xd, 0xc7, 0x84, 0x4e, 0x2, 0xc8, 0x8b, 0x41, 0x13, 0xd9, 0x9a, 0x50, 0x1c, 0xd6, 0x95, 0x5f, 0x31, 0xfb, 0xb8, 0x72, 0x3e, 0xf4, 0xb7, 0x7d, 0x2f, 0xe5, 0xa6, 0x6c, 0x20, 0xea, 0xa9, 0x63, 0x75, 0xbf, 0xfc, 0x36, 0x7a, 0xb0, 0xf3, 0x39, 0x6b, 0xa1, 0xe2, 0x28, 0x64, 0xae, 0xed, 0x27, 0x49, 0x83, 0xc0, 0xa, 0x46, 0x8c, 0xcf, 0x5, 0x57, 0x9d, 0xde, 0x14, 0x58, 0x92, 0xd1, 0x1b}, [256]byte{0x0, 0xcb, 0x8b, 0x40, 0xb, 0xc0, 0x80, 0x4b, 0x16, 0xdd, 0x9d, 0x56, 0x1d, 0xd6, 0x96, 0x5d, 0x2c, 0xe7, 0xa7, 0x6c, 0x27, 0xec, 0xac, 0x67, 0x3a, 0xf1, 0xb1, 0x7a, 0x31, 0xfa, 0xba, 0x71, 0x58, 0x93, 0xd3, 0x18, 0x53, 0x98, 0xd8, 0x13, 0x4e, 0x85, 0xc5, 0xe, 0x45, 0x8e, 0xce, 0x5, 0x74, 0xbf, 0xff, 0x34, 0x7f, 0xb4, 0xf4, 0x3f, 0x62, 0xa9, 0xe9, 0x22, 0x69, 0xa2, 0xe2, 0x29, 0xb0, 0x7b, 0x3b, 0xf0, 0xbb, 0x70, 0x30, 0xfb, 0xa6, 0x6d, 0x2d, 0xe6, 0xad, 0x66, 0x26, 0xed, 0x9c, 0x57, 0x17, 0xdc, 0x97, 0x5c, 0x1c, 0xd7, 0x8a, 0x41, 0x1, 0xca, 0x81, 0x4a, 0xa, 0xc1, 0xe8, 0x23, 0x63, 0xa8, 0xe3, 0x28, 0x68, 0xa3, 0xfe, 0x35, 0x75, 0xbe, 0xf5, 0x3e, 0x7e, 0xb5, 0xc4, 0xf, 0x4f, 0x84, 0xcf, 0x4, 0x44, 0x8f, 0xd2, 0x19, 0x59, 0x92, 0xd9, 0x12, 0x52, 0x99, 0x7d, 0xb6, 0xf6, 0x3d, 0x76, 0xbd, 0xfd, 0x36, 0x6b, 0xa0, 0xe0, 0x2b, 0x60, 0xab, 0xeb, 0x20, 0x51, 0x9a, 0xda, 0x11, 0x5a, 0x91, 0xd1, 0x1a, 0x47, 0x8c, 0xcc, 0x7, 0x4c, 0x87, 0xc7, 0xc, 0x25, 0xee, 0xae, 0x65, 0x2e, 0xe5, 0xa5, 0x6e, 0x33, 0xf8, 0xb8, 0x73, 0x38, 0xf3, 0xb3, 0x78, 0x9, 0xc2, 0x82, 0x49, 0x2, 0xc9, 0x89, 0x42, 0x1f, 0xd4, 0x94, 0x5f, 0x14, 0xdf, 0x9f, 0x54, 0xcd, 0x6, 0x46, 0x8d, 0xc6, 0xd, 0x4d, 0x86, 0xdb, 0x10, 0x50, 0x9b, 0xd0, 0x1b, 0x5b, 0x90, 0xe1, 0x2a, 0x6a, 0xa1, 0xea, 0x21, 0x61, 0xaa, 0xf7, 0x3c, 0x7c, 0xb7, 0xfc, 0x37, 0x77, 0xbc, 0x95, 0x5e, 0x1e, 0xd5, 0x9e, 0x55, 0x15, 0xde, 0x83, 0x48, 0x8, 0xc3, 0x88, 0x43, 0x3, 0xc8, 0xb9, 0x72, 0x32, 0xf9, 0xb2, 0x79, 0x39, 0xf2, 0xaf, 0x64, 0x24, 0xef, 0xa4, 0x6f, 0x2f, 0xe4}, [256]byte{0x0, 0xcc, 0x85, 0x49, 0x17, 0xdb, 0x92, 0x5e, 0x2e, 0xe2, 0xab, 0x67, 0x39, 0xf5, 0xbc, 0x70, 0x5c, 0x90, 0xd9, 0x15, 0x4b, 0x87, 0xce, 0x2, 0x72, 0xbe, 0xf7, 0x3b, 0x65, 0xa9, 0xe0, 0x2c, 0xb8, 0x74, 0x3d, 0xf1, 0xaf, 0x63, 0x2a, 0xe6, 0x96, 0x5a, 0x13, 0xdf, 0x81, 0x4d, 0x4, 0xc8, 0xe4, 0x28, 0x61, 0xad, 0xf3, 0x3f, 0x76, 0xba, 0xca, 0x6, 0x4f, 0x83, 0xdd, 0x11, 0x58, 0x94, 0x6d, 0xa1, 0xe8, 0x24, 0x7a, 0xb6, 0xff, 0x33, 0x43, 0x8f, 0xc6, 0xa, 0x54, 0x98, 0xd1, 0x1d, 0x31, 0xfd, 0xb4, 0x78, 0x26, 0xea, 0xa3, 0x6f, 0x1f, 0xd3, 0x9a, 0x56, 0x8, 0xc4, 0x8d, 0x41, 0xd5, 0x19, 0x50, 0x9c, 0xc2, 0xe, 0x47, 0x8b, 0xfb, 0x37, 0x7e, 0xb2, 0xec, 0x20, 0x69, 0xa5, 0x89, 0x45, 0xc, 0xc0, 0x9e, 0x52, 0x1b, 0xd7, 0xa7, 0x6b, 0x22, 0xee, 0xb0, 0x7c, 0x35, 0xf9, 0xda, 0x16, 0x5f, 0x93, 0xcd, 0x1, 0x48, 0x84, 0xf4, 0x38, 0x71, 0xbd, 0xe3, 0x2f, 0x66, 0xaa, 0x86, 0x4a, 0x3, 0xcf, 0x91, 0x5d, 0x14, 0xd8, 0xa8, 0x64, 0x2d, 0xe1, 0xbf, 0x73, 0x3a, 0xf6, 0x62, 0xae, 0xe7, 0x2b, 0x75, 0xb9, 0xf0, 0x3c, 0x4c, 0x80, 0xc9, 0x5, 0x5b, 0x97, 0xde, 0x12, 0x3e, 0xf2, 0xbb, 0x77, 0x29, 0xe5, 0xac, 0x60, 0x10, 0xdc, 0x95, 0x59, 0x7, 0xcb, 0x82, 0x4e, 0xb7, 0x7b, 0x32, 0xfe, 0xa0, 0x6c, 0x25, 0xe9, 0x99, 0x55, 0x1c, 0xd0, 0x8e, 0x42, 0xb, 0xc7, 0xeb, 0x27, 0x6e, 0xa2, 0xfc, 0x30, 0x79, 0xb5, 0xc5, 0x9, 0x40, 0x8c, 0xd2, 0x1e, 0x57, 0x9b, 0xf, 0xc3, 0x8a, 0x46, 0x18, 0xd4, 0x9d, 0x51, 0x21, 0xed, 0xa4, 0x68, 0x36, 0xfa, 0xb3, 0x7f, 0x53, 0x9f, 0xd6, 0x1a, 0x44, 0x88, 0xc1, 0xd, 0x7d, 0xb1, 0xf8, 0x34, 0x6a, 0xa6, 0xef, 0x23}, [256]byte{0x0, 0xcd, 0x87, 0x4a, 0x13, 0xde, 0x94, 0x59, 0x26, 0xeb, 0xa1, 0x6c, 0x35, 0xf8, 0xb2, 0x7f, 0x4c, 0x81, 0xcb, 0x6, 0x5f, 0x92, 0xd8, 0x15, 0x6a, 0xa7, 0xed, 0x20, 0x79, 0xb4, 0xfe, 0x33, 0x98, 0x55, 0x1f, 0xd2, 0x8b, 0x46, 0xc, 0xc1, 0xbe, 0x73, 0x39, 0xf4, 0xad, 0x60, 0x2a, 0xe7, 0xd4, 0x19, 0x53, 0x9e, 0xc7, 0xa, 0x40, 0x8d, 0xf2, 0x3f, 0x75, 0xb8, 0xe1, 0x2c, 0x66, 0xab, 0x2d, 0xe0, 0xaa, 0x67, 0x3e, 0xf3, 0xb9, 0x74, 0xb, 0xc6, 0x8c, 0x41, 0x18, 0xd5, 0x9f, 0x52, 0x61, 0xac, 0xe6, 0x2b, 0x72, 0xbf, 0xf5, 0x38, 0x47, 0x8a, 0xc0, 0xd, 0x54, 0x99, 0xd3, 0x1e, 0xb5, 0x78, 0x32, 0xff, 0xa6, 0x6b, 0x21, 0xec, 0x93, 0x5e, 0x14, 0xd9, 0x80, 0x4d, 0x7, 0xca, 0xf9, 0x34, 0x7e, 0xb3, 0xea, 0x27, 0x6d, 0xa0, 0xdf, 0x12, 0x58, 0x95, 0xcc, 0x1, 0x4b, 0x86, 0x5a, 0x97, 0xdd, 0x10, 0x49, 0x84, 0xce, 0x3, 0x7c, 0xb1, 0xfb, 0x36, 0x6f, 0xa2, 0xe8, 0x25, 0x16, 0xdb, 0x91, 0x5c, 0x5, 0xc8, 0x82, 0x4f, 0x30, 0xfd, 0xb7, 0x7a, 0x23, 0xee, 0xa4, 0x69, 0xc2, 0xf, 0x45, 0x88, 0xd1, 0x1c, 0x56, 0x9b, 0xe4, 0x29, 0x63, 0xae, 0xf7, 0x3a, 0x70, 0xbd, 0x8e, 0x43, 0x9, 0xc4, 0x9d, 0x50, 0x1a, 0xd7, 0xa8, 0x65, 0x2f, 0xe2, 0xbb, 0x76, 0x3c, 0xf1, 0x77, 0xba, 0xf0, 0x3d, 0x64, 0xa9, 0xe3, 0x2e, 0x51, 0x9c, 0xd6, 0x1b, 0x42, 0x8f, 0xc5, 0x8, 0x3b, 0xf6, 0xbc, 0x71, 0x28, 0xe5, 0xaf, 0x62, 0x1d, 0xd0, 0x9a, 0x57, 0xe, 0xc3, 0x89, 0x44, 0xef, 0x22, 0x68, 0xa5, 0xfc, 0x31, 0x7b, 0xb6, 0xc9, 0x4, 0x4e, 0x83, 0xda, 0x17, 0x5d, 0x90, 0xa3, 0x6e, 0x24, 0xe9, 0xb0, 0x7d, 0x37, 0xfa, 0x85, 0x48, 0x2, 0xcf, 0x96, 0x5b, 0x11, 0xdc}, [256]byte{0x0, 0xce, 0x81, 0x4f, 0x1f, 0xd1, 0x9e, 0x50, 0x3e, 0xf0, 0xbf, 0x71, 0x21, 0xef, 0xa0, 0x6e, 0x7c, 0xb2, 0xfd, 0x33, 0x63, 0xad, 0xe2, 0x2c, 0x42, 0x8c, 0xc3, 0xd, 0x5d, 0x93, 0xdc, 0x12, 0xf8, 0x36, 0x79, 0xb7, 0xe7, 0x29, 0x66, 0xa8, 0xc6, 0x8, 0x47, 0x89, 0xd9, 0x17, 0x58, 0x96, 0x84, 0x4a, 0x5, 0xcb, 0x9b, 0x55, 0x1a, 0xd4, 0xba, 0x74, 0x3b, 0xf5, 0xa5, 0x6b, 0x24, 0xea, 0xed, 0x23, 0x6c, 0xa2, 0xf2, 0x3c, 0x73, 0xbd, 0xd3, 0x1d, 0x52, 0x9c, 0xcc, 0x2, 0x4d, 0x83, 0x91, 0x5f, 0x10, 0xde, 0x8e, 0x40, 0xf, 0xc1, 0xaf, 0x61, 0x2e, 0xe0, 0xb0, 0x7e, 0x31, 0xff, 0x15, 0xdb, 0x94, 0x5a, 0xa, 0xc4, 0x8b, 0x45, 0x2b, 0xe5, 0xaa, 0x64, 0x34, 0xfa, 0xb5, 0x7b, 0x69, 0xa7, 0xe8, 0x26, 0x76, 0xb8, 0xf7, 0x39, 0x57, 0x99, 0xd6, 0x18, 0x48, 0x86, 0xc9, 0x7, 0xc7, 0x9, 0x46, 0x88, 0xd8, 0x16, 0x59, 0x97, 0xf9, 0x37, 0x78, 0xb6, 0xe6, 0x28, 0x67, 0xa9, 0xbb, 0x75, 0x3a, 0xf4, 0xa4, 0x6a, 0x25, 0xeb, 0x85, 0x4b, 0x4, 0xca, 0x9a, 0x54, 0x1b, 0xd5, 0x3f, 0xf1, 0xbe, 0x70, 0x20, 0xee, 0xa1, 0x6f, 0x1, 0xcf, 0x80, 0x4e, 0x1e, 0xd0, 0x9f, 0x51, 0x43, 0x8d, 0xc2, 0xc, 0x5c, 0x92, 0xdd, 0x13, 0x7d, 0xb3, 0xfc, 0x32, 0x62, 0xac, 0xe3, 0x2d, 0x2a, 0xe4, 0xab, 0x65, 0x35, 0xfb, 0xb4, 0x7a, 0x14, 0xda, 0x95, 0x5b, 0xb, 0xc5, 0x8a, 0x44, 0x56, 0x98, 0xd7, 0x19, 0x49, 0x87, 0xc8, 0x6, 0x68, 0xa6, 0xe9, 0x27, 0x77, 0xb9, 0xf6, 0x38, 0xd2, 0x1c, 0x53, 0x9d, 0xcd, 0x3, 0x4c, 0x82, 0xec, 0x22, 0x6d, 0xa3, 0xf3, 0x3d, 0x72, 0xbc, 0xae, 0x60, 0x2f, 0xe1, 0xb1, 0x7f, 0x30, 0xfe, 0x90, 0x5e, 0x11, 0xdf, 0x8f, 0x41, 0xe, 0xc0}, [256]byte{0x0, 0xcf, 0x83, 0x4c, 0x1b, 0xd4, 0x98, 0x57, 0x36, 0xf9, 0xb5, 0x7a, 0x2d, 0xe2, 0xae, 0x61, 0x6c, 0xa3, 0xef, 0x20, 0x77, 0xb8, 0xf4, 0x3b, 0x5a, 0x95, 0xd9, 0x16, 0x41, 0x8e, 0xc2, 0xd, 0xd8, 0x17, 0x5b, 0x94, 0xc3, 0xc, 0x40, 0x8f, 0xee, 0x21, 0x6d, 0xa2, 0xf5, 0x3a, 0x76, 0xb9, 0xb4, 0x7b, 0x37, 0xf8, 0xaf, 0x60, 0x2c, 0xe3, 0x82, 0x4d, 0x1, 0xce, 0x99, 0x56, 0x1a, 0xd5, 0xad, 0x62, 0x2e, 0xe1, 0xb6, 0x79, 0x35, 0xfa, 0x9b, 0x54, 0x18, 0xd7, 0x80, 0x4f, 0x3, 0xcc, 0xc1, 0xe, 0x42, 0x8d, 0xda, 0x15, 0x59, 0x96, 0xf7, 0x38, 0x74, 0xbb, 0xec, 0x23, 0x6f, 0xa0, 0x75, 0xba, 0xf6, 0x39, 0x6e, 0xa1, 0xed, 0x22, 0x43, 0x8c, 0xc0, 0xf, 0x58, 0x97, 0xdb, 0x14, 0x19, 0xd6, 0x9a, 0x55, 0x2, 0xcd, 0x81, 0x4e, 0x2f, 0xe0, 0xac, 0x63, 0x34, 0xfb, 0xb7, 0x78, 0x47, 0x88, 0xc4, 0xb, 0x5c, 0x93, 0xdf, 0x10, 0x71, 0xbe, 0xf2, 0x3d, 0x6a, 0xa5, 0xe9, 0x26, 0x2b, 0xe4, 0xa8, 0x67, 0x30, 0xff, 0xb3, 0x7c, 0x1d, 0xd2, 0x9e, 0x51, 0x6, 0xc9, 0x85, 0x4a, 0x9f, 0x50, 0x1c, 0xd3, 0x84, 0x4b, 0x7, 0xc8, 0xa9, 0x66, 0x2a, 0xe5, 0xb2, 0x7d, 0x31, 0xfe, 0xf3, 0x3c, 0x70, 0xbf, 0xe8, 0x27, 0x6b, 0xa4, 0xc5, 0xa, 0x46, 0x89, 0xde, 0x11, 0x5d, 0x92, 0xea, 0x25, 0x69, 0xa6, 0xf1, 0x3e, 0x72, 0xbd, 0xdc, 0x13, 0x5f, 0x90, 0xc7, 0x8, 0x44, 0x8b, 0x86, 0x49, 0x5, 0xca, 0x9d, 0x52, 0x1e, 0xd1, 0xb0, 0x7f, 0x33, 0xfc, 0xab, 0x64, 0x28, 0xe7, 0x32, 0xfd, 0xb1, 0x7e, 0x29, 0xe6, 0xaa, 0x65, 0x4, 0xcb, 0x87, 0x48, 0x1f, 0xd0, 0x9c, 0x53, 0x5e, 0x91, 0xdd, 0x12, 0x45, 0x8a, 0xc6, 0x9, 0x68, 0xa7, 0xeb, 0x24, 0x73, 0xbc, 0xf0, 0x3f}, [256]byte{0x0, 0xd0, 0xbd, 0x6d, 0x67, 0xb7, 0xda, 0xa, 0xce, 0x1e, 0x73, 0xa3, 0xa9, 0x79, 0x14, 0xc4, 0x81, 0x51, 0x3c, 0xec, 0xe6, 0x36, 0x5b, 0x8b, 0x4f, 0x9f, 0xf2, 0x22, 0x28, 0xf8, 0x95, 0x45, 0x1f, 0xcf, 0xa2, 0x72, 0x78, 0xa8, 0xc5, 0x15, 0xd1, 0x1, 0x6c, 0xbc, 0xb6, 0x66, 0xb, 0xdb, 0x9e, 0x4e, 0x23, 0xf3, 0xf9, 0x29, 0x44, 0x94, 0x50, 0x80, 0xed, 0x3d, 0x37, 0xe7, 0x8a, 0x5a, 0x3e, 0xee, 0x83, 0x53, 0x59, 0x89, 0xe4, 0x34, 0xf0, 0x20, 0x4d, 0x9d, 0x97, 0x47, 0x2a, 0xfa, 0xbf, 0x6f, 0x2, 0xd2, 0xd8, 0x8, 0x65, 0xb5, 0x71, 0xa1, 0xcc, 0x1c, 0x16, 0xc6, 0xab, 0x7b, 0x21, 0xf1, 0x9c, 0x4c, 0x46, 0x96, 0xfb, 0x2b, 0xef, 0x3f, 0x52, 0x82, 0x88, 0x58, 0x35, 0xe5, 0xa0, 0x70, 0x1d, 0xcd, 0xc7, 0x17, 0x7a, 0xaa, 0x6e, 0xbe, 0xd3, 0x3, 0x9, 0xd9, 0xb4, 0x64, 0x7c, 0xac, 0xc1, 0x11, 0x1b, 0xcb, 0xa6, 0x76, 0xb2, 0x62, 0xf, 0xdf, 0xd5, 0x5, 0x68, 0xb8, 0xfd, 0x2d, 0x40, 0x90, 0x9a, 0x4a, 0x27, 0xf7, 0x33, 0xe3, 0x8e, 0x5e, 0x54, 0x84, 0xe9, 0x39, 0x63, 0xb3, 0xde, 0xe, 0x4, 0xd4, 0xb9, 0x69, 0xad, 0x7d, 0x10, 0xc0, 0xca, 0x1a, 0x77, 0xa7, 0xe2, 0x32, 0x5f, 0x8f, 0x85, 0x55, 0x38, 0xe8, 0x2c, 0xfc, 0x91, 0x41, 0x4b, 0x9b, 0xf6, 0x26, 0x42, 0x92, 0xff, 0x2f, 0x25, 0xf5, 0x98, 0x48, 0x8c, 0x5c, 0x31, 0xe1, 0xeb, 0x3b, 0x56, 0x86, 0xc3, 0x13, 0x7e, 0xae, 0xa4, 0x74, 0x19, 0xc9, 0xd, 0xdd, 0xb0, 0x60, 0x6a, 0xba, 0xd7, 0x7, 0x5d, 0x8d, 0xe0, 0x30, 0x3a, 0xea, 0x87, 0x57, 0x93, 0x43, 0x2e, 0xfe, 0xf4, 0x24, 0x49, 0x99, 0xdc, 0xc, 0x61, 0xb1, 0xbb, 0x6b, 0x6, 0xd6, 0x12, 0xc2, 0xaf, 0x7f, 0x75, 0xa5, 0xc8, 0x18}, [256]byte{0x0, 0xd1, 0xbf, 0x6e, 0x63, 0xb2, 0xdc, 0xd, 0xc6, 0x17, 0x79, 0xa8, 0xa5, 0x74, 0x1a, 0xcb, 0x91, 0x40, 0x2e, 0xff, 0xf2, 0x23, 0x4d, 0x9c, 0x57, 0x86, 0xe8, 0x39, 0x34, 0xe5, 0x8b, 0x5a, 0x3f, 0xee, 0x80, 0x51, 0x5c, 0x8d, 0xe3, 0x32, 0xf9, 0x28, 0x46, 0x97, 0x9a, 0x4b, 0x25, 0xf4, 0xae, 0x7f, 0x11, 0xc0, 0xcd, 0x1c, 0x72, 0xa3, 0x68, 0xb9, 0xd7, 0x6, 0xb, 0xda, 0xb4, 0x65, 0x7e, 0xaf, 0xc1, 0x10, 0x1d, 0xcc, 0xa2, 0x73, 0xb8, 0x69, 0x7, 0xd6, 0xdb, 0xa, 0x64, 0xb5, 0xef, 0x3e, 0x50, 0x81, 0x8c, 0x5d, 0x33, 0xe2, 0x29, 0xf8, 0x96, 0x47, 0x4a, 0x9b, 0xf5, 0x24, 0x41, 0x90, 0xfe, 0x2f, 0x22, 0xf3, 0x9d, 0x4c, 0x87, 0x56, 0x38, 0xe9, 0xe4, 0x35, 0x5b, 0x8a, 0xd0, 0x1, 0x6f, 0xbe, 0xb3, 0x62, 0xc, 0xdd, 0x16, 0xc7, 0xa9, 0x78, 0x75, 0xa4, 0xca, 0x1b, 0xfc, 0x2d, 0x43, 0x92, 0x9f, 0x4e, 0x20, 0xf1, 0x3a, 0xeb, 0x85, 0x54, 0x59, 0x88, 0xe6, 0x37, 0x6d, 0xbc, 0xd2, 0x3, 0xe, 0xdf, 0xb1, 0x60, 0xab, 0x7a, 0x14, 0xc5, 0xc8, 0x19, 0x77, 0xa6, 0xc3, 0x12, 0x7c, 0xad, 0xa0, 0x71, 0x1f, 0xce, 0x5, 0xd4, 0xba, 0x6b, 0x66, 0xb7, 0xd9, 0x8, 0x52, 0x83, 0xed, 0x3c, 0x31, 0xe0, 0x8e, 0x5f, 0x94, 0x45, 0x2b, 0xfa, 0xf7, 0x26, 0x48, 0x99, 0x82, 0x53, 0x3d, 0xec, 0xe1, 0x30, 0x5e, 0x8f, 0x44, 0x95, 0xfb, 0x2a, 0x27, 0xf6, 0x98, 0x49, 0x13, 0xc2, 0xac, 0x7d, 0x70, 0xa1, 0xcf, 0x1e, 0xd5, 0x4, 0x6a, 0xbb, 0xb6, 0x67, 0x9, 0xd8, 0xbd, 0x6c, 0x2, 0xd3, 0xde, 0xf, 0x61, 0xb0, 0x7b, 0xaa, 0xc4, 0x15, 0x18, 0xc9, 0xa7, 0x76, 0x2c, 0xfd, 0x93, 0x42, 0x4f, 0x9e, 0xf0, 0x21, 0xea, 0x3b, 0x55, 0x84, 0x89, 0x58, 0x36, 0xe7}, [256]byte{0x0, 0xd2, 0xb9, 0x6b, 0x6f, 0xbd, 0xd6, 0x4, 0xde, 0xc, 0x67, 0xb5, 0xb1, 0x63, 0x8, 0xda, 0xa1, 0x73, 0x18, 0xca, 0xce, 0x1c, 0x77, 0xa5, 0x7f, 0xad, 0xc6, 0x14, 0x10, 0xc2, 0xa9, 0x7b, 0x5f, 0x8d, 0xe6, 0x34, 0x30, 0xe2, 0x89, 0x5b, 0x81, 0x53, 0x38, 0xea, 0xee, 0x3c, 0x57, 0x85, 0xfe, 0x2c, 0x47, 0x95, 0x91, 0x43, 0x28, 0xfa, 0x20, 0xf2, 0x99, 0x4b, 0x4f, 0x9d, 0xf6, 0x24, 0xbe, 0x6c, 0x7, 0xd5, 0xd1, 0x3, 0x68, 0xba, 0x60, 0xb2, 0xd9, 0xb, 0xf, 0xdd, 0xb6, 0x64, 0x1f, 0xcd, 0xa6, 0x74, 0x70, 0xa2, 0xc9, 0x1b, 0xc1, 0x13, 0x78, 0xaa, 0xae, 0x7c, 0x17, 0xc5, 0xe1, 0x33, 0x58, 0x8a, 0x8e, 0x5c, 0x37, 0xe5, 0x3f, 0xed, 0x86, 0x54, 0x50, 0x82, 0xe9, 0x3b, 0x40, 0x92, 0xf9, 0x2b, 0x2f, 0xfd, 0x96, 0x44, 0x9e, 0x4c, 0x27, 0xf5, 0xf1, 0x23, 0x48, 0x9a, 0x61, 0xb3, 0xd8, 0xa, 0xe, 0xdc, 0xb7, 0x65, 0xbf, 0x6d, 0x6, 0xd4, 0xd0, 0x2, 0x69, 0xbb, 0xc0, 0x12, 0x79, 0xab, 0xaf, 0x7d, 0x16, 0xc4, 0x1e, 0xcc, 0xa7, 0x75, 0x71, 0xa3, 0xc8, 0x1a, 0x3e, 0xec, 0x87, 0x55, 0x51, 0x83, 0xe8, 0x3a, 0xe0, 0x32, 0x59, 0x8b, 0x8f, 0x5d, 0x36, 0xe4, 0x9f, 0x4d, 0x26, 0xf4, 0xf0, 0x22, 0x49, 0x9b, 0x41, 0x93, 0xf8, 0x2a, 0x2e, 0xfc, 0x97, 0x45, 0xdf, 0xd, 0x66, 0xb4, 0xb0, 0x62, 0x9, 0xdb, 0x1, 0xd3, 0xb8, 0x6a, 0x6e, 0xbc, 0xd7, 0x5, 0x7e, 0xac, 0xc7, 0x15, 0x11, 0xc3, 0xa8, 0x7a, 0xa0, 0x72, 0x19, 0xcb, 0xcf, 0x1d, 0x76, 0xa4, 0x80, 0x52, 0x39, 0xeb, 0xef, 0x3d, 0x56, 0x84, 0x5e, 0x8c, 0xe7, 0x35, 0x31, 0xe3, 0x88, 0x5a, 0x21, 0xf3, 0x98, 0x4a, 0x4e, 0x9c, 0xf7, 0x25, 0xff, 0x2d, 0x46, 0x94, 0x90, 0x42, 0x29, 0xfb}, [256]byte{0x0, 0xd3, 0xbb, 0x68, 0x6b, 0xb8, 0xd0, 0x3, 0xd6, 0x5, 0x6d, 0xbe, 0xbd, 0x6e, 0x6, 0xd5, 0xb1, 0x62, 0xa, 0xd9, 0xda, 0x9, 0x61, 0xb2, 0x67, 0xb4, 0xdc, 0xf, 0xc, 0xdf, 0xb7, 0x64, 0x7f, 0xac, 0xc4, 0x17, 0x14, 0xc7, 0xaf, 0x7c, 0xa9, 0x7a, 0x12, 0xc1, 0xc2, 0x11, 0x79, 0xaa, 0xce, 0x1d, 0x75, 0xa6, 0xa5, 0x76, 0x1e, 0xcd, 0x18, 0xcb, 0xa3, 0x70, 0x73, 0xa0, 0xc8, 0x1b, 0xfe, 0x2d, 0x45, 0x96, 0x95, 0x46, 0x2e, 0xfd, 0x28, 0xfb, 0x93, 0x40, 0x43, 0x90, 0xf8, 0x2b, 0x4f, 0x9c, 0xf4, 0x27, 0x24, 0xf7, 0x9f, 0x4c, 0x99, 0x4a, 0x22, 0xf1, 0xf2, 0x21, 0x49, 0x9a, 0x81, 0x52, 0x3a, 0xe9, 0xea, 0x39, 0x51, 0x82, 0x57, 0x84, 0xec, 0x3f, 0x3c, 0xef, 0x87, 0x54, 0x30, 0xe3, 0x8b, 0x58, 0x5b, 0x88, 0xe0, 0x33, 0xe6, 0x35, 0x5d, 0x8e, 0x8d, 0x5e, 0x36, 0xe5, 0xe1, 0x32, 0x5a, 0x89, 0x8a, 0x59, 0x31, 0xe2, 0x37, 0xe4, 0x8c, 0x5f, 0x5c, 0x8f, 0xe7, 0x34, 0x50, 0x83, 0xeb, 0x38, 0x3b, 0xe8, 0x80, 0x53, 0x86, 0x55, 0x3d, 0xee, 0xed, 0x3e, 0x56, 0x85, 0x9e, 0x4d, 0x25, 0xf6, 0xf5, 0x26, 0x4e, 0x9d, 0x48, 0x9b, 0xf3, 0x20, 0x23, 0xf0, 0x98, 0x4b, 0x2f, 0xfc, 0x94, 0x47, 0x44, 0x97, 0xff, 0x2c, 0xf9, 0x2a, 0x42, 0x91, 0x92, 0x41, 0x29, 0xfa, 0x1f, 0xcc, 0xa4, 0x77, 0x74, 0xa7, 0xcf, 0x1c, 0xc9, 0x1a, 0x72, 0xa1, 0xa2, 0x71, 0x19, 0xca, 0xae, 0x7d, 0x15, 0xc6, 0xc5, 0x16, 0x7e, 0xad, 0x78, 0xab, 0xc3, 0x10, 0x13, 0xc0, 0xa8, 0x7b, 0x60, 0xb3, 0xdb, 0x8, 0xb, 0xd8, 0xb0, 0x63, 0xb6, 0x65, 0xd, 0xde, 0xdd, 0xe, 0x66, 0xb5, 0xd1, 0x2, 0x6a, 0xb9, 0xba, 0x69, 0x1, 0xd2, 0x7, 0xd4, 0xbc, 0x6f, 0x6c, 0xbf, 0xd7, 0x4}, [256]byte{0x0, 0xd4, 0xb5, 0x61, 0x77, 0xa3, 0xc2, 0x16, 0xee, 0x3a, 0x5b, 0x8f, 0x99, 0x4d, 0x2c, 0xf8, 0xc1, 0x15, 0x74, 0xa0, 0xb6, 0x62, 0x3, 0xd7, 0x2f, 0xfb, 0x9a, 0x4e, 0x58, 0x8c, 0xed, 0x39, 0x9f, 0x4b, 0x2a, 0xfe, 0xe8, 0x3c, 0x5d, 0x89, 0x71, 0xa5, 0xc4, 0x10, 0x6, 0xd2, 0xb3, 0x67, 0x5e, 0x8a, 0xeb, 0x3f, 0x29, 0xfd, 0x9c, 0x48, 0xb0, 0x64, 0x5, 0xd1, 0xc7, 0x13, 0x72, 0xa6, 0x23, 0xf7, 0x96, 0x42, 0x54, 0x80, 0xe1, 0x35, 0xcd, 0x19, 0x78, 0xac, 0xba, 0x6e, 0xf, 0xdb, 0xe2, 0x36, 0x57, 0x83, 0x95, 0x41, 0x20, 0xf4, 0xc, 0xd8, 0xb9, 0x6d, 0x7b, 0xaf, 0xce, 0x1a, 0xbc, 0x68, 0x9, 0xdd, 0xcb, 0x1f, 0x7e, 0xaa, 0x52, 0x86, 0xe7, 0x33, 0x25, 0xf1, 0x90, 0x44, 0x7d, 0xa9, 0xc8, 0x1c, 0xa, 0xde, 0xbf, 0x6b, 0x93, 0x47, 0x26, 0xf2, 0xe4, 0x30, 0x51, 0x85, 0x46, 0x92, 0xf3, 0x27, 0x31, 0xe5, 0x84, 0x50, 0xa8, 0x7c, 0x1d, 0xc9, 0xdf, 0xb, 0x6a, 0xbe, 0x87, 0x53, 0x32, 0xe6, 0xf0, 0x24, 0x45, 0x91, 0x69, 0xbd, 0xdc, 0x8, 0x1e, 0xca, 0xab, 0x7f, 0xd9, 0xd, 0x6c, 0xb8, 0xae, 0x7a, 0x1b, 0xcf, 0x37, 0xe3, 0x82, 0x56, 0x40, 0x94, 0xf5, 0x21, 0x18, 0xcc, 0xad, 0x79, 0x6f, 0xbb, 0xda, 0xe, 0xf6, 0x22, 0x43, 0x97, 0x81, 0x55, 0x34, 0xe0, 0x65, 0xb1, 0xd0, 0x4, 0x12, 0xc6, 0xa7, 0x73, 0x8b, 0x5f, 0x3e, 0xea, 0xfc, 0x28, 0x49, 0x9d, 0xa4, 0x70, 0x11, 0xc5, 0xd3, 0x7, 0x66, 0xb2, 0x4a, 0x9e, 0xff, 0x2b, 0x3d, 0xe9, 0x88, 0x5c, 0xfa, 0x2e, 0x4f, 0x9b, 0x8d, 0x59, 0x38, 0xec, 0x14, 0xc0, 0xa1, 0x75, 0x63, 0xb7, 0xd6, 0x2, 0x3b, 0xef, 0x8e, 0x5a, 0x4c, 0x98, 0xf9, 0x2d, 0xd5, 0x1, 0x60, 0xb4, 0xa2, 0x76, 0x17, 0xc3}, [256]byte{0x0, 0xd5, 0xb7, 0x62, 0x73, 0xa6, 0xc4, 0x11, 0xe6, 0x33, 0x51, 0x84, 0x95, 0x40, 0x22, 0xf7, 0xd1, 0x4, 0x66, 0xb3, 0xa2, 0x77, 0x15, 0xc0, 0x37, 0xe2, 0x80, 0x55, 0x44, 0x91, 0xf3, 0x26, 0xbf, 0x6a, 0x8, 0xdd, 0xcc, 0x19, 0x7b, 0xae, 0x59, 0x8c, 0xee, 0x3b, 0x2a, 0xff, 0x9d, 0x48, 0x6e, 0xbb, 0xd9, 0xc, 0x1d, 0xc8, 0xaa, 0x7f, 0x88, 0x5d, 0x3f, 0xea, 0xfb, 0x2e, 0x4c, 0x99, 0x63, 0xb6, 0xd4, 0x1, 0x10, 0xc5, 0xa7, 0x72, 0x85, 0x50, 0x32, 0xe7, 0xf6, 0x23, 0x41, 0x94, 0xb2, 0x67, 0x5, 0xd0, 0xc1, 0x14, 0x76, 0xa3, 0x54, 0x81, 0xe3, 0x36, 0x27, 0xf2, 0x90, 0x45, 0xdc, 0x9, 0x6b, 0xbe, 0xaf, 0x7a, 0x18, 0xcd, 0x3a, 0xef, 0x8d, 0x58, 0x49, 0x9c, 0xfe, 0x2b, 0xd, 0xd8, 0xba, 0x6f, 0x7e, 0xab, 0xc9, 0x1c, 0xeb, 0x3e, 0x5c, 0x89, 0x98, 0x4d, 0x2f, 0xfa, 0xc6, 0x13, 0x71, 0xa4, 0xb5, 0x60, 0x2, 0xd7, 0x20, 0xf5, 0x97, 0x42, 0x53, 0x86, 0xe4, 0x31, 0x17, 0xc2, 0xa0, 0x75, 0x64, 0xb1, 0xd3, 0x6, 0xf1, 0x24, 0x46, 0x93, 0x82, 0x57, 0x35, 0xe0, 0x79, 0xac, 0xce, 0x1b, 0xa, 0xdf, 0xbd, 0x68, 0x9f, 0x4a, 0x28, 0xfd, 0xec, 0x39, 0x5b, 0x8e, 0xa8, 0x7d, 0x1f, 0xca, 0xdb, 0xe, 0x6c, 0xb9, 0x4e, 0x9b, 0xf9, 0x2c, 0x3d, 0xe8, 0x8a, 0x5f, 0xa5, 0x70, 0x12, 0xc7, 0xd6, 0x3, 0x61, 0xb4, 0x43, 0x96, 0xf4, 0x21, 0x30, 0xe5, 0x87, 0x52, 0x74, 0xa1, 0xc3, 0x16, 0x7, 0xd2, 0xb0, 0x65, 0x92, 0x47, 0x25, 0xf0, 0xe1, 0x34, 0x56, 0x83, 0x1a, 0xcf, 0xad, 0x78, 0x69, 0xbc, 0xde, 0xb, 0xfc, 0x29, 0x4b, 0x9e, 0x8f, 0x5a, 0x38, 0xed, 0xcb, 0x1e, 0x7c, 0xa9, 0xb8, 0x6d, 0xf, 0xda, 0x2d, 0xf8, 0x9a, 0x4f, 0x5e, 0x8b, 0xe9, 0x3c}, [256]byte{0x0, 0xd6, 0xb1, 0x67, 0x7f, 0xa9, 0xce, 0x18, 0xfe, 0x28, 0x4f, 0x99, 0x81, 0x57, 0x30, 0xe6, 0xe1, 0x37, 0x50, 0x86, 0x9e, 0x48, 0x2f, 0xf9, 0x1f, 0xc9, 0xae, 0x78, 0x60, 0xb6, 0xd1, 0x7, 0xdf, 0x9, 0x6e, 0xb8, 0xa0, 0x76, 0x11, 0xc7, 0x21, 0xf7, 0x90, 0x46, 0x5e, 0x88, 0xef, 0x39, 0x3e, 0xe8, 0x8f, 0x59, 0x41, 0x97, 0xf0, 0x26, 0xc0, 0x16, 0x71, 0xa7, 0xbf, 0x69, 0xe, 0xd8, 0xa3, 0x75, 0x12, 0xc4, 0xdc, 0xa, 0x6d, 0xbb, 0x5d, 0x8b, 0xec, 0x3a, 0x22, 0xf4, 0x93, 0x45, 0x42, 0x94, 0xf3, 0x25, 0x3d, 0xeb, 0x8c, 0x5a, 0xbc, 0x6a, 0xd, 0xdb, 0xc3, 0x15, 0x72, 0xa4, 0x7c, 0xaa, 0xcd, 0x1b, 0x3, 0xd5, 0xb2, 0x64, 0x82, 0x54, 0x33, 0xe5, 0xfd, 0x2b, 0x4c, 0x9a, 0x9d, 0x4b, 0x2c, 0xfa, 0xe2, 0x34, 0x53, 0x85, 0x63, 0xb5, 0xd2, 0x4, 0x1c, 0xca, 0xad, 0x7b, 0x5b, 0x8d, 0xea, 0x3c, 0x24, 0xf2, 0x95, 0x43, 0xa5, 0x73, 0x14, 0xc2, 0xda, 0xc, 0x6b, 0xbd, 0xba, 0x6c, 0xb, 0xdd, 0xc5, 0x13, 0x74, 0xa2, 0x44, 0x92, 0xf5, 0x23, 0x3b, 0xed, 0x8a, 0x5c, 0x84, 0x52, 0x35, 0xe3, 0xfb, 0x2d, 0x4a, 0x9c, 0x7a, 0xac, 0xcb, 0x1d, 0x5, 0xd3, 0xb4, 0x62, 0x65, 0xb3, 0xd4, 0x2, 0x1a, 0xcc, 0xab, 0x7d, 0x9b, 0x4d, 0x2a, 0xfc, 0xe4, 0x32, 0x55, 0x83, 0xf8, 0x2e, 0x49, 0x9f, 0x87, 0x51, 0x36, 0xe0, 0x6, 0xd0, 0xb7, 0x61, 0x79, 0xaf, 0xc8, 0x1e, 0x19, 0xcf, 0xa8, 0x7e, 0x66, 0xb0, 0xd7, 0x1, 0xe7, 0x31, 0x56, 0x80, 0x98, 0x4e, 0x29, 0xff, 0x27, 0xf1, 0x96, 0x40, 0x58, 0x8e, 0xe9, 0x3f, 0xd9, 0xf, 0x68, 0xbe, 0xa6, 0x70, 0x17, 0xc1, 0xc6, 0x10, 0x77, 0xa1, 0xb9, 0x6f, 0x8, 0xde, 0x38, 0xee, 0x89, 0x5f, 0x47, 0x91, 0xf6, 0x20}, [256]byte{0x0, 0xd7, 0xb3, 0x64, 0x7b, 0xac, 0xc8, 0x1f, 0xf6, 0x21, 0x45, 0x92, 0x8d, 0x5a, 0x3e, 0xe9, 0xf1, 0x26, 0x42, 0x95, 0x8a, 0x5d, 0x39, 0xee, 0x7, 0xd0, 0xb4, 0x63, 0x7c, 0xab, 0xcf, 0x18, 0xff, 0x28, 0x4c, 0x9b, 0x84, 0x53, 0x37, 0xe0, 0x9, 0xde, 0xba, 0x6d, 0x72, 0xa5, 0xc1, 0x16, 0xe, 0xd9, 0xbd, 0x6a, 0x75, 0xa2, 0xc6, 0x11, 0xf8, 0x2f, 0x4b, 0x9c, 0x83, 0x54, 0x30, 0xe7, 0xe3, 0x34, 0x50, 0x87, 0x98, 0x4f, 0x2b, 0xfc, 0x15, 0xc2, 0xa6, 0x71, 0x6e, 0xb9, 0xdd, 0xa, 0x12, 0xc5, 0xa1, 0x76, 0x69, 0xbe, 0xda, 0xd, 0xe4, 0x33, 0x57, 0x80, 0x9f, 0x48, 0x2c, 0xfb, 0x1c, 0xcb, 0xaf, 0x78, 0x67, 0xb0, 0xd4, 0x3, 0xea, 0x3d, 0x59, 0x8e, 0x91, 0x46, 0x22, 0xf5, 0xed, 0x3a, 0x5e, 0x89, 0x96, 0x41, 0x25, 0xf2, 0x1b, 0xcc, 0xa8, 0x7f, 0x60, 0xb7, 0xd3, 0x4, 0xdb, 0xc, 0x68, 0xbf, 0xa0, 0x77, 0x13, 0xc4, 0x2d, 0xfa, 0x9e, 0x49, 0x56, 0x81, 0xe5, 0x32, 0x2a, 0xfd, 0x99, 0x4e, 0x51, 0x86, 0xe2, 0x35, 0xdc, 0xb, 0x6f, 0xb8, 0xa7, 0x70, 0x14, 0xc3, 0x24, 0xf3, 0x97, 0x40, 0x5f, 0x88, 0xec, 0x3b, 0xd2, 0x5, 0x61, 0xb6, 0xa9, 0x7e, 0x1a, 0xcd, 0xd5, 0x2, 0x66, 0xb1, 0xae, 0x79, 0x1d, 0xca, 0x23, 0xf4, 0x90, 0x47, 0x58, 0x8f, 0xeb, 0x3c, 0x38, 0xef, 0x8b, 0x5c, 0x43, 0x94, 0xf0, 0x27, 0xce, 0x19, 0x7d, 0xaa, 0xb5, 0x62, 0x6, 0xd1, 0xc9, 0x1e, 0x7a, 0xad, 0xb2, 0x65, 0x1, 0xd6, 0x3f, 0xe8, 0x8c, 0x5b, 0x44, 0x93, 0xf7, 0x20, 0xc7, 0x10, 0x74, 0xa3, 0xbc, 0x6b, 0xf, 0xd8, 0x31, 0xe6, 0x82, 0x55, 0x4a, 0x9d, 0xf9, 0x2e, 0x36, 0xe1, 0x85, 0x52, 0x4d, 0x9a, 0xfe, 0x29, 0xc0, 0x17, 0x73, 0xa4, 0xbb, 0x6c, 0x8, 0xdf}, [256]byte{0x0, 0xd8, 0xad, 0x75, 0x47, 0x9f, 0xea, 0x32, 0x8e, 0x56, 0x23, 0xfb, 0xc9, 0x11, 0x64, 0xbc, 0x1, 0xd9, 0xac, 0x74, 0x46, 0x9e, 0xeb, 0x33, 0x8f, 0x57, 0x22, 0xfa, 0xc8, 0x10, 0x65, 0xbd, 0x2, 0xda, 0xaf, 0x77, 0x45, 0x9d, 0xe8, 0x30, 0x8c, 0x54, 0x21, 0xf9, 0xcb, 0x13, 0x66, 0xbe, 0x3, 0xdb, 0xae, 0x76, 0x44, 0x9c, 0xe9, 0x31, 0x8d, 0x55, 0x20, 0xf8, 0xca, 0x12, 0x67, 0xbf, 0x4, 0xdc, 0xa9, 0x71, 0x43, 0x9b, 0xee, 0x36, 0x8a, 0x52, 0x27, 0xff, 0xcd, 0x15, 0x60, 0xb8, 0x5, 0xdd, 0xa8, 0x70, 0x42, 0x9a, 0xef, 0x37, 0x8b, 0x53, 0x26, 0xfe, 0xcc, 0x14, 0x61, 0xb9, 0x6, 0xde, 0xab, 0x73, 0x41, 0x99, 0xec, 0x34, 0x88, 0x50, 0x25, 0xfd, 0xcf, 0x17, 0x62, 0xba, 0x7, 0xdf, 0xaa, 0x72, 0x40, 0x98, 0xed, 0x35, 0x89, 0x51, 0x24, 0xfc, 0xce, 0x16, 0x63, 0xbb, 0x8, 0xd0, 0xa5, 0x7d, 0x4f, 0x97, 0xe2, 0x3a, 0x86, 0x5e, 0x2b, 0xf3, 0xc1, 0x19, 0x6c, 0xb4, 0x9, 0xd1, 0xa4, 0x7c, 0x4e, 0x96, 0xe3, 0x3b, 0x87, 0x5f, 0x2a, 0xf2, 0xc0, 0x18, 0x6d, 0xb5, 0xa, 0xd2, 0xa7, 0x7f, 0x4d, 0x95, 0xe0, 0x38, 0x84, 0x5c, 0x29, 0xf1, 0xc3, 0x1b, 0x6e, 0xb6, 0xb, 0xd3, 0xa6, 0x7e, 0x4c, 0x94, 0xe1, 0x39, 0x85, 0x5d, 0x28, 0xf0, 0xc2, 0x1a, 0x6f, 0xb7, 0xc, 0xd4, 0xa1, 0x79, 0x4b, 0x93, 0xe6, 0x3e, 0x82, 0x5a, 0x2f, 0xf7, 0xc5, 0x1d, 0x68, 0xb0, 0xd, 0xd5, 0xa0, 0x78, 0x4a, 0x92, 0xe7, 0x3f, 0x83, 0x5b, 0x2e, 0xf6, 0xc4, 0x1c, 0x69, 0xb1, 0xe, 0xd6, 0xa3, 0x7b, 0x49, 0x91, 0xe4, 0x3c, 0x80, 0x58, 0x2d, 0xf5, 0xc7, 0x1f, 0x6a, 0xb2, 0xf, 0xd7, 0xa2, 0x7a, 0x48, 0x90, 0xe5, 0x3d, 0x81, 0x59, 0x2c, 0xf4, 0xc6, 0x1e, 0x6b, 0xb3}, [256]byte{0x0, 0xd9, 0xaf, 0x76, 0x43, 0x9a, 0xec, 0x35, 0x86, 0x5f, 0x29, 0xf0, 0xc5, 0x1c, 0x6a, 0xb3, 0x11, 0xc8, 0xbe, 0x67, 0x52, 0x8b, 0xfd, 0x24, 0x97, 0x4e, 0x38, 0xe1, 0xd4, 0xd, 0x7b, 0xa2, 0x22, 0xfb, 0x8d, 0x54, 0x61, 0xb8, 0xce, 0x17, 0xa4, 0x7d, 0xb, 0xd2, 0xe7, 0x3e, 0x48, 0x91, 0x33, 0xea, 0x9c, 0x45, 0x70, 0xa9, 0xdf, 0x6, 0xb5, 0x6c, 0x1a, 0xc3, 0xf6, 0x2f, 0x59, 0x80, 0x44, 0x9d, 0xeb, 0x32, 0x7, 0xde, 0xa8, 0x71, 0xc2, 0x1b, 0x6d, 0xb4, 0x81, 0x58, 0x2e, 0xf7, 0x55, 0x8c, 0xfa, 0x23, 0x16, 0xcf, 0xb9, 0x60, 0xd3, 0xa, 0x7c, 0xa5, 0x90, 0x49, 0x3f, 0xe6, 0x66, 0xbf, 0xc9, 0x10, 0x25, 0xfc, 0x8a, 0x53, 0xe0, 0x39, 0x4f, 0x96, 0xa3, 0x7a, 0xc, 0xd5, 0x77, 0xae, 0xd8, 0x1, 0x34, 0xed, 0x9b, 0x42, 0xf1, 0x28, 0x5e, 0x87, 0xb2, 0x6b, 0x1d, 0xc4, 0x88, 0x51, 0x27, 0xfe, 0xcb, 0x12, 0x64, 0xbd, 0xe, 0xd7, 0xa1, 0x78, 0x4d, 0x94, 0xe2, 0x3b, 0x99, 0x40, 0x36, 0xef, 0xda, 0x3, 0x75, 0xac, 0x1f, 0xc6, 0xb0, 0x69, 0x5c, 0x85, 0xf3, 0x2a, 0xaa, 0x73, 0x5, 0xdc, 0xe9, 0x30, 0x46, 0x9f, 0x2c, 0xf5, 0x83, 0x5a, 0x6f, 0xb6, 0xc0, 0x19, 0xbb, 0x62, 0x14, 0xcd, 0xf8, 0x21, 0x57, 0x8e, 0x3d, 0xe4, 0x92, 0x4b, 0x7e, 0xa7, 0xd1, 0x8, 0xcc, 0x15, 0x63, 0xba, 0x8f, 0x56, 0x20, 0xf9, 0x4a, 0x93, 0xe5, 0x3c, 0x9, 0xd0, 0xa6, 0x7f, 0xdd, 0x4, 0x72, 0xab, 0x9e, 0x47, 0x31, 0xe8, 0x5b, 0x82, 0xf4, 0x2d, 0x18, 0xc1, 0xb7, 0x6e, 0xee, 0x37, 0x41, 0x98, 0xad, 0x74, 0x2, 0xdb, 0x68, 0xb1, 0xc7, 0x1e, 0x2b, 0xf2, 0x84, 0x5d, 0xff, 0x26, 0x50, 0x89, 0xbc, 0x65, 0x13, 0xca, 0x79, 0xa0, 0xd6, 0xf, 0x3a, 0xe3, 0x95, 0x4c}, [256]byte{0x0, 0xda, 0xa9, 0x73, 0x4f, 0x95, 0xe6, 0x3c, 0x9e, 0x44, 0x37, 0xed, 0xd1, 0xb, 0x78, 0xa2, 0x21, 0xfb, 0x88, 0x52, 0x6e, 0xb4, 0xc7, 0x1d, 0xbf, 0x65, 0x16, 0xcc, 0xf0, 0x2a, 0x59, 0x83, 0x42, 0x98, 0xeb, 0x31, 0xd, 0xd7, 0xa4, 0x7e, 0xdc, 0x6, 0x75, 0xaf, 0x93, 0x49, 0x3a, 0xe0, 0x63, 0xb9, 0xca, 0x10, 0x2c, 0xf6, 0x85, 0x5f, 0xfd, 0x27, 0x54, 0x8e, 0xb2, 0x68, 0x1b, 0xc1, 0x84, 0x5e, 0x2d, 0xf7, 0xcb, 0x11, 0x62, 0xb8, 0x1a, 0xc0, 0xb3, 0x69, 0x55, 0x8f, 0xfc, 0x26, 0xa5, 0x7f, 0xc, 0xd6, 0xea, 0x30, 0x43, 0x99, 0x3b, 0xe1, 0x92, 0x48, 0x74, 0xae, 0xdd, 0x7, 0xc6, 0x1c, 0x6f, 0xb5, 0x89, 0x53, 0x20, 0xfa, 0x58, 0x82, 0xf1, 0x2b, 0x17, 0xcd, 0xbe, 0x64, 0xe7, 0x3d, 0x4e, 0x94, 0xa8, 0x72, 0x1, 0xdb, 0x79, 0xa3, 0xd0, 0xa, 0x36, 0xec, 0x9f, 0x45, 0x15, 0xcf, 0xbc, 0x66, 0x5a, 0x80, 0xf3, 0x29, 0x8b, 0x51, 0x22, 0xf8, 0xc4, 0x1e, 0x6d, 0xb7, 0x34, 0xee, 0x9d, 0x47, 0x7b, 0xa1, 0xd2, 0x8, 0xaa, 0x70, 0x3, 0xd9, 0xe5, 0x3f, 0x4c, 0x96, 0x57, 0x8d, 0xfe, 0x24, 0x18, 0xc2, 0xb1, 0x6b, 0xc9, 0x13, 0x60, 0xba, 0x86, 0x5c, 0x2f, 0xf5, 0x76, 0xac, 0xdf, 0x5, 0x39, 0xe3, 0x90, 0x4a, 0xe8, 0x32, 0x41, 0x9b, 0xa7, 0x7d, 0xe, 0xd4, 0x91, 0x4b, 0x38, 0xe2, 0xde, 0x4, 0x77, 0xad, 0xf, 0xd5, 0xa6, 0x7c, 0x40, 0x9a, 0xe9, 0x33, 0xb0, 0x6a, 0x19, 0xc3, 0xff, 0x25, 0x56, 0x8c, 0x2e, 0xf4, 0x87, 0x5d, 0x61, 0xbb, 0xc8, 0x12, 0xd3, 0x9, 0x7a, 0xa0, 0x9c, 0x46, 0x35, 0xef, 0x4d, 0x97, 0xe4, 0x3e, 0x2, 0xd8, 0xab, 0x71, 0xf2, 0x28, 0x5b, 0x81, 0xbd, 0x67, 0x14, 0xce, 0x6c, 0xb6, 0xc5, 0x1f, 0x23, 0xf9, 0x8a, 0x50}, [256]byte{0x0, 0xdb, 0xab, 0x70, 0x4b, 0x90, 0xe0, 0x3b, 0x96, 0x4d, 0x3d, 0xe6, 0xdd, 0x6, 0x76, 0xad, 0x31, 0xea, 0x9a, 0x41, 0x7a, 0xa1, 0xd1, 0xa, 0xa7, 0x7c, 0xc, 0xd7, 0xec, 0x37, 0x47, 0x9c, 0x62, 0xb9, 0xc9, 0x12, 0x29, 0xf2, 0x82, 0x59, 0xf4, 0x2f, 0x5f, 0x84, 0xbf, 0x64, 0x14, 0xcf, 0x53, 0x88, 0xf8, 0x23, 0x18, 0xc3, 0xb3, 0x68, 0xc5, 0x1e, 0x6e, 0xb5, 0x8e, 0x55, 0x25, 0xfe, 0xc4, 0x1f, 0x6f, 0xb4, 0x8f, 0x54, 0x24, 0xff, 0x52, 0x89, 0xf9, 0x22, 0x19, 0xc2, 0xb2, 0x69, 0xf5, 0x2e, 0x5e, 0x85, 0xbe, 0x65, 0x15, 0xce, 0x63, 0xb8, 0xc8, 0x13, 0x28, 0xf3, 0x83, 0x58, 0xa6, 0x7d, 0xd, 0xd6, 0xed, 0x36, 0x46, 0x9d, 0x30, 0xeb, 0x9b, 0x40, 0x7b, 0xa0, 0xd0, 0xb, 0x97, 0x4c, 0x3c, 0xe7, 0xdc, 0x7, 0x77, 0xac, 0x1, 0xda, 0xaa, 0x71, 0x4a, 0x91, 0xe1, 0x3a, 0x95, 0x4e, 0x3e, 0xe5, 0xde, 0x5, 0x75, 0xae, 0x3, 0xd8, 0xa8, 0x73, 0x48, 0x93, 0xe3, 0x38, 0xa4, 0x7f, 0xf, 0xd4, 0xef, 0x34, 0x44, 0x9f, 0x32, 0xe9, 0x99, 0x42, 0x79, 0xa2, 0xd2, 0x9, 0xf7, 0x2c, 0x5c, 0x87, 0xbc, 0x67, 0x17, 0xcc, 0x61, 0xba, 0xca, 0x11, 0x2a, 0xf1, 0x81, 0x5a, 0xc6, 0x1d, 0x6d, 0xb6, 0x8d, 0x56, 0x26, 0xfd, 0x50, 0x8b, 0xfb, 0x20, 0x1b, 0xc0, 0xb0, 0x6b, 0x51, 0x8a, 0xfa, 0x21, 0x1a, 0xc1, 0xb1, 0x6a, 0xc7, 0x1c, 0x6c, 0xb7, 0x8c, 0x57, 0x27, 0xfc, 0x60, 0xbb, 0xcb, 0x10, 0x2b, 0xf0, 0x80, 0x5b, 0xf6, 0x2d, 0x5d, 0x86, 0xbd, 0x66, 0x16, 0xcd, 0x33, 0xe8, 0x98, 0x43, 0x78, 0xa3, 0xd3, 0x8, 0xa5, 0x7e, 0xe, 0xd5, 0xee, 0x35, 0x45, 0x9e, 0x2, 0xd9, 0xa9, 0x72, 0x49, 0x92, 0xe2, 0x39, 0x94, 0x4f, 0x3f, 0xe4, 0xdf, 0x4, 0x74, 0xaf}, [256]byte{0x0, 0xdc, 0xa5, 0x79, 0x57, 0x8b, 0xf2, 0x2e, 0xae, 0x72, 0xb, 0xd7, 0xf9, 0x25, 0x5c, 0x80, 0x41, 0x9d, 0xe4, 0x38, 0x16, 0xca, 0xb3, 0x6f, 0xef, 0x33, 0x4a, 0x96, 0xb8, 0x64, 0x1d, 0xc1, 0x82, 0x5e, 0x27, 0xfb, 0xd5, 0x9, 0x70, 0xac, 0x2c, 0xf0, 0x89, 0x55, 0x7b, 0xa7, 0xde, 0x2, 0xc3, 0x1f, 0x66, 0xba, 0x94, 0x48, 0x31, 0xed, 0x6d, 0xb1, 0xc8, 0x14, 0x3a, 0xe6, 0x9f, 0x43, 0x19, 0xc5, 0xbc, 0x60, 0x4e, 0x92, 0xeb, 0x37, 0xb7, 0x6b, 0x12, 0xce, 0xe0, 0x3c, 0x45, 0x99, 0x58, 0x84, 0xfd, 0x21, 0xf, 0xd3, 0xaa, 0x76, 0xf6, 0x2a, 0x53, 0x8f, 0xa1, 0x7d, 0x4, 0xd8, 0x9b, 0x47, 0x3e, 0xe2, 0xcc, 0x10, 0x69, 0xb5, 0x35, 0xe9, 0x90, 0x4c, 0x62, 0xbe, 0xc7, 0x1b, 0xda, 0x6, 0x7f, 0xa3, 0x8d, 0x51, 0x28, 0xf4, 0x74, 0xa8, 0xd1, 0xd, 0x23, 0xff, 0x86, 0x5a, 0x32, 0xee, 0x97, 0x4b, 0x65, 0xb9, 0xc0, 0x1c, 0x9c, 0x40, 0x39, 0xe5, 0xcb, 0x17, 0x6e, 0xb2, 0x73, 0xaf, 0xd6, 0xa, 0x24, 0xf8, 0x81, 0x5d, 0xdd, 0x1, 0x78, 0xa4, 0x8a, 0x56, 0x2f, 0xf3, 0xb0, 0x6c, 0x15, 0xc9, 0xe7, 0x3b, 0x42, 0x9e, 0x1e, 0xc2, 0xbb, 0x67, 0x49, 0x95, 0xec, 0x30, 0xf1, 0x2d, 0x54, 0x88, 0xa6, 0x7a, 0x3, 0xdf, 0x5f, 0x83, 0xfa, 0x26, 0x8, 0xd4, 0xad, 0x71, 0x2b, 0xf7, 0x8e, 0x52, 0x7c, 0xa0, 0xd9, 0x5, 0x85, 0x59, 0x20, 0xfc, 0xd2, 0xe, 0x77, 0xab, 0x6a, 0xb6, 0xcf, 0x13, 0x3d, 0xe1, 0x98, 0x44, 0xc4, 0x18, 0x61, 0xbd, 0x93, 0x4f, 0x36, 0xea, 0xa9, 0x75, 0xc, 0xd0, 0xfe, 0x22, 0x5b, 0x87, 0x7, 0xdb, 0xa2, 0x7e, 0x50, 0x8c, 0xf5, 0x29, 0xe8, 0x34, 0x4d, 0x91, 0xbf, 0x63, 0x1a, 0xc6, 0x46, 0x9a, 0xe3, 0x3f, 0x11, 0xcd, 0xb4, 0x68}, [256]byte{0x0, 0xdd, 0xa7, 0x7a, 0x53, 0x8e, 0xf4, 0x29, 0xa6, 0x7b, 0x1, 0xdc, 0xf5, 0x28, 0x52, 0x8f, 0x51, 0x8c, 0xf6, 0x2b, 0x2, 0xdf, 0xa5, 0x78, 0xf7, 0x2a, 0x50, 0x8d, 0xa4, 0x79, 0x3, 0xde, 0xa2, 0x7f, 0x5, 0xd8, 0xf1, 0x2c, 0x56, 0x8b, 0x4, 0xd9, 0xa3, 0x7e, 0x57, 0x8a, 0xf0, 0x2d, 0xf3, 0x2e, 0x54, 0x89, 0xa0, 0x7d, 0x7, 0xda, 0x55, 0x88, 0xf2, 0x2f, 0x6, 0xdb, 0xa1, 0x7c, 0x59, 0x84, 0xfe, 0x23, 0xa, 0xd7, 0xad, 0x70, 0xff, 0x22, 0x58, 0x85, 0xac, 0x71, 0xb, 0xd6, 0x8, 0xd5, 0xaf, 0x72, 0x5b, 0x86, 0xfc, 0x21, 0xae, 0x73, 0x9, 0xd4, 0xfd, 0x20, 0x5a, 0x87, 0xfb, 0x26, 0x5c, 0x81, 0xa8, 0x75, 0xf, 0xd2, 0x5d, 0x80, 0xfa, 0x27, 0xe, 0xd3, 0xa9, 0x74, 0xaa, 0x77, 0xd, 0xd0, 0xf9, 0x24, 0x5e, 0x83, 0xc, 0xd1, 0xab, 0x76, 0x5f, 0x82, 0xf8, 0x25, 0xb2, 0x6f, 0x15, 0xc8, 0xe1, 0x3c, 0x46, 0x9b, 0x14, 0xc9, 0xb3, 0x6e, 0x47, 0x9a, 0xe0, 0x3d, 0xe3, 0x3e, 0x44, 0x99, 0xb0, 0x6d, 0x17, 0xca, 0x45, 0x98, 0xe2, 0x3f, 0x16, 0xcb, 0xb1, 0x6c, 0x10, 0xcd, 0xb7, 0x6a, 0x43, 0x9e, 0xe4, 0x39, 0xb6, 0x6b, 0x11, 0xcc, 0xe5, 0x38, 0x42, 0x9f, 0x41, 0x9c, 0xe6, 0x3b, 0x12, 0xcf, 0xb5, 0x68, 0xe7, 0x3a, 0x40, 0x9d, 0xb4, 0x69, 0x13, 0xce, 0xeb, 0x36, 0x4c, 0x91, 0xb8, 0x65, 0x1f, 0xc2, 0x4d, 0x90, 0xea, 0x37, 0x1e, 0xc3, 0xb9, 0x64, 0xba, 0x67, 0x1d, 0xc0, 0xe9, 0x34, 0x4e, 0x93, 0x1c, 0xc1, 0xbb, 0x66, 0x4f, 0x92, 0xe8, 0x35, 0x49, 0x94, 0xee, 0x33, 0x1a, 0xc7, 0xbd, 0x60, 0xef, 0x32, 0x48, 0x95, 0xbc, 0x61, 0x1b, 0xc6, 0x18, 0xc5, 0xbf, 0x62, 0x4b, 0x96, 0xec, 0x31, 0xbe, 0x63, 0x19, 0xc4, 0xed, 0x30, 0x4a, 0x97}, [256]byte{0x0, 0xde, 0xa1, 0x7f, 0x5f, 0x81, 0xfe, 0x20, 0xbe, 0x60, 0x1f, 0xc1, 0xe1, 0x3f, 0x40, 0x9e, 0x61, 0xbf, 0xc0, 0x1e, 0x3e, 0xe0, 0x9f, 0x41, 0xdf, 0x1, 0x7e, 0xa0, 0x80, 0x5e, 0x21, 0xff, 0xc2, 0x1c, 0x63, 0xbd, 0x9d, 0x43, 0x3c, 0xe2, 0x7c, 0xa2, 0xdd, 0x3, 0x23, 0xfd, 0x82, 0x5c, 0xa3, 0x7d, 0x2, 0xdc, 0xfc, 0x22, 0x5d, 0x83, 0x1d, 0xc3, 0xbc, 0x62, 0x42, 0x9c, 0xe3, 0x3d, 0x99, 0x47, 0x38, 0xe6, 0xc6, 0x18, 0x67, 0xb9, 0x27, 0xf9, 0x86, 0x58, 0x78, 0xa6, 0xd9, 0x7, 0xf8, 0x26, 0x59, 0x87, 0xa7, 0x79, 0x6, 0xd8, 0x46, 0x98, 0xe7, 0x39, 0x19, 0xc7, 0xb8, 0x66, 0x5b, 0x85, 0xfa, 0x24, 0x4, 0xda, 0xa5, 0x7b, 0xe5, 0x3b, 0x44, 0x9a, 0xba, 0x64, 0x1b, 0xc5, 0x3a, 0xe4, 0x9b, 0x45, 0x65, 0xbb, 0xc4, 0x1a, 0x84, 0x5a, 0x25, 0xfb, 0xdb, 0x5, 0x7a, 0xa4, 0x2f, 0xf1, 0x8e, 0x50, 0x70, 0xae, 0xd1, 0xf, 0x91, 0x4f, 0x30, 0xee, 0xce, 0x10, 0x6f, 0xb1, 0x4e, 0x90, 0xef, 0x31, 0x11, 0xcf, 0xb0, 0x6e, 0xf0, 0x2e, 0x51, 0x8f, 0xaf, 0x71, 0xe, 0xd0, 0xed, 0x33, 0x4c, 0x92, 0xb2, 0x6c, 0x13, 0xcd, 0x53, 0x8d, 0xf2, 0x2c, 0xc, 0xd2, 0xad, 0x73, 0x8c, 0x52, 0x2d, 0xf3, 0xd3, 0xd, 0x72, 0xac, 0x32, 0xec, 0x93, 0x4d, 0x6d, 0xb3, 0xcc, 0x12, 0xb6, 0x68, 0x17, 0xc9, 0xe9, 0x37, 0x48, 0x96, 0x8, 0xd6, 0xa9, 0x77, 0x57, 0x89, 0xf6, 0x28, 0xd7, 0x9, 0x76, 0xa8, 0x88, 0x56, 0x29, 0xf7, 0x69, 0xb7, 0xc8, 0x16, 0x36, 0xe8, 0x97, 0x49, 0x74, 0xaa, 0xd5, 0xb, 0x2b, 0xf5, 0x8a, 0x54, 0xca, 0x14, 0x6b, 0xb5, 0x95, 0x4b, 0x34, 0xea, 0x15, 0xcb, 0xb4, 0x6a, 0x4a, 0x94, 0xeb, 0x35, 0xab, 0x75, 0xa, 0xd4, 0xf4, 0x2a, 0x55, 0x8b}, [256]byte{0x0, 0xdf, 0xa3, 0x7c, 0x5b, 0x84, 0xf8, 0x27, 0xb6, 0x69, 0x15, 0xca, 0xed, 0x32, 0x4e, 0x91, 0x71, 0xae, 0xd2, 0xd, 0x2a, 0xf5, 0x89, 0x56, 0xc7, 0x18, 0x64, 0xbb, 0x9c, 0x43, 0x3f, 0xe0, 0xe2, 0x3d, 0x41, 0x9e, 0xb9, 0x66, 0x1a, 0xc5, 0x54, 0x8b, 0xf7, 0x28, 0xf, 0xd0, 0xac, 0x73, 0x93, 0x4c, 0x30, 0xef, 0xc8, 0x17, 0x6b, 0xb4, 0x25, 0xfa, 0x86, 0x59, 0x7e, 0xa1, 0xdd, 0x2, 0xd9, 0x6, 0x7a, 0xa5, 0x82, 0x5d, 0x21, 0xfe, 0x6f, 0xb0, 0xcc, 0x13, 0x34, 0xeb, 0x97, 0x48, 0xa8, 0x77, 0xb, 0xd4, 0xf3, 0x2c, 0x50, 0x8f, 0x1e, 0xc1, 0xbd, 0x62, 0x45, 0x9a, 0xe6, 0x39, 0x3b, 0xe4, 0x98, 0x47, 0x60, 0xbf, 0xc3, 0x1c, 0x8d, 0x52, 0x2e, 0xf1, 0xd6, 0x9, 0x75, 0xaa, 0x4a, 0x95, 0xe9, 0x36, 0x11, 0xce, 0xb2, 0x6d, 0xfc, 0x23, 0x5f, 0x80, 0xa7, 0x78, 0x4, 0xdb, 0xaf, 0x70, 0xc, 0xd3, 0xf4, 0x2b, 0x57, 0x88, 0x19, 0xc6, 0xba, 0x65, 0x42, 0x9d, 0xe1, 0x3e, 0xde, 0x1, 0x7d, 0xa2, 0x85, 0x5a, 0x26, 0xf9, 0x68, 0xb7, 0xcb, 0x14, 0x33, 0xec, 0x90, 0x4f, 0x4d, 0x92, 0xee, 0x31, 0x16, 0xc9, 0xb5, 0x6a, 0xfb, 0x24, 0x58, 0x87, 0xa0, 0x7f, 0x3, 0xdc, 0x3c, 0xe3, 0x9f, 0x40, 0x67, 0xb8, 0xc4, 0x1b, 0x8a, 0x55, 0x29, 0xf6, 0xd1, 0xe, 0x72, 0xad, 0x76, 0xa9, 0xd5, 0xa, 0x2d, 0xf2, 0x8e, 0x51, 0xc0, 0x1f, 0x63, 0xbc, 0x9b, 0x44, 0x38, 0xe7, 0x7, 0xd8, 0xa4, 0x7b, 0x5c, 0x83, 0xff, 0x20, 0xb1, 0x6e, 0x12, 0xcd, 0xea, 0x35, 0x49, 0x96, 0x94, 0x4b, 0x37, 0xe8, 0xcf, 0x10, 0x6c, 0xb3, 0x22, 0xfd, 0x81, 0x5e, 0x79, 0xa6, 0xda, 0x5, 0xe5, 0x3a, 0x46, 0x99, 0xbe, 0x61, 0x1d, 0xc2, 0x53, 0x8c, 0xf0, 0x2f, 0x8, 0xd7, 0xab, 0x74}, [256]byte{0x0, 0xe0, 0xdd, 0x3d, 0xa7, 0x47, 0x7a, 0x9a, 0x53, 0xb3, 0x8e, 0x6e, 0xf4, 0x14, 0x29, 0xc9, 0xa6, 0x46, 0x7b, 0x9b, 0x1, 0xe1, 0xdc, 0x3c, 0xf5, 0x15, 0x28, 0xc8, 0x52, 0xb2, 0x8f, 0x6f, 0x51, 0xb1, 0x8c, 0x6c, 0xf6, 0x16, 0x2b, 0xcb, 0x2, 0xe2, 0xdf, 0x3f, 0xa5, 0x45, 0x78, 0x98, 0xf7, 0x17, 0x2a, 0xca, 0x50, 0xb0, 0x8d, 0x6d, 0xa4, 0x44, 0x79, 0x99, 0x3, 0xe3, 0xde, 0x3e, 0xa2, 0x42, 0x7f, 0x9f, 0x5, 0xe5, 0xd8, 0x38, 0xf1, 0x11, 0x2c, 0xcc, 0x56, 0xb6, 0x8b, 0x6b, 0x4, 0xe4, 0xd9, 0x39, 0xa3, 0x43, 0x7e, 0x9e, 0x57, 0xb7, 0x8a, 0x6a, 0xf0, 0x10, 0x2d, 0xcd, 0xf3, 0x13, 0x2e, 0xce, 0x54, 0xb4, 0x89, 0x69, 0xa0, 0x40, 0x7d, 0x9d, 0x7, 0xe7, 0xda, 0x3a, 0x55, 0xb5, 0x88, 0x68, 0xf2, 0x12, 0x2f, 0xcf, 0x6, 0xe6, 0xdb, 0x3b, 0xa1, 0x41, 0x7c, 0x9c, 0x59, 0xb9, 0x84, 0x64, 0xfe, 0x1e, 0x23, 0xc3, 0xa, 0xea, 0xd7, 0x37, 0xad, 0x4d, 0x70, 0x90, 0xff, 0x1f, 0x22, 0xc2, 0x58, 0xb8, 0x85, 0x65, 0xac, 0x4c, 0x71, 0x91, 0xb, 0xeb, 0xd6, 0x36, 0x8, 0xe8, 0xd5, 0x35, 0xaf, 0x4f, 0x72, 0x92, 0x5b, 0xbb, 0x86, 0x66, 0xfc, 0x1c, 0x21, 0xc1, 0xae, 0x4e, 0x73, 0x93, 0x9, 0xe9, 0xd4, 0x34, 0xfd, 0x1d, 0x20, 0xc0, 0x5a, 0xba, 0x87, 0x67, 0xfb, 0x1b, 0x26, 0xc6, 0x5c, 0xbc, 0x81, 0x61, 0xa8, 0x48, 0x75, 0x95, 0xf, 0xef, 0xd2, 0x32, 0x5d, 0xbd, 0x80, 0x60, 0xfa, 0x1a, 0x27, 0xc7, 0xe, 0xee, 0xd3, 0x33, 0xa9, 0x49, 0x74, 0x94, 0xaa, 0x4a, 0x77, 0x97, 0xd, 0xed, 0xd0, 0x30, 0xf9, 0x19, 0x24, 0xc4, 0x5e, 0xbe, 0x83, 0x63, 0xc, 0xec, 0xd1, 0x31, 0xab, 0x4b, 0x76, 0x96, 0x5f, 0xbf, 0x82, 0x62, 0xf8, 0x18, 0x25, 0xc5}, [256]byte{0x0, 0xe1, 0xdf, 0x3e, 0xa3, 0x42, 0x7c, 0x9d, 0x5b, 0xba, 0x84, 0x65, 0xf8, 0x19, 0x27, 0xc6, 0xb6, 0x57, 0x69, 0x88, 0x15, 0xf4, 0xca, 0x2b, 0xed, 0xc, 0x32, 0xd3, 0x4e, 0xaf, 0x91, 0x70, 0x71, 0x90, 0xae, 0x4f, 0xd2, 0x33, 0xd, 0xec, 0x2a, 0xcb, 0xf5, 0x14, 0x89, 0x68, 0x56, 0xb7, 0xc7, 0x26, 0x18, 0xf9, 0x64, 0x85, 0xbb, 0x5a, 0x9c, 0x7d, 0x43, 0xa2, 0x3f, 0xde, 0xe0, 0x1, 0xe2, 0x3, 0x3d, 0xdc, 0x41, 0xa0, 0x9e, 0x7f, 0xb9, 0x58, 0x66, 0x87, 0x1a, 0xfb, 0xc5, 0x24, 0x54, 0xb5, 0x8b, 0x6a, 0xf7, 0x16, 0x28, 0xc9, 0xf, 0xee, 0xd0, 0x31, 0xac, 0x4d, 0x73, 0x92, 0x93, 0x72, 0x4c, 0xad, 0x30, 0xd1, 0xef, 0xe, 0xc8, 0x29, 0x17, 0xf6, 0x6b, 0x8a, 0xb4, 0x55, 0x25, 0xc4, 0xfa, 0x1b, 0x86, 0x67, 0x59, 0xb8, 0x7e, 0x9f, 0xa1, 0x40, 0xdd, 0x3c, 0x2, 0xe3, 0xd9, 0x38, 0x6, 0xe7, 0x7a, 0x9b, 0xa5, 0x44, 0x82, 0x63, 0x5d, 0xbc, 0x21, 0xc0, 0xfe, 0x1f, 0x6f, 0x8e, 0xb0, 0x51, 0xcc, 0x2d, 0x13, 0xf2, 0x34, 0xd5, 0xeb, 0xa, 0x97, 0x76, 0x48, 0xa9, 0xa8, 0x49, 0x77, 0x96, 0xb, 0xea, 0xd4, 0x35, 0xf3, 0x12, 0x2c, 0xcd, 0x50, 0xb1, 0x8f, 0x6e, 0x1e, 0xff, 0xc1, 0x20, 0xbd, 0x5c, 0x62, 0x83, 0x45, 0xa4, 0x9a, 0x7b, 0xe6, 0x7, 0x39, 0xd8, 0x3b, 0xda, 0xe4, 0x5, 0x98, 0x79, 0x47, 0xa6, 0x60, 0x81, 0xbf, 0x5e, 0xc3, 0x22, 0x1c, 0xfd, 0x8d, 0x6c, 0x52, 0xb3, 0x2e, 0xcf, 0xf1, 0x10, 0xd6, 0x37, 0x9, 0xe8, 0x75, 0x94, 0xaa, 0x4b, 0x4a, 0xab, 0x95, 0x74, 0xe9, 0x8, 0x36, 0xd7, 0x11, 0xf0, 0xce, 0x2f, 0xb2, 0x53, 0x6d, 0x8c, 0xfc, 0x1d, 0x23, 0xc2, 0x5f, 0xbe, 0x80, 0x61, 0xa7, 0x46, 0x78, 0x99, 0x4, 0xe5, 0xdb, 0x3a}, [256]byte{0x0, 0xe2, 0xd9, 0x3b, 0xaf, 0x4d, 0x76, 0x94, 0x43, 0xa1, 0x9a, 0x78, 0xec, 0xe, 0x35, 0xd7, 0x86, 0x64, 0x5f, 0xbd, 0x29, 0xcb, 0xf0, 0x12, 0xc5, 0x27, 0x1c, 0xfe, 0x6a, 0x88, 0xb3, 0x51, 0x11, 0xf3, 0xc8, 0x2a, 0xbe, 0x5c, 0x67, 0x85, 0x52, 0xb0, 0x8b, 0x69, 0xfd, 0x1f, 0x24, 0xc6, 0x97, 0x75, 0x4e, 0xac, 0x38, 0xda, 0xe1, 0x3, 0xd4, 0x36, 0xd, 0xef, 0x7b, 0x99, 0xa2, 0x40, 0x22, 0xc0, 0xfb, 0x19, 0x8d, 0x6f, 0x54, 0xb6, 0x61, 0x83, 0xb8, 0x5a, 0xce, 0x2c, 0x17, 0xf5, 0xa4, 0x46, 0x7d, 0x9f, 0xb, 0xe9, 0xd2, 0x30, 0xe7, 0x5, 0x3e, 0xdc, 0x48, 0xaa, 0x91, 0x73, 0x33, 0xd1, 0xea, 0x8, 0x9c, 0x7e, 0x45, 0xa7, 0x70, 0x92, 0xa9, 0x4b, 0xdf, 0x3d, 0x6, 0xe4, 0xb5, 0x57, 0x6c, 0x8e, 0x1a, 0xf8, 0xc3, 0x21, 0xf6, 0x14, 0x2f, 0xcd, 0x59, 0xbb, 0x80, 0x62, 0x44, 0xa6, 0x9d, 0x7f, 0xeb, 0x9, 0x32, 0xd0, 0x7, 0xe5, 0xde, 0x3c, 0xa8, 0x4a, 0x71, 0x93, 0xc2, 0x20, 0x1b, 0xf9, 0x6d, 0x8f, 0xb4, 0x56, 0x81, 0x63, 0x58, 0xba, 0x2e, 0xcc, 0xf7, 0x15, 0x55, 0xb7, 0x8c, 0x6e, 0xfa, 0x18, 0x23, 0xc1, 0x16, 0xf4, 0xcf, 0x2d, 0xb9, 0x5b, 0x60, 0x82, 0xd3, 0x31, 0xa, 0xe8, 0x7c, 0x9e, 0xa5, 0x47, 0x90, 0x72, 0x49, 0xab, 0x3f, 0xdd, 0xe6, 0x4, 0x66, 0x84, 0xbf, 0x5d, 0xc9, 0x2b, 0x10, 0xf2, 0x25, 0xc7, 0xfc, 0x1e, 0x8a, 0x68, 0x53, 0xb1, 0xe0, 0x2, 0x39, 0xdb, 0x4f, 0xad, 0x96, 0x74, 0xa3, 0x41, 0x7a, 0x98, 0xc, 0xee, 0xd5, 0x37, 0x77, 0x95, 0xae, 0x4c, 0xd8, 0x3a, 0x1, 0xe3, 0x34, 0xd6, 0xed, 0xf, 0x9b, 0x79, 0x42, 0xa0, 0xf1, 0x13, 0x28, 0xca, 0x5e, 0xbc, 0x87, 0x65, 0xb2, 0x50, 0x6b, 0x89, 0x1d, 0xff, 0xc4, 0x26}, [256]byte{0x0, 0xe3, 0xdb, 0x38, 0xab, 0x48, 0x70, 0x93, 0x4b, 0xa8, 0x90, 0x73, 0xe0, 0x3, 0x3b, 0xd8, 0x96, 0x75, 0x4d, 0xae, 0x3d, 0xde, 0xe6, 0x5, 0xdd, 0x3e, 0x6, 0xe5, 0x76, 0x95, 0xad, 0x4e, 0x31, 0xd2, 0xea, 0x9, 0x9a, 0x79, 0x41, 0xa2, 0x7a, 0x99, 0xa1, 0x42, 0xd1, 0x32, 0xa, 0xe9, 0xa7, 0x44, 0x7c, 0x9f, 0xc, 0xef, 0xd7, 0x34, 0xec, 0xf, 0x37, 0xd4, 0x47, 0xa4, 0x9c, 0x7f, 0x62, 0x81, 0xb9, 0x5a, 0xc9, 0x2a, 0x12, 0xf1, 0x29, 0xca, 0xf2, 0x11, 0x82, 0x61, 0x59, 0xba, 0xf4, 0x17, 0x2f, 0xcc, 0x5f, 0xbc, 0x84, 0x67, 0xbf, 0x5c, 0x64, 0x87, 0x14, 0xf7, 0xcf, 0x2c, 0x53, 0xb0, 0x88, 0x6b, 0xf8, 0x1b, 0x23, 0xc0, 0x18, 0xfb, 0xc3, 0x20, 0xb3, 0x50, 0x68, 0x8b, 0xc5, 0x26, 0x1e, 0xfd, 0x6e, 0x8d, 0xb5, 0x56, 0x8e, 0x6d, 0x55, 0xb6, 0x25, 0xc6, 0xfe, 0x1d, 0xc4, 0x27, 0x1f, 0xfc, 0x6f, 0x8c, 0xb4, 0x57, 0x8f, 0x6c, 0x54, 0xb7, 0x24, 0xc7, 0xff, 0x1c, 0x52, 0xb1, 0x89, 0x6a, 0xf9, 0x1a, 0x22, 0xc1, 0x19, 0xfa, 0xc2, 0x21, 0xb2, 0x51, 0x69, 0x8a, 0xf5, 0x16, 0x2e, 0xcd, 0x5e, 0xbd, 0x85, 0x66, 0xbe, 0x5d, 0x65, 0x86, 0x15, 0xf6, 0xce, 0x2d, 0x63, 0x80, 0xb8, 0x5b, 0xc8, 0x2b, 0x13, 0xf0, 0x28, 0xcb, 0xf3, 0x10, 0x83, 0x60, 0x58, 0xbb, 0xa6, 0x45, 0x7d, 0x9e, 0xd, 0xee, 0xd6, 0x35, 0xed, 0xe, 0x36, 0xd5, 0x46, 0xa5, 0x9d, 0x7e, 0x30, 0xd3, 0xeb, 0x8, 0x9b, 0x78, 0x40, 0xa3, 0x7b, 0x98, 0xa0, 0x43, 0xd0, 0x33, 0xb, 0xe8, 0x97, 0x74, 0x4c, 0xaf, 0x3c, 0xdf, 0xe7, 0x4, 0xdc, 0x3f, 0x7, 0xe4, 0x77, 0x94, 0xac, 0x4f, 0x1, 0xe2, 0xda, 0x39, 0xaa, 0x49, 0x71, 0x92, 0x4a, 0xa9, 0x91, 0x72, 0xe1, 0x2, 0x3a, 0xd9}, [256]byte{0x0, 0xe4, 0xd5, 0x31, 0xb7, 0x53, 0x62, 0x86, 0x73, 0x97, 0xa6, 0x42, 0xc4, 0x20, 0x11, 0xf5, 0xe6, 0x2, 0x33, 0xd7, 0x51, 0xb5, 0x84, 0x60, 0x95, 0x71, 0x40, 0xa4, 0x22, 0xc6, 0xf7, 0x13, 0xd1, 0x35, 0x4, 0xe0, 0x66, 0x82, 0xb3, 0x57, 0xa2, 0x46, 0x77, 0x93, 0x15, 0xf1, 0xc0, 0x24, 0x37, 0xd3, 0xe2, 0x6, 0x80, 0x64, 0x55, 0xb1, 0x44, 0xa0, 0x91, 0x75, 0xf3, 0x17, 0x26, 0xc2, 0xbf, 0x5b, 0x6a, 0x8e, 0x8, 0xec, 0xdd, 0x39, 0xcc, 0x28, 0x19, 0xfd, 0x7b, 0x9f, 0xae, 0x4a, 0x59, 0xbd, 0x8c, 0x68, 0xee, 0xa, 0x3b, 0xdf, 0x2a, 0xce, 0xff, 0x1b, 0x9d, 0x79, 0x48, 0xac, 0x6e, 0x8a, 0xbb, 0x5f, 0xd9, 0x3d, 0xc, 0xe8, 0x1d, 0xf9, 0xc8, 0x2c, 0xaa, 0x4e, 0x7f, 0x9b, 0x88, 0x6c, 0x5d, 0xb9, 0x3f, 0xdb, 0xea, 0xe, 0xfb, 0x1f, 0x2e, 0xca, 0x4c, 0xa8, 0x99, 0x7d, 0x63, 0x87, 0xb6, 0x52, 0xd4, 0x30, 0x1, 0xe5, 0x10, 0xf4, 0xc5, 0x21, 0xa7, 0x43, 0x72, 0x96, 0x85, 0x61, 0x50, 0xb4, 0x32, 0xd6, 0xe7, 0x3, 0xf6, 0x12, 0x23, 0xc7, 0x41, 0xa5, 0x94, 0x70, 0xb2, 0x56, 0x67, 0x83, 0x5, 0xe1, 0xd0, 0x34, 0xc1, 0x25, 0x14, 0xf0, 0x76, 0x92, 0xa3, 0x47, 0x54, 0xb0, 0x81, 0x65, 0xe3, 0x7, 0x36, 0xd2, 0x27, 0xc3, 0xf2, 0x16, 0x90, 0x74, 0x45, 0xa1, 0xdc, 0x38, 0x9, 0xed, 0x6b, 0x8f, 0xbe, 0x5a, 0xaf, 0x4b, 0x7a, 0x9e, 0x18, 0xfc, 0xcd, 0x29, 0x3a, 0xde, 0xef, 0xb, 0x8d, 0x69, 0x58, 0xbc, 0x49, 0xad, 0x9c, 0x78, 0xfe, 0x1a, 0x2b, 0xcf, 0xd, 0xe9, 0xd8, 0x3c, 0xba, 0x5e, 0x6f, 0x8b, 0x7e, 0x9a, 0xab, 0x4f, 0xc9, 0x2d, 0x1c, 0xf8, 0xeb, 0xf, 0x3e, 0xda, 0x5c, 0xb8, 0x89, 0x6d, 0x98, 0x7c, 0x4d, 0xa9, 0x2f, 0xcb, 0xfa, 0x1e}, [256]byte{0x0, 0xe5, 0xd7, 0x32, 0xb3, 0x56, 0x64, 0x81, 0x7b, 0x9e, 0xac, 0x49, 0xc8, 0x2d, 0x1f, 0xfa, 0xf6, 0x13, 0x21, 0xc4, 0x45, 0xa0, 0x92, 0x77, 0x8d, 0x68, 0x5a, 0xbf, 0x3e, 0xdb, 0xe9, 0xc, 0xf1, 0x14, 0x26, 0xc3, 0x42, 0xa7, 0x95, 0x70, 0x8a, 0x6f, 0x5d, 0xb8, 0x39, 0xdc, 0xee, 0xb, 0x7, 0xe2, 0xd0, 0x35, 0xb4, 0x51, 0x63, 0x86, 0x7c, 0x99, 0xab, 0x4e, 0xcf, 0x2a, 0x18, 0xfd, 0xff, 0x1a, 0x28, 0xcd, 0x4c, 0xa9, 0x9b, 0x7e, 0x84, 0x61, 0x53, 0xb6, 0x37, 0xd2, 0xe0, 0x5, 0x9, 0xec, 0xde, 0x3b, 0xba, 0x5f, 0x6d, 0x88, 0x72, 0x97, 0xa5, 0x40, 0xc1, 0x24, 0x16, 0xf3, 0xe, 0xeb, 0xd9, 0x3c, 0xbd, 0x58, 0x6a, 0x8f, 0x75, 0x90, 0xa2, 0x47, 0xc6, 0x23, 0x11, 0xf4, 0xf8, 0x1d, 0x2f, 0xca, 0x4b, 0xae, 0x9c, 0x79, 0x83, 0x66, 0x54, 0xb1, 0x30, 0xd5, 0xe7, 0x2, 0xe3, 0x6, 0x34, 0xd1, 0x50, 0xb5, 0x87, 0x62, 0x98, 0x7d, 0x4f, 0xaa, 0x2b, 0xce, 0xfc, 0x19, 0x15, 0xf0, 0xc2, 0x27, 0xa6, 0x43, 0x71, 0x94, 0x6e, 0x8b, 0xb9, 0x5c, 0xdd, 0x38, 0xa, 0xef, 0x12, 0xf7, 0xc5, 0x20, 0xa1, 0x44, 0x76, 0x93, 0x69, 0x8c, 0xbe, 0x5b, 0xda, 0x3f, 0xd, 0xe8, 0xe4, 0x1, 0x33, 0xd6, 0x57, 0xb2, 0x80, 0x65, 0x9f, 0x7a, 0x48, 0xad, 0x2c, 0xc9, 0xfb, 0x1e, 0x1c, 0xf9, 0xcb, 0x2e, 0xaf, 0x4a, 0x78, 0x9d, 0x67, 0x82, 0xb0, 0x55, 0xd4, 0x31, 0x3, 0xe6, 0xea, 0xf, 0x3d, 0xd8, 0x59, 0xbc, 0x8e, 0x6b, 0x91, 0x74, 0x46, 0xa3, 0x22, 0xc7, 0xf5, 0x10, 0xed, 0x8, 0x3a, 0xdf, 0x5e, 0xbb, 0x89, 0x6c, 0x96, 0x73, 0x41, 0xa4, 0x25, 0xc0, 0xf2, 0x17, 0x1b, 0xfe, 0xcc, 0x29, 0xa8, 0x4d, 0x7f, 0x9a, 0x60, 0x85, 0xb7, 0x52, 0xd3, 0x36, 0x4, 0xe1}, [256]byte{0x0, 0xe6, 0xd1, 0x37, 0xbf, 0x59, 0x6e, 0x88, 0x63, 0x85, 0xb2, 0x54, 0xdc, 0x3a, 0xd, 0xeb, 0xc6, 0x20, 0x17, 0xf1, 0x79, 0x9f, 0xa8, 0x4e, 0xa5, 0x43, 0x74, 0x92, 0x1a, 0xfc, 0xcb, 0x2d, 0x91, 0x77, 0x40, 0xa6, 0x2e, 0xc8, 0xff, 0x19, 0xf2, 0x14, 0x23, 0xc5, 0x4d, 0xab, 0x9c, 0x7a, 0x57, 0xb1, 0x86, 0x60, 0xe8, 0xe, 0x39, 0xdf, 0x34, 0xd2, 0xe5, 0x3, 0x8b, 0x6d, 0x5a, 0xbc, 0x3f, 0xd9, 0xee, 0x8, 0x80, 0x66, 0x51, 0xb7, 0x5c, 0xba, 0x8d, 0x6b, 0xe3, 0x5, 0x32, 0xd4, 0xf9, 0x1f, 0x28, 0xce, 0x46, 0xa0, 0x97, 0x71, 0x9a, 0x7c, 0x4b, 0xad, 0x25, 0xc3, 0xf4, 0x12, 0xae, 0x48, 0x7f, 0x99, 0x11, 0xf7, 0xc0, 0x26, 0xcd, 0x2b, 0x1c, 0xfa, 0x72, 0x94, 0xa3, 0x45, 0x68, 0x8e, 0xb9, 0x5f, 0xd7, 0x31, 0x6, 0xe0, 0xb, 0xed, 0xda, 0x3c, 0xb4, 0x52, 0x65, 0x83, 0x7e, 0x98, 0xaf, 0x49, 0xc1, 0x27, 0x10, 0xf6, 0x1d, 0xfb, 0xcc, 0x2a, 0xa2, 0x44, 0x73, 0x95, 0xb8, 0x5e, 0x69, 0x8f, 0x7, 0xe1, 0xd6, 0x30, 0xdb, 0x3d, 0xa, 0xec, 0x64, 0x82, 0xb5, 0x53, 0xef, 0x9, 0x3e, 0xd8, 0x50, 0xb6, 0x81, 0x67, 0x8c, 0x6a, 0x5d, 0xbb, 0x33, 0xd5, 0xe2, 0x4, 0x29, 0xcf, 0xf8, 0x1e, 0x96, 0x70, 0x47, 0xa1, 0x4a, 0xac, 0x9b, 0x7d, 0xf5, 0x13, 0x24, 0xc2, 0x41, 0xa7, 0x90, 0x76, 0xfe, 0x18, 0x2f, 0xc9, 0x22, 0xc4, 0xf3, 0x15, 0x9d, 0x7b, 0x4c, 0xaa, 0x87, 0x61, 0x56, 0xb0, 0x38, 0xde, 0xe9, 0xf, 0xe4, 0x2, 0x35, 0xd3, 0x5b, 0xbd, 0x8a, 0x6c, 0xd0, 0x36, 0x1, 0xe7, 0x6f, 0x89, 0xbe, 0x58, 0xb3, 0x55, 0x62, 0x84, 0xc, 0xea, 0xdd, 0x3b, 0x16, 0xf0, 0xc7, 0x21, 0xa9, 0x4f, 0x78, 0x9e, 0x75, 0x93, 0xa4, 0x42, 0xca, 0x2c, 0x1b, 0xfd}, [256]byte{0x0, 0xe7, 0xd3, 0x34, 0xbb, 0x5c, 0x68, 0x8f, 0x6b, 0x8c, 0xb8, 0x5f, 0xd0, 0x37, 0x3, 0xe4, 0xd6, 0x31, 0x5, 0xe2, 0x6d, 0x8a, 0xbe, 0x59, 0xbd, 0x5a, 0x6e, 0x89, 0x6, 0xe1, 0xd5, 0x32, 0xb1, 0x56, 0x62, 0x85, 0xa, 0xed, 0xd9, 0x3e, 0xda, 0x3d, 0x9, 0xee, 0x61, 0x86, 0xb2, 0x55, 0x67, 0x80, 0xb4, 0x53, 0xdc, 0x3b, 0xf, 0xe8, 0xc, 0xeb, 0xdf, 0x38, 0xb7, 0x50, 0x64, 0x83, 0x7f, 0x98, 0xac, 0x4b, 0xc4, 0x23, 0x17, 0xf0, 0x14, 0xf3, 0xc7, 0x20, 0xaf, 0x48, 0x7c, 0x9b, 0xa9, 0x4e, 0x7a, 0x9d, 0x12, 0xf5, 0xc1, 0x26, 0xc2, 0x25, 0x11, 0xf6, 0x79, 0x9e, 0xaa, 0x4d, 0xce, 0x29, 0x1d, 0xfa, 0x75, 0x92, 0xa6, 0x41, 0xa5, 0x42, 0x76, 0x91, 0x1e, 0xf9, 0xcd, 0x2a, 0x18, 0xff, 0xcb, 0x2c, 0xa3, 0x44, 0x70, 0x97, 0x73, 0x94, 0xa0, 0x47, 0xc8, 0x2f, 0x1b, 0xfc, 0xfe, 0x19, 0x2d, 0xca, 0x45, 0xa2, 0x96, 0x71, 0x95, 0x72, 0x46, 0xa1, 0x2e, 0xc9, 0xfd, 0x1a, 0x28, 0xcf, 0xfb, 0x1c, 0x93, 0x74, 0x40, 0xa7, 0x43, 0xa4, 0x90, 0x77, 0xf8, 0x1f, 0x2b, 0xcc, 0x4f, 0xa8, 0x9c, 0x7b, 0xf4, 0x13, 0x27, 0xc0, 0x24, 0xc3, 0xf7, 0x10, 0x9f, 0x78, 0x4c, 0xab, 0x99, 0x7e, 0x4a, 0xad, 0x22, 0xc5, 0xf1, 0x16, 0xf2, 0x15, 0x21, 0xc6, 0x49, 0xae, 0x9a, 0x7d, 0x81, 0x66, 0x52, 0xb5, 0x3a, 0xdd, 0xe9, 0xe, 0xea, 0xd, 0x39, 0xde, 0x51, 0xb6, 0x82, 0x65, 0x57, 0xb0, 0x84, 0x63, 0xec, 0xb, 0x3f, 0xd8, 0x3c, 0xdb, 0xef, 0x8, 0x87, 0x60, 0x54, 0xb3, 0x30, 0xd7, 0xe3, 0x4, 0x8b, 0x6c, 0x58, 0xbf, 0x5b, 0xbc, 0x88, 0x6f, 0xe0, 0x7, 0x33, 0xd4, 0xe6, 0x1, 0x35, 0xd2, 0x5d, 0xba, 0x8e, 0x69, 0x8d, 0x6a, 0x5e, 0xb9, 0x36, 0xd1, 0xe5, 0x2}, [256]byte{0x0, 0xe8, 0xcd, 0x25, 0x87, 0x6f, 0x4a, 0xa2, 0x13, 0xfb, 0xde, 0x36, 0x94, 0x7c, 0x59, 0xb1, 0x26, 0xce, 0xeb, 0x3, 0xa1, 0x49, 0x6c, 0x84, 0x35, 0xdd, 0xf8, 0x10, 0xb2, 0x5a, 0x7f, 0x97, 0x4c, 0xa4, 0x81, 0x69, 0xcb, 0x23, 0x6, 0xee, 0x5f, 0xb7, 0x92, 0x7a, 0xd8, 0x30, 0x15, 0xfd, 0x6a, 0x82, 0xa7, 0x4f, 0xed, 0x5, 0x20, 0xc8, 0x79, 0x91, 0xb4, 0x5c, 0xfe, 0x16, 0x33, 0xdb, 0x98, 0x70, 0x55, 0xbd, 0x1f, 0xf7, 0xd2, 0x3a, 0x8b, 0x63, 0x46, 0xae, 0xc, 0xe4, 0xc1, 0x29, 0xbe, 0x56, 0x73, 0x9b, 0x39, 0xd1, 0xf4, 0x1c, 0xad, 0x45, 0x60, 0x88, 0x2a, 0xc2, 0xe7, 0xf, 0xd4, 0x3c, 0x19, 0xf1, 0x53, 0xbb, 0x9e, 0x76, 0xc7, 0x2f, 0xa, 0xe2, 0x40, 0xa8, 0x8d, 0x65, 0xf2, 0x1a, 0x3f, 0xd7, 0x75, 0x9d, 0xb8, 0x50, 0xe1, 0x9, 0x2c, 0xc4, 0x66, 0x8e, 0xab, 0x43, 0x2d, 0xc5, 0xe0, 0x8, 0xaa, 0x42, 0x67, 0x8f, 0x3e, 0xd6, 0xf3, 0x1b, 0xb9, 0x51, 0x74, 0x9c, 0xb, 0xe3, 0xc6, 0x2e, 0x8c, 0x64, 0x41, 0xa9, 0x18, 0xf0, 0xd5, 0x3d, 0x9f, 0x77, 0x52, 0xba, 0x61, 0x89, 0xac, 0x44, 0xe6, 0xe, 0x2b, 0xc3, 0x72, 0x9a, 0xbf, 0x57, 0xf5, 0x1d, 0x38, 0xd0, 0x47, 0xaf, 0x8a, 0x62, 0xc0, 0x28, 0xd, 0xe5, 0x54, 0xbc, 0x99, 0x71, 0xd3, 0x3b, 0x1e, 0xf6, 0xb5, 0x5d, 0x78, 0x90, 0x32, 0xda, 0xff, 0x17, 0xa6, 0x4e, 0x6b, 0x83, 0x21, 0xc9, 0xec, 0x4, 0x93, 0x7b, 0x5e, 0xb6, 0x14, 0xfc, 0xd9, 0x31, 0x80, 0x68, 0x4d, 0xa5, 0x7, 0xef, 0xca, 0x22, 0xf9, 0x11, 0x34, 0xdc, 0x7e, 0x96, 0xb3, 0x5b, 0xea, 0x2, 0x27, 0xcf, 0x6d, 0x85, 0xa0, 0x48, 0xdf, 0x37, 0x12, 0xfa, 0x58, 0xb0, 0x95, 0x7d, 0xcc, 0x24, 0x1, 0xe9, 0x4b, 0xa3, 0x86, 0x6e}, [256]byte{0x0, 0xe9, 0xcf, 0x26, 0x83, 0x6a, 0x4c, 0xa5, 0x1b, 0xf2, 0xd4, 0x3d, 0x98, 0x71, 0x57, 0xbe, 0x36, 0xdf, 0xf9, 0x10, 0xb5, 0x5c, 0x7a, 0x93, 0x2d, 0xc4, 0xe2, 0xb, 0xae, 0x47, 0x61, 0x88, 0x6c, 0x85, 0xa3, 0x4a, 0xef, 0x6, 0x20, 0xc9, 0x77, 0x9e, 0xb8, 0x51, 0xf4, 0x1d, 0x3b, 0xd2, 0x5a, 0xb3, 0x95, 0x7c, 0xd9, 0x30, 0x16, 0xff, 0x41, 0xa8, 0x8e, 0x67, 0xc2, 0x2b, 0xd, 0xe4, 0xd8, 0x31, 0x17, 0xfe, 0x5b, 0xb2, 0x94, 0x7d, 0xc3, 0x2a, 0xc, 0xe5, 0x40, 0xa9, 0x8f, 0x66, 0xee, 0x7, 0x21, 0xc8, 0x6d, 0x84, 0xa2, 0x4b, 0xf5, 0x1c, 0x3a, 0xd3, 0x76, 0x9f, 0xb9, 0x50, 0xb4, 0x5d, 0x7b, 0x92, 0x37, 0xde, 0xf8, 0x11, 0xaf, 0x46, 0x60, 0x89, 0x2c, 0xc5, 0xe3, 0xa, 0x82, 0x6b, 0x4d, 0xa4, 0x1, 0xe8, 0xce, 0x27, 0x99, 0x70, 0x56, 0xbf, 0x1a, 0xf3, 0xd5, 0x3c, 0xad, 0x44, 0x62, 0x8b, 0x2e, 0xc7, 0xe1, 0x8, 0xb6, 0x5f, 0x79, 0x90, 0x35, 0xdc, 0xfa, 0x13, 0x9b, 0x72, 0x54, 0xbd, 0x18, 0xf1, 0xd7, 0x3e, 0x80, 0x69, 0x4f, 0xa6, 0x3, 0xea, 0xcc, 0x25, 0xc1, 0x28, 0xe, 0xe7, 0x42, 0xab, 0x8d, 0x64, 0xda, 0x33, 0x15, 0xfc, 0x59, 0xb0, 0x96, 0x7f, 0xf7, 0x1e, 0x38, 0xd1, 0x74, 0x9d, 0xbb, 0x52, 0xec, 0x5, 0x23, 0xca, 0x6f, 0x86, 0xa0, 0x49, 0x75, 0x9c, 0xba, 0x53, 0xf6, 0x1f, 0x39, 0xd0, 0x6e, 0x87, 0xa1, 0x48, 0xed, 0x4, 0x22, 0xcb, 0x43, 0xaa, 0x8c, 0x65, 0xc0, 0x29, 0xf, 0xe6, 0x58, 0xb1, 0x97, 0x7e, 0xdb, 0x32, 0x14, 0xfd, 0x19, 0xf0, 0xd6, 0x3f, 0x9a, 0x73, 0x55, 0xbc, 0x2, 0xeb, 0xcd, 0x24, 0x81, 0x68, 0x4e, 0xa7, 0x2f, 0xc6, 0xe0, 0x9, 0xac, 0x45, 0x63, 0x8a, 0x34, 0xdd, 0xfb, 0x12, 0xb7, 0x5e, 0x78, 0x91}, [256]byte{0x0, 0xea, 0xc9, 0x23, 0x8f, 0x65, 0x46, 0xac, 0x3, 0xe9, 0xca, 0x20, 0x8c, 0x66, 0x45, 0xaf, 0x6, 0xec, 0xcf, 0x25, 0x89, 0x63, 0x40, 0xaa, 0x5, 0xef, 0xcc, 0x26, 0x8a, 0x60, 0x43, 0xa9, 0xc, 0xe6, 0xc5, 0x2f, 0x83, 0x69, 0x4a, 0xa0, 0xf, 0xe5, 0xc6, 0x2c, 0x80, 0x6a, 0x49, 0xa3, 0xa, 0xe0, 0xc3, 0x29, 0x85, 0x6f, 0x4c, 0xa6, 0x9, 0xe3, 0xc0, 0x2a, 0x86, 0x6c, 0x4f, 0xa5, 0x18, 0xf2, 0xd1, 0x3b, 0x97, 0x7d, 0x5e, 0xb4, 0x1b, 0xf1, 0xd2, 0x38, 0x94, 0x7e, 0x5d, 0xb7, 0x1e, 0xf4, 0xd7, 0x3d, 0x91, 0x7b, 0x58, 0xb2, 0x1d, 0xf7, 0xd4, 0x3e, 0x92, 0x78, 0x5b, 0xb1, 0x14, 0xfe, 0xdd, 0x37, 0x9b, 0x71, 0x52, 0xb8, 0x17, 0xfd, 0xde, 0x34, 0x98, 0x72, 0x51, 0xbb, 0x12, 0xf8, 0xdb, 0x31, 0x9d, 0x77, 0x54, 0xbe, 0x11, 0xfb, 0xd8, 0x32, 0x9e, 0x74, 0x57, 0xbd, 0x30, 0xda, 0xf9, 0x13, 0xbf, 0x55, 0x76, 0x9c, 0x33, 0xd9, 0xfa, 0x10, 0xbc, 0x56, 0x75, 0x9f, 0x36, 0xdc, 0xff, 0x15, 0xb9, 0x53, 0x70, 0x9a, 0x35, 0xdf, 0xfc, 0x16, 0xba, 0x50, 0x73, 0x99, 0x3c, 0xd6, 0xf5, 0x1f, 0xb3, 0x59, 0x7a, 0x90, 0x3f, 0xd5, 0xf6, 0x1c, 0xb0, 0x5a, 0x79, 0x93, 0x3a, 0xd0, 0xf3, 0x19, 0xb5, 0x5f, 0x7c, 0x96, 0x39, 0xd3, 0xf0, 0x1a, 0xb6, 0x5c, 0x7f, 0x95, 0x28, 0xc2, 0xe1, 0xb, 0xa7, 0x4d, 0x6e, 0x84, 0x2b, 0xc1, 0xe2, 0x8, 0xa4, 0x4e, 0x6d, 0x87, 0x2e, 0xc4, 0xe7, 0xd, 0xa1, 0x4b, 0x68, 0x82, 0x2d, 0xc7, 0xe4, 0xe, 0xa2, 0x48, 0x6b, 0x81, 0x24, 0xce, 0xed, 0x7, 0xab, 0x41, 0x62, 0x88, 0x27, 0xcd, 0xee, 0x4, 0xa8, 0x42, 0x61, 0x8b, 0x22, 0xc8, 0xeb, 0x1, 0xad, 0x47, 0x64, 0x8e, 0x21, 0xcb, 0xe8, 0x2, 0xae, 0x44, 0x67, 0x8d}, [256]byte{0x0, 0xeb, 0xcb, 0x20, 0x8b, 0x60, 0x40, 0xab, 0xb, 0xe0, 0xc0, 0x2b, 0x80, 0x6b, 0x4b, 0xa0, 0x16, 0xfd, 0xdd, 0x36, 0x9d, 0x76, 0x56, 0xbd, 0x1d, 0xf6, 0xd6, 0x3d, 0x96, 0x7d, 0x5d, 0xb6, 0x2c, 0xc7, 0xe7, 0xc, 0xa7, 0x4c, 0x6c, 0x87, 0x27, 0xcc, 0xec, 0x7, 0xac, 0x47, 0x67, 0x8c, 0x3a, 0xd1, 0xf1, 0x1a, 0xb1, 0x5a, 0x7a, 0x91, 0x31, 0xda, 0xfa, 0x11, 0xba, 0x51, 0x71, 0x9a, 0x58, 0xb3, 0x93, 0x78, 0xd3, 0x38, 0x18, 0xf3, 0x53, 0xb8, 0x98, 0x73, 0xd8, 0x33, 0x13, 0xf8, 0x4e, 0xa5, 0x85, 0x6e, 0xc5, 0x2e, 0xe, 0xe5, 0x45, 0xae, 0x8e, 0x65, 0xce, 0x25, 0x5, 0xee, 0x74, 0x9f, 0xbf, 0x54, 0xff, 0x14, 0x34, 0xdf, 0x7f, 0x94, 0xb4, 0x5f, 0xf4, 0x1f, 0x3f, 0xd4, 0x62, 0x89, 0xa9, 0x42, 0xe9, 0x2, 0x22, 0xc9, 0x69, 0x82, 0xa2, 0x49, 0xe2, 0x9, 0x29, 0xc2, 0xb0, 0x5b, 0x7b, 0x90, 0x3b, 0xd0, 0xf0, 0x1b, 0xbb, 0x50, 0x70, 0x9b, 0x30, 0xdb, 0xfb, 0x10, 0xa6, 0x4d, 0x6d, 0x86, 0x2d, 0xc6, 0xe6, 0xd, 0xad, 0x46, 0x66, 0x8d, 0x26, 0xcd, 0xed, 0x6, 0x9c, 0x77, 0x57, 0xbc, 0x17, 0xfc, 0xdc, 0x37, 0x97, 0x7c, 0x5c, 0xb7, 0x1c, 0xf7, 0xd7, 0x3c, 0x8a, 0x61, 0x41, 0xaa, 0x1, 0xea, 0xca, 0x21, 0x81, 0x6a, 0x4a, 0xa1, 0xa, 0xe1, 0xc1, 0x2a, 0xe8, 0x3, 0x23, 0xc8, 0x63, 0x88, 0xa8, 0x43, 0xe3, 0x8, 0x28, 0xc3, 0x68, 0x83, 0xa3, 0x48, 0xfe, 0x15, 0x35, 0xde, 0x75, 0x9e, 0xbe, 0x55, 0xf5, 0x1e, 0x3e, 0xd5, 0x7e, 0x95, 0xb5, 0x5e, 0xc4, 0x2f, 0xf, 0xe4, 0x4f, 0xa4, 0x84, 0x6f, 0xcf, 0x24, 0x4, 0xef, 0x44, 0xaf, 0x8f, 0x64, 0xd2, 0x39, 0x19, 0xf2, 0x59, 0xb2, 0x92, 0x79, 0xd9, 0x32, 0x12, 0xf9, 0x52, 0xb9, 0x99, 0x72}, [256]byte{0x0, 0xec, 0xc5, 0x29, 0x97, 0x7b, 0x52, 0xbe, 0x33, 0xdf, 0xf6, 0x1a, 0xa4, 0x48, 0x61, 0x8d, 0x66, 0x8a, 0xa3, 0x4f, 0xf1, 0x1d, 0x34, 0xd8, 0x55, 0xb9, 0x90, 0x7c, 0xc2, 0x2e, 0x7, 0xeb, 0xcc, 0x20, 0x9, 0xe5, 0x5b, 0xb7, 0x9e, 0x72, 0xff, 0x13, 0x3a, 0xd6, 0x68, 0x84, 0xad, 0x41, 0xaa, 0x46, 0x6f, 0x83, 0x3d, 0xd1, 0xf8, 0x14, 0x99, 0x75, 0x5c, 0xb0, 0xe, 0xe2, 0xcb, 0x27, 0x85, 0x69, 0x40, 0xac, 0x12, 0xfe, 0xd7, 0x3b, 0xb6, 0x5a, 0x73, 0x9f, 0x21, 0xcd, 0xe4, 0x8, 0xe3, 0xf, 0x26, 0xca, 0x74, 0x98, 0xb1, 0x5d, 0xd0, 0x3c, 0x15, 0xf9, 0x47, 0xab, 0x82, 0x6e, 0x49, 0xa5, 0x8c, 0x60, 0xde, 0x32, 0x1b, 0xf7, 0x7a, 0x96, 0xbf, 0x53, 0xed, 0x1, 0x28, 0xc4, 0x2f, 0xc3, 0xea, 0x6, 0xb8, 0x54, 0x7d, 0x91, 0x1c, 0xf0, 0xd9, 0x35, 0x8b, 0x67, 0x4e, 0xa2, 0x17, 0xfb, 0xd2, 0x3e, 0x80, 0x6c, 0x45, 0xa9, 0x24, 0xc8, 0xe1, 0xd, 0xb3, 0x5f, 0x76, 0x9a, 0x71, 0x9d, 0xb4, 0x58, 0xe6, 0xa, 0x23, 0xcf, 0x42, 0xae, 0x87, 0x6b, 0xd5, 0x39, 0x10, 0xfc, 0xdb, 0x37, 0x1e, 0xf2, 0x4c, 0xa0, 0x89, 0x65, 0xe8, 0x4, 0x2d, 0xc1, 0x7f, 0x93, 0xba, 0x56, 0xbd, 0x51, 0x78, 0x94, 0x2a, 0xc6, 0xef, 0x3, 0x8e, 0x62, 0x4b, 0xa7, 0x19, 0xf5, 0xdc, 0x30, 0x92, 0x7e, 0x57, 0xbb, 0x5, 0xe9, 0xc0, 0x2c, 0xa1, 0x4d, 0x64, 0x88, 0x36, 0xda, 0xf3, 0x1f, 0xf4, 0x18, 0x31, 0xdd, 0x63, 0x8f, 0xa6, 0x4a, 0xc7, 0x2b, 0x2, 0xee, 0x50, 0xbc, 0x95, 0x79, 0x5e, 0xb2, 0x9b, 0x77, 0xc9, 0x25, 0xc, 0xe0, 0x6d, 0x81, 0xa8, 0x44, 0xfa, 0x16, 0x3f, 0xd3, 0x38, 0xd4, 0xfd, 0x11, 0xaf, 0x43, 0x6a, 0x86, 0xb, 0xe7, 0xce, 0x22, 0x9c, 0x70, 0x59, 0xb5}, [256]byte{0x0, 0xed, 0xc7, 0x2a, 0x93, 0x7e, 0x54, 0xb9, 0x3b, 0xd6, 0xfc, 0x11, 0xa8, 0x45, 0x6f, 0x82, 0x76, 0x9b, 0xb1, 0x5c, 0xe5, 0x8, 0x22, 0xcf, 0x4d, 0xa0, 0x8a, 0x67, 0xde, 0x33, 0x19, 0xf4, 0xec, 0x1, 0x2b, 0xc6, 0x7f, 0x92, 0xb8, 0x55, 0xd7, 0x3a, 0x10, 0xfd, 0x44, 0xa9, 0x83, 0x6e, 0x9a, 0x77, 0x5d, 0xb0, 0x9, 0xe4, 0xce, 0x23, 0xa1, 0x4c, 0x66, 0x8b, 0x32, 0xdf, 0xf5, 0x18, 0xc5, 0x28, 0x2, 0xef, 0x56, 0xbb, 0x91, 0x7c, 0xfe, 0x13, 0x39, 0xd4, 0x6d, 0x80, 0xaa, 0x47, 0xb3, 0x5e, 0x74, 0x99, 0x20, 0xcd, 0xe7, 0xa, 0x88, 0x65, 0x4f, 0xa2, 0x1b, 0xf6, 0xdc, 0x31, 0x29, 0xc4, 0xee, 0x3, 0xba, 0x57, 0x7d, 0x90, 0x12, 0xff, 0xd5, 0x38, 0x81, 0x6c, 0x46, 0xab, 0x5f, 0xb2, 0x98, 0x75, 0xcc, 0x21, 0xb, 0xe6, 0x64, 0x89, 0xa3, 0x4e, 0xf7, 0x1a, 0x30, 0xdd, 0x97, 0x7a, 0x50, 0xbd, 0x4, 0xe9, 0xc3, 0x2e, 0xac, 0x41, 0x6b, 0x86, 0x3f, 0xd2, 0xf8, 0x15, 0xe1, 0xc, 0x26, 0xcb, 0x72, 0x9f, 0xb5, 0x58, 0xda, 0x37, 0x1d, 0xf0, 0x49, 0xa4, 0x8e, 0x63, 0x7b, 0x96, 0xbc, 0x51, 0xe8, 0x5, 0x2f, 0xc2, 0x40, 0xad, 0x87, 0x6a, 0xd3, 0x3e, 0x14, 0xf9, 0xd, 0xe0, 0xca, 0x27, 0x9e, 0x73, 0x59, 0xb4, 0x36, 0xdb, 0xf1, 0x1c, 0xa5, 0x48, 0x62, 0x8f, 0x52, 0xbf, 0x95, 0x78, 0xc1, 0x2c, 0x6, 0xeb, 0x69, 0x84, 0xae, 0x43, 0xfa, 0x17, 0x3d, 0xd0, 0x24, 0xc9, 0xe3, 0xe, 0xb7, 0x5a, 0x70, 0x9d, 0x1f, 0xf2, 0xd8, 0x35, 0x8c, 0x61, 0x4b, 0xa6, 0xbe, 0x53, 0x79, 0x94, 0x2d, 0xc0, 0xea, 0x7, 0x85, 0x68, 0x42, 0xaf, 0x16, 0xfb, 0xd1, 0x3c, 0xc8, 0x25, 0xf, 0xe2, 0x5b, 0xb6, 0x9c, 0x71, 0xf3, 0x1e, 0x34, 0xd9, 0x60, 0x8d, 0xa7, 0x4a}, [256]byte{0x0, 0xee, 0xc1, 0x2f, 0x9f, 0x71, 0x5e, 0xb0, 0x23, 0xcd, 0xe2, 0xc, 0xbc, 0x52, 0x7d, 0x93, 0x46, 0xa8, 0x87, 0x69, 0xd9, 0x37, 0x18, 0xf6, 0x65, 0x8b, 0xa4, 0x4a, 0xfa, 0x14, 0x3b, 0xd5, 0x8c, 0x62, 0x4d, 0xa3, 0x13, 0xfd, 0xd2, 0x3c, 0xaf, 0x41, 0x6e, 0x80, 0x30, 0xde, 0xf1, 0x1f, 0xca, 0x24, 0xb, 0xe5, 0x55, 0xbb, 0x94, 0x7a, 0xe9, 0x7, 0x28, 0xc6, 0x76, 0x98, 0xb7, 0x59, 0x5, 0xeb, 0xc4, 0x2a, 0x9a, 0x74, 0x5b, 0xb5, 0x26, 0xc8, 0xe7, 0x9, 0xb9, 0x57, 0x78, 0x96, 0x43, 0xad, 0x82, 0x6c, 0xdc, 0x32, 0x1d, 0xf3, 0x60, 0x8e, 0xa1, 0x4f, 0xff, 0x11, 0x3e, 0xd0, 0x89, 0x67, 0x48, 0xa6, 0x16, 0xf8, 0xd7, 0x39, 0xaa, 0x44, 0x6b, 0x85, 0x35, 0xdb, 0xf4, 0x1a, 0xcf, 0x21, 0xe, 0xe0, 0x50, 0xbe, 0x91, 0x7f, 0xec, 0x2, 0x2d, 0xc3, 0x73, 0x9d, 0xb2, 0x5c, 0xa, 0xe4, 0xcb, 0x25, 0x95, 0x7b, 0x54, 0xba, 0x29, 0xc7, 0xe8, 0x6, 0xb6, 0x58, 0x77, 0x99, 0x4c, 0xa2, 0x8d, 0x63, 0xd3, 0x3d, 0x12, 0xfc, 0x6f, 0x81, 0xae, 0x40, 0xf0, 0x1e, 0x31, 0xdf, 0x86, 0x68, 0x47, 0xa9, 0x19, 0xf7, 0xd8, 0x36, 0xa5, 0x4b, 0x64, 0x8a, 0x3a, 0xd4, 0xfb, 0x15, 0xc0, 0x2e, 0x1, 0xef, 0x5f, 0xb1, 0x9e, 0x70, 0xe3, 0xd, 0x22, 0xcc, 0x7c, 0x92, 0xbd, 0x53, 0xf, 0xe1, 0xce, 0x20, 0x90, 0x7e, 0x51, 0xbf, 0x2c, 0xc2, 0xed, 0x3, 0xb3, 0x5d, 0x72, 0x9c, 0x49, 0xa7, 0x88, 0x66, 0xd6, 0x38, 0x17, 0xf9, 0x6a, 0x84, 0xab, 0x45, 0xf5, 0x1b, 0x34, 0xda, 0x83, 0x6d, 0x42, 0xac, 0x1c, 0xf2, 0xdd, 0x33, 0xa0, 0x4e, 0x61, 0x8f, 0x3f, 0xd1, 0xfe, 0x10, 0xc5, 0x2b, 0x4, 0xea, 0x5a, 0xb4, 0x9b, 0x75, 0xe6, 0x8, 0x27, 0xc9, 0x79, 0x97, 0xb8, 0x56}, [256]byte{0x0, 0xef, 0xc3, 0x2c, 0x9b, 0x74, 0x58, 0xb7, 0x2b, 0xc4, 0xe8, 0x7, 0xb0, 0x5f, 0x73, 0x9c, 0x56, 0xb9, 0x95, 0x7a, 0xcd, 0x22, 0xe, 0xe1, 0x7d, 0x92, 0xbe, 0x51, 0xe6, 0x9, 0x25, 0xca, 0xac, 0x43, 0x6f, 0x80, 0x37, 0xd8, 0xf4, 0x1b, 0x87, 0x68, 0x44, 0xab, 0x1c, 0xf3, 0xdf, 0x30, 0xfa, 0x15, 0x39, 0xd6, 0x61, 0x8e, 0xa2, 0x4d, 0xd1, 0x3e, 0x12, 0xfd, 0x4a, 0xa5, 0x89, 0x66, 0x45, 0xaa, 0x86, 0x69, 0xde, 0x31, 0x1d, 0xf2, 0x6e, 0x81, 0xad, 0x42, 0xf5, 0x1a, 0x36, 0xd9, 0x13, 0xfc, 0xd0, 0x3f, 0x88, 0x67, 0x4b, 0xa4, 0x38, 0xd7, 0xfb, 0x14, 0xa3, 0x4c, 0x60, 0x8f, 0xe9, 0x6, 0x2a, 0xc5, 0x72, 0x9d, 0xb1, 0x5e, 0xc2, 0x2d, 0x1, 0xee, 0x59, 0xb6, 0x9a, 0x75, 0xbf, 0x50, 0x7c, 0x93, 0x24, 0xcb, 0xe7, 0x8, 0x94, 0x7b, 0x57, 0xb8, 0xf, 0xe0, 0xcc, 0x23, 0x8a, 0x65, 0x49, 0xa6, 0x11, 0xfe, 0xd2, 0x3d, 0xa1, 0x4e, 0x62, 0x8d, 0x3a, 0xd5, 0xf9, 0x16, 0xdc, 0x33, 0x1f, 0xf0, 0x47, 0xa8, 0x84, 0x6b, 0xf7, 0x18, 0x34, 0xdb, 0x6c, 0x83, 0xaf, 0x40, 0x26, 0xc9, 0xe5, 0xa, 0xbd, 0x52, 0x7e, 0x91, 0xd, 0xe2, 0xce, 0x21, 0x96, 0x79, 0x55, 0xba, 0x70, 0x9f, 0xb3, 0x5c, 0xeb, 0x4, 0x28, 0xc7, 0x5b, 0xb4, 0x98, 0x77, 0xc0, 0x2f, 0x3, 0xec, 0xcf, 0x20, 0xc, 0xe3, 0x54, 0xbb, 0x97, 0x78, 0xe4, 0xb, 0x27, 0xc8, 0x7f, 0x90, 0xbc, 0x53, 0x99, 0x76, 0x5a, 0xb5, 0x2, 0xed, 0xc1, 0x2e, 0xb2, 0x5d, 0x71, 0x9e, 0x29, 0xc6, 0xea, 0x5, 0x63, 0x8c, 0xa0, 0x4f, 0xf8, 0x17, 0x3b, 0xd4, 0x48, 0xa7, 0x8b, 0x64, 0xd3, 0x3c, 0x10, 0xff, 0x35, 0xda, 0xf6, 0x19, 0xae, 0x41, 0x6d, 0x82, 0x1e, 0xf1, 0xdd, 0x32, 0x85, 0x6a, 0x46, 0xa9}, [256]byte{0x0, 0xf0, 0xfd, 0xd, 0xe7, 0x17, 0x1a, 0xea, 0xd3, 0x23, 0x2e, 0xde, 0x34, 0xc4, 0xc9, 0x39, 0xbb, 0x4b, 0x46, 0xb6, 0x5c, 0xac, 0xa1, 0x51, 0x68, 0x98, 0x95, 0x65, 0x8f, 0x7f, 0x72, 0x82, 0x6b, 0x9b, 0x96, 0x66, 0x8c, 0x7c, 0x71, 0x81, 0xb8, 0x48, 0x45, 0xb5, 0x5f, 0xaf, 0xa2, 0x52, 0xd0, 0x20, 0x2d, 0xdd, 0x37, 0xc7, 0xca, 0x3a, 0x3, 0xf3, 0xfe, 0xe, 0xe4, 0x14, 0x19, 0xe9, 0xd6, 0x26, 0x2b, 0xdb, 0x31, 0xc1, 0xcc, 0x3c, 0x5, 0xf5, 0xf8, 0x8, 0xe2, 0x12, 0x1f, 0xef, 0x6d, 0x9d, 0x90, 0x60, 0x8a, 0x7a, 0x77, 0x87, 0xbe, 0x4e, 0x43, 0xb3, 0x59, 0xa9, 0xa4, 0x54, 0xbd, 0x4d, 0x40, 0xb0, 0x5a, 0xaa, 0xa7, 0x57, 0x6e, 0x9e, 0x93, 0x63, 0x89, 0x79, 0x74, 0x84, 0x6, 0xf6, 0xfb, 0xb, 0xe1, 0x11, 0x1c, 0xec, 0xd5, 0x25, 0x28, 0xd8, 0x32, 0xc2, 0xcf, 0x3f, 0xb1, 0x41, 0x4c, 0xbc, 0x56, 0xa6, 0xab, 0x5b, 0x62, 0x92, 0x9f, 0x6f, 0x85, 0x75, 0x78, 0x88, 0xa, 0xfa, 0xf7, 0x7, 0xed, 0x1d, 0x10, 0xe0, 0xd9, 0x29, 0x24, 0xd4, 0x3e, 0xce, 0xc3, 0x33, 0xda, 0x2a, 0x27, 0xd7, 0x3d, 0xcd, 0xc0, 0x30, 0x9, 0xf9, 0xf4, 0x4, 0xee, 0x1e, 0x13, 0xe3, 0x61, 0x91, 0x9c, 0x6c, 0x86, 0x76, 0x7b, 0x8b, 0xb2, 0x42, 0x4f, 0xbf, 0x55, 0xa5, 0xa8, 0x58, 0x67, 0x97, 0x9a, 0x6a, 0x80, 0x70, 0x7d, 0x8d, 0xb4, 0x44, 0x49, 0xb9, 0x53, 0xa3, 0xae, 0x5e, 0xdc, 0x2c, 0x21, 0xd1, 0x3b, 0xcb, 0xc6, 0x36, 0xf, 0xff, 0xf2, 0x2, 0xe8, 0x18, 0x15, 0xe5, 0xc, 0xfc, 0xf1, 0x1, 0xeb, 0x1b, 0x16, 0xe6, 0xdf, 0x2f, 0x22, 0xd2, 0x38, 0xc8, 0xc5, 0x35, 0xb7, 0x47, 0x4a, 0xba, 0x50, 0xa0, 0xad, 0x5d, 0x64, 0x94, 0x99, 0x69, 0x83, 0x73, 0x7e, 0x8e}, [256]byte{0x0, 0xf1, 0xff, 0xe, 0xe3, 0x12, 0x1c, 0xed, 0xdb, 0x2a, 0x24, 0xd5, 0x38, 0xc9, 0xc7, 0x36, 0xab, 0x5a, 0x54, 0xa5, 0x48, 0xb9, 0xb7, 0x46, 0x70, 0x81, 0x8f, 0x7e, 0x93, 0x62, 0x6c, 0x9d, 0x4b, 0xba, 0xb4, 0x45, 0xa8, 0x59, 0x57, 0xa6, 0x90, 0x61, 0x6f, 0x9e, 0x73, 0x82, 0x8c, 0x7d, 0xe0, 0x11, 0x1f, 0xee, 0x3, 0xf2, 0xfc, 0xd, 0x3b, 0xca, 0xc4, 0x35, 0xd8, 0x29, 0x27, 0xd6, 0x96, 0x67, 0x69, 0x98, 0x75, 0x84, 0x8a, 0x7b, 0x4d, 0xbc, 0xb2, 0x43, 0xae, 0x5f, 0x51, 0xa0, 0x3d, 0xcc, 0xc2, 0x33, 0xde, 0x2f, 0x21, 0xd0, 0xe6, 0x17, 0x19, 0xe8, 0x5, 0xf4, 0xfa, 0xb, 0xdd, 0x2c, 0x22, 0xd3, 0x3e, 0xcf, 0xc1, 0x30, 0x6, 0xf7, 0xf9, 0x8, 0xe5, 0x14, 0x1a, 0xeb, 0x76, 0x87, 0x89, 0x78, 0x95, 0x64, 0x6a, 0x9b, 0xad, 0x5c, 0x52, 0xa3, 0x4e, 0xbf, 0xb1, 0x40, 0x31, 0xc0, 0xce, 0x3f, 0xd2, 0x23, 0x2d, 0xdc, 0xea, 0x1b, 0x15, 0xe4, 0x9, 0xf8, 0xf6, 0x7, 0x9a, 0x6b, 0x65, 0x94, 0x79, 0x88, 0x86, 0x77, 0x41, 0xb0, 0xbe, 0x4f, 0xa2, 0x53, 0x5d, 0xac, 0x7a, 0x8b, 0x85, 0x74, 0x99, 0x68, 0x66, 0x97, 0xa1, 0x50, 0x5e, 0xaf, 0x42, 0xb3, 0xbd, 0x4c, 0xd1, 0x20, 0x2e, 0xdf, 0x32, 0xc3, 0xcd, 0x3c, 0xa, 0xfb, 0xf5, 0x4, 0xe9, 0x18, 0x16, 0xe7, 0xa7, 0x56, 0x58, 0xa9, 0x44, 0xb5, 0xbb, 0x4a, 0x7c, 0x8d, 0x83, 0x72, 0x9f, 0x6e, 0x60, 0x91, 0xc, 0xfd, 0xf3, 0x2, 0xef, 0x1e, 0x10, 0xe1, 0xd7, 0x26, 0x28, 0xd9, 0x34, 0xc5, 0xcb, 0x3a, 0xec, 0x1d, 0x13, 0xe2, 0xf, 0xfe, 0xf0, 0x1, 0x37, 0xc6, 0xc8, 0x39, 0xd4, 0x25, 0x2b, 0xda, 0x47, 0xb6, 0xb8, 0x49, 0xa4, 0x55, 0x5b, 0xaa, 0x9c, 0x6d, 0x63, 0x92, 0x7f, 0x8e, 0x80, 0x71}, [256]byte{0x0, 0xf2, 0xf9, 0xb, 0xef, 0x1d, 0x16, 0xe4, 0xc3, 0x31, 0x3a, 0xc8, 0x2c, 0xde, 0xd5, 0x27, 0x9b, 0x69, 0x62, 0x90, 0x74, 0x86, 0x8d, 0x7f, 0x58, 0xaa, 0xa1, 0x53, 0xb7, 0x45, 0x4e, 0xbc, 0x2b, 0xd9, 0xd2, 0x20, 0xc4, 0x36, 0x3d, 0xcf, 0xe8, 0x1a, 0x11, 0xe3, 0x7, 0xf5, 0xfe, 0xc, 0xb0, 0x42, 0x49, 0xbb, 0x5f, 0xad, 0xa6, 0x54, 0x73, 0x81, 0x8a, 0x78, 0x9c, 0x6e, 0x65, 0x97, 0x56, 0xa4, 0xaf, 0x5d, 0xb9, 0x4b, 0x40, 0xb2, 0x95, 0x67, 0x6c, 0x9e, 0x7a, 0x88, 0x83, 0x71, 0xcd, 0x3f, 0x34, 0xc6, 0x22, 0xd0, 0xdb, 0x29, 0xe, 0xfc, 0xf7, 0x5, 0xe1, 0x13, 0x18, 0xea, 0x7d, 0x8f, 0x84, 0x76, 0x92, 0x60, 0x6b, 0x99, 0xbe, 0x4c, 0x47, 0xb5, 0x51, 0xa3, 0xa8, 0x5a, 0xe6, 0x14, 0x1f, 0xed, 0x9, 0xfb, 0xf0, 0x2, 0x25, 0xd7, 0xdc, 0x2e, 0xca, 0x38, 0x33, 0xc1, 0xac, 0x5e, 0x55, 0xa7, 0x43, 0xb1, 0xba, 0x48, 0x6f, 0x9d, 0x96, 0x64, 0x80, 0x72, 0x79, 0x8b, 0x37, 0xc5, 0xce, 0x3c, 0xd8, 0x2a, 0x21, 0xd3, 0xf4, 0x6, 0xd, 0xff, 0x1b, 0xe9, 0xe2, 0x10, 0x87, 0x75, 0x7e, 0x8c, 0x68, 0x9a, 0x91, 0x63, 0x44, 0xb6, 0xbd, 0x4f, 0xab, 0x59, 0x52, 0xa0, 0x1c, 0xee, 0xe5, 0x17, 0xf3, 0x1, 0xa, 0xf8, 0xdf, 0x2d, 0x26, 0xd4, 0x30, 0xc2, 0xc9, 0x3b, 0xfa, 0x8, 0x3, 0xf1, 0x15, 0xe7, 0xec, 0x1e, 0x39, 0xcb, 0xc0, 0x32, 0xd6, 0x24, 0x2f, 0xdd, 0x61, 0x93, 0x98, 0x6a, 0x8e, 0x7c, 0x77, 0x85, 0xa2, 0x50, 0x5b, 0xa9, 0x4d, 0xbf, 0xb4, 0x46, 0xd1, 0x23, 0x28, 0xda, 0x3e, 0xcc, 0xc7, 0x35, 0x12, 0xe0, 0xeb, 0x19, 0xfd, 0xf, 0x4, 0xf6, 0x4a, 0xb8, 0xb3, 0x41, 0xa5, 0x57, 0x5c, 0xae, 0x89, 0x7b, 0x70, 0x82, 0x66, 0x94, 0x9f, 0x6d}, [256]byte{0x0, 0xf3, 0xfb, 0x8, 0xeb, 0x18, 0x10, 0xe3, 0xcb, 0x38, 0x30, 0xc3, 0x20, 0xd3, 0xdb, 0x28, 0x8b, 0x78, 0x70, 0x83, 0x60, 0x93, 0x9b, 0x68, 0x40, 0xb3, 0xbb, 0x48, 0xab, 0x58, 0x50, 0xa3, 0xb, 0xf8, 0xf0, 0x3, 0xe0, 0x13, 0x1b, 0xe8, 0xc0, 0x33, 0x3b, 0xc8, 0x2b, 0xd8, 0xd0, 0x23, 0x80, 0x73, 0x7b, 0x88, 0x6b, 0x98, 0x90, 0x63, 0x4b, 0xb8, 0xb0, 0x43, 0xa0, 0x53, 0x5b, 0xa8, 0x16, 0xe5, 0xed, 0x1e, 0xfd, 0xe, 0x6, 0xf5, 0xdd, 0x2e, 0x26, 0xd5, 0x36, 0xc5, 0xcd, 0x3e, 0x9d, 0x6e, 0x66, 0x95, 0x76, 0x85, 0x8d, 0x7e, 0x56, 0xa5, 0xad, 0x5e, 0xbd, 0x4e, 0x46, 0xb5, 0x1d, 0xee, 0xe6, 0x15, 0xf6, 0x5, 0xd, 0xfe, 0xd6, 0x25, 0x2d, 0xde, 0x3d, 0xce, 0xc6, 0x35, 0x96, 0x65, 0x6d, 0x9e, 0x7d, 0x8e, 0x86, 0x75, 0x5d, 0xae, 0xa6, 0x55, 0xb6, 0x45, 0x4d, 0xbe, 0x2c, 0xdf, 0xd7, 0x24, 0xc7, 0x34, 0x3c, 0xcf, 0xe7, 0x14, 0x1c, 0xef, 0xc, 0xff, 0xf7, 0x4, 0xa7, 0x54, 0x5c, 0xaf, 0x4c, 0xbf, 0xb7, 0x44, 0x6c, 0x9f, 0x97, 0x64, 0x87, 0x74, 0x7c, 0x8f, 0x27, 0xd4, 0xdc, 0x2f, 0xcc, 0x3f, 0x37, 0xc4, 0xec, 0x1f, 0x17, 0xe4, 0x7, 0xf4, 0xfc, 0xf, 0xac, 0x5f, 0x57, 0xa4, 0x47, 0xb4, 0xbc, 0x4f, 0x67, 0x94, 0x9c, 0x6f, 0x8c, 0x7f, 0x77, 0x84, 0x3a, 0xc9, 0xc1, 0x32, 0xd1, 0x22, 0x2a, 0xd9, 0xf1, 0x2, 0xa, 0xf9, 0x1a, 0xe9, 0xe1, 0x12, 0xb1, 0x42, 0x4a, 0xb9, 0x5a, 0xa9, 0xa1, 0x52, 0x7a, 0x89, 0x81, 0x72, 0x91, 0x62, 0x6a, 0x99, 0x31, 0xc2, 0xca, 0x39, 0xda, 0x29, 0x21, 0xd2, 0xfa, 0x9, 0x1, 0xf2, 0x11, 0xe2, 0xea, 0x19, 0xba, 0x49, 0x41, 0xb2, 0x51, 0xa2, 0xaa, 0x59, 0x71, 0x82, 0x8a, 0x79, 0x9a, 0x69, 0x61, 0x92}, [256]byte{0x0, 0xf4, 0xf5, 0x1, 0xf7, 0x3, 0x2, 0xf6, 0xf3, 0x7, 0x6, 0xf2, 0x4, 0xf0, 0xf1, 0x5, 0xfb, 0xf, 0xe, 0xfa, 0xc, 0xf8, 0xf9, 0xd, 0x8, 0xfc, 0xfd, 0x9, 0xff, 0xb, 0xa, 0xfe, 0xeb, 0x1f, 0x1e, 0xea, 0x1c, 0xe8, 0xe9, 0x1d, 0x18, 0xec, 0xed, 0x19, 0xef, 0x1b, 0x1a, 0xee, 0x10, 0xe4, 0xe5, 0x11, 0xe7, 0x13, 0x12, 0xe6, 0xe3, 0x17, 0x16, 0xe2, 0x14, 0xe0, 0xe1, 0x15, 0xcb, 0x3f, 0x3e, 0xca, 0x3c, 0xc8, 0xc9, 0x3d, 0x38, 0xcc, 0xcd, 0x39, 0xcf, 0x3b, 0x3a, 0xce, 0x30, 0xc4, 0xc5, 0x31, 0xc7, 0x33, 0x32, 0xc6, 0xc3, 0x37, 0x36, 0xc2, 0x34, 0xc0, 0xc1, 0x35, 0x20, 0xd4, 0xd5, 0x21, 0xd7, 0x23, 0x22, 0xd6, 0xd3, 0x27, 0x26, 0xd2, 0x24, 0xd0, 0xd1, 0x25, 0xdb, 0x2f, 0x2e, 0xda, 0x2c, 0xd8, 0xd9, 0x2d, 0x28, 0xdc, 0xdd, 0x29, 0xdf, 0x2b, 0x2a, 0xde, 0x8b, 0x7f, 0x7e, 0x8a, 0x7c, 0x88, 0x89, 0x7d, 0x78, 0x8c, 0x8d, 0x79, 0x8f, 0x7b, 0x7a, 0x8e, 0x70, 0x84, 0x85, 0x71, 0x87, 0x73, 0x72, 0x86, 0x83, 0x77, 0x76, 0x82, 0x74, 0x80, 0x81, 0x75, 0x60, 0x94, 0x95, 0x61, 0x97, 0x63, 0x62, 0x96, 0x93, 0x67, 0x66, 0x92, 0x64, 0x90, 0x91, 0x65, 0x9b, 0x6f, 0x6e, 0x9a, 0x6c, 0x98, 0x99, 0x6d, 0x68, 0x9c, 0x9d, 0x69, 0x9f, 0x6b, 0x6a, 0x9e, 0x40, 0xb4, 0xb5, 0x41, 0xb7, 0x43, 0x42, 0xb6, 0xb3, 0x47, 0x46, 0xb2, 0x44, 0xb0, 0xb1, 0x45, 0xbb, 0x4f, 0x4e, 0xba, 0x4c, 0xb8, 0xb9, 0x4d, 0x48, 0xbc, 0xbd, 0x49, 0xbf, 0x4b, 0x4a, 0xbe, 0xab, 0x5f, 0x5e, 0xaa, 0x5c, 0xa8, 0xa9, 0x5d, 0x58, 0xac, 0xad, 0x59, 0xaf, 0x5b, 0x5a, 0xae, 0x50, 0xa4, 0xa5, 0x51, 0xa7, 0x53, 0x52, 0xa6, 0xa3, 0x57, 0x56, 0xa2, 0x54, 0xa0, 0xa1, 0x55}, [256]byte{0x0, 0xf5, 0xf7, 0x2, 0xf3, 0x6, 0x4, 0xf1, 0xfb, 0xe, 0xc, 0xf9, 0x8, 0xfd, 0xff, 0xa, 0xeb, 0x1e, 0x1c, 0xe9, 0x18, 0xed, 0xef, 0x1a, 0x10, 0xe5, 0xe7, 0x12, 0xe3, 0x16, 0x14, 0xe1, 0xcb, 0x3e, 0x3c, 0xc9, 0x38, 0xcd, 0xcf, 0x3a, 0x30, 0xc5, 0xc7, 0x32, 0xc3, 0x36, 0x34, 0xc1, 0x20, 0xd5, 0xd7, 0x22, 0xd3, 0x26, 0x24, 0xd1, 0xdb, 0x2e, 0x2c, 0xd9, 0x28, 0xdd, 0xdf, 0x2a, 0x8b, 0x7e, 0x7c, 0x89, 0x78, 0x8d, 0x8f, 0x7a, 0x70, 0x85, 0x87, 0x72, 0x83, 0x76, 0x74, 0x81, 0x60, 0x95, 0x97, 0x62, 0x93, 0x66, 0x64, 0x91, 0x9b, 0x6e, 0x6c, 0x99, 0x68, 0x9d, 0x9f, 0x6a, 0x40, 0xb5, 0xb7, 0x42, 0xb3, 0x46, 0x44, 0xb1, 0xbb, 0x4e, 0x4c, 0xb9, 0x48, 0xbd, 0xbf, 0x4a, 0xab, 0x5e, 0x5c, 0xa9, 0x58, 0xad, 0xaf, 0x5a, 0x50, 0xa5, 0xa7, 0x52, 0xa3, 0x56, 0x54, 0xa1, 0xb, 0xfe, 0xfc, 0x9, 0xf8, 0xd, 0xf, 0xfa, 0xf0, 0x5, 0x7, 0xf2, 0x3, 0xf6, 0xf4, 0x1, 0xe0, 0x15, 0x17, 0xe2, 0x13, 0xe6, 0xe4, 0x11, 0x1b, 0xee, 0xec, 0x19, 0xe8, 0x1d, 0x1f, 0xea, 0xc0, 0x35, 0x37, 0xc2, 0x33, 0xc6, 0xc4, 0x31, 0x3b, 0xce, 0xcc, 0x39, 0xc8, 0x3d, 0x3f, 0xca, 0x2b, 0xde, 0xdc, 0x29, 0xd8, 0x2d, 0x2f, 0xda, 0xd0, 0x25, 0x27, 0xd2, 0x23, 0xd6, 0xd4, 0x21, 0x80, 0x75, 0x77, 0x82, 0x73, 0x86, 0x84, 0x71, 0x7b, 0x8e, 0x8c, 0x79, 0x88, 0x7d, 0x7f, 0x8a, 0x6b, 0x9e, 0x9c, 0x69, 0x98, 0x6d, 0x6f, 0x9a, 0x90, 0x65, 0x67, 0x92, 0x63, 0x96, 0x94, 0x61, 0x4b, 0xbe, 0xbc, 0x49, 0xb8, 0x4d, 0x4f, 0xba, 0xb0, 0x45, 0x47, 0xb2, 0x43, 0xb6, 0xb4, 0x41, 0xa0, 0x55, 0x57, 0xa2, 0x53, 0xa6, 0xa4, 0x51, 0x5b, 0xae, 0xac, 0x59, 0xa8, 0x5d, 0x5f, 0xaa}, [256]byte{0x0, 0xf6, 0xf1, 0x7, 0xff, 0x9, 0xe, 0xf8, 0xe3, 0x15, 0x12, 0xe4, 0x1c, 0xea, 0xed, 0x1b, 0xdb, 0x2d, 0x2a, 0xdc, 0x24, 0xd2, 0xd5, 0x23, 0x38, 0xce, 0xc9, 0x3f, 0xc7, 0x31, 0x36, 0xc0, 0xab, 0x5d, 0x5a, 0xac, 0x54, 0xa2, 0xa5, 0x53, 0x48, 0xbe, 0xb9, 0x4f, 0xb7, 0x41, 0x46, 0xb0, 0x70, 0x86, 0x81, 0x77, 0x8f, 0x79, 0x7e, 0x88, 0x93, 0x65, 0x62, 0x94, 0x6c, 0x9a, 0x9d, 0x6b, 0x4b, 0xbd, 0xba, 0x4c, 0xb4, 0x42, 0x45, 0xb3, 0xa8, 0x5e, 0x59, 0xaf, 0x57, 0xa1, 0xa6, 0x50, 0x90, 0x66, 0x61, 0x97, 0x6f, 0x99, 0x9e, 0x68, 0x73, 0x85, 0x82, 0x74, 0x8c, 0x7a, 0x7d, 0x8b, 0xe0, 0x16, 0x11, 0xe7, 0x1f, 0xe9, 0xee, 0x18, 0x3, 0xf5, 0xf2, 0x4, 0xfc, 0xa, 0xd, 0xfb, 0x3b, 0xcd, 0xca, 0x3c, 0xc4, 0x32, 0x35, 0xc3, 0xd8, 0x2e, 0x29, 0xdf, 0x27, 0xd1, 0xd6, 0x20, 0x96, 0x60, 0x67, 0x91, 0x69, 0x9f, 0x98, 0x6e, 0x75, 0x83, 0x84, 0x72, 0x8a, 0x7c, 0x7b, 0x8d, 0x4d, 0xbb, 0xbc, 0x4a, 0xb2, 0x44, 0x43, 0xb5, 0xae, 0x58, 0x5f, 0xa9, 0x51, 0xa7, 0xa0, 0x56, 0x3d, 0xcb, 0xcc, 0x3a, 0xc2, 0x34, 0x33, 0xc5, 0xde, 0x28, 0x2f, 0xd9, 0x21, 0xd7, 0xd0, 0x26, 0xe6, 0x10, 0x17, 0xe1, 0x19, 0xef, 0xe8, 0x1e, 0x5, 0xf3, 0xf4, 0x2, 0xfa, 0xc, 0xb, 0xfd, 0xdd, 0x2b, 0x2c, 0xda, 0x22, 0xd4, 0xd3, 0x25, 0x3e, 0xc8, 0xcf, 0x39, 0xc1, 0x37, 0x30, 0xc6, 0x6, 0xf0, 0xf7, 0x1, 0xf9, 0xf, 0x8, 0xfe, 0xe5, 0x13, 0x14, 0xe2, 0x1a, 0xec, 0xeb, 0x1d, 0x76, 0x80, 0x87, 0x71, 0x89, 0x7f, 0x78, 0x8e, 0x95, 0x63, 0x64, 0x92, 0x6a, 0x9c, 0x9b, 0x6d, 0xad, 0x5b, 0x5c, 0xaa, 0x52, 0xa4, 0xa3, 0x55, 0x4e, 0xb8, 0xbf, 0x49, 0xb1, 0x47, 0x40, 0xb6}, [256]byte{0x0, 0xf7, 0xf3, 0x4, 0xfb, 0xc, 0x8, 0xff, 0xeb, 0x1c, 0x18, 0xef, 0x10, 0xe7, 0xe3, 0x14, 0xcb, 0x3c, 0x38, 0xcf, 0x30, 0xc7, 0xc3, 0x34, 0x20, 0xd7, 0xd3, 0x24, 0xdb, 0x2c, 0x28, 0xdf, 0x8b, 0x7c, 0x78, 0x8f, 0x70, 0x87, 0x83, 0x74, 0x60, 0x97, 0x93, 0x64, 0x9b, 0x6c, 0x68, 0x9f, 0x40, 0xb7, 0xb3, 0x44, 0xbb, 0x4c, 0x48, 0xbf, 0xab, 0x5c, 0x58, 0xaf, 0x50, 0xa7, 0xa3, 0x54, 0xb, 0xfc, 0xf8, 0xf, 0xf0, 0x7, 0x3, 0xf4, 0xe0, 0x17, 0x13, 0xe4, 0x1b, 0xec, 0xe8, 0x1f, 0xc0, 0x37, 0x33, 0xc4, 0x3b, 0xcc, 0xc8, 0x3f, 0x2b, 0xdc, 0xd8, 0x2f, 0xd0, 0x27, 0x23, 0xd4, 0x80, 0x77, 0x73, 0x84, 0x7b, 0x8c, 0x88, 0x7f, 0x6b, 0x9c, 0x98, 0x6f, 0x90, 0x67, 0x63, 0x94, 0x4b, 0xbc, 0xb8, 0x4f, 0xb0, 0x47, 0x43, 0xb4, 0xa0, 0x57, 0x53, 0xa4, 0x5b, 0xac, 0xa8, 0x5f, 0x16, 0xe1, 0xe5, 0x12, 0xed, 0x1a, 0x1e, 0xe9, 0xfd, 0xa, 0xe, 0xf9, 0x6, 0xf1, 0xf5, 0x2, 0xdd, 0x2a, 0x2e, 0xd9, 0x26, 0xd1, 0xd5, 0x22, 0x36, 0xc1, 0xc5, 0x32, 0xcd, 0x3a, 0x3e, 0xc9, 0x9d, 0x6a, 0x6e, 0x99, 0x66, 0x91, 0x95, 0x62, 0x76, 0x81, 0x85, 0x72, 0x8d, 0x7a, 0x7e, 0x89, 0x56, 0xa1, 0xa5, 0x52, 0xad, 0x5a, 0x5e, 0xa9, 0xbd, 0x4a, 0x4e, 0xb9, 0x46, 0xb1, 0xb5, 0x42, 0x1d, 0xea, 0xee, 0x19, 0xe6, 0x11, 0x15, 0xe2, 0xf6, 0x1, 0x5, 0xf2, 0xd, 0xfa, 0xfe, 0x9, 0xd6, 0x21, 0x25, 0xd2, 0x2d, 0xda, 0xde, 0x29, 0x3d, 0xca, 0xce, 0x39, 0xc6, 0x31, 0x35, 0xc2, 0x96, 0x61, 0x65, 0x92, 0x6d, 0x9a, 0x9e, 0x69, 0x7d, 0x8a, 0x8e, 0x79, 0x86, 0x71, 0x75, 0x82, 0x5d, 0xaa, 0xae, 0x59, 0xa6, 0x51, 0x55, 0xa2, 0xb6, 0x41, 0x45, 0xb2, 0x4d, 0xba, 0xbe, 0x49}, [256]byte{0x0, 0xf8, 0xed, 0x15, 0xc7, 0x3f, 0x2a, 0xd2, 0x93, 0x6b, 0x7e, 0x86, 0x54, 0xac, 0xb9, 0x41, 0x3b, 0xc3, 0xd6, 0x2e, 0xfc, 0x4, 0x11, 0xe9, 0xa8, 0x50, 0x45, 0xbd, 0x6f, 0x97, 0x82, 0x7a, 0x76, 0x8e, 0x9b, 0x63, 0xb1, 0x49, 0x5c, 0xa4, 0xe5, 0x1d, 0x8, 0xf0, 0x22, 0xda, 0xcf, 0x37, 0x4d, 0xb5, 0xa0, 0x58, 0x8a, 0x72, 0x67, 0x9f, 0xde, 0x26, 0x33, 0xcb, 0x19, 0xe1, 0xf4, 0xc, 0xec, 0x14, 0x1, 0xf9, 0x2b, 0xd3, 0xc6, 0x3e, 0x7f, 0x87, 0x92, 0x6a, 0xb8, 0x40, 0x55, 0xad, 0xd7, 0x2f, 0x3a, 0xc2, 0x10, 0xe8, 0xfd, 0x5, 0x44, 0xbc, 0xa9, 0x51, 0x83, 0x7b, 0x6e, 0x96, 0x9a, 0x62, 0x77, 0x8f, 0x5d, 0xa5, 0xb0, 0x48, 0x9, 0xf1, 0xe4, 0x1c, 0xce, 0x36, 0x23, 0xdb, 0xa1, 0x59, 0x4c, 0xb4, 0x66, 0x9e, 0x8b, 0x73, 0x32, 0xca, 0xdf, 0x27, 0xf5, 0xd, 0x18, 0xe0, 0xc5, 0x3d, 0x28, 0xd0, 0x2, 0xfa, 0xef, 0x17, 0x56, 0xae, 0xbb, 0x43, 0x91, 0x69, 0x7c, 0x84, 0xfe, 0x6, 0x13, 0xeb, 0x39, 0xc1, 0xd4, 0x2c, 0x6d, 0x95, 0x80, 0x78, 0xaa, 0x52, 0x47, 0xbf, 0xb3, 0x4b, 0x5e, 0xa6, 0x74, 0x8c, 0x99, 0x61, 0x20, 0xd8, 0xcd, 0x35, 0xe7, 0x1f, 0xa, 0xf2, 0x88, 0x70, 0x65, 0x9d, 0x4f, 0xb7, 0xa2, 0x5a, 0x1b, 0xe3, 0xf6, 0xe, 0xdc, 0x24, 0x31, 0xc9, 0x29, 0xd1, 0xc4, 0x3c, 0xee, 0x16, 0x3, 0xfb, 0xba, 0x42, 0x57, 0xaf, 0x7d, 0x85, 0x90, 0x68, 0x12, 0xea, 0xff, 0x7, 0xd5, 0x2d, 0x38, 0xc0, 0x81, 0x79, 0x6c, 0x94, 0x46, 0xbe, 0xab, 0x53, 0x5f, 0xa7, 0xb2, 0x4a, 0x98, 0x60, 0x75, 0x8d, 0xcc, 0x34, 0x21, 0xd9, 0xb, 0xf3, 0xe6, 0x1e, 0x64, 0x9c, 0x89, 0x71, 0xa3, 0x5b, 0x4e, 0xb6, 0xf7, 0xf, 0x1a, 0xe2, 0x30, 0xc8, 0xdd, 0x25}, [256]byte{0x0, 0xf9, 0xef, 0x16, 0xc3, 0x3a, 0x2c, 0xd5, 0x9b, 0x62, 0x74, 0x8d, 0x58, 0xa1, 0xb7, 0x4e, 0x2b, 0xd2, 0xc4, 0x3d, 0xe8, 0x11, 0x7, 0xfe, 0xb0, 0x49, 0x5f, 0xa6, 0x73, 0x8a, 0x9c, 0x65, 0x56, 0xaf, 0xb9, 0x40, 0x95, 0x6c, 0x7a, 0x83, 0xcd, 0x34, 0x22, 0xdb, 0xe, 0xf7, 0xe1, 0x18, 0x7d, 0x84, 0x92, 0x6b, 0xbe, 0x47, 0x51, 0xa8, 0xe6, 0x1f, 0x9, 0xf0, 0x25, 0xdc, 0xca, 0x33, 0xac, 0x55, 0x43, 0xba, 0x6f, 0x96, 0x80, 0x79, 0x37, 0xce, 0xd8, 0x21, 0xf4, 0xd, 0x1b, 0xe2, 0x87, 0x7e, 0x68, 0x91, 0x44, 0xbd, 0xab, 0x52, 0x1c, 0xe5, 0xf3, 0xa, 0xdf, 0x26, 0x30, 0xc9, 0xfa, 0x3, 0x15, 0xec, 0x39, 0xc0, 0xd6, 0x2f, 0x61, 0x98, 0x8e, 0x77, 0xa2, 0x5b, 0x4d, 0xb4, 0xd1, 0x28, 0x3e, 0xc7, 0x12, 0xeb, 0xfd, 0x4, 0x4a, 0xb3, 0xa5, 0x5c, 0x89, 0x70, 0x66, 0x9f, 0x45, 0xbc, 0xaa, 0x53, 0x86, 0x7f, 0x69, 0x90, 0xde, 0x27, 0x31, 0xc8, 0x1d, 0xe4, 0xf2, 0xb, 0x6e, 0x97, 0x81, 0x78, 0xad, 0x54, 0x42, 0xbb, 0xf5, 0xc, 0x1a, 0xe3, 0x36, 0xcf, 0xd9, 0x20, 0x13, 0xea, 0xfc, 0x5, 0xd0, 0x29, 0x3f, 0xc6, 0x88, 0x71, 0x67, 0x9e, 0x4b, 0xb2, 0xa4, 0x5d, 0x38, 0xc1, 0xd7, 0x2e, 0xfb, 0x2, 0x14, 0xed, 0xa3, 0x5a, 0x4c, 0xb5, 0x60, 0x99, 0x8f, 0x76, 0xe9, 0x10, 0x6, 0xff, 0x2a, 0xd3, 0xc5, 0x3c, 0x72, 0x8b, 0x9d, 0x64, 0xb1, 0x48, 0x5e, 0xa7, 0xc2, 0x3b, 0x2d, 0xd4, 0x1, 0xf8, 0xee, 0x17, 0x59, 0xa0, 0xb6, 0x4f, 0x9a, 0x63, 0x75, 0x8c, 0xbf, 0x46, 0x50, 0xa9, 0x7c, 0x85, 0x93, 0x6a, 0x24, 0xdd, 0xcb, 0x32, 0xe7, 0x1e, 0x8, 0xf1, 0x94, 0x6d, 0x7b, 0x82, 0x57, 0xae, 0xb8, 0x41, 0xf, 0xf6, 0xe0, 0x19, 0xcc, 0x35, 0x23, 0xda}, [256]byte{0x0, 0xfa, 0xe9, 0x13, 0xcf, 0x35, 0x26, 0xdc, 0x83, 0x79, 0x6a, 0x90, 0x4c, 0xb6, 0xa5, 0x5f, 0x1b, 0xe1, 0xf2, 0x8, 0xd4, 0x2e, 0x3d, 0xc7, 0x98, 0x62, 0x71, 0x8b, 0x57, 0xad, 0xbe, 0x44, 0x36, 0xcc, 0xdf, 0x25, 0xf9, 0x3, 0x10, 0xea, 0xb5, 0x4f, 0x5c, 0xa6, 0x7a, 0x80, 0x93, 0x69, 0x2d, 0xd7, 0xc4, 0x3e, 0xe2, 0x18, 0xb, 0xf1, 0xae, 0x54, 0x47, 0xbd, 0x61, 0x9b, 0x88, 0x72, 0x6c, 0x96, 0x85, 0x7f, 0xa3, 0x59, 0x4a, 0xb0, 0xef, 0x15, 0x6, 0xfc, 0x20, 0xda, 0xc9, 0x33, 0x77, 0x8d, 0x9e, 0x64, 0xb8, 0x42, 0x51, 0xab, 0xf4, 0xe, 0x1d, 0xe7, 0x3b, 0xc1, 0xd2, 0x28, 0x5a, 0xa0, 0xb3, 0x49, 0x95, 0x6f, 0x7c, 0x86, 0xd9, 0x23, 0x30, 0xca, 0x16, 0xec, 0xff, 0x5, 0x41, 0xbb, 0xa8, 0x52, 0x8e, 0x74, 0x67, 0x9d, 0xc2, 0x38, 0x2b, 0xd1, 0xd, 0xf7, 0xe4, 0x1e, 0xd8, 0x22, 0x31, 0xcb, 0x17, 0xed, 0xfe, 0x4, 0x5b, 0xa1, 0xb2, 0x48, 0x94, 0x6e, 0x7d, 0x87, 0xc3, 0x39, 0x2a, 0xd0, 0xc, 0xf6, 0xe5, 0x1f, 0x40, 0xba, 0xa9, 0x53, 0x8f, 0x75, 0x66, 0x9c, 0xee, 0x14, 0x7, 0xfd, 0x21, 0xdb, 0xc8, 0x32, 0x6d, 0x97, 0x84, 0x7e, 0xa2, 0x58, 0x4b, 0xb1, 0xf5, 0xf, 0x1c, 0xe6, 0x3a, 0xc0, 0xd3, 0x29, 0x76, 0x8c, 0x9f, 0x65, 0xb9, 0x43, 0x50, 0xaa, 0xb4, 0x4e, 0x5d, 0xa7, 0x7b, 0x81, 0x92, 0x68, 0x37, 0xcd, 0xde, 0x24, 0xf8, 0x2, 0x11, 0xeb, 0xaf, 0x55, 0x46, 0xbc, 0x60, 0x9a, 0x89, 0x73, 0x2c, 0xd6, 0xc5, 0x3f, 0xe3, 0x19, 0xa, 0xf0, 0x82, 0x78, 0x6b, 0x91, 0x4d, 0xb7, 0xa4, 0x5e, 0x1, 0xfb, 0xe8, 0x12, 0xce, 0x34, 0x27, 0xdd, 0x99, 0x63, 0x70, 0x8a, 0x56, 0xac, 0xbf, 0x45, 0x1a, 0xe0, 0xf3, 0x9, 0xd5, 0x2f, 0x3c, 0xc6}, [256]byte{0x0, 0xfb, 0xeb, 0x10, 0xcb, 0x30, 0x20, 0xdb, 0x8b, 0x70, 0x60, 0x9b, 0x40, 0xbb, 0xab, 0x50, 0xb, 0xf0, 0xe0, 0x1b, 0xc0, 0x3b, 0x2b, 0xd0, 0x80, 0x7b, 0x6b, 0x90, 0x4b, 0xb0, 0xa0, 0x5b, 0x16, 0xed, 0xfd, 0x6, 0xdd, 0x26, 0x36, 0xcd, 0x9d, 0x66, 0x76, 0x8d, 0x56, 0xad, 0xbd, 0x46, 0x1d, 0xe6, 0xf6, 0xd, 0xd6, 0x2d, 0x3d, 0xc6, 0x96, 0x6d, 0x7d, 0x86, 0x5d, 0xa6, 0xb6, 0x4d, 0x2c, 0xd7, 0xc7, 0x3c, 0xe7, 0x1c, 0xc, 0xf7, 0xa7, 0x5c, 0x4c, 0xb7, 0x6c, 0x97, 0x87, 0x7c, 0x27, 0xdc, 0xcc, 0x37, 0xec, 0x17, 0x7, 0xfc, 0xac, 0x57, 0x47, 0xbc, 0x67, 0x9c, 0x8c, 0x77, 0x3a, 0xc1, 0xd1, 0x2a, 0xf1, 0xa, 0x1a, 0xe1, 0xb1, 0x4a, 0x5a, 0xa1, 0x7a, 0x81, 0x91, 0x6a, 0x31, 0xca, 0xda, 0x21, 0xfa, 0x1, 0x11, 0xea, 0xba, 0x41, 0x51, 0xaa, 0x71, 0x8a, 0x9a, 0x61, 0x58, 0xa3, 0xb3, 0x48, 0x93, 0x68, 0x78, 0x83, 0xd3, 0x28, 0x38, 0xc3, 0x18, 0xe3, 0xf3, 0x8, 0x53, 0xa8, 0xb8, 0x43, 0x98, 0x63, 0x73, 0x88, 0xd8, 0x23, 0x33, 0xc8, 0x13, 0xe8, 0xf8, 0x3, 0x4e, 0xb5, 0xa5, 0x5e, 0x85, 0x7e, 0x6e, 0x95, 0xc5, 0x3e, 0x2e, 0xd5, 0xe, 0xf5, 0xe5, 0x1e, 0x45, 0xbe, 0xae, 0x55, 0x8e, 0x75, 0x65, 0x9e, 0xce, 0x35, 0x25, 0xde, 0x5, 0xfe, 0xee, 0x15, 0x74, 0x8f, 0x9f, 0x64, 0xbf, 0x44, 0x54, 0xaf, 0xff, 0x4, 0x14, 0xef, 0x34, 0xcf, 0xdf, 0x24, 0x7f, 0x84, 0x94, 0x6f, 0xb4, 0x4f, 0x5f, 0xa4, 0xf4, 0xf, 0x1f, 0xe4, 0x3f, 0xc4, 0xd4, 0x2f, 0x62, 0x99, 0x89, 0x72, 0xa9, 0x52, 0x42, 0xb9, 0xe9, 0x12, 0x2, 0xf9, 0x22, 0xd9, 0xc9, 0x32, 0x69, 0x92, 0x82, 0x79, 0xa2, 0x59, 0x49, 0xb2, 0xe2, 0x19, 0x9, 0xf2, 0x29, 0xd2, 0xc2, 0x39}, [256]byte{0x0, 0xfc, 0xe5, 0x19, 0xd7, 0x2b, 0x32, 0xce, 0xb3, 0x4f, 0x56, 0xaa, 0x64, 0x98, 0x81, 0x7d, 0x7b, 0x87, 0x9e, 0x62, 0xac, 0x50, 0x49, 0xb5, 0xc8, 0x34, 0x2d, 0xd1, 0x1f, 0xe3, 0xfa, 0x6, 0xf6, 0xa, 0x13, 0xef, 0x21, 0xdd, 0xc4, 0x38, 0x45, 0xb9, 0xa0, 0x5c, 0x92, 0x6e, 0x77, 0x8b, 0x8d, 0x71, 0x68, 0x94, 0x5a, 0xa6, 0xbf, 0x43, 0x3e, 0xc2, 0xdb, 0x27, 0xe9, 0x15, 0xc, 0xf0, 0xf1, 0xd, 0x14, 0xe8, 0x26, 0xda, 0xc3, 0x3f, 0x42, 0xbe, 0xa7, 0x5b, 0x95, 0x69, 0x70, 0x8c, 0x8a, 0x76, 0x6f, 0x93, 0x5d, 0xa1, 0xb8, 0x44, 0x39, 0xc5, 0xdc, 0x20, 0xee, 0x12, 0xb, 0xf7, 0x7, 0xfb, 0xe2, 0x1e, 0xd0, 0x2c, 0x35, 0xc9, 0xb4, 0x48, 0x51, 0xad, 0x63, 0x9f, 0x86, 0x7a, 0x7c, 0x80, 0x99, 0x65, 0xab, 0x57, 0x4e, 0xb2, 0xcf, 0x33, 0x2a, 0xd6, 0x18, 0xe4, 0xfd, 0x1, 0xff, 0x3, 0x1a, 0xe6, 0x28, 0xd4, 0xcd, 0x31, 0x4c, 0xb0, 0xa9, 0x55, 0x9b, 0x67, 0x7e, 0x82, 0x84, 0x78, 0x61, 0x9d, 0x53, 0xaf, 0xb6, 0x4a, 0x37, 0xcb, 0xd2, 0x2e, 0xe0, 0x1c, 0x5, 0xf9, 0x9, 0xf5, 0xec, 0x10, 0xde, 0x22, 0x3b, 0xc7, 0xba, 0x46, 0x5f, 0xa3, 0x6d, 0x91, 0x88, 0x74, 0x72, 0x8e, 0x97, 0x6b, 0xa5, 0x59, 0x40, 0xbc, 0xc1, 0x3d, 0x24, 0xd8, 0x16, 0xea, 0xf3, 0xf, 0xe, 0xf2, 0xeb, 0x17, 0xd9, 0x25, 0x3c, 0xc0, 0xbd, 0x41, 0x58, 0xa4, 0x6a, 0x96, 0x8f, 0x73, 0x75, 0x89, 0x90, 0x6c, 0xa2, 0x5e, 0x47, 0xbb, 0xc6, 0x3a, 0x23, 0xdf, 0x11, 0xed, 0xf4, 0x8, 0xf8, 0x4, 0x1d, 0xe1, 0x2f, 0xd3, 0xca, 0x36, 0x4b, 0xb7, 0xae, 0x52, 0x9c, 0x60, 0x79, 0x85, 0x83, 0x7f, 0x66, 0x9a, 0x54, 0xa8, 0xb1, 0x4d, 0x30, 0xcc, 0xd5, 0x29, 0xe7, 0x1b, 0x2, 0xfe}, [256]byte{0x0, 0xfd, 0xe7, 0x1a, 0xd3, 0x2e, 0x34, 0xc9, 0xbb, 0x46, 0x5c, 0xa1, 0x68, 0x95, 0x8f, 0x72, 0x6b, 0x96, 0x8c, 0x71, 0xb8, 0x45, 0x5f, 0xa2, 0xd0, 0x2d, 0x37, 0xca, 0x3, 0xfe, 0xe4, 0x19, 0xd6, 0x2b, 0x31, 0xcc, 0x5, 0xf8, 0xe2, 0x1f, 0x6d, 0x90, 0x8a, 0x77, 0xbe, 0x43, 0x59, 0xa4, 0xbd, 0x40, 0x5a, 0xa7, 0x6e, 0x93, 0x89, 0x74, 0x6, 0xfb, 0xe1, 0x1c, 0xd5, 0x28, 0x32, 0xcf, 0xb1, 0x4c, 0x56, 0xab, 0x62, 0x9f, 0x85, 0x78, 0xa, 0xf7, 0xed, 0x10, 0xd9, 0x24, 0x3e, 0xc3, 0xda, 0x27, 0x3d, 0xc0, 0x9, 0xf4, 0xee, 0x13, 0x61, 0x9c, 0x86, 0x7b, 0xb2, 0x4f, 0x55, 0xa8, 0x67, 0x9a, 0x80, 0x7d, 0xb4, 0x49, 0x53, 0xae, 0xdc, 0x21, 0x3b, 0xc6, 0xf, 0xf2, 0xe8, 0x15, 0xc, 0xf1, 0xeb, 0x16, 0xdf, 0x22, 0x38, 0xc5, 0xb7, 0x4a, 0x50, 0xad, 0x64, 0x99, 0x83, 0x7e, 0x7f, 0x82, 0x98, 0x65, 0xac, 0x51, 0x4b, 0xb6, 0xc4, 0x39, 0x23, 0xde, 0x17, 0xea, 0xf0, 0xd, 0x14, 0xe9, 0xf3, 0xe, 0xc7, 0x3a, 0x20, 0xdd, 0xaf, 0x52, 0x48, 0xb5, 0x7c, 0x81, 0x9b, 0x66, 0xa9, 0x54, 0x4e, 0xb3, 0x7a, 0x87, 0x9d, 0x60, 0x12, 0xef, 0xf5, 0x8, 0xc1, 0x3c, 0x26, 0xdb, 0xc2, 0x3f, 0x25, 0xd8, 0x11, 0xec, 0xf6, 0xb, 0x79, 0x84, 0x9e, 0x63, 0xaa, 0x57, 0x4d, 0xb0, 0xce, 0x33, 0x29, 0xd4, 0x1d, 0xe0, 0xfa, 0x7, 0x75, 0x88, 0x92, 0x6f, 0xa6, 0x5b, 0x41, 0xbc, 0xa5, 0x58, 0x42, 0xbf, 0x76, 0x8b, 0x91, 0x6c, 0x1e, 0xe3, 0xf9, 0x4, 0xcd, 0x30, 0x2a, 0xd7, 0x18, 0xe5, 0xff, 0x2, 0xcb, 0x36, 0x2c, 0xd1, 0xa3, 0x5e, 0x44, 0xb9, 0x70, 0x8d, 0x97, 0x6a, 0x73, 0x8e, 0x94, 0x69, 0xa0, 0x5d, 0x47, 0xba, 0xc8, 0x35, 0x2f, 0xd2, 0x1b, 0xe6, 0xfc, 0x1}, [256]byte{0x0, 0xfe, 0xe1, 0x1f, 0xdf, 0x21, 0x3e, 0xc0, 0xa3, 0x5d, 0x42, 0xbc, 0x7c, 0x82, 0x9d, 0x63, 0x5b, 0xa5, 0xba, 0x44, 0x84, 0x7a, 0x65, 0x9b, 0xf8, 0x6, 0x19, 0xe7, 0x27, 0xd9, 0xc6, 0x38, 0xb6, 0x48, 0x57, 0xa9, 0x69, 0x97, 0x88, 0x76, 0x15, 0xeb, 0xf4, 0xa, 0xca, 0x34, 0x2b, 0xd5, 0xed, 0x13, 0xc, 0xf2, 0x32, 0xcc, 0xd3, 0x2d, 0x4e, 0xb0, 0xaf, 0x51, 0x91, 0x6f, 0x70, 0x8e, 0x71, 0x8f, 0x90, 0x6e, 0xae, 0x50, 0x4f, 0xb1, 0xd2, 0x2c, 0x33, 0xcd, 0xd, 0xf3, 0xec, 0x12, 0x2a, 0xd4, 0xcb, 0x35, 0xf5, 0xb, 0x14, 0xea, 0x89, 0x77, 0x68, 0x96, 0x56, 0xa8, 0xb7, 0x49, 0xc7, 0x39, 0x26, 0xd8, 0x18, 0xe6, 0xf9, 0x7, 0x64, 0x9a, 0x85, 0x7b, 0xbb, 0x45, 0x5a, 0xa4, 0x9c, 0x62, 0x7d, 0x83, 0x43, 0xbd, 0xa2, 0x5c, 0x3f, 0xc1, 0xde, 0x20, 0xe0, 0x1e, 0x1, 0xff, 0xe2, 0x1c, 0x3, 0xfd, 0x3d, 0xc3, 0xdc, 0x22, 0x41, 0xbf, 0xa0, 0x5e, 0x9e, 0x60, 0x7f, 0x81, 0xb9, 0x47, 0x58, 0xa6, 0x66, 0x98, 0x87, 0x79, 0x1a, 0xe4, 0xfb, 0x5, 0xc5, 0x3b, 0x24, 0xda, 0x54, 0xaa, 0xb5, 0x4b, 0x8b, 0x75, 0x6a, 0x94, 0xf7, 0x9, 0x16, 0xe8, 0x28, 0xd6, 0xc9, 0x37, 0xf, 0xf1, 0xee, 0x10, 0xd0, 0x2e, 0x31, 0xcf, 0xac, 0x52, 0x4d, 0xb3, 0x73, 0x8d, 0x92, 0x6c, 0x93, 0x6d, 0x72, 0x8c, 0x4c, 0xb2, 0xad, 0x53, 0x30, 0xce, 0xd1, 0x2f, 0xef, 0x11, 0xe, 0xf0, 0xc8, 0x36, 0x29, 0xd7, 0x17, 0xe9, 0xf6, 0x8, 0x6b, 0x95, 0x8a, 0x74, 0xb4, 0x4a, 0x55, 0xab, 0x25, 0xdb, 0xc4, 0x3a, 0xfa, 0x4, 0x1b, 0xe5, 0x86, 0x78, 0x67, 0x99, 0x59, 0xa7, 0xb8, 0x46, 0x7e, 0x80, 0x9f, 0x61, 0xa1, 0x5f, 0x40, 0xbe, 0xdd, 0x23, 0x3c, 0xc2, 0x2, 0xfc, 0xe3, 0x1d}, [256]byte{0x0, 0xff, 0xe3, 0x1c, 0xdb, 0x24, 0x38, 0xc7, 0xab, 0x54, 0x48, 0xb7, 0x70, 0x8f, 0x93, 0x6c, 0x4b, 0xb4, 0xa8, 0x57, 0x90, 0x6f, 0x73, 0x8c, 0xe0, 0x1f, 0x3, 0xfc, 0x3b, 0xc4, 0xd8, 0x27, 0x96, 0x69, 0x75, 0x8a, 0x4d, 0xb2, 0xae, 0x51, 0x3d, 0xc2, 0xde, 0x21, 0xe6, 0x19, 0x5, 0xfa, 0xdd, 0x22, 0x3e, 0xc1, 0x6, 0xf9, 0xe5, 0x1a, 0x76, 0x89, 0x95, 0x6a, 0xad, 0x52, 0x4e, 0xb1, 0x31, 0xce, 0xd2, 0x2d, 0xea, 0x15, 0x9, 0xf6, 0x9a, 0x65, 0x79, 0x86, 0x41, 0xbe, 0xa2, 0x5d, 0x7a, 0x85, 0x99, 0x66, 0xa1, 0x5e, 0x42, 0xbd, 0xd1, 0x2e, 0x32, 0xcd, 0xa, 0xf5, 0xe9, 0x16, 0xa7, 0x58, 0x44, 0xbb, 0x7c, 0x83, 0x9f, 0x60, 0xc, 0xf3, 0xef, 0x10, 0xd7, 0x28, 0x34, 0xcb, 0xec, 0x13, 0xf, 0xf0, 0x37, 0xc8, 0xd4, 0x2b, 0x47, 0xb8, 0xa4, 0x5b, 0x9c, 0x63, 0x7f, 0x80, 0x62, 0x9d, 0x81, 0x7e, 0xb9, 0x46, 0x5a, 0xa5, 0xc9, 0x36, 0x2a, 0xd5, 0x12, 0xed, 0xf1, 0xe, 0x29, 0xd6, 0xca, 0x35, 0xf2, 0xd, 0x11, 0xee, 0x82, 0x7d, 0x61, 0x9e, 0x59, 0xa6, 0xba, 0x45, 0xf4, 0xb, 0x17, 0xe8, 0x2f, 0xd0, 0xcc, 0x33, 0x5f, 0xa0, 0xbc, 0x43, 0x84, 0x7b, 0x67, 0x98, 0xbf, 0x40, 0x5c, 0xa3, 0x64, 0x9b, 0x87, 0x78, 0x14, 0xeb, 0xf7, 0x8, 0xcf, 0x30, 0x2c, 0xd3, 0x53, 0xac, 0xb0, 0x4f, 0x88, 0x77, 0x6b, 0x94, 0xf8, 0x7, 0x1b, 0xe4, 0x23, 0xdc, 0xc0, 0x3f, 0x18, 0xe7, 0xfb, 0x4, 0xc3, 0x3c, 0x20, 0xdf, 0xb3, 0x4c, 0x50, 0xaf, 0x68, 0x97, 0x8b, 0x74, 0xc5, 0x3a, 0x26, 0xd9, 0x1e, 0xe1, 0xfd, 0x2, 0x6e, 0x91, 0x8d, 0x72, 0xb5, 0x4a, 0x56, 0xa9, 0x8e, 0x71, 0x6d, 0x92, 0x55, 0xaa, 0xb6, 0x49, 0x25, 0xda, 0xc6, 0x39, 0xfe, 0x1, 0x1d, 0xe2}}
-
-var lowhighTbl = [256][32]byte{[32]byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, [32]byte{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x0, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0}, [32]byte{0x0, 0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, 0x0, 0x20, 0x40, 0x60, 0x80, 0xa0, 0xc0, 0xe0, 0x1d, 0x3d, 0x5d, 0x7d, 0x9d, 0xbd, 0xdd, 0xfd}, [32]byte{0x0, 0x3, 0x6, 0x5, 0xc, 0xf, 0xa, 0x9, 0x18, 0x1b, 0x1e, 0x1d, 0x14, 0x17, 0x12, 0x11, 0x0, 0x30, 0x60, 0x50, 0xc0, 0xf0, 0xa0, 0x90, 0x9d, 0xad, 0xfd, 0xcd, 0x5d, 0x6d, 0x3d, 0xd}, [32]byte{0x0, 0x4, 0x8, 0xc, 0x10, 0x14, 0x18, 0x1c, 0x20, 0x24, 0x28, 0x2c, 0x30, 0x34, 0x38, 0x3c, 0x0, 0x40, 0x80, 0xc0, 0x1d, 0x5d, 0x9d, 0xdd, 0x3a, 0x7a, 0xba, 0xfa, 0x27, 0x67, 0xa7, 0xe7}, [32]byte{0x0, 0x5, 0xa, 0xf, 0x14, 0x11, 0x1e, 0x1b, 0x28, 0x2d, 0x22, 0x27, 0x3c, 0x39, 0x36, 0x33, 0x0, 0x50, 0xa0, 0xf0, 0x5d, 0xd, 0xfd, 0xad, 0xba, 0xea, 0x1a, 0x4a, 0xe7, 0xb7, 0x47, 0x17}, [32]byte{0x0, 0x6, 0xc, 0xa, 0x18, 0x1e, 0x14, 0x12, 0x30, 0x36, 0x3c, 0x3a, 0x28, 0x2e, 0x24, 0x22, 0x0, 0x60, 0xc0, 0xa0, 0x9d, 0xfd, 0x5d, 0x3d, 0x27, 0x47, 0xe7, 0x87, 0xba, 0xda, 0x7a, 0x1a}, [32]byte{0x0, 0x7, 0xe, 0x9, 0x1c, 0x1b, 0x12, 0x15, 0x38, 0x3f, 0x36, 0x31, 0x24, 0x23, 0x2a, 0x2d, 0x0, 0x70, 0xe0, 0x90, 0xdd, 0xad, 0x3d, 0x4d, 0xa7, 0xd7, 0x47, 0x37, 0x7a, 0xa, 0x9a, 0xea}, [32]byte{0x0, 0x8, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38, 0x40, 0x48, 0x50, 0x58, 0x60, 0x68, 0x70, 0x78, 0x0, 0x80, 0x1d, 0x9d, 0x3a, 0xba, 0x27, 0xa7, 0x74, 0xf4, 0x69, 0xe9, 0x4e, 0xce, 0x53, 0xd3}, [32]byte{0x0, 0x9, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, 0x0, 0x90, 0x3d, 0xad, 0x7a, 0xea, 0x47, 0xd7, 0xf4, 0x64, 0xc9, 0x59, 0x8e, 0x1e, 0xb3, 0x23}, [32]byte{0x0, 0xa, 0x14, 0x1e, 0x28, 0x22, 0x3c, 0x36, 0x50, 0x5a, 0x44, 0x4e, 0x78, 0x72, 0x6c, 0x66, 0x0, 0xa0, 0x5d, 0xfd, 0xba, 0x1a, 0xe7, 0x47, 0x69, 0xc9, 0x34, 0x94, 0xd3, 0x73, 0x8e, 0x2e}, [32]byte{0x0, 0xb, 0x16, 0x1d, 0x2c, 0x27, 0x3a, 0x31, 0x58, 0x53, 0x4e, 0x45, 0x74, 0x7f, 0x62, 0x69, 0x0, 0xb0, 0x7d, 0xcd, 0xfa, 0x4a, 0x87, 0x37, 0xe9, 0x59, 0x94, 0x24, 0x13, 0xa3, 0x6e, 0xde}, [32]byte{0x0, 0xc, 0x18, 0x14, 0x30, 0x3c, 0x28, 0x24, 0x60, 0x6c, 0x78, 0x74, 0x50, 0x5c, 0x48, 0x44, 0x0, 0xc0, 0x9d, 0x5d, 0x27, 0xe7, 0xba, 0x7a, 0x4e, 0x8e, 0xd3, 0x13, 0x69, 0xa9, 0xf4, 0x34}, [32]byte{0x0, 0xd, 0x1a, 0x17, 0x34, 0x39, 0x2e, 0x23, 0x68, 0x65, 0x72, 0x7f, 0x5c, 0x51, 0x46, 0x4b, 0x0, 0xd0, 0xbd, 0x6d, 0x67, 0xb7, 0xda, 0xa, 0xce, 0x1e, 0x73, 0xa3, 0xa9, 0x79, 0x14, 0xc4}, [32]byte{0x0, 0xe, 0x1c, 0x12, 0x38, 0x36, 0x24, 0x2a, 0x70, 0x7e, 0x6c, 0x62, 0x48, 0x46, 0x54, 0x5a, 0x0, 0xe0, 0xdd, 0x3d, 0xa7, 0x47, 0x7a, 0x9a, 0x53, 0xb3, 0x8e, 0x6e, 0xf4, 0x14, 0x29, 0xc9}, [32]byte{0x0, 0xf, 0x1e, 0x11, 0x3c, 0x33, 0x22, 0x2d, 0x78, 0x77, 0x66, 0x69, 0x44, 0x4b, 0x5a, 0x55, 0x0, 0xf0, 0xfd, 0xd, 0xe7, 0x17, 0x1a, 0xea, 0xd3, 0x23, 0x2e, 0xde, 0x34, 0xc4, 0xc9, 0x39}, [32]byte{0x0, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0, 0x0, 0x1d, 0x3a, 0x27, 0x74, 0x69, 0x4e, 0x53, 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb}, [32]byte{0x0, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x0, 0xd, 0x1a, 0x17, 0x34, 0x39, 0x2e, 0x23, 0x68, 0x65, 0x72, 0x7f, 0x5c, 0x51, 0x46, 0x4b}, [32]byte{0x0, 0x12, 0x24, 0x36, 0x48, 0x5a, 0x6c, 0x7e, 0x90, 0x82, 0xb4, 0xa6, 0xd8, 0xca, 0xfc, 0xee, 0x0, 0x3d, 0x7a, 0x47, 0xf4, 0xc9, 0x8e, 0xb3, 0xf5, 0xc8, 0x8f, 0xb2, 0x1, 0x3c, 0x7b, 0x46}, [32]byte{0x0, 0x13, 0x26, 0x35, 0x4c, 0x5f, 0x6a, 0x79, 0x98, 0x8b, 0xbe, 0xad, 0xd4, 0xc7, 0xf2, 0xe1, 0x0, 0x2d, 0x5a, 0x77, 0xb4, 0x99, 0xee, 0xc3, 0x75, 0x58, 0x2f, 0x2, 0xc1, 0xec, 0x9b, 0xb6}, [32]byte{0x0, 0x14, 0x28, 0x3c, 0x50, 0x44, 0x78, 0x6c, 0xa0, 0xb4, 0x88, 0x9c, 0xf0, 0xe4, 0xd8, 0xcc, 0x0, 0x5d, 0xba, 0xe7, 0x69, 0x34, 0xd3, 0x8e, 0xd2, 0x8f, 0x68, 0x35, 0xbb, 0xe6, 0x1, 0x5c}, [32]byte{0x0, 0x15, 0x2a, 0x3f, 0x54, 0x41, 0x7e, 0x6b, 0xa8, 0xbd, 0x82, 0x97, 0xfc, 0xe9, 0xd6, 0xc3, 0x0, 0x4d, 0x9a, 0xd7, 0x29, 0x64, 0xb3, 0xfe, 0x52, 0x1f, 0xc8, 0x85, 0x7b, 0x36, 0xe1, 0xac}, [32]byte{0x0, 0x16, 0x2c, 0x3a, 0x58, 0x4e, 0x74, 0x62, 0xb0, 0xa6, 0x9c, 0x8a, 0xe8, 0xfe, 0xc4, 0xd2, 0x0, 0x7d, 0xfa, 0x87, 0xe9, 0x94, 0x13, 0x6e, 0xcf, 0xb2, 0x35, 0x48, 0x26, 0x5b, 0xdc, 0xa1}, [32]byte{0x0, 0x17, 0x2e, 0x39, 0x5c, 0x4b, 0x72, 0x65, 0xb8, 0xaf, 0x96, 0x81, 0xe4, 0xf3, 0xca, 0xdd, 0x0, 0x6d, 0xda, 0xb7, 0xa9, 0xc4, 0x73, 0x1e, 0x4f, 0x22, 0x95, 0xf8, 0xe6, 0x8b, 0x3c, 0x51}, [32]byte{0x0, 0x18, 0x30, 0x28, 0x60, 0x78, 0x50, 0x48, 0xc0, 0xd8, 0xf0, 0xe8, 0xa0, 0xb8, 0x90, 0x88, 0x0, 0x9d, 0x27, 0xba, 0x4e, 0xd3, 0x69, 0xf4, 0x9c, 0x1, 0xbb, 0x26, 0xd2, 0x4f, 0xf5, 0x68}, [32]byte{0x0, 0x19, 0x32, 0x2b, 0x64, 0x7d, 0x56, 0x4f, 0xc8, 0xd1, 0xfa, 0xe3, 0xac, 0xb5, 0x9e, 0x87, 0x0, 0x8d, 0x7, 0x8a, 0xe, 0x83, 0x9, 0x84, 0x1c, 0x91, 0x1b, 0x96, 0x12, 0x9f, 0x15, 0x98}, [32]byte{0x0, 0x1a, 0x34, 0x2e, 0x68, 0x72, 0x5c, 0x46, 0xd0, 0xca, 0xe4, 0xfe, 0xb8, 0xa2, 0x8c, 0x96, 0x0, 0xbd, 0x67, 0xda, 0xce, 0x73, 0xa9, 0x14, 0x81, 0x3c, 0xe6, 0x5b, 0x4f, 0xf2, 0x28, 0x95}, [32]byte{0x0, 0x1b, 0x36, 0x2d, 0x6c, 0x77, 0x5a, 0x41, 0xd8, 0xc3, 0xee, 0xf5, 0xb4, 0xaf, 0x82, 0x99, 0x0, 0xad, 0x47, 0xea, 0x8e, 0x23, 0xc9, 0x64, 0x1, 0xac, 0x46, 0xeb, 0x8f, 0x22, 0xc8, 0x65}, [32]byte{0x0, 0x1c, 0x38, 0x24, 0x70, 0x6c, 0x48, 0x54, 0xe0, 0xfc, 0xd8, 0xc4, 0x90, 0x8c, 0xa8, 0xb4, 0x0, 0xdd, 0xa7, 0x7a, 0x53, 0x8e, 0xf4, 0x29, 0xa6, 0x7b, 0x1, 0xdc, 0xf5, 0x28, 0x52, 0x8f}, [32]byte{0x0, 0x1d, 0x3a, 0x27, 0x74, 0x69, 0x4e, 0x53, 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb, 0x0, 0xcd, 0x87, 0x4a, 0x13, 0xde, 0x94, 0x59, 0x26, 0xeb, 0xa1, 0x6c, 0x35, 0xf8, 0xb2, 0x7f}, [32]byte{0x0, 0x1e, 0x3c, 0x22, 0x78, 0x66, 0x44, 0x5a, 0xf0, 0xee, 0xcc, 0xd2, 0x88, 0x96, 0xb4, 0xaa, 0x0, 0xfd, 0xe7, 0x1a, 0xd3, 0x2e, 0x34, 0xc9, 0xbb, 0x46, 0x5c, 0xa1, 0x68, 0x95, 0x8f, 0x72}, [32]byte{0x0, 0x1f, 0x3e, 0x21, 0x7c, 0x63, 0x42, 0x5d, 0xf8, 0xe7, 0xc6, 0xd9, 0x84, 0x9b, 0xba, 0xa5, 0x0, 0xed, 0xc7, 0x2a, 0x93, 0x7e, 0x54, 0xb9, 0x3b, 0xd6, 0xfc, 0x11, 0xa8, 0x45, 0x6f, 0x82}, [32]byte{0x0, 0x20, 0x40, 0x60, 0x80, 0xa0, 0xc0, 0xe0, 0x1d, 0x3d, 0x5d, 0x7d, 0x9d, 0xbd, 0xdd, 0xfd, 0x0, 0x3a, 0x74, 0x4e, 0xe8, 0xd2, 0x9c, 0xa6, 0xcd, 0xf7, 0xb9, 0x83, 0x25, 0x1f, 0x51, 0x6b}, [32]byte{0x0, 0x21, 0x42, 0x63, 0x84, 0xa5, 0xc6, 0xe7, 0x15, 0x34, 0x57, 0x76, 0x91, 0xb0, 0xd3, 0xf2, 0x0, 0x2a, 0x54, 0x7e, 0xa8, 0x82, 0xfc, 0xd6, 0x4d, 0x67, 0x19, 0x33, 0xe5, 0xcf, 0xb1, 0x9b}, [32]byte{0x0, 0x22, 0x44, 0x66, 0x88, 0xaa, 0xcc, 0xee, 0xd, 0x2f, 0x49, 0x6b, 0x85, 0xa7, 0xc1, 0xe3, 0x0, 0x1a, 0x34, 0x2e, 0x68, 0x72, 0x5c, 0x46, 0xd0, 0xca, 0xe4, 0xfe, 0xb8, 0xa2, 0x8c, 0x96}, [32]byte{0x0, 0x23, 0x46, 0x65, 0x8c, 0xaf, 0xca, 0xe9, 0x5, 0x26, 0x43, 0x60, 0x89, 0xaa, 0xcf, 0xec, 0x0, 0xa, 0x14, 0x1e, 0x28, 0x22, 0x3c, 0x36, 0x50, 0x5a, 0x44, 0x4e, 0x78, 0x72, 0x6c, 0x66}, [32]byte{0x0, 0x24, 0x48, 0x6c, 0x90, 0xb4, 0xd8, 0xfc, 0x3d, 0x19, 0x75, 0x51, 0xad, 0x89, 0xe5, 0xc1, 0x0, 0x7a, 0xf4, 0x8e, 0xf5, 0x8f, 0x1, 0x7b, 0xf7, 0x8d, 0x3, 0x79, 0x2, 0x78, 0xf6, 0x8c}, [32]byte{0x0, 0x25, 0x4a, 0x6f, 0x94, 0xb1, 0xde, 0xfb, 0x35, 0x10, 0x7f, 0x5a, 0xa1, 0x84, 0xeb, 0xce, 0x0, 0x6a, 0xd4, 0xbe, 0xb5, 0xdf, 0x61, 0xb, 0x77, 0x1d, 0xa3, 0xc9, 0xc2, 0xa8, 0x16, 0x7c}, [32]byte{0x0, 0x26, 0x4c, 0x6a, 0x98, 0xbe, 0xd4, 0xf2, 0x2d, 0xb, 0x61, 0x47, 0xb5, 0x93, 0xf9, 0xdf, 0x0, 0x5a, 0xb4, 0xee, 0x75, 0x2f, 0xc1, 0x9b, 0xea, 0xb0, 0x5e, 0x4, 0x9f, 0xc5, 0x2b, 0x71}, [32]byte{0x0, 0x27, 0x4e, 0x69, 0x9c, 0xbb, 0xd2, 0xf5, 0x25, 0x2, 0x6b, 0x4c, 0xb9, 0x9e, 0xf7, 0xd0, 0x0, 0x4a, 0x94, 0xde, 0x35, 0x7f, 0xa1, 0xeb, 0x6a, 0x20, 0xfe, 0xb4, 0x5f, 0x15, 0xcb, 0x81}, [32]byte{0x0, 0x28, 0x50, 0x78, 0xa0, 0x88, 0xf0, 0xd8, 0x5d, 0x75, 0xd, 0x25, 0xfd, 0xd5, 0xad, 0x85, 0x0, 0xba, 0x69, 0xd3, 0xd2, 0x68, 0xbb, 0x1, 0xb9, 0x3, 0xd0, 0x6a, 0x6b, 0xd1, 0x2, 0xb8}, [32]byte{0x0, 0x29, 0x52, 0x7b, 0xa4, 0x8d, 0xf6, 0xdf, 0x55, 0x7c, 0x7, 0x2e, 0xf1, 0xd8, 0xa3, 0x8a, 0x0, 0xaa, 0x49, 0xe3, 0x92, 0x38, 0xdb, 0x71, 0x39, 0x93, 0x70, 0xda, 0xab, 0x1, 0xe2, 0x48}, [32]byte{0x0, 0x2a, 0x54, 0x7e, 0xa8, 0x82, 0xfc, 0xd6, 0x4d, 0x67, 0x19, 0x33, 0xe5, 0xcf, 0xb1, 0x9b, 0x0, 0x9a, 0x29, 0xb3, 0x52, 0xc8, 0x7b, 0xe1, 0xa4, 0x3e, 0x8d, 0x17, 0xf6, 0x6c, 0xdf, 0x45}, [32]byte{0x0, 0x2b, 0x56, 0x7d, 0xac, 0x87, 0xfa, 0xd1, 0x45, 0x6e, 0x13, 0x38, 0xe9, 0xc2, 0xbf, 0x94, 0x0, 0x8a, 0x9, 0x83, 0x12, 0x98, 0x1b, 0x91, 0x24, 0xae, 0x2d, 0xa7, 0x36, 0xbc, 0x3f, 0xb5}, [32]byte{0x0, 0x2c, 0x58, 0x74, 0xb0, 0x9c, 0xe8, 0xc4, 0x7d, 0x51, 0x25, 0x9, 0xcd, 0xe1, 0x95, 0xb9, 0x0, 0xfa, 0xe9, 0x13, 0xcf, 0x35, 0x26, 0xdc, 0x83, 0x79, 0x6a, 0x90, 0x4c, 0xb6, 0xa5, 0x5f}, [32]byte{0x0, 0x2d, 0x5a, 0x77, 0xb4, 0x99, 0xee, 0xc3, 0x75, 0x58, 0x2f, 0x2, 0xc1, 0xec, 0x9b, 0xb6, 0x0, 0xea, 0xc9, 0x23, 0x8f, 0x65, 0x46, 0xac, 0x3, 0xe9, 0xca, 0x20, 0x8c, 0x66, 0x45, 0xaf}, [32]byte{0x0, 0x2e, 0x5c, 0x72, 0xb8, 0x96, 0xe4, 0xca, 0x6d, 0x43, 0x31, 0x1f, 0xd5, 0xfb, 0x89, 0xa7, 0x0, 0xda, 0xa9, 0x73, 0x4f, 0x95, 0xe6, 0x3c, 0x9e, 0x44, 0x37, 0xed, 0xd1, 0xb, 0x78, 0xa2}, [32]byte{0x0, 0x2f, 0x5e, 0x71, 0xbc, 0x93, 0xe2, 0xcd, 0x65, 0x4a, 0x3b, 0x14, 0xd9, 0xf6, 0x87, 0xa8, 0x0, 0xca, 0x89, 0x43, 0xf, 0xc5, 0x86, 0x4c, 0x1e, 0xd4, 0x97, 0x5d, 0x11, 0xdb, 0x98, 0x52}, [32]byte{0x0, 0x30, 0x60, 0x50, 0xc0, 0xf0, 0xa0, 0x90, 0x9d, 0xad, 0xfd, 0xcd, 0x5d, 0x6d, 0x3d, 0xd, 0x0, 0x27, 0x4e, 0x69, 0x9c, 0xbb, 0xd2, 0xf5, 0x25, 0x2, 0x6b, 0x4c, 0xb9, 0x9e, 0xf7, 0xd0}, [32]byte{0x0, 0x31, 0x62, 0x53, 0xc4, 0xf5, 0xa6, 0x97, 0x95, 0xa4, 0xf7, 0xc6, 0x51, 0x60, 0x33, 0x2, 0x0, 0x37, 0x6e, 0x59, 0xdc, 0xeb, 0xb2, 0x85, 0xa5, 0x92, 0xcb, 0xfc, 0x79, 0x4e, 0x17, 0x20}, [32]byte{0x0, 0x32, 0x64, 0x56, 0xc8, 0xfa, 0xac, 0x9e, 0x8d, 0xbf, 0xe9, 0xdb, 0x45, 0x77, 0x21, 0x13, 0x0, 0x7, 0xe, 0x9, 0x1c, 0x1b, 0x12, 0x15, 0x38, 0x3f, 0x36, 0x31, 0x24, 0x23, 0x2a, 0x2d}, [32]byte{0x0, 0x33, 0x66, 0x55, 0xcc, 0xff, 0xaa, 0x99, 0x85, 0xb6, 0xe3, 0xd0, 0x49, 0x7a, 0x2f, 0x1c, 0x0, 0x17, 0x2e, 0x39, 0x5c, 0x4b, 0x72, 0x65, 0xb8, 0xaf, 0x96, 0x81, 0xe4, 0xf3, 0xca, 0xdd}, [32]byte{0x0, 0x34, 0x68, 0x5c, 0xd0, 0xe4, 0xb8, 0x8c, 0xbd, 0x89, 0xd5, 0xe1, 0x6d, 0x59, 0x5, 0x31, 0x0, 0x67, 0xce, 0xa9, 0x81, 0xe6, 0x4f, 0x28, 0x1f, 0x78, 0xd1, 0xb6, 0x9e, 0xf9, 0x50, 0x37}, [32]byte{0x0, 0x35, 0x6a, 0x5f, 0xd4, 0xe1, 0xbe, 0x8b, 0xb5, 0x80, 0xdf, 0xea, 0x61, 0x54, 0xb, 0x3e, 0x0, 0x77, 0xee, 0x99, 0xc1, 0xb6, 0x2f, 0x58, 0x9f, 0xe8, 0x71, 0x6, 0x5e, 0x29, 0xb0, 0xc7}, [32]byte{0x0, 0x36, 0x6c, 0x5a, 0xd8, 0xee, 0xb4, 0x82, 0xad, 0x9b, 0xc1, 0xf7, 0x75, 0x43, 0x19, 0x2f, 0x0, 0x47, 0x8e, 0xc9, 0x1, 0x46, 0x8f, 0xc8, 0x2, 0x45, 0x8c, 0xcb, 0x3, 0x44, 0x8d, 0xca}, [32]byte{0x0, 0x37, 0x6e, 0x59, 0xdc, 0xeb, 0xb2, 0x85, 0xa5, 0x92, 0xcb, 0xfc, 0x79, 0x4e, 0x17, 0x20, 0x0, 0x57, 0xae, 0xf9, 0x41, 0x16, 0xef, 0xb8, 0x82, 0xd5, 0x2c, 0x7b, 0xc3, 0x94, 0x6d, 0x3a}, [32]byte{0x0, 0x38, 0x70, 0x48, 0xe0, 0xd8, 0x90, 0xa8, 0xdd, 0xe5, 0xad, 0x95, 0x3d, 0x5, 0x4d, 0x75, 0x0, 0xa7, 0x53, 0xf4, 0xa6, 0x1, 0xf5, 0x52, 0x51, 0xf6, 0x2, 0xa5, 0xf7, 0x50, 0xa4, 0x3}, [32]byte{0x0, 0x39, 0x72, 0x4b, 0xe4, 0xdd, 0x96, 0xaf, 0xd5, 0xec, 0xa7, 0x9e, 0x31, 0x8, 0x43, 0x7a, 0x0, 0xb7, 0x73, 0xc4, 0xe6, 0x51, 0x95, 0x22, 0xd1, 0x66, 0xa2, 0x15, 0x37, 0x80, 0x44, 0xf3}, [32]byte{0x0, 0x3a, 0x74, 0x4e, 0xe8, 0xd2, 0x9c, 0xa6, 0xcd, 0xf7, 0xb9, 0x83, 0x25, 0x1f, 0x51, 0x6b, 0x0, 0x87, 0x13, 0x94, 0x26, 0xa1, 0x35, 0xb2, 0x4c, 0xcb, 0x5f, 0xd8, 0x6a, 0xed, 0x79, 0xfe}, [32]byte{0x0, 0x3b, 0x76, 0x4d, 0xec, 0xd7, 0x9a, 0xa1, 0xc5, 0xfe, 0xb3, 0x88, 0x29, 0x12, 0x5f, 0x64, 0x0, 0x97, 0x33, 0xa4, 0x66, 0xf1, 0x55, 0xc2, 0xcc, 0x5b, 0xff, 0x68, 0xaa, 0x3d, 0x99, 0xe}, [32]byte{0x0, 0x3c, 0x78, 0x44, 0xf0, 0xcc, 0x88, 0xb4, 0xfd, 0xc1, 0x85, 0xb9, 0xd, 0x31, 0x75, 0x49, 0x0, 0xe7, 0xd3, 0x34, 0xbb, 0x5c, 0x68, 0x8f, 0x6b, 0x8c, 0xb8, 0x5f, 0xd0, 0x37, 0x3, 0xe4}, [32]byte{0x0, 0x3d, 0x7a, 0x47, 0xf4, 0xc9, 0x8e, 0xb3, 0xf5, 0xc8, 0x8f, 0xb2, 0x1, 0x3c, 0x7b, 0x46, 0x0, 0xf7, 0xf3, 0x4, 0xfb, 0xc, 0x8, 0xff, 0xeb, 0x1c, 0x18, 0xef, 0x10, 0xe7, 0xe3, 0x14}, [32]byte{0x0, 0x3e, 0x7c, 0x42, 0xf8, 0xc6, 0x84, 0xba, 0xed, 0xd3, 0x91, 0xaf, 0x15, 0x2b, 0x69, 0x57, 0x0, 0xc7, 0x93, 0x54, 0x3b, 0xfc, 0xa8, 0x6f, 0x76, 0xb1, 0xe5, 0x22, 0x4d, 0x8a, 0xde, 0x19}, [32]byte{0x0, 0x3f, 0x7e, 0x41, 0xfc, 0xc3, 0x82, 0xbd, 0xe5, 0xda, 0x9b, 0xa4, 0x19, 0x26, 0x67, 0x58, 0x0, 0xd7, 0xb3, 0x64, 0x7b, 0xac, 0xc8, 0x1f, 0xf6, 0x21, 0x45, 0x92, 0x8d, 0x5a, 0x3e, 0xe9}, [32]byte{0x0, 0x40, 0x80, 0xc0, 0x1d, 0x5d, 0x9d, 0xdd, 0x3a, 0x7a, 0xba, 0xfa, 0x27, 0x67, 0xa7, 0xe7, 0x0, 0x74, 0xe8, 0x9c, 0xcd, 0xb9, 0x25, 0x51, 0x87, 0xf3, 0x6f, 0x1b, 0x4a, 0x3e, 0xa2, 0xd6}, [32]byte{0x0, 0x41, 0x82, 0xc3, 0x19, 0x58, 0x9b, 0xda, 0x32, 0x73, 0xb0, 0xf1, 0x2b, 0x6a, 0xa9, 0xe8, 0x0, 0x64, 0xc8, 0xac, 0x8d, 0xe9, 0x45, 0x21, 0x7, 0x63, 0xcf, 0xab, 0x8a, 0xee, 0x42, 0x26}, [32]byte{0x0, 0x42, 0x84, 0xc6, 0x15, 0x57, 0x91, 0xd3, 0x2a, 0x68, 0xae, 0xec, 0x3f, 0x7d, 0xbb, 0xf9, 0x0, 0x54, 0xa8, 0xfc, 0x4d, 0x19, 0xe5, 0xb1, 0x9a, 0xce, 0x32, 0x66, 0xd7, 0x83, 0x7f, 0x2b}, [32]byte{0x0, 0x43, 0x86, 0xc5, 0x11, 0x52, 0x97, 0xd4, 0x22, 0x61, 0xa4, 0xe7, 0x33, 0x70, 0xb5, 0xf6, 0x0, 0x44, 0x88, 0xcc, 0xd, 0x49, 0x85, 0xc1, 0x1a, 0x5e, 0x92, 0xd6, 0x17, 0x53, 0x9f, 0xdb}, [32]byte{0x0, 0x44, 0x88, 0xcc, 0xd, 0x49, 0x85, 0xc1, 0x1a, 0x5e, 0x92, 0xd6, 0x17, 0x53, 0x9f, 0xdb, 0x0, 0x34, 0x68, 0x5c, 0xd0, 0xe4, 0xb8, 0x8c, 0xbd, 0x89, 0xd5, 0xe1, 0x6d, 0x59, 0x5, 0x31}, [32]byte{0x0, 0x45, 0x8a, 0xcf, 0x9, 0x4c, 0x83, 0xc6, 0x12, 0x57, 0x98, 0xdd, 0x1b, 0x5e, 0x91, 0xd4, 0x0, 0x24, 0x48, 0x6c, 0x90, 0xb4, 0xd8, 0xfc, 0x3d, 0x19, 0x75, 0x51, 0xad, 0x89, 0xe5, 0xc1}, [32]byte{0x0, 0x46, 0x8c, 0xca, 0x5, 0x43, 0x89, 0xcf, 0xa, 0x4c, 0x86, 0xc0, 0xf, 0x49, 0x83, 0xc5, 0x0, 0x14, 0x28, 0x3c, 0x50, 0x44, 0x78, 0x6c, 0xa0, 0xb4, 0x88, 0x9c, 0xf0, 0xe4, 0xd8, 0xcc}, [32]byte{0x0, 0x47, 0x8e, 0xc9, 0x1, 0x46, 0x8f, 0xc8, 0x2, 0x45, 0x8c, 0xcb, 0x3, 0x44, 0x8d, 0xca, 0x0, 0x4, 0x8, 0xc, 0x10, 0x14, 0x18, 0x1c, 0x20, 0x24, 0x28, 0x2c, 0x30, 0x34, 0x38, 0x3c}, [32]byte{0x0, 0x48, 0x90, 0xd8, 0x3d, 0x75, 0xad, 0xe5, 0x7a, 0x32, 0xea, 0xa2, 0x47, 0xf, 0xd7, 0x9f, 0x0, 0xf4, 0xf5, 0x1, 0xf7, 0x3, 0x2, 0xf6, 0xf3, 0x7, 0x6, 0xf2, 0x4, 0xf0, 0xf1, 0x5}, [32]byte{0x0, 0x49, 0x92, 0xdb, 0x39, 0x70, 0xab, 0xe2, 0x72, 0x3b, 0xe0, 0xa9, 0x4b, 0x2, 0xd9, 0x90, 0x0, 0xe4, 0xd5, 0x31, 0xb7, 0x53, 0x62, 0x86, 0x73, 0x97, 0xa6, 0x42, 0xc4, 0x20, 0x11, 0xf5}, [32]byte{0x0, 0x4a, 0x94, 0xde, 0x35, 0x7f, 0xa1, 0xeb, 0x6a, 0x20, 0xfe, 0xb4, 0x5f, 0x15, 0xcb, 0x81, 0x0, 0xd4, 0xb5, 0x61, 0x77, 0xa3, 0xc2, 0x16, 0xee, 0x3a, 0x5b, 0x8f, 0x99, 0x4d, 0x2c, 0xf8}, [32]byte{0x0, 0x4b, 0x96, 0xdd, 0x31, 0x7a, 0xa7, 0xec, 0x62, 0x29, 0xf4, 0xbf, 0x53, 0x18, 0xc5, 0x8e, 0x0, 0xc4, 0x95, 0x51, 0x37, 0xf3, 0xa2, 0x66, 0x6e, 0xaa, 0xfb, 0x3f, 0x59, 0x9d, 0xcc, 0x8}, [32]byte{0x0, 0x4c, 0x98, 0xd4, 0x2d, 0x61, 0xb5, 0xf9, 0x5a, 0x16, 0xc2, 0x8e, 0x77, 0x3b, 0xef, 0xa3, 0x0, 0xb4, 0x75, 0xc1, 0xea, 0x5e, 0x9f, 0x2b, 0xc9, 0x7d, 0xbc, 0x8, 0x23, 0x97, 0x56, 0xe2}, [32]byte{0x0, 0x4d, 0x9a, 0xd7, 0x29, 0x64, 0xb3, 0xfe, 0x52, 0x1f, 0xc8, 0x85, 0x7b, 0x36, 0xe1, 0xac, 0x0, 0xa4, 0x55, 0xf1, 0xaa, 0xe, 0xff, 0x5b, 0x49, 0xed, 0x1c, 0xb8, 0xe3, 0x47, 0xb6, 0x12}, [32]byte{0x0, 0x4e, 0x9c, 0xd2, 0x25, 0x6b, 0xb9, 0xf7, 0x4a, 0x4, 0xd6, 0x98, 0x6f, 0x21, 0xf3, 0xbd, 0x0, 0x94, 0x35, 0xa1, 0x6a, 0xfe, 0x5f, 0xcb, 0xd4, 0x40, 0xe1, 0x75, 0xbe, 0x2a, 0x8b, 0x1f}, [32]byte{0x0, 0x4f, 0x9e, 0xd1, 0x21, 0x6e, 0xbf, 0xf0, 0x42, 0xd, 0xdc, 0x93, 0x63, 0x2c, 0xfd, 0xb2, 0x0, 0x84, 0x15, 0x91, 0x2a, 0xae, 0x3f, 0xbb, 0x54, 0xd0, 0x41, 0xc5, 0x7e, 0xfa, 0x6b, 0xef}, [32]byte{0x0, 0x50, 0xa0, 0xf0, 0x5d, 0xd, 0xfd, 0xad, 0xba, 0xea, 0x1a, 0x4a, 0xe7, 0xb7, 0x47, 0x17, 0x0, 0x69, 0xd2, 0xbb, 0xb9, 0xd0, 0x6b, 0x2, 0x6f, 0x6, 0xbd, 0xd4, 0xd6, 0xbf, 0x4, 0x6d}, [32]byte{0x0, 0x51, 0xa2, 0xf3, 0x59, 0x8, 0xfb, 0xaa, 0xb2, 0xe3, 0x10, 0x41, 0xeb, 0xba, 0x49, 0x18, 0x0, 0x79, 0xf2, 0x8b, 0xf9, 0x80, 0xb, 0x72, 0xef, 0x96, 0x1d, 0x64, 0x16, 0x6f, 0xe4, 0x9d}, [32]byte{0x0, 0x52, 0xa4, 0xf6, 0x55, 0x7, 0xf1, 0xa3, 0xaa, 0xf8, 0xe, 0x5c, 0xff, 0xad, 0x5b, 0x9, 0x0, 0x49, 0x92, 0xdb, 0x39, 0x70, 0xab, 0xe2, 0x72, 0x3b, 0xe0, 0xa9, 0x4b, 0x2, 0xd9, 0x90}, [32]byte{0x0, 0x53, 0xa6, 0xf5, 0x51, 0x2, 0xf7, 0xa4, 0xa2, 0xf1, 0x4, 0x57, 0xf3, 0xa0, 0x55, 0x6, 0x0, 0x59, 0xb2, 0xeb, 0x79, 0x20, 0xcb, 0x92, 0xf2, 0xab, 0x40, 0x19, 0x8b, 0xd2, 0x39, 0x60}, [32]byte{0x0, 0x54, 0xa8, 0xfc, 0x4d, 0x19, 0xe5, 0xb1, 0x9a, 0xce, 0x32, 0x66, 0xd7, 0x83, 0x7f, 0x2b, 0x0, 0x29, 0x52, 0x7b, 0xa4, 0x8d, 0xf6, 0xdf, 0x55, 0x7c, 0x7, 0x2e, 0xf1, 0xd8, 0xa3, 0x8a}, [32]byte{0x0, 0x55, 0xaa, 0xff, 0x49, 0x1c, 0xe3, 0xb6, 0x92, 0xc7, 0x38, 0x6d, 0xdb, 0x8e, 0x71, 0x24, 0x0, 0x39, 0x72, 0x4b, 0xe4, 0xdd, 0x96, 0xaf, 0xd5, 0xec, 0xa7, 0x9e, 0x31, 0x8, 0x43, 0x7a}, [32]byte{0x0, 0x56, 0xac, 0xfa, 0x45, 0x13, 0xe9, 0xbf, 0x8a, 0xdc, 0x26, 0x70, 0xcf, 0x99, 0x63, 0x35, 0x0, 0x9, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77}, [32]byte{0x0, 0x57, 0xae, 0xf9, 0x41, 0x16, 0xef, 0xb8, 0x82, 0xd5, 0x2c, 0x7b, 0xc3, 0x94, 0x6d, 0x3a, 0x0, 0x19, 0x32, 0x2b, 0x64, 0x7d, 0x56, 0x4f, 0xc8, 0xd1, 0xfa, 0xe3, 0xac, 0xb5, 0x9e, 0x87}, [32]byte{0x0, 0x58, 0xb0, 0xe8, 0x7d, 0x25, 0xcd, 0x95, 0xfa, 0xa2, 0x4a, 0x12, 0x87, 0xdf, 0x37, 0x6f, 0x0, 0xe9, 0xcf, 0x26, 0x83, 0x6a, 0x4c, 0xa5, 0x1b, 0xf2, 0xd4, 0x3d, 0x98, 0x71, 0x57, 0xbe}, [32]byte{0x0, 0x59, 0xb2, 0xeb, 0x79, 0x20, 0xcb, 0x92, 0xf2, 0xab, 0x40, 0x19, 0x8b, 0xd2, 0x39, 0x60, 0x0, 0xf9, 0xef, 0x16, 0xc3, 0x3a, 0x2c, 0xd5, 0x9b, 0x62, 0x74, 0x8d, 0x58, 0xa1, 0xb7, 0x4e}, [32]byte{0x0, 0x5a, 0xb4, 0xee, 0x75, 0x2f, 0xc1, 0x9b, 0xea, 0xb0, 0x5e, 0x4, 0x9f, 0xc5, 0x2b, 0x71, 0x0, 0xc9, 0x8f, 0x46, 0x3, 0xca, 0x8c, 0x45, 0x6, 0xcf, 0x89, 0x40, 0x5, 0xcc, 0x8a, 0x43}, [32]byte{0x0, 0x5b, 0xb6, 0xed, 0x71, 0x2a, 0xc7, 0x9c, 0xe2, 0xb9, 0x54, 0xf, 0x93, 0xc8, 0x25, 0x7e, 0x0, 0xd9, 0xaf, 0x76, 0x43, 0x9a, 0xec, 0x35, 0x86, 0x5f, 0x29, 0xf0, 0xc5, 0x1c, 0x6a, 0xb3}, [32]byte{0x0, 0x5c, 0xb8, 0xe4, 0x6d, 0x31, 0xd5, 0x89, 0xda, 0x86, 0x62, 0x3e, 0xb7, 0xeb, 0xf, 0x53, 0x0, 0xa9, 0x4f, 0xe6, 0x9e, 0x37, 0xd1, 0x78, 0x21, 0x88, 0x6e, 0xc7, 0xbf, 0x16, 0xf0, 0x59}, [32]byte{0x0, 0x5d, 0xba, 0xe7, 0x69, 0x34, 0xd3, 0x8e, 0xd2, 0x8f, 0x68, 0x35, 0xbb, 0xe6, 0x1, 0x5c, 0x0, 0xb9, 0x6f, 0xd6, 0xde, 0x67, 0xb1, 0x8, 0xa1, 0x18, 0xce, 0x77, 0x7f, 0xc6, 0x10, 0xa9}, [32]byte{0x0, 0x5e, 0xbc, 0xe2, 0x65, 0x3b, 0xd9, 0x87, 0xca, 0x94, 0x76, 0x28, 0xaf, 0xf1, 0x13, 0x4d, 0x0, 0x89, 0xf, 0x86, 0x1e, 0x97, 0x11, 0x98, 0x3c, 0xb5, 0x33, 0xba, 0x22, 0xab, 0x2d, 0xa4}, [32]byte{0x0, 0x5f, 0xbe, 0xe1, 0x61, 0x3e, 0xdf, 0x80, 0xc2, 0x9d, 0x7c, 0x23, 0xa3, 0xfc, 0x1d, 0x42, 0x0, 0x99, 0x2f, 0xb6, 0x5e, 0xc7, 0x71, 0xe8, 0xbc, 0x25, 0x93, 0xa, 0xe2, 0x7b, 0xcd, 0x54}, [32]byte{0x0, 0x60, 0xc0, 0xa0, 0x9d, 0xfd, 0x5d, 0x3d, 0x27, 0x47, 0xe7, 0x87, 0xba, 0xda, 0x7a, 0x1a, 0x0, 0x4e, 0x9c, 0xd2, 0x25, 0x6b, 0xb9, 0xf7, 0x4a, 0x4, 0xd6, 0x98, 0x6f, 0x21, 0xf3, 0xbd}, [32]byte{0x0, 0x61, 0xc2, 0xa3, 0x99, 0xf8, 0x5b, 0x3a, 0x2f, 0x4e, 0xed, 0x8c, 0xb6, 0xd7, 0x74, 0x15, 0x0, 0x5e, 0xbc, 0xe2, 0x65, 0x3b, 0xd9, 0x87, 0xca, 0x94, 0x76, 0x28, 0xaf, 0xf1, 0x13, 0x4d}, [32]byte{0x0, 0x62, 0xc4, 0xa6, 0x95, 0xf7, 0x51, 0x33, 0x37, 0x55, 0xf3, 0x91, 0xa2, 0xc0, 0x66, 0x4, 0x0, 0x6e, 0xdc, 0xb2, 0xa5, 0xcb, 0x79, 0x17, 0x57, 0x39, 0x8b, 0xe5, 0xf2, 0x9c, 0x2e, 0x40}, [32]byte{0x0, 0x63, 0xc6, 0xa5, 0x91, 0xf2, 0x57, 0x34, 0x3f, 0x5c, 0xf9, 0x9a, 0xae, 0xcd, 0x68, 0xb, 0x0, 0x7e, 0xfc, 0x82, 0xe5, 0x9b, 0x19, 0x67, 0xd7, 0xa9, 0x2b, 0x55, 0x32, 0x4c, 0xce, 0xb0}, [32]byte{0x0, 0x64, 0xc8, 0xac, 0x8d, 0xe9, 0x45, 0x21, 0x7, 0x63, 0xcf, 0xab, 0x8a, 0xee, 0x42, 0x26, 0x0, 0xe, 0x1c, 0x12, 0x38, 0x36, 0x24, 0x2a, 0x70, 0x7e, 0x6c, 0x62, 0x48, 0x46, 0x54, 0x5a}, [32]byte{0x0, 0x65, 0xca, 0xaf, 0x89, 0xec, 0x43, 0x26, 0xf, 0x6a, 0xc5, 0xa0, 0x86, 0xe3, 0x4c, 0x29, 0x0, 0x1e, 0x3c, 0x22, 0x78, 0x66, 0x44, 0x5a, 0xf0, 0xee, 0xcc, 0xd2, 0x88, 0x96, 0xb4, 0xaa}, [32]byte{0x0, 0x66, 0xcc, 0xaa, 0x85, 0xe3, 0x49, 0x2f, 0x17, 0x71, 0xdb, 0xbd, 0x92, 0xf4, 0x5e, 0x38, 0x0, 0x2e, 0x5c, 0x72, 0xb8, 0x96, 0xe4, 0xca, 0x6d, 0x43, 0x31, 0x1f, 0xd5, 0xfb, 0x89, 0xa7}, [32]byte{0x0, 0x67, 0xce, 0xa9, 0x81, 0xe6, 0x4f, 0x28, 0x1f, 0x78, 0xd1, 0xb6, 0x9e, 0xf9, 0x50, 0x37, 0x0, 0x3e, 0x7c, 0x42, 0xf8, 0xc6, 0x84, 0xba, 0xed, 0xd3, 0x91, 0xaf, 0x15, 0x2b, 0x69, 0x57}, [32]byte{0x0, 0x68, 0xd0, 0xb8, 0xbd, 0xd5, 0x6d, 0x5, 0x67, 0xf, 0xb7, 0xdf, 0xda, 0xb2, 0xa, 0x62, 0x0, 0xce, 0x81, 0x4f, 0x1f, 0xd1, 0x9e, 0x50, 0x3e, 0xf0, 0xbf, 0x71, 0x21, 0xef, 0xa0, 0x6e}, [32]byte{0x0, 0x69, 0xd2, 0xbb, 0xb9, 0xd0, 0x6b, 0x2, 0x6f, 0x6, 0xbd, 0xd4, 0xd6, 0xbf, 0x4, 0x6d, 0x0, 0xde, 0xa1, 0x7f, 0x5f, 0x81, 0xfe, 0x20, 0xbe, 0x60, 0x1f, 0xc1, 0xe1, 0x3f, 0x40, 0x9e}, [32]byte{0x0, 0x6a, 0xd4, 0xbe, 0xb5, 0xdf, 0x61, 0xb, 0x77, 0x1d, 0xa3, 0xc9, 0xc2, 0xa8, 0x16, 0x7c, 0x0, 0xee, 0xc1, 0x2f, 0x9f, 0x71, 0x5e, 0xb0, 0x23, 0xcd, 0xe2, 0xc, 0xbc, 0x52, 0x7d, 0x93}, [32]byte{0x0, 0x6b, 0xd6, 0xbd, 0xb1, 0xda, 0x67, 0xc, 0x7f, 0x14, 0xa9, 0xc2, 0xce, 0xa5, 0x18, 0x73, 0x0, 0xfe, 0xe1, 0x1f, 0xdf, 0x21, 0x3e, 0xc0, 0xa3, 0x5d, 0x42, 0xbc, 0x7c, 0x82, 0x9d, 0x63}, [32]byte{0x0, 0x6c, 0xd8, 0xb4, 0xad, 0xc1, 0x75, 0x19, 0x47, 0x2b, 0x9f, 0xf3, 0xea, 0x86, 0x32, 0x5e, 0x0, 0x8e, 0x1, 0x8f, 0x2, 0x8c, 0x3, 0x8d, 0x4, 0x8a, 0x5, 0x8b, 0x6, 0x88, 0x7, 0x89}, [32]byte{0x0, 0x6d, 0xda, 0xb7, 0xa9, 0xc4, 0x73, 0x1e, 0x4f, 0x22, 0x95, 0xf8, 0xe6, 0x8b, 0x3c, 0x51, 0x0, 0x9e, 0x21, 0xbf, 0x42, 0xdc, 0x63, 0xfd, 0x84, 0x1a, 0xa5, 0x3b, 0xc6, 0x58, 0xe7, 0x79}, [32]byte{0x0, 0x6e, 0xdc, 0xb2, 0xa5, 0xcb, 0x79, 0x17, 0x57, 0x39, 0x8b, 0xe5, 0xf2, 0x9c, 0x2e, 0x40, 0x0, 0xae, 0x41, 0xef, 0x82, 0x2c, 0xc3, 0x6d, 0x19, 0xb7, 0x58, 0xf6, 0x9b, 0x35, 0xda, 0x74}, [32]byte{0x0, 0x6f, 0xde, 0xb1, 0xa1, 0xce, 0x7f, 0x10, 0x5f, 0x30, 0x81, 0xee, 0xfe, 0x91, 0x20, 0x4f, 0x0, 0xbe, 0x61, 0xdf, 0xc2, 0x7c, 0xa3, 0x1d, 0x99, 0x27, 0xf8, 0x46, 0x5b, 0xe5, 0x3a, 0x84}, [32]byte{0x0, 0x70, 0xe0, 0x90, 0xdd, 0xad, 0x3d, 0x4d, 0xa7, 0xd7, 0x47, 0x37, 0x7a, 0xa, 0x9a, 0xea, 0x0, 0x53, 0xa6, 0xf5, 0x51, 0x2, 0xf7, 0xa4, 0xa2, 0xf1, 0x4, 0x57, 0xf3, 0xa0, 0x55, 0x6}, [32]byte{0x0, 0x71, 0xe2, 0x93, 0xd9, 0xa8, 0x3b, 0x4a, 0xaf, 0xde, 0x4d, 0x3c, 0x76, 0x7, 0x94, 0xe5, 0x0, 0x43, 0x86, 0xc5, 0x11, 0x52, 0x97, 0xd4, 0x22, 0x61, 0xa4, 0xe7, 0x33, 0x70, 0xb5, 0xf6}, [32]byte{0x0, 0x72, 0xe4, 0x96, 0xd5, 0xa7, 0x31, 0x43, 0xb7, 0xc5, 0x53, 0x21, 0x62, 0x10, 0x86, 0xf4, 0x0, 0x73, 0xe6, 0x95, 0xd1, 0xa2, 0x37, 0x44, 0xbf, 0xcc, 0x59, 0x2a, 0x6e, 0x1d, 0x88, 0xfb}, [32]byte{0x0, 0x73, 0xe6, 0x95, 0xd1, 0xa2, 0x37, 0x44, 0xbf, 0xcc, 0x59, 0x2a, 0x6e, 0x1d, 0x88, 0xfb, 0x0, 0x63, 0xc6, 0xa5, 0x91, 0xf2, 0x57, 0x34, 0x3f, 0x5c, 0xf9, 0x9a, 0xae, 0xcd, 0x68, 0xb}, [32]byte{0x0, 0x74, 0xe8, 0x9c, 0xcd, 0xb9, 0x25, 0x51, 0x87, 0xf3, 0x6f, 0x1b, 0x4a, 0x3e, 0xa2, 0xd6, 0x0, 0x13, 0x26, 0x35, 0x4c, 0x5f, 0x6a, 0x79, 0x98, 0x8b, 0xbe, 0xad, 0xd4, 0xc7, 0xf2, 0xe1}, [32]byte{0x0, 0x75, 0xea, 0x9f, 0xc9, 0xbc, 0x23, 0x56, 0x8f, 0xfa, 0x65, 0x10, 0x46, 0x33, 0xac, 0xd9, 0x0, 0x3, 0x6, 0x5, 0xc, 0xf, 0xa, 0x9, 0x18, 0x1b, 0x1e, 0x1d, 0x14, 0x17, 0x12, 0x11}, [32]byte{0x0, 0x76, 0xec, 0x9a, 0xc5, 0xb3, 0x29, 0x5f, 0x97, 0xe1, 0x7b, 0xd, 0x52, 0x24, 0xbe, 0xc8, 0x0, 0x33, 0x66, 0x55, 0xcc, 0xff, 0xaa, 0x99, 0x85, 0xb6, 0xe3, 0xd0, 0x49, 0x7a, 0x2f, 0x1c}, [32]byte{0x0, 0x77, 0xee, 0x99, 0xc1, 0xb6, 0x2f, 0x58, 0x9f, 0xe8, 0x71, 0x6, 0x5e, 0x29, 0xb0, 0xc7, 0x0, 0x23, 0x46, 0x65, 0x8c, 0xaf, 0xca, 0xe9, 0x5, 0x26, 0x43, 0x60, 0x89, 0xaa, 0xcf, 0xec}, [32]byte{0x0, 0x78, 0xf0, 0x88, 0xfd, 0x85, 0xd, 0x75, 0xe7, 0x9f, 0x17, 0x6f, 0x1a, 0x62, 0xea, 0x92, 0x0, 0xd3, 0xbb, 0x68, 0x6b, 0xb8, 0xd0, 0x3, 0xd6, 0x5, 0x6d, 0xbe, 0xbd, 0x6e, 0x6, 0xd5}, [32]byte{0x0, 0x79, 0xf2, 0x8b, 0xf9, 0x80, 0xb, 0x72, 0xef, 0x96, 0x1d, 0x64, 0x16, 0x6f, 0xe4, 0x9d, 0x0, 0xc3, 0x9b, 0x58, 0x2b, 0xe8, 0xb0, 0x73, 0x56, 0x95, 0xcd, 0xe, 0x7d, 0xbe, 0xe6, 0x25}, [32]byte{0x0, 0x7a, 0xf4, 0x8e, 0xf5, 0x8f, 0x1, 0x7b, 0xf7, 0x8d, 0x3, 0x79, 0x2, 0x78, 0xf6, 0x8c, 0x0, 0xf3, 0xfb, 0x8, 0xeb, 0x18, 0x10, 0xe3, 0xcb, 0x38, 0x30, 0xc3, 0x20, 0xd3, 0xdb, 0x28}, [32]byte{0x0, 0x7b, 0xf6, 0x8d, 0xf1, 0x8a, 0x7, 0x7c, 0xff, 0x84, 0x9, 0x72, 0xe, 0x75, 0xf8, 0x83, 0x0, 0xe3, 0xdb, 0x38, 0xab, 0x48, 0x70, 0x93, 0x4b, 0xa8, 0x90, 0x73, 0xe0, 0x3, 0x3b, 0xd8}, [32]byte{0x0, 0x7c, 0xf8, 0x84, 0xed, 0x91, 0x15, 0x69, 0xc7, 0xbb, 0x3f, 0x43, 0x2a, 0x56, 0xd2, 0xae, 0x0, 0x93, 0x3b, 0xa8, 0x76, 0xe5, 0x4d, 0xde, 0xec, 0x7f, 0xd7, 0x44, 0x9a, 0x9, 0xa1, 0x32}, [32]byte{0x0, 0x7d, 0xfa, 0x87, 0xe9, 0x94, 0x13, 0x6e, 0xcf, 0xb2, 0x35, 0x48, 0x26, 0x5b, 0xdc, 0xa1, 0x0, 0x83, 0x1b, 0x98, 0x36, 0xb5, 0x2d, 0xae, 0x6c, 0xef, 0x77, 0xf4, 0x5a, 0xd9, 0x41, 0xc2}, [32]byte{0x0, 0x7e, 0xfc, 0x82, 0xe5, 0x9b, 0x19, 0x67, 0xd7, 0xa9, 0x2b, 0x55, 0x32, 0x4c, 0xce, 0xb0, 0x0, 0xb3, 0x7b, 0xc8, 0xf6, 0x45, 0x8d, 0x3e, 0xf1, 0x42, 0x8a, 0x39, 0x7, 0xb4, 0x7c, 0xcf}, [32]byte{0x0, 0x7f, 0xfe, 0x81, 0xe1, 0x9e, 0x1f, 0x60, 0xdf, 0xa0, 0x21, 0x5e, 0x3e, 0x41, 0xc0, 0xbf, 0x0, 0xa3, 0x5b, 0xf8, 0xb6, 0x15, 0xed, 0x4e, 0x71, 0xd2, 0x2a, 0x89, 0xc7, 0x64, 0x9c, 0x3f}, [32]byte{0x0, 0x80, 0x1d, 0x9d, 0x3a, 0xba, 0x27, 0xa7, 0x74, 0xf4, 0x69, 0xe9, 0x4e, 0xce, 0x53, 0xd3, 0x0, 0xe8, 0xcd, 0x25, 0x87, 0x6f, 0x4a, 0xa2, 0x13, 0xfb, 0xde, 0x36, 0x94, 0x7c, 0x59, 0xb1}, [32]byte{0x0, 0x81, 0x1f, 0x9e, 0x3e, 0xbf, 0x21, 0xa0, 0x7c, 0xfd, 0x63, 0xe2, 0x42, 0xc3, 0x5d, 0xdc, 0x0, 0xf8, 0xed, 0x15, 0xc7, 0x3f, 0x2a, 0xd2, 0x93, 0x6b, 0x7e, 0x86, 0x54, 0xac, 0xb9, 0x41}, [32]byte{0x0, 0x82, 0x19, 0x9b, 0x32, 0xb0, 0x2b, 0xa9, 0x64, 0xe6, 0x7d, 0xff, 0x56, 0xd4, 0x4f, 0xcd, 0x0, 0xc8, 0x8d, 0x45, 0x7, 0xcf, 0x8a, 0x42, 0xe, 0xc6, 0x83, 0x4b, 0x9, 0xc1, 0x84, 0x4c}, [32]byte{0x0, 0x83, 0x1b, 0x98, 0x36, 0xb5, 0x2d, 0xae, 0x6c, 0xef, 0x77, 0xf4, 0x5a, 0xd9, 0x41, 0xc2, 0x0, 0xd8, 0xad, 0x75, 0x47, 0x9f, 0xea, 0x32, 0x8e, 0x56, 0x23, 0xfb, 0xc9, 0x11, 0x64, 0xbc}, [32]byte{0x0, 0x84, 0x15, 0x91, 0x2a, 0xae, 0x3f, 0xbb, 0x54, 0xd0, 0x41, 0xc5, 0x7e, 0xfa, 0x6b, 0xef, 0x0, 0xa8, 0x4d, 0xe5, 0x9a, 0x32, 0xd7, 0x7f, 0x29, 0x81, 0x64, 0xcc, 0xb3, 0x1b, 0xfe, 0x56}, [32]byte{0x0, 0x85, 0x17, 0x92, 0x2e, 0xab, 0x39, 0xbc, 0x5c, 0xd9, 0x4b, 0xce, 0x72, 0xf7, 0x65, 0xe0, 0x0, 0xb8, 0x6d, 0xd5, 0xda, 0x62, 0xb7, 0xf, 0xa9, 0x11, 0xc4, 0x7c, 0x73, 0xcb, 0x1e, 0xa6}, [32]byte{0x0, 0x86, 0x11, 0x97, 0x22, 0xa4, 0x33, 0xb5, 0x44, 0xc2, 0x55, 0xd3, 0x66, 0xe0, 0x77, 0xf1, 0x0, 0x88, 0xd, 0x85, 0x1a, 0x92, 0x17, 0x9f, 0x34, 0xbc, 0x39, 0xb1, 0x2e, 0xa6, 0x23, 0xab}, [32]byte{0x0, 0x87, 0x13, 0x94, 0x26, 0xa1, 0x35, 0xb2, 0x4c, 0xcb, 0x5f, 0xd8, 0x6a, 0xed, 0x79, 0xfe, 0x0, 0x98, 0x2d, 0xb5, 0x5a, 0xc2, 0x77, 0xef, 0xb4, 0x2c, 0x99, 0x1, 0xee, 0x76, 0xc3, 0x5b}, [32]byte{0x0, 0x88, 0xd, 0x85, 0x1a, 0x92, 0x17, 0x9f, 0x34, 0xbc, 0x39, 0xb1, 0x2e, 0xa6, 0x23, 0xab, 0x0, 0x68, 0xd0, 0xb8, 0xbd, 0xd5, 0x6d, 0x5, 0x67, 0xf, 0xb7, 0xdf, 0xda, 0xb2, 0xa, 0x62}, [32]byte{0x0, 0x89, 0xf, 0x86, 0x1e, 0x97, 0x11, 0x98, 0x3c, 0xb5, 0x33, 0xba, 0x22, 0xab, 0x2d, 0xa4, 0x0, 0x78, 0xf0, 0x88, 0xfd, 0x85, 0xd, 0x75, 0xe7, 0x9f, 0x17, 0x6f, 0x1a, 0x62, 0xea, 0x92}, [32]byte{0x0, 0x8a, 0x9, 0x83, 0x12, 0x98, 0x1b, 0x91, 0x24, 0xae, 0x2d, 0xa7, 0x36, 0xbc, 0x3f, 0xb5, 0x0, 0x48, 0x90, 0xd8, 0x3d, 0x75, 0xad, 0xe5, 0x7a, 0x32, 0xea, 0xa2, 0x47, 0xf, 0xd7, 0x9f}, [32]byte{0x0, 0x8b, 0xb, 0x80, 0x16, 0x9d, 0x1d, 0x96, 0x2c, 0xa7, 0x27, 0xac, 0x3a, 0xb1, 0x31, 0xba, 0x0, 0x58, 0xb0, 0xe8, 0x7d, 0x25, 0xcd, 0x95, 0xfa, 0xa2, 0x4a, 0x12, 0x87, 0xdf, 0x37, 0x6f}, [32]byte{0x0, 0x8c, 0x5, 0x89, 0xa, 0x86, 0xf, 0x83, 0x14, 0x98, 0x11, 0x9d, 0x1e, 0x92, 0x1b, 0x97, 0x0, 0x28, 0x50, 0x78, 0xa0, 0x88, 0xf0, 0xd8, 0x5d, 0x75, 0xd, 0x25, 0xfd, 0xd5, 0xad, 0x85}, [32]byte{0x0, 0x8d, 0x7, 0x8a, 0xe, 0x83, 0x9, 0x84, 0x1c, 0x91, 0x1b, 0x96, 0x12, 0x9f, 0x15, 0x98, 0x0, 0x38, 0x70, 0x48, 0xe0, 0xd8, 0x90, 0xa8, 0xdd, 0xe5, 0xad, 0x95, 0x3d, 0x5, 0x4d, 0x75}, [32]byte{0x0, 0x8e, 0x1, 0x8f, 0x2, 0x8c, 0x3, 0x8d, 0x4, 0x8a, 0x5, 0x8b, 0x6, 0x88, 0x7, 0x89, 0x0, 0x8, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38, 0x40, 0x48, 0x50, 0x58, 0x60, 0x68, 0x70, 0x78}, [32]byte{0x0, 0x8f, 0x3, 0x8c, 0x6, 0x89, 0x5, 0x8a, 0xc, 0x83, 0xf, 0x80, 0xa, 0x85, 0x9, 0x86, 0x0, 0x18, 0x30, 0x28, 0x60, 0x78, 0x50, 0x48, 0xc0, 0xd8, 0xf0, 0xe8, 0xa0, 0xb8, 0x90, 0x88}, [32]byte{0x0, 0x90, 0x3d, 0xad, 0x7a, 0xea, 0x47, 0xd7, 0xf4, 0x64, 0xc9, 0x59, 0x8e, 0x1e, 0xb3, 0x23, 0x0, 0xf5, 0xf7, 0x2, 0xf3, 0x6, 0x4, 0xf1, 0xfb, 0xe, 0xc, 0xf9, 0x8, 0xfd, 0xff, 0xa}, [32]byte{0x0, 0x91, 0x3f, 0xae, 0x7e, 0xef, 0x41, 0xd0, 0xfc, 0x6d, 0xc3, 0x52, 0x82, 0x13, 0xbd, 0x2c, 0x0, 0xe5, 0xd7, 0x32, 0xb3, 0x56, 0x64, 0x81, 0x7b, 0x9e, 0xac, 0x49, 0xc8, 0x2d, 0x1f, 0xfa}, [32]byte{0x0, 0x92, 0x39, 0xab, 0x72, 0xe0, 0x4b, 0xd9, 0xe4, 0x76, 0xdd, 0x4f, 0x96, 0x4, 0xaf, 0x3d, 0x0, 0xd5, 0xb7, 0x62, 0x73, 0xa6, 0xc4, 0x11, 0xe6, 0x33, 0x51, 0x84, 0x95, 0x40, 0x22, 0xf7}, [32]byte{0x0, 0x93, 0x3b, 0xa8, 0x76, 0xe5, 0x4d, 0xde, 0xec, 0x7f, 0xd7, 0x44, 0x9a, 0x9, 0xa1, 0x32, 0x0, 0xc5, 0x97, 0x52, 0x33, 0xf6, 0xa4, 0x61, 0x66, 0xa3, 0xf1, 0x34, 0x55, 0x90, 0xc2, 0x7}, [32]byte{0x0, 0x94, 0x35, 0xa1, 0x6a, 0xfe, 0x5f, 0xcb, 0xd4, 0x40, 0xe1, 0x75, 0xbe, 0x2a, 0x8b, 0x1f, 0x0, 0xb5, 0x77, 0xc2, 0xee, 0x5b, 0x99, 0x2c, 0xc1, 0x74, 0xb6, 0x3, 0x2f, 0x9a, 0x58, 0xed}, [32]byte{0x0, 0x95, 0x37, 0xa2, 0x6e, 0xfb, 0x59, 0xcc, 0xdc, 0x49, 0xeb, 0x7e, 0xb2, 0x27, 0x85, 0x10, 0x0, 0xa5, 0x57, 0xf2, 0xae, 0xb, 0xf9, 0x5c, 0x41, 0xe4, 0x16, 0xb3, 0xef, 0x4a, 0xb8, 0x1d}, [32]byte{0x0, 0x96, 0x31, 0xa7, 0x62, 0xf4, 0x53, 0xc5, 0xc4, 0x52, 0xf5, 0x63, 0xa6, 0x30, 0x97, 0x1, 0x0, 0x95, 0x37, 0xa2, 0x6e, 0xfb, 0x59, 0xcc, 0xdc, 0x49, 0xeb, 0x7e, 0xb2, 0x27, 0x85, 0x10}, [32]byte{0x0, 0x97, 0x33, 0xa4, 0x66, 0xf1, 0x55, 0xc2, 0xcc, 0x5b, 0xff, 0x68, 0xaa, 0x3d, 0x99, 0xe, 0x0, 0x85, 0x17, 0x92, 0x2e, 0xab, 0x39, 0xbc, 0x5c, 0xd9, 0x4b, 0xce, 0x72, 0xf7, 0x65, 0xe0}, [32]byte{0x0, 0x98, 0x2d, 0xb5, 0x5a, 0xc2, 0x77, 0xef, 0xb4, 0x2c, 0x99, 0x1, 0xee, 0x76, 0xc3, 0x5b, 0x0, 0x75, 0xea, 0x9f, 0xc9, 0xbc, 0x23, 0x56, 0x8f, 0xfa, 0x65, 0x10, 0x46, 0x33, 0xac, 0xd9}, [32]byte{0x0, 0x99, 0x2f, 0xb6, 0x5e, 0xc7, 0x71, 0xe8, 0xbc, 0x25, 0x93, 0xa, 0xe2, 0x7b, 0xcd, 0x54, 0x0, 0x65, 0xca, 0xaf, 0x89, 0xec, 0x43, 0x26, 0xf, 0x6a, 0xc5, 0xa0, 0x86, 0xe3, 0x4c, 0x29}, [32]byte{0x0, 0x9a, 0x29, 0xb3, 0x52, 0xc8, 0x7b, 0xe1, 0xa4, 0x3e, 0x8d, 0x17, 0xf6, 0x6c, 0xdf, 0x45, 0x0, 0x55, 0xaa, 0xff, 0x49, 0x1c, 0xe3, 0xb6, 0x92, 0xc7, 0x38, 0x6d, 0xdb, 0x8e, 0x71, 0x24}, [32]byte{0x0, 0x9b, 0x2b, 0xb0, 0x56, 0xcd, 0x7d, 0xe6, 0xac, 0x37, 0x87, 0x1c, 0xfa, 0x61, 0xd1, 0x4a, 0x0, 0x45, 0x8a, 0xcf, 0x9, 0x4c, 0x83, 0xc6, 0x12, 0x57, 0x98, 0xdd, 0x1b, 0x5e, 0x91, 0xd4}, [32]byte{0x0, 0x9c, 0x25, 0xb9, 0x4a, 0xd6, 0x6f, 0xf3, 0x94, 0x8, 0xb1, 0x2d, 0xde, 0x42, 0xfb, 0x67, 0x0, 0x35, 0x6a, 0x5f, 0xd4, 0xe1, 0xbe, 0x8b, 0xb5, 0x80, 0xdf, 0xea, 0x61, 0x54, 0xb, 0x3e}, [32]byte{0x0, 0x9d, 0x27, 0xba, 0x4e, 0xd3, 0x69, 0xf4, 0x9c, 0x1, 0xbb, 0x26, 0xd2, 0x4f, 0xf5, 0x68, 0x0, 0x25, 0x4a, 0x6f, 0x94, 0xb1, 0xde, 0xfb, 0x35, 0x10, 0x7f, 0x5a, 0xa1, 0x84, 0xeb, 0xce}, [32]byte{0x0, 0x9e, 0x21, 0xbf, 0x42, 0xdc, 0x63, 0xfd, 0x84, 0x1a, 0xa5, 0x3b, 0xc6, 0x58, 0xe7, 0x79, 0x0, 0x15, 0x2a, 0x3f, 0x54, 0x41, 0x7e, 0x6b, 0xa8, 0xbd, 0x82, 0x97, 0xfc, 0xe9, 0xd6, 0xc3}, [32]byte{0x0, 0x9f, 0x23, 0xbc, 0x46, 0xd9, 0x65, 0xfa, 0x8c, 0x13, 0xaf, 0x30, 0xca, 0x55, 0xe9, 0x76, 0x0, 0x5, 0xa, 0xf, 0x14, 0x11, 0x1e, 0x1b, 0x28, 0x2d, 0x22, 0x27, 0x3c, 0x39, 0x36, 0x33}, [32]byte{0x0, 0xa0, 0x5d, 0xfd, 0xba, 0x1a, 0xe7, 0x47, 0x69, 0xc9, 0x34, 0x94, 0xd3, 0x73, 0x8e, 0x2e, 0x0, 0xd2, 0xb9, 0x6b, 0x6f, 0xbd, 0xd6, 0x4, 0xde, 0xc, 0x67, 0xb5, 0xb1, 0x63, 0x8, 0xda}, [32]byte{0x0, 0xa1, 0x5f, 0xfe, 0xbe, 0x1f, 0xe1, 0x40, 0x61, 0xc0, 0x3e, 0x9f, 0xdf, 0x7e, 0x80, 0x21, 0x0, 0xc2, 0x99, 0x5b, 0x2f, 0xed, 0xb6, 0x74, 0x5e, 0x9c, 0xc7, 0x5, 0x71, 0xb3, 0xe8, 0x2a}, [32]byte{0x0, 0xa2, 0x59, 0xfb, 0xb2, 0x10, 0xeb, 0x49, 0x79, 0xdb, 0x20, 0x82, 0xcb, 0x69, 0x92, 0x30, 0x0, 0xf2, 0xf9, 0xb, 0xef, 0x1d, 0x16, 0xe4, 0xc3, 0x31, 0x3a, 0xc8, 0x2c, 0xde, 0xd5, 0x27}, [32]byte{0x0, 0xa3, 0x5b, 0xf8, 0xb6, 0x15, 0xed, 0x4e, 0x71, 0xd2, 0x2a, 0x89, 0xc7, 0x64, 0x9c, 0x3f, 0x0, 0xe2, 0xd9, 0x3b, 0xaf, 0x4d, 0x76, 0x94, 0x43, 0xa1, 0x9a, 0x78, 0xec, 0xe, 0x35, 0xd7}, [32]byte{0x0, 0xa4, 0x55, 0xf1, 0xaa, 0xe, 0xff, 0x5b, 0x49, 0xed, 0x1c, 0xb8, 0xe3, 0x47, 0xb6, 0x12, 0x0, 0x92, 0x39, 0xab, 0x72, 0xe0, 0x4b, 0xd9, 0xe4, 0x76, 0xdd, 0x4f, 0x96, 0x4, 0xaf, 0x3d}, [32]byte{0x0, 0xa5, 0x57, 0xf2, 0xae, 0xb, 0xf9, 0x5c, 0x41, 0xe4, 0x16, 0xb3, 0xef, 0x4a, 0xb8, 0x1d, 0x0, 0x82, 0x19, 0x9b, 0x32, 0xb0, 0x2b, 0xa9, 0x64, 0xe6, 0x7d, 0xff, 0x56, 0xd4, 0x4f, 0xcd}, [32]byte{0x0, 0xa6, 0x51, 0xf7, 0xa2, 0x4, 0xf3, 0x55, 0x59, 0xff, 0x8, 0xae, 0xfb, 0x5d, 0xaa, 0xc, 0x0, 0xb2, 0x79, 0xcb, 0xf2, 0x40, 0x8b, 0x39, 0xf9, 0x4b, 0x80, 0x32, 0xb, 0xb9, 0x72, 0xc0}, [32]byte{0x0, 0xa7, 0x53, 0xf4, 0xa6, 0x1, 0xf5, 0x52, 0x51, 0xf6, 0x2, 0xa5, 0xf7, 0x50, 0xa4, 0x3, 0x0, 0xa2, 0x59, 0xfb, 0xb2, 0x10, 0xeb, 0x49, 0x79, 0xdb, 0x20, 0x82, 0xcb, 0x69, 0x92, 0x30}, [32]byte{0x0, 0xa8, 0x4d, 0xe5, 0x9a, 0x32, 0xd7, 0x7f, 0x29, 0x81, 0x64, 0xcc, 0xb3, 0x1b, 0xfe, 0x56, 0x0, 0x52, 0xa4, 0xf6, 0x55, 0x7, 0xf1, 0xa3, 0xaa, 0xf8, 0xe, 0x5c, 0xff, 0xad, 0x5b, 0x9}, [32]byte{0x0, 0xa9, 0x4f, 0xe6, 0x9e, 0x37, 0xd1, 0x78, 0x21, 0x88, 0x6e, 0xc7, 0xbf, 0x16, 0xf0, 0x59, 0x0, 0x42, 0x84, 0xc6, 0x15, 0x57, 0x91, 0xd3, 0x2a, 0x68, 0xae, 0xec, 0x3f, 0x7d, 0xbb, 0xf9}, [32]byte{0x0, 0xaa, 0x49, 0xe3, 0x92, 0x38, 0xdb, 0x71, 0x39, 0x93, 0x70, 0xda, 0xab, 0x1, 0xe2, 0x48, 0x0, 0x72, 0xe4, 0x96, 0xd5, 0xa7, 0x31, 0x43, 0xb7, 0xc5, 0x53, 0x21, 0x62, 0x10, 0x86, 0xf4}, [32]byte{0x0, 0xab, 0x4b, 0xe0, 0x96, 0x3d, 0xdd, 0x76, 0x31, 0x9a, 0x7a, 0xd1, 0xa7, 0xc, 0xec, 0x47, 0x0, 0x62, 0xc4, 0xa6, 0x95, 0xf7, 0x51, 0x33, 0x37, 0x55, 0xf3, 0x91, 0xa2, 0xc0, 0x66, 0x4}, [32]byte{0x0, 0xac, 0x45, 0xe9, 0x8a, 0x26, 0xcf, 0x63, 0x9, 0xa5, 0x4c, 0xe0, 0x83, 0x2f, 0xc6, 0x6a, 0x0, 0x12, 0x24, 0x36, 0x48, 0x5a, 0x6c, 0x7e, 0x90, 0x82, 0xb4, 0xa6, 0xd8, 0xca, 0xfc, 0xee}, [32]byte{0x0, 0xad, 0x47, 0xea, 0x8e, 0x23, 0xc9, 0x64, 0x1, 0xac, 0x46, 0xeb, 0x8f, 0x22, 0xc8, 0x65, 0x0, 0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e}, [32]byte{0x0, 0xae, 0x41, 0xef, 0x82, 0x2c, 0xc3, 0x6d, 0x19, 0xb7, 0x58, 0xf6, 0x9b, 0x35, 0xda, 0x74, 0x0, 0x32, 0x64, 0x56, 0xc8, 0xfa, 0xac, 0x9e, 0x8d, 0xbf, 0xe9, 0xdb, 0x45, 0x77, 0x21, 0x13}, [32]byte{0x0, 0xaf, 0x43, 0xec, 0x86, 0x29, 0xc5, 0x6a, 0x11, 0xbe, 0x52, 0xfd, 0x97, 0x38, 0xd4, 0x7b, 0x0, 0x22, 0x44, 0x66, 0x88, 0xaa, 0xcc, 0xee, 0xd, 0x2f, 0x49, 0x6b, 0x85, 0xa7, 0xc1, 0xe3}, [32]byte{0x0, 0xb0, 0x7d, 0xcd, 0xfa, 0x4a, 0x87, 0x37, 0xe9, 0x59, 0x94, 0x24, 0x13, 0xa3, 0x6e, 0xde, 0x0, 0xcf, 0x83, 0x4c, 0x1b, 0xd4, 0x98, 0x57, 0x36, 0xf9, 0xb5, 0x7a, 0x2d, 0xe2, 0xae, 0x61}, [32]byte{0x0, 0xb1, 0x7f, 0xce, 0xfe, 0x4f, 0x81, 0x30, 0xe1, 0x50, 0x9e, 0x2f, 0x1f, 0xae, 0x60, 0xd1, 0x0, 0xdf, 0xa3, 0x7c, 0x5b, 0x84, 0xf8, 0x27, 0xb6, 0x69, 0x15, 0xca, 0xed, 0x32, 0x4e, 0x91}, [32]byte{0x0, 0xb2, 0x79, 0xcb, 0xf2, 0x40, 0x8b, 0x39, 0xf9, 0x4b, 0x80, 0x32, 0xb, 0xb9, 0x72, 0xc0, 0x0, 0xef, 0xc3, 0x2c, 0x9b, 0x74, 0x58, 0xb7, 0x2b, 0xc4, 0xe8, 0x7, 0xb0, 0x5f, 0x73, 0x9c}, [32]byte{0x0, 0xb3, 0x7b, 0xc8, 0xf6, 0x45, 0x8d, 0x3e, 0xf1, 0x42, 0x8a, 0x39, 0x7, 0xb4, 0x7c, 0xcf, 0x0, 0xff, 0xe3, 0x1c, 0xdb, 0x24, 0x38, 0xc7, 0xab, 0x54, 0x48, 0xb7, 0x70, 0x8f, 0x93, 0x6c}, [32]byte{0x0, 0xb4, 0x75, 0xc1, 0xea, 0x5e, 0x9f, 0x2b, 0xc9, 0x7d, 0xbc, 0x8, 0x23, 0x97, 0x56, 0xe2, 0x0, 0x8f, 0x3, 0x8c, 0x6, 0x89, 0x5, 0x8a, 0xc, 0x83, 0xf, 0x80, 0xa, 0x85, 0x9, 0x86}, [32]byte{0x0, 0xb5, 0x77, 0xc2, 0xee, 0x5b, 0x99, 0x2c, 0xc1, 0x74, 0xb6, 0x3, 0x2f, 0x9a, 0x58, 0xed, 0x0, 0x9f, 0x23, 0xbc, 0x46, 0xd9, 0x65, 0xfa, 0x8c, 0x13, 0xaf, 0x30, 0xca, 0x55, 0xe9, 0x76}, [32]byte{0x0, 0xb6, 0x71, 0xc7, 0xe2, 0x54, 0x93, 0x25, 0xd9, 0x6f, 0xa8, 0x1e, 0x3b, 0x8d, 0x4a, 0xfc, 0x0, 0xaf, 0x43, 0xec, 0x86, 0x29, 0xc5, 0x6a, 0x11, 0xbe, 0x52, 0xfd, 0x97, 0x38, 0xd4, 0x7b}, [32]byte{0x0, 0xb7, 0x73, 0xc4, 0xe6, 0x51, 0x95, 0x22, 0xd1, 0x66, 0xa2, 0x15, 0x37, 0x80, 0x44, 0xf3, 0x0, 0xbf, 0x63, 0xdc, 0xc6, 0x79, 0xa5, 0x1a, 0x91, 0x2e, 0xf2, 0x4d, 0x57, 0xe8, 0x34, 0x8b}, [32]byte{0x0, 0xb8, 0x6d, 0xd5, 0xda, 0x62, 0xb7, 0xf, 0xa9, 0x11, 0xc4, 0x7c, 0x73, 0xcb, 0x1e, 0xa6, 0x0, 0x4f, 0x9e, 0xd1, 0x21, 0x6e, 0xbf, 0xf0, 0x42, 0xd, 0xdc, 0x93, 0x63, 0x2c, 0xfd, 0xb2}, [32]byte{0x0, 0xb9, 0x6f, 0xd6, 0xde, 0x67, 0xb1, 0x8, 0xa1, 0x18, 0xce, 0x77, 0x7f, 0xc6, 0x10, 0xa9, 0x0, 0x5f, 0xbe, 0xe1, 0x61, 0x3e, 0xdf, 0x80, 0xc2, 0x9d, 0x7c, 0x23, 0xa3, 0xfc, 0x1d, 0x42}, [32]byte{0x0, 0xba, 0x69, 0xd3, 0xd2, 0x68, 0xbb, 0x1, 0xb9, 0x3, 0xd0, 0x6a, 0x6b, 0xd1, 0x2, 0xb8, 0x0, 0x6f, 0xde, 0xb1, 0xa1, 0xce, 0x7f, 0x10, 0x5f, 0x30, 0x81, 0xee, 0xfe, 0x91, 0x20, 0x4f}, [32]byte{0x0, 0xbb, 0x6b, 0xd0, 0xd6, 0x6d, 0xbd, 0x6, 0xb1, 0xa, 0xda, 0x61, 0x67, 0xdc, 0xc, 0xb7, 0x0, 0x7f, 0xfe, 0x81, 0xe1, 0x9e, 0x1f, 0x60, 0xdf, 0xa0, 0x21, 0x5e, 0x3e, 0x41, 0xc0, 0xbf}, [32]byte{0x0, 0xbc, 0x65, 0xd9, 0xca, 0x76, 0xaf, 0x13, 0x89, 0x35, 0xec, 0x50, 0x43, 0xff, 0x26, 0x9a, 0x0, 0xf, 0x1e, 0x11, 0x3c, 0x33, 0x22, 0x2d, 0x78, 0x77, 0x66, 0x69, 0x44, 0x4b, 0x5a, 0x55}, [32]byte{0x0, 0xbd, 0x67, 0xda, 0xce, 0x73, 0xa9, 0x14, 0x81, 0x3c, 0xe6, 0x5b, 0x4f, 0xf2, 0x28, 0x95, 0x0, 0x1f, 0x3e, 0x21, 0x7c, 0x63, 0x42, 0x5d, 0xf8, 0xe7, 0xc6, 0xd9, 0x84, 0x9b, 0xba, 0xa5}, [32]byte{0x0, 0xbe, 0x61, 0xdf, 0xc2, 0x7c, 0xa3, 0x1d, 0x99, 0x27, 0xf8, 0x46, 0x5b, 0xe5, 0x3a, 0x84, 0x0, 0x2f, 0x5e, 0x71, 0xbc, 0x93, 0xe2, 0xcd, 0x65, 0x4a, 0x3b, 0x14, 0xd9, 0xf6, 0x87, 0xa8}, [32]byte{0x0, 0xbf, 0x63, 0xdc, 0xc6, 0x79, 0xa5, 0x1a, 0x91, 0x2e, 0xf2, 0x4d, 0x57, 0xe8, 0x34, 0x8b, 0x0, 0x3f, 0x7e, 0x41, 0xfc, 0xc3, 0x82, 0xbd, 0xe5, 0xda, 0x9b, 0xa4, 0x19, 0x26, 0x67, 0x58}, [32]byte{0x0, 0xc0, 0x9d, 0x5d, 0x27, 0xe7, 0xba, 0x7a, 0x4e, 0x8e, 0xd3, 0x13, 0x69, 0xa9, 0xf4, 0x34, 0x0, 0x9c, 0x25, 0xb9, 0x4a, 0xd6, 0x6f, 0xf3, 0x94, 0x8, 0xb1, 0x2d, 0xde, 0x42, 0xfb, 0x67}, [32]byte{0x0, 0xc1, 0x9f, 0x5e, 0x23, 0xe2, 0xbc, 0x7d, 0x46, 0x87, 0xd9, 0x18, 0x65, 0xa4, 0xfa, 0x3b, 0x0, 0x8c, 0x5, 0x89, 0xa, 0x86, 0xf, 0x83, 0x14, 0x98, 0x11, 0x9d, 0x1e, 0x92, 0x1b, 0x97}, [32]byte{0x0, 0xc2, 0x99, 0x5b, 0x2f, 0xed, 0xb6, 0x74, 0x5e, 0x9c, 0xc7, 0x5, 0x71, 0xb3, 0xe8, 0x2a, 0x0, 0xbc, 0x65, 0xd9, 0xca, 0x76, 0xaf, 0x13, 0x89, 0x35, 0xec, 0x50, 0x43, 0xff, 0x26, 0x9a}, [32]byte{0x0, 0xc3, 0x9b, 0x58, 0x2b, 0xe8, 0xb0, 0x73, 0x56, 0x95, 0xcd, 0xe, 0x7d, 0xbe, 0xe6, 0x25, 0x0, 0xac, 0x45, 0xe9, 0x8a, 0x26, 0xcf, 0x63, 0x9, 0xa5, 0x4c, 0xe0, 0x83, 0x2f, 0xc6, 0x6a}, [32]byte{0x0, 0xc4, 0x95, 0x51, 0x37, 0xf3, 0xa2, 0x66, 0x6e, 0xaa, 0xfb, 0x3f, 0x59, 0x9d, 0xcc, 0x8, 0x0, 0xdc, 0xa5, 0x79, 0x57, 0x8b, 0xf2, 0x2e, 0xae, 0x72, 0xb, 0xd7, 0xf9, 0x25, 0x5c, 0x80}, [32]byte{0x0, 0xc5, 0x97, 0x52, 0x33, 0xf6, 0xa4, 0x61, 0x66, 0xa3, 0xf1, 0x34, 0x55, 0x90, 0xc2, 0x7, 0x0, 0xcc, 0x85, 0x49, 0x17, 0xdb, 0x92, 0x5e, 0x2e, 0xe2, 0xab, 0x67, 0x39, 0xf5, 0xbc, 0x70}, [32]byte{0x0, 0xc6, 0x91, 0x57, 0x3f, 0xf9, 0xae, 0x68, 0x7e, 0xb8, 0xef, 0x29, 0x41, 0x87, 0xd0, 0x16, 0x0, 0xfc, 0xe5, 0x19, 0xd7, 0x2b, 0x32, 0xce, 0xb3, 0x4f, 0x56, 0xaa, 0x64, 0x98, 0x81, 0x7d}, [32]byte{0x0, 0xc7, 0x93, 0x54, 0x3b, 0xfc, 0xa8, 0x6f, 0x76, 0xb1, 0xe5, 0x22, 0x4d, 0x8a, 0xde, 0x19, 0x0, 0xec, 0xc5, 0x29, 0x97, 0x7b, 0x52, 0xbe, 0x33, 0xdf, 0xf6, 0x1a, 0xa4, 0x48, 0x61, 0x8d}, [32]byte{0x0, 0xc8, 0x8d, 0x45, 0x7, 0xcf, 0x8a, 0x42, 0xe, 0xc6, 0x83, 0x4b, 0x9, 0xc1, 0x84, 0x4c, 0x0, 0x1c, 0x38, 0x24, 0x70, 0x6c, 0x48, 0x54, 0xe0, 0xfc, 0xd8, 0xc4, 0x90, 0x8c, 0xa8, 0xb4}, [32]byte{0x0, 0xc9, 0x8f, 0x46, 0x3, 0xca, 0x8c, 0x45, 0x6, 0xcf, 0x89, 0x40, 0x5, 0xcc, 0x8a, 0x43, 0x0, 0xc, 0x18, 0x14, 0x30, 0x3c, 0x28, 0x24, 0x60, 0x6c, 0x78, 0x74, 0x50, 0x5c, 0x48, 0x44}, [32]byte{0x0, 0xca, 0x89, 0x43, 0xf, 0xc5, 0x86, 0x4c, 0x1e, 0xd4, 0x97, 0x5d, 0x11, 0xdb, 0x98, 0x52, 0x0, 0x3c, 0x78, 0x44, 0xf0, 0xcc, 0x88, 0xb4, 0xfd, 0xc1, 0x85, 0xb9, 0xd, 0x31, 0x75, 0x49}, [32]byte{0x0, 0xcb, 0x8b, 0x40, 0xb, 0xc0, 0x80, 0x4b, 0x16, 0xdd, 0x9d, 0x56, 0x1d, 0xd6, 0x96, 0x5d, 0x0, 0x2c, 0x58, 0x74, 0xb0, 0x9c, 0xe8, 0xc4, 0x7d, 0x51, 0x25, 0x9, 0xcd, 0xe1, 0x95, 0xb9}, [32]byte{0x0, 0xcc, 0x85, 0x49, 0x17, 0xdb, 0x92, 0x5e, 0x2e, 0xe2, 0xab, 0x67, 0x39, 0xf5, 0xbc, 0x70, 0x0, 0x5c, 0xb8, 0xe4, 0x6d, 0x31, 0xd5, 0x89, 0xda, 0x86, 0x62, 0x3e, 0xb7, 0xeb, 0xf, 0x53}, [32]byte{0x0, 0xcd, 0x87, 0x4a, 0x13, 0xde, 0x94, 0x59, 0x26, 0xeb, 0xa1, 0x6c, 0x35, 0xf8, 0xb2, 0x7f, 0x0, 0x4c, 0x98, 0xd4, 0x2d, 0x61, 0xb5, 0xf9, 0x5a, 0x16, 0xc2, 0x8e, 0x77, 0x3b, 0xef, 0xa3}, [32]byte{0x0, 0xce, 0x81, 0x4f, 0x1f, 0xd1, 0x9e, 0x50, 0x3e, 0xf0, 0xbf, 0x71, 0x21, 0xef, 0xa0, 0x6e, 0x0, 0x7c, 0xf8, 0x84, 0xed, 0x91, 0x15, 0x69, 0xc7, 0xbb, 0x3f, 0x43, 0x2a, 0x56, 0xd2, 0xae}, [32]byte{0x0, 0xcf, 0x83, 0x4c, 0x1b, 0xd4, 0x98, 0x57, 0x36, 0xf9, 0xb5, 0x7a, 0x2d, 0xe2, 0xae, 0x61, 0x0, 0x6c, 0xd8, 0xb4, 0xad, 0xc1, 0x75, 0x19, 0x47, 0x2b, 0x9f, 0xf3, 0xea, 0x86, 0x32, 0x5e}, [32]byte{0x0, 0xd0, 0xbd, 0x6d, 0x67, 0xb7, 0xda, 0xa, 0xce, 0x1e, 0x73, 0xa3, 0xa9, 0x79, 0x14, 0xc4, 0x0, 0x81, 0x1f, 0x9e, 0x3e, 0xbf, 0x21, 0xa0, 0x7c, 0xfd, 0x63, 0xe2, 0x42, 0xc3, 0x5d, 0xdc}, [32]byte{0x0, 0xd1, 0xbf, 0x6e, 0x63, 0xb2, 0xdc, 0xd, 0xc6, 0x17, 0x79, 0xa8, 0xa5, 0x74, 0x1a, 0xcb, 0x0, 0x91, 0x3f, 0xae, 0x7e, 0xef, 0x41, 0xd0, 0xfc, 0x6d, 0xc3, 0x52, 0x82, 0x13, 0xbd, 0x2c}, [32]byte{0x0, 0xd2, 0xb9, 0x6b, 0x6f, 0xbd, 0xd6, 0x4, 0xde, 0xc, 0x67, 0xb5, 0xb1, 0x63, 0x8, 0xda, 0x0, 0xa1, 0x5f, 0xfe, 0xbe, 0x1f, 0xe1, 0x40, 0x61, 0xc0, 0x3e, 0x9f, 0xdf, 0x7e, 0x80, 0x21}, [32]byte{0x0, 0xd3, 0xbb, 0x68, 0x6b, 0xb8, 0xd0, 0x3, 0xd6, 0x5, 0x6d, 0xbe, 0xbd, 0x6e, 0x6, 0xd5, 0x0, 0xb1, 0x7f, 0xce, 0xfe, 0x4f, 0x81, 0x30, 0xe1, 0x50, 0x9e, 0x2f, 0x1f, 0xae, 0x60, 0xd1}, [32]byte{0x0, 0xd4, 0xb5, 0x61, 0x77, 0xa3, 0xc2, 0x16, 0xee, 0x3a, 0x5b, 0x8f, 0x99, 0x4d, 0x2c, 0xf8, 0x0, 0xc1, 0x9f, 0x5e, 0x23, 0xe2, 0xbc, 0x7d, 0x46, 0x87, 0xd9, 0x18, 0x65, 0xa4, 0xfa, 0x3b}, [32]byte{0x0, 0xd5, 0xb7, 0x62, 0x73, 0xa6, 0xc4, 0x11, 0xe6, 0x33, 0x51, 0x84, 0x95, 0x40, 0x22, 0xf7, 0x0, 0xd1, 0xbf, 0x6e, 0x63, 0xb2, 0xdc, 0xd, 0xc6, 0x17, 0x79, 0xa8, 0xa5, 0x74, 0x1a, 0xcb}, [32]byte{0x0, 0xd6, 0xb1, 0x67, 0x7f, 0xa9, 0xce, 0x18, 0xfe, 0x28, 0x4f, 0x99, 0x81, 0x57, 0x30, 0xe6, 0x0, 0xe1, 0xdf, 0x3e, 0xa3, 0x42, 0x7c, 0x9d, 0x5b, 0xba, 0x84, 0x65, 0xf8, 0x19, 0x27, 0xc6}, [32]byte{0x0, 0xd7, 0xb3, 0x64, 0x7b, 0xac, 0xc8, 0x1f, 0xf6, 0x21, 0x45, 0x92, 0x8d, 0x5a, 0x3e, 0xe9, 0x0, 0xf1, 0xff, 0xe, 0xe3, 0x12, 0x1c, 0xed, 0xdb, 0x2a, 0x24, 0xd5, 0x38, 0xc9, 0xc7, 0x36}, [32]byte{0x0, 0xd8, 0xad, 0x75, 0x47, 0x9f, 0xea, 0x32, 0x8e, 0x56, 0x23, 0xfb, 0xc9, 0x11, 0x64, 0xbc, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf}, [32]byte{0x0, 0xd9, 0xaf, 0x76, 0x43, 0x9a, 0xec, 0x35, 0x86, 0x5f, 0x29, 0xf0, 0xc5, 0x1c, 0x6a, 0xb3, 0x0, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}, [32]byte{0x0, 0xda, 0xa9, 0x73, 0x4f, 0x95, 0xe6, 0x3c, 0x9e, 0x44, 0x37, 0xed, 0xd1, 0xb, 0x78, 0xa2, 0x0, 0x21, 0x42, 0x63, 0x84, 0xa5, 0xc6, 0xe7, 0x15, 0x34, 0x57, 0x76, 0x91, 0xb0, 0xd3, 0xf2}, [32]byte{0x0, 0xdb, 0xab, 0x70, 0x4b, 0x90, 0xe0, 0x3b, 0x96, 0x4d, 0x3d, 0xe6, 0xdd, 0x6, 0x76, 0xad, 0x0, 0x31, 0x62, 0x53, 0xc4, 0xf5, 0xa6, 0x97, 0x95, 0xa4, 0xf7, 0xc6, 0x51, 0x60, 0x33, 0x2}, [32]byte{0x0, 0xdc, 0xa5, 0x79, 0x57, 0x8b, 0xf2, 0x2e, 0xae, 0x72, 0xb, 0xd7, 0xf9, 0x25, 0x5c, 0x80, 0x0, 0x41, 0x82, 0xc3, 0x19, 0x58, 0x9b, 0xda, 0x32, 0x73, 0xb0, 0xf1, 0x2b, 0x6a, 0xa9, 0xe8}, [32]byte{0x0, 0xdd, 0xa7, 0x7a, 0x53, 0x8e, 0xf4, 0x29, 0xa6, 0x7b, 0x1, 0xdc, 0xf5, 0x28, 0x52, 0x8f, 0x0, 0x51, 0xa2, 0xf3, 0x59, 0x8, 0xfb, 0xaa, 0xb2, 0xe3, 0x10, 0x41, 0xeb, 0xba, 0x49, 0x18}, [32]byte{0x0, 0xde, 0xa1, 0x7f, 0x5f, 0x81, 0xfe, 0x20, 0xbe, 0x60, 0x1f, 0xc1, 0xe1, 0x3f, 0x40, 0x9e, 0x0, 0x61, 0xc2, 0xa3, 0x99, 0xf8, 0x5b, 0x3a, 0x2f, 0x4e, 0xed, 0x8c, 0xb6, 0xd7, 0x74, 0x15}, [32]byte{0x0, 0xdf, 0xa3, 0x7c, 0x5b, 0x84, 0xf8, 0x27, 0xb6, 0x69, 0x15, 0xca, 0xed, 0x32, 0x4e, 0x91, 0x0, 0x71, 0xe2, 0x93, 0xd9, 0xa8, 0x3b, 0x4a, 0xaf, 0xde, 0x4d, 0x3c, 0x76, 0x7, 0x94, 0xe5}, [32]byte{0x0, 0xe0, 0xdd, 0x3d, 0xa7, 0x47, 0x7a, 0x9a, 0x53, 0xb3, 0x8e, 0x6e, 0xf4, 0x14, 0x29, 0xc9, 0x0, 0xa6, 0x51, 0xf7, 0xa2, 0x4, 0xf3, 0x55, 0x59, 0xff, 0x8, 0xae, 0xfb, 0x5d, 0xaa, 0xc}, [32]byte{0x0, 0xe1, 0xdf, 0x3e, 0xa3, 0x42, 0x7c, 0x9d, 0x5b, 0xba, 0x84, 0x65, 0xf8, 0x19, 0x27, 0xc6, 0x0, 0xb6, 0x71, 0xc7, 0xe2, 0x54, 0x93, 0x25, 0xd9, 0x6f, 0xa8, 0x1e, 0x3b, 0x8d, 0x4a, 0xfc}, [32]byte{0x0, 0xe2, 0xd9, 0x3b, 0xaf, 0x4d, 0x76, 0x94, 0x43, 0xa1, 0x9a, 0x78, 0xec, 0xe, 0x35, 0xd7, 0x0, 0x86, 0x11, 0x97, 0x22, 0xa4, 0x33, 0xb5, 0x44, 0xc2, 0x55, 0xd3, 0x66, 0xe0, 0x77, 0xf1}, [32]byte{0x0, 0xe3, 0xdb, 0x38, 0xab, 0x48, 0x70, 0x93, 0x4b, 0xa8, 0x90, 0x73, 0xe0, 0x3, 0x3b, 0xd8, 0x0, 0x96, 0x31, 0xa7, 0x62, 0xf4, 0x53, 0xc5, 0xc4, 0x52, 0xf5, 0x63, 0xa6, 0x30, 0x97, 0x1}, [32]byte{0x0, 0xe4, 0xd5, 0x31, 0xb7, 0x53, 0x62, 0x86, 0x73, 0x97, 0xa6, 0x42, 0xc4, 0x20, 0x11, 0xf5, 0x0, 0xe6, 0xd1, 0x37, 0xbf, 0x59, 0x6e, 0x88, 0x63, 0x85, 0xb2, 0x54, 0xdc, 0x3a, 0xd, 0xeb}, [32]byte{0x0, 0xe5, 0xd7, 0x32, 0xb3, 0x56, 0x64, 0x81, 0x7b, 0x9e, 0xac, 0x49, 0xc8, 0x2d, 0x1f, 0xfa, 0x0, 0xf6, 0xf1, 0x7, 0xff, 0x9, 0xe, 0xf8, 0xe3, 0x15, 0x12, 0xe4, 0x1c, 0xea, 0xed, 0x1b}, [32]byte{0x0, 0xe6, 0xd1, 0x37, 0xbf, 0x59, 0x6e, 0x88, 0x63, 0x85, 0xb2, 0x54, 0xdc, 0x3a, 0xd, 0xeb, 0x0, 0xc6, 0x91, 0x57, 0x3f, 0xf9, 0xae, 0x68, 0x7e, 0xb8, 0xef, 0x29, 0x41, 0x87, 0xd0, 0x16}, [32]byte{0x0, 0xe7, 0xd3, 0x34, 0xbb, 0x5c, 0x68, 0x8f, 0x6b, 0x8c, 0xb8, 0x5f, 0xd0, 0x37, 0x3, 0xe4, 0x0, 0xd6, 0xb1, 0x67, 0x7f, 0xa9, 0xce, 0x18, 0xfe, 0x28, 0x4f, 0x99, 0x81, 0x57, 0x30, 0xe6}, [32]byte{0x0, 0xe8, 0xcd, 0x25, 0x87, 0x6f, 0x4a, 0xa2, 0x13, 0xfb, 0xde, 0x36, 0x94, 0x7c, 0x59, 0xb1, 0x0, 0x26, 0x4c, 0x6a, 0x98, 0xbe, 0xd4, 0xf2, 0x2d, 0xb, 0x61, 0x47, 0xb5, 0x93, 0xf9, 0xdf}, [32]byte{0x0, 0xe9, 0xcf, 0x26, 0x83, 0x6a, 0x4c, 0xa5, 0x1b, 0xf2, 0xd4, 0x3d, 0x98, 0x71, 0x57, 0xbe, 0x0, 0x36, 0x6c, 0x5a, 0xd8, 0xee, 0xb4, 0x82, 0xad, 0x9b, 0xc1, 0xf7, 0x75, 0x43, 0x19, 0x2f}, [32]byte{0x0, 0xea, 0xc9, 0x23, 0x8f, 0x65, 0x46, 0xac, 0x3, 0xe9, 0xca, 0x20, 0x8c, 0x66, 0x45, 0xaf, 0x0, 0x6, 0xc, 0xa, 0x18, 0x1e, 0x14, 0x12, 0x30, 0x36, 0x3c, 0x3a, 0x28, 0x2e, 0x24, 0x22}, [32]byte{0x0, 0xeb, 0xcb, 0x20, 0x8b, 0x60, 0x40, 0xab, 0xb, 0xe0, 0xc0, 0x2b, 0x80, 0x6b, 0x4b, 0xa0, 0x0, 0x16, 0x2c, 0x3a, 0x58, 0x4e, 0x74, 0x62, 0xb0, 0xa6, 0x9c, 0x8a, 0xe8, 0xfe, 0xc4, 0xd2}, [32]byte{0x0, 0xec, 0xc5, 0x29, 0x97, 0x7b, 0x52, 0xbe, 0x33, 0xdf, 0xf6, 0x1a, 0xa4, 0x48, 0x61, 0x8d, 0x0, 0x66, 0xcc, 0xaa, 0x85, 0xe3, 0x49, 0x2f, 0x17, 0x71, 0xdb, 0xbd, 0x92, 0xf4, 0x5e, 0x38}, [32]byte{0x0, 0xed, 0xc7, 0x2a, 0x93, 0x7e, 0x54, 0xb9, 0x3b, 0xd6, 0xfc, 0x11, 0xa8, 0x45, 0x6f, 0x82, 0x0, 0x76, 0xec, 0x9a, 0xc5, 0xb3, 0x29, 0x5f, 0x97, 0xe1, 0x7b, 0xd, 0x52, 0x24, 0xbe, 0xc8}, [32]byte{0x0, 0xee, 0xc1, 0x2f, 0x9f, 0x71, 0x5e, 0xb0, 0x23, 0xcd, 0xe2, 0xc, 0xbc, 0x52, 0x7d, 0x93, 0x0, 0x46, 0x8c, 0xca, 0x5, 0x43, 0x89, 0xcf, 0xa, 0x4c, 0x86, 0xc0, 0xf, 0x49, 0x83, 0xc5}, [32]byte{0x0, 0xef, 0xc3, 0x2c, 0x9b, 0x74, 0x58, 0xb7, 0x2b, 0xc4, 0xe8, 0x7, 0xb0, 0x5f, 0x73, 0x9c, 0x0, 0x56, 0xac, 0xfa, 0x45, 0x13, 0xe9, 0xbf, 0x8a, 0xdc, 0x26, 0x70, 0xcf, 0x99, 0x63, 0x35}, [32]byte{0x0, 0xf0, 0xfd, 0xd, 0xe7, 0x17, 0x1a, 0xea, 0xd3, 0x23, 0x2e, 0xde, 0x34, 0xc4, 0xc9, 0x39, 0x0, 0xbb, 0x6b, 0xd0, 0xd6, 0x6d, 0xbd, 0x6, 0xb1, 0xa, 0xda, 0x61, 0x67, 0xdc, 0xc, 0xb7}, [32]byte{0x0, 0xf1, 0xff, 0xe, 0xe3, 0x12, 0x1c, 0xed, 0xdb, 0x2a, 0x24, 0xd5, 0x38, 0xc9, 0xc7, 0x36, 0x0, 0xab, 0x4b, 0xe0, 0x96, 0x3d, 0xdd, 0x76, 0x31, 0x9a, 0x7a, 0xd1, 0xa7, 0xc, 0xec, 0x47}, [32]byte{0x0, 0xf2, 0xf9, 0xb, 0xef, 0x1d, 0x16, 0xe4, 0xc3, 0x31, 0x3a, 0xc8, 0x2c, 0xde, 0xd5, 0x27, 0x0, 0x9b, 0x2b, 0xb0, 0x56, 0xcd, 0x7d, 0xe6, 0xac, 0x37, 0x87, 0x1c, 0xfa, 0x61, 0xd1, 0x4a}, [32]byte{0x0, 0xf3, 0xfb, 0x8, 0xeb, 0x18, 0x10, 0xe3, 0xcb, 0x38, 0x30, 0xc3, 0x20, 0xd3, 0xdb, 0x28, 0x0, 0x8b, 0xb, 0x80, 0x16, 0x9d, 0x1d, 0x96, 0x2c, 0xa7, 0x27, 0xac, 0x3a, 0xb1, 0x31, 0xba}, [32]byte{0x0, 0xf4, 0xf5, 0x1, 0xf7, 0x3, 0x2, 0xf6, 0xf3, 0x7, 0x6, 0xf2, 0x4, 0xf0, 0xf1, 0x5, 0x0, 0xfb, 0xeb, 0x10, 0xcb, 0x30, 0x20, 0xdb, 0x8b, 0x70, 0x60, 0x9b, 0x40, 0xbb, 0xab, 0x50}, [32]byte{0x0, 0xf5, 0xf7, 0x2, 0xf3, 0x6, 0x4, 0xf1, 0xfb, 0xe, 0xc, 0xf9, 0x8, 0xfd, 0xff, 0xa, 0x0, 0xeb, 0xcb, 0x20, 0x8b, 0x60, 0x40, 0xab, 0xb, 0xe0, 0xc0, 0x2b, 0x80, 0x6b, 0x4b, 0xa0}, [32]byte{0x0, 0xf6, 0xf1, 0x7, 0xff, 0x9, 0xe, 0xf8, 0xe3, 0x15, 0x12, 0xe4, 0x1c, 0xea, 0xed, 0x1b, 0x0, 0xdb, 0xab, 0x70, 0x4b, 0x90, 0xe0, 0x3b, 0x96, 0x4d, 0x3d, 0xe6, 0xdd, 0x6, 0x76, 0xad}, [32]byte{0x0, 0xf7, 0xf3, 0x4, 0xfb, 0xc, 0x8, 0xff, 0xeb, 0x1c, 0x18, 0xef, 0x10, 0xe7, 0xe3, 0x14, 0x0, 0xcb, 0x8b, 0x40, 0xb, 0xc0, 0x80, 0x4b, 0x16, 0xdd, 0x9d, 0x56, 0x1d, 0xd6, 0x96, 0x5d}, [32]byte{0x0, 0xf8, 0xed, 0x15, 0xc7, 0x3f, 0x2a, 0xd2, 0x93, 0x6b, 0x7e, 0x86, 0x54, 0xac, 0xb9, 0x41, 0x0, 0x3b, 0x76, 0x4d, 0xec, 0xd7, 0x9a, 0xa1, 0xc5, 0xfe, 0xb3, 0x88, 0x29, 0x12, 0x5f, 0x64}, [32]byte{0x0, 0xf9, 0xef, 0x16, 0xc3, 0x3a, 0x2c, 0xd5, 0x9b, 0x62, 0x74, 0x8d, 0x58, 0xa1, 0xb7, 0x4e, 0x0, 0x2b, 0x56, 0x7d, 0xac, 0x87, 0xfa, 0xd1, 0x45, 0x6e, 0x13, 0x38, 0xe9, 0xc2, 0xbf, 0x94}, [32]byte{0x0, 0xfa, 0xe9, 0x13, 0xcf, 0x35, 0x26, 0xdc, 0x83, 0x79, 0x6a, 0x90, 0x4c, 0xb6, 0xa5, 0x5f, 0x0, 0x1b, 0x36, 0x2d, 0x6c, 0x77, 0x5a, 0x41, 0xd8, 0xc3, 0xee, 0xf5, 0xb4, 0xaf, 0x82, 0x99}, [32]byte{0x0, 0xfb, 0xeb, 0x10, 0xcb, 0x30, 0x20, 0xdb, 0x8b, 0x70, 0x60, 0x9b, 0x40, 0xbb, 0xab, 0x50, 0x0, 0xb, 0x16, 0x1d, 0x2c, 0x27, 0x3a, 0x31, 0x58, 0x53, 0x4e, 0x45, 0x74, 0x7f, 0x62, 0x69}, [32]byte{0x0, 0xfc, 0xe5, 0x19, 0xd7, 0x2b, 0x32, 0xce, 0xb3, 0x4f, 0x56, 0xaa, 0x64, 0x98, 0x81, 0x7d, 0x0, 0x7b, 0xf6, 0x8d, 0xf1, 0x8a, 0x7, 0x7c, 0xff, 0x84, 0x9, 0x72, 0xe, 0x75, 0xf8, 0x83}, [32]byte{0x0, 0xfd, 0xe7, 0x1a, 0xd3, 0x2e, 0x34, 0xc9, 0xbb, 0x46, 0x5c, 0xa1, 0x68, 0x95, 0x8f, 0x72, 0x0, 0x6b, 0xd6, 0xbd, 0xb1, 0xda, 0x67, 0xc, 0x7f, 0x14, 0xa9, 0xc2, 0xce, 0xa5, 0x18, 0x73}, [32]byte{0x0, 0xfe, 0xe1, 0x1f, 0xdf, 0x21, 0x3e, 0xc0, 0xa3, 0x5d, 0x42, 0xbc, 0x7c, 0x82, 0x9d, 0x63, 0x0, 0x5b, 0xb6, 0xed, 0x71, 0x2a, 0xc7, 0x9c, 0xe2, 0xb9, 0x54, 0xf, 0x93, 0xc8, 0x25, 0x7e}, [32]byte{0x0, 0xff, 0xe3, 0x1c, 0xdb, 0x24, 0x38, 0xc7, 0xab, 0x54, 0x48, 0xb7, 0x70, 0x8f, 0x93, 0x6c, 0x0, 0x4b, 0x96, 0xdd, 0x31, 0x7a, 0xa7, 0xec, 0x62, 0x29, 0xf4, 0xbf, 0x53, 0x18, 0xc5, 0x8e}}
diff --git a/vendor/github.com/tjfoc/gmsm/.travis.yml b/vendor/github.com/tjfoc/gmsm/.travis.yml
new file mode 100644
index 0000000..8e1beaf
--- /dev/null
+++ b/vendor/github.com/tjfoc/gmsm/.travis.yml
@@ -0,0 +1,45 @@
+sudo: false
+language:
+ - go
+go:
+ - 1.8.3
+
+#before_install:
+ #- git rm -r --cached .
+ #- git add .
+ #- git commit -m 'update .gitignore'
+
+install:
+ - go get -v github.com/golang/lint/golint
+ - go get -v golang.org/x/crypto/ripemd160
+ - go get -v golang.org/x/crypto/sha3
+ - go build -v ./sm2
+ - go build -v ./sm3
+ - go build -v ./sm4
+
+script:
+ - go vet ./sm2
+ - go vet ./sm3
+ - go vet ./sm4
+ - $HOME/gopath/bin/golint .
+ - export GOPATH="${TRAVIS_BUILD_DIR}/Godeps/_workspace:$GOPATH"
+ - export PATH="${TRAVIS_BUILD_DIR}/Godeps/_workspace/bin:$PATH"
+ - ls /home/travis/gopath/src/
+ - go test -v ./sm2
+ - go test -v ./sm3
+ - go test -v ./sm4
+
+after_failure:
+
+ - |
+ echo "Error!"
+notifications:
+ email:
+ recipients:
+ - zhiqiang@tj-fintech.com
+ - yanwenze@tj-fintech.com
+ - maoxiuze@tj-fintech.com
+ - yewei@tj-fintech.com
+
+ on_success: never # default: change
+ on_failure: never # default: always
diff --git a/vendor/github.com/tjfoc/gmsm/CHANGELOG.md b/vendor/github.com/tjfoc/gmsm/CHANGELOG.md
new file mode 100644
index 0000000..f2830d5
--- /dev/null
+++ b/vendor/github.com/tjfoc/gmsm/CHANGELOG.md
@@ -0,0 +1,48 @@
+## 更新日志
+
+1.0 更新:
+- 添加以下oid
+ SM3WithSM2 1.2.156.10197.1.501
+ SHA1WithSM2 1.2.156.10197.1.502
+ SHA256WithSM2 1.2.156.10197.1.503
+
+- x509生成的证书如今可以使用SM3作为hash算法
+
+- 引入了以下hash算法
+ RIPEMD160
+ SHA3_256
+ SHA3_384
+ SHA3_512
+ SHA3_SM3
+ 用户需要自己安装golang.org/x/crypto
+
+1.0.1 更新:
+- 添加全局的sbox改进sm4效率(by https://github.com/QwertyJack)
+
+1.1.0更新:
+- 改进新能,具体提升如下
+ 注:本次优化并不彻底,只是第一次尝试优化,后续有时间还会继续优化
+```
+ old:
+ generate key:
+ BenchmarkSM2-4 1000 2517147 ns/op 1156476 B/op 11273 allocs/op
+ sign:
+ BenchmarkSM2-4 300 6297498 ns/op 2321890 B/op 22653 allocs/op
+ verify:
+ BenchmarkSM2-4 2000 8557215 ns/op 3550626 B/op 34627 allocs/op
+ encrypt:
+ BenchmarkSM2-4 2000 8304840 ns/op 3483113 B/op 33967 allocs/op
+ decrypt:
+ BenchmarkSM2-4 2000 5726181 ns/op 2321728 B/op 22644 allocs/op
+ new:
+ generate key:
+ BenchmarkSM2-4 5000 303656 ns/op 2791 B/op 41 allocs/op
+ sign:
+ BenchmarkSM2-4 2000 652465 ns/op 8828 B/op 133 allocs/op
+ verify:
+ BenchmarkSM2-4 1000 2004511 ns/op 122709 B/op 1738 allocs/op
+ encrpyt:
+ BenchmarkSM2-4 1000 1984419 ns/op 118560 B/op 1687 allocs/op
+ decrypt:
+ BenchmarkSM2-4 1000 1725001 ns/op 118331 B/op 1679 allocs/op
+```
diff --git a/vendor/github.com/tjfoc/gmsm/LICENSE b/vendor/github.com/tjfoc/gmsm/LICENSE
new file mode 100644
index 0000000..8dada3e
--- /dev/null
+++ b/vendor/github.com/tjfoc/gmsm/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor 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, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright {yyyy} {name of copyright owner}
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/vendor/github.com/tjfoc/gmsm/README.md b/vendor/github.com/tjfoc/gmsm/README.md
new file mode 100644
index 0000000..70af87e
--- /dev/null
+++ b/vendor/github.com/tjfoc/gmsm/README.md
@@ -0,0 +1,40 @@
+
+GM SM2/3/4 library based on Golang
+
+基于Go语言的国密SM2/SM3/SM4加密算法库
+
+版权所有 苏州同济区块链研究院有限公司(http://www.tj-fintech.com)
+
+
+Process Results [![Build Status](https://travis-ci.org/tjfoc/gmsm.svg?branch=develop)](https://travis-ci.org/tjfoc/gmsm)
+
+Copyright Suzhou Tongji Fintech Research Institute 2017 All Rights Reserved.
+Licensed under the Apache License, Version 2.0 (the "License");
+
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+
+
+GMSM包含以下主要功能
+
+ SM2: 国密椭圆曲线算法库
+ . 支持Generate Key, Sign, Verify基础操作
+ . 支持加密和不加密的pem文件格式(加密方法参见RFC5958, 具体实现参加代码)
+ . 支持证书的生成,证书的读写(接口兼容rsa和ecdsa的证书)
+ . 支持证书链的操作(接口兼容rsa和ecdsa)
+ . 支持crypto.Signer接口
+
+ SM3: 国密hash算法库
+ . 支持基础的sm3Sum操作
+ . 支持hash.Hash接口
+
+ SM4: 国密分组密码算法库
+ . 支持Generate Key, Encrypt, Decrypt基础操作
+ . 提供Cipher.Block接口
+ . 支持加密和不加密的pem文件格式(加密方法为pem block加密, 具体函数为x509.EncryptPEMBlock)
+
+关于GMSM交流: [![Join the chat at https://gitter.im/tjfoc/gmsm](https://badges.gitter.im/tjfoc/gmsm.svg)](https://gitter.im/tjfoc/gmsm?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
diff --git a/vendor/github.com/tjfoc/gmsm/sm4/sm4.go b/vendor/github.com/tjfoc/gmsm/sm4/sm4.go
new file mode 100644
index 0000000..1742933
--- /dev/null
+++ b/vendor/github.com/tjfoc/gmsm/sm4/sm4.go
@@ -0,0 +1,342 @@
+/*
+Copyright Suzhou Tongji Fintech Research Institute 2017 All Rights Reserved.
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+sm4 acceration
+modified by Jack, 2017 Oct
+*/
+
+package sm4
+
+import (
+ "crypto/cipher"
+ "crypto/rand"
+ "crypto/x509"
+ "encoding/pem"
+ "errors"
+ "io/ioutil"
+ "os"
+ "strconv"
+)
+
+const BlockSize = 16
+
+type SM4Key []byte
+
+type KeySizeError int
+
+// Cipher is an instance of SM4 encryption.
+type Sm4Cipher struct {
+ subkeys []uint32
+ block1 []uint32
+ block2 []byte
+}
+
+// sm4密钥参量
+var fk = [4]uint32{
+ 0xa3b1bac6, 0x56aa3350, 0x677d9197, 0xb27022dc,
+}
+
+// sm4密钥参量
+var ck = [32]uint32{
+ 0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,
+ 0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,
+ 0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249,
+ 0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9,
+ 0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229,
+ 0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299,
+ 0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209,
+ 0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279,
+}
+
+// sm4密钥参量
+var sbox = [256]uint8{
+ 0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 0xb6, 0x14, 0xc2, 0x28, 0xfb, 0x2c, 0x05,
+ 0x2b, 0x67, 0x9a, 0x76, 0x2a, 0xbe, 0x04, 0xc3, 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99,
+ 0x9c, 0x42, 0x50, 0xf4, 0x91, 0xef, 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62,
+ 0xe4, 0xb3, 0x1c, 0xa9, 0xc9, 0x08, 0xe8, 0x95, 0x80, 0xdf, 0x94, 0xfa, 0x75, 0x8f, 0x3f, 0xa6,
+ 0x47, 0x07, 0xa7, 0xfc, 0xf3, 0x73, 0x17, 0xba, 0x83, 0x59, 0x3c, 0x19, 0xe6, 0x85, 0x4f, 0xa8,
+ 0x68, 0x6b, 0x81, 0xb2, 0x71, 0x64, 0xda, 0x8b, 0xf8, 0xeb, 0x0f, 0x4b, 0x70, 0x56, 0x9d, 0x35,
+ 0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, 0xd1, 0xa2, 0x25, 0x22, 0x7c, 0x3b, 0x01, 0x21, 0x78, 0x87,
+ 0xd4, 0x00, 0x46, 0x57, 0x9f, 0xd3, 0x27, 0x52, 0x4c, 0x36, 0x02, 0xe7, 0xa0, 0xc4, 0xc8, 0x9e,
+ 0xea, 0xbf, 0x8a, 0xd2, 0x40, 0xc7, 0x38, 0xb5, 0xa3, 0xf7, 0xf2, 0xce, 0xf9, 0x61, 0x15, 0xa1,
+ 0xe0, 0xae, 0x5d, 0xa4, 0x9b, 0x34, 0x1a, 0x55, 0xad, 0x93, 0x32, 0x30, 0xf5, 0x8c, 0xb1, 0xe3,
+ 0x1d, 0xf6, 0xe2, 0x2e, 0x82, 0x66, 0xca, 0x60, 0xc0, 0x29, 0x23, 0xab, 0x0d, 0x53, 0x4e, 0x6f,
+ 0xd5, 0xdb, 0x37, 0x45, 0xde, 0xfd, 0x8e, 0x2f, 0x03, 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b, 0x51,
+ 0x8d, 0x1b, 0xaf, 0x92, 0xbb, 0xdd, 0xbc, 0x7f, 0x11, 0xd9, 0x5c, 0x41, 0x1f, 0x10, 0x5a, 0xd8,
+ 0x0a, 0xc1, 0x31, 0x88, 0xa5, 0xcd, 0x7b, 0xbd, 0x2d, 0x74, 0xd0, 0x12, 0xb8, 0xe5, 0xb4, 0xb0,
+ 0x89, 0x69, 0x97, 0x4a, 0x0c, 0x96, 0x77, 0x7e, 0x65, 0xb9, 0xf1, 0x09, 0xc5, 0x6e, 0xc6, 0x84,
+ 0x18, 0xf0, 0x7d, 0xec, 0x3a, 0xdc, 0x4d, 0x20, 0x79, 0xee, 0x5f, 0x3e, 0xd7, 0xcb, 0x39, 0x48,
+}
+
+var sbox0 = [256]uint32{
+ 0xd55b5b8e, 0x924242d0, 0xeaa7a74d, 0xfdfbfb06, 0xcf3333fc, 0xe2878765, 0x3df4f4c9, 0xb5dede6b, 0x1658584e, 0xb4dada6e, 0x14505044, 0xc10b0bca, 0x28a0a088, 0xf8efef17, 0x2cb0b09c, 0x05141411,
+ 0x2bacac87, 0x669d9dfb, 0x986a6af2, 0x77d9d9ae, 0x2aa8a882, 0xbcfafa46, 0x04101014, 0xc00f0fcf, 0xa8aaaa02, 0x45111154, 0x134c4c5f, 0x269898be, 0x4825256d, 0x841a1a9e, 0x0618181e, 0x9b6666fd,
+ 0x9e7272ec, 0x4309094a, 0x51414110, 0xf7d3d324, 0x934646d5, 0xecbfbf53, 0x9a6262f8, 0x7be9e992, 0x33ccccff, 0x55515104, 0x0b2c2c27, 0x420d0d4f, 0xeeb7b759, 0xcc3f3ff3, 0xaeb2b21c, 0x638989ea,
+ 0xe7939374, 0xb1cece7f, 0x1c70706c, 0xaba6a60d, 0xca2727ed, 0x08202028, 0xeba3a348, 0x975656c1, 0x82020280, 0xdc7f7fa3, 0x965252c4, 0xf9ebeb12, 0x74d5d5a1, 0x8d3e3eb3, 0x3ffcfcc3, 0xa49a9a3e,
+ 0x461d1d5b, 0x071c1c1b, 0xa59e9e3b, 0xfff3f30c, 0xf0cfcf3f, 0x72cdcdbf, 0x175c5c4b, 0xb8eaea52, 0x810e0e8f, 0x5865653d, 0x3cf0f0cc, 0x1964647d, 0xe59b9b7e, 0x87161691, 0x4e3d3d73, 0xaaa2a208,
+ 0x69a1a1c8, 0x6aadadc7, 0x83060685, 0xb0caca7a, 0x70c5c5b5, 0x659191f4, 0xd96b6bb2, 0x892e2ea7, 0xfbe3e318, 0xe8afaf47, 0x0f3c3c33, 0x4a2d2d67, 0x71c1c1b0, 0x5759590e, 0x9f7676e9, 0x35d4d4e1,
+ 0x1e787866, 0x249090b4, 0x0e383836, 0x5f797926, 0x628d8def, 0x59616138, 0xd2474795, 0xa08a8a2a, 0x259494b1, 0x228888aa, 0x7df1f18c, 0x3bececd7, 0x01040405, 0x218484a5, 0x79e1e198, 0x851e1e9b,
+ 0xd7535384, 0x00000000, 0x4719195e, 0x565d5d0b, 0x9d7e7ee3, 0xd04f4f9f, 0x279c9cbb, 0x5349491a, 0x4d31317c, 0x36d8d8ee, 0x0208080a, 0xe49f9f7b, 0xa2828220, 0xc71313d4, 0xcb2323e8, 0x9c7a7ae6,
+ 0xe9abab42, 0xbdfefe43, 0x882a2aa2, 0xd14b4b9a, 0x41010140, 0xc41f1fdb, 0x38e0e0d8, 0xb7d6d661, 0xa18e8e2f, 0xf4dfdf2b, 0xf1cbcb3a, 0xcd3b3bf6, 0xfae7e71d, 0x608585e5, 0x15545441, 0xa3868625,
+ 0xe3838360, 0xacbaba16, 0x5c757529, 0xa6929234, 0x996e6ef7, 0x34d0d0e4, 0x1a686872, 0x54555501, 0xafb6b619, 0x914e4edf, 0x32c8c8fa, 0x30c0c0f0, 0xf6d7d721, 0x8e3232bc, 0xb3c6c675, 0xe08f8f6f,
+ 0x1d747469, 0xf5dbdb2e, 0xe18b8b6a, 0x2eb8b896, 0x800a0a8a, 0x679999fe, 0xc92b2be2, 0x618181e0, 0xc30303c0, 0x29a4a48d, 0x238c8caf, 0xa9aeae07, 0x0d343439, 0x524d4d1f, 0x4f393976, 0x6ebdbdd3,
+ 0xd6575781, 0xd86f6fb7, 0x37dcdceb, 0x44151551, 0xdd7b7ba6, 0xfef7f709, 0x8c3a3ab6, 0x2fbcbc93, 0x030c0c0f, 0xfcffff03, 0x6ba9a9c2, 0x73c9c9ba, 0x6cb5b5d9, 0x6db1b1dc, 0x5a6d6d37, 0x50454515,
+ 0x8f3636b9, 0x1b6c6c77, 0xadbebe13, 0x904a4ada, 0xb9eeee57, 0xde7777a9, 0xbef2f24c, 0x7efdfd83, 0x11444455, 0xda6767bd, 0x5d71712c, 0x40050545, 0x1f7c7c63, 0x10404050, 0x5b696932, 0xdb6363b8,
+ 0x0a282822, 0xc20707c5, 0x31c4c4f5, 0x8a2222a8, 0xa7969631, 0xce3737f9, 0x7aeded97, 0xbff6f649, 0x2db4b499, 0x75d1d1a4, 0xd3434390, 0x1248485a, 0xbae2e258, 0xe6979771, 0xb6d2d264, 0xb2c2c270,
+ 0x8b2626ad, 0x68a5a5cd, 0x955e5ecb, 0x4b292962, 0x0c30303c, 0x945a5ace, 0x76ddddab, 0x7ff9f986, 0x649595f1, 0xbbe6e65d, 0xf2c7c735, 0x0924242d, 0xc61717d1, 0x6fb9b9d6, 0xc51b1bde, 0x86121294,
+ 0x18606078, 0xf3c3c330, 0x7cf5f589, 0xefb3b35c, 0x3ae8e8d2, 0xdf7373ac, 0x4c353579, 0x208080a0, 0x78e5e59d, 0xedbbbb56, 0x5e7d7d23, 0x3ef8f8c6, 0xd45f5f8b, 0xc82f2fe7, 0x39e4e4dd, 0x49212168,
+}
+
+var sbox1 = [256]uint32{
+ 0x5b5b8ed5, 0x4242d092, 0xa7a74dea, 0xfbfb06fd, 0x3333fccf, 0x878765e2, 0xf4f4c93d, 0xdede6bb5, 0x58584e16, 0xdada6eb4, 0x50504414, 0x0b0bcac1, 0xa0a08828, 0xefef17f8, 0xb0b09c2c, 0x14141105,
+ 0xacac872b, 0x9d9dfb66, 0x6a6af298, 0xd9d9ae77, 0xa8a8822a, 0xfafa46bc, 0x10101404, 0x0f0fcfc0, 0xaaaa02a8, 0x11115445, 0x4c4c5f13, 0x9898be26, 0x25256d48, 0x1a1a9e84, 0x18181e06, 0x6666fd9b,
+ 0x7272ec9e, 0x09094a43, 0x41411051, 0xd3d324f7, 0x4646d593, 0xbfbf53ec, 0x6262f89a, 0xe9e9927b, 0xccccff33, 0x51510455, 0x2c2c270b, 0x0d0d4f42, 0xb7b759ee, 0x3f3ff3cc, 0xb2b21cae, 0x8989ea63,
+ 0x939374e7, 0xcece7fb1, 0x70706c1c, 0xa6a60dab, 0x2727edca, 0x20202808, 0xa3a348eb, 0x5656c197, 0x02028082, 0x7f7fa3dc, 0x5252c496, 0xebeb12f9, 0xd5d5a174, 0x3e3eb38d, 0xfcfcc33f, 0x9a9a3ea4,
+ 0x1d1d5b46, 0x1c1c1b07, 0x9e9e3ba5, 0xf3f30cff, 0xcfcf3ff0, 0xcdcdbf72, 0x5c5c4b17, 0xeaea52b8, 0x0e0e8f81, 0x65653d58, 0xf0f0cc3c, 0x64647d19, 0x9b9b7ee5, 0x16169187, 0x3d3d734e, 0xa2a208aa,
+ 0xa1a1c869, 0xadadc76a, 0x06068583, 0xcaca7ab0, 0xc5c5b570, 0x9191f465, 0x6b6bb2d9, 0x2e2ea789, 0xe3e318fb, 0xafaf47e8, 0x3c3c330f, 0x2d2d674a, 0xc1c1b071, 0x59590e57, 0x7676e99f, 0xd4d4e135,
+ 0x7878661e, 0x9090b424, 0x3838360e, 0x7979265f, 0x8d8def62, 0x61613859, 0x474795d2, 0x8a8a2aa0, 0x9494b125, 0x8888aa22, 0xf1f18c7d, 0xececd73b, 0x04040501, 0x8484a521, 0xe1e19879, 0x1e1e9b85,
+ 0x535384d7, 0x00000000, 0x19195e47, 0x5d5d0b56, 0x7e7ee39d, 0x4f4f9fd0, 0x9c9cbb27, 0x49491a53, 0x31317c4d, 0xd8d8ee36, 0x08080a02, 0x9f9f7be4, 0x828220a2, 0x1313d4c7, 0x2323e8cb, 0x7a7ae69c,
+ 0xabab42e9, 0xfefe43bd, 0x2a2aa288, 0x4b4b9ad1, 0x01014041, 0x1f1fdbc4, 0xe0e0d838, 0xd6d661b7, 0x8e8e2fa1, 0xdfdf2bf4, 0xcbcb3af1, 0x3b3bf6cd, 0xe7e71dfa, 0x8585e560, 0x54544115, 0x868625a3,
+ 0x838360e3, 0xbaba16ac, 0x7575295c, 0x929234a6, 0x6e6ef799, 0xd0d0e434, 0x6868721a, 0x55550154, 0xb6b619af, 0x4e4edf91, 0xc8c8fa32, 0xc0c0f030, 0xd7d721f6, 0x3232bc8e, 0xc6c675b3, 0x8f8f6fe0,
+ 0x7474691d, 0xdbdb2ef5, 0x8b8b6ae1, 0xb8b8962e, 0x0a0a8a80, 0x9999fe67, 0x2b2be2c9, 0x8181e061, 0x0303c0c3, 0xa4a48d29, 0x8c8caf23, 0xaeae07a9, 0x3434390d, 0x4d4d1f52, 0x3939764f, 0xbdbdd36e,
+ 0x575781d6, 0x6f6fb7d8, 0xdcdceb37, 0x15155144, 0x7b7ba6dd, 0xf7f709fe, 0x3a3ab68c, 0xbcbc932f, 0x0c0c0f03, 0xffff03fc, 0xa9a9c26b, 0xc9c9ba73, 0xb5b5d96c, 0xb1b1dc6d, 0x6d6d375a, 0x45451550,
+ 0x3636b98f, 0x6c6c771b, 0xbebe13ad, 0x4a4ada90, 0xeeee57b9, 0x7777a9de, 0xf2f24cbe, 0xfdfd837e, 0x44445511, 0x6767bdda, 0x71712c5d, 0x05054540, 0x7c7c631f, 0x40405010, 0x6969325b, 0x6363b8db,
+ 0x2828220a, 0x0707c5c2, 0xc4c4f531, 0x2222a88a, 0x969631a7, 0x3737f9ce, 0xeded977a, 0xf6f649bf, 0xb4b4992d, 0xd1d1a475, 0x434390d3, 0x48485a12, 0xe2e258ba, 0x979771e6, 0xd2d264b6, 0xc2c270b2,
+ 0x2626ad8b, 0xa5a5cd68, 0x5e5ecb95, 0x2929624b, 0x30303c0c, 0x5a5ace94, 0xddddab76, 0xf9f9867f, 0x9595f164, 0xe6e65dbb, 0xc7c735f2, 0x24242d09, 0x1717d1c6, 0xb9b9d66f, 0x1b1bdec5, 0x12129486,
+ 0x60607818, 0xc3c330f3, 0xf5f5897c, 0xb3b35cef, 0xe8e8d23a, 0x7373acdf, 0x3535794c, 0x8080a020, 0xe5e59d78, 0xbbbb56ed, 0x7d7d235e, 0xf8f8c63e, 0x5f5f8bd4, 0x2f2fe7c8, 0xe4e4dd39, 0x21216849,
+}
+
+var sbox2 = [256]uint32{
+ 0x5b8ed55b, 0x42d09242, 0xa74deaa7, 0xfb06fdfb, 0x33fccf33, 0x8765e287, 0xf4c93df4, 0xde6bb5de, 0x584e1658, 0xda6eb4da, 0x50441450, 0x0bcac10b, 0xa08828a0, 0xef17f8ef, 0xb09c2cb0, 0x14110514,
+ 0xac872bac, 0x9dfb669d, 0x6af2986a, 0xd9ae77d9, 0xa8822aa8, 0xfa46bcfa, 0x10140410, 0x0fcfc00f, 0xaa02a8aa, 0x11544511, 0x4c5f134c, 0x98be2698, 0x256d4825, 0x1a9e841a, 0x181e0618, 0x66fd9b66,
+ 0x72ec9e72, 0x094a4309, 0x41105141, 0xd324f7d3, 0x46d59346, 0xbf53ecbf, 0x62f89a62, 0xe9927be9, 0xccff33cc, 0x51045551, 0x2c270b2c, 0x0d4f420d, 0xb759eeb7, 0x3ff3cc3f, 0xb21caeb2, 0x89ea6389,
+ 0x9374e793, 0xce7fb1ce, 0x706c1c70, 0xa60daba6, 0x27edca27, 0x20280820, 0xa348eba3, 0x56c19756, 0x02808202, 0x7fa3dc7f, 0x52c49652, 0xeb12f9eb, 0xd5a174d5, 0x3eb38d3e, 0xfcc33ffc, 0x9a3ea49a,
+ 0x1d5b461d, 0x1c1b071c, 0x9e3ba59e, 0xf30cfff3, 0xcf3ff0cf, 0xcdbf72cd, 0x5c4b175c, 0xea52b8ea, 0x0e8f810e, 0x653d5865, 0xf0cc3cf0, 0x647d1964, 0x9b7ee59b, 0x16918716, 0x3d734e3d, 0xa208aaa2,
+ 0xa1c869a1, 0xadc76aad, 0x06858306, 0xca7ab0ca, 0xc5b570c5, 0x91f46591, 0x6bb2d96b, 0x2ea7892e, 0xe318fbe3, 0xaf47e8af, 0x3c330f3c, 0x2d674a2d, 0xc1b071c1, 0x590e5759, 0x76e99f76, 0xd4e135d4,
+ 0x78661e78, 0x90b42490, 0x38360e38, 0x79265f79, 0x8def628d, 0x61385961, 0x4795d247, 0x8a2aa08a, 0x94b12594, 0x88aa2288, 0xf18c7df1, 0xecd73bec, 0x04050104, 0x84a52184, 0xe19879e1, 0x1e9b851e,
+ 0x5384d753, 0x00000000, 0x195e4719, 0x5d0b565d, 0x7ee39d7e, 0x4f9fd04f, 0x9cbb279c, 0x491a5349, 0x317c4d31, 0xd8ee36d8, 0x080a0208, 0x9f7be49f, 0x8220a282, 0x13d4c713, 0x23e8cb23, 0x7ae69c7a,
+ 0xab42e9ab, 0xfe43bdfe, 0x2aa2882a, 0x4b9ad14b, 0x01404101, 0x1fdbc41f, 0xe0d838e0, 0xd661b7d6, 0x8e2fa18e, 0xdf2bf4df, 0xcb3af1cb, 0x3bf6cd3b, 0xe71dfae7, 0x85e56085, 0x54411554, 0x8625a386,
+ 0x8360e383, 0xba16acba, 0x75295c75, 0x9234a692, 0x6ef7996e, 0xd0e434d0, 0x68721a68, 0x55015455, 0xb619afb6, 0x4edf914e, 0xc8fa32c8, 0xc0f030c0, 0xd721f6d7, 0x32bc8e32, 0xc675b3c6, 0x8f6fe08f,
+ 0x74691d74, 0xdb2ef5db, 0x8b6ae18b, 0xb8962eb8, 0x0a8a800a, 0x99fe6799, 0x2be2c92b, 0x81e06181, 0x03c0c303, 0xa48d29a4, 0x8caf238c, 0xae07a9ae, 0x34390d34, 0x4d1f524d, 0x39764f39, 0xbdd36ebd,
+ 0x5781d657, 0x6fb7d86f, 0xdceb37dc, 0x15514415, 0x7ba6dd7b, 0xf709fef7, 0x3ab68c3a, 0xbc932fbc, 0x0c0f030c, 0xff03fcff, 0xa9c26ba9, 0xc9ba73c9, 0xb5d96cb5, 0xb1dc6db1, 0x6d375a6d, 0x45155045,
+ 0x36b98f36, 0x6c771b6c, 0xbe13adbe, 0x4ada904a, 0xee57b9ee, 0x77a9de77, 0xf24cbef2, 0xfd837efd, 0x44551144, 0x67bdda67, 0x712c5d71, 0x05454005, 0x7c631f7c, 0x40501040, 0x69325b69, 0x63b8db63,
+ 0x28220a28, 0x07c5c207, 0xc4f531c4, 0x22a88a22, 0x9631a796, 0x37f9ce37, 0xed977aed, 0xf649bff6, 0xb4992db4, 0xd1a475d1, 0x4390d343, 0x485a1248, 0xe258bae2, 0x9771e697, 0xd264b6d2, 0xc270b2c2,
+ 0x26ad8b26, 0xa5cd68a5, 0x5ecb955e, 0x29624b29, 0x303c0c30, 0x5ace945a, 0xddab76dd, 0xf9867ff9, 0x95f16495, 0xe65dbbe6, 0xc735f2c7, 0x242d0924, 0x17d1c617, 0xb9d66fb9, 0x1bdec51b, 0x12948612,
+ 0x60781860, 0xc330f3c3, 0xf5897cf5, 0xb35cefb3, 0xe8d23ae8, 0x73acdf73, 0x35794c35, 0x80a02080, 0xe59d78e5, 0xbb56edbb, 0x7d235e7d, 0xf8c63ef8, 0x5f8bd45f, 0x2fe7c82f, 0xe4dd39e4, 0x21684921,
+}
+
+var sbox3 = [256]uint32{
+ 0x8ed55b5b, 0xd0924242, 0x4deaa7a7, 0x06fdfbfb, 0xfccf3333, 0x65e28787, 0xc93df4f4, 0x6bb5dede, 0x4e165858, 0x6eb4dada, 0x44145050, 0xcac10b0b, 0x8828a0a0, 0x17f8efef, 0x9c2cb0b0, 0x11051414,
+ 0x872bacac, 0xfb669d9d, 0xf2986a6a, 0xae77d9d9, 0x822aa8a8, 0x46bcfafa, 0x14041010, 0xcfc00f0f, 0x02a8aaaa, 0x54451111, 0x5f134c4c, 0xbe269898, 0x6d482525, 0x9e841a1a, 0x1e061818, 0xfd9b6666,
+ 0xec9e7272, 0x4a430909, 0x10514141, 0x24f7d3d3, 0xd5934646, 0x53ecbfbf, 0xf89a6262, 0x927be9e9, 0xff33cccc, 0x04555151, 0x270b2c2c, 0x4f420d0d, 0x59eeb7b7, 0xf3cc3f3f, 0x1caeb2b2, 0xea638989,
+ 0x74e79393, 0x7fb1cece, 0x6c1c7070, 0x0daba6a6, 0xedca2727, 0x28082020, 0x48eba3a3, 0xc1975656, 0x80820202, 0xa3dc7f7f, 0xc4965252, 0x12f9ebeb, 0xa174d5d5, 0xb38d3e3e, 0xc33ffcfc, 0x3ea49a9a,
+ 0x5b461d1d, 0x1b071c1c, 0x3ba59e9e, 0x0cfff3f3, 0x3ff0cfcf, 0xbf72cdcd, 0x4b175c5c, 0x52b8eaea, 0x8f810e0e, 0x3d586565, 0xcc3cf0f0, 0x7d196464, 0x7ee59b9b, 0x91871616, 0x734e3d3d, 0x08aaa2a2,
+ 0xc869a1a1, 0xc76aadad, 0x85830606, 0x7ab0caca, 0xb570c5c5, 0xf4659191, 0xb2d96b6b, 0xa7892e2e, 0x18fbe3e3, 0x47e8afaf, 0x330f3c3c, 0x674a2d2d, 0xb071c1c1, 0x0e575959, 0xe99f7676, 0xe135d4d4,
+ 0x661e7878, 0xb4249090, 0x360e3838, 0x265f7979, 0xef628d8d, 0x38596161, 0x95d24747, 0x2aa08a8a, 0xb1259494, 0xaa228888, 0x8c7df1f1, 0xd73becec, 0x05010404, 0xa5218484, 0x9879e1e1, 0x9b851e1e,
+ 0x84d75353, 0x00000000, 0x5e471919, 0x0b565d5d, 0xe39d7e7e, 0x9fd04f4f, 0xbb279c9c, 0x1a534949, 0x7c4d3131, 0xee36d8d8, 0x0a020808, 0x7be49f9f, 0x20a28282, 0xd4c71313, 0xe8cb2323, 0xe69c7a7a,
+ 0x42e9abab, 0x43bdfefe, 0xa2882a2a, 0x9ad14b4b, 0x40410101, 0xdbc41f1f, 0xd838e0e0, 0x61b7d6d6, 0x2fa18e8e, 0x2bf4dfdf, 0x3af1cbcb, 0xf6cd3b3b, 0x1dfae7e7, 0xe5608585, 0x41155454, 0x25a38686,
+ 0x60e38383, 0x16acbaba, 0x295c7575, 0x34a69292, 0xf7996e6e, 0xe434d0d0, 0x721a6868, 0x01545555, 0x19afb6b6, 0xdf914e4e, 0xfa32c8c8, 0xf030c0c0, 0x21f6d7d7, 0xbc8e3232, 0x75b3c6c6, 0x6fe08f8f,
+ 0x691d7474, 0x2ef5dbdb, 0x6ae18b8b, 0x962eb8b8, 0x8a800a0a, 0xfe679999, 0xe2c92b2b, 0xe0618181, 0xc0c30303, 0x8d29a4a4, 0xaf238c8c, 0x07a9aeae, 0x390d3434, 0x1f524d4d, 0x764f3939, 0xd36ebdbd,
+ 0x81d65757, 0xb7d86f6f, 0xeb37dcdc, 0x51441515, 0xa6dd7b7b, 0x09fef7f7, 0xb68c3a3a, 0x932fbcbc, 0x0f030c0c, 0x03fcffff, 0xc26ba9a9, 0xba73c9c9, 0xd96cb5b5, 0xdc6db1b1, 0x375a6d6d, 0x15504545,
+ 0xb98f3636, 0x771b6c6c, 0x13adbebe, 0xda904a4a, 0x57b9eeee, 0xa9de7777, 0x4cbef2f2, 0x837efdfd, 0x55114444, 0xbdda6767, 0x2c5d7171, 0x45400505, 0x631f7c7c, 0x50104040, 0x325b6969, 0xb8db6363,
+ 0x220a2828, 0xc5c20707, 0xf531c4c4, 0xa88a2222, 0x31a79696, 0xf9ce3737, 0x977aeded, 0x49bff6f6, 0x992db4b4, 0xa475d1d1, 0x90d34343, 0x5a124848, 0x58bae2e2, 0x71e69797, 0x64b6d2d2, 0x70b2c2c2,
+ 0xad8b2626, 0xcd68a5a5, 0xcb955e5e, 0x624b2929, 0x3c0c3030, 0xce945a5a, 0xab76dddd, 0x867ff9f9, 0xf1649595, 0x5dbbe6e6, 0x35f2c7c7, 0x2d092424, 0xd1c61717, 0xd66fb9b9, 0xdec51b1b, 0x94861212,
+ 0x78186060, 0x30f3c3c3, 0x897cf5f5, 0x5cefb3b3, 0xd23ae8e8, 0xacdf7373, 0x794c3535, 0xa0208080, 0x9d78e5e5, 0x56edbbbb, 0x235e7d7d, 0xc63ef8f8, 0x8bd45f5f, 0xe7c82f2f, 0xdd39e4e4, 0x68492121,
+}
+
+func rl(x uint32, i uint8) uint32 { return (x << (i % 32)) | (x >> (32 - (i % 32))) }
+
+func l0(b uint32) uint32 { return b ^ rl(b, 13) ^ rl(b, 23) }
+
+func feistel0(x0, x1, x2, x3, rk uint32) uint32 { return x0 ^ l0(p(x1^x2^x3^rk)) }
+
+//非线性变换τ(.)
+func p(a uint32) uint32 {
+ return (uint32(sbox[a>>24]) << 24) ^ (uint32(sbox[(a>>16)&0xff]) << 16) ^ (uint32(sbox[(a>>8)&0xff]) << 8) ^ uint32(sbox[(a)&0xff])
+}
+
+func permuteInitialBlock(b []uint32, block []byte) {
+ for i := 0; i < 4; i++ {
+ b[i] = (uint32(block[i*4]) << 24) | (uint32(block[i*4+1]) << 16) |
+ (uint32(block[i*4+2]) << 8) | (uint32(block[i*4+3]))
+ }
+}
+
+func permuteFinalBlock(b []byte, block []uint32) {
+ for i := 0; i < 4; i++ {
+ b[i*4] = uint8(block[i] >> 24)
+ b[i*4+1] = uint8(block[i] >> 16)
+ b[i*4+2] = uint8(block[i] >> 8)
+ b[i*4+3] = uint8(block[i])
+ }
+}
+
+//修改后的加密核心函数
+func cryptBlock(subkeys []uint32, b []uint32, r []byte, dst, src []byte, decrypt bool) {
+ var x uint32
+ permuteInitialBlock(b, src)
+ if decrypt {
+ for i := 0; i < 8; i++ {
+ x = b[1] ^ b[2] ^ b[3] ^ subkeys[31-4*i]
+ b[0] = b[0] ^ sbox0[x&0xff] ^ sbox1[(x>>8)&0xff] ^ sbox2[(x>>16)&0xff] ^ sbox3[(x>>24)&0xff]
+ x = b[0] ^ b[2] ^ b[3] ^ subkeys[31-4*i-1]
+ b[1] = b[1] ^ sbox0[x&0xff] ^ sbox1[(x>>8)&0xff] ^ sbox2[(x>>16)&0xff] ^ sbox3[(x>>24)&0xff]
+ x = b[0] ^ b[1] ^ b[3] ^ subkeys[31-4*i-2]
+ b[2] = b[2] ^ sbox0[x&0xff] ^ sbox1[(x>>8)&0xff] ^ sbox2[(x>>16)&0xff] ^ sbox3[(x>>24)&0xff]
+ x = b[1] ^ b[2] ^ b[0] ^ subkeys[31-4*i-3]
+ b[3] = b[3] ^ sbox0[x&0xff] ^ sbox1[(x>>8)&0xff] ^ sbox2[(x>>16)&0xff] ^ sbox3[(x>>24)&0xff]
+ }
+ } else {
+ for i := 0; i < 8; i++ {
+ x = b[1] ^ b[2] ^ b[3] ^ subkeys[4*i]
+ b[0] = b[0] ^ sbox0[x&0xff] ^ sbox1[(x>>8)&0xff] ^ sbox2[(x>>16)&0xff] ^ sbox3[(x>>24)&0xff]
+ x = b[0] ^ b[2] ^ b[3] ^ subkeys[4*i+1]
+ b[1] = b[1] ^ sbox0[x&0xff] ^ sbox1[(x>>8)&0xff] ^ sbox2[(x>>16)&0xff] ^ sbox3[(x>>24)&0xff]
+ x = b[0] ^ b[1] ^ b[3] ^ subkeys[4*i+2]
+ b[2] = b[2] ^ sbox0[x&0xff] ^ sbox1[(x>>8)&0xff] ^ sbox2[(x>>16)&0xff] ^ sbox3[(x>>24)&0xff]
+ x = b[1] ^ b[2] ^ b[0] ^ subkeys[4*i+3]
+ b[3] = b[3] ^ sbox0[x&0xff] ^ sbox1[(x>>8)&0xff] ^ sbox2[(x>>16)&0xff] ^ sbox3[(x>>24)&0xff]
+ }
+ }
+ b[0], b[1], b[2], b[3] = b[3], b[2], b[1], b[0]
+ permuteFinalBlock(r, b)
+ copy(dst, r)
+}
+
+func generateSubKeys(key []byte) []uint32 {
+ subkeys := make([]uint32, 32)
+ b := make([]uint32, 4)
+ permuteInitialBlock(b, key)
+ b[0] ^= fk[0]
+ b[1] ^= fk[1]
+ b[2] ^= fk[2]
+ b[3] ^= fk[3]
+ for i := 0; i < 32; i++ {
+ subkeys[i] = feistel0(b[0], b[1], b[2], b[3], ck[i])
+ b[0], b[1], b[2], b[3] = b[1], b[2], b[3], subkeys[i]
+ }
+ return subkeys
+}
+
+func EncryptBlock(key SM4Key, dst, src []byte) {
+ subkeys := generateSubKeys(key)
+ cryptBlock(subkeys, make([]uint32, 4), make([]byte, 16), dst, src, false)
+}
+
+func DecryptBlock(key SM4Key, dst, src []byte) {
+ subkeys := generateSubKeys(key)
+ cryptBlock(subkeys, make([]uint32, 4), make([]byte, 16), dst, src, true)
+}
+
+func ReadKeyFromMem(data []byte, pwd []byte) (SM4Key, error) {
+ block, _ := pem.Decode(data)
+ if x509.IsEncryptedPEMBlock(block) {
+ if block.Type != "SM4 ENCRYPTED KEY" {
+ return nil, errors.New("SM4: unknown type")
+ }
+ if pwd == nil {
+ return nil, errors.New("SM4: need passwd")
+ }
+ data, err := x509.DecryptPEMBlock(block, pwd)
+ if err != nil {
+ return nil, err
+ }
+ return data, nil
+ }
+ if block.Type != "SM4 KEY" {
+ return nil, errors.New("SM4: unknown type")
+ }
+ return block.Bytes, nil
+}
+
+func ReadKeyFromPem(FileName string, pwd []byte) (SM4Key, error) {
+ data, err := ioutil.ReadFile(FileName)
+ if err != nil {
+ return nil, err
+ }
+ return ReadKeyFromMem(data, pwd)
+}
+
+func WriteKeytoMem(key SM4Key, pwd []byte) ([]byte, error) {
+ if pwd != nil {
+ block, err := x509.EncryptPEMBlock(rand.Reader,
+ "SM4 ENCRYPTED KEY", key, pwd, x509.PEMCipherAES256)
+ if err != nil {
+ return nil, err
+ }
+ return pem.EncodeToMemory(block), nil
+ } else {
+ block := &pem.Block{
+ Type: "SM4 KEY",
+ Bytes: key,
+ }
+ return pem.EncodeToMemory(block), nil
+ }
+}
+
+func WriteKeyToPem(FileName string, key SM4Key, pwd []byte) (bool, error) {
+ var block *pem.Block
+
+ if pwd != nil {
+ var err error
+ block, err = x509.EncryptPEMBlock(rand.Reader,
+ "SM4 ENCRYPTED KEY", key, pwd, x509.PEMCipherAES256)
+ if err != nil {
+ return false, err
+ }
+ } else {
+ block = &pem.Block{
+ Type: "SM4 KEY",
+ Bytes: key,
+ }
+ }
+ file, err := os.Create(FileName)
+ if err != nil {
+ return false, err
+ }
+ defer file.Close()
+ err = pem.Encode(file, block)
+ if err != nil {
+ return false, nil
+ }
+ return true, nil
+}
+
+func (k KeySizeError) Error() string {
+ return "SM4: invalid key size " + strconv.Itoa(int(k))
+}
+
+// NewCipher creates and returns a new cipher.Block.
+func NewCipher(key []byte) (cipher.Block, error) {
+ if len(key) != BlockSize {
+ return nil, KeySizeError(len(key))
+ }
+ c := new(Sm4Cipher)
+ c.subkeys = generateSubKeys(key)
+ c.block1 = make([]uint32, 4)
+ c.block2 = make([]byte, 16)
+ return c, nil
+}
+
+func (c *Sm4Cipher) BlockSize() int {
+ return BlockSize
+}
+
+func (c *Sm4Cipher) Encrypt(dst, src []byte) {
+ cryptBlock(c.subkeys, c.block1, c.block2, dst, src, false)
+}
+
+func (c *Sm4Cipher) Decrypt(dst, src []byte) {
+ cryptBlock(c.subkeys, c.block1, c.block2, dst, src, true)
+}
diff --git a/vendor/github.com/tjfoc/gmsm/sm4/sm4_test.go b/vendor/github.com/tjfoc/gmsm/sm4/sm4_test.go
new file mode 100644
index 0000000..7377993
--- /dev/null
+++ b/vendor/github.com/tjfoc/gmsm/sm4/sm4_test.go
@@ -0,0 +1,102 @@
+/*
+Copyright Suzhou Tongji Fintech Research Institute 2017 All Rights Reserved.
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package sm4
+
+import (
+ "fmt"
+ "log"
+ "reflect"
+ "testing"
+)
+
+func TestSM4(t *testing.T) {
+ key := []byte("1234567890abcdef")
+ fmt.Printf("key = %v\n", key)
+ data := []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10}
+ WriteKeyToPem("key.pem", key, nil)
+ key, err := ReadKeyFromPem("key.pem", nil)
+ fmt.Printf("key = %v\n", key)
+ if err != nil {
+ log.Fatal(err)
+ }
+ fmt.Printf("data = %x\n", data)
+ c, err := NewCipher(key)
+ if err != nil {
+ log.Fatal(err)
+ }
+ d0 := make([]byte, 16)
+ c.Encrypt(d0, data)
+ fmt.Printf("d0 = %x\n", d0)
+ d1 := make([]byte, 16)
+ c.Decrypt(d1, d0)
+ fmt.Printf("d1 = %x\n", d1)
+ if sa := testCompare(data, d1); sa != true {
+ fmt.Printf("Error data!")
+ }
+}
+
+func BenchmarkSM4(t *testing.B) {
+ t.ReportAllocs()
+ key := []byte("1234567890abcdef")
+ data := []byte{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10}
+ WriteKeyToPem("key.pem", key, nil)
+ key, err := ReadKeyFromPem("key.pem", nil)
+ if err != nil {
+ log.Fatal(err)
+ }
+ c, err := NewCipher(key)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ for i := 0; i < t.N; i++ {
+ d0 := make([]byte, 16)
+ c.Encrypt(d0, data)
+ d1 := make([]byte, 16)
+ c.Decrypt(d1, d0)
+ }
+}
+
+func TestErrKeyLen(t *testing.T) {
+ fmt.Printf("\n--------------test key len------------------")
+ key := []byte("1234567890abcdefg")
+ _, err := NewCipher(key)
+ if err != nil {
+ fmt.Println("\nError key len !")
+ }
+ key = []byte("1234")
+ _, err = NewCipher(key)
+ if err != nil {
+ fmt.Println("Error key len !")
+ }
+ fmt.Println("------------------end----------------------")
+}
+
+func testCompare(key1, key2 []byte) bool {
+ if len(key1) != len(key2) {
+ return false
+ }
+ for i, v := range key1 {
+ if i == 1 {
+ fmt.Println("type of v", reflect.TypeOf(v))
+ }
+ a := key2[i]
+ if a != v {
+ return false
+ }
+ }
+ return true
+}
diff --git a/vendor/github.com/xtaci/kcp-go/README.md b/vendor/github.com/xtaci/kcp-go/README.md
index b4fa5bc..a3df46c 100644
--- a/vendor/github.com/xtaci/kcp-go/README.md
+++ b/vendor/github.com/xtaci/kcp-go/README.md
@@ -169,4 +169,4 @@ A: A standalone `agent` or `gate` server for kcp-go is suggested, not only for C
1. https://github.com/xtaci/libkcp -- FEC enhanced KCP session library for iOS/Android in C++
2. https://github.com/skywind3000/kcp -- A Fast and Reliable ARQ Protocol
-3. https://github.com/templexxx/reedsolomon -- Reed-Solomon Erasure Coding in Go
+3. https://github.com/klauspost/reedsolomon -- Reed-Solomon Erasure Coding in Go
diff --git a/vendor/github.com/xtaci/kcp-go/blacklist.go b/vendor/github.com/xtaci/kcp-go/blacklist.go
new file mode 100644
index 0000000..1d910af
--- /dev/null
+++ b/vendor/github.com/xtaci/kcp-go/blacklist.go
@@ -0,0 +1,69 @@
+package kcp
+
+import (
+ "sync"
+ "time"
+)
+
+var (
+ // BlacklistDuration sets a duration for which a session is blacklisted
+ // once it's established. This is simillar to TIME_WAIT state in TCP, whereby
+ // any connection attempt with the same session parameters is ignored for
+ // some amount of time.
+ //
+ // This is only useful when dial attempts happen from a pre-determined port,
+ // for example when you are dialing from the same connection you are listening on
+ // to punch through NAT, and helps with the fact that KCP is state-less.
+ // This helps better deal with scenarios where a process on one of the side (A)
+ // get's restarted, and stray packets from other side (B) makes it look like
+ // as if someone is trying to connect to A. Even if session dies on B,
+ // new stray reply packets from A resurrect the session on B, causing the
+ // session to be alive forever.
+ BlacklistDuration time.Duration
+ blacklist = blacklistMap{
+ entries: make(map[sessionKey]time.Time),
+ }
+)
+
+// a global map for blacklisting conversations
+type blacklistMap struct {
+ entries map[sessionKey]time.Time
+ reapAt time.Time
+ mut sync.Mutex
+}
+
+func (m *blacklistMap) add(address string, conv uint32) {
+ if BlacklistDuration == 0 {
+ return
+ }
+ m.mut.Lock()
+ timeout := time.Now().Add(BlacklistDuration)
+ m.entries[sessionKey{
+ addr: address,
+ convID: conv,
+ }] = timeout
+ m.reap()
+ m.mut.Unlock()
+}
+
+func (m *blacklistMap) has(address string, conv uint32) bool {
+ if BlacklistDuration == 0 {
+ return false
+ }
+ m.mut.Lock()
+ t, ok := m.entries[sessionKey{
+ addr: address,
+ convID: conv,
+ }]
+ m.mut.Unlock()
+ return ok && t.After(time.Now())
+}
+
+func (m *blacklistMap) reap() {
+ now := time.Now()
+ for k, t := range m.entries {
+ if t.Before(now) {
+ delete(m.entries, k)
+ }
+ }
+}
diff --git a/vendor/github.com/xtaci/kcp-go/crypt.go b/vendor/github.com/xtaci/kcp-go/crypt.go
index 7f4759b..d9b8af9 100644
--- a/vendor/github.com/xtaci/kcp-go/crypt.go
+++ b/vendor/github.com/xtaci/kcp-go/crypt.go
@@ -7,6 +7,7 @@ import (
"crypto/sha1"
"github.com/templexxx/xor"
+ "github.com/tjfoc/gmsm/sm4"
"golang.org/x/crypto/blowfish"
"golang.org/x/crypto/cast5"
@@ -55,6 +56,28 @@ func (c *salsa20BlockCrypt) Decrypt(dst, src []byte) {
copy(dst[:8], src[:8])
}
+type sm4BlockCrypt struct {
+ encbuf []byte
+ decbuf []byte
+ block cipher.Block
+}
+
+// NewSM4BlockCrypt https://github.com/tjfoc/gmsm/tree/master/sm4
+func NewSM4BlockCrypt(key []byte) (BlockCrypt, error) {
+ c := new(sm4BlockCrypt)
+ block, err := sm4.NewCipher(key)
+ if err != nil {
+ return nil, err
+ }
+ c.block = block
+ c.encbuf = make([]byte, sm4.BlockSize)
+ c.decbuf = make([]byte, 2*sm4.BlockSize)
+ return c, nil
+}
+
+func (c *sm4BlockCrypt) Encrypt(dst, src []byte) { encrypt(c.block, dst, src, c.encbuf) }
+func (c *sm4BlockCrypt) Decrypt(dst, src []byte) { decrypt(c.block, dst, src, c.decbuf) }
+
type twofishBlockCrypt struct {
encbuf []byte
decbuf []byte
diff --git a/vendor/github.com/xtaci/kcp-go/crypt_test.go b/vendor/github.com/xtaci/kcp-go/crypt_test.go
index 68e7bd3..b8f6c1a 100644
--- a/vendor/github.com/xtaci/kcp-go/crypt_test.go
+++ b/vendor/github.com/xtaci/kcp-go/crypt_test.go
@@ -2,12 +2,22 @@ package kcp
import (
"bytes"
+ "crypto/md5"
"crypto/rand"
+ "crypto/sha1"
"hash/crc32"
"io"
"testing"
)
+func TestSM4(t *testing.T) {
+ bc, err := NewSM4BlockCrypt(pass[:16])
+ if err != nil {
+ t.Fatal(err)
+ }
+ cryptTest(t, bc)
+}
+
func TestAES(t *testing.T) {
bc, err := NewAESBlockCrypt(pass[:32])
if err != nil {
@@ -100,6 +110,14 @@ func cryptTest(t *testing.T, bc BlockCrypt) {
}
}
+func BenchmarkSM4(b *testing.B) {
+ bc, err := NewSM4BlockCrypt(pass[:16])
+ if err != nil {
+ b.Fatal(err)
+ }
+ benchCrypt(b, bc)
+}
+
func BenchmarkAES128(b *testing.B) {
bc, err := NewAESBlockCrypt(pass[:16])
if err != nil {
@@ -220,3 +238,39 @@ func BenchmarkCRC32(b *testing.B) {
crc32.ChecksumIEEE(content)
}
}
+
+func BenchmarkCsprngSystem(b *testing.B) {
+ data := make([]byte, md5.Size)
+ b.SetBytes(int64(len(data)))
+
+ for i := 0; i < b.N; i++ {
+ io.ReadFull(rand.Reader, data)
+ }
+}
+
+func BenchmarkCsprngMD5(b *testing.B) {
+ var data [md5.Size]byte
+ b.SetBytes(md5.Size)
+
+ for i := 0; i < b.N; i++ {
+ data = md5.Sum(data[:])
+ }
+}
+func BenchmarkCsprngSHA1(b *testing.B) {
+ var data [sha1.Size]byte
+ b.SetBytes(sha1.Size)
+
+ for i := 0; i < b.N; i++ {
+ data = sha1.Sum(data[:])
+ }
+}
+
+func BenchmarkCsprngMD5AndSystem(b *testing.B) {
+ var ng nonceMD5
+
+ b.SetBytes(md5.Size)
+ data := make([]byte, md5.Size)
+ for i := 0; i < b.N; i++ {
+ ng.Fill(data)
+ }
+}
diff --git a/vendor/github.com/xtaci/kcp-go/fec.go b/vendor/github.com/xtaci/kcp-go/fec.go
index d8826e9..6a12824 100644
--- a/vendor/github.com/xtaci/kcp-go/fec.go
+++ b/vendor/github.com/xtaci/kcp-go/fec.go
@@ -4,7 +4,7 @@ import (
"encoding/binary"
"sync/atomic"
- "github.com/templexxx/reedsolomon"
+ "github.com/klauspost/reedsolomon"
)
const (
@@ -34,6 +34,9 @@ type (
decodeCache [][]byte
flagCache []bool
+ // zeros
+ zeros []byte
+
// RS decoder
codec reedsolomon.Encoder
}
@@ -47,19 +50,20 @@ func newFECDecoder(rxlimit, dataShards, parityShards int) *fecDecoder {
return nil
}
- fec := new(fecDecoder)
- fec.rxlimit = rxlimit
- fec.dataShards = dataShards
- fec.parityShards = parityShards
- fec.shardSize = dataShards + parityShards
- enc, err := reedsolomon.New(dataShards, parityShards)
+ dec := new(fecDecoder)
+ dec.rxlimit = rxlimit
+ dec.dataShards = dataShards
+ dec.parityShards = parityShards
+ dec.shardSize = dataShards + parityShards
+ codec, err := reedsolomon.New(dataShards, parityShards)
if err != nil {
return nil
}
- fec.codec = enc
- fec.decodeCache = make([][]byte, fec.shardSize)
- fec.flagCache = make([]bool, fec.shardSize)
- return fec
+ dec.codec = codec
+ dec.decodeCache = make([][]byte, dec.shardSize)
+ dec.flagCache = make([]bool, dec.shardSize)
+ dec.zeros = make([]byte, mtuLimit)
+ return dec
}
// decodeBytes a fec packet
@@ -154,7 +158,7 @@ func (dec *fecDecoder) decode(pkt fecPacket) (recovered [][]byte) {
if shards[k] != nil {
dlen := len(shards[k])
shards[k] = shards[k][:maxlen]
- xorBytes(shards[k][dlen:], shards[k][dlen:], shards[k][dlen:])
+ copy(shards[k][dlen:], dec.zeros)
}
}
if err := dec.codec.ReconstructData(shards); err == nil {
@@ -209,6 +213,9 @@ type (
shardCache [][]byte
encodeCache [][]byte
+ // zeros
+ zeros []byte
+
// RS encoder
codec reedsolomon.Encoder
}
@@ -218,27 +225,28 @@ func newFECEncoder(dataShards, parityShards, offset int) *fecEncoder {
if dataShards <= 0 || parityShards <= 0 {
return nil
}
- fec := new(fecEncoder)
- fec.dataShards = dataShards
- fec.parityShards = parityShards
- fec.shardSize = dataShards + parityShards
- fec.paws = (0xffffffff/uint32(fec.shardSize) - 1) * uint32(fec.shardSize)
- fec.headerOffset = offset
- fec.payloadOffset = fec.headerOffset + fecHeaderSize
+ enc := new(fecEncoder)
+ enc.dataShards = dataShards
+ enc.parityShards = parityShards
+ enc.shardSize = dataShards + parityShards
+ enc.paws = (0xffffffff/uint32(enc.shardSize) - 1) * uint32(enc.shardSize)
+ enc.headerOffset = offset
+ enc.payloadOffset = enc.headerOffset + fecHeaderSize
- enc, err := reedsolomon.New(dataShards, parityShards)
+ codec, err := reedsolomon.New(dataShards, parityShards)
if err != nil {
return nil
}
- fec.codec = enc
+ enc.codec = codec
// caches
- fec.encodeCache = make([][]byte, fec.shardSize)
- fec.shardCache = make([][]byte, fec.shardSize)
- for k := range fec.shardCache {
- fec.shardCache[k] = make([]byte, mtuLimit)
+ enc.encodeCache = make([][]byte, enc.shardSize)
+ enc.shardCache = make([][]byte, enc.shardSize)
+ for k := range enc.shardCache {
+ enc.shardCache[k] = make([]byte, mtuLimit)
}
- return fec
+ enc.zeros = make([]byte, mtuLimit)
+ return enc
}
// encode the packet, output parity shards if we have enough datashards
@@ -264,7 +272,7 @@ func (enc *fecEncoder) encode(b []byte) (ps [][]byte) {
for i := 0; i < enc.dataShards; i++ {
shard := enc.shardCache[i]
slen := len(shard)
- xorBytes(shard[slen:enc.maxSize], shard[slen:enc.maxSize], shard[slen:enc.maxSize])
+ copy(shard[slen:enc.maxSize], enc.zeros)
}
// construct equal-sized slice with stripped header
diff --git a/vendor/github.com/xtaci/kcp-go/kcp.go b/vendor/github.com/xtaci/kcp-go/kcp.go
index b343adf..21cdde1 100644
--- a/vendor/github.com/xtaci/kcp-go/kcp.go
+++ b/vendor/github.com/xtaci/kcp-go/kcp.go
@@ -539,10 +539,11 @@ func (kcp *KCP) Input(data []byte, regular, ackNoDelay bool) int {
if flag == 0 {
flag = 1
maxack = sn
+ lastackts = ts
} else if _itimediff(sn, maxack) > 0 {
maxack = sn
+ lastackts = ts
}
- lastackts = ts
} else if cmd == IKCP_CMD_PUSH {
if _itimediff(sn, kcp.rcv_nxt+kcp.rcv_wnd) < 0 {
kcp.ack_push(sn, ts)
@@ -610,8 +611,6 @@ func (kcp *KCP) Input(data []byte, regular, ackNoDelay bool) int {
if ackNoDelay && len(kcp.acklist) > 0 { // ack immediately
kcp.flush(true)
- } else if kcp.rmt_wnd == 0 && len(kcp.acklist) > 0 { // window zero
- kcp.flush(true)
}
return 0
}
diff --git a/vendor/github.com/xtaci/kcp-go/rand.go b/vendor/github.com/xtaci/kcp-go/rand.go
new file mode 100644
index 0000000..15697fb
--- /dev/null
+++ b/vendor/github.com/xtaci/kcp-go/rand.go
@@ -0,0 +1,25 @@
+package kcp
+
+import (
+ "crypto/md5"
+ "crypto/rand"
+ "io"
+)
+
+// nonceMD5 is a nonce generator for each packet header
+// which took the advantages of both MD5 and CSPRNG(like /dev/urandom).
+// The benchmark shows it's faster than previous CSPRNG only method.
+type nonceMD5 struct {
+ data [md5.Size]byte
+}
+
+// Nonce fills a nonce into the provided slice with no more than md5.Size bytes
+// the entropy will be updated whenever a leading 0 appears
+func (n *nonceMD5) Fill(nonce []byte) {
+ if n.data[0] == 0 { // 1/256 chance for entropy update
+ io.ReadFull(rand.Reader, n.data[:])
+ }
+ n.data = md5.Sum(n.data[:])
+ copy(nonce, n.data[:])
+ return
+}
diff --git a/vendor/github.com/xtaci/kcp-go/sess.go b/vendor/github.com/xtaci/kcp-go/sess.go
index fac3122..f3539f6 100644
--- a/vendor/github.com/xtaci/kcp-go/sess.go
+++ b/vendor/github.com/xtaci/kcp-go/sess.go
@@ -4,7 +4,6 @@ import (
"crypto/rand"
"encoding/binary"
"hash/crc32"
- "io"
"net"
"sync"
"sync/atomic"
@@ -97,6 +96,9 @@ type (
chWriteEvent chan struct{} // notify Write() can be called without blocking
chErrorEvent chan error // notify Read() have an error
+ // nonce generator
+ nonce nonceMD5
+
isClosed bool // flag the session has Closed
mu sync.Mutex
}
@@ -151,6 +153,7 @@ func newUDPSession(conv uint32, dataShards, parityShards int, l *Listener, conn
}
})
sess.kcp.SetMtu(IKCP_MTU_DEF - sess.headerSize)
+ blacklist.add(remote.String(), conv)
// add current session to the global updater,
// which periodically calls sess.update()
@@ -305,7 +308,10 @@ func (s *UDPSession) Close() error {
// remove this session from updater & listener(if necessary)
updater.removeSession(s)
if s.l != nil { // notify listener
- s.l.closeSession(s.remote)
+ s.l.closeSession(sessionKey{
+ addr: s.remote.String(),
+ convID: s.kcp.conv,
+ })
}
s.mu.Lock()
@@ -474,13 +480,13 @@ func (s *UDPSession) output(buf []byte) {
// 2&3. crc32 & encryption
if s.block != nil {
- io.ReadFull(rand.Reader, ext[:nonceSize])
+ s.nonce.Fill(ext[:nonceSize])
checksum := crc32.ChecksumIEEE(ext[cryptHeaderSize:])
binary.LittleEndian.PutUint32(ext[nonceSize:], checksum)
s.block.Encrypt(ext, ext)
for k := range ecc {
- io.ReadFull(rand.Reader, ecc[k][:nonceSize])
+ s.nonce.Fill(ecc[k][:nonceSize])
checksum := crc32.ChecksumIEEE(ecc[k][cryptHeaderSize:])
binary.LittleEndian.PutUint32(ecc[k][nonceSize:], checksum)
s.block.Encrypt(ecc[k], ecc[k])
@@ -658,6 +664,11 @@ func (s *UDPSession) readLoop() {
}
type (
+ sessionKey struct {
+ addr string
+ convID uint32
+ }
+
// Listener defines a server listening for connections
Listener struct {
block BlockCrypt // block encryption
@@ -666,12 +677,12 @@ type (
fecDecoder *fecDecoder // FEC mock initialization
conn net.PacketConn // the underlying packet connection
- sessions map[string]*UDPSession // all sessions accepted by this Listener
- chAccepts chan *UDPSession // Listen() backlog
- chSessionClosed chan net.Addr // session close queue
- headerSize int // the overall header size added before KCP frame
- die chan struct{} // notify the listener has closed
- rd atomic.Value // read deadline for Accept()
+ sessions map[sessionKey]*UDPSession // all sessions accepted by this Listener
+ chAccepts chan *UDPSession // Listen() backlog
+ chSessionClosed chan sessionKey // session close queue
+ headerSize int // the overall header size added before KCP frame
+ die chan struct{} // notify the listener has closed
+ rd atomic.Value // read deadline for Accept()
wd atomic.Value
}
@@ -685,7 +696,7 @@ type (
// monitor incoming data for all connections of server
func (l *Listener) monitor() {
// cache last session
- var lastAddr string
+ var lastKey sessionKey
var lastSession *UDPSession
chPacket := make(chan inPacket, qlen)
@@ -712,49 +723,55 @@ func (l *Listener) monitor() {
}
if dataValid {
- addr := from.String()
- var s *UDPSession
- var ok bool
-
- // packets received from an address always come in batch.
- // cache the session for next packet, without querying map.
- if addr == lastAddr {
- s, ok = lastSession, true
- } else if s, ok = l.sessions[addr]; ok {
- lastSession = s
- lastAddr = addr
- }
-
- if !ok { // new session
- if len(l.chAccepts) < cap(l.chAccepts) { // do not let new session overwhelm accept queue
- var conv uint32
- convValid := false
- if l.fecDecoder != nil {
- isfec := binary.LittleEndian.Uint16(data[4:])
- if isfec == typeData {
- conv = binary.LittleEndian.Uint32(data[fecHeaderSizePlus2:])
- convValid = true
- }
- } else {
- conv = binary.LittleEndian.Uint32(data)
- convValid = true
- }
-
- if convValid {
- s := newUDPSession(conv, l.dataShards, l.parityShards, l, l.conn, from, l.block)
- s.kcpInput(data)
- l.sessions[addr] = s
- l.chAccepts <- s
- }
+ var conv uint32
+ convValid := false
+ if l.fecDecoder != nil {
+ isfec := binary.LittleEndian.Uint16(data[4:])
+ if isfec == typeData {
+ conv = binary.LittleEndian.Uint32(data[fecHeaderSizePlus2:])
+ convValid = true
}
} else {
- s.kcpInput(data)
+ conv = binary.LittleEndian.Uint32(data)
+ convValid = true
+ }
+
+ if convValid {
+ key := sessionKey{
+ addr: from.String(),
+ convID: conv,
+ }
+ var s *UDPSession
+ var ok bool
+
+ // packets received from an address always come in batch.
+ // cache the session for next packet, without querying map.
+ if key == lastKey {
+ s, ok = lastSession, true
+ } else if s, ok = l.sessions[key]; ok {
+ lastSession = s
+ lastKey = key
+ }
+
+ if !ok { // new session
+ if !blacklist.has(from.String(), conv) && len(l.chAccepts) < cap(l.chAccepts) && len(l.sessions) < 4096 { // do not let new session overwhelm accept queue and connection count
+ s := newUDPSession(conv, l.dataShards, l.parityShards, l, l.conn, from, l.block)
+ s.kcpInput(data)
+ l.sessions[key] = s
+ l.chAccepts <- s
+ }
+ } else {
+ s.kcpInput(data)
+ }
}
}
xmitBuf.Put(raw)
- case deadlink := <-l.chSessionClosed:
- delete(l.sessions, deadlink.String())
+ case key := <-l.chSessionClosed:
+ if key == lastKey {
+ lastKey = sessionKey{}
+ }
+ delete(l.sessions, key)
case <-l.die:
return
}
@@ -850,9 +867,9 @@ func (l *Listener) Close() error {
}
// closeSession notify the listener that a session has closed
-func (l *Listener) closeSession(remote net.Addr) bool {
+func (l *Listener) closeSession(key sessionKey) bool {
select {
- case l.chSessionClosed <- remote:
+ case l.chSessionClosed <- key:
return true
case <-l.die:
return false
@@ -884,9 +901,9 @@ func ListenWithOptions(laddr string, block BlockCrypt, dataShards, parityShards
func ServeConn(block BlockCrypt, dataShards, parityShards int, conn net.PacketConn) (*Listener, error) {
l := new(Listener)
l.conn = conn
- l.sessions = make(map[string]*UDPSession)
+ l.sessions = make(map[sessionKey]*UDPSession)
l.chAccepts = make(chan *UDPSession, acceptBacklog)
- l.chSessionClosed = make(chan net.Addr)
+ l.chSessionClosed = make(chan sessionKey)
l.die = make(chan struct{})
l.dataShards = dataShards
l.parityShards = parityShards
diff --git a/vendor/github.com/xtaci/kcp-go/sess_test.go b/vendor/github.com/xtaci/kcp-go/sess_test.go
index c8e571f..dfd7feb 100644
--- a/vendor/github.com/xtaci/kcp-go/sess_test.go
+++ b/vendor/github.com/xtaci/kcp-go/sess_test.go
@@ -469,8 +469,10 @@ func TestListenerClose(t *testing.T) {
}
l.Close()
- fakeaddr, _ := net.ResolveUDPAddr("udp6", "127.0.0.1:1111")
- if l.closeSession(fakeaddr) {
+ if l.closeSession(sessionKey{
+ addr: "127.0.0.1:1111",
+ convID: 1234,
+ }) {
t.Fail()
}
}
diff --git a/vendor/github.com/xtaci/kcp-go/xor_test.go b/vendor/github.com/xtaci/kcp-go/xor_test.go
index 1541ea2..debda8a 100644
--- a/vendor/github.com/xtaci/kcp-go/xor_test.go
+++ b/vendor/github.com/xtaci/kcp-go/xor_test.go
@@ -26,3 +26,22 @@ func TestXORBytes(t *testing.T) {
}
}
}
+
+func BenchmarkZeroByXOR(b *testing.B) {
+ d := make([]byte, 1024)
+ b.ResetTimer()
+ b.SetBytes(1024)
+ for i := 0; i < b.N; i++ {
+ xorBytes(d, d, d)
+ }
+}
+
+func BenchmarkZeroByCopy(b *testing.B) {
+ d := make([]byte, 1024)
+ zero := make([]byte, 1024)
+ b.ResetTimer()
+ b.SetBytes(1024)
+ for i := 0; i < b.N; i++ {
+ copy(d, zero)
+ }
+}
diff --git a/vendor/go.uber.org/atomic/.codecov.yml b/vendor/go.uber.org/atomic/.codecov.yml
new file mode 100644
index 0000000..6d4d1be
--- /dev/null
+++ b/vendor/go.uber.org/atomic/.codecov.yml
@@ -0,0 +1,15 @@
+coverage:
+ range: 80..100
+ round: down
+ precision: 2
+
+ status:
+ project: # measuring the overall project coverage
+ default: # context, you can create multiple ones with custom titles
+ enabled: yes # must be yes|true to enable this status
+ target: 100 # specify the target coverage for each commit status
+ # option: "auto" (must increase from parent commit or pull request base)
+ # option: "X%" a static target percentage to hit
+ if_not_found: success # if parent is not found report status as success, error, or failure
+ if_ci_failed: error # if ci fails report status as success, error, or failure
+
diff --git a/vendor/go.uber.org/atomic/.travis.yml b/vendor/go.uber.org/atomic/.travis.yml
index f1ce95a..5895722 100644
--- a/vendor/go.uber.org/atomic/.travis.yml
+++ b/vendor/go.uber.org/atomic/.travis.yml
@@ -3,9 +3,9 @@ language: go
go_import_path: go.uber.org/atomic
go:
- - 1.5
- - 1.6
- - tip
+ - 1.7
+ - 1.8
+ - 1.9
cache:
directories:
@@ -18,4 +18,6 @@ script:
- make test_ci
- scripts/test-ubergo.sh
- make lint
- - travis_retry goveralls -coverprofile=cover.out -service=travis-ci
+
+after_success:
+ - bash <(curl -s https://codecov.io/bash)
diff --git a/vendor/go.uber.org/atomic/README.md b/vendor/go.uber.org/atomic/README.md
index bb4a12c..6505abf 100644
--- a/vendor/go.uber.org/atomic/README.md
+++ b/vendor/go.uber.org/atomic/README.md
@@ -1,4 +1,4 @@
-# atomic [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov]
+# atomic [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] [![Go Report Card][reportcard-img]][reportcard]
Simple wrappers for primitive types to enforce atomic access.
@@ -30,5 +30,7 @@ Released under the [MIT License](LICENSE.txt).
[doc]: https://godoc.org/go.uber.org/atomic
[ci-img]: https://travis-ci.org/uber-go/atomic.svg?branch=master
[ci]: https://travis-ci.org/uber-go/atomic
-[cov-img]: https://coveralls.io/repos/github/uber-go/atomic/badge.svg?branch=master
-[cov]: https://coveralls.io/github/uber-go/atomic?branch=master
+[cov-img]: https://codecov.io/gh/uber-go/atomic/branch/master/graph/badge.svg
+[cov]: https://codecov.io/gh/uber-go/atomic
+[reportcard-img]: https://goreportcard.com/badge/go.uber.org/atomic
+[reportcard]: https://goreportcard.com/report/go.uber.org/atomic
diff --git a/vendor/go.uber.org/atomic/atomic.go b/vendor/go.uber.org/atomic/atomic.go
index 290b884..1ca50dc 100644
--- a/vendor/go.uber.org/atomic/atomic.go
+++ b/vendor/go.uber.org/atomic/atomic.go
@@ -232,6 +232,11 @@ func (b *Bool) Load() bool {
return truthy(atomic.LoadUint32(&b.v))
}
+// CAS is an atomic compare-and-swap.
+func (b *Bool) CAS(old, new bool) bool {
+ return atomic.CompareAndSwapUint32(&b.v, boolToInt(old), boolToInt(new))
+}
+
// Store atomically stores the passed value.
func (b *Bool) Store(new bool) {
atomic.StoreUint32(&b.v, boolToInt(new))
diff --git a/vendor/go.uber.org/atomic/atomic_test.go b/vendor/go.uber.org/atomic/atomic_test.go
index 284f786..9f293b7 100644
--- a/vendor/go.uber.org/atomic/atomic_test.go
+++ b/vendor/go.uber.org/atomic/atomic_test.go
@@ -108,6 +108,13 @@ func TestBool(t *testing.T) {
require.False(t, atom.Toggle(), "Expected swap to return previous value.")
require.True(t, atom.Load(), "Unexpected state after swap.")
+ require.True(t, atom.CAS(true, true), "CAS should swap when old matches")
+ require.True(t, atom.Load(), "CAS should have no effect")
+ require.True(t, atom.CAS(true, false), "CAS should swap when old matches")
+ require.False(t, atom.Load(), "CAS should have modified the value")
+ require.False(t, atom.CAS(true, false), "CAS should fail on old mismatch")
+ require.False(t, atom.Load(), "CAS should not have modified the value")
+
atom.Store(false)
require.False(t, atom.Load(), "Unexpected state after store.")
diff --git a/vendor/go.uber.org/atomic/stress_test.go b/vendor/go.uber.org/atomic/stress_test.go
index 4cf1e16..f35de2d 100644
--- a/vendor/go.uber.org/atomic/stress_test.go
+++ b/vendor/go.uber.org/atomic/stress_test.go
@@ -21,8 +21,10 @@
package atomic
import (
+ "math"
"runtime"
"sync"
+ "sync/atomic"
"testing"
)
@@ -31,26 +33,83 @@ const (
_iterations = 1000
)
-func runStress(f func()) {
- defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(_parallelism))
+var _stressTests = map[string]func() func(){
+ "i32/std": stressStdInt32,
+ "i32": stressInt32,
+ "i64/std": stressStdInt32,
+ "i64": stressInt64,
+ "u32/std": stressStdUint32,
+ "u32": stressUint32,
+ "u64/std": stressStdUint64,
+ "u64": stressUint64,
+ "f64": stressFloat64,
+ "bool": stressBool,
+ "string": stressString,
+}
- var wg sync.WaitGroup
- wg.Add(_parallelism)
- for i := 0; i < _parallelism; i++ {
- go func() {
- defer wg.Done()
- for j := 0; j < _iterations; j++ {
- f()
+func TestStress(t *testing.T) {
+ for name, ff := range _stressTests {
+ t.Run(name, func(t *testing.T) {
+ defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(_parallelism))
+
+ start := make(chan struct{})
+ var wg sync.WaitGroup
+ wg.Add(_parallelism)
+ f := ff()
+ for i := 0; i < _parallelism; i++ {
+ go func() {
+ defer wg.Done()
+ <-start
+ for j := 0; j < _iterations; j++ {
+ f()
+ }
+ }()
}
- }()
+ close(start)
+ wg.Wait()
+ })
}
-
- wg.Wait()
}
-func TestStressInt32(t *testing.T) {
+func BenchmarkStress(b *testing.B) {
+ for name, ff := range _stressTests {
+ b.Run(name, func(b *testing.B) {
+ f := ff()
+
+ b.Run("serial", func(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ f()
+ }
+ })
+
+ b.Run("parallel", func(b *testing.B) {
+ b.RunParallel(func(pb *testing.PB) {
+ for pb.Next() {
+ f()
+ }
+ })
+ })
+ })
+ }
+}
+
+func stressStdInt32() func() {
+ var atom int32
+ return func() {
+ atomic.LoadInt32(&atom)
+ atomic.AddInt32(&atom, 1)
+ atomic.AddInt32(&atom, -2)
+ atomic.AddInt32(&atom, 1)
+ atomic.AddInt32(&atom, -1)
+ atomic.CompareAndSwapInt32(&atom, 1, 0)
+ atomic.SwapInt32(&atom, 5)
+ atomic.StoreInt32(&atom, 1)
+ }
+}
+
+func stressInt32() func() {
var atom Int32
- runStress(func() {
+ return func() {
atom.Load()
atom.Add(1)
atom.Sub(2)
@@ -59,12 +118,26 @@ func TestStressInt32(t *testing.T) {
atom.CAS(1, 0)
atom.Swap(5)
atom.Store(1)
- })
+ }
}
-func TestStressInt64(t *testing.T) {
+func stressStdInt64() func() {
+ var atom int64
+ return func() {
+ atomic.LoadInt64(&atom)
+ atomic.AddInt64(&atom, 1)
+ atomic.AddInt64(&atom, -2)
+ atomic.AddInt64(&atom, 1)
+ atomic.AddInt64(&atom, -1)
+ atomic.CompareAndSwapInt64(&atom, 1, 0)
+ atomic.SwapInt64(&atom, 5)
+ atomic.StoreInt64(&atom, 1)
+ }
+}
+
+func stressInt64() func() {
var atom Int64
- runStress(func() {
+ return func() {
atom.Load()
atom.Add(1)
atom.Sub(2)
@@ -73,13 +146,27 @@ func TestStressInt64(t *testing.T) {
atom.CAS(1, 0)
atom.Swap(5)
atom.Store(1)
-
- })
+ }
}
-func TestStressUint32(t *testing.T) {
+func stressStdUint32() func() {
+ var atom uint32
+ return func() {
+ atomic.LoadUint32(&atom)
+ atomic.AddUint32(&atom, 1)
+ // Adding `MaxUint32` is the same as subtracting 1
+ atomic.AddUint32(&atom, math.MaxUint32-1)
+ atomic.AddUint32(&atom, 1)
+ atomic.AddUint32(&atom, math.MaxUint32)
+ atomic.CompareAndSwapUint32(&atom, 1, 0)
+ atomic.SwapUint32(&atom, 5)
+ atomic.StoreUint32(&atom, 1)
+ }
+}
+
+func stressUint32() func() {
var atom Uint32
- runStress(func() {
+ return func() {
atom.Load()
atom.Add(1)
atom.Sub(2)
@@ -88,12 +175,27 @@ func TestStressUint32(t *testing.T) {
atom.CAS(1, 0)
atom.Swap(5)
atom.Store(1)
- })
+ }
}
-func TestStressUint64(t *testing.T) {
+func stressStdUint64() func() {
+ var atom uint64
+ return func() {
+ atomic.LoadUint64(&atom)
+ atomic.AddUint64(&atom, 1)
+ // Adding `MaxUint64` is the same as subtracting 1
+ atomic.AddUint64(&atom, math.MaxUint64-1)
+ atomic.AddUint64(&atom, 1)
+ atomic.AddUint64(&atom, math.MaxUint64)
+ atomic.CompareAndSwapUint64(&atom, 1, 0)
+ atomic.SwapUint64(&atom, 5)
+ atomic.StoreUint64(&atom, 1)
+ }
+}
+
+func stressUint64() func() {
var atom Uint64
- runStress(func() {
+ return func() {
atom.Load()
atom.Add(1)
atom.Sub(2)
@@ -102,39 +204,42 @@ func TestStressUint64(t *testing.T) {
atom.CAS(1, 0)
atom.Swap(5)
atom.Store(1)
- })
+ }
}
-func TestStressFloat64(t *testing.T) {
+func stressFloat64() func() {
var atom Float64
- runStress(func() {
+ return func() {
atom.Load()
atom.CAS(1.0, 0.1)
atom.Add(1.1)
atom.Sub(0.2)
atom.Store(1.0)
- })
+ }
}
-func TestStressBool(t *testing.T) {
+func stressBool() func() {
var atom Bool
- runStress(func() {
+ return func() {
atom.Load()
atom.Store(false)
atom.Swap(true)
+ atom.CAS(true, false)
+ atom.CAS(true, false)
atom.Load()
atom.Toggle()
atom.Toggle()
- })
+ }
}
-func TestStressString(t *testing.T) {
+func stressString() func() {
var atom String
- runStress(func() {
+ return func() {
atom.Load()
atom.Store("abc")
atom.Load()
atom.Store("def")
-
- })
+ atom.Load()
+ atom.Store("")
+ }
}
diff --git a/vendor/go.uber.org/atomic/string.go b/vendor/go.uber.org/atomic/string.go
index acf0f5b..ede8136 100644
--- a/vendor/go.uber.org/atomic/string.go
+++ b/vendor/go.uber.org/atomic/string.go
@@ -20,10 +20,8 @@
package atomic
-import "sync/atomic"
-
-// String is an atomic type-safe wrapper around atomic.Value for strings.
-type String struct{ v atomic.Value }
+// String is an atomic type-safe wrapper around Value for strings.
+type String struct{ v Value }
// NewString creates a String.
func NewString(str string) *String {
@@ -44,7 +42,7 @@ func (s *String) Load() string {
}
// Store atomically stores the passed string.
-// Note: Converting the string to an interface{} to store in the atomic.Value
+// Note: Converting the string to an interface{} to store in the Value
// requires an allocation.
func (s *String) Store(str string) {
s.v.Store(str)
diff --git a/vendor/golang.org/x/crypto/acme/acme.go b/vendor/golang.org/x/crypto/acme/acme.go
index e8388b0..fa9c4b3 100644
--- a/vendor/golang.org/x/crypto/acme/acme.go
+++ b/vendor/golang.org/x/crypto/acme/acme.go
@@ -142,7 +142,7 @@ func (c *Client) Discover(ctx context.Context) (Directory, error) {
//
// In the case where CA server does not provide the issued certificate in the response,
// CreateCert will poll certURL using c.FetchCert, which will result in additional round-trips.
-// In such scenario the caller can cancel the polling with ctx.
+// In such a scenario, the caller can cancel the polling with ctx.
//
// CreateCert returns an error if the CA's response or chain was unreasonably large.
// Callers are encouraged to parse the returned value to ensure the certificate is valid and has the expected features.
@@ -257,7 +257,7 @@ func (c *Client) RevokeCert(ctx context.Context, key crypto.Signer, cert []byte,
func AcceptTOS(tosURL string) bool { return true }
// Register creates a new account registration by following the "new-reg" flow.
-// It returns registered account. The account is not modified.
+// It returns the registered account. The account is not modified.
//
// The registration may require the caller to agree to the CA's Terms of Service (TOS).
// If so, and the account has not indicated the acceptance of the terms (see Account for details),
@@ -995,6 +995,7 @@ func keyAuth(pub crypto.PublicKey, token string) (string, error) {
// tlsChallengeCert creates a temporary certificate for TLS-SNI challenges
// with the given SANs and auto-generated public/private key pair.
+// The Subject Common Name is set to the first SAN to aid debugging.
// To create a cert with a custom key pair, specify WithKey option.
func tlsChallengeCert(san []string, opt []CertOption) (tls.Certificate, error) {
var (
@@ -1033,6 +1034,9 @@ func tlsChallengeCert(san []string, opt []CertOption) (tls.Certificate, error) {
}
}
tmpl.DNSNames = san
+ if len(san) > 0 {
+ tmpl.Subject.CommonName = san[0]
+ }
der, err := x509.CreateCertificate(rand.Reader, tmpl, tmpl, key.Public(), key)
if err != nil {
diff --git a/vendor/golang.org/x/crypto/acme/acme_test.go b/vendor/golang.org/x/crypto/acme/acme_test.go
index 14832de..89f2efa 100644
--- a/vendor/golang.org/x/crypto/acme/acme_test.go
+++ b/vendor/golang.org/x/crypto/acme/acme_test.go
@@ -946,7 +946,7 @@ func TestNonce_add(t *testing.T) {
c.addNonce(http.Header{"Replay-Nonce": {}})
c.addNonce(http.Header{"Replay-Nonce": {"nonce"}})
- nonces := map[string]struct{}{"nonce": struct{}{}}
+ nonces := map[string]struct{}{"nonce": {}}
if !reflect.DeepEqual(c.nonces, nonces) {
t.Errorf("c.nonces = %q; want %q", c.nonces, nonces)
}
@@ -1186,6 +1186,9 @@ func TestTLSSNI01ChallengeCert(t *testing.T) {
if cert.DNSNames[0] != name {
t.Errorf("cert.DNSNames[0] != name: %q vs %q", cert.DNSNames[0], name)
}
+ if cn := cert.Subject.CommonName; cn != san {
+ t.Errorf("cert.Subject.CommonName = %q; want %q", cn, san)
+ }
}
func TestTLSSNI02ChallengeCert(t *testing.T) {
@@ -1219,6 +1222,9 @@ func TestTLSSNI02ChallengeCert(t *testing.T) {
if i >= len(cert.DNSNames) || cert.DNSNames[i] != name {
t.Errorf("%v doesn't have %q", cert.DNSNames, name)
}
+ if cn := cert.Subject.CommonName; cn != sanA {
+ t.Errorf("CommonName = %q; want %q", cn, sanA)
+ }
}
func TestTLSChallengeCertOpt(t *testing.T) {
diff --git a/vendor/golang.org/x/crypto/acme/autocert/autocert.go b/vendor/golang.org/x/crypto/acme/autocert/autocert.go
index b101020..94edba9 100644
--- a/vendor/golang.org/x/crypto/acme/autocert/autocert.go
+++ b/vendor/golang.org/x/crypto/acme/autocert/autocert.go
@@ -371,7 +371,7 @@ func (m *Manager) createCert(ctx context.Context, domain string) (*tls.Certifica
// We are the first; state is locked.
// Unblock the readers when domain ownership is verified
- // and the we got the cert or the process failed.
+ // and we got the cert or the process failed.
defer state.Unlock()
state.locked = false
@@ -439,7 +439,7 @@ func (m *Manager) certState(domain string) (*certState, error) {
return state, nil
}
-// authorizedCert starts domain ownership verification process and requests a new cert upon success.
+// authorizedCert starts the domain ownership verification process and requests a new cert upon success.
// The key argument is the certificate private key.
func (m *Manager) authorizedCert(ctx context.Context, key crypto.Signer, domain string) (der [][]byte, leaf *x509.Certificate, err error) {
if err := m.verify(ctx, domain); err != nil {
diff --git a/vendor/golang.org/x/crypto/bcrypt/bcrypt.go b/vendor/golang.org/x/crypto/bcrypt/bcrypt.go
index 202fa8a..aeb73f8 100644
--- a/vendor/golang.org/x/crypto/bcrypt/bcrypt.go
+++ b/vendor/golang.org/x/crypto/bcrypt/bcrypt.go
@@ -241,11 +241,11 @@ func (p *hashed) Hash() []byte {
n = 3
}
arr[n] = '$'
- n += 1
+ n++
copy(arr[n:], []byte(fmt.Sprintf("%02d", p.cost)))
n += 2
arr[n] = '$'
- n += 1
+ n++
copy(arr[n:], p.salt)
n += encodedSaltSize
copy(arr[n:], p.hash)
diff --git a/vendor/golang.org/x/crypto/openpgp/keys.go b/vendor/golang.org/x/crypto/openpgp/keys.go
index 68b14c6..744e293 100644
--- a/vendor/golang.org/x/crypto/openpgp/keys.go
+++ b/vendor/golang.org/x/crypto/openpgp/keys.go
@@ -325,9 +325,8 @@ func ReadEntity(packets *packet.Reader) (*Entity, error) {
if e.PrivateKey, ok = p.(*packet.PrivateKey); !ok {
packets.Unread(p)
return nil, errors.StructuralError("first packet was not a public/private key")
- } else {
- e.PrimaryKey = &e.PrivateKey.PublicKey
}
+ e.PrimaryKey = &e.PrivateKey.PublicKey
}
if !e.PrimaryKey.PubKeyAlgo.CanSign() {
diff --git a/vendor/golang.org/x/crypto/pbkdf2/pbkdf2_test.go b/vendor/golang.org/x/crypto/pbkdf2/pbkdf2_test.go
index 1379240..f83cb69 100644
--- a/vendor/golang.org/x/crypto/pbkdf2/pbkdf2_test.go
+++ b/vendor/golang.org/x/crypto/pbkdf2/pbkdf2_test.go
@@ -155,3 +155,22 @@ func TestWithHMACSHA1(t *testing.T) {
func TestWithHMACSHA256(t *testing.T) {
testHash(t, sha256.New, "SHA256", sha256TestVectors)
}
+
+var sink uint8
+
+func benchmark(b *testing.B, h func() hash.Hash) {
+ password := make([]byte, h().Size())
+ salt := make([]byte, 8)
+ for i := 0; i < b.N; i++ {
+ password = Key(password, salt, 4096, len(password), h)
+ }
+ sink += password[0]
+}
+
+func BenchmarkHMACSHA1(b *testing.B) {
+ benchmark(b, sha1.New)
+}
+
+func BenchmarkHMACSHA256(b *testing.B) {
+ benchmark(b, sha256.New)
+}
diff --git a/vendor/golang.org/x/crypto/tea/cipher.go b/vendor/golang.org/x/crypto/tea/cipher.go
index 9c13d12..ce223b2 100644
--- a/vendor/golang.org/x/crypto/tea/cipher.go
+++ b/vendor/golang.org/x/crypto/tea/cipher.go
@@ -5,7 +5,6 @@
// Package tea implements the TEA algorithm, as defined in Needham and
// Wheeler's 1994 technical report, “TEA, a Tiny Encryption Algorithm”. See
// http://www.cix.co.uk/~klockstone/tea.pdf for details.
-
package tea
import (
diff --git a/vendor/golang.org/x/crypto/xtea/cipher.go b/vendor/golang.org/x/crypto/xtea/cipher.go
index 108b426..66ea0df 100644
--- a/vendor/golang.org/x/crypto/xtea/cipher.go
+++ b/vendor/golang.org/x/crypto/xtea/cipher.go
@@ -69,7 +69,7 @@ func initCipher(c *Cipher, key []byte) {
// Precalculate the table
const delta = 0x9E3779B9
- var sum uint32 = 0
+ var sum uint32
// Two rounds of XTEA applied per loop
for i := 0; i < numRounds; {
diff --git a/vendor/golang.org/x/net/context/context.go b/vendor/golang.org/x/net/context/context.go
index d3681ab..a3c021d 100644
--- a/vendor/golang.org/x/net/context/context.go
+++ b/vendor/golang.org/x/net/context/context.go
@@ -5,6 +5,8 @@
// Package context defines the Context type, which carries deadlines,
// cancelation signals, and other request-scoped values across API boundaries
// and between processes.
+// As of Go 1.7 this package is available in the standard library under the
+// name context. https://golang.org/pkg/context.
//
// Incoming requests to a server should create a Context, and outgoing calls to
// servers should accept a Context. The chain of function calls between must
diff --git a/vendor/golang.org/x/net/html/doc.go b/vendor/golang.org/x/net/html/doc.go
index 94f4968..822ed42 100644
--- a/vendor/golang.org/x/net/html/doc.go
+++ b/vendor/golang.org/x/net/html/doc.go
@@ -49,18 +49,18 @@ call to Next. For example, to extract an HTML page's anchor text:
for {
tt := z.Next()
switch tt {
- case ErrorToken:
+ case html.ErrorToken:
return z.Err()
- case TextToken:
+ case html.TextToken:
if depth > 0 {
// emitBytes should copy the []byte it receives,
// if it doesn't process it immediately.
emitBytes(z.Text())
}
- case StartTagToken, EndTagToken:
+ case html.StartTagToken, html.EndTagToken:
tn, _ := z.TagName()
if len(tn) == 1 && tn[0] == 'a' {
- if tt == StartTagToken {
+ if tt == html.StartTagToken {
depth++
} else {
depth--
diff --git a/vendor/golang.org/x/net/http2/go19_test.go b/vendor/golang.org/x/net/http2/go19_test.go
index 1675d24..22b0006 100644
--- a/vendor/golang.org/x/net/http2/go19_test.go
+++ b/vendor/golang.org/x/net/http2/go19_test.go
@@ -46,7 +46,6 @@ func TestServerGracefulShutdown(t *testing.T) {
wanth := [][2]string{
{":status", "200"},
{"x-foo", "bar"},
- {"content-type", "text/plain; charset=utf-8"},
{"content-length", "0"},
}
if !reflect.DeepEqual(goth, wanth) {
diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go
index eae143d..7a50226 100644
--- a/vendor/golang.org/x/net/http2/server.go
+++ b/vendor/golang.org/x/net/http2/server.go
@@ -220,12 +220,15 @@ func ConfigureServer(s *http.Server, conf *Server) error {
} else if s.TLSConfig.CipherSuites != nil {
// If they already provided a CipherSuite list, return
// an error if it has a bad order or is missing
- // ECDHE_RSA_WITH_AES_128_GCM_SHA256.
- const requiredCipher = tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
+ // ECDHE_RSA_WITH_AES_128_GCM_SHA256 or ECDHE_ECDSA_WITH_AES_128_GCM_SHA256.
haveRequired := false
sawBad := false
for i, cs := range s.TLSConfig.CipherSuites {
- if cs == requiredCipher {
+ switch cs {
+ case tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
+ // Alternative MTI cipher to not discourage ECDSA-only servers.
+ // See http://golang.org/cl/30721 for further information.
+ tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
haveRequired = true
}
if isBadCipher(cs) {
@@ -235,7 +238,7 @@ func ConfigureServer(s *http.Server, conf *Server) error {
}
}
if !haveRequired {
- return fmt.Errorf("http2: TLSConfig.CipherSuites is missing HTTP/2-required TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256")
+ return fmt.Errorf("http2: TLSConfig.CipherSuites is missing an HTTP/2-required AES_128_GCM_SHA256 cipher.")
}
}
@@ -649,7 +652,7 @@ func (sc *serverConn) condlogf(err error, format string, args ...interface{}) {
if err == nil {
return
}
- if err == io.EOF || err == io.ErrUnexpectedEOF || isClosedConnError(err) {
+ if err == io.EOF || err == io.ErrUnexpectedEOF || isClosedConnError(err) || err == errPrefaceTimeout {
// Boring, expected errors.
sc.vlogf(format, args...)
} else {
@@ -853,8 +856,13 @@ func (sc *serverConn) serve() {
}
}
- if sc.inGoAway && sc.curOpenStreams() == 0 && !sc.needToSendGoAway && !sc.writingFrame {
- return
+ // Start the shutdown timer after sending a GOAWAY. When sending GOAWAY
+ // with no error code (graceful shutdown), don't start the timer until
+ // all open streams have been completed.
+ sentGoAway := sc.inGoAway && !sc.needToSendGoAway && !sc.writingFrame
+ gracefulShutdownComplete := sc.goAwayCode == ErrCodeNo && sc.curOpenStreams() == 0
+ if sentGoAway && sc.shutdownTimer == nil && (sc.goAwayCode != ErrCodeNo || gracefulShutdownComplete) {
+ sc.shutDownIn(goAwayTimeout)
}
}
}
@@ -889,8 +897,11 @@ func (sc *serverConn) sendServeMsg(msg interface{}) {
}
}
-// readPreface reads the ClientPreface greeting from the peer
-// or returns an error on timeout or an invalid greeting.
+var errPrefaceTimeout = errors.New("timeout waiting for client preface")
+
+// readPreface reads the ClientPreface greeting from the peer or
+// returns errPrefaceTimeout on timeout, or an error if the greeting
+// is invalid.
func (sc *serverConn) readPreface() error {
errc := make(chan error, 1)
go func() {
@@ -908,7 +919,7 @@ func (sc *serverConn) readPreface() error {
defer timer.Stop()
select {
case <-timer.C:
- return errors.New("timeout waiting for client preface")
+ return errPrefaceTimeout
case err := <-errc:
if err == nil {
if VerboseLogs {
@@ -1218,30 +1229,31 @@ func (sc *serverConn) startGracefulShutdown() {
sc.shutdownOnce.Do(func() { sc.sendServeMsg(gracefulShutdownMsg) })
}
+// After sending GOAWAY, the connection will close after goAwayTimeout.
+// If we close the connection immediately after sending GOAWAY, there may
+// be unsent data in our kernel receive buffer, which will cause the kernel
+// to send a TCP RST on close() instead of a FIN. This RST will abort the
+// connection immediately, whether or not the client had received the GOAWAY.
+//
+// Ideally we should delay for at least 1 RTT + epsilon so the client has
+// a chance to read the GOAWAY and stop sending messages. Measuring RTT
+// is hard, so we approximate with 1 second. See golang.org/issue/18701.
+//
+// This is a var so it can be shorter in tests, where all requests uses the
+// loopback interface making the expected RTT very small.
+//
+// TODO: configurable?
+var goAwayTimeout = 1 * time.Second
+
func (sc *serverConn) startGracefulShutdownInternal() {
- sc.goAwayIn(ErrCodeNo, 0)
+ sc.goAway(ErrCodeNo)
}
func (sc *serverConn) goAway(code ErrCode) {
- sc.serveG.check()
- var forceCloseIn time.Duration
- if code != ErrCodeNo {
- forceCloseIn = 250 * time.Millisecond
- } else {
- // TODO: configurable
- forceCloseIn = 1 * time.Second
- }
- sc.goAwayIn(code, forceCloseIn)
-}
-
-func (sc *serverConn) goAwayIn(code ErrCode, forceCloseIn time.Duration) {
sc.serveG.check()
if sc.inGoAway {
return
}
- if forceCloseIn != 0 {
- sc.shutDownIn(forceCloseIn)
- }
sc.inGoAway = true
sc.needToSendGoAway = true
sc.goAwayCode = code
@@ -2310,7 +2322,7 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) {
clen = strconv.Itoa(len(p))
}
_, hasContentType := rws.snapHeader["Content-Type"]
- if !hasContentType && bodyAllowedForStatus(rws.status) {
+ if !hasContentType && bodyAllowedForStatus(rws.status) && len(p) > 0 {
ctype = http.DetectContentType(p)
}
var date string
@@ -2478,7 +2490,26 @@ func (w *responseWriter) Header() http.Header {
return rws.handlerHeader
}
+// checkWriteHeaderCode is a copy of net/http's checkWriteHeaderCode.
+func checkWriteHeaderCode(code int) {
+ // Issue 22880: require valid WriteHeader status codes.
+ // For now we only enforce that it's three digits.
+ // In the future we might block things over 599 (600 and above aren't defined
+ // at http://httpwg.org/specs/rfc7231.html#status.codes)
+ // and we might block under 200 (once we have more mature 1xx support).
+ // But for now any three digits.
+ //
+ // We used to send "HTTP/1.1 000 0" on the wire in responses but there's
+ // no equivalent bogus thing we can realistically send in HTTP/2,
+ // so we'll consistently panic instead and help people find their bugs
+ // early. (We can't return an error from WriteHeader even if we wanted to.)
+ if code < 100 || code > 999 {
+ panic(fmt.Sprintf("invalid WriteHeader code %v", code))
+ }
+}
+
func (w *responseWriter) WriteHeader(code int) {
+ checkWriteHeaderCode(code)
rws := w.rws
if rws == nil {
panic("WriteHeader called after Handler finished")
diff --git a/vendor/golang.org/x/net/http2/server_test.go b/vendor/golang.org/x/net/http2/server_test.go
index b4e8328..bd1ba20 100644
--- a/vendor/golang.org/x/net/http2/server_test.go
+++ b/vendor/golang.org/x/net/http2/server_test.go
@@ -68,6 +68,7 @@ type serverTester struct {
func init() {
testHookOnPanicMu = new(sync.Mutex)
+ goAwayTimeout = 25 * time.Millisecond
}
func resetHooks() {
@@ -1717,7 +1718,6 @@ func TestServer_Response_NoData_Header_FooBar(t *testing.T) {
wanth := [][2]string{
{":status", "200"},
{"foo-bar", "some-value"},
- {"content-type", "text/plain; charset=utf-8"},
{"content-length", "0"},
}
if !reflect.DeepEqual(goth, wanth) {
@@ -2952,7 +2952,6 @@ func TestServerDoesntWriteInvalidHeaders(t *testing.T) {
wanth := [][2]string{
{":status", "200"},
{"ok1", "x"},
- {"content-type", "text/plain; charset=utf-8"},
{"content-length", "0"},
}
if !reflect.DeepEqual(goth, wanth) {
@@ -3188,12 +3187,18 @@ func TestConfigureServer(t *testing.T) {
CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
},
},
+ {
+ name: "just the alternative required cipher suite",
+ tlsConfig: &tls.Config{
+ CipherSuites: []uint16{tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
+ },
+ },
{
name: "missing required cipher suite",
tlsConfig: &tls.Config{
CipherSuites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384},
},
- wantErr: "is missing HTTP/2-required TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
+ wantErr: "is missing an HTTP/2-required AES_128_GCM_SHA256 cipher.",
},
{
name: "required after bad",
@@ -3259,7 +3264,6 @@ func TestServerNoAutoContentLengthOnHead(t *testing.T) {
headers := st.decodeHeader(h.HeaderBlockFragment())
want := [][2]string{
{":status", "200"},
- {"content-type", "text/plain; charset=utf-8"},
}
if !reflect.DeepEqual(headers, want) {
t.Errorf("Headers mismatch.\n got: %q\nwant: %q\n", headers, want)
diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go
index adb77ff..c65f1a3 100644
--- a/vendor/golang.org/x/net/http2/transport.go
+++ b/vendor/golang.org/x/net/http2/transport.go
@@ -274,6 +274,13 @@ func (cs *clientStream) checkResetOrDone() error {
}
}
+func (cs *clientStream) getStartedWrite() bool {
+ cc := cs.cc
+ cc.mu.Lock()
+ defer cc.mu.Unlock()
+ return cs.startedWrite
+}
+
func (cs *clientStream) abortRequestBodyWrite(err error) {
if err == nil {
panic("nil error")
@@ -349,14 +356,9 @@ func (t *Transport) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Res
return nil, err
}
traceGotConn(req, cc)
- res, err := cc.RoundTrip(req)
+ res, gotErrAfterReqBodyWrite, err := cc.roundTrip(req)
if err != nil && retry <= 6 {
- afterBodyWrite := false
- if e, ok := err.(afterReqBodyWriteError); ok {
- err = e
- afterBodyWrite = true
- }
- if req, err = shouldRetryRequest(req, err, afterBodyWrite); err == nil {
+ if req, err = shouldRetryRequest(req, err, gotErrAfterReqBodyWrite); err == nil {
// After the first retry, do exponential backoff with 10% jitter.
if retry == 0 {
continue
@@ -394,16 +396,6 @@ var (
errClientConnGotGoAway = errors.New("http2: Transport received Server's graceful shutdown GOAWAY")
)
-// afterReqBodyWriteError is a wrapper around errors returned by ClientConn.RoundTrip.
-// It is used to signal that err happened after part of Request.Body was sent to the server.
-type afterReqBodyWriteError struct {
- err error
-}
-
-func (e afterReqBodyWriteError) Error() string {
- return e.err.Error() + "; some request body already written"
-}
-
// shouldRetryRequest is called by RoundTrip when a request fails to get
// response headers. It is always called with a non-nil error.
// It returns either a request to retry (either the same request, or a
@@ -752,8 +744,13 @@ func actualContentLength(req *http.Request) int64 {
}
func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) {
+ resp, _, err := cc.roundTrip(req)
+ return resp, err
+}
+
+func (cc *ClientConn) roundTrip(req *http.Request) (res *http.Response, gotErrAfterReqBodyWrite bool, err error) {
if err := checkConnHeaders(req); err != nil {
- return nil, err
+ return nil, false, err
}
if cc.idleTimer != nil {
cc.idleTimer.Stop()
@@ -761,14 +758,14 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) {
trailers, err := commaSeparatedTrailers(req)
if err != nil {
- return nil, err
+ return nil, false, err
}
hasTrailers := trailers != ""
cc.mu.Lock()
if err := cc.awaitOpenSlotForRequest(req); err != nil {
cc.mu.Unlock()
- return nil, err
+ return nil, false, err
}
body := req.Body
@@ -802,7 +799,7 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) {
hdrs, err := cc.encodeHeaders(req, requestedGzip, trailers, contentLen)
if err != nil {
cc.mu.Unlock()
- return nil, err
+ return nil, false, err
}
cs := cc.newStream()
@@ -814,7 +811,7 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) {
cc.wmu.Lock()
endStream := !hasBody && !hasTrailers
- werr := cc.writeHeaders(cs.ID, endStream, hdrs)
+ werr := cc.writeHeaders(cs.ID, endStream, int(cc.maxFrameSize), hdrs)
cc.wmu.Unlock()
traceWroteHeaders(cs.trace)
cc.mu.Unlock()
@@ -828,7 +825,7 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) {
// Don't bother sending a RST_STREAM (our write already failed;
// no need to keep writing)
traceWroteRequest(cs.trace, werr)
- return nil, werr
+ return nil, false, werr
}
var respHeaderTimer <-chan time.Time
@@ -847,7 +844,7 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) {
bodyWritten := false
ctx := reqContext(req)
- handleReadLoopResponse := func(re resAndError) (*http.Response, error) {
+ handleReadLoopResponse := func(re resAndError) (*http.Response, bool, error) {
res := re.res
if re.err != nil || res.StatusCode > 299 {
// On error or status code 3xx, 4xx, 5xx, etc abort any
@@ -863,18 +860,12 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) {
cs.abortRequestBodyWrite(errStopReqBodyWrite)
}
if re.err != nil {
- cc.mu.Lock()
- afterBodyWrite := cs.startedWrite
- cc.mu.Unlock()
cc.forgetStreamID(cs.ID)
- if afterBodyWrite {
- return nil, afterReqBodyWriteError{re.err}
- }
- return nil, re.err
+ return nil, cs.getStartedWrite(), re.err
}
res.Request = req
res.TLS = cc.tlsState
- return res, nil
+ return res, false, nil
}
for {
@@ -889,7 +880,7 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) {
cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel)
}
cc.forgetStreamID(cs.ID)
- return nil, errTimeout
+ return nil, cs.getStartedWrite(), errTimeout
case <-ctx.Done():
if !hasBody || bodyWritten {
cc.writeStreamReset(cs.ID, ErrCodeCancel, nil)
@@ -898,7 +889,7 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) {
cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel)
}
cc.forgetStreamID(cs.ID)
- return nil, ctx.Err()
+ return nil, cs.getStartedWrite(), ctx.Err()
case <-req.Cancel:
if !hasBody || bodyWritten {
cc.writeStreamReset(cs.ID, ErrCodeCancel, nil)
@@ -907,12 +898,12 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) {
cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel)
}
cc.forgetStreamID(cs.ID)
- return nil, errRequestCanceled
+ return nil, cs.getStartedWrite(), errRequestCanceled
case <-cs.peerReset:
// processResetStream already removed the
// stream from the streams map; no need for
// forgetStreamID.
- return nil, cs.resetErr
+ return nil, cs.getStartedWrite(), cs.resetErr
case err := <-bodyWriter.resc:
// Prefer the read loop's response, if available. Issue 16102.
select {
@@ -921,7 +912,7 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) {
default:
}
if err != nil {
- return nil, err
+ return nil, cs.getStartedWrite(), err
}
bodyWritten = true
if d := cc.responseHeaderTimeout(); d != 0 {
@@ -973,13 +964,12 @@ func (cc *ClientConn) awaitOpenSlotForRequest(req *http.Request) error {
}
// requires cc.wmu be held
-func (cc *ClientConn) writeHeaders(streamID uint32, endStream bool, hdrs []byte) error {
+func (cc *ClientConn) writeHeaders(streamID uint32, endStream bool, maxFrameSize int, hdrs []byte) error {
first := true // first frame written (HEADERS is first, then CONTINUATION)
- frameSize := int(cc.maxFrameSize)
for len(hdrs) > 0 && cc.werr == nil {
chunk := hdrs
- if len(chunk) > frameSize {
- chunk = chunk[:frameSize]
+ if len(chunk) > maxFrameSize {
+ chunk = chunk[:maxFrameSize]
}
hdrs = hdrs[len(chunk):]
endHeaders := len(hdrs) == 0
@@ -1096,13 +1086,17 @@ func (cs *clientStream) writeRequestBody(body io.Reader, bodyCloser io.Closer) (
}
}
+ cc.mu.Lock()
+ maxFrameSize := int(cc.maxFrameSize)
+ cc.mu.Unlock()
+
cc.wmu.Lock()
defer cc.wmu.Unlock()
// Two ways to send END_STREAM: either with trailers, or
// with an empty DATA frame.
if len(trls) > 0 {
- err = cc.writeHeaders(cs.ID, true, trls)
+ err = cc.writeHeaders(cs.ID, true, maxFrameSize, trls)
} else {
err = cc.fr.WriteData(cs.ID, true, nil)
}
@@ -1382,17 +1376,12 @@ func (cc *ClientConn) streamByID(id uint32, andRemove bool) *clientStream {
// clientConnReadLoop is the state owned by the clientConn's frame-reading readLoop.
type clientConnReadLoop struct {
cc *ClientConn
- activeRes map[uint32]*clientStream // keyed by streamID
closeWhenIdle bool
}
// readLoop runs in its own goroutine and reads and dispatches frames.
func (cc *ClientConn) readLoop() {
- rl := &clientConnReadLoop{
- cc: cc,
- activeRes: make(map[uint32]*clientStream),
- }
-
+ rl := &clientConnReadLoop{cc: cc}
defer rl.cleanup()
cc.readerErr = rl.run()
if ce, ok := cc.readerErr.(ConnectionError); ok {
@@ -1447,10 +1436,8 @@ func (rl *clientConnReadLoop) cleanup() {
} else if err == io.EOF {
err = io.ErrUnexpectedEOF
}
- for _, cs := range rl.activeRes {
- cs.bufPipe.CloseWithError(err)
- }
for _, cs := range cc.streams {
+ cs.bufPipe.CloseWithError(err) // no-op if already closed
select {
case cs.resc <- resAndError{err: err}:
default:
@@ -1528,7 +1515,7 @@ func (rl *clientConnReadLoop) run() error {
}
return err
}
- if rl.closeWhenIdle && gotReply && maybeIdle && len(rl.activeRes) == 0 {
+ if rl.closeWhenIdle && gotReply && maybeIdle {
cc.closeIfIdle()
}
}
@@ -1536,13 +1523,31 @@ func (rl *clientConnReadLoop) run() error {
func (rl *clientConnReadLoop) processHeaders(f *MetaHeadersFrame) error {
cc := rl.cc
- cs := cc.streamByID(f.StreamID, f.StreamEnded())
+ cs := cc.streamByID(f.StreamID, false)
if cs == nil {
// We'd get here if we canceled a request while the
// server had its response still in flight. So if this
// was just something we canceled, ignore it.
return nil
}
+ if f.StreamEnded() {
+ // Issue 20521: If the stream has ended, streamByID() causes
+ // clientStream.done to be closed, which causes the request's bodyWriter
+ // to be closed with an errStreamClosed, which may be received by
+ // clientConn.RoundTrip before the result of processing these headers.
+ // Deferring stream closure allows the header processing to occur first.
+ // clientConn.RoundTrip may still receive the bodyWriter error first, but
+ // the fix for issue 16102 prioritises any response.
+ //
+ // Issue 22413: If there is no request body, we should close the
+ // stream before writing to cs.resc so that the stream is closed
+ // immediately once RoundTrip returns.
+ if cs.req.Body != nil {
+ defer cc.forgetStreamID(f.StreamID)
+ } else {
+ cc.forgetStreamID(f.StreamID)
+ }
+ }
if !cs.firstByte {
if cs.trace != nil {
// TODO(bradfitz): move first response byte earlier,
@@ -1566,6 +1571,7 @@ func (rl *clientConnReadLoop) processHeaders(f *MetaHeadersFrame) error {
}
// Any other error type is a stream error.
cs.cc.writeStreamReset(f.StreamID, ErrCodeProtocol, err)
+ cc.forgetStreamID(cs.ID)
cs.resc <- resAndError{err: err}
return nil // return nil from process* funcs to keep conn alive
}
@@ -1573,9 +1579,6 @@ func (rl *clientConnReadLoop) processHeaders(f *MetaHeadersFrame) error {
// (nil, nil) special case. See handleResponse docs.
return nil
}
- if res.Body != noBody {
- rl.activeRes[cs.ID] = cs
- }
cs.resTrailer = &res.Trailer
cs.resc <- resAndError{res: res}
return nil
@@ -1595,11 +1598,11 @@ func (rl *clientConnReadLoop) handleResponse(cs *clientStream, f *MetaHeadersFra
status := f.PseudoValue("status")
if status == "" {
- return nil, errors.New("missing status pseudo header")
+ return nil, errors.New("malformed response from server: missing status pseudo header")
}
statusCode, err := strconv.Atoi(status)
if err != nil {
- return nil, errors.New("malformed non-numeric status pseudo header")
+ return nil, errors.New("malformed response from server: malformed non-numeric status pseudo header")
}
if statusCode == 100 {
@@ -1841,6 +1844,14 @@ func (rl *clientConnReadLoop) processData(f *DataFrame) error {
return nil
}
if f.Length > 0 {
+ if cs.req.Method == "HEAD" && len(data) > 0 {
+ cc.logf("protocol error: received DATA on a HEAD request")
+ rl.endStreamError(cs, StreamError{
+ StreamID: f.StreamID,
+ Code: ErrCodeProtocol,
+ })
+ return nil
+ }
// Check connection-level flow control.
cc.mu.Lock()
if cs.inflow.available() >= int32(f.Length) {
@@ -1902,11 +1913,10 @@ func (rl *clientConnReadLoop) endStreamError(cs *clientStream, err error) {
err = io.EOF
code = cs.copyTrailers
}
- cs.bufPipe.closeWithErrorAndCode(err, code)
- delete(rl.activeRes, cs.ID)
if isConnectionCloseRequest(cs.req) {
rl.closeWhenIdle = true
}
+ cs.bufPipe.closeWithErrorAndCode(err, code)
select {
case cs.resc <- resAndError{err: err}:
@@ -2033,7 +2043,6 @@ func (rl *clientConnReadLoop) processResetStream(f *RSTStreamFrame) error {
cs.bufPipe.CloseWithError(err)
cs.cc.cond.Broadcast() // wake up checkResetOrDone via clientStream.awaitFlowControl
}
- delete(rl.activeRes, cs.ID)
return nil
}
diff --git a/vendor/golang.org/x/net/http2/transport_test.go b/vendor/golang.org/x/net/http2/transport_test.go
index 0126ff4..adee48c 100644
--- a/vendor/golang.org/x/net/http2/transport_test.go
+++ b/vendor/golang.org/x/net/http2/transport_test.go
@@ -13,6 +13,7 @@ import (
"fmt"
"io"
"io/ioutil"
+ "log"
"math/rand"
"net"
"net/http"
@@ -2290,6 +2291,65 @@ func TestTransportReadHeadResponse(t *testing.T) {
ct.run()
}
+func TestTransportReadHeadResponseWithBody(t *testing.T) {
+ // This test use not valid response format.
+ // Discarding logger output to not spam tests output.
+ log.SetOutput(ioutil.Discard)
+ defer log.SetOutput(os.Stderr)
+
+ response := "redirecting to /elsewhere"
+ ct := newClientTester(t)
+ clientDone := make(chan struct{})
+ ct.client = func() error {
+ defer close(clientDone)
+ req, _ := http.NewRequest("HEAD", "https://dummy.tld/", nil)
+ res, err := ct.tr.RoundTrip(req)
+ if err != nil {
+ return err
+ }
+ if res.ContentLength != int64(len(response)) {
+ return fmt.Errorf("Content-Length = %d; want %d", res.ContentLength, len(response))
+ }
+ slurp, err := ioutil.ReadAll(res.Body)
+ if err != nil {
+ return fmt.Errorf("ReadAll: %v", err)
+ }
+ if len(slurp) > 0 {
+ return fmt.Errorf("Unexpected non-empty ReadAll body: %q", slurp)
+ }
+ return nil
+ }
+ ct.server = func() error {
+ ct.greet()
+ for {
+ f, err := ct.fr.ReadFrame()
+ if err != nil {
+ t.Logf("ReadFrame: %v", err)
+ return nil
+ }
+ hf, ok := f.(*HeadersFrame)
+ if !ok {
+ continue
+ }
+ var buf bytes.Buffer
+ enc := hpack.NewEncoder(&buf)
+ enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"})
+ enc.WriteField(hpack.HeaderField{Name: "content-length", Value: strconv.Itoa(len(response))})
+ ct.fr.WriteHeaders(HeadersFrameParam{
+ StreamID: hf.StreamID,
+ EndHeaders: true,
+ EndStream: false,
+ BlockFragment: buf.Bytes(),
+ })
+ ct.fr.WriteData(hf.StreamID, true, []byte(response))
+
+ <-clientDone
+ return nil
+ }
+ }
+ ct.run()
+}
+
type neverEnding byte
func (b neverEnding) Read(p []byte) (int, error) {
@@ -3043,6 +3103,34 @@ func TestTransportCancelDataResponseRace(t *testing.T) {
}
}
+// Issue 21316: It should be safe to reuse an http.Request after the
+// request has completed.
+func TestTransportNoRaceOnRequestObjectAfterRequestComplete(t *testing.T) {
+ st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
+ w.WriteHeader(200)
+ io.WriteString(w, "body")
+ }, optOnlyServer)
+ defer st.Close()
+
+ tr := &Transport{TLSClientConfig: tlsConfigInsecure}
+ defer tr.CloseIdleConnections()
+
+ req, _ := http.NewRequest("GET", st.ts.URL, nil)
+ resp, err := tr.RoundTrip(req)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err = io.Copy(ioutil.Discard, resp.Body); err != nil {
+ t.Fatalf("error reading response body: %v", err)
+ }
+ if err := resp.Body.Close(); err != nil {
+ t.Fatalf("error closing response body: %v", err)
+ }
+
+ // This access of req.Header should not race with code in the transport.
+ req.Header = http.Header{}
+}
+
func TestTransportRetryAfterGOAWAY(t *testing.T) {
var dialer struct {
sync.Mutex
@@ -3301,6 +3389,11 @@ func TestTransportRetryHasLimit(t *testing.T) {
}
func TestTransportResponseDataBeforeHeaders(t *testing.T) {
+ // This test use not valid response format.
+ // Discarding logger output to not spam tests output.
+ log.SetOutput(ioutil.Discard)
+ defer log.SetOutput(os.Stderr)
+
ct := newClientTester(t)
ct.client = func() error {
defer ct.cc.(*net.TCPConn).CloseWrite()
@@ -3678,6 +3771,74 @@ func benchSimpleRoundTrip(b *testing.B, nHeaders int) {
}
}
+type infiniteReader struct{}
+
+func (r infiniteReader) Read(b []byte) (int, error) {
+ return len(b), nil
+}
+
+// Issue 20521: it is not an error to receive a response and end stream
+// from the server without the body being consumed.
+func TestTransportResponseAndResetWithoutConsumingBodyRace(t *testing.T) {
+ st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
+ w.WriteHeader(http.StatusOK)
+ }, optOnlyServer)
+ defer st.Close()
+
+ tr := &Transport{TLSClientConfig: tlsConfigInsecure}
+ defer tr.CloseIdleConnections()
+
+ // The request body needs to be big enough to trigger flow control.
+ req, _ := http.NewRequest("PUT", st.ts.URL, infiniteReader{})
+ res, err := tr.RoundTrip(req)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if res.StatusCode != http.StatusOK {
+ t.Fatalf("Response code = %v; want %v", res.StatusCode, http.StatusOK)
+ }
+}
+
+// Verify transport doesn't crash when receiving bogus response lacking a :status header.
+// Issue 22880.
+func TestTransportHandlesInvalidStatuslessResponse(t *testing.T) {
+ ct := newClientTester(t)
+ ct.client = func() error {
+ req, _ := http.NewRequest("GET", "https://dummy.tld/", nil)
+ _, err := ct.tr.RoundTrip(req)
+ const substr = "malformed response from server: missing status pseudo header"
+ if !strings.Contains(fmt.Sprint(err), substr) {
+ return fmt.Errorf("RoundTrip error = %v; want substring %q", err, substr)
+ }
+ return nil
+ }
+ ct.server = func() error {
+ ct.greet()
+ var buf bytes.Buffer
+ enc := hpack.NewEncoder(&buf)
+
+ for {
+ f, err := ct.fr.ReadFrame()
+ if err != nil {
+ return err
+ }
+ switch f := f.(type) {
+ case *HeadersFrame:
+ enc.WriteField(hpack.HeaderField{Name: "content-type", Value: "text/html"}) // no :status header
+ ct.fr.WriteHeaders(HeadersFrameParam{
+ StreamID: f.StreamID,
+ EndHeaders: true,
+ EndStream: false, // we'll send some DATA to try to crash the transport
+ BlockFragment: buf.Bytes(),
+ })
+ ct.fr.WriteData(f.StreamID, true, []byte("payload"))
+ return nil
+ }
+ }
+ }
+ ct.run()
+}
+
func BenchmarkClientRequestHeaders(b *testing.B) {
b.Run(" 0 Headers", func(b *testing.B) { benchSimpleRoundTrip(b, 0) })
b.Run(" 10 Headers", func(b *testing.B) { benchSimpleRoundTrip(b, 10) })
diff --git a/vendor/golang.org/x/net/http2/write.go b/vendor/golang.org/x/net/http2/write.go
index 6b0dfae..54ab4a8 100644
--- a/vendor/golang.org/x/net/http2/write.go
+++ b/vendor/golang.org/x/net/http2/write.go
@@ -10,7 +10,6 @@ import (
"log"
"net/http"
"net/url"
- "time"
"golang.org/x/net/http2/hpack"
"golang.org/x/net/lex/httplex"
@@ -90,11 +89,7 @@ type writeGoAway struct {
func (p *writeGoAway) writeFrame(ctx writeContext) error {
err := ctx.Framer().WriteGoAway(p.maxStreamID, p.code, nil)
- if p.code != 0 {
- ctx.Flush() // ignore error: we're hanging up on them anyway
- time.Sleep(50 * time.Millisecond)
- ctx.CloseConn()
- }
+ ctx.Flush() // ignore error: we're hanging up on them anyway
return err
}
diff --git a/vendor/golang.org/x/net/idna/idna.go b/vendor/golang.org/x/net/idna/idna.go
index ec8232b..346fe44 100644
--- a/vendor/golang.org/x/net/idna/idna.go
+++ b/vendor/golang.org/x/net/idna/idna.go
@@ -21,6 +21,7 @@ import (
"unicode/utf8"
"golang.org/x/text/secure/bidirule"
+ "golang.org/x/text/unicode/bidi"
"golang.org/x/text/unicode/norm"
)
@@ -68,7 +69,7 @@ func VerifyDNSLength(verify bool) Option {
}
// RemoveLeadingDots removes leading label separators. Leading runes that map to
-// dots, such as U+3002, are removed as well.
+// dots, such as U+3002 IDEOGRAPHIC FULL STOP, are removed as well.
//
// This is the behavior suggested by the UTS #46 and is adopted by some
// browsers.
@@ -92,7 +93,7 @@ func ValidateLabels(enable bool) Option {
}
}
-// StrictDomainName limits the set of permissable ASCII characters to those
+// StrictDomainName limits the set of permissible ASCII characters to those
// allowed in domain names as defined in RFC 1034 (A-Z, a-z, 0-9 and the
// hyphen). This is set by default for MapForLookup and ValidateForRegistration.
//
@@ -142,7 +143,6 @@ func MapForLookup() Option {
o.mapping = validateAndMap
StrictDomainName(true)(o)
ValidateLabels(true)(o)
- RemoveLeadingDots(true)(o)
}
}
@@ -160,7 +160,7 @@ type options struct {
// mapping implements a validation and mapping step as defined in RFC 5895
// or UTS 46, tailored to, for example, domain registration or lookup.
- mapping func(p *Profile, s string) (string, error)
+ mapping func(p *Profile, s string) (mapped string, isBidi bool, err error)
// bidirule, if specified, checks whether s conforms to the Bidi Rule
// defined in RFC 5893.
@@ -251,23 +251,21 @@ var (
punycode = &Profile{}
lookup = &Profile{options{
- transitional: true,
- useSTD3Rules: true,
- validateLabels: true,
- removeLeadingDots: true,
- trie: trie,
- fromPuny: validateFromPunycode,
- mapping: validateAndMap,
- bidirule: bidirule.ValidString,
+ transitional: true,
+ useSTD3Rules: true,
+ validateLabels: true,
+ trie: trie,
+ fromPuny: validateFromPunycode,
+ mapping: validateAndMap,
+ bidirule: bidirule.ValidString,
}}
display = &Profile{options{
- useSTD3Rules: true,
- validateLabels: true,
- removeLeadingDots: true,
- trie: trie,
- fromPuny: validateFromPunycode,
- mapping: validateAndMap,
- bidirule: bidirule.ValidString,
+ useSTD3Rules: true,
+ validateLabels: true,
+ trie: trie,
+ fromPuny: validateFromPunycode,
+ mapping: validateAndMap,
+ bidirule: bidirule.ValidString,
}}
registration = &Profile{options{
useSTD3Rules: true,
@@ -302,14 +300,16 @@ func (e runeError) Error() string {
// see http://www.unicode.org/reports/tr46.
func (p *Profile) process(s string, toASCII bool) (string, error) {
var err error
+ var isBidi bool
if p.mapping != nil {
- s, err = p.mapping(p, s)
+ s, isBidi, err = p.mapping(p, s)
}
// Remove leading empty labels.
if p.removeLeadingDots {
for ; len(s) > 0 && s[0] == '.'; s = s[1:] {
}
}
+ // TODO: allow for a quick check of the tables data.
// It seems like we should only create this error on ToASCII, but the
// UTS 46 conformance tests suggests we should always check this.
if err == nil && p.verifyDNSLength && s == "" {
@@ -335,6 +335,7 @@ func (p *Profile) process(s string, toASCII bool) (string, error) {
// Spec says keep the old label.
continue
}
+ isBidi = isBidi || bidirule.DirectionString(u) != bidi.LeftToRight
labels.set(u)
if err == nil && p.validateLabels {
err = p.fromPuny(p, u)
@@ -349,6 +350,14 @@ func (p *Profile) process(s string, toASCII bool) (string, error) {
err = p.validateLabel(label)
}
}
+ if isBidi && p.bidirule != nil && err == nil {
+ for labels.reset(); !labels.done(); labels.next() {
+ if !p.bidirule(labels.label()) {
+ err = &labelError{s, "B"}
+ break
+ }
+ }
+ }
if toASCII {
for labels.reset(); !labels.done(); labels.next() {
label := labels.label()
@@ -380,16 +389,26 @@ func (p *Profile) process(s string, toASCII bool) (string, error) {
return s, err
}
-func normalize(p *Profile, s string) (string, error) {
- return norm.NFC.String(s), nil
+func normalize(p *Profile, s string) (mapped string, isBidi bool, err error) {
+ // TODO: consider first doing a quick check to see if any of these checks
+ // need to be done. This will make it slower in the general case, but
+ // faster in the common case.
+ mapped = norm.NFC.String(s)
+ isBidi = bidirule.DirectionString(mapped) == bidi.RightToLeft
+ return mapped, isBidi, nil
}
-func validateRegistration(p *Profile, s string) (string, error) {
+func validateRegistration(p *Profile, s string) (idem string, bidi bool, err error) {
+ // TODO: filter need for normalization in loop below.
if !norm.NFC.IsNormalString(s) {
- return s, &labelError{s, "V1"}
+ return s, false, &labelError{s, "V1"}
}
for i := 0; i < len(s); {
v, sz := trie.lookupString(s[i:])
+ if sz == 0 {
+ return s, bidi, runeError(utf8.RuneError)
+ }
+ bidi = bidi || info(v).isBidi(s[i:])
// Copy bytes not copied so far.
switch p.simplify(info(v).category()) {
// TODO: handle the NV8 defined in the Unicode idna data set to allow
@@ -397,21 +416,50 @@ func validateRegistration(p *Profile, s string) (string, error) {
case valid, deviation:
case disallowed, mapped, unknown, ignored:
r, _ := utf8.DecodeRuneInString(s[i:])
- return s, runeError(r)
+ return s, bidi, runeError(r)
}
i += sz
}
- return s, nil
+ return s, bidi, nil
}
-func validateAndMap(p *Profile, s string) (string, error) {
+func (c info) isBidi(s string) bool {
+ if !c.isMapped() {
+ return c&attributesMask == rtl
+ }
+ // TODO: also store bidi info for mapped data. This is possible, but a bit
+ // cumbersome and not for the common case.
+ p, _ := bidi.LookupString(s)
+ switch p.Class() {
+ case bidi.R, bidi.AL, bidi.AN:
+ return true
+ }
+ return false
+}
+
+func validateAndMap(p *Profile, s string) (vm string, bidi bool, err error) {
var (
- err error
- b []byte
- k int
+ b []byte
+ k int
)
+ // combinedInfoBits contains the or-ed bits of all runes. We use this
+ // to derive the mayNeedNorm bit later. This may trigger normalization
+ // overeagerly, but it will not do so in the common case. The end result
+ // is another 10% saving on BenchmarkProfile for the common case.
+ var combinedInfoBits info
for i := 0; i < len(s); {
v, sz := trie.lookupString(s[i:])
+ if sz == 0 {
+ b = append(b, s[k:i]...)
+ b = append(b, "\ufffd"...)
+ k = len(s)
+ if err == nil {
+ err = runeError(utf8.RuneError)
+ }
+ break
+ }
+ combinedInfoBits |= info(v)
+ bidi = bidi || info(v).isBidi(s[i:])
start := i
i += sz
// Copy bytes not copied so far.
@@ -438,7 +486,9 @@ func validateAndMap(p *Profile, s string) (string, error) {
}
if k == 0 {
// No changes so far.
- s = norm.NFC.String(s)
+ if combinedInfoBits&mayNeedNorm != 0 {
+ s = norm.NFC.String(s)
+ }
} else {
b = append(b, s[k:]...)
if norm.NFC.QuickSpan(b) != len(b) {
@@ -447,7 +497,7 @@ func validateAndMap(p *Profile, s string) (string, error) {
// TODO: the punycode converters require strings as input.
s = string(b)
}
- return s, err
+ return s, bidi, err
}
// A labelIter allows iterating over domain name labels.
@@ -542,8 +592,13 @@ func validateFromPunycode(p *Profile, s string) error {
if !norm.NFC.IsNormalString(s) {
return &labelError{s, "V1"}
}
+ // TODO: detect whether string may have to be normalized in the following
+ // loop.
for i := 0; i < len(s); {
v, sz := trie.lookupString(s[i:])
+ if sz == 0 {
+ return runeError(utf8.RuneError)
+ }
if c := p.simplify(info(v).category()); c != valid && c != deviation {
return &labelError{s, "V6"}
}
@@ -616,16 +671,13 @@ var joinStates = [][numJoinTypes]joinState{
// validateLabel validates the criteria from Section 4.1. Item 1, 4, and 6 are
// already implicitly satisfied by the overall implementation.
-func (p *Profile) validateLabel(s string) error {
+func (p *Profile) validateLabel(s string) (err error) {
if s == "" {
if p.verifyDNSLength {
return &labelError{s, "A4"}
}
return nil
}
- if p.bidirule != nil && !p.bidirule(s) {
- return &labelError{s, "B"}
- }
if !p.validateLabels {
return nil
}
diff --git a/vendor/golang.org/x/net/idna/tables.go b/vendor/golang.org/x/net/idna/tables.go
index d281934..f910b26 100644
--- a/vendor/golang.org/x/net/idna/tables.go
+++ b/vendor/golang.org/x/net/idna/tables.go
@@ -3,7 +3,7 @@
package idna
// UnicodeVersion is the Unicode version from which the tables in this package are derived.
-const UnicodeVersion = "9.0.0"
+const UnicodeVersion = "10.0.0"
var mappings string = "" + // Size: 8176 bytes
"\x00\x01 \x03 ̈\x01a\x03 ̄\x012\x013\x03 ́\x03 ̧\x011\x01o\x051⁄4\x051⁄2" +
@@ -544,7 +544,7 @@ func (t *idnaTrie) lookupStringUnsafe(s string) uint16 {
return 0
}
-// idnaTrie. Total size: 28496 bytes (27.83 KiB). Checksum: 43288b883596640e.
+// idnaTrie. Total size: 29052 bytes (28.37 KiB). Checksum: ef06e7ecc26f36dd.
type idnaTrie struct{}
func newIdnaTrie(i int) *idnaTrie {
@@ -554,17 +554,17 @@ func newIdnaTrie(i int) *idnaTrie {
// lookupValue determines the type of block n and looks up the value for b.
func (t *idnaTrie) lookupValue(n uint32, b byte) uint16 {
switch {
- case n < 123:
+ case n < 125:
return uint16(idnaValues[n<<6+uint32(b)])
default:
- n -= 123
+ n -= 125
return uint16(idnaSparse.lookup(n, b))
}
}
-// idnaValues: 125 blocks, 8000 entries, 16000 bytes
+// idnaValues: 127 blocks, 8128 entries, 16256 bytes
// The third block is the zero block.
-var idnaValues = [8000]uint16{
+var idnaValues = [8128]uint16{
// Block 0x0, offset 0x0
0x00: 0x0080, 0x01: 0x0080, 0x02: 0x0080, 0x03: 0x0080, 0x04: 0x0080, 0x05: 0x0080,
0x06: 0x0080, 0x07: 0x0080, 0x08: 0x0080, 0x09: 0x0080, 0x0a: 0x0080, 0x0b: 0x0080,
@@ -675,14 +675,14 @@ var idnaValues = [8000]uint16{
0x276: 0x0018, 0x277: 0x0018, 0x278: 0x0018, 0x279: 0x0018, 0x27a: 0x0018, 0x27b: 0x0018,
0x27c: 0x0018, 0x27d: 0x0018, 0x27e: 0x0018, 0x27f: 0x0018,
// Block 0xa, offset 0x280
- 0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x1308, 0x283: 0x03f5, 0x284: 0x0379, 0x285: 0x040d,
- 0x286: 0x1308, 0x287: 0x1308, 0x288: 0x1308, 0x289: 0x1308, 0x28a: 0x1308, 0x28b: 0x1308,
- 0x28c: 0x1308, 0x28d: 0x1308, 0x28e: 0x1308, 0x28f: 0x13c0, 0x290: 0x1308, 0x291: 0x1308,
- 0x292: 0x1308, 0x293: 0x1308, 0x294: 0x1308, 0x295: 0x1308, 0x296: 0x1308, 0x297: 0x1308,
- 0x298: 0x1308, 0x299: 0x1308, 0x29a: 0x1308, 0x29b: 0x1308, 0x29c: 0x1308, 0x29d: 0x1308,
- 0x29e: 0x1308, 0x29f: 0x1308, 0x2a0: 0x1308, 0x2a1: 0x1308, 0x2a2: 0x1308, 0x2a3: 0x1308,
- 0x2a4: 0x1308, 0x2a5: 0x1308, 0x2a6: 0x1308, 0x2a7: 0x1308, 0x2a8: 0x1308, 0x2a9: 0x1308,
- 0x2aa: 0x1308, 0x2ab: 0x1308, 0x2ac: 0x1308, 0x2ad: 0x1308, 0x2ae: 0x1308, 0x2af: 0x1308,
+ 0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x3308, 0x283: 0x03f5, 0x284: 0x0379, 0x285: 0x040d,
+ 0x286: 0x3308, 0x287: 0x3308, 0x288: 0x3308, 0x289: 0x3308, 0x28a: 0x3308, 0x28b: 0x3308,
+ 0x28c: 0x3308, 0x28d: 0x3308, 0x28e: 0x3308, 0x28f: 0x33c0, 0x290: 0x3308, 0x291: 0x3308,
+ 0x292: 0x3308, 0x293: 0x3308, 0x294: 0x3308, 0x295: 0x3308, 0x296: 0x3308, 0x297: 0x3308,
+ 0x298: 0x3308, 0x299: 0x3308, 0x29a: 0x3308, 0x29b: 0x3308, 0x29c: 0x3308, 0x29d: 0x3308,
+ 0x29e: 0x3308, 0x29f: 0x3308, 0x2a0: 0x3308, 0x2a1: 0x3308, 0x2a2: 0x3308, 0x2a3: 0x3308,
+ 0x2a4: 0x3308, 0x2a5: 0x3308, 0x2a6: 0x3308, 0x2a7: 0x3308, 0x2a8: 0x3308, 0x2a9: 0x3308,
+ 0x2aa: 0x3308, 0x2ab: 0x3308, 0x2ac: 0x3308, 0x2ad: 0x3308, 0x2ae: 0x3308, 0x2af: 0x3308,
0x2b0: 0xe00d, 0x2b1: 0x0008, 0x2b2: 0xe00d, 0x2b3: 0x0008, 0x2b4: 0x0425, 0x2b5: 0x0008,
0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x03a2, 0x2bb: 0x0008,
0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x03c2, 0x2bf: 0x043d,
@@ -723,8 +723,8 @@ var idnaValues = [8000]uint16{
0x376: 0xe00d, 0x377: 0x0008, 0x378: 0xe00d, 0x379: 0x0008, 0x37a: 0xe00d, 0x37b: 0x0008,
0x37c: 0xe00d, 0x37d: 0x0008, 0x37e: 0xe00d, 0x37f: 0x0008,
// Block 0xe, offset 0x380
- 0x380: 0xe00d, 0x381: 0x0008, 0x382: 0x0018, 0x383: 0x1308, 0x384: 0x1308, 0x385: 0x1308,
- 0x386: 0x1308, 0x387: 0x1308, 0x388: 0x1318, 0x389: 0x1318, 0x38a: 0xe00d, 0x38b: 0x0008,
+ 0x380: 0xe00d, 0x381: 0x0008, 0x382: 0x0018, 0x383: 0x3308, 0x384: 0x3308, 0x385: 0x3308,
+ 0x386: 0x3308, 0x387: 0x3308, 0x388: 0x3318, 0x389: 0x3318, 0x38a: 0xe00d, 0x38b: 0x0008,
0x38c: 0xe00d, 0x38d: 0x0008, 0x38e: 0xe00d, 0x38f: 0x0008, 0x390: 0xe00d, 0x391: 0x0008,
0x392: 0xe00d, 0x393: 0x0008, 0x394: 0xe00d, 0x395: 0x0008, 0x396: 0xe00d, 0x397: 0x0008,
0x398: 0xe00d, 0x399: 0x0008, 0x39a: 0xe00d, 0x39b: 0x0008, 0x39c: 0xe00d, 0x39d: 0x0008,
@@ -759,129 +759,129 @@ var idnaValues = [8000]uint16{
0x436: 0x03f5, 0x437: 0x03f5, 0x438: 0x03f5, 0x439: 0x03f5, 0x43a: 0x03f5, 0x43b: 0x03f5,
0x43c: 0x03f5, 0x43d: 0x03f5, 0x43e: 0x03f5, 0x43f: 0x03f5,
// Block 0x11, offset 0x440
- 0x440: 0x0040, 0x441: 0x0040, 0x442: 0x0040, 0x443: 0x0040, 0x444: 0x0040, 0x445: 0x0040,
- 0x446: 0x0018, 0x447: 0x0018, 0x448: 0x0018, 0x449: 0x0018, 0x44a: 0x0018, 0x44b: 0x0018,
- 0x44c: 0x0018, 0x44d: 0x0018, 0x44e: 0x0018, 0x44f: 0x0018, 0x450: 0x1308, 0x451: 0x1308,
- 0x452: 0x1308, 0x453: 0x1308, 0x454: 0x1308, 0x455: 0x1308, 0x456: 0x1308, 0x457: 0x1308,
- 0x458: 0x1308, 0x459: 0x1308, 0x45a: 0x1308, 0x45b: 0x0018, 0x45c: 0x0340, 0x45d: 0x0040,
- 0x45e: 0x0018, 0x45f: 0x0018, 0x460: 0x0208, 0x461: 0x0008, 0x462: 0x0408, 0x463: 0x0408,
- 0x464: 0x0408, 0x465: 0x0408, 0x466: 0x0208, 0x467: 0x0408, 0x468: 0x0208, 0x469: 0x0408,
- 0x46a: 0x0208, 0x46b: 0x0208, 0x46c: 0x0208, 0x46d: 0x0208, 0x46e: 0x0208, 0x46f: 0x0408,
- 0x470: 0x0408, 0x471: 0x0408, 0x472: 0x0408, 0x473: 0x0208, 0x474: 0x0208, 0x475: 0x0208,
- 0x476: 0x0208, 0x477: 0x0208, 0x478: 0x0208, 0x479: 0x0208, 0x47a: 0x0208, 0x47b: 0x0208,
- 0x47c: 0x0208, 0x47d: 0x0208, 0x47e: 0x0208, 0x47f: 0x0208,
+ 0x440: 0x0840, 0x441: 0x0840, 0x442: 0x0840, 0x443: 0x0840, 0x444: 0x0840, 0x445: 0x0840,
+ 0x446: 0x0018, 0x447: 0x0018, 0x448: 0x0818, 0x449: 0x0018, 0x44a: 0x0018, 0x44b: 0x0818,
+ 0x44c: 0x0018, 0x44d: 0x0818, 0x44e: 0x0018, 0x44f: 0x0018, 0x450: 0x3308, 0x451: 0x3308,
+ 0x452: 0x3308, 0x453: 0x3308, 0x454: 0x3308, 0x455: 0x3308, 0x456: 0x3308, 0x457: 0x3308,
+ 0x458: 0x3308, 0x459: 0x3308, 0x45a: 0x3308, 0x45b: 0x0818, 0x45c: 0x0b40, 0x45d: 0x0040,
+ 0x45e: 0x0818, 0x45f: 0x0818, 0x460: 0x0a08, 0x461: 0x0808, 0x462: 0x0c08, 0x463: 0x0c08,
+ 0x464: 0x0c08, 0x465: 0x0c08, 0x466: 0x0a08, 0x467: 0x0c08, 0x468: 0x0a08, 0x469: 0x0c08,
+ 0x46a: 0x0a08, 0x46b: 0x0a08, 0x46c: 0x0a08, 0x46d: 0x0a08, 0x46e: 0x0a08, 0x46f: 0x0c08,
+ 0x470: 0x0c08, 0x471: 0x0c08, 0x472: 0x0c08, 0x473: 0x0a08, 0x474: 0x0a08, 0x475: 0x0a08,
+ 0x476: 0x0a08, 0x477: 0x0a08, 0x478: 0x0a08, 0x479: 0x0a08, 0x47a: 0x0a08, 0x47b: 0x0a08,
+ 0x47c: 0x0a08, 0x47d: 0x0a08, 0x47e: 0x0a08, 0x47f: 0x0a08,
// Block 0x12, offset 0x480
- 0x480: 0x0408, 0x481: 0x0208, 0x482: 0x0208, 0x483: 0x0408, 0x484: 0x0408, 0x485: 0x0408,
- 0x486: 0x0408, 0x487: 0x0408, 0x488: 0x0408, 0x489: 0x0408, 0x48a: 0x0408, 0x48b: 0x0408,
- 0x48c: 0x0208, 0x48d: 0x0408, 0x48e: 0x0208, 0x48f: 0x0408, 0x490: 0x0208, 0x491: 0x0208,
- 0x492: 0x0408, 0x493: 0x0408, 0x494: 0x0018, 0x495: 0x0408, 0x496: 0x1308, 0x497: 0x1308,
- 0x498: 0x1308, 0x499: 0x1308, 0x49a: 0x1308, 0x49b: 0x1308, 0x49c: 0x1308, 0x49d: 0x0040,
- 0x49e: 0x0018, 0x49f: 0x1308, 0x4a0: 0x1308, 0x4a1: 0x1308, 0x4a2: 0x1308, 0x4a3: 0x1308,
- 0x4a4: 0x1308, 0x4a5: 0x0008, 0x4a6: 0x0008, 0x4a7: 0x1308, 0x4a8: 0x1308, 0x4a9: 0x0018,
- 0x4aa: 0x1308, 0x4ab: 0x1308, 0x4ac: 0x1308, 0x4ad: 0x1308, 0x4ae: 0x0408, 0x4af: 0x0408,
- 0x4b0: 0x0008, 0x4b1: 0x0008, 0x4b2: 0x0008, 0x4b3: 0x0008, 0x4b4: 0x0008, 0x4b5: 0x0008,
- 0x4b6: 0x0008, 0x4b7: 0x0008, 0x4b8: 0x0008, 0x4b9: 0x0008, 0x4ba: 0x0208, 0x4bb: 0x0208,
- 0x4bc: 0x0208, 0x4bd: 0x0008, 0x4be: 0x0008, 0x4bf: 0x0208,
+ 0x480: 0x0818, 0x481: 0x0a08, 0x482: 0x0a08, 0x483: 0x0a08, 0x484: 0x0a08, 0x485: 0x0a08,
+ 0x486: 0x0a08, 0x487: 0x0a08, 0x488: 0x0c08, 0x489: 0x0a08, 0x48a: 0x0a08, 0x48b: 0x3308,
+ 0x48c: 0x3308, 0x48d: 0x3308, 0x48e: 0x3308, 0x48f: 0x3308, 0x490: 0x3308, 0x491: 0x3308,
+ 0x492: 0x3308, 0x493: 0x3308, 0x494: 0x3308, 0x495: 0x3308, 0x496: 0x3308, 0x497: 0x3308,
+ 0x498: 0x3308, 0x499: 0x3308, 0x49a: 0x3308, 0x49b: 0x3308, 0x49c: 0x3308, 0x49d: 0x3308,
+ 0x49e: 0x3308, 0x49f: 0x3308, 0x4a0: 0x0808, 0x4a1: 0x0808, 0x4a2: 0x0808, 0x4a3: 0x0808,
+ 0x4a4: 0x0808, 0x4a5: 0x0808, 0x4a6: 0x0808, 0x4a7: 0x0808, 0x4a8: 0x0808, 0x4a9: 0x0808,
+ 0x4aa: 0x0018, 0x4ab: 0x0818, 0x4ac: 0x0818, 0x4ad: 0x0818, 0x4ae: 0x0a08, 0x4af: 0x0a08,
+ 0x4b0: 0x3308, 0x4b1: 0x0c08, 0x4b2: 0x0c08, 0x4b3: 0x0c08, 0x4b4: 0x0808, 0x4b5: 0x0429,
+ 0x4b6: 0x0451, 0x4b7: 0x0479, 0x4b8: 0x04a1, 0x4b9: 0x0a08, 0x4ba: 0x0a08, 0x4bb: 0x0a08,
+ 0x4bc: 0x0a08, 0x4bd: 0x0a08, 0x4be: 0x0a08, 0x4bf: 0x0a08,
// Block 0x13, offset 0x4c0
- 0x4c0: 0x0018, 0x4c1: 0x0018, 0x4c2: 0x0018, 0x4c3: 0x0018, 0x4c4: 0x0018, 0x4c5: 0x0018,
- 0x4c6: 0x0018, 0x4c7: 0x0018, 0x4c8: 0x0018, 0x4c9: 0x0018, 0x4ca: 0x0018, 0x4cb: 0x0018,
- 0x4cc: 0x0018, 0x4cd: 0x0018, 0x4ce: 0x0040, 0x4cf: 0x0340, 0x4d0: 0x0408, 0x4d1: 0x1308,
- 0x4d2: 0x0208, 0x4d3: 0x0208, 0x4d4: 0x0208, 0x4d5: 0x0408, 0x4d6: 0x0408, 0x4d7: 0x0408,
- 0x4d8: 0x0408, 0x4d9: 0x0408, 0x4da: 0x0208, 0x4db: 0x0208, 0x4dc: 0x0208, 0x4dd: 0x0208,
- 0x4de: 0x0408, 0x4df: 0x0208, 0x4e0: 0x0208, 0x4e1: 0x0208, 0x4e2: 0x0208, 0x4e3: 0x0208,
- 0x4e4: 0x0208, 0x4e5: 0x0208, 0x4e6: 0x0208, 0x4e7: 0x0208, 0x4e8: 0x0408, 0x4e9: 0x0208,
- 0x4ea: 0x0408, 0x4eb: 0x0208, 0x4ec: 0x0408, 0x4ed: 0x0208, 0x4ee: 0x0208, 0x4ef: 0x0408,
- 0x4f0: 0x1308, 0x4f1: 0x1308, 0x4f2: 0x1308, 0x4f3: 0x1308, 0x4f4: 0x1308, 0x4f5: 0x1308,
- 0x4f6: 0x1308, 0x4f7: 0x1308, 0x4f8: 0x1308, 0x4f9: 0x1308, 0x4fa: 0x1308, 0x4fb: 0x1308,
- 0x4fc: 0x1308, 0x4fd: 0x1308, 0x4fe: 0x1308, 0x4ff: 0x1308,
+ 0x4c0: 0x0c08, 0x4c1: 0x0a08, 0x4c2: 0x0a08, 0x4c3: 0x0c08, 0x4c4: 0x0c08, 0x4c5: 0x0c08,
+ 0x4c6: 0x0c08, 0x4c7: 0x0c08, 0x4c8: 0x0c08, 0x4c9: 0x0c08, 0x4ca: 0x0c08, 0x4cb: 0x0c08,
+ 0x4cc: 0x0a08, 0x4cd: 0x0c08, 0x4ce: 0x0a08, 0x4cf: 0x0c08, 0x4d0: 0x0a08, 0x4d1: 0x0a08,
+ 0x4d2: 0x0c08, 0x4d3: 0x0c08, 0x4d4: 0x0818, 0x4d5: 0x0c08, 0x4d6: 0x3308, 0x4d7: 0x3308,
+ 0x4d8: 0x3308, 0x4d9: 0x3308, 0x4da: 0x3308, 0x4db: 0x3308, 0x4dc: 0x3308, 0x4dd: 0x0840,
+ 0x4de: 0x0018, 0x4df: 0x3308, 0x4e0: 0x3308, 0x4e1: 0x3308, 0x4e2: 0x3308, 0x4e3: 0x3308,
+ 0x4e4: 0x3308, 0x4e5: 0x0808, 0x4e6: 0x0808, 0x4e7: 0x3308, 0x4e8: 0x3308, 0x4e9: 0x0018,
+ 0x4ea: 0x3308, 0x4eb: 0x3308, 0x4ec: 0x3308, 0x4ed: 0x3308, 0x4ee: 0x0c08, 0x4ef: 0x0c08,
+ 0x4f0: 0x0008, 0x4f1: 0x0008, 0x4f2: 0x0008, 0x4f3: 0x0008, 0x4f4: 0x0008, 0x4f5: 0x0008,
+ 0x4f6: 0x0008, 0x4f7: 0x0008, 0x4f8: 0x0008, 0x4f9: 0x0008, 0x4fa: 0x0a08, 0x4fb: 0x0a08,
+ 0x4fc: 0x0a08, 0x4fd: 0x0808, 0x4fe: 0x0808, 0x4ff: 0x0a08,
// Block 0x14, offset 0x500
- 0x500: 0x1008, 0x501: 0x1308, 0x502: 0x1308, 0x503: 0x1308, 0x504: 0x1308, 0x505: 0x1308,
- 0x506: 0x1308, 0x507: 0x1308, 0x508: 0x1308, 0x509: 0x1008, 0x50a: 0x1008, 0x50b: 0x1008,
- 0x50c: 0x1008, 0x50d: 0x1b08, 0x50e: 0x1008, 0x50f: 0x1008, 0x510: 0x0008, 0x511: 0x1308,
- 0x512: 0x1308, 0x513: 0x1308, 0x514: 0x1308, 0x515: 0x1308, 0x516: 0x1308, 0x517: 0x1308,
- 0x518: 0x04c9, 0x519: 0x0501, 0x51a: 0x0539, 0x51b: 0x0571, 0x51c: 0x05a9, 0x51d: 0x05e1,
- 0x51e: 0x0619, 0x51f: 0x0651, 0x520: 0x0008, 0x521: 0x0008, 0x522: 0x1308, 0x523: 0x1308,
- 0x524: 0x0018, 0x525: 0x0018, 0x526: 0x0008, 0x527: 0x0008, 0x528: 0x0008, 0x529: 0x0008,
- 0x52a: 0x0008, 0x52b: 0x0008, 0x52c: 0x0008, 0x52d: 0x0008, 0x52e: 0x0008, 0x52f: 0x0008,
- 0x530: 0x0018, 0x531: 0x0008, 0x532: 0x0008, 0x533: 0x0008, 0x534: 0x0008, 0x535: 0x0008,
- 0x536: 0x0008, 0x537: 0x0008, 0x538: 0x0008, 0x539: 0x0008, 0x53a: 0x0008, 0x53b: 0x0008,
- 0x53c: 0x0008, 0x53d: 0x0008, 0x53e: 0x0008, 0x53f: 0x0008,
+ 0x500: 0x0818, 0x501: 0x0818, 0x502: 0x0818, 0x503: 0x0818, 0x504: 0x0818, 0x505: 0x0818,
+ 0x506: 0x0818, 0x507: 0x0818, 0x508: 0x0818, 0x509: 0x0818, 0x50a: 0x0818, 0x50b: 0x0818,
+ 0x50c: 0x0818, 0x50d: 0x0818, 0x50e: 0x0040, 0x50f: 0x0b40, 0x510: 0x0c08, 0x511: 0x3308,
+ 0x512: 0x0a08, 0x513: 0x0a08, 0x514: 0x0a08, 0x515: 0x0c08, 0x516: 0x0c08, 0x517: 0x0c08,
+ 0x518: 0x0c08, 0x519: 0x0c08, 0x51a: 0x0a08, 0x51b: 0x0a08, 0x51c: 0x0a08, 0x51d: 0x0a08,
+ 0x51e: 0x0c08, 0x51f: 0x0a08, 0x520: 0x0a08, 0x521: 0x0a08, 0x522: 0x0a08, 0x523: 0x0a08,
+ 0x524: 0x0a08, 0x525: 0x0a08, 0x526: 0x0a08, 0x527: 0x0a08, 0x528: 0x0c08, 0x529: 0x0a08,
+ 0x52a: 0x0c08, 0x52b: 0x0a08, 0x52c: 0x0c08, 0x52d: 0x0a08, 0x52e: 0x0a08, 0x52f: 0x0c08,
+ 0x530: 0x3308, 0x531: 0x3308, 0x532: 0x3308, 0x533: 0x3308, 0x534: 0x3308, 0x535: 0x3308,
+ 0x536: 0x3308, 0x537: 0x3308, 0x538: 0x3308, 0x539: 0x3308, 0x53a: 0x3308, 0x53b: 0x3308,
+ 0x53c: 0x3308, 0x53d: 0x3308, 0x53e: 0x3308, 0x53f: 0x3308,
// Block 0x15, offset 0x540
- 0x540: 0x0008, 0x541: 0x1308, 0x542: 0x1008, 0x543: 0x1008, 0x544: 0x0040, 0x545: 0x0008,
- 0x546: 0x0008, 0x547: 0x0008, 0x548: 0x0008, 0x549: 0x0008, 0x54a: 0x0008, 0x54b: 0x0008,
- 0x54c: 0x0008, 0x54d: 0x0040, 0x54e: 0x0040, 0x54f: 0x0008, 0x550: 0x0008, 0x551: 0x0040,
- 0x552: 0x0040, 0x553: 0x0008, 0x554: 0x0008, 0x555: 0x0008, 0x556: 0x0008, 0x557: 0x0008,
- 0x558: 0x0008, 0x559: 0x0008, 0x55a: 0x0008, 0x55b: 0x0008, 0x55c: 0x0008, 0x55d: 0x0008,
- 0x55e: 0x0008, 0x55f: 0x0008, 0x560: 0x0008, 0x561: 0x0008, 0x562: 0x0008, 0x563: 0x0008,
- 0x564: 0x0008, 0x565: 0x0008, 0x566: 0x0008, 0x567: 0x0008, 0x568: 0x0008, 0x569: 0x0040,
- 0x56a: 0x0008, 0x56b: 0x0008, 0x56c: 0x0008, 0x56d: 0x0008, 0x56e: 0x0008, 0x56f: 0x0008,
- 0x570: 0x0008, 0x571: 0x0040, 0x572: 0x0008, 0x573: 0x0040, 0x574: 0x0040, 0x575: 0x0040,
- 0x576: 0x0008, 0x577: 0x0008, 0x578: 0x0008, 0x579: 0x0008, 0x57a: 0x0040, 0x57b: 0x0040,
- 0x57c: 0x1308, 0x57d: 0x0008, 0x57e: 0x1008, 0x57f: 0x1008,
+ 0x540: 0x0c08, 0x541: 0x0a08, 0x542: 0x0a08, 0x543: 0x0a08, 0x544: 0x0a08, 0x545: 0x0a08,
+ 0x546: 0x0c08, 0x547: 0x0c08, 0x548: 0x0a08, 0x549: 0x0c08, 0x54a: 0x0a08, 0x54b: 0x0a08,
+ 0x54c: 0x0a08, 0x54d: 0x0a08, 0x54e: 0x0a08, 0x54f: 0x0a08, 0x550: 0x0a08, 0x551: 0x0a08,
+ 0x552: 0x0a08, 0x553: 0x0a08, 0x554: 0x0c08, 0x555: 0x0a08, 0x556: 0x0808, 0x557: 0x0808,
+ 0x558: 0x0808, 0x559: 0x3308, 0x55a: 0x3308, 0x55b: 0x3308, 0x55c: 0x0040, 0x55d: 0x0040,
+ 0x55e: 0x0818, 0x55f: 0x0040, 0x560: 0x0a08, 0x561: 0x0808, 0x562: 0x0a08, 0x563: 0x0a08,
+ 0x564: 0x0a08, 0x565: 0x0a08, 0x566: 0x0808, 0x567: 0x0c08, 0x568: 0x0a08, 0x569: 0x0c08,
+ 0x56a: 0x0c08, 0x56b: 0x0040, 0x56c: 0x0040, 0x56d: 0x0040, 0x56e: 0x0040, 0x56f: 0x0040,
+ 0x570: 0x0040, 0x571: 0x0040, 0x572: 0x0040, 0x573: 0x0040, 0x574: 0x0040, 0x575: 0x0040,
+ 0x576: 0x0040, 0x577: 0x0040, 0x578: 0x0040, 0x579: 0x0040, 0x57a: 0x0040, 0x57b: 0x0040,
+ 0x57c: 0x0040, 0x57d: 0x0040, 0x57e: 0x0040, 0x57f: 0x0040,
// Block 0x16, offset 0x580
- 0x580: 0x1008, 0x581: 0x1308, 0x582: 0x1308, 0x583: 0x1308, 0x584: 0x1308, 0x585: 0x0040,
- 0x586: 0x0040, 0x587: 0x1008, 0x588: 0x1008, 0x589: 0x0040, 0x58a: 0x0040, 0x58b: 0x1008,
- 0x58c: 0x1008, 0x58d: 0x1b08, 0x58e: 0x0008, 0x58f: 0x0040, 0x590: 0x0040, 0x591: 0x0040,
- 0x592: 0x0040, 0x593: 0x0040, 0x594: 0x0040, 0x595: 0x0040, 0x596: 0x0040, 0x597: 0x1008,
- 0x598: 0x0040, 0x599: 0x0040, 0x59a: 0x0040, 0x59b: 0x0040, 0x59c: 0x0689, 0x59d: 0x06c1,
- 0x59e: 0x0040, 0x59f: 0x06f9, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x1308, 0x5a3: 0x1308,
- 0x5a4: 0x0040, 0x5a5: 0x0040, 0x5a6: 0x0008, 0x5a7: 0x0008, 0x5a8: 0x0008, 0x5a9: 0x0008,
+ 0x580: 0x3008, 0x581: 0x3308, 0x582: 0x3308, 0x583: 0x3308, 0x584: 0x3308, 0x585: 0x3308,
+ 0x586: 0x3308, 0x587: 0x3308, 0x588: 0x3308, 0x589: 0x3008, 0x58a: 0x3008, 0x58b: 0x3008,
+ 0x58c: 0x3008, 0x58d: 0x3b08, 0x58e: 0x3008, 0x58f: 0x3008, 0x590: 0x0008, 0x591: 0x3308,
+ 0x592: 0x3308, 0x593: 0x3308, 0x594: 0x3308, 0x595: 0x3308, 0x596: 0x3308, 0x597: 0x3308,
+ 0x598: 0x04c9, 0x599: 0x0501, 0x59a: 0x0539, 0x59b: 0x0571, 0x59c: 0x05a9, 0x59d: 0x05e1,
+ 0x59e: 0x0619, 0x59f: 0x0651, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x3308, 0x5a3: 0x3308,
+ 0x5a4: 0x0018, 0x5a5: 0x0018, 0x5a6: 0x0008, 0x5a7: 0x0008, 0x5a8: 0x0008, 0x5a9: 0x0008,
0x5aa: 0x0008, 0x5ab: 0x0008, 0x5ac: 0x0008, 0x5ad: 0x0008, 0x5ae: 0x0008, 0x5af: 0x0008,
- 0x5b0: 0x0008, 0x5b1: 0x0008, 0x5b2: 0x0018, 0x5b3: 0x0018, 0x5b4: 0x0018, 0x5b5: 0x0018,
- 0x5b6: 0x0018, 0x5b7: 0x0018, 0x5b8: 0x0018, 0x5b9: 0x0018, 0x5ba: 0x0018, 0x5bb: 0x0018,
- 0x5bc: 0x0040, 0x5bd: 0x0040, 0x5be: 0x0040, 0x5bf: 0x0040,
+ 0x5b0: 0x0018, 0x5b1: 0x0008, 0x5b2: 0x0008, 0x5b3: 0x0008, 0x5b4: 0x0008, 0x5b5: 0x0008,
+ 0x5b6: 0x0008, 0x5b7: 0x0008, 0x5b8: 0x0008, 0x5b9: 0x0008, 0x5ba: 0x0008, 0x5bb: 0x0008,
+ 0x5bc: 0x0008, 0x5bd: 0x0008, 0x5be: 0x0008, 0x5bf: 0x0008,
// Block 0x17, offset 0x5c0
- 0x5c0: 0x0040, 0x5c1: 0x1308, 0x5c2: 0x1308, 0x5c3: 0x1008, 0x5c4: 0x0040, 0x5c5: 0x0008,
- 0x5c6: 0x0008, 0x5c7: 0x0008, 0x5c8: 0x0008, 0x5c9: 0x0008, 0x5ca: 0x0008, 0x5cb: 0x0040,
- 0x5cc: 0x0040, 0x5cd: 0x0040, 0x5ce: 0x0040, 0x5cf: 0x0008, 0x5d0: 0x0008, 0x5d1: 0x0040,
+ 0x5c0: 0x0008, 0x5c1: 0x3308, 0x5c2: 0x3008, 0x5c3: 0x3008, 0x5c4: 0x0040, 0x5c5: 0x0008,
+ 0x5c6: 0x0008, 0x5c7: 0x0008, 0x5c8: 0x0008, 0x5c9: 0x0008, 0x5ca: 0x0008, 0x5cb: 0x0008,
+ 0x5cc: 0x0008, 0x5cd: 0x0040, 0x5ce: 0x0040, 0x5cf: 0x0008, 0x5d0: 0x0008, 0x5d1: 0x0040,
0x5d2: 0x0040, 0x5d3: 0x0008, 0x5d4: 0x0008, 0x5d5: 0x0008, 0x5d6: 0x0008, 0x5d7: 0x0008,
0x5d8: 0x0008, 0x5d9: 0x0008, 0x5da: 0x0008, 0x5db: 0x0008, 0x5dc: 0x0008, 0x5dd: 0x0008,
0x5de: 0x0008, 0x5df: 0x0008, 0x5e0: 0x0008, 0x5e1: 0x0008, 0x5e2: 0x0008, 0x5e3: 0x0008,
0x5e4: 0x0008, 0x5e5: 0x0008, 0x5e6: 0x0008, 0x5e7: 0x0008, 0x5e8: 0x0008, 0x5e9: 0x0040,
0x5ea: 0x0008, 0x5eb: 0x0008, 0x5ec: 0x0008, 0x5ed: 0x0008, 0x5ee: 0x0008, 0x5ef: 0x0008,
- 0x5f0: 0x0008, 0x5f1: 0x0040, 0x5f2: 0x0008, 0x5f3: 0x0731, 0x5f4: 0x0040, 0x5f5: 0x0008,
- 0x5f6: 0x0769, 0x5f7: 0x0040, 0x5f8: 0x0008, 0x5f9: 0x0008, 0x5fa: 0x0040, 0x5fb: 0x0040,
- 0x5fc: 0x1308, 0x5fd: 0x0040, 0x5fe: 0x1008, 0x5ff: 0x1008,
+ 0x5f0: 0x0008, 0x5f1: 0x0040, 0x5f2: 0x0008, 0x5f3: 0x0040, 0x5f4: 0x0040, 0x5f5: 0x0040,
+ 0x5f6: 0x0008, 0x5f7: 0x0008, 0x5f8: 0x0008, 0x5f9: 0x0008, 0x5fa: 0x0040, 0x5fb: 0x0040,
+ 0x5fc: 0x3308, 0x5fd: 0x0008, 0x5fe: 0x3008, 0x5ff: 0x3008,
// Block 0x18, offset 0x600
- 0x600: 0x1008, 0x601: 0x1308, 0x602: 0x1308, 0x603: 0x0040, 0x604: 0x0040, 0x605: 0x0040,
- 0x606: 0x0040, 0x607: 0x1308, 0x608: 0x1308, 0x609: 0x0040, 0x60a: 0x0040, 0x60b: 0x1308,
- 0x60c: 0x1308, 0x60d: 0x1b08, 0x60e: 0x0040, 0x60f: 0x0040, 0x610: 0x0040, 0x611: 0x1308,
- 0x612: 0x0040, 0x613: 0x0040, 0x614: 0x0040, 0x615: 0x0040, 0x616: 0x0040, 0x617: 0x0040,
- 0x618: 0x0040, 0x619: 0x07a1, 0x61a: 0x07d9, 0x61b: 0x0811, 0x61c: 0x0008, 0x61d: 0x0040,
- 0x61e: 0x0849, 0x61f: 0x0040, 0x620: 0x0040, 0x621: 0x0040, 0x622: 0x0040, 0x623: 0x0040,
+ 0x600: 0x3008, 0x601: 0x3308, 0x602: 0x3308, 0x603: 0x3308, 0x604: 0x3308, 0x605: 0x0040,
+ 0x606: 0x0040, 0x607: 0x3008, 0x608: 0x3008, 0x609: 0x0040, 0x60a: 0x0040, 0x60b: 0x3008,
+ 0x60c: 0x3008, 0x60d: 0x3b08, 0x60e: 0x0008, 0x60f: 0x0040, 0x610: 0x0040, 0x611: 0x0040,
+ 0x612: 0x0040, 0x613: 0x0040, 0x614: 0x0040, 0x615: 0x0040, 0x616: 0x0040, 0x617: 0x3008,
+ 0x618: 0x0040, 0x619: 0x0040, 0x61a: 0x0040, 0x61b: 0x0040, 0x61c: 0x0689, 0x61d: 0x06c1,
+ 0x61e: 0x0040, 0x61f: 0x06f9, 0x620: 0x0008, 0x621: 0x0008, 0x622: 0x3308, 0x623: 0x3308,
0x624: 0x0040, 0x625: 0x0040, 0x626: 0x0008, 0x627: 0x0008, 0x628: 0x0008, 0x629: 0x0008,
0x62a: 0x0008, 0x62b: 0x0008, 0x62c: 0x0008, 0x62d: 0x0008, 0x62e: 0x0008, 0x62f: 0x0008,
- 0x630: 0x1308, 0x631: 0x1308, 0x632: 0x0008, 0x633: 0x0008, 0x634: 0x0008, 0x635: 0x1308,
- 0x636: 0x0040, 0x637: 0x0040, 0x638: 0x0040, 0x639: 0x0040, 0x63a: 0x0040, 0x63b: 0x0040,
- 0x63c: 0x0040, 0x63d: 0x0040, 0x63e: 0x0040, 0x63f: 0x0040,
+ 0x630: 0x0008, 0x631: 0x0008, 0x632: 0x0018, 0x633: 0x0018, 0x634: 0x0018, 0x635: 0x0018,
+ 0x636: 0x0018, 0x637: 0x0018, 0x638: 0x0018, 0x639: 0x0018, 0x63a: 0x0018, 0x63b: 0x0018,
+ 0x63c: 0x0008, 0x63d: 0x0018, 0x63e: 0x0040, 0x63f: 0x0040,
// Block 0x19, offset 0x640
- 0x640: 0x0040, 0x641: 0x1308, 0x642: 0x1308, 0x643: 0x1008, 0x644: 0x0040, 0x645: 0x0008,
- 0x646: 0x0008, 0x647: 0x0008, 0x648: 0x0008, 0x649: 0x0008, 0x64a: 0x0008, 0x64b: 0x0008,
- 0x64c: 0x0008, 0x64d: 0x0008, 0x64e: 0x0040, 0x64f: 0x0008, 0x650: 0x0008, 0x651: 0x0008,
+ 0x640: 0x0040, 0x641: 0x3308, 0x642: 0x3308, 0x643: 0x3008, 0x644: 0x0040, 0x645: 0x0008,
+ 0x646: 0x0008, 0x647: 0x0008, 0x648: 0x0008, 0x649: 0x0008, 0x64a: 0x0008, 0x64b: 0x0040,
+ 0x64c: 0x0040, 0x64d: 0x0040, 0x64e: 0x0040, 0x64f: 0x0008, 0x650: 0x0008, 0x651: 0x0040,
0x652: 0x0040, 0x653: 0x0008, 0x654: 0x0008, 0x655: 0x0008, 0x656: 0x0008, 0x657: 0x0008,
0x658: 0x0008, 0x659: 0x0008, 0x65a: 0x0008, 0x65b: 0x0008, 0x65c: 0x0008, 0x65d: 0x0008,
0x65e: 0x0008, 0x65f: 0x0008, 0x660: 0x0008, 0x661: 0x0008, 0x662: 0x0008, 0x663: 0x0008,
0x664: 0x0008, 0x665: 0x0008, 0x666: 0x0008, 0x667: 0x0008, 0x668: 0x0008, 0x669: 0x0040,
0x66a: 0x0008, 0x66b: 0x0008, 0x66c: 0x0008, 0x66d: 0x0008, 0x66e: 0x0008, 0x66f: 0x0008,
- 0x670: 0x0008, 0x671: 0x0040, 0x672: 0x0008, 0x673: 0x0008, 0x674: 0x0040, 0x675: 0x0008,
- 0x676: 0x0008, 0x677: 0x0008, 0x678: 0x0008, 0x679: 0x0008, 0x67a: 0x0040, 0x67b: 0x0040,
- 0x67c: 0x1308, 0x67d: 0x0008, 0x67e: 0x1008, 0x67f: 0x1008,
+ 0x670: 0x0008, 0x671: 0x0040, 0x672: 0x0008, 0x673: 0x0731, 0x674: 0x0040, 0x675: 0x0008,
+ 0x676: 0x0769, 0x677: 0x0040, 0x678: 0x0008, 0x679: 0x0008, 0x67a: 0x0040, 0x67b: 0x0040,
+ 0x67c: 0x3308, 0x67d: 0x0040, 0x67e: 0x3008, 0x67f: 0x3008,
// Block 0x1a, offset 0x680
- 0x680: 0x1008, 0x681: 0x1308, 0x682: 0x1308, 0x683: 0x1308, 0x684: 0x1308, 0x685: 0x1308,
- 0x686: 0x0040, 0x687: 0x1308, 0x688: 0x1308, 0x689: 0x1008, 0x68a: 0x0040, 0x68b: 0x1008,
- 0x68c: 0x1008, 0x68d: 0x1b08, 0x68e: 0x0040, 0x68f: 0x0040, 0x690: 0x0008, 0x691: 0x0040,
+ 0x680: 0x3008, 0x681: 0x3308, 0x682: 0x3308, 0x683: 0x0040, 0x684: 0x0040, 0x685: 0x0040,
+ 0x686: 0x0040, 0x687: 0x3308, 0x688: 0x3308, 0x689: 0x0040, 0x68a: 0x0040, 0x68b: 0x3308,
+ 0x68c: 0x3308, 0x68d: 0x3b08, 0x68e: 0x0040, 0x68f: 0x0040, 0x690: 0x0040, 0x691: 0x3308,
0x692: 0x0040, 0x693: 0x0040, 0x694: 0x0040, 0x695: 0x0040, 0x696: 0x0040, 0x697: 0x0040,
- 0x698: 0x0040, 0x699: 0x0040, 0x69a: 0x0040, 0x69b: 0x0040, 0x69c: 0x0040, 0x69d: 0x0040,
- 0x69e: 0x0040, 0x69f: 0x0040, 0x6a0: 0x0008, 0x6a1: 0x0008, 0x6a2: 0x1308, 0x6a3: 0x1308,
+ 0x698: 0x0040, 0x699: 0x07a1, 0x69a: 0x07d9, 0x69b: 0x0811, 0x69c: 0x0008, 0x69d: 0x0040,
+ 0x69e: 0x0849, 0x69f: 0x0040, 0x6a0: 0x0040, 0x6a1: 0x0040, 0x6a2: 0x0040, 0x6a3: 0x0040,
0x6a4: 0x0040, 0x6a5: 0x0040, 0x6a6: 0x0008, 0x6a7: 0x0008, 0x6a8: 0x0008, 0x6a9: 0x0008,
0x6aa: 0x0008, 0x6ab: 0x0008, 0x6ac: 0x0008, 0x6ad: 0x0008, 0x6ae: 0x0008, 0x6af: 0x0008,
- 0x6b0: 0x0018, 0x6b1: 0x0018, 0x6b2: 0x0040, 0x6b3: 0x0040, 0x6b4: 0x0040, 0x6b5: 0x0040,
- 0x6b6: 0x0040, 0x6b7: 0x0040, 0x6b8: 0x0040, 0x6b9: 0x0008, 0x6ba: 0x0040, 0x6bb: 0x0040,
+ 0x6b0: 0x3308, 0x6b1: 0x3308, 0x6b2: 0x0008, 0x6b3: 0x0008, 0x6b4: 0x0008, 0x6b5: 0x3308,
+ 0x6b6: 0x0040, 0x6b7: 0x0040, 0x6b8: 0x0040, 0x6b9: 0x0040, 0x6ba: 0x0040, 0x6bb: 0x0040,
0x6bc: 0x0040, 0x6bd: 0x0040, 0x6be: 0x0040, 0x6bf: 0x0040,
// Block 0x1b, offset 0x6c0
- 0x6c0: 0x0040, 0x6c1: 0x1308, 0x6c2: 0x1008, 0x6c3: 0x1008, 0x6c4: 0x0040, 0x6c5: 0x0008,
+ 0x6c0: 0x0040, 0x6c1: 0x3308, 0x6c2: 0x3308, 0x6c3: 0x3008, 0x6c4: 0x0040, 0x6c5: 0x0008,
0x6c6: 0x0008, 0x6c7: 0x0008, 0x6c8: 0x0008, 0x6c9: 0x0008, 0x6ca: 0x0008, 0x6cb: 0x0008,
- 0x6cc: 0x0008, 0x6cd: 0x0040, 0x6ce: 0x0040, 0x6cf: 0x0008, 0x6d0: 0x0008, 0x6d1: 0x0040,
+ 0x6cc: 0x0008, 0x6cd: 0x0008, 0x6ce: 0x0040, 0x6cf: 0x0008, 0x6d0: 0x0008, 0x6d1: 0x0008,
0x6d2: 0x0040, 0x6d3: 0x0008, 0x6d4: 0x0008, 0x6d5: 0x0008, 0x6d6: 0x0008, 0x6d7: 0x0008,
0x6d8: 0x0008, 0x6d9: 0x0008, 0x6da: 0x0008, 0x6db: 0x0008, 0x6dc: 0x0008, 0x6dd: 0x0008,
0x6de: 0x0008, 0x6df: 0x0008, 0x6e0: 0x0008, 0x6e1: 0x0008, 0x6e2: 0x0008, 0x6e3: 0x0008,
@@ -889,1457 +889,1490 @@ var idnaValues = [8000]uint16{
0x6ea: 0x0008, 0x6eb: 0x0008, 0x6ec: 0x0008, 0x6ed: 0x0008, 0x6ee: 0x0008, 0x6ef: 0x0008,
0x6f0: 0x0008, 0x6f1: 0x0040, 0x6f2: 0x0008, 0x6f3: 0x0008, 0x6f4: 0x0040, 0x6f5: 0x0008,
0x6f6: 0x0008, 0x6f7: 0x0008, 0x6f8: 0x0008, 0x6f9: 0x0008, 0x6fa: 0x0040, 0x6fb: 0x0040,
- 0x6fc: 0x1308, 0x6fd: 0x0008, 0x6fe: 0x1008, 0x6ff: 0x1308,
+ 0x6fc: 0x3308, 0x6fd: 0x0008, 0x6fe: 0x3008, 0x6ff: 0x3008,
// Block 0x1c, offset 0x700
- 0x700: 0x1008, 0x701: 0x1308, 0x702: 0x1308, 0x703: 0x1308, 0x704: 0x1308, 0x705: 0x0040,
- 0x706: 0x0040, 0x707: 0x1008, 0x708: 0x1008, 0x709: 0x0040, 0x70a: 0x0040, 0x70b: 0x1008,
- 0x70c: 0x1008, 0x70d: 0x1b08, 0x70e: 0x0040, 0x70f: 0x0040, 0x710: 0x0040, 0x711: 0x0040,
- 0x712: 0x0040, 0x713: 0x0040, 0x714: 0x0040, 0x715: 0x0040, 0x716: 0x1308, 0x717: 0x1008,
- 0x718: 0x0040, 0x719: 0x0040, 0x71a: 0x0040, 0x71b: 0x0040, 0x71c: 0x0881, 0x71d: 0x08b9,
- 0x71e: 0x0040, 0x71f: 0x0008, 0x720: 0x0008, 0x721: 0x0008, 0x722: 0x1308, 0x723: 0x1308,
+ 0x700: 0x3008, 0x701: 0x3308, 0x702: 0x3308, 0x703: 0x3308, 0x704: 0x3308, 0x705: 0x3308,
+ 0x706: 0x0040, 0x707: 0x3308, 0x708: 0x3308, 0x709: 0x3008, 0x70a: 0x0040, 0x70b: 0x3008,
+ 0x70c: 0x3008, 0x70d: 0x3b08, 0x70e: 0x0040, 0x70f: 0x0040, 0x710: 0x0008, 0x711: 0x0040,
+ 0x712: 0x0040, 0x713: 0x0040, 0x714: 0x0040, 0x715: 0x0040, 0x716: 0x0040, 0x717: 0x0040,
+ 0x718: 0x0040, 0x719: 0x0040, 0x71a: 0x0040, 0x71b: 0x0040, 0x71c: 0x0040, 0x71d: 0x0040,
+ 0x71e: 0x0040, 0x71f: 0x0040, 0x720: 0x0008, 0x721: 0x0008, 0x722: 0x3308, 0x723: 0x3308,
0x724: 0x0040, 0x725: 0x0040, 0x726: 0x0008, 0x727: 0x0008, 0x728: 0x0008, 0x729: 0x0008,
0x72a: 0x0008, 0x72b: 0x0008, 0x72c: 0x0008, 0x72d: 0x0008, 0x72e: 0x0008, 0x72f: 0x0008,
- 0x730: 0x0018, 0x731: 0x0008, 0x732: 0x0018, 0x733: 0x0018, 0x734: 0x0018, 0x735: 0x0018,
- 0x736: 0x0018, 0x737: 0x0018, 0x738: 0x0040, 0x739: 0x0040, 0x73a: 0x0040, 0x73b: 0x0040,
- 0x73c: 0x0040, 0x73d: 0x0040, 0x73e: 0x0040, 0x73f: 0x0040,
+ 0x730: 0x0018, 0x731: 0x0018, 0x732: 0x0040, 0x733: 0x0040, 0x734: 0x0040, 0x735: 0x0040,
+ 0x736: 0x0040, 0x737: 0x0040, 0x738: 0x0040, 0x739: 0x0008, 0x73a: 0x3308, 0x73b: 0x3308,
+ 0x73c: 0x3308, 0x73d: 0x3308, 0x73e: 0x3308, 0x73f: 0x3308,
// Block 0x1d, offset 0x740
- 0x740: 0x0040, 0x741: 0x0040, 0x742: 0x1308, 0x743: 0x0008, 0x744: 0x0040, 0x745: 0x0008,
- 0x746: 0x0008, 0x747: 0x0008, 0x748: 0x0008, 0x749: 0x0008, 0x74a: 0x0008, 0x74b: 0x0040,
- 0x74c: 0x0040, 0x74d: 0x0040, 0x74e: 0x0008, 0x74f: 0x0008, 0x750: 0x0008, 0x751: 0x0040,
- 0x752: 0x0008, 0x753: 0x0008, 0x754: 0x0008, 0x755: 0x0008, 0x756: 0x0040, 0x757: 0x0040,
- 0x758: 0x0040, 0x759: 0x0008, 0x75a: 0x0008, 0x75b: 0x0040, 0x75c: 0x0008, 0x75d: 0x0040,
- 0x75e: 0x0008, 0x75f: 0x0008, 0x760: 0x0040, 0x761: 0x0040, 0x762: 0x0040, 0x763: 0x0008,
- 0x764: 0x0008, 0x765: 0x0040, 0x766: 0x0040, 0x767: 0x0040, 0x768: 0x0008, 0x769: 0x0008,
- 0x76a: 0x0008, 0x76b: 0x0040, 0x76c: 0x0040, 0x76d: 0x0040, 0x76e: 0x0008, 0x76f: 0x0008,
- 0x770: 0x0008, 0x771: 0x0008, 0x772: 0x0008, 0x773: 0x0008, 0x774: 0x0008, 0x775: 0x0008,
+ 0x740: 0x0040, 0x741: 0x3308, 0x742: 0x3008, 0x743: 0x3008, 0x744: 0x0040, 0x745: 0x0008,
+ 0x746: 0x0008, 0x747: 0x0008, 0x748: 0x0008, 0x749: 0x0008, 0x74a: 0x0008, 0x74b: 0x0008,
+ 0x74c: 0x0008, 0x74d: 0x0040, 0x74e: 0x0040, 0x74f: 0x0008, 0x750: 0x0008, 0x751: 0x0040,
+ 0x752: 0x0040, 0x753: 0x0008, 0x754: 0x0008, 0x755: 0x0008, 0x756: 0x0008, 0x757: 0x0008,
+ 0x758: 0x0008, 0x759: 0x0008, 0x75a: 0x0008, 0x75b: 0x0008, 0x75c: 0x0008, 0x75d: 0x0008,
+ 0x75e: 0x0008, 0x75f: 0x0008, 0x760: 0x0008, 0x761: 0x0008, 0x762: 0x0008, 0x763: 0x0008,
+ 0x764: 0x0008, 0x765: 0x0008, 0x766: 0x0008, 0x767: 0x0008, 0x768: 0x0008, 0x769: 0x0040,
+ 0x76a: 0x0008, 0x76b: 0x0008, 0x76c: 0x0008, 0x76d: 0x0008, 0x76e: 0x0008, 0x76f: 0x0008,
+ 0x770: 0x0008, 0x771: 0x0040, 0x772: 0x0008, 0x773: 0x0008, 0x774: 0x0040, 0x775: 0x0008,
0x776: 0x0008, 0x777: 0x0008, 0x778: 0x0008, 0x779: 0x0008, 0x77a: 0x0040, 0x77b: 0x0040,
- 0x77c: 0x0040, 0x77d: 0x0040, 0x77e: 0x1008, 0x77f: 0x1008,
+ 0x77c: 0x3308, 0x77d: 0x0008, 0x77e: 0x3008, 0x77f: 0x3308,
// Block 0x1e, offset 0x780
- 0x780: 0x1308, 0x781: 0x1008, 0x782: 0x1008, 0x783: 0x1008, 0x784: 0x1008, 0x785: 0x0040,
- 0x786: 0x1308, 0x787: 0x1308, 0x788: 0x1308, 0x789: 0x0040, 0x78a: 0x1308, 0x78b: 0x1308,
- 0x78c: 0x1308, 0x78d: 0x1b08, 0x78e: 0x0040, 0x78f: 0x0040, 0x790: 0x0040, 0x791: 0x0040,
- 0x792: 0x0040, 0x793: 0x0040, 0x794: 0x0040, 0x795: 0x1308, 0x796: 0x1308, 0x797: 0x0040,
- 0x798: 0x0008, 0x799: 0x0008, 0x79a: 0x0008, 0x79b: 0x0040, 0x79c: 0x0040, 0x79d: 0x0040,
- 0x79e: 0x0040, 0x79f: 0x0040, 0x7a0: 0x0008, 0x7a1: 0x0008, 0x7a2: 0x1308, 0x7a3: 0x1308,
+ 0x780: 0x3008, 0x781: 0x3308, 0x782: 0x3308, 0x783: 0x3308, 0x784: 0x3308, 0x785: 0x0040,
+ 0x786: 0x0040, 0x787: 0x3008, 0x788: 0x3008, 0x789: 0x0040, 0x78a: 0x0040, 0x78b: 0x3008,
+ 0x78c: 0x3008, 0x78d: 0x3b08, 0x78e: 0x0040, 0x78f: 0x0040, 0x790: 0x0040, 0x791: 0x0040,
+ 0x792: 0x0040, 0x793: 0x0040, 0x794: 0x0040, 0x795: 0x0040, 0x796: 0x3308, 0x797: 0x3008,
+ 0x798: 0x0040, 0x799: 0x0040, 0x79a: 0x0040, 0x79b: 0x0040, 0x79c: 0x0881, 0x79d: 0x08b9,
+ 0x79e: 0x0040, 0x79f: 0x0008, 0x7a0: 0x0008, 0x7a1: 0x0008, 0x7a2: 0x3308, 0x7a3: 0x3308,
0x7a4: 0x0040, 0x7a5: 0x0040, 0x7a6: 0x0008, 0x7a7: 0x0008, 0x7a8: 0x0008, 0x7a9: 0x0008,
0x7aa: 0x0008, 0x7ab: 0x0008, 0x7ac: 0x0008, 0x7ad: 0x0008, 0x7ae: 0x0008, 0x7af: 0x0008,
- 0x7b0: 0x0040, 0x7b1: 0x0040, 0x7b2: 0x0040, 0x7b3: 0x0040, 0x7b4: 0x0040, 0x7b5: 0x0040,
- 0x7b6: 0x0040, 0x7b7: 0x0040, 0x7b8: 0x0018, 0x7b9: 0x0018, 0x7ba: 0x0018, 0x7bb: 0x0018,
- 0x7bc: 0x0018, 0x7bd: 0x0018, 0x7be: 0x0018, 0x7bf: 0x0018,
+ 0x7b0: 0x0018, 0x7b1: 0x0008, 0x7b2: 0x0018, 0x7b3: 0x0018, 0x7b4: 0x0018, 0x7b5: 0x0018,
+ 0x7b6: 0x0018, 0x7b7: 0x0018, 0x7b8: 0x0040, 0x7b9: 0x0040, 0x7ba: 0x0040, 0x7bb: 0x0040,
+ 0x7bc: 0x0040, 0x7bd: 0x0040, 0x7be: 0x0040, 0x7bf: 0x0040,
// Block 0x1f, offset 0x7c0
- 0x7c0: 0x0008, 0x7c1: 0x1308, 0x7c2: 0x1008, 0x7c3: 0x1008, 0x7c4: 0x0040, 0x7c5: 0x0008,
- 0x7c6: 0x0008, 0x7c7: 0x0008, 0x7c8: 0x0008, 0x7c9: 0x0008, 0x7ca: 0x0008, 0x7cb: 0x0008,
- 0x7cc: 0x0008, 0x7cd: 0x0040, 0x7ce: 0x0008, 0x7cf: 0x0008, 0x7d0: 0x0008, 0x7d1: 0x0040,
- 0x7d2: 0x0008, 0x7d3: 0x0008, 0x7d4: 0x0008, 0x7d5: 0x0008, 0x7d6: 0x0008, 0x7d7: 0x0008,
- 0x7d8: 0x0008, 0x7d9: 0x0008, 0x7da: 0x0008, 0x7db: 0x0008, 0x7dc: 0x0008, 0x7dd: 0x0008,
- 0x7de: 0x0008, 0x7df: 0x0008, 0x7e0: 0x0008, 0x7e1: 0x0008, 0x7e2: 0x0008, 0x7e3: 0x0008,
- 0x7e4: 0x0008, 0x7e5: 0x0008, 0x7e6: 0x0008, 0x7e7: 0x0008, 0x7e8: 0x0008, 0x7e9: 0x0040,
- 0x7ea: 0x0008, 0x7eb: 0x0008, 0x7ec: 0x0008, 0x7ed: 0x0008, 0x7ee: 0x0008, 0x7ef: 0x0008,
- 0x7f0: 0x0008, 0x7f1: 0x0008, 0x7f2: 0x0008, 0x7f3: 0x0008, 0x7f4: 0x0040, 0x7f5: 0x0008,
+ 0x7c0: 0x0040, 0x7c1: 0x0040, 0x7c2: 0x3308, 0x7c3: 0x0008, 0x7c4: 0x0040, 0x7c5: 0x0008,
+ 0x7c6: 0x0008, 0x7c7: 0x0008, 0x7c8: 0x0008, 0x7c9: 0x0008, 0x7ca: 0x0008, 0x7cb: 0x0040,
+ 0x7cc: 0x0040, 0x7cd: 0x0040, 0x7ce: 0x0008, 0x7cf: 0x0008, 0x7d0: 0x0008, 0x7d1: 0x0040,
+ 0x7d2: 0x0008, 0x7d3: 0x0008, 0x7d4: 0x0008, 0x7d5: 0x0008, 0x7d6: 0x0040, 0x7d7: 0x0040,
+ 0x7d8: 0x0040, 0x7d9: 0x0008, 0x7da: 0x0008, 0x7db: 0x0040, 0x7dc: 0x0008, 0x7dd: 0x0040,
+ 0x7de: 0x0008, 0x7df: 0x0008, 0x7e0: 0x0040, 0x7e1: 0x0040, 0x7e2: 0x0040, 0x7e3: 0x0008,
+ 0x7e4: 0x0008, 0x7e5: 0x0040, 0x7e6: 0x0040, 0x7e7: 0x0040, 0x7e8: 0x0008, 0x7e9: 0x0008,
+ 0x7ea: 0x0008, 0x7eb: 0x0040, 0x7ec: 0x0040, 0x7ed: 0x0040, 0x7ee: 0x0008, 0x7ef: 0x0008,
+ 0x7f0: 0x0008, 0x7f1: 0x0008, 0x7f2: 0x0008, 0x7f3: 0x0008, 0x7f4: 0x0008, 0x7f5: 0x0008,
0x7f6: 0x0008, 0x7f7: 0x0008, 0x7f8: 0x0008, 0x7f9: 0x0008, 0x7fa: 0x0040, 0x7fb: 0x0040,
- 0x7fc: 0x1308, 0x7fd: 0x0008, 0x7fe: 0x1008, 0x7ff: 0x1308,
+ 0x7fc: 0x0040, 0x7fd: 0x0040, 0x7fe: 0x3008, 0x7ff: 0x3008,
// Block 0x20, offset 0x800
- 0x800: 0x1008, 0x801: 0x1008, 0x802: 0x1008, 0x803: 0x1008, 0x804: 0x1008, 0x805: 0x0040,
- 0x806: 0x1308, 0x807: 0x1008, 0x808: 0x1008, 0x809: 0x0040, 0x80a: 0x1008, 0x80b: 0x1008,
- 0x80c: 0x1308, 0x80d: 0x1b08, 0x80e: 0x0040, 0x80f: 0x0040, 0x810: 0x0040, 0x811: 0x0040,
- 0x812: 0x0040, 0x813: 0x0040, 0x814: 0x0040, 0x815: 0x1008, 0x816: 0x1008, 0x817: 0x0040,
- 0x818: 0x0040, 0x819: 0x0040, 0x81a: 0x0040, 0x81b: 0x0040, 0x81c: 0x0040, 0x81d: 0x0040,
- 0x81e: 0x0008, 0x81f: 0x0040, 0x820: 0x0008, 0x821: 0x0008, 0x822: 0x1308, 0x823: 0x1308,
+ 0x800: 0x3308, 0x801: 0x3008, 0x802: 0x3008, 0x803: 0x3008, 0x804: 0x3008, 0x805: 0x0040,
+ 0x806: 0x3308, 0x807: 0x3308, 0x808: 0x3308, 0x809: 0x0040, 0x80a: 0x3308, 0x80b: 0x3308,
+ 0x80c: 0x3308, 0x80d: 0x3b08, 0x80e: 0x0040, 0x80f: 0x0040, 0x810: 0x0040, 0x811: 0x0040,
+ 0x812: 0x0040, 0x813: 0x0040, 0x814: 0x0040, 0x815: 0x3308, 0x816: 0x3308, 0x817: 0x0040,
+ 0x818: 0x0008, 0x819: 0x0008, 0x81a: 0x0008, 0x81b: 0x0040, 0x81c: 0x0040, 0x81d: 0x0040,
+ 0x81e: 0x0040, 0x81f: 0x0040, 0x820: 0x0008, 0x821: 0x0008, 0x822: 0x3308, 0x823: 0x3308,
0x824: 0x0040, 0x825: 0x0040, 0x826: 0x0008, 0x827: 0x0008, 0x828: 0x0008, 0x829: 0x0008,
0x82a: 0x0008, 0x82b: 0x0008, 0x82c: 0x0008, 0x82d: 0x0008, 0x82e: 0x0008, 0x82f: 0x0008,
- 0x830: 0x0040, 0x831: 0x0008, 0x832: 0x0008, 0x833: 0x0040, 0x834: 0x0040, 0x835: 0x0040,
- 0x836: 0x0040, 0x837: 0x0040, 0x838: 0x0040, 0x839: 0x0040, 0x83a: 0x0040, 0x83b: 0x0040,
- 0x83c: 0x0040, 0x83d: 0x0040, 0x83e: 0x0040, 0x83f: 0x0040,
+ 0x830: 0x0040, 0x831: 0x0040, 0x832: 0x0040, 0x833: 0x0040, 0x834: 0x0040, 0x835: 0x0040,
+ 0x836: 0x0040, 0x837: 0x0040, 0x838: 0x0018, 0x839: 0x0018, 0x83a: 0x0018, 0x83b: 0x0018,
+ 0x83c: 0x0018, 0x83d: 0x0018, 0x83e: 0x0018, 0x83f: 0x0018,
// Block 0x21, offset 0x840
- 0x840: 0x1008, 0x841: 0x1308, 0x842: 0x1308, 0x843: 0x1308, 0x844: 0x1308, 0x845: 0x0040,
- 0x846: 0x1008, 0x847: 0x1008, 0x848: 0x1008, 0x849: 0x0040, 0x84a: 0x1008, 0x84b: 0x1008,
- 0x84c: 0x1008, 0x84d: 0x1b08, 0x84e: 0x0008, 0x84f: 0x0018, 0x850: 0x0040, 0x851: 0x0040,
- 0x852: 0x0040, 0x853: 0x0040, 0x854: 0x0008, 0x855: 0x0008, 0x856: 0x0008, 0x857: 0x1008,
- 0x858: 0x0018, 0x859: 0x0018, 0x85a: 0x0018, 0x85b: 0x0018, 0x85c: 0x0018, 0x85d: 0x0018,
- 0x85e: 0x0018, 0x85f: 0x0008, 0x860: 0x0008, 0x861: 0x0008, 0x862: 0x1308, 0x863: 0x1308,
- 0x864: 0x0040, 0x865: 0x0040, 0x866: 0x0008, 0x867: 0x0008, 0x868: 0x0008, 0x869: 0x0008,
+ 0x840: 0x0008, 0x841: 0x3308, 0x842: 0x3008, 0x843: 0x3008, 0x844: 0x0040, 0x845: 0x0008,
+ 0x846: 0x0008, 0x847: 0x0008, 0x848: 0x0008, 0x849: 0x0008, 0x84a: 0x0008, 0x84b: 0x0008,
+ 0x84c: 0x0008, 0x84d: 0x0040, 0x84e: 0x0008, 0x84f: 0x0008, 0x850: 0x0008, 0x851: 0x0040,
+ 0x852: 0x0008, 0x853: 0x0008, 0x854: 0x0008, 0x855: 0x0008, 0x856: 0x0008, 0x857: 0x0008,
+ 0x858: 0x0008, 0x859: 0x0008, 0x85a: 0x0008, 0x85b: 0x0008, 0x85c: 0x0008, 0x85d: 0x0008,
+ 0x85e: 0x0008, 0x85f: 0x0008, 0x860: 0x0008, 0x861: 0x0008, 0x862: 0x0008, 0x863: 0x0008,
+ 0x864: 0x0008, 0x865: 0x0008, 0x866: 0x0008, 0x867: 0x0008, 0x868: 0x0008, 0x869: 0x0040,
0x86a: 0x0008, 0x86b: 0x0008, 0x86c: 0x0008, 0x86d: 0x0008, 0x86e: 0x0008, 0x86f: 0x0008,
- 0x870: 0x0018, 0x871: 0x0018, 0x872: 0x0018, 0x873: 0x0018, 0x874: 0x0018, 0x875: 0x0018,
- 0x876: 0x0018, 0x877: 0x0018, 0x878: 0x0018, 0x879: 0x0018, 0x87a: 0x0008, 0x87b: 0x0008,
- 0x87c: 0x0008, 0x87d: 0x0008, 0x87e: 0x0008, 0x87f: 0x0008,
+ 0x870: 0x0008, 0x871: 0x0008, 0x872: 0x0008, 0x873: 0x0008, 0x874: 0x0040, 0x875: 0x0008,
+ 0x876: 0x0008, 0x877: 0x0008, 0x878: 0x0008, 0x879: 0x0008, 0x87a: 0x0040, 0x87b: 0x0040,
+ 0x87c: 0x3308, 0x87d: 0x0008, 0x87e: 0x3008, 0x87f: 0x3308,
// Block 0x22, offset 0x880
- 0x880: 0x0040, 0x881: 0x0008, 0x882: 0x0008, 0x883: 0x0040, 0x884: 0x0008, 0x885: 0x0040,
- 0x886: 0x0040, 0x887: 0x0008, 0x888: 0x0008, 0x889: 0x0040, 0x88a: 0x0008, 0x88b: 0x0040,
- 0x88c: 0x0040, 0x88d: 0x0008, 0x88e: 0x0040, 0x88f: 0x0040, 0x890: 0x0040, 0x891: 0x0040,
- 0x892: 0x0040, 0x893: 0x0040, 0x894: 0x0008, 0x895: 0x0008, 0x896: 0x0008, 0x897: 0x0008,
- 0x898: 0x0040, 0x899: 0x0008, 0x89a: 0x0008, 0x89b: 0x0008, 0x89c: 0x0008, 0x89d: 0x0008,
- 0x89e: 0x0008, 0x89f: 0x0008, 0x8a0: 0x0040, 0x8a1: 0x0008, 0x8a2: 0x0008, 0x8a3: 0x0008,
- 0x8a4: 0x0040, 0x8a5: 0x0008, 0x8a6: 0x0040, 0x8a7: 0x0008, 0x8a8: 0x0040, 0x8a9: 0x0040,
- 0x8aa: 0x0008, 0x8ab: 0x0008, 0x8ac: 0x0040, 0x8ad: 0x0008, 0x8ae: 0x0008, 0x8af: 0x0008,
- 0x8b0: 0x0008, 0x8b1: 0x1308, 0x8b2: 0x0008, 0x8b3: 0x0929, 0x8b4: 0x1308, 0x8b5: 0x1308,
- 0x8b6: 0x1308, 0x8b7: 0x1308, 0x8b8: 0x1308, 0x8b9: 0x1308, 0x8ba: 0x0040, 0x8bb: 0x1308,
- 0x8bc: 0x1308, 0x8bd: 0x0008, 0x8be: 0x0040, 0x8bf: 0x0040,
+ 0x880: 0x3008, 0x881: 0x3008, 0x882: 0x3008, 0x883: 0x3008, 0x884: 0x3008, 0x885: 0x0040,
+ 0x886: 0x3308, 0x887: 0x3008, 0x888: 0x3008, 0x889: 0x0040, 0x88a: 0x3008, 0x88b: 0x3008,
+ 0x88c: 0x3308, 0x88d: 0x3b08, 0x88e: 0x0040, 0x88f: 0x0040, 0x890: 0x0040, 0x891: 0x0040,
+ 0x892: 0x0040, 0x893: 0x0040, 0x894: 0x0040, 0x895: 0x3008, 0x896: 0x3008, 0x897: 0x0040,
+ 0x898: 0x0040, 0x899: 0x0040, 0x89a: 0x0040, 0x89b: 0x0040, 0x89c: 0x0040, 0x89d: 0x0040,
+ 0x89e: 0x0008, 0x89f: 0x0040, 0x8a0: 0x0008, 0x8a1: 0x0008, 0x8a2: 0x3308, 0x8a3: 0x3308,
+ 0x8a4: 0x0040, 0x8a5: 0x0040, 0x8a6: 0x0008, 0x8a7: 0x0008, 0x8a8: 0x0008, 0x8a9: 0x0008,
+ 0x8aa: 0x0008, 0x8ab: 0x0008, 0x8ac: 0x0008, 0x8ad: 0x0008, 0x8ae: 0x0008, 0x8af: 0x0008,
+ 0x8b0: 0x0040, 0x8b1: 0x0008, 0x8b2: 0x0008, 0x8b3: 0x0040, 0x8b4: 0x0040, 0x8b5: 0x0040,
+ 0x8b6: 0x0040, 0x8b7: 0x0040, 0x8b8: 0x0040, 0x8b9: 0x0040, 0x8ba: 0x0040, 0x8bb: 0x0040,
+ 0x8bc: 0x0040, 0x8bd: 0x0040, 0x8be: 0x0040, 0x8bf: 0x0040,
// Block 0x23, offset 0x8c0
- 0x8c0: 0x0008, 0x8c1: 0x0008, 0x8c2: 0x0008, 0x8c3: 0x09d1, 0x8c4: 0x0008, 0x8c5: 0x0008,
- 0x8c6: 0x0008, 0x8c7: 0x0008, 0x8c8: 0x0040, 0x8c9: 0x0008, 0x8ca: 0x0008, 0x8cb: 0x0008,
- 0x8cc: 0x0008, 0x8cd: 0x0a09, 0x8ce: 0x0008, 0x8cf: 0x0008, 0x8d0: 0x0008, 0x8d1: 0x0008,
- 0x8d2: 0x0a41, 0x8d3: 0x0008, 0x8d4: 0x0008, 0x8d5: 0x0008, 0x8d6: 0x0008, 0x8d7: 0x0a79,
- 0x8d8: 0x0008, 0x8d9: 0x0008, 0x8da: 0x0008, 0x8db: 0x0008, 0x8dc: 0x0ab1, 0x8dd: 0x0008,
- 0x8de: 0x0008, 0x8df: 0x0008, 0x8e0: 0x0008, 0x8e1: 0x0008, 0x8e2: 0x0008, 0x8e3: 0x0008,
- 0x8e4: 0x0008, 0x8e5: 0x0008, 0x8e6: 0x0008, 0x8e7: 0x0008, 0x8e8: 0x0008, 0x8e9: 0x0ae9,
- 0x8ea: 0x0008, 0x8eb: 0x0008, 0x8ec: 0x0008, 0x8ed: 0x0040, 0x8ee: 0x0040, 0x8ef: 0x0040,
- 0x8f0: 0x0040, 0x8f1: 0x1308, 0x8f2: 0x1308, 0x8f3: 0x0b21, 0x8f4: 0x1308, 0x8f5: 0x0b59,
- 0x8f6: 0x0b91, 0x8f7: 0x0bc9, 0x8f8: 0x0c19, 0x8f9: 0x0c51, 0x8fa: 0x1308, 0x8fb: 0x1308,
- 0x8fc: 0x1308, 0x8fd: 0x1308, 0x8fe: 0x1308, 0x8ff: 0x1008,
+ 0x8c0: 0x3008, 0x8c1: 0x3308, 0x8c2: 0x3308, 0x8c3: 0x3308, 0x8c4: 0x3308, 0x8c5: 0x0040,
+ 0x8c6: 0x3008, 0x8c7: 0x3008, 0x8c8: 0x3008, 0x8c9: 0x0040, 0x8ca: 0x3008, 0x8cb: 0x3008,
+ 0x8cc: 0x3008, 0x8cd: 0x3b08, 0x8ce: 0x0008, 0x8cf: 0x0018, 0x8d0: 0x0040, 0x8d1: 0x0040,
+ 0x8d2: 0x0040, 0x8d3: 0x0040, 0x8d4: 0x0008, 0x8d5: 0x0008, 0x8d6: 0x0008, 0x8d7: 0x3008,
+ 0x8d8: 0x0018, 0x8d9: 0x0018, 0x8da: 0x0018, 0x8db: 0x0018, 0x8dc: 0x0018, 0x8dd: 0x0018,
+ 0x8de: 0x0018, 0x8df: 0x0008, 0x8e0: 0x0008, 0x8e1: 0x0008, 0x8e2: 0x3308, 0x8e3: 0x3308,
+ 0x8e4: 0x0040, 0x8e5: 0x0040, 0x8e6: 0x0008, 0x8e7: 0x0008, 0x8e8: 0x0008, 0x8e9: 0x0008,
+ 0x8ea: 0x0008, 0x8eb: 0x0008, 0x8ec: 0x0008, 0x8ed: 0x0008, 0x8ee: 0x0008, 0x8ef: 0x0008,
+ 0x8f0: 0x0018, 0x8f1: 0x0018, 0x8f2: 0x0018, 0x8f3: 0x0018, 0x8f4: 0x0018, 0x8f5: 0x0018,
+ 0x8f6: 0x0018, 0x8f7: 0x0018, 0x8f8: 0x0018, 0x8f9: 0x0018, 0x8fa: 0x0008, 0x8fb: 0x0008,
+ 0x8fc: 0x0008, 0x8fd: 0x0008, 0x8fe: 0x0008, 0x8ff: 0x0008,
// Block 0x24, offset 0x900
- 0x900: 0x1308, 0x901: 0x0ca1, 0x902: 0x1308, 0x903: 0x1308, 0x904: 0x1b08, 0x905: 0x0018,
- 0x906: 0x1308, 0x907: 0x1308, 0x908: 0x0008, 0x909: 0x0008, 0x90a: 0x0008, 0x90b: 0x0008,
- 0x90c: 0x0008, 0x90d: 0x1308, 0x90e: 0x1308, 0x90f: 0x1308, 0x910: 0x1308, 0x911: 0x1308,
- 0x912: 0x1308, 0x913: 0x0cd9, 0x914: 0x1308, 0x915: 0x1308, 0x916: 0x1308, 0x917: 0x1308,
- 0x918: 0x0040, 0x919: 0x1308, 0x91a: 0x1308, 0x91b: 0x1308, 0x91c: 0x1308, 0x91d: 0x0d11,
- 0x91e: 0x1308, 0x91f: 0x1308, 0x920: 0x1308, 0x921: 0x1308, 0x922: 0x0d49, 0x923: 0x1308,
- 0x924: 0x1308, 0x925: 0x1308, 0x926: 0x1308, 0x927: 0x0d81, 0x928: 0x1308, 0x929: 0x1308,
- 0x92a: 0x1308, 0x92b: 0x1308, 0x92c: 0x0db9, 0x92d: 0x1308, 0x92e: 0x1308, 0x92f: 0x1308,
- 0x930: 0x1308, 0x931: 0x1308, 0x932: 0x1308, 0x933: 0x1308, 0x934: 0x1308, 0x935: 0x1308,
- 0x936: 0x1308, 0x937: 0x1308, 0x938: 0x1308, 0x939: 0x0df1, 0x93a: 0x1308, 0x93b: 0x1308,
- 0x93c: 0x1308, 0x93d: 0x0040, 0x93e: 0x0018, 0x93f: 0x0018,
+ 0x900: 0x0040, 0x901: 0x0008, 0x902: 0x0008, 0x903: 0x0040, 0x904: 0x0008, 0x905: 0x0040,
+ 0x906: 0x0040, 0x907: 0x0008, 0x908: 0x0008, 0x909: 0x0040, 0x90a: 0x0008, 0x90b: 0x0040,
+ 0x90c: 0x0040, 0x90d: 0x0008, 0x90e: 0x0040, 0x90f: 0x0040, 0x910: 0x0040, 0x911: 0x0040,
+ 0x912: 0x0040, 0x913: 0x0040, 0x914: 0x0008, 0x915: 0x0008, 0x916: 0x0008, 0x917: 0x0008,
+ 0x918: 0x0040, 0x919: 0x0008, 0x91a: 0x0008, 0x91b: 0x0008, 0x91c: 0x0008, 0x91d: 0x0008,
+ 0x91e: 0x0008, 0x91f: 0x0008, 0x920: 0x0040, 0x921: 0x0008, 0x922: 0x0008, 0x923: 0x0008,
+ 0x924: 0x0040, 0x925: 0x0008, 0x926: 0x0040, 0x927: 0x0008, 0x928: 0x0040, 0x929: 0x0040,
+ 0x92a: 0x0008, 0x92b: 0x0008, 0x92c: 0x0040, 0x92d: 0x0008, 0x92e: 0x0008, 0x92f: 0x0008,
+ 0x930: 0x0008, 0x931: 0x3308, 0x932: 0x0008, 0x933: 0x0929, 0x934: 0x3308, 0x935: 0x3308,
+ 0x936: 0x3308, 0x937: 0x3308, 0x938: 0x3308, 0x939: 0x3308, 0x93a: 0x0040, 0x93b: 0x3308,
+ 0x93c: 0x3308, 0x93d: 0x0008, 0x93e: 0x0040, 0x93f: 0x0040,
// Block 0x25, offset 0x940
- 0x940: 0x0008, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x0008, 0x944: 0x0008, 0x945: 0x0008,
- 0x946: 0x0008, 0x947: 0x0008, 0x948: 0x0008, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0008,
- 0x94c: 0x0008, 0x94d: 0x0008, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008,
- 0x952: 0x0008, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0008,
- 0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0008, 0x95d: 0x0008,
+ 0x940: 0x0008, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x09d1, 0x944: 0x0008, 0x945: 0x0008,
+ 0x946: 0x0008, 0x947: 0x0008, 0x948: 0x0040, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0008,
+ 0x94c: 0x0008, 0x94d: 0x0a09, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008,
+ 0x952: 0x0a41, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0a79,
+ 0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0ab1, 0x95d: 0x0008,
0x95e: 0x0008, 0x95f: 0x0008, 0x960: 0x0008, 0x961: 0x0008, 0x962: 0x0008, 0x963: 0x0008,
- 0x964: 0x0008, 0x965: 0x0008, 0x966: 0x0008, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0008,
- 0x96a: 0x0008, 0x96b: 0x0008, 0x96c: 0x0039, 0x96d: 0x0ed1, 0x96e: 0x0ee9, 0x96f: 0x0008,
- 0x970: 0x0ef9, 0x971: 0x0f09, 0x972: 0x0f19, 0x973: 0x0f31, 0x974: 0x0249, 0x975: 0x0f41,
- 0x976: 0x0259, 0x977: 0x0f51, 0x978: 0x0359, 0x979: 0x0f61, 0x97a: 0x0f71, 0x97b: 0x0008,
- 0x97c: 0x00d9, 0x97d: 0x0f81, 0x97e: 0x0f99, 0x97f: 0x0269,
+ 0x964: 0x0008, 0x965: 0x0008, 0x966: 0x0008, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0ae9,
+ 0x96a: 0x0008, 0x96b: 0x0008, 0x96c: 0x0008, 0x96d: 0x0040, 0x96e: 0x0040, 0x96f: 0x0040,
+ 0x970: 0x0040, 0x971: 0x3308, 0x972: 0x3308, 0x973: 0x0b21, 0x974: 0x3308, 0x975: 0x0b59,
+ 0x976: 0x0b91, 0x977: 0x0bc9, 0x978: 0x0c19, 0x979: 0x0c51, 0x97a: 0x3308, 0x97b: 0x3308,
+ 0x97c: 0x3308, 0x97d: 0x3308, 0x97e: 0x3308, 0x97f: 0x3008,
// Block 0x26, offset 0x980
- 0x980: 0x0fa9, 0x981: 0x0fb9, 0x982: 0x0279, 0x983: 0x0039, 0x984: 0x0fc9, 0x985: 0x0fe1,
- 0x986: 0x059d, 0x987: 0x0ee9, 0x988: 0x0ef9, 0x989: 0x0f09, 0x98a: 0x0ff9, 0x98b: 0x1011,
- 0x98c: 0x1029, 0x98d: 0x0f31, 0x98e: 0x0008, 0x98f: 0x0f51, 0x990: 0x0f61, 0x991: 0x1041,
- 0x992: 0x00d9, 0x993: 0x1059, 0x994: 0x05b5, 0x995: 0x05b5, 0x996: 0x0f99, 0x997: 0x0fa9,
- 0x998: 0x0fb9, 0x999: 0x059d, 0x99a: 0x1071, 0x99b: 0x1089, 0x99c: 0x05cd, 0x99d: 0x1099,
- 0x99e: 0x10b1, 0x99f: 0x10c9, 0x9a0: 0x10e1, 0x9a1: 0x10f9, 0x9a2: 0x0f41, 0x9a3: 0x0269,
- 0x9a4: 0x0fb9, 0x9a5: 0x1089, 0x9a6: 0x1099, 0x9a7: 0x10b1, 0x9a8: 0x1111, 0x9a9: 0x10e1,
- 0x9aa: 0x10f9, 0x9ab: 0x0008, 0x9ac: 0x0008, 0x9ad: 0x0008, 0x9ae: 0x0008, 0x9af: 0x0008,
- 0x9b0: 0x0008, 0x9b1: 0x0008, 0x9b2: 0x0008, 0x9b3: 0x0008, 0x9b4: 0x0008, 0x9b5: 0x0008,
- 0x9b6: 0x0008, 0x9b7: 0x0008, 0x9b8: 0x1129, 0x9b9: 0x0008, 0x9ba: 0x0008, 0x9bb: 0x0008,
- 0x9bc: 0x0008, 0x9bd: 0x0008, 0x9be: 0x0008, 0x9bf: 0x0008,
+ 0x980: 0x3308, 0x981: 0x0ca1, 0x982: 0x3308, 0x983: 0x3308, 0x984: 0x3b08, 0x985: 0x0018,
+ 0x986: 0x3308, 0x987: 0x3308, 0x988: 0x0008, 0x989: 0x0008, 0x98a: 0x0008, 0x98b: 0x0008,
+ 0x98c: 0x0008, 0x98d: 0x3308, 0x98e: 0x3308, 0x98f: 0x3308, 0x990: 0x3308, 0x991: 0x3308,
+ 0x992: 0x3308, 0x993: 0x0cd9, 0x994: 0x3308, 0x995: 0x3308, 0x996: 0x3308, 0x997: 0x3308,
+ 0x998: 0x0040, 0x999: 0x3308, 0x99a: 0x3308, 0x99b: 0x3308, 0x99c: 0x3308, 0x99d: 0x0d11,
+ 0x99e: 0x3308, 0x99f: 0x3308, 0x9a0: 0x3308, 0x9a1: 0x3308, 0x9a2: 0x0d49, 0x9a3: 0x3308,
+ 0x9a4: 0x3308, 0x9a5: 0x3308, 0x9a6: 0x3308, 0x9a7: 0x0d81, 0x9a8: 0x3308, 0x9a9: 0x3308,
+ 0x9aa: 0x3308, 0x9ab: 0x3308, 0x9ac: 0x0db9, 0x9ad: 0x3308, 0x9ae: 0x3308, 0x9af: 0x3308,
+ 0x9b0: 0x3308, 0x9b1: 0x3308, 0x9b2: 0x3308, 0x9b3: 0x3308, 0x9b4: 0x3308, 0x9b5: 0x3308,
+ 0x9b6: 0x3308, 0x9b7: 0x3308, 0x9b8: 0x3308, 0x9b9: 0x0df1, 0x9ba: 0x3308, 0x9bb: 0x3308,
+ 0x9bc: 0x3308, 0x9bd: 0x0040, 0x9be: 0x0018, 0x9bf: 0x0018,
// Block 0x27, offset 0x9c0
0x9c0: 0x0008, 0x9c1: 0x0008, 0x9c2: 0x0008, 0x9c3: 0x0008, 0x9c4: 0x0008, 0x9c5: 0x0008,
0x9c6: 0x0008, 0x9c7: 0x0008, 0x9c8: 0x0008, 0x9c9: 0x0008, 0x9ca: 0x0008, 0x9cb: 0x0008,
0x9cc: 0x0008, 0x9cd: 0x0008, 0x9ce: 0x0008, 0x9cf: 0x0008, 0x9d0: 0x0008, 0x9d1: 0x0008,
0x9d2: 0x0008, 0x9d3: 0x0008, 0x9d4: 0x0008, 0x9d5: 0x0008, 0x9d6: 0x0008, 0x9d7: 0x0008,
- 0x9d8: 0x0008, 0x9d9: 0x0008, 0x9da: 0x0008, 0x9db: 0x1141, 0x9dc: 0x1159, 0x9dd: 0x1169,
- 0x9de: 0x1181, 0x9df: 0x1029, 0x9e0: 0x1199, 0x9e1: 0x11a9, 0x9e2: 0x11c1, 0x9e3: 0x11d9,
- 0x9e4: 0x11f1, 0x9e5: 0x1209, 0x9e6: 0x1221, 0x9e7: 0x05e5, 0x9e8: 0x1239, 0x9e9: 0x1251,
- 0x9ea: 0xe17d, 0x9eb: 0x1269, 0x9ec: 0x1281, 0x9ed: 0x1299, 0x9ee: 0x12b1, 0x9ef: 0x12c9,
- 0x9f0: 0x12e1, 0x9f1: 0x12f9, 0x9f2: 0x1311, 0x9f3: 0x1329, 0x9f4: 0x1341, 0x9f5: 0x1359,
- 0x9f6: 0x1371, 0x9f7: 0x1389, 0x9f8: 0x05fd, 0x9f9: 0x13a1, 0x9fa: 0x13b9, 0x9fb: 0x13d1,
- 0x9fc: 0x13e1, 0x9fd: 0x13f9, 0x9fe: 0x1411, 0x9ff: 0x1429,
+ 0x9d8: 0x0008, 0x9d9: 0x0008, 0x9da: 0x0008, 0x9db: 0x0008, 0x9dc: 0x0008, 0x9dd: 0x0008,
+ 0x9de: 0x0008, 0x9df: 0x0008, 0x9e0: 0x0008, 0x9e1: 0x0008, 0x9e2: 0x0008, 0x9e3: 0x0008,
+ 0x9e4: 0x0008, 0x9e5: 0x0008, 0x9e6: 0x0008, 0x9e7: 0x0008, 0x9e8: 0x0008, 0x9e9: 0x0008,
+ 0x9ea: 0x0008, 0x9eb: 0x0008, 0x9ec: 0x0039, 0x9ed: 0x0ed1, 0x9ee: 0x0ee9, 0x9ef: 0x0008,
+ 0x9f0: 0x0ef9, 0x9f1: 0x0f09, 0x9f2: 0x0f19, 0x9f3: 0x0f31, 0x9f4: 0x0249, 0x9f5: 0x0f41,
+ 0x9f6: 0x0259, 0x9f7: 0x0f51, 0x9f8: 0x0359, 0x9f9: 0x0f61, 0x9fa: 0x0f71, 0x9fb: 0x0008,
+ 0x9fc: 0x00d9, 0x9fd: 0x0f81, 0x9fe: 0x0f99, 0x9ff: 0x0269,
// Block 0x28, offset 0xa00
- 0xa00: 0xe00d, 0xa01: 0x0008, 0xa02: 0xe00d, 0xa03: 0x0008, 0xa04: 0xe00d, 0xa05: 0x0008,
- 0xa06: 0xe00d, 0xa07: 0x0008, 0xa08: 0xe00d, 0xa09: 0x0008, 0xa0a: 0xe00d, 0xa0b: 0x0008,
- 0xa0c: 0xe00d, 0xa0d: 0x0008, 0xa0e: 0xe00d, 0xa0f: 0x0008, 0xa10: 0xe00d, 0xa11: 0x0008,
- 0xa12: 0xe00d, 0xa13: 0x0008, 0xa14: 0xe00d, 0xa15: 0x0008, 0xa16: 0xe00d, 0xa17: 0x0008,
- 0xa18: 0xe00d, 0xa19: 0x0008, 0xa1a: 0xe00d, 0xa1b: 0x0008, 0xa1c: 0xe00d, 0xa1d: 0x0008,
- 0xa1e: 0xe00d, 0xa1f: 0x0008, 0xa20: 0xe00d, 0xa21: 0x0008, 0xa22: 0xe00d, 0xa23: 0x0008,
- 0xa24: 0xe00d, 0xa25: 0x0008, 0xa26: 0xe00d, 0xa27: 0x0008, 0xa28: 0xe00d, 0xa29: 0x0008,
- 0xa2a: 0xe00d, 0xa2b: 0x0008, 0xa2c: 0xe00d, 0xa2d: 0x0008, 0xa2e: 0xe00d, 0xa2f: 0x0008,
- 0xa30: 0xe00d, 0xa31: 0x0008, 0xa32: 0xe00d, 0xa33: 0x0008, 0xa34: 0xe00d, 0xa35: 0x0008,
- 0xa36: 0xe00d, 0xa37: 0x0008, 0xa38: 0xe00d, 0xa39: 0x0008, 0xa3a: 0xe00d, 0xa3b: 0x0008,
- 0xa3c: 0xe00d, 0xa3d: 0x0008, 0xa3e: 0xe00d, 0xa3f: 0x0008,
+ 0xa00: 0x0fa9, 0xa01: 0x0fb9, 0xa02: 0x0279, 0xa03: 0x0039, 0xa04: 0x0fc9, 0xa05: 0x0fe1,
+ 0xa06: 0x059d, 0xa07: 0x0ee9, 0xa08: 0x0ef9, 0xa09: 0x0f09, 0xa0a: 0x0ff9, 0xa0b: 0x1011,
+ 0xa0c: 0x1029, 0xa0d: 0x0f31, 0xa0e: 0x0008, 0xa0f: 0x0f51, 0xa10: 0x0f61, 0xa11: 0x1041,
+ 0xa12: 0x00d9, 0xa13: 0x1059, 0xa14: 0x05b5, 0xa15: 0x05b5, 0xa16: 0x0f99, 0xa17: 0x0fa9,
+ 0xa18: 0x0fb9, 0xa19: 0x059d, 0xa1a: 0x1071, 0xa1b: 0x1089, 0xa1c: 0x05cd, 0xa1d: 0x1099,
+ 0xa1e: 0x10b1, 0xa1f: 0x10c9, 0xa20: 0x10e1, 0xa21: 0x10f9, 0xa22: 0x0f41, 0xa23: 0x0269,
+ 0xa24: 0x0fb9, 0xa25: 0x1089, 0xa26: 0x1099, 0xa27: 0x10b1, 0xa28: 0x1111, 0xa29: 0x10e1,
+ 0xa2a: 0x10f9, 0xa2b: 0x0008, 0xa2c: 0x0008, 0xa2d: 0x0008, 0xa2e: 0x0008, 0xa2f: 0x0008,
+ 0xa30: 0x0008, 0xa31: 0x0008, 0xa32: 0x0008, 0xa33: 0x0008, 0xa34: 0x0008, 0xa35: 0x0008,
+ 0xa36: 0x0008, 0xa37: 0x0008, 0xa38: 0x1129, 0xa39: 0x0008, 0xa3a: 0x0008, 0xa3b: 0x0008,
+ 0xa3c: 0x0008, 0xa3d: 0x0008, 0xa3e: 0x0008, 0xa3f: 0x0008,
// Block 0x29, offset 0xa40
- 0xa40: 0xe00d, 0xa41: 0x0008, 0xa42: 0xe00d, 0xa43: 0x0008, 0xa44: 0xe00d, 0xa45: 0x0008,
- 0xa46: 0xe00d, 0xa47: 0x0008, 0xa48: 0xe00d, 0xa49: 0x0008, 0xa4a: 0xe00d, 0xa4b: 0x0008,
- 0xa4c: 0xe00d, 0xa4d: 0x0008, 0xa4e: 0xe00d, 0xa4f: 0x0008, 0xa50: 0xe00d, 0xa51: 0x0008,
- 0xa52: 0xe00d, 0xa53: 0x0008, 0xa54: 0xe00d, 0xa55: 0x0008, 0xa56: 0x0008, 0xa57: 0x0008,
- 0xa58: 0x0008, 0xa59: 0x0008, 0xa5a: 0x0615, 0xa5b: 0x0635, 0xa5c: 0x0008, 0xa5d: 0x0008,
- 0xa5e: 0x1441, 0xa5f: 0x0008, 0xa60: 0xe00d, 0xa61: 0x0008, 0xa62: 0xe00d, 0xa63: 0x0008,
- 0xa64: 0xe00d, 0xa65: 0x0008, 0xa66: 0xe00d, 0xa67: 0x0008, 0xa68: 0xe00d, 0xa69: 0x0008,
- 0xa6a: 0xe00d, 0xa6b: 0x0008, 0xa6c: 0xe00d, 0xa6d: 0x0008, 0xa6e: 0xe00d, 0xa6f: 0x0008,
- 0xa70: 0xe00d, 0xa71: 0x0008, 0xa72: 0xe00d, 0xa73: 0x0008, 0xa74: 0xe00d, 0xa75: 0x0008,
- 0xa76: 0xe00d, 0xa77: 0x0008, 0xa78: 0xe00d, 0xa79: 0x0008, 0xa7a: 0xe00d, 0xa7b: 0x0008,
- 0xa7c: 0xe00d, 0xa7d: 0x0008, 0xa7e: 0xe00d, 0xa7f: 0x0008,
+ 0xa40: 0x0008, 0xa41: 0x0008, 0xa42: 0x0008, 0xa43: 0x0008, 0xa44: 0x0008, 0xa45: 0x0008,
+ 0xa46: 0x0008, 0xa47: 0x0008, 0xa48: 0x0008, 0xa49: 0x0008, 0xa4a: 0x0008, 0xa4b: 0x0008,
+ 0xa4c: 0x0008, 0xa4d: 0x0008, 0xa4e: 0x0008, 0xa4f: 0x0008, 0xa50: 0x0008, 0xa51: 0x0008,
+ 0xa52: 0x0008, 0xa53: 0x0008, 0xa54: 0x0008, 0xa55: 0x0008, 0xa56: 0x0008, 0xa57: 0x0008,
+ 0xa58: 0x0008, 0xa59: 0x0008, 0xa5a: 0x0008, 0xa5b: 0x1141, 0xa5c: 0x1159, 0xa5d: 0x1169,
+ 0xa5e: 0x1181, 0xa5f: 0x1029, 0xa60: 0x1199, 0xa61: 0x11a9, 0xa62: 0x11c1, 0xa63: 0x11d9,
+ 0xa64: 0x11f1, 0xa65: 0x1209, 0xa66: 0x1221, 0xa67: 0x05e5, 0xa68: 0x1239, 0xa69: 0x1251,
+ 0xa6a: 0xe17d, 0xa6b: 0x1269, 0xa6c: 0x1281, 0xa6d: 0x1299, 0xa6e: 0x12b1, 0xa6f: 0x12c9,
+ 0xa70: 0x12e1, 0xa71: 0x12f9, 0xa72: 0x1311, 0xa73: 0x1329, 0xa74: 0x1341, 0xa75: 0x1359,
+ 0xa76: 0x1371, 0xa77: 0x1389, 0xa78: 0x05fd, 0xa79: 0x13a1, 0xa7a: 0x13b9, 0xa7b: 0x13d1,
+ 0xa7c: 0x13e1, 0xa7d: 0x13f9, 0xa7e: 0x1411, 0xa7f: 0x1429,
// Block 0x2a, offset 0xa80
- 0xa80: 0x0008, 0xa81: 0x0008, 0xa82: 0x0008, 0xa83: 0x0008, 0xa84: 0x0008, 0xa85: 0x0008,
- 0xa86: 0x0040, 0xa87: 0x0040, 0xa88: 0xe045, 0xa89: 0xe045, 0xa8a: 0xe045, 0xa8b: 0xe045,
- 0xa8c: 0xe045, 0xa8d: 0xe045, 0xa8e: 0x0040, 0xa8f: 0x0040, 0xa90: 0x0008, 0xa91: 0x0008,
- 0xa92: 0x0008, 0xa93: 0x0008, 0xa94: 0x0008, 0xa95: 0x0008, 0xa96: 0x0008, 0xa97: 0x0008,
- 0xa98: 0x0040, 0xa99: 0xe045, 0xa9a: 0x0040, 0xa9b: 0xe045, 0xa9c: 0x0040, 0xa9d: 0xe045,
- 0xa9e: 0x0040, 0xa9f: 0xe045, 0xaa0: 0x0008, 0xaa1: 0x0008, 0xaa2: 0x0008, 0xaa3: 0x0008,
- 0xaa4: 0x0008, 0xaa5: 0x0008, 0xaa6: 0x0008, 0xaa7: 0x0008, 0xaa8: 0xe045, 0xaa9: 0xe045,
- 0xaaa: 0xe045, 0xaab: 0xe045, 0xaac: 0xe045, 0xaad: 0xe045, 0xaae: 0xe045, 0xaaf: 0xe045,
- 0xab0: 0x0008, 0xab1: 0x1459, 0xab2: 0x0008, 0xab3: 0x1471, 0xab4: 0x0008, 0xab5: 0x1489,
- 0xab6: 0x0008, 0xab7: 0x14a1, 0xab8: 0x0008, 0xab9: 0x14b9, 0xaba: 0x0008, 0xabb: 0x14d1,
- 0xabc: 0x0008, 0xabd: 0x14e9, 0xabe: 0x0040, 0xabf: 0x0040,
+ 0xa80: 0xe00d, 0xa81: 0x0008, 0xa82: 0xe00d, 0xa83: 0x0008, 0xa84: 0xe00d, 0xa85: 0x0008,
+ 0xa86: 0xe00d, 0xa87: 0x0008, 0xa88: 0xe00d, 0xa89: 0x0008, 0xa8a: 0xe00d, 0xa8b: 0x0008,
+ 0xa8c: 0xe00d, 0xa8d: 0x0008, 0xa8e: 0xe00d, 0xa8f: 0x0008, 0xa90: 0xe00d, 0xa91: 0x0008,
+ 0xa92: 0xe00d, 0xa93: 0x0008, 0xa94: 0xe00d, 0xa95: 0x0008, 0xa96: 0xe00d, 0xa97: 0x0008,
+ 0xa98: 0xe00d, 0xa99: 0x0008, 0xa9a: 0xe00d, 0xa9b: 0x0008, 0xa9c: 0xe00d, 0xa9d: 0x0008,
+ 0xa9e: 0xe00d, 0xa9f: 0x0008, 0xaa0: 0xe00d, 0xaa1: 0x0008, 0xaa2: 0xe00d, 0xaa3: 0x0008,
+ 0xaa4: 0xe00d, 0xaa5: 0x0008, 0xaa6: 0xe00d, 0xaa7: 0x0008, 0xaa8: 0xe00d, 0xaa9: 0x0008,
+ 0xaaa: 0xe00d, 0xaab: 0x0008, 0xaac: 0xe00d, 0xaad: 0x0008, 0xaae: 0xe00d, 0xaaf: 0x0008,
+ 0xab0: 0xe00d, 0xab1: 0x0008, 0xab2: 0xe00d, 0xab3: 0x0008, 0xab4: 0xe00d, 0xab5: 0x0008,
+ 0xab6: 0xe00d, 0xab7: 0x0008, 0xab8: 0xe00d, 0xab9: 0x0008, 0xaba: 0xe00d, 0xabb: 0x0008,
+ 0xabc: 0xe00d, 0xabd: 0x0008, 0xabe: 0xe00d, 0xabf: 0x0008,
// Block 0x2b, offset 0xac0
- 0xac0: 0x1501, 0xac1: 0x1531, 0xac2: 0x1561, 0xac3: 0x1591, 0xac4: 0x15c1, 0xac5: 0x15f1,
- 0xac6: 0x1621, 0xac7: 0x1651, 0xac8: 0x1501, 0xac9: 0x1531, 0xaca: 0x1561, 0xacb: 0x1591,
- 0xacc: 0x15c1, 0xacd: 0x15f1, 0xace: 0x1621, 0xacf: 0x1651, 0xad0: 0x1681, 0xad1: 0x16b1,
- 0xad2: 0x16e1, 0xad3: 0x1711, 0xad4: 0x1741, 0xad5: 0x1771, 0xad6: 0x17a1, 0xad7: 0x17d1,
- 0xad8: 0x1681, 0xad9: 0x16b1, 0xada: 0x16e1, 0xadb: 0x1711, 0xadc: 0x1741, 0xadd: 0x1771,
- 0xade: 0x17a1, 0xadf: 0x17d1, 0xae0: 0x1801, 0xae1: 0x1831, 0xae2: 0x1861, 0xae3: 0x1891,
- 0xae4: 0x18c1, 0xae5: 0x18f1, 0xae6: 0x1921, 0xae7: 0x1951, 0xae8: 0x1801, 0xae9: 0x1831,
- 0xaea: 0x1861, 0xaeb: 0x1891, 0xaec: 0x18c1, 0xaed: 0x18f1, 0xaee: 0x1921, 0xaef: 0x1951,
- 0xaf0: 0x0008, 0xaf1: 0x0008, 0xaf2: 0x1981, 0xaf3: 0x19b1, 0xaf4: 0x19d9, 0xaf5: 0x0040,
- 0xaf6: 0x0008, 0xaf7: 0x1a01, 0xaf8: 0xe045, 0xaf9: 0xe045, 0xafa: 0x064d, 0xafb: 0x1459,
- 0xafc: 0x19b1, 0xafd: 0x0666, 0xafe: 0x1a31, 0xaff: 0x0686,
+ 0xac0: 0xe00d, 0xac1: 0x0008, 0xac2: 0xe00d, 0xac3: 0x0008, 0xac4: 0xe00d, 0xac5: 0x0008,
+ 0xac6: 0xe00d, 0xac7: 0x0008, 0xac8: 0xe00d, 0xac9: 0x0008, 0xaca: 0xe00d, 0xacb: 0x0008,
+ 0xacc: 0xe00d, 0xacd: 0x0008, 0xace: 0xe00d, 0xacf: 0x0008, 0xad0: 0xe00d, 0xad1: 0x0008,
+ 0xad2: 0xe00d, 0xad3: 0x0008, 0xad4: 0xe00d, 0xad5: 0x0008, 0xad6: 0x0008, 0xad7: 0x0008,
+ 0xad8: 0x0008, 0xad9: 0x0008, 0xada: 0x0615, 0xadb: 0x0635, 0xadc: 0x0008, 0xadd: 0x0008,
+ 0xade: 0x1441, 0xadf: 0x0008, 0xae0: 0xe00d, 0xae1: 0x0008, 0xae2: 0xe00d, 0xae3: 0x0008,
+ 0xae4: 0xe00d, 0xae5: 0x0008, 0xae6: 0xe00d, 0xae7: 0x0008, 0xae8: 0xe00d, 0xae9: 0x0008,
+ 0xaea: 0xe00d, 0xaeb: 0x0008, 0xaec: 0xe00d, 0xaed: 0x0008, 0xaee: 0xe00d, 0xaef: 0x0008,
+ 0xaf0: 0xe00d, 0xaf1: 0x0008, 0xaf2: 0xe00d, 0xaf3: 0x0008, 0xaf4: 0xe00d, 0xaf5: 0x0008,
+ 0xaf6: 0xe00d, 0xaf7: 0x0008, 0xaf8: 0xe00d, 0xaf9: 0x0008, 0xafa: 0xe00d, 0xafb: 0x0008,
+ 0xafc: 0xe00d, 0xafd: 0x0008, 0xafe: 0xe00d, 0xaff: 0x0008,
// Block 0x2c, offset 0xb00
- 0xb00: 0x06a6, 0xb01: 0x1a4a, 0xb02: 0x1a79, 0xb03: 0x1aa9, 0xb04: 0x1ad1, 0xb05: 0x0040,
- 0xb06: 0x0008, 0xb07: 0x1af9, 0xb08: 0x06c5, 0xb09: 0x1471, 0xb0a: 0x06dd, 0xb0b: 0x1489,
- 0xb0c: 0x1aa9, 0xb0d: 0x1b2a, 0xb0e: 0x1b5a, 0xb0f: 0x1b8a, 0xb10: 0x0008, 0xb11: 0x0008,
- 0xb12: 0x0008, 0xb13: 0x1bb9, 0xb14: 0x0040, 0xb15: 0x0040, 0xb16: 0x0008, 0xb17: 0x0008,
- 0xb18: 0xe045, 0xb19: 0xe045, 0xb1a: 0x06f5, 0xb1b: 0x14a1, 0xb1c: 0x0040, 0xb1d: 0x1bd2,
- 0xb1e: 0x1c02, 0xb1f: 0x1c32, 0xb20: 0x0008, 0xb21: 0x0008, 0xb22: 0x0008, 0xb23: 0x1c61,
+ 0xb00: 0x0008, 0xb01: 0x0008, 0xb02: 0x0008, 0xb03: 0x0008, 0xb04: 0x0008, 0xb05: 0x0008,
+ 0xb06: 0x0040, 0xb07: 0x0040, 0xb08: 0xe045, 0xb09: 0xe045, 0xb0a: 0xe045, 0xb0b: 0xe045,
+ 0xb0c: 0xe045, 0xb0d: 0xe045, 0xb0e: 0x0040, 0xb0f: 0x0040, 0xb10: 0x0008, 0xb11: 0x0008,
+ 0xb12: 0x0008, 0xb13: 0x0008, 0xb14: 0x0008, 0xb15: 0x0008, 0xb16: 0x0008, 0xb17: 0x0008,
+ 0xb18: 0x0040, 0xb19: 0xe045, 0xb1a: 0x0040, 0xb1b: 0xe045, 0xb1c: 0x0040, 0xb1d: 0xe045,
+ 0xb1e: 0x0040, 0xb1f: 0xe045, 0xb20: 0x0008, 0xb21: 0x0008, 0xb22: 0x0008, 0xb23: 0x0008,
0xb24: 0x0008, 0xb25: 0x0008, 0xb26: 0x0008, 0xb27: 0x0008, 0xb28: 0xe045, 0xb29: 0xe045,
- 0xb2a: 0x070d, 0xb2b: 0x14d1, 0xb2c: 0xe04d, 0xb2d: 0x1c7a, 0xb2e: 0x03d2, 0xb2f: 0x1caa,
- 0xb30: 0x0040, 0xb31: 0x0040, 0xb32: 0x1cb9, 0xb33: 0x1ce9, 0xb34: 0x1d11, 0xb35: 0x0040,
- 0xb36: 0x0008, 0xb37: 0x1d39, 0xb38: 0x0725, 0xb39: 0x14b9, 0xb3a: 0x0515, 0xb3b: 0x14e9,
- 0xb3c: 0x1ce9, 0xb3d: 0x073e, 0xb3e: 0x075e, 0xb3f: 0x0040,
+ 0xb2a: 0xe045, 0xb2b: 0xe045, 0xb2c: 0xe045, 0xb2d: 0xe045, 0xb2e: 0xe045, 0xb2f: 0xe045,
+ 0xb30: 0x0008, 0xb31: 0x1459, 0xb32: 0x0008, 0xb33: 0x1471, 0xb34: 0x0008, 0xb35: 0x1489,
+ 0xb36: 0x0008, 0xb37: 0x14a1, 0xb38: 0x0008, 0xb39: 0x14b9, 0xb3a: 0x0008, 0xb3b: 0x14d1,
+ 0xb3c: 0x0008, 0xb3d: 0x14e9, 0xb3e: 0x0040, 0xb3f: 0x0040,
// Block 0x2d, offset 0xb40
- 0xb40: 0x000a, 0xb41: 0x000a, 0xb42: 0x000a, 0xb43: 0x000a, 0xb44: 0x000a, 0xb45: 0x000a,
- 0xb46: 0x000a, 0xb47: 0x000a, 0xb48: 0x000a, 0xb49: 0x000a, 0xb4a: 0x000a, 0xb4b: 0x03c0,
- 0xb4c: 0x0003, 0xb4d: 0x0003, 0xb4e: 0x0340, 0xb4f: 0x0340, 0xb50: 0x0018, 0xb51: 0xe00d,
- 0xb52: 0x0018, 0xb53: 0x0018, 0xb54: 0x0018, 0xb55: 0x0018, 0xb56: 0x0018, 0xb57: 0x077e,
- 0xb58: 0x0018, 0xb59: 0x0018, 0xb5a: 0x0018, 0xb5b: 0x0018, 0xb5c: 0x0018, 0xb5d: 0x0018,
- 0xb5e: 0x0018, 0xb5f: 0x0018, 0xb60: 0x0018, 0xb61: 0x0018, 0xb62: 0x0018, 0xb63: 0x0018,
- 0xb64: 0x0040, 0xb65: 0x0040, 0xb66: 0x0040, 0xb67: 0x0018, 0xb68: 0x0040, 0xb69: 0x0040,
- 0xb6a: 0x0340, 0xb6b: 0x0340, 0xb6c: 0x0340, 0xb6d: 0x0340, 0xb6e: 0x0340, 0xb6f: 0x000a,
- 0xb70: 0x0018, 0xb71: 0x0018, 0xb72: 0x0018, 0xb73: 0x1d69, 0xb74: 0x1da1, 0xb75: 0x0018,
- 0xb76: 0x1df1, 0xb77: 0x1e29, 0xb78: 0x0018, 0xb79: 0x0018, 0xb7a: 0x0018, 0xb7b: 0x0018,
- 0xb7c: 0x1e7a, 0xb7d: 0x0018, 0xb7e: 0x079e, 0xb7f: 0x0018,
+ 0xb40: 0x1501, 0xb41: 0x1531, 0xb42: 0x1561, 0xb43: 0x1591, 0xb44: 0x15c1, 0xb45: 0x15f1,
+ 0xb46: 0x1621, 0xb47: 0x1651, 0xb48: 0x1501, 0xb49: 0x1531, 0xb4a: 0x1561, 0xb4b: 0x1591,
+ 0xb4c: 0x15c1, 0xb4d: 0x15f1, 0xb4e: 0x1621, 0xb4f: 0x1651, 0xb50: 0x1681, 0xb51: 0x16b1,
+ 0xb52: 0x16e1, 0xb53: 0x1711, 0xb54: 0x1741, 0xb55: 0x1771, 0xb56: 0x17a1, 0xb57: 0x17d1,
+ 0xb58: 0x1681, 0xb59: 0x16b1, 0xb5a: 0x16e1, 0xb5b: 0x1711, 0xb5c: 0x1741, 0xb5d: 0x1771,
+ 0xb5e: 0x17a1, 0xb5f: 0x17d1, 0xb60: 0x1801, 0xb61: 0x1831, 0xb62: 0x1861, 0xb63: 0x1891,
+ 0xb64: 0x18c1, 0xb65: 0x18f1, 0xb66: 0x1921, 0xb67: 0x1951, 0xb68: 0x1801, 0xb69: 0x1831,
+ 0xb6a: 0x1861, 0xb6b: 0x1891, 0xb6c: 0x18c1, 0xb6d: 0x18f1, 0xb6e: 0x1921, 0xb6f: 0x1951,
+ 0xb70: 0x0008, 0xb71: 0x0008, 0xb72: 0x1981, 0xb73: 0x19b1, 0xb74: 0x19d9, 0xb75: 0x0040,
+ 0xb76: 0x0008, 0xb77: 0x1a01, 0xb78: 0xe045, 0xb79: 0xe045, 0xb7a: 0x064d, 0xb7b: 0x1459,
+ 0xb7c: 0x19b1, 0xb7d: 0x0666, 0xb7e: 0x1a31, 0xb7f: 0x0686,
// Block 0x2e, offset 0xb80
- 0xb80: 0x0018, 0xb81: 0x0018, 0xb82: 0x0018, 0xb83: 0x0018, 0xb84: 0x0018, 0xb85: 0x0018,
- 0xb86: 0x0018, 0xb87: 0x1e92, 0xb88: 0x1eaa, 0xb89: 0x1ec2, 0xb8a: 0x0018, 0xb8b: 0x0018,
- 0xb8c: 0x0018, 0xb8d: 0x0018, 0xb8e: 0x0018, 0xb8f: 0x0018, 0xb90: 0x0018, 0xb91: 0x0018,
- 0xb92: 0x0018, 0xb93: 0x0018, 0xb94: 0x0018, 0xb95: 0x0018, 0xb96: 0x0018, 0xb97: 0x1ed9,
- 0xb98: 0x0018, 0xb99: 0x0018, 0xb9a: 0x0018, 0xb9b: 0x0018, 0xb9c: 0x0018, 0xb9d: 0x0018,
- 0xb9e: 0x0018, 0xb9f: 0x000a, 0xba0: 0x03c0, 0xba1: 0x0340, 0xba2: 0x0340, 0xba3: 0x0340,
- 0xba4: 0x03c0, 0xba5: 0x0040, 0xba6: 0x0040, 0xba7: 0x0040, 0xba8: 0x0040, 0xba9: 0x0040,
- 0xbaa: 0x0340, 0xbab: 0x0340, 0xbac: 0x0340, 0xbad: 0x0340, 0xbae: 0x0340, 0xbaf: 0x0340,
- 0xbb0: 0x1f41, 0xbb1: 0x0f41, 0xbb2: 0x0040, 0xbb3: 0x0040, 0xbb4: 0x1f51, 0xbb5: 0x1f61,
- 0xbb6: 0x1f71, 0xbb7: 0x1f81, 0xbb8: 0x1f91, 0xbb9: 0x1fa1, 0xbba: 0x1fb2, 0xbbb: 0x07bd,
- 0xbbc: 0x1fc2, 0xbbd: 0x1fd2, 0xbbe: 0x1fe2, 0xbbf: 0x0f71,
+ 0xb80: 0x06a6, 0xb81: 0x1a4a, 0xb82: 0x1a79, 0xb83: 0x1aa9, 0xb84: 0x1ad1, 0xb85: 0x0040,
+ 0xb86: 0x0008, 0xb87: 0x1af9, 0xb88: 0x06c5, 0xb89: 0x1471, 0xb8a: 0x06dd, 0xb8b: 0x1489,
+ 0xb8c: 0x1aa9, 0xb8d: 0x1b2a, 0xb8e: 0x1b5a, 0xb8f: 0x1b8a, 0xb90: 0x0008, 0xb91: 0x0008,
+ 0xb92: 0x0008, 0xb93: 0x1bb9, 0xb94: 0x0040, 0xb95: 0x0040, 0xb96: 0x0008, 0xb97: 0x0008,
+ 0xb98: 0xe045, 0xb99: 0xe045, 0xb9a: 0x06f5, 0xb9b: 0x14a1, 0xb9c: 0x0040, 0xb9d: 0x1bd2,
+ 0xb9e: 0x1c02, 0xb9f: 0x1c32, 0xba0: 0x0008, 0xba1: 0x0008, 0xba2: 0x0008, 0xba3: 0x1c61,
+ 0xba4: 0x0008, 0xba5: 0x0008, 0xba6: 0x0008, 0xba7: 0x0008, 0xba8: 0xe045, 0xba9: 0xe045,
+ 0xbaa: 0x070d, 0xbab: 0x14d1, 0xbac: 0xe04d, 0xbad: 0x1c7a, 0xbae: 0x03d2, 0xbaf: 0x1caa,
+ 0xbb0: 0x0040, 0xbb1: 0x0040, 0xbb2: 0x1cb9, 0xbb3: 0x1ce9, 0xbb4: 0x1d11, 0xbb5: 0x0040,
+ 0xbb6: 0x0008, 0xbb7: 0x1d39, 0xbb8: 0x0725, 0xbb9: 0x14b9, 0xbba: 0x0515, 0xbbb: 0x14e9,
+ 0xbbc: 0x1ce9, 0xbbd: 0x073e, 0xbbe: 0x075e, 0xbbf: 0x0040,
// Block 0x2f, offset 0xbc0
- 0xbc0: 0x1f41, 0xbc1: 0x00c9, 0xbc2: 0x0069, 0xbc3: 0x0079, 0xbc4: 0x1f51, 0xbc5: 0x1f61,
- 0xbc6: 0x1f71, 0xbc7: 0x1f81, 0xbc8: 0x1f91, 0xbc9: 0x1fa1, 0xbca: 0x1fb2, 0xbcb: 0x07d5,
- 0xbcc: 0x1fc2, 0xbcd: 0x1fd2, 0xbce: 0x1fe2, 0xbcf: 0x0040, 0xbd0: 0x0039, 0xbd1: 0x0f09,
- 0xbd2: 0x00d9, 0xbd3: 0x0369, 0xbd4: 0x0ff9, 0xbd5: 0x0249, 0xbd6: 0x0f51, 0xbd7: 0x0359,
- 0xbd8: 0x0f61, 0xbd9: 0x0f71, 0xbda: 0x0f99, 0xbdb: 0x01d9, 0xbdc: 0x0fa9, 0xbdd: 0x0040,
- 0xbde: 0x0040, 0xbdf: 0x0040, 0xbe0: 0x0018, 0xbe1: 0x0018, 0xbe2: 0x0018, 0xbe3: 0x0018,
- 0xbe4: 0x0018, 0xbe5: 0x0018, 0xbe6: 0x0018, 0xbe7: 0x0018, 0xbe8: 0x1ff1, 0xbe9: 0x0018,
- 0xbea: 0x0018, 0xbeb: 0x0018, 0xbec: 0x0018, 0xbed: 0x0018, 0xbee: 0x0018, 0xbef: 0x0018,
- 0xbf0: 0x0018, 0xbf1: 0x0018, 0xbf2: 0x0018, 0xbf3: 0x0018, 0xbf4: 0x0018, 0xbf5: 0x0018,
- 0xbf6: 0x0018, 0xbf7: 0x0018, 0xbf8: 0x0018, 0xbf9: 0x0018, 0xbfa: 0x0018, 0xbfb: 0x0018,
- 0xbfc: 0x0018, 0xbfd: 0x0018, 0xbfe: 0x0018, 0xbff: 0x0040,
+ 0xbc0: 0x000a, 0xbc1: 0x000a, 0xbc2: 0x000a, 0xbc3: 0x000a, 0xbc4: 0x000a, 0xbc5: 0x000a,
+ 0xbc6: 0x000a, 0xbc7: 0x000a, 0xbc8: 0x000a, 0xbc9: 0x000a, 0xbca: 0x000a, 0xbcb: 0x03c0,
+ 0xbcc: 0x0003, 0xbcd: 0x0003, 0xbce: 0x0340, 0xbcf: 0x0b40, 0xbd0: 0x0018, 0xbd1: 0xe00d,
+ 0xbd2: 0x0018, 0xbd3: 0x0018, 0xbd4: 0x0018, 0xbd5: 0x0018, 0xbd6: 0x0018, 0xbd7: 0x077e,
+ 0xbd8: 0x0018, 0xbd9: 0x0018, 0xbda: 0x0018, 0xbdb: 0x0018, 0xbdc: 0x0018, 0xbdd: 0x0018,
+ 0xbde: 0x0018, 0xbdf: 0x0018, 0xbe0: 0x0018, 0xbe1: 0x0018, 0xbe2: 0x0018, 0xbe3: 0x0018,
+ 0xbe4: 0x0040, 0xbe5: 0x0040, 0xbe6: 0x0040, 0xbe7: 0x0018, 0xbe8: 0x0040, 0xbe9: 0x0040,
+ 0xbea: 0x0340, 0xbeb: 0x0340, 0xbec: 0x0340, 0xbed: 0x0340, 0xbee: 0x0340, 0xbef: 0x000a,
+ 0xbf0: 0x0018, 0xbf1: 0x0018, 0xbf2: 0x0018, 0xbf3: 0x1d69, 0xbf4: 0x1da1, 0xbf5: 0x0018,
+ 0xbf6: 0x1df1, 0xbf7: 0x1e29, 0xbf8: 0x0018, 0xbf9: 0x0018, 0xbfa: 0x0018, 0xbfb: 0x0018,
+ 0xbfc: 0x1e7a, 0xbfd: 0x0018, 0xbfe: 0x079e, 0xbff: 0x0018,
// Block 0x30, offset 0xc00
- 0xc00: 0x07ee, 0xc01: 0x080e, 0xc02: 0x1159, 0xc03: 0x082d, 0xc04: 0x0018, 0xc05: 0x084e,
- 0xc06: 0x086e, 0xc07: 0x1011, 0xc08: 0x0018, 0xc09: 0x088d, 0xc0a: 0x0f31, 0xc0b: 0x0249,
- 0xc0c: 0x0249, 0xc0d: 0x0249, 0xc0e: 0x0249, 0xc0f: 0x2009, 0xc10: 0x0f41, 0xc11: 0x0f41,
- 0xc12: 0x0359, 0xc13: 0x0359, 0xc14: 0x0018, 0xc15: 0x0f71, 0xc16: 0x2021, 0xc17: 0x0018,
- 0xc18: 0x0018, 0xc19: 0x0f99, 0xc1a: 0x2039, 0xc1b: 0x0269, 0xc1c: 0x0269, 0xc1d: 0x0269,
- 0xc1e: 0x0018, 0xc1f: 0x0018, 0xc20: 0x2049, 0xc21: 0x08ad, 0xc22: 0x2061, 0xc23: 0x0018,
- 0xc24: 0x13d1, 0xc25: 0x0018, 0xc26: 0x2079, 0xc27: 0x0018, 0xc28: 0x13d1, 0xc29: 0x0018,
- 0xc2a: 0x0f51, 0xc2b: 0x2091, 0xc2c: 0x0ee9, 0xc2d: 0x1159, 0xc2e: 0x0018, 0xc2f: 0x0f09,
- 0xc30: 0x0f09, 0xc31: 0x1199, 0xc32: 0x0040, 0xc33: 0x0f61, 0xc34: 0x00d9, 0xc35: 0x20a9,
- 0xc36: 0x20c1, 0xc37: 0x20d9, 0xc38: 0x20f1, 0xc39: 0x0f41, 0xc3a: 0x0018, 0xc3b: 0x08cd,
- 0xc3c: 0x2109, 0xc3d: 0x10b1, 0xc3e: 0x10b1, 0xc3f: 0x2109,
+ 0xc00: 0x0018, 0xc01: 0x0018, 0xc02: 0x0018, 0xc03: 0x0018, 0xc04: 0x0018, 0xc05: 0x0018,
+ 0xc06: 0x0018, 0xc07: 0x1e92, 0xc08: 0x1eaa, 0xc09: 0x1ec2, 0xc0a: 0x0018, 0xc0b: 0x0018,
+ 0xc0c: 0x0018, 0xc0d: 0x0018, 0xc0e: 0x0018, 0xc0f: 0x0018, 0xc10: 0x0018, 0xc11: 0x0018,
+ 0xc12: 0x0018, 0xc13: 0x0018, 0xc14: 0x0018, 0xc15: 0x0018, 0xc16: 0x0018, 0xc17: 0x1ed9,
+ 0xc18: 0x0018, 0xc19: 0x0018, 0xc1a: 0x0018, 0xc1b: 0x0018, 0xc1c: 0x0018, 0xc1d: 0x0018,
+ 0xc1e: 0x0018, 0xc1f: 0x000a, 0xc20: 0x03c0, 0xc21: 0x0340, 0xc22: 0x0340, 0xc23: 0x0340,
+ 0xc24: 0x03c0, 0xc25: 0x0040, 0xc26: 0x0040, 0xc27: 0x0040, 0xc28: 0x0040, 0xc29: 0x0040,
+ 0xc2a: 0x0340, 0xc2b: 0x0340, 0xc2c: 0x0340, 0xc2d: 0x0340, 0xc2e: 0x0340, 0xc2f: 0x0340,
+ 0xc30: 0x1f41, 0xc31: 0x0f41, 0xc32: 0x0040, 0xc33: 0x0040, 0xc34: 0x1f51, 0xc35: 0x1f61,
+ 0xc36: 0x1f71, 0xc37: 0x1f81, 0xc38: 0x1f91, 0xc39: 0x1fa1, 0xc3a: 0x1fb2, 0xc3b: 0x07bd,
+ 0xc3c: 0x1fc2, 0xc3d: 0x1fd2, 0xc3e: 0x1fe2, 0xc3f: 0x0f71,
// Block 0x31, offset 0xc40
- 0xc40: 0x08ed, 0xc41: 0x0018, 0xc42: 0x0018, 0xc43: 0x0018, 0xc44: 0x0018, 0xc45: 0x0ef9,
- 0xc46: 0x0ef9, 0xc47: 0x0f09, 0xc48: 0x0f41, 0xc49: 0x0259, 0xc4a: 0x0018, 0xc4b: 0x0018,
- 0xc4c: 0x0018, 0xc4d: 0x0018, 0xc4e: 0x0008, 0xc4f: 0x0018, 0xc50: 0x2121, 0xc51: 0x2151,
- 0xc52: 0x2181, 0xc53: 0x21b9, 0xc54: 0x21e9, 0xc55: 0x2219, 0xc56: 0x2249, 0xc57: 0x2279,
- 0xc58: 0x22a9, 0xc59: 0x22d9, 0xc5a: 0x2309, 0xc5b: 0x2339, 0xc5c: 0x2369, 0xc5d: 0x2399,
- 0xc5e: 0x23c9, 0xc5f: 0x23f9, 0xc60: 0x0f41, 0xc61: 0x2421, 0xc62: 0x0905, 0xc63: 0x2439,
- 0xc64: 0x1089, 0xc65: 0x2451, 0xc66: 0x0925, 0xc67: 0x2469, 0xc68: 0x2491, 0xc69: 0x0369,
- 0xc6a: 0x24a9, 0xc6b: 0x0945, 0xc6c: 0x0359, 0xc6d: 0x1159, 0xc6e: 0x0ef9, 0xc6f: 0x0f61,
- 0xc70: 0x0f41, 0xc71: 0x2421, 0xc72: 0x0965, 0xc73: 0x2439, 0xc74: 0x1089, 0xc75: 0x2451,
- 0xc76: 0x0985, 0xc77: 0x2469, 0xc78: 0x2491, 0xc79: 0x0369, 0xc7a: 0x24a9, 0xc7b: 0x09a5,
- 0xc7c: 0x0359, 0xc7d: 0x1159, 0xc7e: 0x0ef9, 0xc7f: 0x0f61,
+ 0xc40: 0x1f41, 0xc41: 0x00c9, 0xc42: 0x0069, 0xc43: 0x0079, 0xc44: 0x1f51, 0xc45: 0x1f61,
+ 0xc46: 0x1f71, 0xc47: 0x1f81, 0xc48: 0x1f91, 0xc49: 0x1fa1, 0xc4a: 0x1fb2, 0xc4b: 0x07d5,
+ 0xc4c: 0x1fc2, 0xc4d: 0x1fd2, 0xc4e: 0x1fe2, 0xc4f: 0x0040, 0xc50: 0x0039, 0xc51: 0x0f09,
+ 0xc52: 0x00d9, 0xc53: 0x0369, 0xc54: 0x0ff9, 0xc55: 0x0249, 0xc56: 0x0f51, 0xc57: 0x0359,
+ 0xc58: 0x0f61, 0xc59: 0x0f71, 0xc5a: 0x0f99, 0xc5b: 0x01d9, 0xc5c: 0x0fa9, 0xc5d: 0x0040,
+ 0xc5e: 0x0040, 0xc5f: 0x0040, 0xc60: 0x0018, 0xc61: 0x0018, 0xc62: 0x0018, 0xc63: 0x0018,
+ 0xc64: 0x0018, 0xc65: 0x0018, 0xc66: 0x0018, 0xc67: 0x0018, 0xc68: 0x1ff1, 0xc69: 0x0018,
+ 0xc6a: 0x0018, 0xc6b: 0x0018, 0xc6c: 0x0018, 0xc6d: 0x0018, 0xc6e: 0x0018, 0xc6f: 0x0018,
+ 0xc70: 0x0018, 0xc71: 0x0018, 0xc72: 0x0018, 0xc73: 0x0018, 0xc74: 0x0018, 0xc75: 0x0018,
+ 0xc76: 0x0018, 0xc77: 0x0018, 0xc78: 0x0018, 0xc79: 0x0018, 0xc7a: 0x0018, 0xc7b: 0x0018,
+ 0xc7c: 0x0018, 0xc7d: 0x0018, 0xc7e: 0x0018, 0xc7f: 0x0018,
// Block 0x32, offset 0xc80
- 0xc80: 0x0018, 0xc81: 0x0018, 0xc82: 0x0018, 0xc83: 0x0018, 0xc84: 0x0018, 0xc85: 0x0018,
- 0xc86: 0x0018, 0xc87: 0x0018, 0xc88: 0x0018, 0xc89: 0x0018, 0xc8a: 0x0018, 0xc8b: 0x0040,
- 0xc8c: 0x0040, 0xc8d: 0x0040, 0xc8e: 0x0040, 0xc8f: 0x0040, 0xc90: 0x0040, 0xc91: 0x0040,
- 0xc92: 0x0040, 0xc93: 0x0040, 0xc94: 0x0040, 0xc95: 0x0040, 0xc96: 0x0040, 0xc97: 0x0040,
- 0xc98: 0x0040, 0xc99: 0x0040, 0xc9a: 0x0040, 0xc9b: 0x0040, 0xc9c: 0x0040, 0xc9d: 0x0040,
- 0xc9e: 0x0040, 0xc9f: 0x0040, 0xca0: 0x00c9, 0xca1: 0x0069, 0xca2: 0x0079, 0xca3: 0x1f51,
- 0xca4: 0x1f61, 0xca5: 0x1f71, 0xca6: 0x1f81, 0xca7: 0x1f91, 0xca8: 0x1fa1, 0xca9: 0x2601,
- 0xcaa: 0x2619, 0xcab: 0x2631, 0xcac: 0x2649, 0xcad: 0x2661, 0xcae: 0x2679, 0xcaf: 0x2691,
- 0xcb0: 0x26a9, 0xcb1: 0x26c1, 0xcb2: 0x26d9, 0xcb3: 0x26f1, 0xcb4: 0x0a06, 0xcb5: 0x0a26,
- 0xcb6: 0x0a46, 0xcb7: 0x0a66, 0xcb8: 0x0a86, 0xcb9: 0x0aa6, 0xcba: 0x0ac6, 0xcbb: 0x0ae6,
- 0xcbc: 0x0b06, 0xcbd: 0x270a, 0xcbe: 0x2732, 0xcbf: 0x275a,
+ 0xc80: 0x07ee, 0xc81: 0x080e, 0xc82: 0x1159, 0xc83: 0x082d, 0xc84: 0x0018, 0xc85: 0x084e,
+ 0xc86: 0x086e, 0xc87: 0x1011, 0xc88: 0x0018, 0xc89: 0x088d, 0xc8a: 0x0f31, 0xc8b: 0x0249,
+ 0xc8c: 0x0249, 0xc8d: 0x0249, 0xc8e: 0x0249, 0xc8f: 0x2009, 0xc90: 0x0f41, 0xc91: 0x0f41,
+ 0xc92: 0x0359, 0xc93: 0x0359, 0xc94: 0x0018, 0xc95: 0x0f71, 0xc96: 0x2021, 0xc97: 0x0018,
+ 0xc98: 0x0018, 0xc99: 0x0f99, 0xc9a: 0x2039, 0xc9b: 0x0269, 0xc9c: 0x0269, 0xc9d: 0x0269,
+ 0xc9e: 0x0018, 0xc9f: 0x0018, 0xca0: 0x2049, 0xca1: 0x08ad, 0xca2: 0x2061, 0xca3: 0x0018,
+ 0xca4: 0x13d1, 0xca5: 0x0018, 0xca6: 0x2079, 0xca7: 0x0018, 0xca8: 0x13d1, 0xca9: 0x0018,
+ 0xcaa: 0x0f51, 0xcab: 0x2091, 0xcac: 0x0ee9, 0xcad: 0x1159, 0xcae: 0x0018, 0xcaf: 0x0f09,
+ 0xcb0: 0x0f09, 0xcb1: 0x1199, 0xcb2: 0x0040, 0xcb3: 0x0f61, 0xcb4: 0x00d9, 0xcb5: 0x20a9,
+ 0xcb6: 0x20c1, 0xcb7: 0x20d9, 0xcb8: 0x20f1, 0xcb9: 0x0f41, 0xcba: 0x0018, 0xcbb: 0x08cd,
+ 0xcbc: 0x2109, 0xcbd: 0x10b1, 0xcbe: 0x10b1, 0xcbf: 0x2109,
// Block 0x33, offset 0xcc0
- 0xcc0: 0x2782, 0xcc1: 0x27aa, 0xcc2: 0x27d2, 0xcc3: 0x27fa, 0xcc4: 0x2822, 0xcc5: 0x284a,
- 0xcc6: 0x2872, 0xcc7: 0x289a, 0xcc8: 0x0040, 0xcc9: 0x0040, 0xcca: 0x0040, 0xccb: 0x0040,
- 0xccc: 0x0040, 0xccd: 0x0040, 0xcce: 0x0040, 0xccf: 0x0040, 0xcd0: 0x0040, 0xcd1: 0x0040,
- 0xcd2: 0x0040, 0xcd3: 0x0040, 0xcd4: 0x0040, 0xcd5: 0x0040, 0xcd6: 0x0040, 0xcd7: 0x0040,
- 0xcd8: 0x0040, 0xcd9: 0x0040, 0xcda: 0x0040, 0xcdb: 0x0040, 0xcdc: 0x0b26, 0xcdd: 0x0b46,
- 0xcde: 0x0b66, 0xcdf: 0x0b86, 0xce0: 0x0ba6, 0xce1: 0x0bc6, 0xce2: 0x0be6, 0xce3: 0x0c06,
- 0xce4: 0x0c26, 0xce5: 0x0c46, 0xce6: 0x0c66, 0xce7: 0x0c86, 0xce8: 0x0ca6, 0xce9: 0x0cc6,
- 0xcea: 0x0ce6, 0xceb: 0x0d06, 0xcec: 0x0d26, 0xced: 0x0d46, 0xcee: 0x0d66, 0xcef: 0x0d86,
- 0xcf0: 0x0da6, 0xcf1: 0x0dc6, 0xcf2: 0x0de6, 0xcf3: 0x0e06, 0xcf4: 0x0e26, 0xcf5: 0x0e46,
- 0xcf6: 0x0039, 0xcf7: 0x0ee9, 0xcf8: 0x1159, 0xcf9: 0x0ef9, 0xcfa: 0x0f09, 0xcfb: 0x1199,
- 0xcfc: 0x0f31, 0xcfd: 0x0249, 0xcfe: 0x0f41, 0xcff: 0x0259,
+ 0xcc0: 0x08ed, 0xcc1: 0x0018, 0xcc2: 0x0018, 0xcc3: 0x0018, 0xcc4: 0x0018, 0xcc5: 0x0ef9,
+ 0xcc6: 0x0ef9, 0xcc7: 0x0f09, 0xcc8: 0x0f41, 0xcc9: 0x0259, 0xcca: 0x0018, 0xccb: 0x0018,
+ 0xccc: 0x0018, 0xccd: 0x0018, 0xcce: 0x0008, 0xccf: 0x0018, 0xcd0: 0x2121, 0xcd1: 0x2151,
+ 0xcd2: 0x2181, 0xcd3: 0x21b9, 0xcd4: 0x21e9, 0xcd5: 0x2219, 0xcd6: 0x2249, 0xcd7: 0x2279,
+ 0xcd8: 0x22a9, 0xcd9: 0x22d9, 0xcda: 0x2309, 0xcdb: 0x2339, 0xcdc: 0x2369, 0xcdd: 0x2399,
+ 0xcde: 0x23c9, 0xcdf: 0x23f9, 0xce0: 0x0f41, 0xce1: 0x2421, 0xce2: 0x0905, 0xce3: 0x2439,
+ 0xce4: 0x1089, 0xce5: 0x2451, 0xce6: 0x0925, 0xce7: 0x2469, 0xce8: 0x2491, 0xce9: 0x0369,
+ 0xcea: 0x24a9, 0xceb: 0x0945, 0xcec: 0x0359, 0xced: 0x1159, 0xcee: 0x0ef9, 0xcef: 0x0f61,
+ 0xcf0: 0x0f41, 0xcf1: 0x2421, 0xcf2: 0x0965, 0xcf3: 0x2439, 0xcf4: 0x1089, 0xcf5: 0x2451,
+ 0xcf6: 0x0985, 0xcf7: 0x2469, 0xcf8: 0x2491, 0xcf9: 0x0369, 0xcfa: 0x24a9, 0xcfb: 0x09a5,
+ 0xcfc: 0x0359, 0xcfd: 0x1159, 0xcfe: 0x0ef9, 0xcff: 0x0f61,
// Block 0x34, offset 0xd00
- 0xd00: 0x0f51, 0xd01: 0x0359, 0xd02: 0x0f61, 0xd03: 0x0f71, 0xd04: 0x00d9, 0xd05: 0x0f99,
- 0xd06: 0x2039, 0xd07: 0x0269, 0xd08: 0x01d9, 0xd09: 0x0fa9, 0xd0a: 0x0fb9, 0xd0b: 0x1089,
- 0xd0c: 0x0279, 0xd0d: 0x0369, 0xd0e: 0x0289, 0xd0f: 0x13d1, 0xd10: 0x0039, 0xd11: 0x0ee9,
- 0xd12: 0x1159, 0xd13: 0x0ef9, 0xd14: 0x0f09, 0xd15: 0x1199, 0xd16: 0x0f31, 0xd17: 0x0249,
- 0xd18: 0x0f41, 0xd19: 0x0259, 0xd1a: 0x0f51, 0xd1b: 0x0359, 0xd1c: 0x0f61, 0xd1d: 0x0f71,
- 0xd1e: 0x00d9, 0xd1f: 0x0f99, 0xd20: 0x2039, 0xd21: 0x0269, 0xd22: 0x01d9, 0xd23: 0x0fa9,
- 0xd24: 0x0fb9, 0xd25: 0x1089, 0xd26: 0x0279, 0xd27: 0x0369, 0xd28: 0x0289, 0xd29: 0x13d1,
- 0xd2a: 0x1f41, 0xd2b: 0x0018, 0xd2c: 0x0018, 0xd2d: 0x0018, 0xd2e: 0x0018, 0xd2f: 0x0018,
- 0xd30: 0x0018, 0xd31: 0x0018, 0xd32: 0x0018, 0xd33: 0x0018, 0xd34: 0x0018, 0xd35: 0x0018,
- 0xd36: 0x0018, 0xd37: 0x0018, 0xd38: 0x0018, 0xd39: 0x0018, 0xd3a: 0x0018, 0xd3b: 0x0018,
- 0xd3c: 0x0018, 0xd3d: 0x0018, 0xd3e: 0x0018, 0xd3f: 0x0018,
+ 0xd00: 0x0018, 0xd01: 0x0018, 0xd02: 0x0018, 0xd03: 0x0018, 0xd04: 0x0018, 0xd05: 0x0018,
+ 0xd06: 0x0018, 0xd07: 0x0018, 0xd08: 0x0018, 0xd09: 0x0018, 0xd0a: 0x0018, 0xd0b: 0x0040,
+ 0xd0c: 0x0040, 0xd0d: 0x0040, 0xd0e: 0x0040, 0xd0f: 0x0040, 0xd10: 0x0040, 0xd11: 0x0040,
+ 0xd12: 0x0040, 0xd13: 0x0040, 0xd14: 0x0040, 0xd15: 0x0040, 0xd16: 0x0040, 0xd17: 0x0040,
+ 0xd18: 0x0040, 0xd19: 0x0040, 0xd1a: 0x0040, 0xd1b: 0x0040, 0xd1c: 0x0040, 0xd1d: 0x0040,
+ 0xd1e: 0x0040, 0xd1f: 0x0040, 0xd20: 0x00c9, 0xd21: 0x0069, 0xd22: 0x0079, 0xd23: 0x1f51,
+ 0xd24: 0x1f61, 0xd25: 0x1f71, 0xd26: 0x1f81, 0xd27: 0x1f91, 0xd28: 0x1fa1, 0xd29: 0x2601,
+ 0xd2a: 0x2619, 0xd2b: 0x2631, 0xd2c: 0x2649, 0xd2d: 0x2661, 0xd2e: 0x2679, 0xd2f: 0x2691,
+ 0xd30: 0x26a9, 0xd31: 0x26c1, 0xd32: 0x26d9, 0xd33: 0x26f1, 0xd34: 0x0a06, 0xd35: 0x0a26,
+ 0xd36: 0x0a46, 0xd37: 0x0a66, 0xd38: 0x0a86, 0xd39: 0x0aa6, 0xd3a: 0x0ac6, 0xd3b: 0x0ae6,
+ 0xd3c: 0x0b06, 0xd3d: 0x270a, 0xd3e: 0x2732, 0xd3f: 0x275a,
// Block 0x35, offset 0xd40
- 0xd40: 0x0008, 0xd41: 0x0008, 0xd42: 0x0008, 0xd43: 0x0008, 0xd44: 0x0008, 0xd45: 0x0008,
- 0xd46: 0x0008, 0xd47: 0x0008, 0xd48: 0x0008, 0xd49: 0x0008, 0xd4a: 0x0008, 0xd4b: 0x0008,
- 0xd4c: 0x0008, 0xd4d: 0x0008, 0xd4e: 0x0008, 0xd4f: 0x0008, 0xd50: 0x0008, 0xd51: 0x0008,
- 0xd52: 0x0008, 0xd53: 0x0008, 0xd54: 0x0008, 0xd55: 0x0008, 0xd56: 0x0008, 0xd57: 0x0008,
- 0xd58: 0x0008, 0xd59: 0x0008, 0xd5a: 0x0008, 0xd5b: 0x0008, 0xd5c: 0x0008, 0xd5d: 0x0008,
- 0xd5e: 0x0008, 0xd5f: 0x0040, 0xd60: 0xe00d, 0xd61: 0x0008, 0xd62: 0x2971, 0xd63: 0x0ebd,
- 0xd64: 0x2989, 0xd65: 0x0008, 0xd66: 0x0008, 0xd67: 0xe07d, 0xd68: 0x0008, 0xd69: 0xe01d,
- 0xd6a: 0x0008, 0xd6b: 0xe03d, 0xd6c: 0x0008, 0xd6d: 0x0fe1, 0xd6e: 0x1281, 0xd6f: 0x0fc9,
- 0xd70: 0x1141, 0xd71: 0x0008, 0xd72: 0xe00d, 0xd73: 0x0008, 0xd74: 0x0008, 0xd75: 0xe01d,
- 0xd76: 0x0008, 0xd77: 0x0008, 0xd78: 0x0008, 0xd79: 0x0008, 0xd7a: 0x0008, 0xd7b: 0x0008,
- 0xd7c: 0x0259, 0xd7d: 0x1089, 0xd7e: 0x29a1, 0xd7f: 0x29b9,
+ 0xd40: 0x2782, 0xd41: 0x27aa, 0xd42: 0x27d2, 0xd43: 0x27fa, 0xd44: 0x2822, 0xd45: 0x284a,
+ 0xd46: 0x2872, 0xd47: 0x289a, 0xd48: 0x0040, 0xd49: 0x0040, 0xd4a: 0x0040, 0xd4b: 0x0040,
+ 0xd4c: 0x0040, 0xd4d: 0x0040, 0xd4e: 0x0040, 0xd4f: 0x0040, 0xd50: 0x0040, 0xd51: 0x0040,
+ 0xd52: 0x0040, 0xd53: 0x0040, 0xd54: 0x0040, 0xd55: 0x0040, 0xd56: 0x0040, 0xd57: 0x0040,
+ 0xd58: 0x0040, 0xd59: 0x0040, 0xd5a: 0x0040, 0xd5b: 0x0040, 0xd5c: 0x0b26, 0xd5d: 0x0b46,
+ 0xd5e: 0x0b66, 0xd5f: 0x0b86, 0xd60: 0x0ba6, 0xd61: 0x0bc6, 0xd62: 0x0be6, 0xd63: 0x0c06,
+ 0xd64: 0x0c26, 0xd65: 0x0c46, 0xd66: 0x0c66, 0xd67: 0x0c86, 0xd68: 0x0ca6, 0xd69: 0x0cc6,
+ 0xd6a: 0x0ce6, 0xd6b: 0x0d06, 0xd6c: 0x0d26, 0xd6d: 0x0d46, 0xd6e: 0x0d66, 0xd6f: 0x0d86,
+ 0xd70: 0x0da6, 0xd71: 0x0dc6, 0xd72: 0x0de6, 0xd73: 0x0e06, 0xd74: 0x0e26, 0xd75: 0x0e46,
+ 0xd76: 0x0039, 0xd77: 0x0ee9, 0xd78: 0x1159, 0xd79: 0x0ef9, 0xd7a: 0x0f09, 0xd7b: 0x1199,
+ 0xd7c: 0x0f31, 0xd7d: 0x0249, 0xd7e: 0x0f41, 0xd7f: 0x0259,
// Block 0x36, offset 0xd80
- 0xd80: 0xe00d, 0xd81: 0x0008, 0xd82: 0xe00d, 0xd83: 0x0008, 0xd84: 0xe00d, 0xd85: 0x0008,
- 0xd86: 0xe00d, 0xd87: 0x0008, 0xd88: 0xe00d, 0xd89: 0x0008, 0xd8a: 0xe00d, 0xd8b: 0x0008,
- 0xd8c: 0xe00d, 0xd8d: 0x0008, 0xd8e: 0xe00d, 0xd8f: 0x0008, 0xd90: 0xe00d, 0xd91: 0x0008,
- 0xd92: 0xe00d, 0xd93: 0x0008, 0xd94: 0xe00d, 0xd95: 0x0008, 0xd96: 0xe00d, 0xd97: 0x0008,
- 0xd98: 0xe00d, 0xd99: 0x0008, 0xd9a: 0xe00d, 0xd9b: 0x0008, 0xd9c: 0xe00d, 0xd9d: 0x0008,
- 0xd9e: 0xe00d, 0xd9f: 0x0008, 0xda0: 0xe00d, 0xda1: 0x0008, 0xda2: 0xe00d, 0xda3: 0x0008,
- 0xda4: 0x0008, 0xda5: 0x0018, 0xda6: 0x0018, 0xda7: 0x0018, 0xda8: 0x0018, 0xda9: 0x0018,
- 0xdaa: 0x0018, 0xdab: 0xe03d, 0xdac: 0x0008, 0xdad: 0xe01d, 0xdae: 0x0008, 0xdaf: 0x1308,
- 0xdb0: 0x1308, 0xdb1: 0x1308, 0xdb2: 0xe00d, 0xdb3: 0x0008, 0xdb4: 0x0040, 0xdb5: 0x0040,
- 0xdb6: 0x0040, 0xdb7: 0x0040, 0xdb8: 0x0040, 0xdb9: 0x0018, 0xdba: 0x0018, 0xdbb: 0x0018,
+ 0xd80: 0x0f51, 0xd81: 0x0359, 0xd82: 0x0f61, 0xd83: 0x0f71, 0xd84: 0x00d9, 0xd85: 0x0f99,
+ 0xd86: 0x2039, 0xd87: 0x0269, 0xd88: 0x01d9, 0xd89: 0x0fa9, 0xd8a: 0x0fb9, 0xd8b: 0x1089,
+ 0xd8c: 0x0279, 0xd8d: 0x0369, 0xd8e: 0x0289, 0xd8f: 0x13d1, 0xd90: 0x0039, 0xd91: 0x0ee9,
+ 0xd92: 0x1159, 0xd93: 0x0ef9, 0xd94: 0x0f09, 0xd95: 0x1199, 0xd96: 0x0f31, 0xd97: 0x0249,
+ 0xd98: 0x0f41, 0xd99: 0x0259, 0xd9a: 0x0f51, 0xd9b: 0x0359, 0xd9c: 0x0f61, 0xd9d: 0x0f71,
+ 0xd9e: 0x00d9, 0xd9f: 0x0f99, 0xda0: 0x2039, 0xda1: 0x0269, 0xda2: 0x01d9, 0xda3: 0x0fa9,
+ 0xda4: 0x0fb9, 0xda5: 0x1089, 0xda6: 0x0279, 0xda7: 0x0369, 0xda8: 0x0289, 0xda9: 0x13d1,
+ 0xdaa: 0x1f41, 0xdab: 0x0018, 0xdac: 0x0018, 0xdad: 0x0018, 0xdae: 0x0018, 0xdaf: 0x0018,
+ 0xdb0: 0x0018, 0xdb1: 0x0018, 0xdb2: 0x0018, 0xdb3: 0x0018, 0xdb4: 0x0018, 0xdb5: 0x0018,
+ 0xdb6: 0x0018, 0xdb7: 0x0018, 0xdb8: 0x0018, 0xdb9: 0x0018, 0xdba: 0x0018, 0xdbb: 0x0018,
0xdbc: 0x0018, 0xdbd: 0x0018, 0xdbe: 0x0018, 0xdbf: 0x0018,
// Block 0x37, offset 0xdc0
- 0xdc0: 0x26fd, 0xdc1: 0x271d, 0xdc2: 0x273d, 0xdc3: 0x275d, 0xdc4: 0x277d, 0xdc5: 0x279d,
- 0xdc6: 0x27bd, 0xdc7: 0x27dd, 0xdc8: 0x27fd, 0xdc9: 0x281d, 0xdca: 0x283d, 0xdcb: 0x285d,
- 0xdcc: 0x287d, 0xdcd: 0x289d, 0xdce: 0x28bd, 0xdcf: 0x28dd, 0xdd0: 0x28fd, 0xdd1: 0x291d,
- 0xdd2: 0x293d, 0xdd3: 0x295d, 0xdd4: 0x297d, 0xdd5: 0x299d, 0xdd6: 0x0040, 0xdd7: 0x0040,
- 0xdd8: 0x0040, 0xdd9: 0x0040, 0xdda: 0x0040, 0xddb: 0x0040, 0xddc: 0x0040, 0xddd: 0x0040,
- 0xdde: 0x0040, 0xddf: 0x0040, 0xde0: 0x0040, 0xde1: 0x0040, 0xde2: 0x0040, 0xde3: 0x0040,
- 0xde4: 0x0040, 0xde5: 0x0040, 0xde6: 0x0040, 0xde7: 0x0040, 0xde8: 0x0040, 0xde9: 0x0040,
- 0xdea: 0x0040, 0xdeb: 0x0040, 0xdec: 0x0040, 0xded: 0x0040, 0xdee: 0x0040, 0xdef: 0x0040,
- 0xdf0: 0x0040, 0xdf1: 0x0040, 0xdf2: 0x0040, 0xdf3: 0x0040, 0xdf4: 0x0040, 0xdf5: 0x0040,
- 0xdf6: 0x0040, 0xdf7: 0x0040, 0xdf8: 0x0040, 0xdf9: 0x0040, 0xdfa: 0x0040, 0xdfb: 0x0040,
- 0xdfc: 0x0040, 0xdfd: 0x0040, 0xdfe: 0x0040, 0xdff: 0x0040,
+ 0xdc0: 0x0008, 0xdc1: 0x0008, 0xdc2: 0x0008, 0xdc3: 0x0008, 0xdc4: 0x0008, 0xdc5: 0x0008,
+ 0xdc6: 0x0008, 0xdc7: 0x0008, 0xdc8: 0x0008, 0xdc9: 0x0008, 0xdca: 0x0008, 0xdcb: 0x0008,
+ 0xdcc: 0x0008, 0xdcd: 0x0008, 0xdce: 0x0008, 0xdcf: 0x0008, 0xdd0: 0x0008, 0xdd1: 0x0008,
+ 0xdd2: 0x0008, 0xdd3: 0x0008, 0xdd4: 0x0008, 0xdd5: 0x0008, 0xdd6: 0x0008, 0xdd7: 0x0008,
+ 0xdd8: 0x0008, 0xdd9: 0x0008, 0xdda: 0x0008, 0xddb: 0x0008, 0xddc: 0x0008, 0xddd: 0x0008,
+ 0xdde: 0x0008, 0xddf: 0x0040, 0xde0: 0xe00d, 0xde1: 0x0008, 0xde2: 0x2971, 0xde3: 0x0ebd,
+ 0xde4: 0x2989, 0xde5: 0x0008, 0xde6: 0x0008, 0xde7: 0xe07d, 0xde8: 0x0008, 0xde9: 0xe01d,
+ 0xdea: 0x0008, 0xdeb: 0xe03d, 0xdec: 0x0008, 0xded: 0x0fe1, 0xdee: 0x1281, 0xdef: 0x0fc9,
+ 0xdf0: 0x1141, 0xdf1: 0x0008, 0xdf2: 0xe00d, 0xdf3: 0x0008, 0xdf4: 0x0008, 0xdf5: 0xe01d,
+ 0xdf6: 0x0008, 0xdf7: 0x0008, 0xdf8: 0x0008, 0xdf9: 0x0008, 0xdfa: 0x0008, 0xdfb: 0x0008,
+ 0xdfc: 0x0259, 0xdfd: 0x1089, 0xdfe: 0x29a1, 0xdff: 0x29b9,
// Block 0x38, offset 0xe00
- 0xe00: 0x000a, 0xe01: 0x0018, 0xe02: 0x29d1, 0xe03: 0x0018, 0xe04: 0x0018, 0xe05: 0x0008,
- 0xe06: 0x0008, 0xe07: 0x0008, 0xe08: 0x0018, 0xe09: 0x0018, 0xe0a: 0x0018, 0xe0b: 0x0018,
- 0xe0c: 0x0018, 0xe0d: 0x0018, 0xe0e: 0x0018, 0xe0f: 0x0018, 0xe10: 0x0018, 0xe11: 0x0018,
- 0xe12: 0x0018, 0xe13: 0x0018, 0xe14: 0x0018, 0xe15: 0x0018, 0xe16: 0x0018, 0xe17: 0x0018,
- 0xe18: 0x0018, 0xe19: 0x0018, 0xe1a: 0x0018, 0xe1b: 0x0018, 0xe1c: 0x0018, 0xe1d: 0x0018,
- 0xe1e: 0x0018, 0xe1f: 0x0018, 0xe20: 0x0018, 0xe21: 0x0018, 0xe22: 0x0018, 0xe23: 0x0018,
- 0xe24: 0x0018, 0xe25: 0x0018, 0xe26: 0x0018, 0xe27: 0x0018, 0xe28: 0x0018, 0xe29: 0x0018,
- 0xe2a: 0x1308, 0xe2b: 0x1308, 0xe2c: 0x1308, 0xe2d: 0x1308, 0xe2e: 0x1018, 0xe2f: 0x1018,
- 0xe30: 0x0018, 0xe31: 0x0018, 0xe32: 0x0018, 0xe33: 0x0018, 0xe34: 0x0018, 0xe35: 0x0018,
- 0xe36: 0xe125, 0xe37: 0x0018, 0xe38: 0x29bd, 0xe39: 0x29dd, 0xe3a: 0x29fd, 0xe3b: 0x0018,
- 0xe3c: 0x0008, 0xe3d: 0x0018, 0xe3e: 0x0018, 0xe3f: 0x0018,
+ 0xe00: 0xe00d, 0xe01: 0x0008, 0xe02: 0xe00d, 0xe03: 0x0008, 0xe04: 0xe00d, 0xe05: 0x0008,
+ 0xe06: 0xe00d, 0xe07: 0x0008, 0xe08: 0xe00d, 0xe09: 0x0008, 0xe0a: 0xe00d, 0xe0b: 0x0008,
+ 0xe0c: 0xe00d, 0xe0d: 0x0008, 0xe0e: 0xe00d, 0xe0f: 0x0008, 0xe10: 0xe00d, 0xe11: 0x0008,
+ 0xe12: 0xe00d, 0xe13: 0x0008, 0xe14: 0xe00d, 0xe15: 0x0008, 0xe16: 0xe00d, 0xe17: 0x0008,
+ 0xe18: 0xe00d, 0xe19: 0x0008, 0xe1a: 0xe00d, 0xe1b: 0x0008, 0xe1c: 0xe00d, 0xe1d: 0x0008,
+ 0xe1e: 0xe00d, 0xe1f: 0x0008, 0xe20: 0xe00d, 0xe21: 0x0008, 0xe22: 0xe00d, 0xe23: 0x0008,
+ 0xe24: 0x0008, 0xe25: 0x0018, 0xe26: 0x0018, 0xe27: 0x0018, 0xe28: 0x0018, 0xe29: 0x0018,
+ 0xe2a: 0x0018, 0xe2b: 0xe03d, 0xe2c: 0x0008, 0xe2d: 0xe01d, 0xe2e: 0x0008, 0xe2f: 0x3308,
+ 0xe30: 0x3308, 0xe31: 0x3308, 0xe32: 0xe00d, 0xe33: 0x0008, 0xe34: 0x0040, 0xe35: 0x0040,
+ 0xe36: 0x0040, 0xe37: 0x0040, 0xe38: 0x0040, 0xe39: 0x0018, 0xe3a: 0x0018, 0xe3b: 0x0018,
+ 0xe3c: 0x0018, 0xe3d: 0x0018, 0xe3e: 0x0018, 0xe3f: 0x0018,
// Block 0x39, offset 0xe40
- 0xe40: 0x2b3d, 0xe41: 0x2b5d, 0xe42: 0x2b7d, 0xe43: 0x2b9d, 0xe44: 0x2bbd, 0xe45: 0x2bdd,
- 0xe46: 0x2bdd, 0xe47: 0x2bdd, 0xe48: 0x2bfd, 0xe49: 0x2bfd, 0xe4a: 0x2bfd, 0xe4b: 0x2bfd,
- 0xe4c: 0x2c1d, 0xe4d: 0x2c1d, 0xe4e: 0x2c1d, 0xe4f: 0x2c3d, 0xe50: 0x2c5d, 0xe51: 0x2c5d,
- 0xe52: 0x2a7d, 0xe53: 0x2a7d, 0xe54: 0x2c5d, 0xe55: 0x2c5d, 0xe56: 0x2c7d, 0xe57: 0x2c7d,
- 0xe58: 0x2c5d, 0xe59: 0x2c5d, 0xe5a: 0x2a7d, 0xe5b: 0x2a7d, 0xe5c: 0x2c5d, 0xe5d: 0x2c5d,
- 0xe5e: 0x2c3d, 0xe5f: 0x2c3d, 0xe60: 0x2c9d, 0xe61: 0x2c9d, 0xe62: 0x2cbd, 0xe63: 0x2cbd,
- 0xe64: 0x0040, 0xe65: 0x2cdd, 0xe66: 0x2cfd, 0xe67: 0x2d1d, 0xe68: 0x2d1d, 0xe69: 0x2d3d,
- 0xe6a: 0x2d5d, 0xe6b: 0x2d7d, 0xe6c: 0x2d9d, 0xe6d: 0x2dbd, 0xe6e: 0x2ddd, 0xe6f: 0x2dfd,
- 0xe70: 0x2e1d, 0xe71: 0x2e3d, 0xe72: 0x2e3d, 0xe73: 0x2e5d, 0xe74: 0x2e7d, 0xe75: 0x2e7d,
- 0xe76: 0x2e9d, 0xe77: 0x2ebd, 0xe78: 0x2e5d, 0xe79: 0x2edd, 0xe7a: 0x2efd, 0xe7b: 0x2edd,
- 0xe7c: 0x2e5d, 0xe7d: 0x2f1d, 0xe7e: 0x2f3d, 0xe7f: 0x2f5d,
+ 0xe40: 0x26fd, 0xe41: 0x271d, 0xe42: 0x273d, 0xe43: 0x275d, 0xe44: 0x277d, 0xe45: 0x279d,
+ 0xe46: 0x27bd, 0xe47: 0x27dd, 0xe48: 0x27fd, 0xe49: 0x281d, 0xe4a: 0x283d, 0xe4b: 0x285d,
+ 0xe4c: 0x287d, 0xe4d: 0x289d, 0xe4e: 0x28bd, 0xe4f: 0x28dd, 0xe50: 0x28fd, 0xe51: 0x291d,
+ 0xe52: 0x293d, 0xe53: 0x295d, 0xe54: 0x297d, 0xe55: 0x299d, 0xe56: 0x0040, 0xe57: 0x0040,
+ 0xe58: 0x0040, 0xe59: 0x0040, 0xe5a: 0x0040, 0xe5b: 0x0040, 0xe5c: 0x0040, 0xe5d: 0x0040,
+ 0xe5e: 0x0040, 0xe5f: 0x0040, 0xe60: 0x0040, 0xe61: 0x0040, 0xe62: 0x0040, 0xe63: 0x0040,
+ 0xe64: 0x0040, 0xe65: 0x0040, 0xe66: 0x0040, 0xe67: 0x0040, 0xe68: 0x0040, 0xe69: 0x0040,
+ 0xe6a: 0x0040, 0xe6b: 0x0040, 0xe6c: 0x0040, 0xe6d: 0x0040, 0xe6e: 0x0040, 0xe6f: 0x0040,
+ 0xe70: 0x0040, 0xe71: 0x0040, 0xe72: 0x0040, 0xe73: 0x0040, 0xe74: 0x0040, 0xe75: 0x0040,
+ 0xe76: 0x0040, 0xe77: 0x0040, 0xe78: 0x0040, 0xe79: 0x0040, 0xe7a: 0x0040, 0xe7b: 0x0040,
+ 0xe7c: 0x0040, 0xe7d: 0x0040, 0xe7e: 0x0040, 0xe7f: 0x0040,
// Block 0x3a, offset 0xe80
- 0xe80: 0x2f7d, 0xe81: 0x2f9d, 0xe82: 0x2cfd, 0xe83: 0x2cdd, 0xe84: 0x2fbd, 0xe85: 0x2fdd,
- 0xe86: 0x2ffd, 0xe87: 0x301d, 0xe88: 0x303d, 0xe89: 0x305d, 0xe8a: 0x307d, 0xe8b: 0x309d,
- 0xe8c: 0x30bd, 0xe8d: 0x30dd, 0xe8e: 0x30fd, 0xe8f: 0x0040, 0xe90: 0x0018, 0xe91: 0x0018,
- 0xe92: 0x311d, 0xe93: 0x313d, 0xe94: 0x315d, 0xe95: 0x317d, 0xe96: 0x319d, 0xe97: 0x31bd,
- 0xe98: 0x31dd, 0xe99: 0x31fd, 0xe9a: 0x321d, 0xe9b: 0x323d, 0xe9c: 0x315d, 0xe9d: 0x325d,
- 0xe9e: 0x327d, 0xe9f: 0x329d, 0xea0: 0x0008, 0xea1: 0x0008, 0xea2: 0x0008, 0xea3: 0x0008,
- 0xea4: 0x0008, 0xea5: 0x0008, 0xea6: 0x0008, 0xea7: 0x0008, 0xea8: 0x0008, 0xea9: 0x0008,
- 0xeaa: 0x0008, 0xeab: 0x0008, 0xeac: 0x0008, 0xead: 0x0008, 0xeae: 0x0008, 0xeaf: 0x0008,
- 0xeb0: 0x0008, 0xeb1: 0x0008, 0xeb2: 0x0008, 0xeb3: 0x0008, 0xeb4: 0x0008, 0xeb5: 0x0008,
- 0xeb6: 0x0008, 0xeb7: 0x0008, 0xeb8: 0x0008, 0xeb9: 0x0008, 0xeba: 0x0008, 0xebb: 0x0040,
- 0xebc: 0x0040, 0xebd: 0x0040, 0xebe: 0x0040, 0xebf: 0x0040,
+ 0xe80: 0x000a, 0xe81: 0x0018, 0xe82: 0x29d1, 0xe83: 0x0018, 0xe84: 0x0018, 0xe85: 0x0008,
+ 0xe86: 0x0008, 0xe87: 0x0008, 0xe88: 0x0018, 0xe89: 0x0018, 0xe8a: 0x0018, 0xe8b: 0x0018,
+ 0xe8c: 0x0018, 0xe8d: 0x0018, 0xe8e: 0x0018, 0xe8f: 0x0018, 0xe90: 0x0018, 0xe91: 0x0018,
+ 0xe92: 0x0018, 0xe93: 0x0018, 0xe94: 0x0018, 0xe95: 0x0018, 0xe96: 0x0018, 0xe97: 0x0018,
+ 0xe98: 0x0018, 0xe99: 0x0018, 0xe9a: 0x0018, 0xe9b: 0x0018, 0xe9c: 0x0018, 0xe9d: 0x0018,
+ 0xe9e: 0x0018, 0xe9f: 0x0018, 0xea0: 0x0018, 0xea1: 0x0018, 0xea2: 0x0018, 0xea3: 0x0018,
+ 0xea4: 0x0018, 0xea5: 0x0018, 0xea6: 0x0018, 0xea7: 0x0018, 0xea8: 0x0018, 0xea9: 0x0018,
+ 0xeaa: 0x3308, 0xeab: 0x3308, 0xeac: 0x3308, 0xead: 0x3308, 0xeae: 0x3018, 0xeaf: 0x3018,
+ 0xeb0: 0x0018, 0xeb1: 0x0018, 0xeb2: 0x0018, 0xeb3: 0x0018, 0xeb4: 0x0018, 0xeb5: 0x0018,
+ 0xeb6: 0xe125, 0xeb7: 0x0018, 0xeb8: 0x29bd, 0xeb9: 0x29dd, 0xeba: 0x29fd, 0xebb: 0x0018,
+ 0xebc: 0x0008, 0xebd: 0x0018, 0xebe: 0x0018, 0xebf: 0x0018,
// Block 0x3b, offset 0xec0
- 0xec0: 0x36a2, 0xec1: 0x36d2, 0xec2: 0x3702, 0xec3: 0x3732, 0xec4: 0x32bd, 0xec5: 0x32dd,
- 0xec6: 0x32fd, 0xec7: 0x331d, 0xec8: 0x0018, 0xec9: 0x0018, 0xeca: 0x0018, 0xecb: 0x0018,
- 0xecc: 0x0018, 0xecd: 0x0018, 0xece: 0x0018, 0xecf: 0x0018, 0xed0: 0x333d, 0xed1: 0x3761,
- 0xed2: 0x3779, 0xed3: 0x3791, 0xed4: 0x37a9, 0xed5: 0x37c1, 0xed6: 0x37d9, 0xed7: 0x37f1,
- 0xed8: 0x3809, 0xed9: 0x3821, 0xeda: 0x3839, 0xedb: 0x3851, 0xedc: 0x3869, 0xedd: 0x3881,
- 0xede: 0x3899, 0xedf: 0x38b1, 0xee0: 0x335d, 0xee1: 0x337d, 0xee2: 0x339d, 0xee3: 0x33bd,
- 0xee4: 0x33dd, 0xee5: 0x33dd, 0xee6: 0x33fd, 0xee7: 0x341d, 0xee8: 0x343d, 0xee9: 0x345d,
- 0xeea: 0x347d, 0xeeb: 0x349d, 0xeec: 0x34bd, 0xeed: 0x34dd, 0xeee: 0x34fd, 0xeef: 0x351d,
- 0xef0: 0x353d, 0xef1: 0x355d, 0xef2: 0x357d, 0xef3: 0x359d, 0xef4: 0x35bd, 0xef5: 0x35dd,
- 0xef6: 0x35fd, 0xef7: 0x361d, 0xef8: 0x363d, 0xef9: 0x365d, 0xefa: 0x367d, 0xefb: 0x369d,
- 0xefc: 0x38c9, 0xefd: 0x3901, 0xefe: 0x36bd, 0xeff: 0x0018,
+ 0xec0: 0x2b3d, 0xec1: 0x2b5d, 0xec2: 0x2b7d, 0xec3: 0x2b9d, 0xec4: 0x2bbd, 0xec5: 0x2bdd,
+ 0xec6: 0x2bdd, 0xec7: 0x2bdd, 0xec8: 0x2bfd, 0xec9: 0x2bfd, 0xeca: 0x2bfd, 0xecb: 0x2bfd,
+ 0xecc: 0x2c1d, 0xecd: 0x2c1d, 0xece: 0x2c1d, 0xecf: 0x2c3d, 0xed0: 0x2c5d, 0xed1: 0x2c5d,
+ 0xed2: 0x2a7d, 0xed3: 0x2a7d, 0xed4: 0x2c5d, 0xed5: 0x2c5d, 0xed6: 0x2c7d, 0xed7: 0x2c7d,
+ 0xed8: 0x2c5d, 0xed9: 0x2c5d, 0xeda: 0x2a7d, 0xedb: 0x2a7d, 0xedc: 0x2c5d, 0xedd: 0x2c5d,
+ 0xede: 0x2c3d, 0xedf: 0x2c3d, 0xee0: 0x2c9d, 0xee1: 0x2c9d, 0xee2: 0x2cbd, 0xee3: 0x2cbd,
+ 0xee4: 0x0040, 0xee5: 0x2cdd, 0xee6: 0x2cfd, 0xee7: 0x2d1d, 0xee8: 0x2d1d, 0xee9: 0x2d3d,
+ 0xeea: 0x2d5d, 0xeeb: 0x2d7d, 0xeec: 0x2d9d, 0xeed: 0x2dbd, 0xeee: 0x2ddd, 0xeef: 0x2dfd,
+ 0xef0: 0x2e1d, 0xef1: 0x2e3d, 0xef2: 0x2e3d, 0xef3: 0x2e5d, 0xef4: 0x2e7d, 0xef5: 0x2e7d,
+ 0xef6: 0x2e9d, 0xef7: 0x2ebd, 0xef8: 0x2e5d, 0xef9: 0x2edd, 0xefa: 0x2efd, 0xefb: 0x2edd,
+ 0xefc: 0x2e5d, 0xefd: 0x2f1d, 0xefe: 0x2f3d, 0xeff: 0x2f5d,
// Block 0x3c, offset 0xf00
- 0xf00: 0x36dd, 0xf01: 0x36fd, 0xf02: 0x371d, 0xf03: 0x373d, 0xf04: 0x375d, 0xf05: 0x377d,
- 0xf06: 0x379d, 0xf07: 0x37bd, 0xf08: 0x37dd, 0xf09: 0x37fd, 0xf0a: 0x381d, 0xf0b: 0x383d,
- 0xf0c: 0x385d, 0xf0d: 0x387d, 0xf0e: 0x389d, 0xf0f: 0x38bd, 0xf10: 0x38dd, 0xf11: 0x38fd,
- 0xf12: 0x391d, 0xf13: 0x393d, 0xf14: 0x395d, 0xf15: 0x397d, 0xf16: 0x399d, 0xf17: 0x39bd,
- 0xf18: 0x39dd, 0xf19: 0x39fd, 0xf1a: 0x3a1d, 0xf1b: 0x3a3d, 0xf1c: 0x3a5d, 0xf1d: 0x3a7d,
- 0xf1e: 0x3a9d, 0xf1f: 0x3abd, 0xf20: 0x3add, 0xf21: 0x3afd, 0xf22: 0x3b1d, 0xf23: 0x3b3d,
- 0xf24: 0x3b5d, 0xf25: 0x3b7d, 0xf26: 0x127d, 0xf27: 0x3b9d, 0xf28: 0x3bbd, 0xf29: 0x3bdd,
- 0xf2a: 0x3bfd, 0xf2b: 0x3c1d, 0xf2c: 0x3c3d, 0xf2d: 0x3c5d, 0xf2e: 0x239d, 0xf2f: 0x3c7d,
- 0xf30: 0x3c9d, 0xf31: 0x3939, 0xf32: 0x3951, 0xf33: 0x3969, 0xf34: 0x3981, 0xf35: 0x3999,
- 0xf36: 0x39b1, 0xf37: 0x39c9, 0xf38: 0x39e1, 0xf39: 0x39f9, 0xf3a: 0x3a11, 0xf3b: 0x3a29,
- 0xf3c: 0x3a41, 0xf3d: 0x3a59, 0xf3e: 0x3a71, 0xf3f: 0x3a89,
+ 0xf00: 0x2f7d, 0xf01: 0x2f9d, 0xf02: 0x2cfd, 0xf03: 0x2cdd, 0xf04: 0x2fbd, 0xf05: 0x2fdd,
+ 0xf06: 0x2ffd, 0xf07: 0x301d, 0xf08: 0x303d, 0xf09: 0x305d, 0xf0a: 0x307d, 0xf0b: 0x309d,
+ 0xf0c: 0x30bd, 0xf0d: 0x30dd, 0xf0e: 0x30fd, 0xf0f: 0x0040, 0xf10: 0x0018, 0xf11: 0x0018,
+ 0xf12: 0x311d, 0xf13: 0x313d, 0xf14: 0x315d, 0xf15: 0x317d, 0xf16: 0x319d, 0xf17: 0x31bd,
+ 0xf18: 0x31dd, 0xf19: 0x31fd, 0xf1a: 0x321d, 0xf1b: 0x323d, 0xf1c: 0x315d, 0xf1d: 0x325d,
+ 0xf1e: 0x327d, 0xf1f: 0x329d, 0xf20: 0x0008, 0xf21: 0x0008, 0xf22: 0x0008, 0xf23: 0x0008,
+ 0xf24: 0x0008, 0xf25: 0x0008, 0xf26: 0x0008, 0xf27: 0x0008, 0xf28: 0x0008, 0xf29: 0x0008,
+ 0xf2a: 0x0008, 0xf2b: 0x0008, 0xf2c: 0x0008, 0xf2d: 0x0008, 0xf2e: 0x0008, 0xf2f: 0x0008,
+ 0xf30: 0x0008, 0xf31: 0x0008, 0xf32: 0x0008, 0xf33: 0x0008, 0xf34: 0x0008, 0xf35: 0x0008,
+ 0xf36: 0x0008, 0xf37: 0x0008, 0xf38: 0x0008, 0xf39: 0x0008, 0xf3a: 0x0008, 0xf3b: 0x0040,
+ 0xf3c: 0x0040, 0xf3d: 0x0040, 0xf3e: 0x0040, 0xf3f: 0x0040,
// Block 0x3d, offset 0xf40
- 0xf40: 0x3aa1, 0xf41: 0x3ac9, 0xf42: 0x3af1, 0xf43: 0x3b19, 0xf44: 0x3b41, 0xf45: 0x3b69,
- 0xf46: 0x3b91, 0xf47: 0x3bb9, 0xf48: 0x3be1, 0xf49: 0x3c09, 0xf4a: 0x3c39, 0xf4b: 0x3c69,
- 0xf4c: 0x3c99, 0xf4d: 0x3cbd, 0xf4e: 0x3cb1, 0xf4f: 0x3cdd, 0xf50: 0x3cfd, 0xf51: 0x3d15,
- 0xf52: 0x3d2d, 0xf53: 0x3d45, 0xf54: 0x3d5d, 0xf55: 0x3d5d, 0xf56: 0x3d45, 0xf57: 0x3d75,
- 0xf58: 0x07bd, 0xf59: 0x3d8d, 0xf5a: 0x3da5, 0xf5b: 0x3dbd, 0xf5c: 0x3dd5, 0xf5d: 0x3ded,
- 0xf5e: 0x3e05, 0xf5f: 0x3e1d, 0xf60: 0x3e35, 0xf61: 0x3e4d, 0xf62: 0x3e65, 0xf63: 0x3e7d,
- 0xf64: 0x3e95, 0xf65: 0x3e95, 0xf66: 0x3ead, 0xf67: 0x3ead, 0xf68: 0x3ec5, 0xf69: 0x3ec5,
- 0xf6a: 0x3edd, 0xf6b: 0x3ef5, 0xf6c: 0x3f0d, 0xf6d: 0x3f25, 0xf6e: 0x3f3d, 0xf6f: 0x3f3d,
- 0xf70: 0x3f55, 0xf71: 0x3f55, 0xf72: 0x3f55, 0xf73: 0x3f6d, 0xf74: 0x3f85, 0xf75: 0x3f9d,
- 0xf76: 0x3fb5, 0xf77: 0x3f9d, 0xf78: 0x3fcd, 0xf79: 0x3fe5, 0xf7a: 0x3f6d, 0xf7b: 0x3ffd,
- 0xf7c: 0x4015, 0xf7d: 0x4015, 0xf7e: 0x4015, 0xf7f: 0x0040,
+ 0xf40: 0x36a2, 0xf41: 0x36d2, 0xf42: 0x3702, 0xf43: 0x3732, 0xf44: 0x32bd, 0xf45: 0x32dd,
+ 0xf46: 0x32fd, 0xf47: 0x331d, 0xf48: 0x0018, 0xf49: 0x0018, 0xf4a: 0x0018, 0xf4b: 0x0018,
+ 0xf4c: 0x0018, 0xf4d: 0x0018, 0xf4e: 0x0018, 0xf4f: 0x0018, 0xf50: 0x333d, 0xf51: 0x3761,
+ 0xf52: 0x3779, 0xf53: 0x3791, 0xf54: 0x37a9, 0xf55: 0x37c1, 0xf56: 0x37d9, 0xf57: 0x37f1,
+ 0xf58: 0x3809, 0xf59: 0x3821, 0xf5a: 0x3839, 0xf5b: 0x3851, 0xf5c: 0x3869, 0xf5d: 0x3881,
+ 0xf5e: 0x3899, 0xf5f: 0x38b1, 0xf60: 0x335d, 0xf61: 0x337d, 0xf62: 0x339d, 0xf63: 0x33bd,
+ 0xf64: 0x33dd, 0xf65: 0x33dd, 0xf66: 0x33fd, 0xf67: 0x341d, 0xf68: 0x343d, 0xf69: 0x345d,
+ 0xf6a: 0x347d, 0xf6b: 0x349d, 0xf6c: 0x34bd, 0xf6d: 0x34dd, 0xf6e: 0x34fd, 0xf6f: 0x351d,
+ 0xf70: 0x353d, 0xf71: 0x355d, 0xf72: 0x357d, 0xf73: 0x359d, 0xf74: 0x35bd, 0xf75: 0x35dd,
+ 0xf76: 0x35fd, 0xf77: 0x361d, 0xf78: 0x363d, 0xf79: 0x365d, 0xf7a: 0x367d, 0xf7b: 0x369d,
+ 0xf7c: 0x38c9, 0xf7d: 0x3901, 0xf7e: 0x36bd, 0xf7f: 0x0018,
// Block 0x3e, offset 0xf80
- 0xf80: 0x3cc9, 0xf81: 0x3d31, 0xf82: 0x3d99, 0xf83: 0x3e01, 0xf84: 0x3e51, 0xf85: 0x3eb9,
- 0xf86: 0x3f09, 0xf87: 0x3f59, 0xf88: 0x3fd9, 0xf89: 0x4041, 0xf8a: 0x4091, 0xf8b: 0x40e1,
- 0xf8c: 0x4131, 0xf8d: 0x4199, 0xf8e: 0x4201, 0xf8f: 0x4251, 0xf90: 0x42a1, 0xf91: 0x42d9,
- 0xf92: 0x4329, 0xf93: 0x4391, 0xf94: 0x43f9, 0xf95: 0x4431, 0xf96: 0x44b1, 0xf97: 0x4549,
- 0xf98: 0x45c9, 0xf99: 0x4619, 0xf9a: 0x4699, 0xf9b: 0x4719, 0xf9c: 0x4781, 0xf9d: 0x47d1,
- 0xf9e: 0x4821, 0xf9f: 0x4871, 0xfa0: 0x48d9, 0xfa1: 0x4959, 0xfa2: 0x49c1, 0xfa3: 0x4a11,
- 0xfa4: 0x4a61, 0xfa5: 0x4ab1, 0xfa6: 0x4ae9, 0xfa7: 0x4b21, 0xfa8: 0x4b59, 0xfa9: 0x4b91,
- 0xfaa: 0x4be1, 0xfab: 0x4c31, 0xfac: 0x4cb1, 0xfad: 0x4d01, 0xfae: 0x4d69, 0xfaf: 0x4de9,
- 0xfb0: 0x4e39, 0xfb1: 0x4e71, 0xfb2: 0x4ea9, 0xfb3: 0x4f29, 0xfb4: 0x4f91, 0xfb5: 0x5011,
- 0xfb6: 0x5061, 0xfb7: 0x50e1, 0xfb8: 0x5119, 0xfb9: 0x5169, 0xfba: 0x51b9, 0xfbb: 0x5209,
- 0xfbc: 0x5259, 0xfbd: 0x52a9, 0xfbe: 0x5311, 0xfbf: 0x5361,
+ 0xf80: 0x36dd, 0xf81: 0x36fd, 0xf82: 0x371d, 0xf83: 0x373d, 0xf84: 0x375d, 0xf85: 0x377d,
+ 0xf86: 0x379d, 0xf87: 0x37bd, 0xf88: 0x37dd, 0xf89: 0x37fd, 0xf8a: 0x381d, 0xf8b: 0x383d,
+ 0xf8c: 0x385d, 0xf8d: 0x387d, 0xf8e: 0x389d, 0xf8f: 0x38bd, 0xf90: 0x38dd, 0xf91: 0x38fd,
+ 0xf92: 0x391d, 0xf93: 0x393d, 0xf94: 0x395d, 0xf95: 0x397d, 0xf96: 0x399d, 0xf97: 0x39bd,
+ 0xf98: 0x39dd, 0xf99: 0x39fd, 0xf9a: 0x3a1d, 0xf9b: 0x3a3d, 0xf9c: 0x3a5d, 0xf9d: 0x3a7d,
+ 0xf9e: 0x3a9d, 0xf9f: 0x3abd, 0xfa0: 0x3add, 0xfa1: 0x3afd, 0xfa2: 0x3b1d, 0xfa3: 0x3b3d,
+ 0xfa4: 0x3b5d, 0xfa5: 0x3b7d, 0xfa6: 0x127d, 0xfa7: 0x3b9d, 0xfa8: 0x3bbd, 0xfa9: 0x3bdd,
+ 0xfaa: 0x3bfd, 0xfab: 0x3c1d, 0xfac: 0x3c3d, 0xfad: 0x3c5d, 0xfae: 0x239d, 0xfaf: 0x3c7d,
+ 0xfb0: 0x3c9d, 0xfb1: 0x3939, 0xfb2: 0x3951, 0xfb3: 0x3969, 0xfb4: 0x3981, 0xfb5: 0x3999,
+ 0xfb6: 0x39b1, 0xfb7: 0x39c9, 0xfb8: 0x39e1, 0xfb9: 0x39f9, 0xfba: 0x3a11, 0xfbb: 0x3a29,
+ 0xfbc: 0x3a41, 0xfbd: 0x3a59, 0xfbe: 0x3a71, 0xfbf: 0x3a89,
// Block 0x3f, offset 0xfc0
- 0xfc0: 0x5399, 0xfc1: 0x53e9, 0xfc2: 0x5439, 0xfc3: 0x5489, 0xfc4: 0x54f1, 0xfc5: 0x5541,
- 0xfc6: 0x5591, 0xfc7: 0x55e1, 0xfc8: 0x5661, 0xfc9: 0x56c9, 0xfca: 0x5701, 0xfcb: 0x5781,
- 0xfcc: 0x57b9, 0xfcd: 0x5821, 0xfce: 0x5889, 0xfcf: 0x58d9, 0xfd0: 0x5929, 0xfd1: 0x5979,
- 0xfd2: 0x59e1, 0xfd3: 0x5a19, 0xfd4: 0x5a69, 0xfd5: 0x5ad1, 0xfd6: 0x5b09, 0xfd7: 0x5b89,
- 0xfd8: 0x5bd9, 0xfd9: 0x5c01, 0xfda: 0x5c29, 0xfdb: 0x5c51, 0xfdc: 0x5c79, 0xfdd: 0x5ca1,
- 0xfde: 0x5cc9, 0xfdf: 0x5cf1, 0xfe0: 0x5d19, 0xfe1: 0x5d41, 0xfe2: 0x5d69, 0xfe3: 0x5d99,
- 0xfe4: 0x5dc9, 0xfe5: 0x5df9, 0xfe6: 0x5e29, 0xfe7: 0x5e59, 0xfe8: 0x5e89, 0xfe9: 0x5eb9,
- 0xfea: 0x5ee9, 0xfeb: 0x5f19, 0xfec: 0x5f49, 0xfed: 0x5f79, 0xfee: 0x5fa9, 0xfef: 0x5fd9,
- 0xff0: 0x6009, 0xff1: 0x402d, 0xff2: 0x6039, 0xff3: 0x6051, 0xff4: 0x404d, 0xff5: 0x6069,
- 0xff6: 0x6081, 0xff7: 0x6099, 0xff8: 0x406d, 0xff9: 0x406d, 0xffa: 0x60b1, 0xffb: 0x60c9,
- 0xffc: 0x6101, 0xffd: 0x6139, 0xffe: 0x6171, 0xfff: 0x61a9,
+ 0xfc0: 0x3aa1, 0xfc1: 0x3ac9, 0xfc2: 0x3af1, 0xfc3: 0x3b19, 0xfc4: 0x3b41, 0xfc5: 0x3b69,
+ 0xfc6: 0x3b91, 0xfc7: 0x3bb9, 0xfc8: 0x3be1, 0xfc9: 0x3c09, 0xfca: 0x3c39, 0xfcb: 0x3c69,
+ 0xfcc: 0x3c99, 0xfcd: 0x3cbd, 0xfce: 0x3cb1, 0xfcf: 0x3cdd, 0xfd0: 0x3cfd, 0xfd1: 0x3d15,
+ 0xfd2: 0x3d2d, 0xfd3: 0x3d45, 0xfd4: 0x3d5d, 0xfd5: 0x3d5d, 0xfd6: 0x3d45, 0xfd7: 0x3d75,
+ 0xfd8: 0x07bd, 0xfd9: 0x3d8d, 0xfda: 0x3da5, 0xfdb: 0x3dbd, 0xfdc: 0x3dd5, 0xfdd: 0x3ded,
+ 0xfde: 0x3e05, 0xfdf: 0x3e1d, 0xfe0: 0x3e35, 0xfe1: 0x3e4d, 0xfe2: 0x3e65, 0xfe3: 0x3e7d,
+ 0xfe4: 0x3e95, 0xfe5: 0x3e95, 0xfe6: 0x3ead, 0xfe7: 0x3ead, 0xfe8: 0x3ec5, 0xfe9: 0x3ec5,
+ 0xfea: 0x3edd, 0xfeb: 0x3ef5, 0xfec: 0x3f0d, 0xfed: 0x3f25, 0xfee: 0x3f3d, 0xfef: 0x3f3d,
+ 0xff0: 0x3f55, 0xff1: 0x3f55, 0xff2: 0x3f55, 0xff3: 0x3f6d, 0xff4: 0x3f85, 0xff5: 0x3f9d,
+ 0xff6: 0x3fb5, 0xff7: 0x3f9d, 0xff8: 0x3fcd, 0xff9: 0x3fe5, 0xffa: 0x3f6d, 0xffb: 0x3ffd,
+ 0xffc: 0x4015, 0xffd: 0x4015, 0xffe: 0x4015, 0xfff: 0x0040,
// Block 0x40, offset 0x1000
- 0x1000: 0x6211, 0x1001: 0x6229, 0x1002: 0x408d, 0x1003: 0x6241, 0x1004: 0x6259, 0x1005: 0x6271,
- 0x1006: 0x6289, 0x1007: 0x62a1, 0x1008: 0x40ad, 0x1009: 0x62b9, 0x100a: 0x62e1, 0x100b: 0x62f9,
- 0x100c: 0x40cd, 0x100d: 0x40cd, 0x100e: 0x6311, 0x100f: 0x6329, 0x1010: 0x6341, 0x1011: 0x40ed,
- 0x1012: 0x410d, 0x1013: 0x412d, 0x1014: 0x414d, 0x1015: 0x416d, 0x1016: 0x6359, 0x1017: 0x6371,
- 0x1018: 0x6389, 0x1019: 0x63a1, 0x101a: 0x63b9, 0x101b: 0x418d, 0x101c: 0x63d1, 0x101d: 0x63e9,
- 0x101e: 0x6401, 0x101f: 0x41ad, 0x1020: 0x41cd, 0x1021: 0x6419, 0x1022: 0x41ed, 0x1023: 0x420d,
- 0x1024: 0x422d, 0x1025: 0x6431, 0x1026: 0x424d, 0x1027: 0x6449, 0x1028: 0x6479, 0x1029: 0x6211,
- 0x102a: 0x426d, 0x102b: 0x428d, 0x102c: 0x42ad, 0x102d: 0x42cd, 0x102e: 0x64b1, 0x102f: 0x64f1,
- 0x1030: 0x6539, 0x1031: 0x6551, 0x1032: 0x42ed, 0x1033: 0x6569, 0x1034: 0x6581, 0x1035: 0x6599,
- 0x1036: 0x430d, 0x1037: 0x65b1, 0x1038: 0x65c9, 0x1039: 0x65b1, 0x103a: 0x65e1, 0x103b: 0x65f9,
- 0x103c: 0x432d, 0x103d: 0x6611, 0x103e: 0x6629, 0x103f: 0x6611,
+ 0x1000: 0x3cc9, 0x1001: 0x3d31, 0x1002: 0x3d99, 0x1003: 0x3e01, 0x1004: 0x3e51, 0x1005: 0x3eb9,
+ 0x1006: 0x3f09, 0x1007: 0x3f59, 0x1008: 0x3fd9, 0x1009: 0x4041, 0x100a: 0x4091, 0x100b: 0x40e1,
+ 0x100c: 0x4131, 0x100d: 0x4199, 0x100e: 0x4201, 0x100f: 0x4251, 0x1010: 0x42a1, 0x1011: 0x42d9,
+ 0x1012: 0x4329, 0x1013: 0x4391, 0x1014: 0x43f9, 0x1015: 0x4431, 0x1016: 0x44b1, 0x1017: 0x4549,
+ 0x1018: 0x45c9, 0x1019: 0x4619, 0x101a: 0x4699, 0x101b: 0x4719, 0x101c: 0x4781, 0x101d: 0x47d1,
+ 0x101e: 0x4821, 0x101f: 0x4871, 0x1020: 0x48d9, 0x1021: 0x4959, 0x1022: 0x49c1, 0x1023: 0x4a11,
+ 0x1024: 0x4a61, 0x1025: 0x4ab1, 0x1026: 0x4ae9, 0x1027: 0x4b21, 0x1028: 0x4b59, 0x1029: 0x4b91,
+ 0x102a: 0x4be1, 0x102b: 0x4c31, 0x102c: 0x4cb1, 0x102d: 0x4d01, 0x102e: 0x4d69, 0x102f: 0x4de9,
+ 0x1030: 0x4e39, 0x1031: 0x4e71, 0x1032: 0x4ea9, 0x1033: 0x4f29, 0x1034: 0x4f91, 0x1035: 0x5011,
+ 0x1036: 0x5061, 0x1037: 0x50e1, 0x1038: 0x5119, 0x1039: 0x5169, 0x103a: 0x51b9, 0x103b: 0x5209,
+ 0x103c: 0x5259, 0x103d: 0x52a9, 0x103e: 0x5311, 0x103f: 0x5361,
// Block 0x41, offset 0x1040
- 0x1040: 0x434d, 0x1041: 0x436d, 0x1042: 0x0040, 0x1043: 0x6641, 0x1044: 0x6659, 0x1045: 0x6671,
- 0x1046: 0x6689, 0x1047: 0x0040, 0x1048: 0x66c1, 0x1049: 0x66d9, 0x104a: 0x66f1, 0x104b: 0x6709,
- 0x104c: 0x6721, 0x104d: 0x6739, 0x104e: 0x6401, 0x104f: 0x6751, 0x1050: 0x6769, 0x1051: 0x6781,
- 0x1052: 0x438d, 0x1053: 0x6799, 0x1054: 0x6289, 0x1055: 0x43ad, 0x1056: 0x43cd, 0x1057: 0x67b1,
- 0x1058: 0x0040, 0x1059: 0x43ed, 0x105a: 0x67c9, 0x105b: 0x67e1, 0x105c: 0x67f9, 0x105d: 0x6811,
- 0x105e: 0x6829, 0x105f: 0x6859, 0x1060: 0x6889, 0x1061: 0x68b1, 0x1062: 0x68d9, 0x1063: 0x6901,
- 0x1064: 0x6929, 0x1065: 0x6951, 0x1066: 0x6979, 0x1067: 0x69a1, 0x1068: 0x69c9, 0x1069: 0x69f1,
- 0x106a: 0x6a21, 0x106b: 0x6a51, 0x106c: 0x6a81, 0x106d: 0x6ab1, 0x106e: 0x6ae1, 0x106f: 0x6b11,
- 0x1070: 0x6b41, 0x1071: 0x6b71, 0x1072: 0x6ba1, 0x1073: 0x6bd1, 0x1074: 0x6c01, 0x1075: 0x6c31,
- 0x1076: 0x6c61, 0x1077: 0x6c91, 0x1078: 0x6cc1, 0x1079: 0x6cf1, 0x107a: 0x6d21, 0x107b: 0x6d51,
- 0x107c: 0x6d81, 0x107d: 0x6db1, 0x107e: 0x6de1, 0x107f: 0x440d,
+ 0x1040: 0x5399, 0x1041: 0x53e9, 0x1042: 0x5439, 0x1043: 0x5489, 0x1044: 0x54f1, 0x1045: 0x5541,
+ 0x1046: 0x5591, 0x1047: 0x55e1, 0x1048: 0x5661, 0x1049: 0x56c9, 0x104a: 0x5701, 0x104b: 0x5781,
+ 0x104c: 0x57b9, 0x104d: 0x5821, 0x104e: 0x5889, 0x104f: 0x58d9, 0x1050: 0x5929, 0x1051: 0x5979,
+ 0x1052: 0x59e1, 0x1053: 0x5a19, 0x1054: 0x5a69, 0x1055: 0x5ad1, 0x1056: 0x5b09, 0x1057: 0x5b89,
+ 0x1058: 0x5bd9, 0x1059: 0x5c01, 0x105a: 0x5c29, 0x105b: 0x5c51, 0x105c: 0x5c79, 0x105d: 0x5ca1,
+ 0x105e: 0x5cc9, 0x105f: 0x5cf1, 0x1060: 0x5d19, 0x1061: 0x5d41, 0x1062: 0x5d69, 0x1063: 0x5d99,
+ 0x1064: 0x5dc9, 0x1065: 0x5df9, 0x1066: 0x5e29, 0x1067: 0x5e59, 0x1068: 0x5e89, 0x1069: 0x5eb9,
+ 0x106a: 0x5ee9, 0x106b: 0x5f19, 0x106c: 0x5f49, 0x106d: 0x5f79, 0x106e: 0x5fa9, 0x106f: 0x5fd9,
+ 0x1070: 0x6009, 0x1071: 0x402d, 0x1072: 0x6039, 0x1073: 0x6051, 0x1074: 0x404d, 0x1075: 0x6069,
+ 0x1076: 0x6081, 0x1077: 0x6099, 0x1078: 0x406d, 0x1079: 0x406d, 0x107a: 0x60b1, 0x107b: 0x60c9,
+ 0x107c: 0x6101, 0x107d: 0x6139, 0x107e: 0x6171, 0x107f: 0x61a9,
// Block 0x42, offset 0x1080
- 0x1080: 0xe00d, 0x1081: 0x0008, 0x1082: 0xe00d, 0x1083: 0x0008, 0x1084: 0xe00d, 0x1085: 0x0008,
- 0x1086: 0xe00d, 0x1087: 0x0008, 0x1088: 0xe00d, 0x1089: 0x0008, 0x108a: 0xe00d, 0x108b: 0x0008,
- 0x108c: 0xe00d, 0x108d: 0x0008, 0x108e: 0xe00d, 0x108f: 0x0008, 0x1090: 0xe00d, 0x1091: 0x0008,
- 0x1092: 0xe00d, 0x1093: 0x0008, 0x1094: 0xe00d, 0x1095: 0x0008, 0x1096: 0xe00d, 0x1097: 0x0008,
- 0x1098: 0xe00d, 0x1099: 0x0008, 0x109a: 0xe00d, 0x109b: 0x0008, 0x109c: 0xe00d, 0x109d: 0x0008,
- 0x109e: 0xe00d, 0x109f: 0x0008, 0x10a0: 0xe00d, 0x10a1: 0x0008, 0x10a2: 0xe00d, 0x10a3: 0x0008,
- 0x10a4: 0xe00d, 0x10a5: 0x0008, 0x10a6: 0xe00d, 0x10a7: 0x0008, 0x10a8: 0xe00d, 0x10a9: 0x0008,
- 0x10aa: 0xe00d, 0x10ab: 0x0008, 0x10ac: 0xe00d, 0x10ad: 0x0008, 0x10ae: 0x0008, 0x10af: 0x1308,
- 0x10b0: 0x1318, 0x10b1: 0x1318, 0x10b2: 0x1318, 0x10b3: 0x0018, 0x10b4: 0x1308, 0x10b5: 0x1308,
- 0x10b6: 0x1308, 0x10b7: 0x1308, 0x10b8: 0x1308, 0x10b9: 0x1308, 0x10ba: 0x1308, 0x10bb: 0x1308,
- 0x10bc: 0x1308, 0x10bd: 0x1308, 0x10be: 0x0018, 0x10bf: 0x0008,
+ 0x1080: 0x6211, 0x1081: 0x6229, 0x1082: 0x408d, 0x1083: 0x6241, 0x1084: 0x6259, 0x1085: 0x6271,
+ 0x1086: 0x6289, 0x1087: 0x62a1, 0x1088: 0x40ad, 0x1089: 0x62b9, 0x108a: 0x62e1, 0x108b: 0x62f9,
+ 0x108c: 0x40cd, 0x108d: 0x40cd, 0x108e: 0x6311, 0x108f: 0x6329, 0x1090: 0x6341, 0x1091: 0x40ed,
+ 0x1092: 0x410d, 0x1093: 0x412d, 0x1094: 0x414d, 0x1095: 0x416d, 0x1096: 0x6359, 0x1097: 0x6371,
+ 0x1098: 0x6389, 0x1099: 0x63a1, 0x109a: 0x63b9, 0x109b: 0x418d, 0x109c: 0x63d1, 0x109d: 0x63e9,
+ 0x109e: 0x6401, 0x109f: 0x41ad, 0x10a0: 0x41cd, 0x10a1: 0x6419, 0x10a2: 0x41ed, 0x10a3: 0x420d,
+ 0x10a4: 0x422d, 0x10a5: 0x6431, 0x10a6: 0x424d, 0x10a7: 0x6449, 0x10a8: 0x6479, 0x10a9: 0x6211,
+ 0x10aa: 0x426d, 0x10ab: 0x428d, 0x10ac: 0x42ad, 0x10ad: 0x42cd, 0x10ae: 0x64b1, 0x10af: 0x64f1,
+ 0x10b0: 0x6539, 0x10b1: 0x6551, 0x10b2: 0x42ed, 0x10b3: 0x6569, 0x10b4: 0x6581, 0x10b5: 0x6599,
+ 0x10b6: 0x430d, 0x10b7: 0x65b1, 0x10b8: 0x65c9, 0x10b9: 0x65b1, 0x10ba: 0x65e1, 0x10bb: 0x65f9,
+ 0x10bc: 0x432d, 0x10bd: 0x6611, 0x10be: 0x6629, 0x10bf: 0x6611,
// Block 0x43, offset 0x10c0
- 0x10c0: 0xe00d, 0x10c1: 0x0008, 0x10c2: 0xe00d, 0x10c3: 0x0008, 0x10c4: 0xe00d, 0x10c5: 0x0008,
- 0x10c6: 0xe00d, 0x10c7: 0x0008, 0x10c8: 0xe00d, 0x10c9: 0x0008, 0x10ca: 0xe00d, 0x10cb: 0x0008,
- 0x10cc: 0xe00d, 0x10cd: 0x0008, 0x10ce: 0xe00d, 0x10cf: 0x0008, 0x10d0: 0xe00d, 0x10d1: 0x0008,
- 0x10d2: 0xe00d, 0x10d3: 0x0008, 0x10d4: 0xe00d, 0x10d5: 0x0008, 0x10d6: 0xe00d, 0x10d7: 0x0008,
- 0x10d8: 0xe00d, 0x10d9: 0x0008, 0x10da: 0xe00d, 0x10db: 0x0008, 0x10dc: 0x0ea1, 0x10dd: 0x6e11,
- 0x10de: 0x1308, 0x10df: 0x1308, 0x10e0: 0x0008, 0x10e1: 0x0008, 0x10e2: 0x0008, 0x10e3: 0x0008,
- 0x10e4: 0x0008, 0x10e5: 0x0008, 0x10e6: 0x0008, 0x10e7: 0x0008, 0x10e8: 0x0008, 0x10e9: 0x0008,
- 0x10ea: 0x0008, 0x10eb: 0x0008, 0x10ec: 0x0008, 0x10ed: 0x0008, 0x10ee: 0x0008, 0x10ef: 0x0008,
- 0x10f0: 0x0008, 0x10f1: 0x0008, 0x10f2: 0x0008, 0x10f3: 0x0008, 0x10f4: 0x0008, 0x10f5: 0x0008,
- 0x10f6: 0x0008, 0x10f7: 0x0008, 0x10f8: 0x0008, 0x10f9: 0x0008, 0x10fa: 0x0008, 0x10fb: 0x0008,
- 0x10fc: 0x0008, 0x10fd: 0x0008, 0x10fe: 0x0008, 0x10ff: 0x0008,
+ 0x10c0: 0x434d, 0x10c1: 0x436d, 0x10c2: 0x0040, 0x10c3: 0x6641, 0x10c4: 0x6659, 0x10c5: 0x6671,
+ 0x10c6: 0x6689, 0x10c7: 0x0040, 0x10c8: 0x66c1, 0x10c9: 0x66d9, 0x10ca: 0x66f1, 0x10cb: 0x6709,
+ 0x10cc: 0x6721, 0x10cd: 0x6739, 0x10ce: 0x6401, 0x10cf: 0x6751, 0x10d0: 0x6769, 0x10d1: 0x6781,
+ 0x10d2: 0x438d, 0x10d3: 0x6799, 0x10d4: 0x6289, 0x10d5: 0x43ad, 0x10d6: 0x43cd, 0x10d7: 0x67b1,
+ 0x10d8: 0x0040, 0x10d9: 0x43ed, 0x10da: 0x67c9, 0x10db: 0x67e1, 0x10dc: 0x67f9, 0x10dd: 0x6811,
+ 0x10de: 0x6829, 0x10df: 0x6859, 0x10e0: 0x6889, 0x10e1: 0x68b1, 0x10e2: 0x68d9, 0x10e3: 0x6901,
+ 0x10e4: 0x6929, 0x10e5: 0x6951, 0x10e6: 0x6979, 0x10e7: 0x69a1, 0x10e8: 0x69c9, 0x10e9: 0x69f1,
+ 0x10ea: 0x6a21, 0x10eb: 0x6a51, 0x10ec: 0x6a81, 0x10ed: 0x6ab1, 0x10ee: 0x6ae1, 0x10ef: 0x6b11,
+ 0x10f0: 0x6b41, 0x10f1: 0x6b71, 0x10f2: 0x6ba1, 0x10f3: 0x6bd1, 0x10f4: 0x6c01, 0x10f5: 0x6c31,
+ 0x10f6: 0x6c61, 0x10f7: 0x6c91, 0x10f8: 0x6cc1, 0x10f9: 0x6cf1, 0x10fa: 0x6d21, 0x10fb: 0x6d51,
+ 0x10fc: 0x6d81, 0x10fd: 0x6db1, 0x10fe: 0x6de1, 0x10ff: 0x440d,
// Block 0x44, offset 0x1100
- 0x1100: 0x0018, 0x1101: 0x0018, 0x1102: 0x0018, 0x1103: 0x0018, 0x1104: 0x0018, 0x1105: 0x0018,
- 0x1106: 0x0018, 0x1107: 0x0018, 0x1108: 0x0018, 0x1109: 0x0018, 0x110a: 0x0018, 0x110b: 0x0018,
- 0x110c: 0x0018, 0x110d: 0x0018, 0x110e: 0x0018, 0x110f: 0x0018, 0x1110: 0x0018, 0x1111: 0x0018,
- 0x1112: 0x0018, 0x1113: 0x0018, 0x1114: 0x0018, 0x1115: 0x0018, 0x1116: 0x0018, 0x1117: 0x0008,
- 0x1118: 0x0008, 0x1119: 0x0008, 0x111a: 0x0008, 0x111b: 0x0008, 0x111c: 0x0008, 0x111d: 0x0008,
- 0x111e: 0x0008, 0x111f: 0x0008, 0x1120: 0x0018, 0x1121: 0x0018, 0x1122: 0xe00d, 0x1123: 0x0008,
+ 0x1100: 0xe00d, 0x1101: 0x0008, 0x1102: 0xe00d, 0x1103: 0x0008, 0x1104: 0xe00d, 0x1105: 0x0008,
+ 0x1106: 0xe00d, 0x1107: 0x0008, 0x1108: 0xe00d, 0x1109: 0x0008, 0x110a: 0xe00d, 0x110b: 0x0008,
+ 0x110c: 0xe00d, 0x110d: 0x0008, 0x110e: 0xe00d, 0x110f: 0x0008, 0x1110: 0xe00d, 0x1111: 0x0008,
+ 0x1112: 0xe00d, 0x1113: 0x0008, 0x1114: 0xe00d, 0x1115: 0x0008, 0x1116: 0xe00d, 0x1117: 0x0008,
+ 0x1118: 0xe00d, 0x1119: 0x0008, 0x111a: 0xe00d, 0x111b: 0x0008, 0x111c: 0xe00d, 0x111d: 0x0008,
+ 0x111e: 0xe00d, 0x111f: 0x0008, 0x1120: 0xe00d, 0x1121: 0x0008, 0x1122: 0xe00d, 0x1123: 0x0008,
0x1124: 0xe00d, 0x1125: 0x0008, 0x1126: 0xe00d, 0x1127: 0x0008, 0x1128: 0xe00d, 0x1129: 0x0008,
- 0x112a: 0xe00d, 0x112b: 0x0008, 0x112c: 0xe00d, 0x112d: 0x0008, 0x112e: 0xe00d, 0x112f: 0x0008,
- 0x1130: 0x0008, 0x1131: 0x0008, 0x1132: 0xe00d, 0x1133: 0x0008, 0x1134: 0xe00d, 0x1135: 0x0008,
- 0x1136: 0xe00d, 0x1137: 0x0008, 0x1138: 0xe00d, 0x1139: 0x0008, 0x113a: 0xe00d, 0x113b: 0x0008,
- 0x113c: 0xe00d, 0x113d: 0x0008, 0x113e: 0xe00d, 0x113f: 0x0008,
+ 0x112a: 0xe00d, 0x112b: 0x0008, 0x112c: 0xe00d, 0x112d: 0x0008, 0x112e: 0x0008, 0x112f: 0x3308,
+ 0x1130: 0x3318, 0x1131: 0x3318, 0x1132: 0x3318, 0x1133: 0x0018, 0x1134: 0x3308, 0x1135: 0x3308,
+ 0x1136: 0x3308, 0x1137: 0x3308, 0x1138: 0x3308, 0x1139: 0x3308, 0x113a: 0x3308, 0x113b: 0x3308,
+ 0x113c: 0x3308, 0x113d: 0x3308, 0x113e: 0x0018, 0x113f: 0x0008,
// Block 0x45, offset 0x1140
0x1140: 0xe00d, 0x1141: 0x0008, 0x1142: 0xe00d, 0x1143: 0x0008, 0x1144: 0xe00d, 0x1145: 0x0008,
0x1146: 0xe00d, 0x1147: 0x0008, 0x1148: 0xe00d, 0x1149: 0x0008, 0x114a: 0xe00d, 0x114b: 0x0008,
0x114c: 0xe00d, 0x114d: 0x0008, 0x114e: 0xe00d, 0x114f: 0x0008, 0x1150: 0xe00d, 0x1151: 0x0008,
0x1152: 0xe00d, 0x1153: 0x0008, 0x1154: 0xe00d, 0x1155: 0x0008, 0x1156: 0xe00d, 0x1157: 0x0008,
- 0x1158: 0xe00d, 0x1159: 0x0008, 0x115a: 0xe00d, 0x115b: 0x0008, 0x115c: 0xe00d, 0x115d: 0x0008,
- 0x115e: 0xe00d, 0x115f: 0x0008, 0x1160: 0xe00d, 0x1161: 0x0008, 0x1162: 0xe00d, 0x1163: 0x0008,
- 0x1164: 0xe00d, 0x1165: 0x0008, 0x1166: 0xe00d, 0x1167: 0x0008, 0x1168: 0xe00d, 0x1169: 0x0008,
- 0x116a: 0xe00d, 0x116b: 0x0008, 0x116c: 0xe00d, 0x116d: 0x0008, 0x116e: 0xe00d, 0x116f: 0x0008,
- 0x1170: 0xe0fd, 0x1171: 0x0008, 0x1172: 0x0008, 0x1173: 0x0008, 0x1174: 0x0008, 0x1175: 0x0008,
- 0x1176: 0x0008, 0x1177: 0x0008, 0x1178: 0x0008, 0x1179: 0xe01d, 0x117a: 0x0008, 0x117b: 0xe03d,
- 0x117c: 0x0008, 0x117d: 0x442d, 0x117e: 0xe00d, 0x117f: 0x0008,
+ 0x1158: 0xe00d, 0x1159: 0x0008, 0x115a: 0xe00d, 0x115b: 0x0008, 0x115c: 0x0ea1, 0x115d: 0x6e11,
+ 0x115e: 0x3308, 0x115f: 0x3308, 0x1160: 0x0008, 0x1161: 0x0008, 0x1162: 0x0008, 0x1163: 0x0008,
+ 0x1164: 0x0008, 0x1165: 0x0008, 0x1166: 0x0008, 0x1167: 0x0008, 0x1168: 0x0008, 0x1169: 0x0008,
+ 0x116a: 0x0008, 0x116b: 0x0008, 0x116c: 0x0008, 0x116d: 0x0008, 0x116e: 0x0008, 0x116f: 0x0008,
+ 0x1170: 0x0008, 0x1171: 0x0008, 0x1172: 0x0008, 0x1173: 0x0008, 0x1174: 0x0008, 0x1175: 0x0008,
+ 0x1176: 0x0008, 0x1177: 0x0008, 0x1178: 0x0008, 0x1179: 0x0008, 0x117a: 0x0008, 0x117b: 0x0008,
+ 0x117c: 0x0008, 0x117d: 0x0008, 0x117e: 0x0008, 0x117f: 0x0008,
// Block 0x46, offset 0x1180
- 0x1180: 0xe00d, 0x1181: 0x0008, 0x1182: 0xe00d, 0x1183: 0x0008, 0x1184: 0xe00d, 0x1185: 0x0008,
- 0x1186: 0xe00d, 0x1187: 0x0008, 0x1188: 0x0008, 0x1189: 0x0018, 0x118a: 0x0018, 0x118b: 0xe03d,
- 0x118c: 0x0008, 0x118d: 0x11d9, 0x118e: 0x0008, 0x118f: 0x0008, 0x1190: 0xe00d, 0x1191: 0x0008,
- 0x1192: 0xe00d, 0x1193: 0x0008, 0x1194: 0x0008, 0x1195: 0x0008, 0x1196: 0xe00d, 0x1197: 0x0008,
- 0x1198: 0xe00d, 0x1199: 0x0008, 0x119a: 0xe00d, 0x119b: 0x0008, 0x119c: 0xe00d, 0x119d: 0x0008,
- 0x119e: 0xe00d, 0x119f: 0x0008, 0x11a0: 0xe00d, 0x11a1: 0x0008, 0x11a2: 0xe00d, 0x11a3: 0x0008,
+ 0x1180: 0x0018, 0x1181: 0x0018, 0x1182: 0x0018, 0x1183: 0x0018, 0x1184: 0x0018, 0x1185: 0x0018,
+ 0x1186: 0x0018, 0x1187: 0x0018, 0x1188: 0x0018, 0x1189: 0x0018, 0x118a: 0x0018, 0x118b: 0x0018,
+ 0x118c: 0x0018, 0x118d: 0x0018, 0x118e: 0x0018, 0x118f: 0x0018, 0x1190: 0x0018, 0x1191: 0x0018,
+ 0x1192: 0x0018, 0x1193: 0x0018, 0x1194: 0x0018, 0x1195: 0x0018, 0x1196: 0x0018, 0x1197: 0x0008,
+ 0x1198: 0x0008, 0x1199: 0x0008, 0x119a: 0x0008, 0x119b: 0x0008, 0x119c: 0x0008, 0x119d: 0x0008,
+ 0x119e: 0x0008, 0x119f: 0x0008, 0x11a0: 0x0018, 0x11a1: 0x0018, 0x11a2: 0xe00d, 0x11a3: 0x0008,
0x11a4: 0xe00d, 0x11a5: 0x0008, 0x11a6: 0xe00d, 0x11a7: 0x0008, 0x11a8: 0xe00d, 0x11a9: 0x0008,
- 0x11aa: 0x6e29, 0x11ab: 0x1029, 0x11ac: 0x11c1, 0x11ad: 0x6e41, 0x11ae: 0x1221, 0x11af: 0x0040,
- 0x11b0: 0x6e59, 0x11b1: 0x6e71, 0x11b2: 0x1239, 0x11b3: 0x444d, 0x11b4: 0xe00d, 0x11b5: 0x0008,
- 0x11b6: 0xe00d, 0x11b7: 0x0008, 0x11b8: 0x0040, 0x11b9: 0x0040, 0x11ba: 0x0040, 0x11bb: 0x0040,
- 0x11bc: 0x0040, 0x11bd: 0x0040, 0x11be: 0x0040, 0x11bf: 0x0040,
+ 0x11aa: 0xe00d, 0x11ab: 0x0008, 0x11ac: 0xe00d, 0x11ad: 0x0008, 0x11ae: 0xe00d, 0x11af: 0x0008,
+ 0x11b0: 0x0008, 0x11b1: 0x0008, 0x11b2: 0xe00d, 0x11b3: 0x0008, 0x11b4: 0xe00d, 0x11b5: 0x0008,
+ 0x11b6: 0xe00d, 0x11b7: 0x0008, 0x11b8: 0xe00d, 0x11b9: 0x0008, 0x11ba: 0xe00d, 0x11bb: 0x0008,
+ 0x11bc: 0xe00d, 0x11bd: 0x0008, 0x11be: 0xe00d, 0x11bf: 0x0008,
// Block 0x47, offset 0x11c0
- 0x11c0: 0x64d5, 0x11c1: 0x64f5, 0x11c2: 0x6515, 0x11c3: 0x6535, 0x11c4: 0x6555, 0x11c5: 0x6575,
- 0x11c6: 0x6595, 0x11c7: 0x65b5, 0x11c8: 0x65d5, 0x11c9: 0x65f5, 0x11ca: 0x6615, 0x11cb: 0x6635,
- 0x11cc: 0x6655, 0x11cd: 0x6675, 0x11ce: 0x0008, 0x11cf: 0x0008, 0x11d0: 0x6695, 0x11d1: 0x0008,
- 0x11d2: 0x66b5, 0x11d3: 0x0008, 0x11d4: 0x0008, 0x11d5: 0x66d5, 0x11d6: 0x66f5, 0x11d7: 0x6715,
- 0x11d8: 0x6735, 0x11d9: 0x6755, 0x11da: 0x6775, 0x11db: 0x6795, 0x11dc: 0x67b5, 0x11dd: 0x67d5,
- 0x11de: 0x67f5, 0x11df: 0x0008, 0x11e0: 0x6815, 0x11e1: 0x0008, 0x11e2: 0x6835, 0x11e3: 0x0008,
- 0x11e4: 0x0008, 0x11e5: 0x6855, 0x11e6: 0x6875, 0x11e7: 0x0008, 0x11e8: 0x0008, 0x11e9: 0x0008,
- 0x11ea: 0x6895, 0x11eb: 0x68b5, 0x11ec: 0x68d5, 0x11ed: 0x68f5, 0x11ee: 0x6915, 0x11ef: 0x6935,
- 0x11f0: 0x6955, 0x11f1: 0x6975, 0x11f2: 0x6995, 0x11f3: 0x69b5, 0x11f4: 0x69d5, 0x11f5: 0x69f5,
- 0x11f6: 0x6a15, 0x11f7: 0x6a35, 0x11f8: 0x6a55, 0x11f9: 0x6a75, 0x11fa: 0x6a95, 0x11fb: 0x6ab5,
- 0x11fc: 0x6ad5, 0x11fd: 0x6af5, 0x11fe: 0x6b15, 0x11ff: 0x6b35,
+ 0x11c0: 0xe00d, 0x11c1: 0x0008, 0x11c2: 0xe00d, 0x11c3: 0x0008, 0x11c4: 0xe00d, 0x11c5: 0x0008,
+ 0x11c6: 0xe00d, 0x11c7: 0x0008, 0x11c8: 0xe00d, 0x11c9: 0x0008, 0x11ca: 0xe00d, 0x11cb: 0x0008,
+ 0x11cc: 0xe00d, 0x11cd: 0x0008, 0x11ce: 0xe00d, 0x11cf: 0x0008, 0x11d0: 0xe00d, 0x11d1: 0x0008,
+ 0x11d2: 0xe00d, 0x11d3: 0x0008, 0x11d4: 0xe00d, 0x11d5: 0x0008, 0x11d6: 0xe00d, 0x11d7: 0x0008,
+ 0x11d8: 0xe00d, 0x11d9: 0x0008, 0x11da: 0xe00d, 0x11db: 0x0008, 0x11dc: 0xe00d, 0x11dd: 0x0008,
+ 0x11de: 0xe00d, 0x11df: 0x0008, 0x11e0: 0xe00d, 0x11e1: 0x0008, 0x11e2: 0xe00d, 0x11e3: 0x0008,
+ 0x11e4: 0xe00d, 0x11e5: 0x0008, 0x11e6: 0xe00d, 0x11e7: 0x0008, 0x11e8: 0xe00d, 0x11e9: 0x0008,
+ 0x11ea: 0xe00d, 0x11eb: 0x0008, 0x11ec: 0xe00d, 0x11ed: 0x0008, 0x11ee: 0xe00d, 0x11ef: 0x0008,
+ 0x11f0: 0xe0fd, 0x11f1: 0x0008, 0x11f2: 0x0008, 0x11f3: 0x0008, 0x11f4: 0x0008, 0x11f5: 0x0008,
+ 0x11f6: 0x0008, 0x11f7: 0x0008, 0x11f8: 0x0008, 0x11f9: 0xe01d, 0x11fa: 0x0008, 0x11fb: 0xe03d,
+ 0x11fc: 0x0008, 0x11fd: 0x442d, 0x11fe: 0xe00d, 0x11ff: 0x0008,
// Block 0x48, offset 0x1200
- 0x1200: 0x7a95, 0x1201: 0x7ab5, 0x1202: 0x7ad5, 0x1203: 0x7af5, 0x1204: 0x7b15, 0x1205: 0x7b35,
- 0x1206: 0x7b55, 0x1207: 0x7b75, 0x1208: 0x7b95, 0x1209: 0x7bb5, 0x120a: 0x7bd5, 0x120b: 0x7bf5,
- 0x120c: 0x7c15, 0x120d: 0x7c35, 0x120e: 0x7c55, 0x120f: 0x6ec9, 0x1210: 0x6ef1, 0x1211: 0x6f19,
- 0x1212: 0x7c75, 0x1213: 0x7c95, 0x1214: 0x7cb5, 0x1215: 0x6f41, 0x1216: 0x6f69, 0x1217: 0x6f91,
- 0x1218: 0x7cd5, 0x1219: 0x7cf5, 0x121a: 0x0040, 0x121b: 0x0040, 0x121c: 0x0040, 0x121d: 0x0040,
- 0x121e: 0x0040, 0x121f: 0x0040, 0x1220: 0x0040, 0x1221: 0x0040, 0x1222: 0x0040, 0x1223: 0x0040,
- 0x1224: 0x0040, 0x1225: 0x0040, 0x1226: 0x0040, 0x1227: 0x0040, 0x1228: 0x0040, 0x1229: 0x0040,
- 0x122a: 0x0040, 0x122b: 0x0040, 0x122c: 0x0040, 0x122d: 0x0040, 0x122e: 0x0040, 0x122f: 0x0040,
- 0x1230: 0x0040, 0x1231: 0x0040, 0x1232: 0x0040, 0x1233: 0x0040, 0x1234: 0x0040, 0x1235: 0x0040,
- 0x1236: 0x0040, 0x1237: 0x0040, 0x1238: 0x0040, 0x1239: 0x0040, 0x123a: 0x0040, 0x123b: 0x0040,
+ 0x1200: 0xe00d, 0x1201: 0x0008, 0x1202: 0xe00d, 0x1203: 0x0008, 0x1204: 0xe00d, 0x1205: 0x0008,
+ 0x1206: 0xe00d, 0x1207: 0x0008, 0x1208: 0x0008, 0x1209: 0x0018, 0x120a: 0x0018, 0x120b: 0xe03d,
+ 0x120c: 0x0008, 0x120d: 0x11d9, 0x120e: 0x0008, 0x120f: 0x0008, 0x1210: 0xe00d, 0x1211: 0x0008,
+ 0x1212: 0xe00d, 0x1213: 0x0008, 0x1214: 0x0008, 0x1215: 0x0008, 0x1216: 0xe00d, 0x1217: 0x0008,
+ 0x1218: 0xe00d, 0x1219: 0x0008, 0x121a: 0xe00d, 0x121b: 0x0008, 0x121c: 0xe00d, 0x121d: 0x0008,
+ 0x121e: 0xe00d, 0x121f: 0x0008, 0x1220: 0xe00d, 0x1221: 0x0008, 0x1222: 0xe00d, 0x1223: 0x0008,
+ 0x1224: 0xe00d, 0x1225: 0x0008, 0x1226: 0xe00d, 0x1227: 0x0008, 0x1228: 0xe00d, 0x1229: 0x0008,
+ 0x122a: 0x6e29, 0x122b: 0x1029, 0x122c: 0x11c1, 0x122d: 0x6e41, 0x122e: 0x1221, 0x122f: 0x0040,
+ 0x1230: 0x6e59, 0x1231: 0x6e71, 0x1232: 0x1239, 0x1233: 0x444d, 0x1234: 0xe00d, 0x1235: 0x0008,
+ 0x1236: 0xe00d, 0x1237: 0x0008, 0x1238: 0x0040, 0x1239: 0x0040, 0x123a: 0x0040, 0x123b: 0x0040,
0x123c: 0x0040, 0x123d: 0x0040, 0x123e: 0x0040, 0x123f: 0x0040,
// Block 0x49, offset 0x1240
- 0x1240: 0x6fb9, 0x1241: 0x6fd1, 0x1242: 0x6fe9, 0x1243: 0x7d15, 0x1244: 0x7d35, 0x1245: 0x7001,
- 0x1246: 0x7001, 0x1247: 0x0040, 0x1248: 0x0040, 0x1249: 0x0040, 0x124a: 0x0040, 0x124b: 0x0040,
- 0x124c: 0x0040, 0x124d: 0x0040, 0x124e: 0x0040, 0x124f: 0x0040, 0x1250: 0x0040, 0x1251: 0x0040,
- 0x1252: 0x0040, 0x1253: 0x7019, 0x1254: 0x7041, 0x1255: 0x7069, 0x1256: 0x7091, 0x1257: 0x70b9,
- 0x1258: 0x0040, 0x1259: 0x0040, 0x125a: 0x0040, 0x125b: 0x0040, 0x125c: 0x0040, 0x125d: 0x70e1,
- 0x125e: 0x1308, 0x125f: 0x7109, 0x1260: 0x7131, 0x1261: 0x20a9, 0x1262: 0x20f1, 0x1263: 0x7149,
- 0x1264: 0x7161, 0x1265: 0x7179, 0x1266: 0x7191, 0x1267: 0x71a9, 0x1268: 0x71c1, 0x1269: 0x1fb2,
- 0x126a: 0x71d9, 0x126b: 0x7201, 0x126c: 0x7229, 0x126d: 0x7261, 0x126e: 0x7299, 0x126f: 0x72c1,
- 0x1270: 0x72e9, 0x1271: 0x7311, 0x1272: 0x7339, 0x1273: 0x7361, 0x1274: 0x7389, 0x1275: 0x73b1,
- 0x1276: 0x73d9, 0x1277: 0x0040, 0x1278: 0x7401, 0x1279: 0x7429, 0x127a: 0x7451, 0x127b: 0x7479,
- 0x127c: 0x74a1, 0x127d: 0x0040, 0x127e: 0x74c9, 0x127f: 0x0040,
+ 0x1240: 0x64d5, 0x1241: 0x64f5, 0x1242: 0x6515, 0x1243: 0x6535, 0x1244: 0x6555, 0x1245: 0x6575,
+ 0x1246: 0x6595, 0x1247: 0x65b5, 0x1248: 0x65d5, 0x1249: 0x65f5, 0x124a: 0x6615, 0x124b: 0x6635,
+ 0x124c: 0x6655, 0x124d: 0x6675, 0x124e: 0x0008, 0x124f: 0x0008, 0x1250: 0x6695, 0x1251: 0x0008,
+ 0x1252: 0x66b5, 0x1253: 0x0008, 0x1254: 0x0008, 0x1255: 0x66d5, 0x1256: 0x66f5, 0x1257: 0x6715,
+ 0x1258: 0x6735, 0x1259: 0x6755, 0x125a: 0x6775, 0x125b: 0x6795, 0x125c: 0x67b5, 0x125d: 0x67d5,
+ 0x125e: 0x67f5, 0x125f: 0x0008, 0x1260: 0x6815, 0x1261: 0x0008, 0x1262: 0x6835, 0x1263: 0x0008,
+ 0x1264: 0x0008, 0x1265: 0x6855, 0x1266: 0x6875, 0x1267: 0x0008, 0x1268: 0x0008, 0x1269: 0x0008,
+ 0x126a: 0x6895, 0x126b: 0x68b5, 0x126c: 0x68d5, 0x126d: 0x68f5, 0x126e: 0x6915, 0x126f: 0x6935,
+ 0x1270: 0x6955, 0x1271: 0x6975, 0x1272: 0x6995, 0x1273: 0x69b5, 0x1274: 0x69d5, 0x1275: 0x69f5,
+ 0x1276: 0x6a15, 0x1277: 0x6a35, 0x1278: 0x6a55, 0x1279: 0x6a75, 0x127a: 0x6a95, 0x127b: 0x6ab5,
+ 0x127c: 0x6ad5, 0x127d: 0x6af5, 0x127e: 0x6b15, 0x127f: 0x6b35,
// Block 0x4a, offset 0x1280
- 0x1280: 0x74f1, 0x1281: 0x7519, 0x1282: 0x0040, 0x1283: 0x7541, 0x1284: 0x7569, 0x1285: 0x0040,
- 0x1286: 0x7591, 0x1287: 0x75b9, 0x1288: 0x75e1, 0x1289: 0x7609, 0x128a: 0x7631, 0x128b: 0x7659,
- 0x128c: 0x7681, 0x128d: 0x76a9, 0x128e: 0x76d1, 0x128f: 0x76f9, 0x1290: 0x7721, 0x1291: 0x7721,
- 0x1292: 0x7739, 0x1293: 0x7739, 0x1294: 0x7739, 0x1295: 0x7739, 0x1296: 0x7751, 0x1297: 0x7751,
- 0x1298: 0x7751, 0x1299: 0x7751, 0x129a: 0x7769, 0x129b: 0x7769, 0x129c: 0x7769, 0x129d: 0x7769,
- 0x129e: 0x7781, 0x129f: 0x7781, 0x12a0: 0x7781, 0x12a1: 0x7781, 0x12a2: 0x7799, 0x12a3: 0x7799,
- 0x12a4: 0x7799, 0x12a5: 0x7799, 0x12a6: 0x77b1, 0x12a7: 0x77b1, 0x12a8: 0x77b1, 0x12a9: 0x77b1,
- 0x12aa: 0x77c9, 0x12ab: 0x77c9, 0x12ac: 0x77c9, 0x12ad: 0x77c9, 0x12ae: 0x77e1, 0x12af: 0x77e1,
- 0x12b0: 0x77e1, 0x12b1: 0x77e1, 0x12b2: 0x77f9, 0x12b3: 0x77f9, 0x12b4: 0x77f9, 0x12b5: 0x77f9,
- 0x12b6: 0x7811, 0x12b7: 0x7811, 0x12b8: 0x7811, 0x12b9: 0x7811, 0x12ba: 0x7829, 0x12bb: 0x7829,
- 0x12bc: 0x7829, 0x12bd: 0x7829, 0x12be: 0x7841, 0x12bf: 0x7841,
+ 0x1280: 0x7a95, 0x1281: 0x7ab5, 0x1282: 0x7ad5, 0x1283: 0x7af5, 0x1284: 0x7b15, 0x1285: 0x7b35,
+ 0x1286: 0x7b55, 0x1287: 0x7b75, 0x1288: 0x7b95, 0x1289: 0x7bb5, 0x128a: 0x7bd5, 0x128b: 0x7bf5,
+ 0x128c: 0x7c15, 0x128d: 0x7c35, 0x128e: 0x7c55, 0x128f: 0x6ec9, 0x1290: 0x6ef1, 0x1291: 0x6f19,
+ 0x1292: 0x7c75, 0x1293: 0x7c95, 0x1294: 0x7cb5, 0x1295: 0x6f41, 0x1296: 0x6f69, 0x1297: 0x6f91,
+ 0x1298: 0x7cd5, 0x1299: 0x7cf5, 0x129a: 0x0040, 0x129b: 0x0040, 0x129c: 0x0040, 0x129d: 0x0040,
+ 0x129e: 0x0040, 0x129f: 0x0040, 0x12a0: 0x0040, 0x12a1: 0x0040, 0x12a2: 0x0040, 0x12a3: 0x0040,
+ 0x12a4: 0x0040, 0x12a5: 0x0040, 0x12a6: 0x0040, 0x12a7: 0x0040, 0x12a8: 0x0040, 0x12a9: 0x0040,
+ 0x12aa: 0x0040, 0x12ab: 0x0040, 0x12ac: 0x0040, 0x12ad: 0x0040, 0x12ae: 0x0040, 0x12af: 0x0040,
+ 0x12b0: 0x0040, 0x12b1: 0x0040, 0x12b2: 0x0040, 0x12b3: 0x0040, 0x12b4: 0x0040, 0x12b5: 0x0040,
+ 0x12b6: 0x0040, 0x12b7: 0x0040, 0x12b8: 0x0040, 0x12b9: 0x0040, 0x12ba: 0x0040, 0x12bb: 0x0040,
+ 0x12bc: 0x0040, 0x12bd: 0x0040, 0x12be: 0x0040, 0x12bf: 0x0040,
// Block 0x4b, offset 0x12c0
- 0x12c0: 0x7841, 0x12c1: 0x7841, 0x12c2: 0x7859, 0x12c3: 0x7859, 0x12c4: 0x7871, 0x12c5: 0x7871,
- 0x12c6: 0x7889, 0x12c7: 0x7889, 0x12c8: 0x78a1, 0x12c9: 0x78a1, 0x12ca: 0x78b9, 0x12cb: 0x78b9,
- 0x12cc: 0x78d1, 0x12cd: 0x78d1, 0x12ce: 0x78e9, 0x12cf: 0x78e9, 0x12d0: 0x78e9, 0x12d1: 0x78e9,
- 0x12d2: 0x7901, 0x12d3: 0x7901, 0x12d4: 0x7901, 0x12d5: 0x7901, 0x12d6: 0x7919, 0x12d7: 0x7919,
- 0x12d8: 0x7919, 0x12d9: 0x7919, 0x12da: 0x7931, 0x12db: 0x7931, 0x12dc: 0x7931, 0x12dd: 0x7931,
- 0x12de: 0x7949, 0x12df: 0x7949, 0x12e0: 0x7961, 0x12e1: 0x7961, 0x12e2: 0x7961, 0x12e3: 0x7961,
- 0x12e4: 0x7979, 0x12e5: 0x7979, 0x12e6: 0x7991, 0x12e7: 0x7991, 0x12e8: 0x7991, 0x12e9: 0x7991,
- 0x12ea: 0x79a9, 0x12eb: 0x79a9, 0x12ec: 0x79a9, 0x12ed: 0x79a9, 0x12ee: 0x79c1, 0x12ef: 0x79c1,
- 0x12f0: 0x79d9, 0x12f1: 0x79d9, 0x12f2: 0x0018, 0x12f3: 0x0018, 0x12f4: 0x0018, 0x12f5: 0x0018,
- 0x12f6: 0x0018, 0x12f7: 0x0018, 0x12f8: 0x0018, 0x12f9: 0x0018, 0x12fa: 0x0018, 0x12fb: 0x0018,
- 0x12fc: 0x0018, 0x12fd: 0x0018, 0x12fe: 0x0018, 0x12ff: 0x0018,
+ 0x12c0: 0x6fb9, 0x12c1: 0x6fd1, 0x12c2: 0x6fe9, 0x12c3: 0x7d15, 0x12c4: 0x7d35, 0x12c5: 0x7001,
+ 0x12c6: 0x7001, 0x12c7: 0x0040, 0x12c8: 0x0040, 0x12c9: 0x0040, 0x12ca: 0x0040, 0x12cb: 0x0040,
+ 0x12cc: 0x0040, 0x12cd: 0x0040, 0x12ce: 0x0040, 0x12cf: 0x0040, 0x12d0: 0x0040, 0x12d1: 0x0040,
+ 0x12d2: 0x0040, 0x12d3: 0x7019, 0x12d4: 0x7041, 0x12d5: 0x7069, 0x12d6: 0x7091, 0x12d7: 0x70b9,
+ 0x12d8: 0x0040, 0x12d9: 0x0040, 0x12da: 0x0040, 0x12db: 0x0040, 0x12dc: 0x0040, 0x12dd: 0x70e1,
+ 0x12de: 0x3308, 0x12df: 0x7109, 0x12e0: 0x7131, 0x12e1: 0x20a9, 0x12e2: 0x20f1, 0x12e3: 0x7149,
+ 0x12e4: 0x7161, 0x12e5: 0x7179, 0x12e6: 0x7191, 0x12e7: 0x71a9, 0x12e8: 0x71c1, 0x12e9: 0x1fb2,
+ 0x12ea: 0x71d9, 0x12eb: 0x7201, 0x12ec: 0x7229, 0x12ed: 0x7261, 0x12ee: 0x7299, 0x12ef: 0x72c1,
+ 0x12f0: 0x72e9, 0x12f1: 0x7311, 0x12f2: 0x7339, 0x12f3: 0x7361, 0x12f4: 0x7389, 0x12f5: 0x73b1,
+ 0x12f6: 0x73d9, 0x12f7: 0x0040, 0x12f8: 0x7401, 0x12f9: 0x7429, 0x12fa: 0x7451, 0x12fb: 0x7479,
+ 0x12fc: 0x74a1, 0x12fd: 0x0040, 0x12fe: 0x74c9, 0x12ff: 0x0040,
// Block 0x4c, offset 0x1300
- 0x1300: 0x0018, 0x1301: 0x0018, 0x1302: 0x0040, 0x1303: 0x0040, 0x1304: 0x0040, 0x1305: 0x0040,
- 0x1306: 0x0040, 0x1307: 0x0040, 0x1308: 0x0040, 0x1309: 0x0040, 0x130a: 0x0040, 0x130b: 0x0040,
- 0x130c: 0x0040, 0x130d: 0x0040, 0x130e: 0x0040, 0x130f: 0x0040, 0x1310: 0x0040, 0x1311: 0x0040,
- 0x1312: 0x0040, 0x1313: 0x79f1, 0x1314: 0x79f1, 0x1315: 0x79f1, 0x1316: 0x79f1, 0x1317: 0x7a09,
- 0x1318: 0x7a09, 0x1319: 0x7a21, 0x131a: 0x7a21, 0x131b: 0x7a39, 0x131c: 0x7a39, 0x131d: 0x0479,
- 0x131e: 0x7a51, 0x131f: 0x7a51, 0x1320: 0x7a69, 0x1321: 0x7a69, 0x1322: 0x7a81, 0x1323: 0x7a81,
- 0x1324: 0x7a99, 0x1325: 0x7a99, 0x1326: 0x7a99, 0x1327: 0x7a99, 0x1328: 0x7ab1, 0x1329: 0x7ab1,
- 0x132a: 0x7ac9, 0x132b: 0x7ac9, 0x132c: 0x7af1, 0x132d: 0x7af1, 0x132e: 0x7b19, 0x132f: 0x7b19,
- 0x1330: 0x7b41, 0x1331: 0x7b41, 0x1332: 0x7b69, 0x1333: 0x7b69, 0x1334: 0x7b91, 0x1335: 0x7b91,
- 0x1336: 0x7bb9, 0x1337: 0x7bb9, 0x1338: 0x7bb9, 0x1339: 0x7be1, 0x133a: 0x7be1, 0x133b: 0x7be1,
- 0x133c: 0x7c09, 0x133d: 0x7c09, 0x133e: 0x7c09, 0x133f: 0x7c09,
+ 0x1300: 0x74f1, 0x1301: 0x7519, 0x1302: 0x0040, 0x1303: 0x7541, 0x1304: 0x7569, 0x1305: 0x0040,
+ 0x1306: 0x7591, 0x1307: 0x75b9, 0x1308: 0x75e1, 0x1309: 0x7609, 0x130a: 0x7631, 0x130b: 0x7659,
+ 0x130c: 0x7681, 0x130d: 0x76a9, 0x130e: 0x76d1, 0x130f: 0x76f9, 0x1310: 0x7721, 0x1311: 0x7721,
+ 0x1312: 0x7739, 0x1313: 0x7739, 0x1314: 0x7739, 0x1315: 0x7739, 0x1316: 0x7751, 0x1317: 0x7751,
+ 0x1318: 0x7751, 0x1319: 0x7751, 0x131a: 0x7769, 0x131b: 0x7769, 0x131c: 0x7769, 0x131d: 0x7769,
+ 0x131e: 0x7781, 0x131f: 0x7781, 0x1320: 0x7781, 0x1321: 0x7781, 0x1322: 0x7799, 0x1323: 0x7799,
+ 0x1324: 0x7799, 0x1325: 0x7799, 0x1326: 0x77b1, 0x1327: 0x77b1, 0x1328: 0x77b1, 0x1329: 0x77b1,
+ 0x132a: 0x77c9, 0x132b: 0x77c9, 0x132c: 0x77c9, 0x132d: 0x77c9, 0x132e: 0x77e1, 0x132f: 0x77e1,
+ 0x1330: 0x77e1, 0x1331: 0x77e1, 0x1332: 0x77f9, 0x1333: 0x77f9, 0x1334: 0x77f9, 0x1335: 0x77f9,
+ 0x1336: 0x7811, 0x1337: 0x7811, 0x1338: 0x7811, 0x1339: 0x7811, 0x133a: 0x7829, 0x133b: 0x7829,
+ 0x133c: 0x7829, 0x133d: 0x7829, 0x133e: 0x7841, 0x133f: 0x7841,
// Block 0x4d, offset 0x1340
- 0x1340: 0x85f9, 0x1341: 0x8621, 0x1342: 0x8649, 0x1343: 0x8671, 0x1344: 0x8699, 0x1345: 0x86c1,
- 0x1346: 0x86e9, 0x1347: 0x8711, 0x1348: 0x8739, 0x1349: 0x8761, 0x134a: 0x8789, 0x134b: 0x87b1,
- 0x134c: 0x87d9, 0x134d: 0x8801, 0x134e: 0x8829, 0x134f: 0x8851, 0x1350: 0x8879, 0x1351: 0x88a1,
- 0x1352: 0x88c9, 0x1353: 0x88f1, 0x1354: 0x8919, 0x1355: 0x8941, 0x1356: 0x8969, 0x1357: 0x8991,
- 0x1358: 0x89b9, 0x1359: 0x89e1, 0x135a: 0x8a09, 0x135b: 0x8a31, 0x135c: 0x8a59, 0x135d: 0x8a81,
- 0x135e: 0x8aaa, 0x135f: 0x8ada, 0x1360: 0x8b0a, 0x1361: 0x8b3a, 0x1362: 0x8b6a, 0x1363: 0x8b9a,
- 0x1364: 0x8bc9, 0x1365: 0x8bf1, 0x1366: 0x7c71, 0x1367: 0x8c19, 0x1368: 0x7be1, 0x1369: 0x7c99,
- 0x136a: 0x8c41, 0x136b: 0x8c69, 0x136c: 0x7d39, 0x136d: 0x8c91, 0x136e: 0x7d61, 0x136f: 0x7d89,
- 0x1370: 0x8cb9, 0x1371: 0x8ce1, 0x1372: 0x7e29, 0x1373: 0x8d09, 0x1374: 0x7e51, 0x1375: 0x7e79,
- 0x1376: 0x8d31, 0x1377: 0x8d59, 0x1378: 0x7ec9, 0x1379: 0x8d81, 0x137a: 0x7ef1, 0x137b: 0x7f19,
- 0x137c: 0x83a1, 0x137d: 0x83c9, 0x137e: 0x8441, 0x137f: 0x8469,
+ 0x1340: 0x7841, 0x1341: 0x7841, 0x1342: 0x7859, 0x1343: 0x7859, 0x1344: 0x7871, 0x1345: 0x7871,
+ 0x1346: 0x7889, 0x1347: 0x7889, 0x1348: 0x78a1, 0x1349: 0x78a1, 0x134a: 0x78b9, 0x134b: 0x78b9,
+ 0x134c: 0x78d1, 0x134d: 0x78d1, 0x134e: 0x78e9, 0x134f: 0x78e9, 0x1350: 0x78e9, 0x1351: 0x78e9,
+ 0x1352: 0x7901, 0x1353: 0x7901, 0x1354: 0x7901, 0x1355: 0x7901, 0x1356: 0x7919, 0x1357: 0x7919,
+ 0x1358: 0x7919, 0x1359: 0x7919, 0x135a: 0x7931, 0x135b: 0x7931, 0x135c: 0x7931, 0x135d: 0x7931,
+ 0x135e: 0x7949, 0x135f: 0x7949, 0x1360: 0x7961, 0x1361: 0x7961, 0x1362: 0x7961, 0x1363: 0x7961,
+ 0x1364: 0x7979, 0x1365: 0x7979, 0x1366: 0x7991, 0x1367: 0x7991, 0x1368: 0x7991, 0x1369: 0x7991,
+ 0x136a: 0x79a9, 0x136b: 0x79a9, 0x136c: 0x79a9, 0x136d: 0x79a9, 0x136e: 0x79c1, 0x136f: 0x79c1,
+ 0x1370: 0x79d9, 0x1371: 0x79d9, 0x1372: 0x0818, 0x1373: 0x0818, 0x1374: 0x0818, 0x1375: 0x0818,
+ 0x1376: 0x0818, 0x1377: 0x0818, 0x1378: 0x0818, 0x1379: 0x0818, 0x137a: 0x0818, 0x137b: 0x0818,
+ 0x137c: 0x0818, 0x137d: 0x0818, 0x137e: 0x0818, 0x137f: 0x0818,
// Block 0x4e, offset 0x1380
- 0x1380: 0x8491, 0x1381: 0x8531, 0x1382: 0x8559, 0x1383: 0x8581, 0x1384: 0x85a9, 0x1385: 0x8649,
- 0x1386: 0x8671, 0x1387: 0x8699, 0x1388: 0x8da9, 0x1389: 0x8739, 0x138a: 0x8dd1, 0x138b: 0x8df9,
- 0x138c: 0x8829, 0x138d: 0x8e21, 0x138e: 0x8851, 0x138f: 0x8879, 0x1390: 0x8a81, 0x1391: 0x8e49,
- 0x1392: 0x8e71, 0x1393: 0x89b9, 0x1394: 0x8e99, 0x1395: 0x89e1, 0x1396: 0x8a09, 0x1397: 0x7c21,
- 0x1398: 0x7c49, 0x1399: 0x8ec1, 0x139a: 0x7c71, 0x139b: 0x8ee9, 0x139c: 0x7cc1, 0x139d: 0x7ce9,
- 0x139e: 0x7d11, 0x139f: 0x7d39, 0x13a0: 0x8f11, 0x13a1: 0x7db1, 0x13a2: 0x7dd9, 0x13a3: 0x7e01,
- 0x13a4: 0x7e29, 0x13a5: 0x8f39, 0x13a6: 0x7ec9, 0x13a7: 0x7f41, 0x13a8: 0x7f69, 0x13a9: 0x7f91,
- 0x13aa: 0x7fb9, 0x13ab: 0x7fe1, 0x13ac: 0x8031, 0x13ad: 0x8059, 0x13ae: 0x8081, 0x13af: 0x80a9,
- 0x13b0: 0x80d1, 0x13b1: 0x80f9, 0x13b2: 0x8f61, 0x13b3: 0x8121, 0x13b4: 0x8149, 0x13b5: 0x8171,
- 0x13b6: 0x8199, 0x13b7: 0x81c1, 0x13b8: 0x81e9, 0x13b9: 0x8239, 0x13ba: 0x8261, 0x13bb: 0x8289,
- 0x13bc: 0x82b1, 0x13bd: 0x82d9, 0x13be: 0x8301, 0x13bf: 0x8329,
+ 0x1380: 0x0818, 0x1381: 0x0818, 0x1382: 0x0040, 0x1383: 0x0040, 0x1384: 0x0040, 0x1385: 0x0040,
+ 0x1386: 0x0040, 0x1387: 0x0040, 0x1388: 0x0040, 0x1389: 0x0040, 0x138a: 0x0040, 0x138b: 0x0040,
+ 0x138c: 0x0040, 0x138d: 0x0040, 0x138e: 0x0040, 0x138f: 0x0040, 0x1390: 0x0040, 0x1391: 0x0040,
+ 0x1392: 0x0040, 0x1393: 0x79f1, 0x1394: 0x79f1, 0x1395: 0x79f1, 0x1396: 0x79f1, 0x1397: 0x7a09,
+ 0x1398: 0x7a09, 0x1399: 0x7a21, 0x139a: 0x7a21, 0x139b: 0x7a39, 0x139c: 0x7a39, 0x139d: 0x0479,
+ 0x139e: 0x7a51, 0x139f: 0x7a51, 0x13a0: 0x7a69, 0x13a1: 0x7a69, 0x13a2: 0x7a81, 0x13a3: 0x7a81,
+ 0x13a4: 0x7a99, 0x13a5: 0x7a99, 0x13a6: 0x7a99, 0x13a7: 0x7a99, 0x13a8: 0x7ab1, 0x13a9: 0x7ab1,
+ 0x13aa: 0x7ac9, 0x13ab: 0x7ac9, 0x13ac: 0x7af1, 0x13ad: 0x7af1, 0x13ae: 0x7b19, 0x13af: 0x7b19,
+ 0x13b0: 0x7b41, 0x13b1: 0x7b41, 0x13b2: 0x7b69, 0x13b3: 0x7b69, 0x13b4: 0x7b91, 0x13b5: 0x7b91,
+ 0x13b6: 0x7bb9, 0x13b7: 0x7bb9, 0x13b8: 0x7bb9, 0x13b9: 0x7be1, 0x13ba: 0x7be1, 0x13bb: 0x7be1,
+ 0x13bc: 0x7c09, 0x13bd: 0x7c09, 0x13be: 0x7c09, 0x13bf: 0x7c09,
// Block 0x4f, offset 0x13c0
- 0x13c0: 0x8351, 0x13c1: 0x8379, 0x13c2: 0x83f1, 0x13c3: 0x8419, 0x13c4: 0x84b9, 0x13c5: 0x84e1,
- 0x13c6: 0x8509, 0x13c7: 0x8531, 0x13c8: 0x8559, 0x13c9: 0x85d1, 0x13ca: 0x85f9, 0x13cb: 0x8621,
- 0x13cc: 0x8649, 0x13cd: 0x8f89, 0x13ce: 0x86c1, 0x13cf: 0x86e9, 0x13d0: 0x8711, 0x13d1: 0x8739,
- 0x13d2: 0x87b1, 0x13d3: 0x87d9, 0x13d4: 0x8801, 0x13d5: 0x8829, 0x13d6: 0x8fb1, 0x13d7: 0x88a1,
- 0x13d8: 0x88c9, 0x13d9: 0x8fd9, 0x13da: 0x8941, 0x13db: 0x8969, 0x13dc: 0x8991, 0x13dd: 0x89b9,
- 0x13de: 0x9001, 0x13df: 0x7c71, 0x13e0: 0x8ee9, 0x13e1: 0x7d39, 0x13e2: 0x8f11, 0x13e3: 0x7e29,
- 0x13e4: 0x8f39, 0x13e5: 0x7ec9, 0x13e6: 0x9029, 0x13e7: 0x80d1, 0x13e8: 0x9051, 0x13e9: 0x9079,
- 0x13ea: 0x90a1, 0x13eb: 0x8531, 0x13ec: 0x8559, 0x13ed: 0x8649, 0x13ee: 0x8829, 0x13ef: 0x8fb1,
- 0x13f0: 0x89b9, 0x13f1: 0x9001, 0x13f2: 0x90c9, 0x13f3: 0x9101, 0x13f4: 0x9139, 0x13f5: 0x9171,
- 0x13f6: 0x9199, 0x13f7: 0x91c1, 0x13f8: 0x91e9, 0x13f9: 0x9211, 0x13fa: 0x9239, 0x13fb: 0x9261,
- 0x13fc: 0x9289, 0x13fd: 0x92b1, 0x13fe: 0x92d9, 0x13ff: 0x9301,
+ 0x13c0: 0x85f9, 0x13c1: 0x8621, 0x13c2: 0x8649, 0x13c3: 0x8671, 0x13c4: 0x8699, 0x13c5: 0x86c1,
+ 0x13c6: 0x86e9, 0x13c7: 0x8711, 0x13c8: 0x8739, 0x13c9: 0x8761, 0x13ca: 0x8789, 0x13cb: 0x87b1,
+ 0x13cc: 0x87d9, 0x13cd: 0x8801, 0x13ce: 0x8829, 0x13cf: 0x8851, 0x13d0: 0x8879, 0x13d1: 0x88a1,
+ 0x13d2: 0x88c9, 0x13d3: 0x88f1, 0x13d4: 0x8919, 0x13d5: 0x8941, 0x13d6: 0x8969, 0x13d7: 0x8991,
+ 0x13d8: 0x89b9, 0x13d9: 0x89e1, 0x13da: 0x8a09, 0x13db: 0x8a31, 0x13dc: 0x8a59, 0x13dd: 0x8a81,
+ 0x13de: 0x8aaa, 0x13df: 0x8ada, 0x13e0: 0x8b0a, 0x13e1: 0x8b3a, 0x13e2: 0x8b6a, 0x13e3: 0x8b9a,
+ 0x13e4: 0x8bc9, 0x13e5: 0x8bf1, 0x13e6: 0x7c71, 0x13e7: 0x8c19, 0x13e8: 0x7be1, 0x13e9: 0x7c99,
+ 0x13ea: 0x8c41, 0x13eb: 0x8c69, 0x13ec: 0x7d39, 0x13ed: 0x8c91, 0x13ee: 0x7d61, 0x13ef: 0x7d89,
+ 0x13f0: 0x8cb9, 0x13f1: 0x8ce1, 0x13f2: 0x7e29, 0x13f3: 0x8d09, 0x13f4: 0x7e51, 0x13f5: 0x7e79,
+ 0x13f6: 0x8d31, 0x13f7: 0x8d59, 0x13f8: 0x7ec9, 0x13f9: 0x8d81, 0x13fa: 0x7ef1, 0x13fb: 0x7f19,
+ 0x13fc: 0x83a1, 0x13fd: 0x83c9, 0x13fe: 0x8441, 0x13ff: 0x8469,
// Block 0x50, offset 0x1400
- 0x1400: 0x9329, 0x1401: 0x9351, 0x1402: 0x9379, 0x1403: 0x93a1, 0x1404: 0x93c9, 0x1405: 0x93f1,
- 0x1406: 0x9419, 0x1407: 0x9441, 0x1408: 0x9469, 0x1409: 0x9491, 0x140a: 0x94b9, 0x140b: 0x94e1,
- 0x140c: 0x9079, 0x140d: 0x9509, 0x140e: 0x9531, 0x140f: 0x9559, 0x1410: 0x9581, 0x1411: 0x9171,
- 0x1412: 0x9199, 0x1413: 0x91c1, 0x1414: 0x91e9, 0x1415: 0x9211, 0x1416: 0x9239, 0x1417: 0x9261,
- 0x1418: 0x9289, 0x1419: 0x92b1, 0x141a: 0x92d9, 0x141b: 0x9301, 0x141c: 0x9329, 0x141d: 0x9351,
- 0x141e: 0x9379, 0x141f: 0x93a1, 0x1420: 0x93c9, 0x1421: 0x93f1, 0x1422: 0x9419, 0x1423: 0x9441,
- 0x1424: 0x9469, 0x1425: 0x9491, 0x1426: 0x94b9, 0x1427: 0x94e1, 0x1428: 0x9079, 0x1429: 0x9509,
- 0x142a: 0x9531, 0x142b: 0x9559, 0x142c: 0x9581, 0x142d: 0x9491, 0x142e: 0x94b9, 0x142f: 0x94e1,
- 0x1430: 0x9079, 0x1431: 0x9051, 0x1432: 0x90a1, 0x1433: 0x8211, 0x1434: 0x8059, 0x1435: 0x8081,
- 0x1436: 0x80a9, 0x1437: 0x9491, 0x1438: 0x94b9, 0x1439: 0x94e1, 0x143a: 0x8211, 0x143b: 0x8239,
- 0x143c: 0x95a9, 0x143d: 0x95a9, 0x143e: 0x0018, 0x143f: 0x0018,
+ 0x1400: 0x8491, 0x1401: 0x8531, 0x1402: 0x8559, 0x1403: 0x8581, 0x1404: 0x85a9, 0x1405: 0x8649,
+ 0x1406: 0x8671, 0x1407: 0x8699, 0x1408: 0x8da9, 0x1409: 0x8739, 0x140a: 0x8dd1, 0x140b: 0x8df9,
+ 0x140c: 0x8829, 0x140d: 0x8e21, 0x140e: 0x8851, 0x140f: 0x8879, 0x1410: 0x8a81, 0x1411: 0x8e49,
+ 0x1412: 0x8e71, 0x1413: 0x89b9, 0x1414: 0x8e99, 0x1415: 0x89e1, 0x1416: 0x8a09, 0x1417: 0x7c21,
+ 0x1418: 0x7c49, 0x1419: 0x8ec1, 0x141a: 0x7c71, 0x141b: 0x8ee9, 0x141c: 0x7cc1, 0x141d: 0x7ce9,
+ 0x141e: 0x7d11, 0x141f: 0x7d39, 0x1420: 0x8f11, 0x1421: 0x7db1, 0x1422: 0x7dd9, 0x1423: 0x7e01,
+ 0x1424: 0x7e29, 0x1425: 0x8f39, 0x1426: 0x7ec9, 0x1427: 0x7f41, 0x1428: 0x7f69, 0x1429: 0x7f91,
+ 0x142a: 0x7fb9, 0x142b: 0x7fe1, 0x142c: 0x8031, 0x142d: 0x8059, 0x142e: 0x8081, 0x142f: 0x80a9,
+ 0x1430: 0x80d1, 0x1431: 0x80f9, 0x1432: 0x8f61, 0x1433: 0x8121, 0x1434: 0x8149, 0x1435: 0x8171,
+ 0x1436: 0x8199, 0x1437: 0x81c1, 0x1438: 0x81e9, 0x1439: 0x8239, 0x143a: 0x8261, 0x143b: 0x8289,
+ 0x143c: 0x82b1, 0x143d: 0x82d9, 0x143e: 0x8301, 0x143f: 0x8329,
// Block 0x51, offset 0x1440
- 0x1440: 0x0040, 0x1441: 0x0040, 0x1442: 0x0040, 0x1443: 0x0040, 0x1444: 0x0040, 0x1445: 0x0040,
- 0x1446: 0x0040, 0x1447: 0x0040, 0x1448: 0x0040, 0x1449: 0x0040, 0x144a: 0x0040, 0x144b: 0x0040,
- 0x144c: 0x0040, 0x144d: 0x0040, 0x144e: 0x0040, 0x144f: 0x0040, 0x1450: 0x95d1, 0x1451: 0x9609,
- 0x1452: 0x9609, 0x1453: 0x9641, 0x1454: 0x9679, 0x1455: 0x96b1, 0x1456: 0x96e9, 0x1457: 0x9721,
- 0x1458: 0x9759, 0x1459: 0x9759, 0x145a: 0x9791, 0x145b: 0x97c9, 0x145c: 0x9801, 0x145d: 0x9839,
- 0x145e: 0x9871, 0x145f: 0x98a9, 0x1460: 0x98a9, 0x1461: 0x98e1, 0x1462: 0x9919, 0x1463: 0x9919,
- 0x1464: 0x9951, 0x1465: 0x9951, 0x1466: 0x9989, 0x1467: 0x99c1, 0x1468: 0x99c1, 0x1469: 0x99f9,
- 0x146a: 0x9a31, 0x146b: 0x9a31, 0x146c: 0x9a69, 0x146d: 0x9a69, 0x146e: 0x9aa1, 0x146f: 0x9ad9,
- 0x1470: 0x9ad9, 0x1471: 0x9b11, 0x1472: 0x9b11, 0x1473: 0x9b49, 0x1474: 0x9b81, 0x1475: 0x9bb9,
- 0x1476: 0x9bf1, 0x1477: 0x9bf1, 0x1478: 0x9c29, 0x1479: 0x9c61, 0x147a: 0x9c99, 0x147b: 0x9cd1,
- 0x147c: 0x9d09, 0x147d: 0x9d09, 0x147e: 0x9d41, 0x147f: 0x9d79,
+ 0x1440: 0x8351, 0x1441: 0x8379, 0x1442: 0x83f1, 0x1443: 0x8419, 0x1444: 0x84b9, 0x1445: 0x84e1,
+ 0x1446: 0x8509, 0x1447: 0x8531, 0x1448: 0x8559, 0x1449: 0x85d1, 0x144a: 0x85f9, 0x144b: 0x8621,
+ 0x144c: 0x8649, 0x144d: 0x8f89, 0x144e: 0x86c1, 0x144f: 0x86e9, 0x1450: 0x8711, 0x1451: 0x8739,
+ 0x1452: 0x87b1, 0x1453: 0x87d9, 0x1454: 0x8801, 0x1455: 0x8829, 0x1456: 0x8fb1, 0x1457: 0x88a1,
+ 0x1458: 0x88c9, 0x1459: 0x8fd9, 0x145a: 0x8941, 0x145b: 0x8969, 0x145c: 0x8991, 0x145d: 0x89b9,
+ 0x145e: 0x9001, 0x145f: 0x7c71, 0x1460: 0x8ee9, 0x1461: 0x7d39, 0x1462: 0x8f11, 0x1463: 0x7e29,
+ 0x1464: 0x8f39, 0x1465: 0x7ec9, 0x1466: 0x9029, 0x1467: 0x80d1, 0x1468: 0x9051, 0x1469: 0x9079,
+ 0x146a: 0x90a1, 0x146b: 0x8531, 0x146c: 0x8559, 0x146d: 0x8649, 0x146e: 0x8829, 0x146f: 0x8fb1,
+ 0x1470: 0x89b9, 0x1471: 0x9001, 0x1472: 0x90c9, 0x1473: 0x9101, 0x1474: 0x9139, 0x1475: 0x9171,
+ 0x1476: 0x9199, 0x1477: 0x91c1, 0x1478: 0x91e9, 0x1479: 0x9211, 0x147a: 0x9239, 0x147b: 0x9261,
+ 0x147c: 0x9289, 0x147d: 0x92b1, 0x147e: 0x92d9, 0x147f: 0x9301,
// Block 0x52, offset 0x1480
- 0x1480: 0xa949, 0x1481: 0xa981, 0x1482: 0xa9b9, 0x1483: 0xa8a1, 0x1484: 0x9bb9, 0x1485: 0x9989,
- 0x1486: 0xa9f1, 0x1487: 0xaa29, 0x1488: 0x0040, 0x1489: 0x0040, 0x148a: 0x0040, 0x148b: 0x0040,
- 0x148c: 0x0040, 0x148d: 0x0040, 0x148e: 0x0040, 0x148f: 0x0040, 0x1490: 0x0040, 0x1491: 0x0040,
- 0x1492: 0x0040, 0x1493: 0x0040, 0x1494: 0x0040, 0x1495: 0x0040, 0x1496: 0x0040, 0x1497: 0x0040,
- 0x1498: 0x0040, 0x1499: 0x0040, 0x149a: 0x0040, 0x149b: 0x0040, 0x149c: 0x0040, 0x149d: 0x0040,
- 0x149e: 0x0040, 0x149f: 0x0040, 0x14a0: 0x0040, 0x14a1: 0x0040, 0x14a2: 0x0040, 0x14a3: 0x0040,
- 0x14a4: 0x0040, 0x14a5: 0x0040, 0x14a6: 0x0040, 0x14a7: 0x0040, 0x14a8: 0x0040, 0x14a9: 0x0040,
- 0x14aa: 0x0040, 0x14ab: 0x0040, 0x14ac: 0x0040, 0x14ad: 0x0040, 0x14ae: 0x0040, 0x14af: 0x0040,
- 0x14b0: 0xaa61, 0x14b1: 0xaa99, 0x14b2: 0xaad1, 0x14b3: 0xab19, 0x14b4: 0xab61, 0x14b5: 0xaba9,
- 0x14b6: 0xabf1, 0x14b7: 0xac39, 0x14b8: 0xac81, 0x14b9: 0xacc9, 0x14ba: 0xad02, 0x14bb: 0xae12,
- 0x14bc: 0xae91, 0x14bd: 0x0018, 0x14be: 0x0040, 0x14bf: 0x0040,
+ 0x1480: 0x9329, 0x1481: 0x9351, 0x1482: 0x9379, 0x1483: 0x93a1, 0x1484: 0x93c9, 0x1485: 0x93f1,
+ 0x1486: 0x9419, 0x1487: 0x9441, 0x1488: 0x9469, 0x1489: 0x9491, 0x148a: 0x94b9, 0x148b: 0x94e1,
+ 0x148c: 0x9079, 0x148d: 0x9509, 0x148e: 0x9531, 0x148f: 0x9559, 0x1490: 0x9581, 0x1491: 0x9171,
+ 0x1492: 0x9199, 0x1493: 0x91c1, 0x1494: 0x91e9, 0x1495: 0x9211, 0x1496: 0x9239, 0x1497: 0x9261,
+ 0x1498: 0x9289, 0x1499: 0x92b1, 0x149a: 0x92d9, 0x149b: 0x9301, 0x149c: 0x9329, 0x149d: 0x9351,
+ 0x149e: 0x9379, 0x149f: 0x93a1, 0x14a0: 0x93c9, 0x14a1: 0x93f1, 0x14a2: 0x9419, 0x14a3: 0x9441,
+ 0x14a4: 0x9469, 0x14a5: 0x9491, 0x14a6: 0x94b9, 0x14a7: 0x94e1, 0x14a8: 0x9079, 0x14a9: 0x9509,
+ 0x14aa: 0x9531, 0x14ab: 0x9559, 0x14ac: 0x9581, 0x14ad: 0x9491, 0x14ae: 0x94b9, 0x14af: 0x94e1,
+ 0x14b0: 0x9079, 0x14b1: 0x9051, 0x14b2: 0x90a1, 0x14b3: 0x8211, 0x14b4: 0x8059, 0x14b5: 0x8081,
+ 0x14b6: 0x80a9, 0x14b7: 0x9491, 0x14b8: 0x94b9, 0x14b9: 0x94e1, 0x14ba: 0x8211, 0x14bb: 0x8239,
+ 0x14bc: 0x95a9, 0x14bd: 0x95a9, 0x14be: 0x0018, 0x14bf: 0x0018,
// Block 0x53, offset 0x14c0
- 0x14c0: 0x13c0, 0x14c1: 0x13c0, 0x14c2: 0x13c0, 0x14c3: 0x13c0, 0x14c4: 0x13c0, 0x14c5: 0x13c0,
- 0x14c6: 0x13c0, 0x14c7: 0x13c0, 0x14c8: 0x13c0, 0x14c9: 0x13c0, 0x14ca: 0x13c0, 0x14cb: 0x13c0,
- 0x14cc: 0x13c0, 0x14cd: 0x13c0, 0x14ce: 0x13c0, 0x14cf: 0x13c0, 0x14d0: 0xaeda, 0x14d1: 0x7d55,
- 0x14d2: 0x0040, 0x14d3: 0xaeea, 0x14d4: 0x03c2, 0x14d5: 0xaefa, 0x14d6: 0xaf0a, 0x14d7: 0x7d75,
- 0x14d8: 0x7d95, 0x14d9: 0x0040, 0x14da: 0x0040, 0x14db: 0x0040, 0x14dc: 0x0040, 0x14dd: 0x0040,
- 0x14de: 0x0040, 0x14df: 0x0040, 0x14e0: 0x1308, 0x14e1: 0x1308, 0x14e2: 0x1308, 0x14e3: 0x1308,
- 0x14e4: 0x1308, 0x14e5: 0x1308, 0x14e6: 0x1308, 0x14e7: 0x1308, 0x14e8: 0x1308, 0x14e9: 0x1308,
- 0x14ea: 0x1308, 0x14eb: 0x1308, 0x14ec: 0x1308, 0x14ed: 0x1308, 0x14ee: 0x1308, 0x14ef: 0x1308,
- 0x14f0: 0x0040, 0x14f1: 0x7db5, 0x14f2: 0x7dd5, 0x14f3: 0xaf1a, 0x14f4: 0xaf1a, 0x14f5: 0x1fd2,
- 0x14f6: 0x1fe2, 0x14f7: 0xaf2a, 0x14f8: 0xaf3a, 0x14f9: 0x7df5, 0x14fa: 0x7e15, 0x14fb: 0x7e35,
- 0x14fc: 0x7df5, 0x14fd: 0x7e55, 0x14fe: 0x7e75, 0x14ff: 0x7e55,
+ 0x14c0: 0x0040, 0x14c1: 0x0040, 0x14c2: 0x0040, 0x14c3: 0x0040, 0x14c4: 0x0040, 0x14c5: 0x0040,
+ 0x14c6: 0x0040, 0x14c7: 0x0040, 0x14c8: 0x0040, 0x14c9: 0x0040, 0x14ca: 0x0040, 0x14cb: 0x0040,
+ 0x14cc: 0x0040, 0x14cd: 0x0040, 0x14ce: 0x0040, 0x14cf: 0x0040, 0x14d0: 0x95d1, 0x14d1: 0x9609,
+ 0x14d2: 0x9609, 0x14d3: 0x9641, 0x14d4: 0x9679, 0x14d5: 0x96b1, 0x14d6: 0x96e9, 0x14d7: 0x9721,
+ 0x14d8: 0x9759, 0x14d9: 0x9759, 0x14da: 0x9791, 0x14db: 0x97c9, 0x14dc: 0x9801, 0x14dd: 0x9839,
+ 0x14de: 0x9871, 0x14df: 0x98a9, 0x14e0: 0x98a9, 0x14e1: 0x98e1, 0x14e2: 0x9919, 0x14e3: 0x9919,
+ 0x14e4: 0x9951, 0x14e5: 0x9951, 0x14e6: 0x9989, 0x14e7: 0x99c1, 0x14e8: 0x99c1, 0x14e9: 0x99f9,
+ 0x14ea: 0x9a31, 0x14eb: 0x9a31, 0x14ec: 0x9a69, 0x14ed: 0x9a69, 0x14ee: 0x9aa1, 0x14ef: 0x9ad9,
+ 0x14f0: 0x9ad9, 0x14f1: 0x9b11, 0x14f2: 0x9b11, 0x14f3: 0x9b49, 0x14f4: 0x9b81, 0x14f5: 0x9bb9,
+ 0x14f6: 0x9bf1, 0x14f7: 0x9bf1, 0x14f8: 0x9c29, 0x14f9: 0x9c61, 0x14fa: 0x9c99, 0x14fb: 0x9cd1,
+ 0x14fc: 0x9d09, 0x14fd: 0x9d09, 0x14fe: 0x9d41, 0x14ff: 0x9d79,
// Block 0x54, offset 0x1500
- 0x1500: 0x7e95, 0x1501: 0x7eb5, 0x1502: 0x7ed5, 0x1503: 0x7eb5, 0x1504: 0x7ef5, 0x1505: 0x0018,
- 0x1506: 0x0018, 0x1507: 0xaf4a, 0x1508: 0xaf5a, 0x1509: 0x7f16, 0x150a: 0x7f36, 0x150b: 0x7f56,
- 0x150c: 0x7f76, 0x150d: 0xaf1a, 0x150e: 0xaf1a, 0x150f: 0xaf1a, 0x1510: 0xaeda, 0x1511: 0x7f95,
- 0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x03c2, 0x1515: 0xaeea, 0x1516: 0xaf0a, 0x1517: 0xaefa,
- 0x1518: 0x7fb5, 0x1519: 0x1fd2, 0x151a: 0x1fe2, 0x151b: 0xaf2a, 0x151c: 0xaf3a, 0x151d: 0x7e95,
- 0x151e: 0x7ef5, 0x151f: 0xaf6a, 0x1520: 0xaf7a, 0x1521: 0xaf8a, 0x1522: 0x1fb2, 0x1523: 0xaf99,
- 0x1524: 0xafaa, 0x1525: 0xafba, 0x1526: 0x1fc2, 0x1527: 0x0040, 0x1528: 0xafca, 0x1529: 0xafda,
- 0x152a: 0xafea, 0x152b: 0xaffa, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040,
- 0x1530: 0x7fd6, 0x1531: 0xb009, 0x1532: 0x7ff6, 0x1533: 0x0008, 0x1534: 0x8016, 0x1535: 0x0040,
- 0x1536: 0x8036, 0x1537: 0xb031, 0x1538: 0x8056, 0x1539: 0xb059, 0x153a: 0x8076, 0x153b: 0xb081,
- 0x153c: 0x8096, 0x153d: 0xb0a9, 0x153e: 0x80b6, 0x153f: 0xb0d1,
+ 0x1500: 0xa949, 0x1501: 0xa981, 0x1502: 0xa9b9, 0x1503: 0xa8a1, 0x1504: 0x9bb9, 0x1505: 0x9989,
+ 0x1506: 0xa9f1, 0x1507: 0xaa29, 0x1508: 0x0040, 0x1509: 0x0040, 0x150a: 0x0040, 0x150b: 0x0040,
+ 0x150c: 0x0040, 0x150d: 0x0040, 0x150e: 0x0040, 0x150f: 0x0040, 0x1510: 0x0040, 0x1511: 0x0040,
+ 0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x0040, 0x1515: 0x0040, 0x1516: 0x0040, 0x1517: 0x0040,
+ 0x1518: 0x0040, 0x1519: 0x0040, 0x151a: 0x0040, 0x151b: 0x0040, 0x151c: 0x0040, 0x151d: 0x0040,
+ 0x151e: 0x0040, 0x151f: 0x0040, 0x1520: 0x0040, 0x1521: 0x0040, 0x1522: 0x0040, 0x1523: 0x0040,
+ 0x1524: 0x0040, 0x1525: 0x0040, 0x1526: 0x0040, 0x1527: 0x0040, 0x1528: 0x0040, 0x1529: 0x0040,
+ 0x152a: 0x0040, 0x152b: 0x0040, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040,
+ 0x1530: 0xaa61, 0x1531: 0xaa99, 0x1532: 0xaad1, 0x1533: 0xab19, 0x1534: 0xab61, 0x1535: 0xaba9,
+ 0x1536: 0xabf1, 0x1537: 0xac39, 0x1538: 0xac81, 0x1539: 0xacc9, 0x153a: 0xad02, 0x153b: 0xae12,
+ 0x153c: 0xae91, 0x153d: 0x0018, 0x153e: 0x0040, 0x153f: 0x0040,
// Block 0x55, offset 0x1540
- 0x1540: 0xb0f9, 0x1541: 0xb111, 0x1542: 0xb111, 0x1543: 0xb129, 0x1544: 0xb129, 0x1545: 0xb141,
- 0x1546: 0xb141, 0x1547: 0xb159, 0x1548: 0xb159, 0x1549: 0xb171, 0x154a: 0xb171, 0x154b: 0xb171,
- 0x154c: 0xb171, 0x154d: 0xb189, 0x154e: 0xb189, 0x154f: 0xb1a1, 0x1550: 0xb1a1, 0x1551: 0xb1a1,
- 0x1552: 0xb1a1, 0x1553: 0xb1b9, 0x1554: 0xb1b9, 0x1555: 0xb1d1, 0x1556: 0xb1d1, 0x1557: 0xb1d1,
- 0x1558: 0xb1d1, 0x1559: 0xb1e9, 0x155a: 0xb1e9, 0x155b: 0xb1e9, 0x155c: 0xb1e9, 0x155d: 0xb201,
- 0x155e: 0xb201, 0x155f: 0xb201, 0x1560: 0xb201, 0x1561: 0xb219, 0x1562: 0xb219, 0x1563: 0xb219,
- 0x1564: 0xb219, 0x1565: 0xb231, 0x1566: 0xb231, 0x1567: 0xb231, 0x1568: 0xb231, 0x1569: 0xb249,
- 0x156a: 0xb249, 0x156b: 0xb261, 0x156c: 0xb261, 0x156d: 0xb279, 0x156e: 0xb279, 0x156f: 0xb291,
- 0x1570: 0xb291, 0x1571: 0xb2a9, 0x1572: 0xb2a9, 0x1573: 0xb2a9, 0x1574: 0xb2a9, 0x1575: 0xb2c1,
- 0x1576: 0xb2c1, 0x1577: 0xb2c1, 0x1578: 0xb2c1, 0x1579: 0xb2d9, 0x157a: 0xb2d9, 0x157b: 0xb2d9,
- 0x157c: 0xb2d9, 0x157d: 0xb2f1, 0x157e: 0xb2f1, 0x157f: 0xb2f1,
+ 0x1540: 0x33c0, 0x1541: 0x33c0, 0x1542: 0x33c0, 0x1543: 0x33c0, 0x1544: 0x33c0, 0x1545: 0x33c0,
+ 0x1546: 0x33c0, 0x1547: 0x33c0, 0x1548: 0x33c0, 0x1549: 0x33c0, 0x154a: 0x33c0, 0x154b: 0x33c0,
+ 0x154c: 0x33c0, 0x154d: 0x33c0, 0x154e: 0x33c0, 0x154f: 0x33c0, 0x1550: 0xaeda, 0x1551: 0x7d55,
+ 0x1552: 0x0040, 0x1553: 0xaeea, 0x1554: 0x03c2, 0x1555: 0xaefa, 0x1556: 0xaf0a, 0x1557: 0x7d75,
+ 0x1558: 0x7d95, 0x1559: 0x0040, 0x155a: 0x0040, 0x155b: 0x0040, 0x155c: 0x0040, 0x155d: 0x0040,
+ 0x155e: 0x0040, 0x155f: 0x0040, 0x1560: 0x3308, 0x1561: 0x3308, 0x1562: 0x3308, 0x1563: 0x3308,
+ 0x1564: 0x3308, 0x1565: 0x3308, 0x1566: 0x3308, 0x1567: 0x3308, 0x1568: 0x3308, 0x1569: 0x3308,
+ 0x156a: 0x3308, 0x156b: 0x3308, 0x156c: 0x3308, 0x156d: 0x3308, 0x156e: 0x3308, 0x156f: 0x3308,
+ 0x1570: 0x0040, 0x1571: 0x7db5, 0x1572: 0x7dd5, 0x1573: 0xaf1a, 0x1574: 0xaf1a, 0x1575: 0x1fd2,
+ 0x1576: 0x1fe2, 0x1577: 0xaf2a, 0x1578: 0xaf3a, 0x1579: 0x7df5, 0x157a: 0x7e15, 0x157b: 0x7e35,
+ 0x157c: 0x7df5, 0x157d: 0x7e55, 0x157e: 0x7e75, 0x157f: 0x7e55,
// Block 0x56, offset 0x1580
- 0x1580: 0xb2f1, 0x1581: 0xb309, 0x1582: 0xb309, 0x1583: 0xb309, 0x1584: 0xb309, 0x1585: 0xb321,
- 0x1586: 0xb321, 0x1587: 0xb321, 0x1588: 0xb321, 0x1589: 0xb339, 0x158a: 0xb339, 0x158b: 0xb339,
- 0x158c: 0xb339, 0x158d: 0xb351, 0x158e: 0xb351, 0x158f: 0xb351, 0x1590: 0xb351, 0x1591: 0xb369,
- 0x1592: 0xb369, 0x1593: 0xb369, 0x1594: 0xb369, 0x1595: 0xb381, 0x1596: 0xb381, 0x1597: 0xb381,
- 0x1598: 0xb381, 0x1599: 0xb399, 0x159a: 0xb399, 0x159b: 0xb399, 0x159c: 0xb399, 0x159d: 0xb3b1,
- 0x159e: 0xb3b1, 0x159f: 0xb3b1, 0x15a0: 0xb3b1, 0x15a1: 0xb3c9, 0x15a2: 0xb3c9, 0x15a3: 0xb3c9,
- 0x15a4: 0xb3c9, 0x15a5: 0xb3e1, 0x15a6: 0xb3e1, 0x15a7: 0xb3e1, 0x15a8: 0xb3e1, 0x15a9: 0xb3f9,
- 0x15aa: 0xb3f9, 0x15ab: 0xb3f9, 0x15ac: 0xb3f9, 0x15ad: 0xb411, 0x15ae: 0xb411, 0x15af: 0x7ab1,
- 0x15b0: 0x7ab1, 0x15b1: 0xb429, 0x15b2: 0xb429, 0x15b3: 0xb429, 0x15b4: 0xb429, 0x15b5: 0xb441,
- 0x15b6: 0xb441, 0x15b7: 0xb469, 0x15b8: 0xb469, 0x15b9: 0xb491, 0x15ba: 0xb491, 0x15bb: 0xb4b9,
- 0x15bc: 0xb4b9, 0x15bd: 0x0040, 0x15be: 0x0040, 0x15bf: 0x03c0,
+ 0x1580: 0x7e95, 0x1581: 0x7eb5, 0x1582: 0x7ed5, 0x1583: 0x7eb5, 0x1584: 0x7ef5, 0x1585: 0x0018,
+ 0x1586: 0x0018, 0x1587: 0xaf4a, 0x1588: 0xaf5a, 0x1589: 0x7f16, 0x158a: 0x7f36, 0x158b: 0x7f56,
+ 0x158c: 0x7f76, 0x158d: 0xaf1a, 0x158e: 0xaf1a, 0x158f: 0xaf1a, 0x1590: 0xaeda, 0x1591: 0x7f95,
+ 0x1592: 0x0040, 0x1593: 0x0040, 0x1594: 0x03c2, 0x1595: 0xaeea, 0x1596: 0xaf0a, 0x1597: 0xaefa,
+ 0x1598: 0x7fb5, 0x1599: 0x1fd2, 0x159a: 0x1fe2, 0x159b: 0xaf2a, 0x159c: 0xaf3a, 0x159d: 0x7e95,
+ 0x159e: 0x7ef5, 0x159f: 0xaf6a, 0x15a0: 0xaf7a, 0x15a1: 0xaf8a, 0x15a2: 0x1fb2, 0x15a3: 0xaf99,
+ 0x15a4: 0xafaa, 0x15a5: 0xafba, 0x15a6: 0x1fc2, 0x15a7: 0x0040, 0x15a8: 0xafca, 0x15a9: 0xafda,
+ 0x15aa: 0xafea, 0x15ab: 0xaffa, 0x15ac: 0x0040, 0x15ad: 0x0040, 0x15ae: 0x0040, 0x15af: 0x0040,
+ 0x15b0: 0x7fd6, 0x15b1: 0xb009, 0x15b2: 0x7ff6, 0x15b3: 0x0808, 0x15b4: 0x8016, 0x15b5: 0x0040,
+ 0x15b6: 0x8036, 0x15b7: 0xb031, 0x15b8: 0x8056, 0x15b9: 0xb059, 0x15ba: 0x8076, 0x15bb: 0xb081,
+ 0x15bc: 0x8096, 0x15bd: 0xb0a9, 0x15be: 0x80b6, 0x15bf: 0xb0d1,
// Block 0x57, offset 0x15c0
- 0x15c0: 0x0040, 0x15c1: 0xaefa, 0x15c2: 0xb4e2, 0x15c3: 0xaf6a, 0x15c4: 0xafda, 0x15c5: 0xafea,
- 0x15c6: 0xaf7a, 0x15c7: 0xb4f2, 0x15c8: 0x1fd2, 0x15c9: 0x1fe2, 0x15ca: 0xaf8a, 0x15cb: 0x1fb2,
- 0x15cc: 0xaeda, 0x15cd: 0xaf99, 0x15ce: 0x29d1, 0x15cf: 0xb502, 0x15d0: 0x1f41, 0x15d1: 0x00c9,
- 0x15d2: 0x0069, 0x15d3: 0x0079, 0x15d4: 0x1f51, 0x15d5: 0x1f61, 0x15d6: 0x1f71, 0x15d7: 0x1f81,
- 0x15d8: 0x1f91, 0x15d9: 0x1fa1, 0x15da: 0xaeea, 0x15db: 0x03c2, 0x15dc: 0xafaa, 0x15dd: 0x1fc2,
- 0x15de: 0xafba, 0x15df: 0xaf0a, 0x15e0: 0xaffa, 0x15e1: 0x0039, 0x15e2: 0x0ee9, 0x15e3: 0x1159,
- 0x15e4: 0x0ef9, 0x15e5: 0x0f09, 0x15e6: 0x1199, 0x15e7: 0x0f31, 0x15e8: 0x0249, 0x15e9: 0x0f41,
- 0x15ea: 0x0259, 0x15eb: 0x0f51, 0x15ec: 0x0359, 0x15ed: 0x0f61, 0x15ee: 0x0f71, 0x15ef: 0x00d9,
- 0x15f0: 0x0f99, 0x15f1: 0x2039, 0x15f2: 0x0269, 0x15f3: 0x01d9, 0x15f4: 0x0fa9, 0x15f5: 0x0fb9,
- 0x15f6: 0x1089, 0x15f7: 0x0279, 0x15f8: 0x0369, 0x15f9: 0x0289, 0x15fa: 0x13d1, 0x15fb: 0xaf4a,
- 0x15fc: 0xafca, 0x15fd: 0xaf5a, 0x15fe: 0xb512, 0x15ff: 0xaf1a,
+ 0x15c0: 0xb0f9, 0x15c1: 0xb111, 0x15c2: 0xb111, 0x15c3: 0xb129, 0x15c4: 0xb129, 0x15c5: 0xb141,
+ 0x15c6: 0xb141, 0x15c7: 0xb159, 0x15c8: 0xb159, 0x15c9: 0xb171, 0x15ca: 0xb171, 0x15cb: 0xb171,
+ 0x15cc: 0xb171, 0x15cd: 0xb189, 0x15ce: 0xb189, 0x15cf: 0xb1a1, 0x15d0: 0xb1a1, 0x15d1: 0xb1a1,
+ 0x15d2: 0xb1a1, 0x15d3: 0xb1b9, 0x15d4: 0xb1b9, 0x15d5: 0xb1d1, 0x15d6: 0xb1d1, 0x15d7: 0xb1d1,
+ 0x15d8: 0xb1d1, 0x15d9: 0xb1e9, 0x15da: 0xb1e9, 0x15db: 0xb1e9, 0x15dc: 0xb1e9, 0x15dd: 0xb201,
+ 0x15de: 0xb201, 0x15df: 0xb201, 0x15e0: 0xb201, 0x15e1: 0xb219, 0x15e2: 0xb219, 0x15e3: 0xb219,
+ 0x15e4: 0xb219, 0x15e5: 0xb231, 0x15e6: 0xb231, 0x15e7: 0xb231, 0x15e8: 0xb231, 0x15e9: 0xb249,
+ 0x15ea: 0xb249, 0x15eb: 0xb261, 0x15ec: 0xb261, 0x15ed: 0xb279, 0x15ee: 0xb279, 0x15ef: 0xb291,
+ 0x15f0: 0xb291, 0x15f1: 0xb2a9, 0x15f2: 0xb2a9, 0x15f3: 0xb2a9, 0x15f4: 0xb2a9, 0x15f5: 0xb2c1,
+ 0x15f6: 0xb2c1, 0x15f7: 0xb2c1, 0x15f8: 0xb2c1, 0x15f9: 0xb2d9, 0x15fa: 0xb2d9, 0x15fb: 0xb2d9,
+ 0x15fc: 0xb2d9, 0x15fd: 0xb2f1, 0x15fe: 0xb2f1, 0x15ff: 0xb2f1,
// Block 0x58, offset 0x1600
- 0x1600: 0x1caa, 0x1601: 0x0039, 0x1602: 0x0ee9, 0x1603: 0x1159, 0x1604: 0x0ef9, 0x1605: 0x0f09,
- 0x1606: 0x1199, 0x1607: 0x0f31, 0x1608: 0x0249, 0x1609: 0x0f41, 0x160a: 0x0259, 0x160b: 0x0f51,
- 0x160c: 0x0359, 0x160d: 0x0f61, 0x160e: 0x0f71, 0x160f: 0x00d9, 0x1610: 0x0f99, 0x1611: 0x2039,
- 0x1612: 0x0269, 0x1613: 0x01d9, 0x1614: 0x0fa9, 0x1615: 0x0fb9, 0x1616: 0x1089, 0x1617: 0x0279,
- 0x1618: 0x0369, 0x1619: 0x0289, 0x161a: 0x13d1, 0x161b: 0xaf2a, 0x161c: 0xb522, 0x161d: 0xaf3a,
- 0x161e: 0xb532, 0x161f: 0x80d5, 0x1620: 0x80f5, 0x1621: 0x29d1, 0x1622: 0x8115, 0x1623: 0x8115,
- 0x1624: 0x8135, 0x1625: 0x8155, 0x1626: 0x8175, 0x1627: 0x8195, 0x1628: 0x81b5, 0x1629: 0x81d5,
- 0x162a: 0x81f5, 0x162b: 0x8215, 0x162c: 0x8235, 0x162d: 0x8255, 0x162e: 0x8275, 0x162f: 0x8295,
- 0x1630: 0x82b5, 0x1631: 0x82d5, 0x1632: 0x82f5, 0x1633: 0x8315, 0x1634: 0x8335, 0x1635: 0x8355,
- 0x1636: 0x8375, 0x1637: 0x8395, 0x1638: 0x83b5, 0x1639: 0x83d5, 0x163a: 0x83f5, 0x163b: 0x8415,
- 0x163c: 0x81b5, 0x163d: 0x8435, 0x163e: 0x8455, 0x163f: 0x8215,
+ 0x1600: 0xb2f1, 0x1601: 0xb309, 0x1602: 0xb309, 0x1603: 0xb309, 0x1604: 0xb309, 0x1605: 0xb321,
+ 0x1606: 0xb321, 0x1607: 0xb321, 0x1608: 0xb321, 0x1609: 0xb339, 0x160a: 0xb339, 0x160b: 0xb339,
+ 0x160c: 0xb339, 0x160d: 0xb351, 0x160e: 0xb351, 0x160f: 0xb351, 0x1610: 0xb351, 0x1611: 0xb369,
+ 0x1612: 0xb369, 0x1613: 0xb369, 0x1614: 0xb369, 0x1615: 0xb381, 0x1616: 0xb381, 0x1617: 0xb381,
+ 0x1618: 0xb381, 0x1619: 0xb399, 0x161a: 0xb399, 0x161b: 0xb399, 0x161c: 0xb399, 0x161d: 0xb3b1,
+ 0x161e: 0xb3b1, 0x161f: 0xb3b1, 0x1620: 0xb3b1, 0x1621: 0xb3c9, 0x1622: 0xb3c9, 0x1623: 0xb3c9,
+ 0x1624: 0xb3c9, 0x1625: 0xb3e1, 0x1626: 0xb3e1, 0x1627: 0xb3e1, 0x1628: 0xb3e1, 0x1629: 0xb3f9,
+ 0x162a: 0xb3f9, 0x162b: 0xb3f9, 0x162c: 0xb3f9, 0x162d: 0xb411, 0x162e: 0xb411, 0x162f: 0x7ab1,
+ 0x1630: 0x7ab1, 0x1631: 0xb429, 0x1632: 0xb429, 0x1633: 0xb429, 0x1634: 0xb429, 0x1635: 0xb441,
+ 0x1636: 0xb441, 0x1637: 0xb469, 0x1638: 0xb469, 0x1639: 0xb491, 0x163a: 0xb491, 0x163b: 0xb4b9,
+ 0x163c: 0xb4b9, 0x163d: 0x0040, 0x163e: 0x0040, 0x163f: 0x03c0,
// Block 0x59, offset 0x1640
- 0x1640: 0x8475, 0x1641: 0x8495, 0x1642: 0x84b5, 0x1643: 0x84d5, 0x1644: 0x84f5, 0x1645: 0x8515,
- 0x1646: 0x8535, 0x1647: 0x8555, 0x1648: 0x84d5, 0x1649: 0x8575, 0x164a: 0x84d5, 0x164b: 0x8595,
- 0x164c: 0x8595, 0x164d: 0x85b5, 0x164e: 0x85b5, 0x164f: 0x85d5, 0x1650: 0x8515, 0x1651: 0x85f5,
- 0x1652: 0x8615, 0x1653: 0x85f5, 0x1654: 0x8635, 0x1655: 0x8615, 0x1656: 0x8655, 0x1657: 0x8655,
- 0x1658: 0x8675, 0x1659: 0x8675, 0x165a: 0x8695, 0x165b: 0x8695, 0x165c: 0x8615, 0x165d: 0x8115,
- 0x165e: 0x86b5, 0x165f: 0x86d5, 0x1660: 0x0040, 0x1661: 0x86f5, 0x1662: 0x8715, 0x1663: 0x8735,
- 0x1664: 0x8755, 0x1665: 0x8735, 0x1666: 0x8775, 0x1667: 0x8795, 0x1668: 0x87b5, 0x1669: 0x87b5,
- 0x166a: 0x87d5, 0x166b: 0x87d5, 0x166c: 0x87f5, 0x166d: 0x87f5, 0x166e: 0x87d5, 0x166f: 0x87d5,
- 0x1670: 0x8815, 0x1671: 0x8835, 0x1672: 0x8855, 0x1673: 0x8875, 0x1674: 0x8895, 0x1675: 0x88b5,
- 0x1676: 0x88b5, 0x1677: 0x88b5, 0x1678: 0x88d5, 0x1679: 0x88d5, 0x167a: 0x88d5, 0x167b: 0x88d5,
- 0x167c: 0x87b5, 0x167d: 0x87b5, 0x167e: 0x87b5, 0x167f: 0x0040,
+ 0x1640: 0x0040, 0x1641: 0xaefa, 0x1642: 0xb4e2, 0x1643: 0xaf6a, 0x1644: 0xafda, 0x1645: 0xafea,
+ 0x1646: 0xaf7a, 0x1647: 0xb4f2, 0x1648: 0x1fd2, 0x1649: 0x1fe2, 0x164a: 0xaf8a, 0x164b: 0x1fb2,
+ 0x164c: 0xaeda, 0x164d: 0xaf99, 0x164e: 0x29d1, 0x164f: 0xb502, 0x1650: 0x1f41, 0x1651: 0x00c9,
+ 0x1652: 0x0069, 0x1653: 0x0079, 0x1654: 0x1f51, 0x1655: 0x1f61, 0x1656: 0x1f71, 0x1657: 0x1f81,
+ 0x1658: 0x1f91, 0x1659: 0x1fa1, 0x165a: 0xaeea, 0x165b: 0x03c2, 0x165c: 0xafaa, 0x165d: 0x1fc2,
+ 0x165e: 0xafba, 0x165f: 0xaf0a, 0x1660: 0xaffa, 0x1661: 0x0039, 0x1662: 0x0ee9, 0x1663: 0x1159,
+ 0x1664: 0x0ef9, 0x1665: 0x0f09, 0x1666: 0x1199, 0x1667: 0x0f31, 0x1668: 0x0249, 0x1669: 0x0f41,
+ 0x166a: 0x0259, 0x166b: 0x0f51, 0x166c: 0x0359, 0x166d: 0x0f61, 0x166e: 0x0f71, 0x166f: 0x00d9,
+ 0x1670: 0x0f99, 0x1671: 0x2039, 0x1672: 0x0269, 0x1673: 0x01d9, 0x1674: 0x0fa9, 0x1675: 0x0fb9,
+ 0x1676: 0x1089, 0x1677: 0x0279, 0x1678: 0x0369, 0x1679: 0x0289, 0x167a: 0x13d1, 0x167b: 0xaf4a,
+ 0x167c: 0xafca, 0x167d: 0xaf5a, 0x167e: 0xb512, 0x167f: 0xaf1a,
// Block 0x5a, offset 0x1680
- 0x1680: 0x0040, 0x1681: 0x0040, 0x1682: 0x8715, 0x1683: 0x86f5, 0x1684: 0x88f5, 0x1685: 0x86f5,
- 0x1686: 0x8715, 0x1687: 0x86f5, 0x1688: 0x0040, 0x1689: 0x0040, 0x168a: 0x8915, 0x168b: 0x8715,
- 0x168c: 0x8935, 0x168d: 0x88f5, 0x168e: 0x8935, 0x168f: 0x8715, 0x1690: 0x0040, 0x1691: 0x0040,
- 0x1692: 0x8955, 0x1693: 0x8975, 0x1694: 0x8875, 0x1695: 0x8935, 0x1696: 0x88f5, 0x1697: 0x8935,
- 0x1698: 0x0040, 0x1699: 0x0040, 0x169a: 0x8995, 0x169b: 0x89b5, 0x169c: 0x8995, 0x169d: 0x0040,
- 0x169e: 0x0040, 0x169f: 0x0040, 0x16a0: 0xb541, 0x16a1: 0xb559, 0x16a2: 0xb571, 0x16a3: 0x89d6,
- 0x16a4: 0xb589, 0x16a5: 0xb5a1, 0x16a6: 0x89f5, 0x16a7: 0x0040, 0x16a8: 0x8a15, 0x16a9: 0x8a35,
- 0x16aa: 0x8a55, 0x16ab: 0x8a35, 0x16ac: 0x8a75, 0x16ad: 0x8a95, 0x16ae: 0x8ab5, 0x16af: 0x0040,
- 0x16b0: 0x0040, 0x16b1: 0x0040, 0x16b2: 0x0040, 0x16b3: 0x0040, 0x16b4: 0x0040, 0x16b5: 0x0040,
- 0x16b6: 0x0040, 0x16b7: 0x0040, 0x16b8: 0x0040, 0x16b9: 0x0340, 0x16ba: 0x0340, 0x16bb: 0x0340,
- 0x16bc: 0x0040, 0x16bd: 0x0040, 0x16be: 0x0040, 0x16bf: 0x0040,
+ 0x1680: 0x1caa, 0x1681: 0x0039, 0x1682: 0x0ee9, 0x1683: 0x1159, 0x1684: 0x0ef9, 0x1685: 0x0f09,
+ 0x1686: 0x1199, 0x1687: 0x0f31, 0x1688: 0x0249, 0x1689: 0x0f41, 0x168a: 0x0259, 0x168b: 0x0f51,
+ 0x168c: 0x0359, 0x168d: 0x0f61, 0x168e: 0x0f71, 0x168f: 0x00d9, 0x1690: 0x0f99, 0x1691: 0x2039,
+ 0x1692: 0x0269, 0x1693: 0x01d9, 0x1694: 0x0fa9, 0x1695: 0x0fb9, 0x1696: 0x1089, 0x1697: 0x0279,
+ 0x1698: 0x0369, 0x1699: 0x0289, 0x169a: 0x13d1, 0x169b: 0xaf2a, 0x169c: 0xb522, 0x169d: 0xaf3a,
+ 0x169e: 0xb532, 0x169f: 0x80d5, 0x16a0: 0x80f5, 0x16a1: 0x29d1, 0x16a2: 0x8115, 0x16a3: 0x8115,
+ 0x16a4: 0x8135, 0x16a5: 0x8155, 0x16a6: 0x8175, 0x16a7: 0x8195, 0x16a8: 0x81b5, 0x16a9: 0x81d5,
+ 0x16aa: 0x81f5, 0x16ab: 0x8215, 0x16ac: 0x8235, 0x16ad: 0x8255, 0x16ae: 0x8275, 0x16af: 0x8295,
+ 0x16b0: 0x82b5, 0x16b1: 0x82d5, 0x16b2: 0x82f5, 0x16b3: 0x8315, 0x16b4: 0x8335, 0x16b5: 0x8355,
+ 0x16b6: 0x8375, 0x16b7: 0x8395, 0x16b8: 0x83b5, 0x16b9: 0x83d5, 0x16ba: 0x83f5, 0x16bb: 0x8415,
+ 0x16bc: 0x81b5, 0x16bd: 0x8435, 0x16be: 0x8455, 0x16bf: 0x8215,
// Block 0x5b, offset 0x16c0
- 0x16c0: 0x0208, 0x16c1: 0x0208, 0x16c2: 0x0208, 0x16c3: 0x0208, 0x16c4: 0x0208, 0x16c5: 0x0408,
- 0x16c6: 0x0008, 0x16c7: 0x0408, 0x16c8: 0x0018, 0x16c9: 0x0408, 0x16ca: 0x0408, 0x16cb: 0x0008,
- 0x16cc: 0x0008, 0x16cd: 0x0108, 0x16ce: 0x0408, 0x16cf: 0x0408, 0x16d0: 0x0408, 0x16d1: 0x0408,
- 0x16d2: 0x0408, 0x16d3: 0x0208, 0x16d4: 0x0208, 0x16d5: 0x0208, 0x16d6: 0x0208, 0x16d7: 0x0108,
- 0x16d8: 0x0208, 0x16d9: 0x0208, 0x16da: 0x0208, 0x16db: 0x0208, 0x16dc: 0x0208, 0x16dd: 0x0408,
- 0x16de: 0x0208, 0x16df: 0x0208, 0x16e0: 0x0208, 0x16e1: 0x0408, 0x16e2: 0x0008, 0x16e3: 0x0008,
- 0x16e4: 0x0408, 0x16e5: 0x1308, 0x16e6: 0x1308, 0x16e7: 0x0040, 0x16e8: 0x0040, 0x16e9: 0x0040,
- 0x16ea: 0x0040, 0x16eb: 0x0218, 0x16ec: 0x0218, 0x16ed: 0x0218, 0x16ee: 0x0218, 0x16ef: 0x0418,
- 0x16f0: 0x0018, 0x16f1: 0x0018, 0x16f2: 0x0018, 0x16f3: 0x0018, 0x16f4: 0x0018, 0x16f5: 0x0018,
- 0x16f6: 0x0018, 0x16f7: 0x0040, 0x16f8: 0x0040, 0x16f9: 0x0040, 0x16fa: 0x0040, 0x16fb: 0x0040,
- 0x16fc: 0x0040, 0x16fd: 0x0040, 0x16fe: 0x0040, 0x16ff: 0x0040,
+ 0x16c0: 0x8475, 0x16c1: 0x8495, 0x16c2: 0x84b5, 0x16c3: 0x84d5, 0x16c4: 0x84f5, 0x16c5: 0x8515,
+ 0x16c6: 0x8535, 0x16c7: 0x8555, 0x16c8: 0x84d5, 0x16c9: 0x8575, 0x16ca: 0x84d5, 0x16cb: 0x8595,
+ 0x16cc: 0x8595, 0x16cd: 0x85b5, 0x16ce: 0x85b5, 0x16cf: 0x85d5, 0x16d0: 0x8515, 0x16d1: 0x85f5,
+ 0x16d2: 0x8615, 0x16d3: 0x85f5, 0x16d4: 0x8635, 0x16d5: 0x8615, 0x16d6: 0x8655, 0x16d7: 0x8655,
+ 0x16d8: 0x8675, 0x16d9: 0x8675, 0x16da: 0x8695, 0x16db: 0x8695, 0x16dc: 0x8615, 0x16dd: 0x8115,
+ 0x16de: 0x86b5, 0x16df: 0x86d5, 0x16e0: 0x0040, 0x16e1: 0x86f5, 0x16e2: 0x8715, 0x16e3: 0x8735,
+ 0x16e4: 0x8755, 0x16e5: 0x8735, 0x16e6: 0x8775, 0x16e7: 0x8795, 0x16e8: 0x87b5, 0x16e9: 0x87b5,
+ 0x16ea: 0x87d5, 0x16eb: 0x87d5, 0x16ec: 0x87f5, 0x16ed: 0x87f5, 0x16ee: 0x87d5, 0x16ef: 0x87d5,
+ 0x16f0: 0x8815, 0x16f1: 0x8835, 0x16f2: 0x8855, 0x16f3: 0x8875, 0x16f4: 0x8895, 0x16f5: 0x88b5,
+ 0x16f6: 0x88b5, 0x16f7: 0x88b5, 0x16f8: 0x88d5, 0x16f9: 0x88d5, 0x16fa: 0x88d5, 0x16fb: 0x88d5,
+ 0x16fc: 0x87b5, 0x16fd: 0x87b5, 0x16fe: 0x87b5, 0x16ff: 0x0040,
// Block 0x5c, offset 0x1700
- 0x1700: 0x0208, 0x1701: 0x0408, 0x1702: 0x0208, 0x1703: 0x0408, 0x1704: 0x0408, 0x1705: 0x0408,
- 0x1706: 0x0208, 0x1707: 0x0208, 0x1708: 0x0208, 0x1709: 0x0408, 0x170a: 0x0208, 0x170b: 0x0208,
- 0x170c: 0x0408, 0x170d: 0x0208, 0x170e: 0x0408, 0x170f: 0x0408, 0x1710: 0x0208, 0x1711: 0x0408,
- 0x1712: 0x0040, 0x1713: 0x0040, 0x1714: 0x0040, 0x1715: 0x0040, 0x1716: 0x0040, 0x1717: 0x0040,
- 0x1718: 0x0040, 0x1719: 0x0018, 0x171a: 0x0018, 0x171b: 0x0018, 0x171c: 0x0018, 0x171d: 0x0040,
- 0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0x0040, 0x1721: 0x0040, 0x1722: 0x0040, 0x1723: 0x0040,
- 0x1724: 0x0040, 0x1725: 0x0040, 0x1726: 0x0040, 0x1727: 0x0040, 0x1728: 0x0040, 0x1729: 0x0418,
- 0x172a: 0x0418, 0x172b: 0x0418, 0x172c: 0x0418, 0x172d: 0x0218, 0x172e: 0x0218, 0x172f: 0x0018,
+ 0x1700: 0x0040, 0x1701: 0x0040, 0x1702: 0x8715, 0x1703: 0x86f5, 0x1704: 0x88f5, 0x1705: 0x86f5,
+ 0x1706: 0x8715, 0x1707: 0x86f5, 0x1708: 0x0040, 0x1709: 0x0040, 0x170a: 0x8915, 0x170b: 0x8715,
+ 0x170c: 0x8935, 0x170d: 0x88f5, 0x170e: 0x8935, 0x170f: 0x8715, 0x1710: 0x0040, 0x1711: 0x0040,
+ 0x1712: 0x8955, 0x1713: 0x8975, 0x1714: 0x8875, 0x1715: 0x8935, 0x1716: 0x88f5, 0x1717: 0x8935,
+ 0x1718: 0x0040, 0x1719: 0x0040, 0x171a: 0x8995, 0x171b: 0x89b5, 0x171c: 0x8995, 0x171d: 0x0040,
+ 0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0xb541, 0x1721: 0xb559, 0x1722: 0xb571, 0x1723: 0x89d6,
+ 0x1724: 0xb589, 0x1725: 0xb5a1, 0x1726: 0x89f5, 0x1727: 0x0040, 0x1728: 0x8a15, 0x1729: 0x8a35,
+ 0x172a: 0x8a55, 0x172b: 0x8a35, 0x172c: 0x8a75, 0x172d: 0x8a95, 0x172e: 0x8ab5, 0x172f: 0x0040,
0x1730: 0x0040, 0x1731: 0x0040, 0x1732: 0x0040, 0x1733: 0x0040, 0x1734: 0x0040, 0x1735: 0x0040,
- 0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0040, 0x173a: 0x0040, 0x173b: 0x0040,
+ 0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0340, 0x173a: 0x0340, 0x173b: 0x0340,
0x173c: 0x0040, 0x173d: 0x0040, 0x173e: 0x0040, 0x173f: 0x0040,
// Block 0x5d, offset 0x1740
- 0x1740: 0x1308, 0x1741: 0x1308, 0x1742: 0x1008, 0x1743: 0x1008, 0x1744: 0x0040, 0x1745: 0x0008,
- 0x1746: 0x0008, 0x1747: 0x0008, 0x1748: 0x0008, 0x1749: 0x0008, 0x174a: 0x0008, 0x174b: 0x0008,
- 0x174c: 0x0008, 0x174d: 0x0040, 0x174e: 0x0040, 0x174f: 0x0008, 0x1750: 0x0008, 0x1751: 0x0040,
- 0x1752: 0x0040, 0x1753: 0x0008, 0x1754: 0x0008, 0x1755: 0x0008, 0x1756: 0x0008, 0x1757: 0x0008,
- 0x1758: 0x0008, 0x1759: 0x0008, 0x175a: 0x0008, 0x175b: 0x0008, 0x175c: 0x0008, 0x175d: 0x0008,
- 0x175e: 0x0008, 0x175f: 0x0008, 0x1760: 0x0008, 0x1761: 0x0008, 0x1762: 0x0008, 0x1763: 0x0008,
- 0x1764: 0x0008, 0x1765: 0x0008, 0x1766: 0x0008, 0x1767: 0x0008, 0x1768: 0x0008, 0x1769: 0x0040,
- 0x176a: 0x0008, 0x176b: 0x0008, 0x176c: 0x0008, 0x176d: 0x0008, 0x176e: 0x0008, 0x176f: 0x0008,
- 0x1770: 0x0008, 0x1771: 0x0040, 0x1772: 0x0008, 0x1773: 0x0008, 0x1774: 0x0040, 0x1775: 0x0008,
- 0x1776: 0x0008, 0x1777: 0x0008, 0x1778: 0x0008, 0x1779: 0x0008, 0x177a: 0x0040, 0x177b: 0x0040,
- 0x177c: 0x1308, 0x177d: 0x0008, 0x177e: 0x1008, 0x177f: 0x1008,
+ 0x1740: 0x0a08, 0x1741: 0x0a08, 0x1742: 0x0a08, 0x1743: 0x0a08, 0x1744: 0x0a08, 0x1745: 0x0c08,
+ 0x1746: 0x0808, 0x1747: 0x0c08, 0x1748: 0x0818, 0x1749: 0x0c08, 0x174a: 0x0c08, 0x174b: 0x0808,
+ 0x174c: 0x0808, 0x174d: 0x0908, 0x174e: 0x0c08, 0x174f: 0x0c08, 0x1750: 0x0c08, 0x1751: 0x0c08,
+ 0x1752: 0x0c08, 0x1753: 0x0a08, 0x1754: 0x0a08, 0x1755: 0x0a08, 0x1756: 0x0a08, 0x1757: 0x0908,
+ 0x1758: 0x0a08, 0x1759: 0x0a08, 0x175a: 0x0a08, 0x175b: 0x0a08, 0x175c: 0x0a08, 0x175d: 0x0c08,
+ 0x175e: 0x0a08, 0x175f: 0x0a08, 0x1760: 0x0a08, 0x1761: 0x0c08, 0x1762: 0x0808, 0x1763: 0x0808,
+ 0x1764: 0x0c08, 0x1765: 0x3308, 0x1766: 0x3308, 0x1767: 0x0040, 0x1768: 0x0040, 0x1769: 0x0040,
+ 0x176a: 0x0040, 0x176b: 0x0a18, 0x176c: 0x0a18, 0x176d: 0x0a18, 0x176e: 0x0a18, 0x176f: 0x0c18,
+ 0x1770: 0x0818, 0x1771: 0x0818, 0x1772: 0x0818, 0x1773: 0x0818, 0x1774: 0x0818, 0x1775: 0x0818,
+ 0x1776: 0x0818, 0x1777: 0x0040, 0x1778: 0x0040, 0x1779: 0x0040, 0x177a: 0x0040, 0x177b: 0x0040,
+ 0x177c: 0x0040, 0x177d: 0x0040, 0x177e: 0x0040, 0x177f: 0x0040,
// Block 0x5e, offset 0x1780
- 0x1780: 0x1308, 0x1781: 0x1008, 0x1782: 0x1008, 0x1783: 0x1008, 0x1784: 0x1008, 0x1785: 0x0040,
- 0x1786: 0x0040, 0x1787: 0x1008, 0x1788: 0x1008, 0x1789: 0x0040, 0x178a: 0x0040, 0x178b: 0x1008,
- 0x178c: 0x1008, 0x178d: 0x1808, 0x178e: 0x0040, 0x178f: 0x0040, 0x1790: 0x0008, 0x1791: 0x0040,
- 0x1792: 0x0040, 0x1793: 0x0040, 0x1794: 0x0040, 0x1795: 0x0040, 0x1796: 0x0040, 0x1797: 0x1008,
- 0x1798: 0x0040, 0x1799: 0x0040, 0x179a: 0x0040, 0x179b: 0x0040, 0x179c: 0x0040, 0x179d: 0x0008,
- 0x179e: 0x0008, 0x179f: 0x0008, 0x17a0: 0x0008, 0x17a1: 0x0008, 0x17a2: 0x1008, 0x17a3: 0x1008,
- 0x17a4: 0x0040, 0x17a5: 0x0040, 0x17a6: 0x1308, 0x17a7: 0x1308, 0x17a8: 0x1308, 0x17a9: 0x1308,
- 0x17aa: 0x1308, 0x17ab: 0x1308, 0x17ac: 0x1308, 0x17ad: 0x0040, 0x17ae: 0x0040, 0x17af: 0x0040,
- 0x17b0: 0x1308, 0x17b1: 0x1308, 0x17b2: 0x1308, 0x17b3: 0x1308, 0x17b4: 0x1308, 0x17b5: 0x0040,
+ 0x1780: 0x0a08, 0x1781: 0x0c08, 0x1782: 0x0a08, 0x1783: 0x0c08, 0x1784: 0x0c08, 0x1785: 0x0c08,
+ 0x1786: 0x0a08, 0x1787: 0x0a08, 0x1788: 0x0a08, 0x1789: 0x0c08, 0x178a: 0x0a08, 0x178b: 0x0a08,
+ 0x178c: 0x0c08, 0x178d: 0x0a08, 0x178e: 0x0c08, 0x178f: 0x0c08, 0x1790: 0x0a08, 0x1791: 0x0c08,
+ 0x1792: 0x0040, 0x1793: 0x0040, 0x1794: 0x0040, 0x1795: 0x0040, 0x1796: 0x0040, 0x1797: 0x0040,
+ 0x1798: 0x0040, 0x1799: 0x0818, 0x179a: 0x0818, 0x179b: 0x0818, 0x179c: 0x0818, 0x179d: 0x0040,
+ 0x179e: 0x0040, 0x179f: 0x0040, 0x17a0: 0x0040, 0x17a1: 0x0040, 0x17a2: 0x0040, 0x17a3: 0x0040,
+ 0x17a4: 0x0040, 0x17a5: 0x0040, 0x17a6: 0x0040, 0x17a7: 0x0040, 0x17a8: 0x0040, 0x17a9: 0x0c18,
+ 0x17aa: 0x0c18, 0x17ab: 0x0c18, 0x17ac: 0x0c18, 0x17ad: 0x0a18, 0x17ae: 0x0a18, 0x17af: 0x0818,
+ 0x17b0: 0x0040, 0x17b1: 0x0040, 0x17b2: 0x0040, 0x17b3: 0x0040, 0x17b4: 0x0040, 0x17b5: 0x0040,
0x17b6: 0x0040, 0x17b7: 0x0040, 0x17b8: 0x0040, 0x17b9: 0x0040, 0x17ba: 0x0040, 0x17bb: 0x0040,
0x17bc: 0x0040, 0x17bd: 0x0040, 0x17be: 0x0040, 0x17bf: 0x0040,
// Block 0x5f, offset 0x17c0
- 0x17c0: 0x0039, 0x17c1: 0x0ee9, 0x17c2: 0x1159, 0x17c3: 0x0ef9, 0x17c4: 0x0f09, 0x17c5: 0x1199,
- 0x17c6: 0x0f31, 0x17c7: 0x0249, 0x17c8: 0x0f41, 0x17c9: 0x0259, 0x17ca: 0x0f51, 0x17cb: 0x0359,
- 0x17cc: 0x0f61, 0x17cd: 0x0f71, 0x17ce: 0x00d9, 0x17cf: 0x0f99, 0x17d0: 0x2039, 0x17d1: 0x0269,
- 0x17d2: 0x01d9, 0x17d3: 0x0fa9, 0x17d4: 0x0fb9, 0x17d5: 0x1089, 0x17d6: 0x0279, 0x17d7: 0x0369,
- 0x17d8: 0x0289, 0x17d9: 0x13d1, 0x17da: 0x0039, 0x17db: 0x0ee9, 0x17dc: 0x1159, 0x17dd: 0x0ef9,
- 0x17de: 0x0f09, 0x17df: 0x1199, 0x17e0: 0x0f31, 0x17e1: 0x0249, 0x17e2: 0x0f41, 0x17e3: 0x0259,
- 0x17e4: 0x0f51, 0x17e5: 0x0359, 0x17e6: 0x0f61, 0x17e7: 0x0f71, 0x17e8: 0x00d9, 0x17e9: 0x0f99,
- 0x17ea: 0x2039, 0x17eb: 0x0269, 0x17ec: 0x01d9, 0x17ed: 0x0fa9, 0x17ee: 0x0fb9, 0x17ef: 0x1089,
- 0x17f0: 0x0279, 0x17f1: 0x0369, 0x17f2: 0x0289, 0x17f3: 0x13d1, 0x17f4: 0x0039, 0x17f5: 0x0ee9,
- 0x17f6: 0x1159, 0x17f7: 0x0ef9, 0x17f8: 0x0f09, 0x17f9: 0x1199, 0x17fa: 0x0f31, 0x17fb: 0x0249,
- 0x17fc: 0x0f41, 0x17fd: 0x0259, 0x17fe: 0x0f51, 0x17ff: 0x0359,
+ 0x17c0: 0x3308, 0x17c1: 0x3308, 0x17c2: 0x3008, 0x17c3: 0x3008, 0x17c4: 0x0040, 0x17c5: 0x0008,
+ 0x17c6: 0x0008, 0x17c7: 0x0008, 0x17c8: 0x0008, 0x17c9: 0x0008, 0x17ca: 0x0008, 0x17cb: 0x0008,
+ 0x17cc: 0x0008, 0x17cd: 0x0040, 0x17ce: 0x0040, 0x17cf: 0x0008, 0x17d0: 0x0008, 0x17d1: 0x0040,
+ 0x17d2: 0x0040, 0x17d3: 0x0008, 0x17d4: 0x0008, 0x17d5: 0x0008, 0x17d6: 0x0008, 0x17d7: 0x0008,
+ 0x17d8: 0x0008, 0x17d9: 0x0008, 0x17da: 0x0008, 0x17db: 0x0008, 0x17dc: 0x0008, 0x17dd: 0x0008,
+ 0x17de: 0x0008, 0x17df: 0x0008, 0x17e0: 0x0008, 0x17e1: 0x0008, 0x17e2: 0x0008, 0x17e3: 0x0008,
+ 0x17e4: 0x0008, 0x17e5: 0x0008, 0x17e6: 0x0008, 0x17e7: 0x0008, 0x17e8: 0x0008, 0x17e9: 0x0040,
+ 0x17ea: 0x0008, 0x17eb: 0x0008, 0x17ec: 0x0008, 0x17ed: 0x0008, 0x17ee: 0x0008, 0x17ef: 0x0008,
+ 0x17f0: 0x0008, 0x17f1: 0x0040, 0x17f2: 0x0008, 0x17f3: 0x0008, 0x17f4: 0x0040, 0x17f5: 0x0008,
+ 0x17f6: 0x0008, 0x17f7: 0x0008, 0x17f8: 0x0008, 0x17f9: 0x0008, 0x17fa: 0x0040, 0x17fb: 0x0040,
+ 0x17fc: 0x3308, 0x17fd: 0x0008, 0x17fe: 0x3008, 0x17ff: 0x3008,
// Block 0x60, offset 0x1800
- 0x1800: 0x0f61, 0x1801: 0x0f71, 0x1802: 0x00d9, 0x1803: 0x0f99, 0x1804: 0x2039, 0x1805: 0x0269,
- 0x1806: 0x01d9, 0x1807: 0x0fa9, 0x1808: 0x0fb9, 0x1809: 0x1089, 0x180a: 0x0279, 0x180b: 0x0369,
- 0x180c: 0x0289, 0x180d: 0x13d1, 0x180e: 0x0039, 0x180f: 0x0ee9, 0x1810: 0x1159, 0x1811: 0x0ef9,
- 0x1812: 0x0f09, 0x1813: 0x1199, 0x1814: 0x0f31, 0x1815: 0x0040, 0x1816: 0x0f41, 0x1817: 0x0259,
- 0x1818: 0x0f51, 0x1819: 0x0359, 0x181a: 0x0f61, 0x181b: 0x0f71, 0x181c: 0x00d9, 0x181d: 0x0f99,
- 0x181e: 0x2039, 0x181f: 0x0269, 0x1820: 0x01d9, 0x1821: 0x0fa9, 0x1822: 0x0fb9, 0x1823: 0x1089,
- 0x1824: 0x0279, 0x1825: 0x0369, 0x1826: 0x0289, 0x1827: 0x13d1, 0x1828: 0x0039, 0x1829: 0x0ee9,
- 0x182a: 0x1159, 0x182b: 0x0ef9, 0x182c: 0x0f09, 0x182d: 0x1199, 0x182e: 0x0f31, 0x182f: 0x0249,
- 0x1830: 0x0f41, 0x1831: 0x0259, 0x1832: 0x0f51, 0x1833: 0x0359, 0x1834: 0x0f61, 0x1835: 0x0f71,
- 0x1836: 0x00d9, 0x1837: 0x0f99, 0x1838: 0x2039, 0x1839: 0x0269, 0x183a: 0x01d9, 0x183b: 0x0fa9,
- 0x183c: 0x0fb9, 0x183d: 0x1089, 0x183e: 0x0279, 0x183f: 0x0369,
+ 0x1800: 0x3308, 0x1801: 0x3008, 0x1802: 0x3008, 0x1803: 0x3008, 0x1804: 0x3008, 0x1805: 0x0040,
+ 0x1806: 0x0040, 0x1807: 0x3008, 0x1808: 0x3008, 0x1809: 0x0040, 0x180a: 0x0040, 0x180b: 0x3008,
+ 0x180c: 0x3008, 0x180d: 0x3808, 0x180e: 0x0040, 0x180f: 0x0040, 0x1810: 0x0008, 0x1811: 0x0040,
+ 0x1812: 0x0040, 0x1813: 0x0040, 0x1814: 0x0040, 0x1815: 0x0040, 0x1816: 0x0040, 0x1817: 0x3008,
+ 0x1818: 0x0040, 0x1819: 0x0040, 0x181a: 0x0040, 0x181b: 0x0040, 0x181c: 0x0040, 0x181d: 0x0008,
+ 0x181e: 0x0008, 0x181f: 0x0008, 0x1820: 0x0008, 0x1821: 0x0008, 0x1822: 0x3008, 0x1823: 0x3008,
+ 0x1824: 0x0040, 0x1825: 0x0040, 0x1826: 0x3308, 0x1827: 0x3308, 0x1828: 0x3308, 0x1829: 0x3308,
+ 0x182a: 0x3308, 0x182b: 0x3308, 0x182c: 0x3308, 0x182d: 0x0040, 0x182e: 0x0040, 0x182f: 0x0040,
+ 0x1830: 0x3308, 0x1831: 0x3308, 0x1832: 0x3308, 0x1833: 0x3308, 0x1834: 0x3308, 0x1835: 0x0040,
+ 0x1836: 0x0040, 0x1837: 0x0040, 0x1838: 0x0040, 0x1839: 0x0040, 0x183a: 0x0040, 0x183b: 0x0040,
+ 0x183c: 0x0040, 0x183d: 0x0040, 0x183e: 0x0040, 0x183f: 0x0040,
// Block 0x61, offset 0x1840
- 0x1840: 0x0289, 0x1841: 0x13d1, 0x1842: 0x0039, 0x1843: 0x0ee9, 0x1844: 0x1159, 0x1845: 0x0ef9,
- 0x1846: 0x0f09, 0x1847: 0x1199, 0x1848: 0x0f31, 0x1849: 0x0249, 0x184a: 0x0f41, 0x184b: 0x0259,
- 0x184c: 0x0f51, 0x184d: 0x0359, 0x184e: 0x0f61, 0x184f: 0x0f71, 0x1850: 0x00d9, 0x1851: 0x0f99,
- 0x1852: 0x2039, 0x1853: 0x0269, 0x1854: 0x01d9, 0x1855: 0x0fa9, 0x1856: 0x0fb9, 0x1857: 0x1089,
- 0x1858: 0x0279, 0x1859: 0x0369, 0x185a: 0x0289, 0x185b: 0x13d1, 0x185c: 0x0039, 0x185d: 0x0040,
- 0x185e: 0x1159, 0x185f: 0x0ef9, 0x1860: 0x0040, 0x1861: 0x0040, 0x1862: 0x0f31, 0x1863: 0x0040,
- 0x1864: 0x0040, 0x1865: 0x0259, 0x1866: 0x0f51, 0x1867: 0x0040, 0x1868: 0x0040, 0x1869: 0x0f71,
- 0x186a: 0x00d9, 0x186b: 0x0f99, 0x186c: 0x2039, 0x186d: 0x0040, 0x186e: 0x01d9, 0x186f: 0x0fa9,
- 0x1870: 0x0fb9, 0x1871: 0x1089, 0x1872: 0x0279, 0x1873: 0x0369, 0x1874: 0x0289, 0x1875: 0x13d1,
- 0x1876: 0x0039, 0x1877: 0x0ee9, 0x1878: 0x1159, 0x1879: 0x0ef9, 0x187a: 0x0040, 0x187b: 0x1199,
- 0x187c: 0x0040, 0x187d: 0x0249, 0x187e: 0x0f41, 0x187f: 0x0259,
+ 0x1840: 0x0039, 0x1841: 0x0ee9, 0x1842: 0x1159, 0x1843: 0x0ef9, 0x1844: 0x0f09, 0x1845: 0x1199,
+ 0x1846: 0x0f31, 0x1847: 0x0249, 0x1848: 0x0f41, 0x1849: 0x0259, 0x184a: 0x0f51, 0x184b: 0x0359,
+ 0x184c: 0x0f61, 0x184d: 0x0f71, 0x184e: 0x00d9, 0x184f: 0x0f99, 0x1850: 0x2039, 0x1851: 0x0269,
+ 0x1852: 0x01d9, 0x1853: 0x0fa9, 0x1854: 0x0fb9, 0x1855: 0x1089, 0x1856: 0x0279, 0x1857: 0x0369,
+ 0x1858: 0x0289, 0x1859: 0x13d1, 0x185a: 0x0039, 0x185b: 0x0ee9, 0x185c: 0x1159, 0x185d: 0x0ef9,
+ 0x185e: 0x0f09, 0x185f: 0x1199, 0x1860: 0x0f31, 0x1861: 0x0249, 0x1862: 0x0f41, 0x1863: 0x0259,
+ 0x1864: 0x0f51, 0x1865: 0x0359, 0x1866: 0x0f61, 0x1867: 0x0f71, 0x1868: 0x00d9, 0x1869: 0x0f99,
+ 0x186a: 0x2039, 0x186b: 0x0269, 0x186c: 0x01d9, 0x186d: 0x0fa9, 0x186e: 0x0fb9, 0x186f: 0x1089,
+ 0x1870: 0x0279, 0x1871: 0x0369, 0x1872: 0x0289, 0x1873: 0x13d1, 0x1874: 0x0039, 0x1875: 0x0ee9,
+ 0x1876: 0x1159, 0x1877: 0x0ef9, 0x1878: 0x0f09, 0x1879: 0x1199, 0x187a: 0x0f31, 0x187b: 0x0249,
+ 0x187c: 0x0f41, 0x187d: 0x0259, 0x187e: 0x0f51, 0x187f: 0x0359,
// Block 0x62, offset 0x1880
- 0x1880: 0x0f51, 0x1881: 0x0359, 0x1882: 0x0f61, 0x1883: 0x0f71, 0x1884: 0x0040, 0x1885: 0x0f99,
- 0x1886: 0x2039, 0x1887: 0x0269, 0x1888: 0x01d9, 0x1889: 0x0fa9, 0x188a: 0x0fb9, 0x188b: 0x1089,
- 0x188c: 0x0279, 0x188d: 0x0369, 0x188e: 0x0289, 0x188f: 0x13d1, 0x1890: 0x0039, 0x1891: 0x0ee9,
- 0x1892: 0x1159, 0x1893: 0x0ef9, 0x1894: 0x0f09, 0x1895: 0x1199, 0x1896: 0x0f31, 0x1897: 0x0249,
- 0x1898: 0x0f41, 0x1899: 0x0259, 0x189a: 0x0f51, 0x189b: 0x0359, 0x189c: 0x0f61, 0x189d: 0x0f71,
- 0x189e: 0x00d9, 0x189f: 0x0f99, 0x18a0: 0x2039, 0x18a1: 0x0269, 0x18a2: 0x01d9, 0x18a3: 0x0fa9,
- 0x18a4: 0x0fb9, 0x18a5: 0x1089, 0x18a6: 0x0279, 0x18a7: 0x0369, 0x18a8: 0x0289, 0x18a9: 0x13d1,
- 0x18aa: 0x0039, 0x18ab: 0x0ee9, 0x18ac: 0x1159, 0x18ad: 0x0ef9, 0x18ae: 0x0f09, 0x18af: 0x1199,
- 0x18b0: 0x0f31, 0x18b1: 0x0249, 0x18b2: 0x0f41, 0x18b3: 0x0259, 0x18b4: 0x0f51, 0x18b5: 0x0359,
- 0x18b6: 0x0f61, 0x18b7: 0x0f71, 0x18b8: 0x00d9, 0x18b9: 0x0f99, 0x18ba: 0x2039, 0x18bb: 0x0269,
- 0x18bc: 0x01d9, 0x18bd: 0x0fa9, 0x18be: 0x0fb9, 0x18bf: 0x1089,
+ 0x1880: 0x0f61, 0x1881: 0x0f71, 0x1882: 0x00d9, 0x1883: 0x0f99, 0x1884: 0x2039, 0x1885: 0x0269,
+ 0x1886: 0x01d9, 0x1887: 0x0fa9, 0x1888: 0x0fb9, 0x1889: 0x1089, 0x188a: 0x0279, 0x188b: 0x0369,
+ 0x188c: 0x0289, 0x188d: 0x13d1, 0x188e: 0x0039, 0x188f: 0x0ee9, 0x1890: 0x1159, 0x1891: 0x0ef9,
+ 0x1892: 0x0f09, 0x1893: 0x1199, 0x1894: 0x0f31, 0x1895: 0x0040, 0x1896: 0x0f41, 0x1897: 0x0259,
+ 0x1898: 0x0f51, 0x1899: 0x0359, 0x189a: 0x0f61, 0x189b: 0x0f71, 0x189c: 0x00d9, 0x189d: 0x0f99,
+ 0x189e: 0x2039, 0x189f: 0x0269, 0x18a0: 0x01d9, 0x18a1: 0x0fa9, 0x18a2: 0x0fb9, 0x18a3: 0x1089,
+ 0x18a4: 0x0279, 0x18a5: 0x0369, 0x18a6: 0x0289, 0x18a7: 0x13d1, 0x18a8: 0x0039, 0x18a9: 0x0ee9,
+ 0x18aa: 0x1159, 0x18ab: 0x0ef9, 0x18ac: 0x0f09, 0x18ad: 0x1199, 0x18ae: 0x0f31, 0x18af: 0x0249,
+ 0x18b0: 0x0f41, 0x18b1: 0x0259, 0x18b2: 0x0f51, 0x18b3: 0x0359, 0x18b4: 0x0f61, 0x18b5: 0x0f71,
+ 0x18b6: 0x00d9, 0x18b7: 0x0f99, 0x18b8: 0x2039, 0x18b9: 0x0269, 0x18ba: 0x01d9, 0x18bb: 0x0fa9,
+ 0x18bc: 0x0fb9, 0x18bd: 0x1089, 0x18be: 0x0279, 0x18bf: 0x0369,
// Block 0x63, offset 0x18c0
- 0x18c0: 0x0279, 0x18c1: 0x0369, 0x18c2: 0x0289, 0x18c3: 0x13d1, 0x18c4: 0x0039, 0x18c5: 0x0ee9,
- 0x18c6: 0x0040, 0x18c7: 0x0ef9, 0x18c8: 0x0f09, 0x18c9: 0x1199, 0x18ca: 0x0f31, 0x18cb: 0x0040,
- 0x18cc: 0x0040, 0x18cd: 0x0259, 0x18ce: 0x0f51, 0x18cf: 0x0359, 0x18d0: 0x0f61, 0x18d1: 0x0f71,
- 0x18d2: 0x00d9, 0x18d3: 0x0f99, 0x18d4: 0x2039, 0x18d5: 0x0040, 0x18d6: 0x01d9, 0x18d7: 0x0fa9,
- 0x18d8: 0x0fb9, 0x18d9: 0x1089, 0x18da: 0x0279, 0x18db: 0x0369, 0x18dc: 0x0289, 0x18dd: 0x0040,
- 0x18de: 0x0039, 0x18df: 0x0ee9, 0x18e0: 0x1159, 0x18e1: 0x0ef9, 0x18e2: 0x0f09, 0x18e3: 0x1199,
- 0x18e4: 0x0f31, 0x18e5: 0x0249, 0x18e6: 0x0f41, 0x18e7: 0x0259, 0x18e8: 0x0f51, 0x18e9: 0x0359,
- 0x18ea: 0x0f61, 0x18eb: 0x0f71, 0x18ec: 0x00d9, 0x18ed: 0x0f99, 0x18ee: 0x2039, 0x18ef: 0x0269,
- 0x18f0: 0x01d9, 0x18f1: 0x0fa9, 0x18f2: 0x0fb9, 0x18f3: 0x1089, 0x18f4: 0x0279, 0x18f5: 0x0369,
- 0x18f6: 0x0289, 0x18f7: 0x13d1, 0x18f8: 0x0039, 0x18f9: 0x0ee9, 0x18fa: 0x0040, 0x18fb: 0x0ef9,
- 0x18fc: 0x0f09, 0x18fd: 0x1199, 0x18fe: 0x0f31, 0x18ff: 0x0040,
+ 0x18c0: 0x0289, 0x18c1: 0x13d1, 0x18c2: 0x0039, 0x18c3: 0x0ee9, 0x18c4: 0x1159, 0x18c5: 0x0ef9,
+ 0x18c6: 0x0f09, 0x18c7: 0x1199, 0x18c8: 0x0f31, 0x18c9: 0x0249, 0x18ca: 0x0f41, 0x18cb: 0x0259,
+ 0x18cc: 0x0f51, 0x18cd: 0x0359, 0x18ce: 0x0f61, 0x18cf: 0x0f71, 0x18d0: 0x00d9, 0x18d1: 0x0f99,
+ 0x18d2: 0x2039, 0x18d3: 0x0269, 0x18d4: 0x01d9, 0x18d5: 0x0fa9, 0x18d6: 0x0fb9, 0x18d7: 0x1089,
+ 0x18d8: 0x0279, 0x18d9: 0x0369, 0x18da: 0x0289, 0x18db: 0x13d1, 0x18dc: 0x0039, 0x18dd: 0x0040,
+ 0x18de: 0x1159, 0x18df: 0x0ef9, 0x18e0: 0x0040, 0x18e1: 0x0040, 0x18e2: 0x0f31, 0x18e3: 0x0040,
+ 0x18e4: 0x0040, 0x18e5: 0x0259, 0x18e6: 0x0f51, 0x18e7: 0x0040, 0x18e8: 0x0040, 0x18e9: 0x0f71,
+ 0x18ea: 0x00d9, 0x18eb: 0x0f99, 0x18ec: 0x2039, 0x18ed: 0x0040, 0x18ee: 0x01d9, 0x18ef: 0x0fa9,
+ 0x18f0: 0x0fb9, 0x18f1: 0x1089, 0x18f2: 0x0279, 0x18f3: 0x0369, 0x18f4: 0x0289, 0x18f5: 0x13d1,
+ 0x18f6: 0x0039, 0x18f7: 0x0ee9, 0x18f8: 0x1159, 0x18f9: 0x0ef9, 0x18fa: 0x0040, 0x18fb: 0x1199,
+ 0x18fc: 0x0040, 0x18fd: 0x0249, 0x18fe: 0x0f41, 0x18ff: 0x0259,
// Block 0x64, offset 0x1900
- 0x1900: 0x0f41, 0x1901: 0x0259, 0x1902: 0x0f51, 0x1903: 0x0359, 0x1904: 0x0f61, 0x1905: 0x0040,
- 0x1906: 0x00d9, 0x1907: 0x0040, 0x1908: 0x0040, 0x1909: 0x0040, 0x190a: 0x01d9, 0x190b: 0x0fa9,
- 0x190c: 0x0fb9, 0x190d: 0x1089, 0x190e: 0x0279, 0x190f: 0x0369, 0x1910: 0x0289, 0x1911: 0x0040,
- 0x1912: 0x0039, 0x1913: 0x0ee9, 0x1914: 0x1159, 0x1915: 0x0ef9, 0x1916: 0x0f09, 0x1917: 0x1199,
- 0x1918: 0x0f31, 0x1919: 0x0249, 0x191a: 0x0f41, 0x191b: 0x0259, 0x191c: 0x0f51, 0x191d: 0x0359,
- 0x191e: 0x0f61, 0x191f: 0x0f71, 0x1920: 0x00d9, 0x1921: 0x0f99, 0x1922: 0x2039, 0x1923: 0x0269,
- 0x1924: 0x01d9, 0x1925: 0x0fa9, 0x1926: 0x0fb9, 0x1927: 0x1089, 0x1928: 0x0279, 0x1929: 0x0369,
- 0x192a: 0x0289, 0x192b: 0x13d1, 0x192c: 0x0039, 0x192d: 0x0ee9, 0x192e: 0x1159, 0x192f: 0x0ef9,
- 0x1930: 0x0f09, 0x1931: 0x1199, 0x1932: 0x0f31, 0x1933: 0x0249, 0x1934: 0x0f41, 0x1935: 0x0259,
- 0x1936: 0x0f51, 0x1937: 0x0359, 0x1938: 0x0f61, 0x1939: 0x0f71, 0x193a: 0x00d9, 0x193b: 0x0f99,
- 0x193c: 0x2039, 0x193d: 0x0269, 0x193e: 0x01d9, 0x193f: 0x0fa9,
+ 0x1900: 0x0f51, 0x1901: 0x0359, 0x1902: 0x0f61, 0x1903: 0x0f71, 0x1904: 0x0040, 0x1905: 0x0f99,
+ 0x1906: 0x2039, 0x1907: 0x0269, 0x1908: 0x01d9, 0x1909: 0x0fa9, 0x190a: 0x0fb9, 0x190b: 0x1089,
+ 0x190c: 0x0279, 0x190d: 0x0369, 0x190e: 0x0289, 0x190f: 0x13d1, 0x1910: 0x0039, 0x1911: 0x0ee9,
+ 0x1912: 0x1159, 0x1913: 0x0ef9, 0x1914: 0x0f09, 0x1915: 0x1199, 0x1916: 0x0f31, 0x1917: 0x0249,
+ 0x1918: 0x0f41, 0x1919: 0x0259, 0x191a: 0x0f51, 0x191b: 0x0359, 0x191c: 0x0f61, 0x191d: 0x0f71,
+ 0x191e: 0x00d9, 0x191f: 0x0f99, 0x1920: 0x2039, 0x1921: 0x0269, 0x1922: 0x01d9, 0x1923: 0x0fa9,
+ 0x1924: 0x0fb9, 0x1925: 0x1089, 0x1926: 0x0279, 0x1927: 0x0369, 0x1928: 0x0289, 0x1929: 0x13d1,
+ 0x192a: 0x0039, 0x192b: 0x0ee9, 0x192c: 0x1159, 0x192d: 0x0ef9, 0x192e: 0x0f09, 0x192f: 0x1199,
+ 0x1930: 0x0f31, 0x1931: 0x0249, 0x1932: 0x0f41, 0x1933: 0x0259, 0x1934: 0x0f51, 0x1935: 0x0359,
+ 0x1936: 0x0f61, 0x1937: 0x0f71, 0x1938: 0x00d9, 0x1939: 0x0f99, 0x193a: 0x2039, 0x193b: 0x0269,
+ 0x193c: 0x01d9, 0x193d: 0x0fa9, 0x193e: 0x0fb9, 0x193f: 0x1089,
// Block 0x65, offset 0x1940
- 0x1940: 0x0fb9, 0x1941: 0x1089, 0x1942: 0x0279, 0x1943: 0x0369, 0x1944: 0x0289, 0x1945: 0x13d1,
- 0x1946: 0x0039, 0x1947: 0x0ee9, 0x1948: 0x1159, 0x1949: 0x0ef9, 0x194a: 0x0f09, 0x194b: 0x1199,
- 0x194c: 0x0f31, 0x194d: 0x0249, 0x194e: 0x0f41, 0x194f: 0x0259, 0x1950: 0x0f51, 0x1951: 0x0359,
- 0x1952: 0x0f61, 0x1953: 0x0f71, 0x1954: 0x00d9, 0x1955: 0x0f99, 0x1956: 0x2039, 0x1957: 0x0269,
- 0x1958: 0x01d9, 0x1959: 0x0fa9, 0x195a: 0x0fb9, 0x195b: 0x1089, 0x195c: 0x0279, 0x195d: 0x0369,
- 0x195e: 0x0289, 0x195f: 0x13d1, 0x1960: 0x0039, 0x1961: 0x0ee9, 0x1962: 0x1159, 0x1963: 0x0ef9,
- 0x1964: 0x0f09, 0x1965: 0x1199, 0x1966: 0x0f31, 0x1967: 0x0249, 0x1968: 0x0f41, 0x1969: 0x0259,
- 0x196a: 0x0f51, 0x196b: 0x0359, 0x196c: 0x0f61, 0x196d: 0x0f71, 0x196e: 0x00d9, 0x196f: 0x0f99,
- 0x1970: 0x2039, 0x1971: 0x0269, 0x1972: 0x01d9, 0x1973: 0x0fa9, 0x1974: 0x0fb9, 0x1975: 0x1089,
- 0x1976: 0x0279, 0x1977: 0x0369, 0x1978: 0x0289, 0x1979: 0x13d1, 0x197a: 0x0039, 0x197b: 0x0ee9,
- 0x197c: 0x1159, 0x197d: 0x0ef9, 0x197e: 0x0f09, 0x197f: 0x1199,
+ 0x1940: 0x0279, 0x1941: 0x0369, 0x1942: 0x0289, 0x1943: 0x13d1, 0x1944: 0x0039, 0x1945: 0x0ee9,
+ 0x1946: 0x0040, 0x1947: 0x0ef9, 0x1948: 0x0f09, 0x1949: 0x1199, 0x194a: 0x0f31, 0x194b: 0x0040,
+ 0x194c: 0x0040, 0x194d: 0x0259, 0x194e: 0x0f51, 0x194f: 0x0359, 0x1950: 0x0f61, 0x1951: 0x0f71,
+ 0x1952: 0x00d9, 0x1953: 0x0f99, 0x1954: 0x2039, 0x1955: 0x0040, 0x1956: 0x01d9, 0x1957: 0x0fa9,
+ 0x1958: 0x0fb9, 0x1959: 0x1089, 0x195a: 0x0279, 0x195b: 0x0369, 0x195c: 0x0289, 0x195d: 0x0040,
+ 0x195e: 0x0039, 0x195f: 0x0ee9, 0x1960: 0x1159, 0x1961: 0x0ef9, 0x1962: 0x0f09, 0x1963: 0x1199,
+ 0x1964: 0x0f31, 0x1965: 0x0249, 0x1966: 0x0f41, 0x1967: 0x0259, 0x1968: 0x0f51, 0x1969: 0x0359,
+ 0x196a: 0x0f61, 0x196b: 0x0f71, 0x196c: 0x00d9, 0x196d: 0x0f99, 0x196e: 0x2039, 0x196f: 0x0269,
+ 0x1970: 0x01d9, 0x1971: 0x0fa9, 0x1972: 0x0fb9, 0x1973: 0x1089, 0x1974: 0x0279, 0x1975: 0x0369,
+ 0x1976: 0x0289, 0x1977: 0x13d1, 0x1978: 0x0039, 0x1979: 0x0ee9, 0x197a: 0x0040, 0x197b: 0x0ef9,
+ 0x197c: 0x0f09, 0x197d: 0x1199, 0x197e: 0x0f31, 0x197f: 0x0040,
// Block 0x66, offset 0x1980
- 0x1980: 0x0f31, 0x1981: 0x0249, 0x1982: 0x0f41, 0x1983: 0x0259, 0x1984: 0x0f51, 0x1985: 0x0359,
- 0x1986: 0x0f61, 0x1987: 0x0f71, 0x1988: 0x00d9, 0x1989: 0x0f99, 0x198a: 0x2039, 0x198b: 0x0269,
- 0x198c: 0x01d9, 0x198d: 0x0fa9, 0x198e: 0x0fb9, 0x198f: 0x1089, 0x1990: 0x0279, 0x1991: 0x0369,
- 0x1992: 0x0289, 0x1993: 0x13d1, 0x1994: 0x0039, 0x1995: 0x0ee9, 0x1996: 0x1159, 0x1997: 0x0ef9,
- 0x1998: 0x0f09, 0x1999: 0x1199, 0x199a: 0x0f31, 0x199b: 0x0249, 0x199c: 0x0f41, 0x199d: 0x0259,
- 0x199e: 0x0f51, 0x199f: 0x0359, 0x19a0: 0x0f61, 0x19a1: 0x0f71, 0x19a2: 0x00d9, 0x19a3: 0x0f99,
- 0x19a4: 0x2039, 0x19a5: 0x0269, 0x19a6: 0x01d9, 0x19a7: 0x0fa9, 0x19a8: 0x0fb9, 0x19a9: 0x1089,
- 0x19aa: 0x0279, 0x19ab: 0x0369, 0x19ac: 0x0289, 0x19ad: 0x13d1, 0x19ae: 0x0039, 0x19af: 0x0ee9,
- 0x19b0: 0x1159, 0x19b1: 0x0ef9, 0x19b2: 0x0f09, 0x19b3: 0x1199, 0x19b4: 0x0f31, 0x19b5: 0x0249,
- 0x19b6: 0x0f41, 0x19b7: 0x0259, 0x19b8: 0x0f51, 0x19b9: 0x0359, 0x19ba: 0x0f61, 0x19bb: 0x0f71,
- 0x19bc: 0x00d9, 0x19bd: 0x0f99, 0x19be: 0x2039, 0x19bf: 0x0269,
+ 0x1980: 0x0f41, 0x1981: 0x0259, 0x1982: 0x0f51, 0x1983: 0x0359, 0x1984: 0x0f61, 0x1985: 0x0040,
+ 0x1986: 0x00d9, 0x1987: 0x0040, 0x1988: 0x0040, 0x1989: 0x0040, 0x198a: 0x01d9, 0x198b: 0x0fa9,
+ 0x198c: 0x0fb9, 0x198d: 0x1089, 0x198e: 0x0279, 0x198f: 0x0369, 0x1990: 0x0289, 0x1991: 0x0040,
+ 0x1992: 0x0039, 0x1993: 0x0ee9, 0x1994: 0x1159, 0x1995: 0x0ef9, 0x1996: 0x0f09, 0x1997: 0x1199,
+ 0x1998: 0x0f31, 0x1999: 0x0249, 0x199a: 0x0f41, 0x199b: 0x0259, 0x199c: 0x0f51, 0x199d: 0x0359,
+ 0x199e: 0x0f61, 0x199f: 0x0f71, 0x19a0: 0x00d9, 0x19a1: 0x0f99, 0x19a2: 0x2039, 0x19a3: 0x0269,
+ 0x19a4: 0x01d9, 0x19a5: 0x0fa9, 0x19a6: 0x0fb9, 0x19a7: 0x1089, 0x19a8: 0x0279, 0x19a9: 0x0369,
+ 0x19aa: 0x0289, 0x19ab: 0x13d1, 0x19ac: 0x0039, 0x19ad: 0x0ee9, 0x19ae: 0x1159, 0x19af: 0x0ef9,
+ 0x19b0: 0x0f09, 0x19b1: 0x1199, 0x19b2: 0x0f31, 0x19b3: 0x0249, 0x19b4: 0x0f41, 0x19b5: 0x0259,
+ 0x19b6: 0x0f51, 0x19b7: 0x0359, 0x19b8: 0x0f61, 0x19b9: 0x0f71, 0x19ba: 0x00d9, 0x19bb: 0x0f99,
+ 0x19bc: 0x2039, 0x19bd: 0x0269, 0x19be: 0x01d9, 0x19bf: 0x0fa9,
// Block 0x67, offset 0x19c0
- 0x19c0: 0x01d9, 0x19c1: 0x0fa9, 0x19c2: 0x0fb9, 0x19c3: 0x1089, 0x19c4: 0x0279, 0x19c5: 0x0369,
- 0x19c6: 0x0289, 0x19c7: 0x13d1, 0x19c8: 0x0039, 0x19c9: 0x0ee9, 0x19ca: 0x1159, 0x19cb: 0x0ef9,
- 0x19cc: 0x0f09, 0x19cd: 0x1199, 0x19ce: 0x0f31, 0x19cf: 0x0249, 0x19d0: 0x0f41, 0x19d1: 0x0259,
- 0x19d2: 0x0f51, 0x19d3: 0x0359, 0x19d4: 0x0f61, 0x19d5: 0x0f71, 0x19d6: 0x00d9, 0x19d7: 0x0f99,
- 0x19d8: 0x2039, 0x19d9: 0x0269, 0x19da: 0x01d9, 0x19db: 0x0fa9, 0x19dc: 0x0fb9, 0x19dd: 0x1089,
- 0x19de: 0x0279, 0x19df: 0x0369, 0x19e0: 0x0289, 0x19e1: 0x13d1, 0x19e2: 0x0039, 0x19e3: 0x0ee9,
- 0x19e4: 0x1159, 0x19e5: 0x0ef9, 0x19e6: 0x0f09, 0x19e7: 0x1199, 0x19e8: 0x0f31, 0x19e9: 0x0249,
- 0x19ea: 0x0f41, 0x19eb: 0x0259, 0x19ec: 0x0f51, 0x19ed: 0x0359, 0x19ee: 0x0f61, 0x19ef: 0x0f71,
- 0x19f0: 0x00d9, 0x19f1: 0x0f99, 0x19f2: 0x2039, 0x19f3: 0x0269, 0x19f4: 0x01d9, 0x19f5: 0x0fa9,
- 0x19f6: 0x0fb9, 0x19f7: 0x1089, 0x19f8: 0x0279, 0x19f9: 0x0369, 0x19fa: 0x0289, 0x19fb: 0x13d1,
- 0x19fc: 0x0039, 0x19fd: 0x0ee9, 0x19fe: 0x1159, 0x19ff: 0x0ef9,
+ 0x19c0: 0x0fb9, 0x19c1: 0x1089, 0x19c2: 0x0279, 0x19c3: 0x0369, 0x19c4: 0x0289, 0x19c5: 0x13d1,
+ 0x19c6: 0x0039, 0x19c7: 0x0ee9, 0x19c8: 0x1159, 0x19c9: 0x0ef9, 0x19ca: 0x0f09, 0x19cb: 0x1199,
+ 0x19cc: 0x0f31, 0x19cd: 0x0249, 0x19ce: 0x0f41, 0x19cf: 0x0259, 0x19d0: 0x0f51, 0x19d1: 0x0359,
+ 0x19d2: 0x0f61, 0x19d3: 0x0f71, 0x19d4: 0x00d9, 0x19d5: 0x0f99, 0x19d6: 0x2039, 0x19d7: 0x0269,
+ 0x19d8: 0x01d9, 0x19d9: 0x0fa9, 0x19da: 0x0fb9, 0x19db: 0x1089, 0x19dc: 0x0279, 0x19dd: 0x0369,
+ 0x19de: 0x0289, 0x19df: 0x13d1, 0x19e0: 0x0039, 0x19e1: 0x0ee9, 0x19e2: 0x1159, 0x19e3: 0x0ef9,
+ 0x19e4: 0x0f09, 0x19e5: 0x1199, 0x19e6: 0x0f31, 0x19e7: 0x0249, 0x19e8: 0x0f41, 0x19e9: 0x0259,
+ 0x19ea: 0x0f51, 0x19eb: 0x0359, 0x19ec: 0x0f61, 0x19ed: 0x0f71, 0x19ee: 0x00d9, 0x19ef: 0x0f99,
+ 0x19f0: 0x2039, 0x19f1: 0x0269, 0x19f2: 0x01d9, 0x19f3: 0x0fa9, 0x19f4: 0x0fb9, 0x19f5: 0x1089,
+ 0x19f6: 0x0279, 0x19f7: 0x0369, 0x19f8: 0x0289, 0x19f9: 0x13d1, 0x19fa: 0x0039, 0x19fb: 0x0ee9,
+ 0x19fc: 0x1159, 0x19fd: 0x0ef9, 0x19fe: 0x0f09, 0x19ff: 0x1199,
// Block 0x68, offset 0x1a00
- 0x1a00: 0x0f09, 0x1a01: 0x1199, 0x1a02: 0x0f31, 0x1a03: 0x0249, 0x1a04: 0x0f41, 0x1a05: 0x0259,
- 0x1a06: 0x0f51, 0x1a07: 0x0359, 0x1a08: 0x0f61, 0x1a09: 0x0f71, 0x1a0a: 0x00d9, 0x1a0b: 0x0f99,
- 0x1a0c: 0x2039, 0x1a0d: 0x0269, 0x1a0e: 0x01d9, 0x1a0f: 0x0fa9, 0x1a10: 0x0fb9, 0x1a11: 0x1089,
- 0x1a12: 0x0279, 0x1a13: 0x0369, 0x1a14: 0x0289, 0x1a15: 0x13d1, 0x1a16: 0x0039, 0x1a17: 0x0ee9,
- 0x1a18: 0x1159, 0x1a19: 0x0ef9, 0x1a1a: 0x0f09, 0x1a1b: 0x1199, 0x1a1c: 0x0f31, 0x1a1d: 0x0249,
- 0x1a1e: 0x0f41, 0x1a1f: 0x0259, 0x1a20: 0x0f51, 0x1a21: 0x0359, 0x1a22: 0x0f61, 0x1a23: 0x0f71,
- 0x1a24: 0x00d9, 0x1a25: 0x0f99, 0x1a26: 0x2039, 0x1a27: 0x0269, 0x1a28: 0x01d9, 0x1a29: 0x0fa9,
- 0x1a2a: 0x0fb9, 0x1a2b: 0x1089, 0x1a2c: 0x0279, 0x1a2d: 0x0369, 0x1a2e: 0x0289, 0x1a2f: 0x13d1,
- 0x1a30: 0x0039, 0x1a31: 0x0ee9, 0x1a32: 0x1159, 0x1a33: 0x0ef9, 0x1a34: 0x0f09, 0x1a35: 0x1199,
- 0x1a36: 0x0f31, 0x1a37: 0x0249, 0x1a38: 0x0f41, 0x1a39: 0x0259, 0x1a3a: 0x0f51, 0x1a3b: 0x0359,
- 0x1a3c: 0x0f61, 0x1a3d: 0x0f71, 0x1a3e: 0x00d9, 0x1a3f: 0x0f99,
+ 0x1a00: 0x0f31, 0x1a01: 0x0249, 0x1a02: 0x0f41, 0x1a03: 0x0259, 0x1a04: 0x0f51, 0x1a05: 0x0359,
+ 0x1a06: 0x0f61, 0x1a07: 0x0f71, 0x1a08: 0x00d9, 0x1a09: 0x0f99, 0x1a0a: 0x2039, 0x1a0b: 0x0269,
+ 0x1a0c: 0x01d9, 0x1a0d: 0x0fa9, 0x1a0e: 0x0fb9, 0x1a0f: 0x1089, 0x1a10: 0x0279, 0x1a11: 0x0369,
+ 0x1a12: 0x0289, 0x1a13: 0x13d1, 0x1a14: 0x0039, 0x1a15: 0x0ee9, 0x1a16: 0x1159, 0x1a17: 0x0ef9,
+ 0x1a18: 0x0f09, 0x1a19: 0x1199, 0x1a1a: 0x0f31, 0x1a1b: 0x0249, 0x1a1c: 0x0f41, 0x1a1d: 0x0259,
+ 0x1a1e: 0x0f51, 0x1a1f: 0x0359, 0x1a20: 0x0f61, 0x1a21: 0x0f71, 0x1a22: 0x00d9, 0x1a23: 0x0f99,
+ 0x1a24: 0x2039, 0x1a25: 0x0269, 0x1a26: 0x01d9, 0x1a27: 0x0fa9, 0x1a28: 0x0fb9, 0x1a29: 0x1089,
+ 0x1a2a: 0x0279, 0x1a2b: 0x0369, 0x1a2c: 0x0289, 0x1a2d: 0x13d1, 0x1a2e: 0x0039, 0x1a2f: 0x0ee9,
+ 0x1a30: 0x1159, 0x1a31: 0x0ef9, 0x1a32: 0x0f09, 0x1a33: 0x1199, 0x1a34: 0x0f31, 0x1a35: 0x0249,
+ 0x1a36: 0x0f41, 0x1a37: 0x0259, 0x1a38: 0x0f51, 0x1a39: 0x0359, 0x1a3a: 0x0f61, 0x1a3b: 0x0f71,
+ 0x1a3c: 0x00d9, 0x1a3d: 0x0f99, 0x1a3e: 0x2039, 0x1a3f: 0x0269,
// Block 0x69, offset 0x1a40
- 0x1a40: 0x2039, 0x1a41: 0x0269, 0x1a42: 0x01d9, 0x1a43: 0x0fa9, 0x1a44: 0x0fb9, 0x1a45: 0x1089,
- 0x1a46: 0x0279, 0x1a47: 0x0369, 0x1a48: 0x0289, 0x1a49: 0x13d1, 0x1a4a: 0x0039, 0x1a4b: 0x0ee9,
- 0x1a4c: 0x1159, 0x1a4d: 0x0ef9, 0x1a4e: 0x0f09, 0x1a4f: 0x1199, 0x1a50: 0x0f31, 0x1a51: 0x0249,
- 0x1a52: 0x0f41, 0x1a53: 0x0259, 0x1a54: 0x0f51, 0x1a55: 0x0359, 0x1a56: 0x0f61, 0x1a57: 0x0f71,
- 0x1a58: 0x00d9, 0x1a59: 0x0f99, 0x1a5a: 0x2039, 0x1a5b: 0x0269, 0x1a5c: 0x01d9, 0x1a5d: 0x0fa9,
- 0x1a5e: 0x0fb9, 0x1a5f: 0x1089, 0x1a60: 0x0279, 0x1a61: 0x0369, 0x1a62: 0x0289, 0x1a63: 0x13d1,
- 0x1a64: 0xba81, 0x1a65: 0xba99, 0x1a66: 0x0040, 0x1a67: 0x0040, 0x1a68: 0xbab1, 0x1a69: 0x1099,
- 0x1a6a: 0x10b1, 0x1a6b: 0x10c9, 0x1a6c: 0xbac9, 0x1a6d: 0xbae1, 0x1a6e: 0xbaf9, 0x1a6f: 0x1429,
- 0x1a70: 0x1a31, 0x1a71: 0xbb11, 0x1a72: 0xbb29, 0x1a73: 0xbb41, 0x1a74: 0xbb59, 0x1a75: 0xbb71,
- 0x1a76: 0xbb89, 0x1a77: 0x2109, 0x1a78: 0x1111, 0x1a79: 0x1429, 0x1a7a: 0xbba1, 0x1a7b: 0xbbb9,
- 0x1a7c: 0xbbd1, 0x1a7d: 0x10e1, 0x1a7e: 0x10f9, 0x1a7f: 0xbbe9,
+ 0x1a40: 0x01d9, 0x1a41: 0x0fa9, 0x1a42: 0x0fb9, 0x1a43: 0x1089, 0x1a44: 0x0279, 0x1a45: 0x0369,
+ 0x1a46: 0x0289, 0x1a47: 0x13d1, 0x1a48: 0x0039, 0x1a49: 0x0ee9, 0x1a4a: 0x1159, 0x1a4b: 0x0ef9,
+ 0x1a4c: 0x0f09, 0x1a4d: 0x1199, 0x1a4e: 0x0f31, 0x1a4f: 0x0249, 0x1a50: 0x0f41, 0x1a51: 0x0259,
+ 0x1a52: 0x0f51, 0x1a53: 0x0359, 0x1a54: 0x0f61, 0x1a55: 0x0f71, 0x1a56: 0x00d9, 0x1a57: 0x0f99,
+ 0x1a58: 0x2039, 0x1a59: 0x0269, 0x1a5a: 0x01d9, 0x1a5b: 0x0fa9, 0x1a5c: 0x0fb9, 0x1a5d: 0x1089,
+ 0x1a5e: 0x0279, 0x1a5f: 0x0369, 0x1a60: 0x0289, 0x1a61: 0x13d1, 0x1a62: 0x0039, 0x1a63: 0x0ee9,
+ 0x1a64: 0x1159, 0x1a65: 0x0ef9, 0x1a66: 0x0f09, 0x1a67: 0x1199, 0x1a68: 0x0f31, 0x1a69: 0x0249,
+ 0x1a6a: 0x0f41, 0x1a6b: 0x0259, 0x1a6c: 0x0f51, 0x1a6d: 0x0359, 0x1a6e: 0x0f61, 0x1a6f: 0x0f71,
+ 0x1a70: 0x00d9, 0x1a71: 0x0f99, 0x1a72: 0x2039, 0x1a73: 0x0269, 0x1a74: 0x01d9, 0x1a75: 0x0fa9,
+ 0x1a76: 0x0fb9, 0x1a77: 0x1089, 0x1a78: 0x0279, 0x1a79: 0x0369, 0x1a7a: 0x0289, 0x1a7b: 0x13d1,
+ 0x1a7c: 0x0039, 0x1a7d: 0x0ee9, 0x1a7e: 0x1159, 0x1a7f: 0x0ef9,
// Block 0x6a, offset 0x1a80
- 0x1a80: 0x2079, 0x1a81: 0xbc01, 0x1a82: 0xbab1, 0x1a83: 0x1099, 0x1a84: 0x10b1, 0x1a85: 0x10c9,
- 0x1a86: 0xbac9, 0x1a87: 0xbae1, 0x1a88: 0xbaf9, 0x1a89: 0x1429, 0x1a8a: 0x1a31, 0x1a8b: 0xbb11,
- 0x1a8c: 0xbb29, 0x1a8d: 0xbb41, 0x1a8e: 0xbb59, 0x1a8f: 0xbb71, 0x1a90: 0xbb89, 0x1a91: 0x2109,
- 0x1a92: 0x1111, 0x1a93: 0xbba1, 0x1a94: 0xbba1, 0x1a95: 0xbbb9, 0x1a96: 0xbbd1, 0x1a97: 0x10e1,
- 0x1a98: 0x10f9, 0x1a99: 0xbbe9, 0x1a9a: 0x2079, 0x1a9b: 0xbc21, 0x1a9c: 0xbac9, 0x1a9d: 0x1429,
- 0x1a9e: 0xbb11, 0x1a9f: 0x10e1, 0x1aa0: 0x1111, 0x1aa1: 0x2109, 0x1aa2: 0xbab1, 0x1aa3: 0x1099,
- 0x1aa4: 0x10b1, 0x1aa5: 0x10c9, 0x1aa6: 0xbac9, 0x1aa7: 0xbae1, 0x1aa8: 0xbaf9, 0x1aa9: 0x1429,
- 0x1aaa: 0x1a31, 0x1aab: 0xbb11, 0x1aac: 0xbb29, 0x1aad: 0xbb41, 0x1aae: 0xbb59, 0x1aaf: 0xbb71,
- 0x1ab0: 0xbb89, 0x1ab1: 0x2109, 0x1ab2: 0x1111, 0x1ab3: 0x1429, 0x1ab4: 0xbba1, 0x1ab5: 0xbbb9,
- 0x1ab6: 0xbbd1, 0x1ab7: 0x10e1, 0x1ab8: 0x10f9, 0x1ab9: 0xbbe9, 0x1aba: 0x2079, 0x1abb: 0xbc01,
- 0x1abc: 0xbab1, 0x1abd: 0x1099, 0x1abe: 0x10b1, 0x1abf: 0x10c9,
+ 0x1a80: 0x0f09, 0x1a81: 0x1199, 0x1a82: 0x0f31, 0x1a83: 0x0249, 0x1a84: 0x0f41, 0x1a85: 0x0259,
+ 0x1a86: 0x0f51, 0x1a87: 0x0359, 0x1a88: 0x0f61, 0x1a89: 0x0f71, 0x1a8a: 0x00d9, 0x1a8b: 0x0f99,
+ 0x1a8c: 0x2039, 0x1a8d: 0x0269, 0x1a8e: 0x01d9, 0x1a8f: 0x0fa9, 0x1a90: 0x0fb9, 0x1a91: 0x1089,
+ 0x1a92: 0x0279, 0x1a93: 0x0369, 0x1a94: 0x0289, 0x1a95: 0x13d1, 0x1a96: 0x0039, 0x1a97: 0x0ee9,
+ 0x1a98: 0x1159, 0x1a99: 0x0ef9, 0x1a9a: 0x0f09, 0x1a9b: 0x1199, 0x1a9c: 0x0f31, 0x1a9d: 0x0249,
+ 0x1a9e: 0x0f41, 0x1a9f: 0x0259, 0x1aa0: 0x0f51, 0x1aa1: 0x0359, 0x1aa2: 0x0f61, 0x1aa3: 0x0f71,
+ 0x1aa4: 0x00d9, 0x1aa5: 0x0f99, 0x1aa6: 0x2039, 0x1aa7: 0x0269, 0x1aa8: 0x01d9, 0x1aa9: 0x0fa9,
+ 0x1aaa: 0x0fb9, 0x1aab: 0x1089, 0x1aac: 0x0279, 0x1aad: 0x0369, 0x1aae: 0x0289, 0x1aaf: 0x13d1,
+ 0x1ab0: 0x0039, 0x1ab1: 0x0ee9, 0x1ab2: 0x1159, 0x1ab3: 0x0ef9, 0x1ab4: 0x0f09, 0x1ab5: 0x1199,
+ 0x1ab6: 0x0f31, 0x1ab7: 0x0249, 0x1ab8: 0x0f41, 0x1ab9: 0x0259, 0x1aba: 0x0f51, 0x1abb: 0x0359,
+ 0x1abc: 0x0f61, 0x1abd: 0x0f71, 0x1abe: 0x00d9, 0x1abf: 0x0f99,
// Block 0x6b, offset 0x1ac0
- 0x1ac0: 0xbac9, 0x1ac1: 0xbae1, 0x1ac2: 0xbaf9, 0x1ac3: 0x1429, 0x1ac4: 0x1a31, 0x1ac5: 0xbb11,
- 0x1ac6: 0xbb29, 0x1ac7: 0xbb41, 0x1ac8: 0xbb59, 0x1ac9: 0xbb71, 0x1aca: 0xbb89, 0x1acb: 0x2109,
- 0x1acc: 0x1111, 0x1acd: 0xbba1, 0x1ace: 0xbba1, 0x1acf: 0xbbb9, 0x1ad0: 0xbbd1, 0x1ad1: 0x10e1,
- 0x1ad2: 0x10f9, 0x1ad3: 0xbbe9, 0x1ad4: 0x2079, 0x1ad5: 0xbc21, 0x1ad6: 0xbac9, 0x1ad7: 0x1429,
- 0x1ad8: 0xbb11, 0x1ad9: 0x10e1, 0x1ada: 0x1111, 0x1adb: 0x2109, 0x1adc: 0xbab1, 0x1add: 0x1099,
- 0x1ade: 0x10b1, 0x1adf: 0x10c9, 0x1ae0: 0xbac9, 0x1ae1: 0xbae1, 0x1ae2: 0xbaf9, 0x1ae3: 0x1429,
- 0x1ae4: 0x1a31, 0x1ae5: 0xbb11, 0x1ae6: 0xbb29, 0x1ae7: 0xbb41, 0x1ae8: 0xbb59, 0x1ae9: 0xbb71,
- 0x1aea: 0xbb89, 0x1aeb: 0x2109, 0x1aec: 0x1111, 0x1aed: 0x1429, 0x1aee: 0xbba1, 0x1aef: 0xbbb9,
- 0x1af0: 0xbbd1, 0x1af1: 0x10e1, 0x1af2: 0x10f9, 0x1af3: 0xbbe9, 0x1af4: 0x2079, 0x1af5: 0xbc01,
- 0x1af6: 0xbab1, 0x1af7: 0x1099, 0x1af8: 0x10b1, 0x1af9: 0x10c9, 0x1afa: 0xbac9, 0x1afb: 0xbae1,
- 0x1afc: 0xbaf9, 0x1afd: 0x1429, 0x1afe: 0x1a31, 0x1aff: 0xbb11,
+ 0x1ac0: 0x2039, 0x1ac1: 0x0269, 0x1ac2: 0x01d9, 0x1ac3: 0x0fa9, 0x1ac4: 0x0fb9, 0x1ac5: 0x1089,
+ 0x1ac6: 0x0279, 0x1ac7: 0x0369, 0x1ac8: 0x0289, 0x1ac9: 0x13d1, 0x1aca: 0x0039, 0x1acb: 0x0ee9,
+ 0x1acc: 0x1159, 0x1acd: 0x0ef9, 0x1ace: 0x0f09, 0x1acf: 0x1199, 0x1ad0: 0x0f31, 0x1ad1: 0x0249,
+ 0x1ad2: 0x0f41, 0x1ad3: 0x0259, 0x1ad4: 0x0f51, 0x1ad5: 0x0359, 0x1ad6: 0x0f61, 0x1ad7: 0x0f71,
+ 0x1ad8: 0x00d9, 0x1ad9: 0x0f99, 0x1ada: 0x2039, 0x1adb: 0x0269, 0x1adc: 0x01d9, 0x1add: 0x0fa9,
+ 0x1ade: 0x0fb9, 0x1adf: 0x1089, 0x1ae0: 0x0279, 0x1ae1: 0x0369, 0x1ae2: 0x0289, 0x1ae3: 0x13d1,
+ 0x1ae4: 0xba81, 0x1ae5: 0xba99, 0x1ae6: 0x0040, 0x1ae7: 0x0040, 0x1ae8: 0xbab1, 0x1ae9: 0x1099,
+ 0x1aea: 0x10b1, 0x1aeb: 0x10c9, 0x1aec: 0xbac9, 0x1aed: 0xbae1, 0x1aee: 0xbaf9, 0x1aef: 0x1429,
+ 0x1af0: 0x1a31, 0x1af1: 0xbb11, 0x1af2: 0xbb29, 0x1af3: 0xbb41, 0x1af4: 0xbb59, 0x1af5: 0xbb71,
+ 0x1af6: 0xbb89, 0x1af7: 0x2109, 0x1af8: 0x1111, 0x1af9: 0x1429, 0x1afa: 0xbba1, 0x1afb: 0xbbb9,
+ 0x1afc: 0xbbd1, 0x1afd: 0x10e1, 0x1afe: 0x10f9, 0x1aff: 0xbbe9,
// Block 0x6c, offset 0x1b00
- 0x1b00: 0xbb29, 0x1b01: 0xbb41, 0x1b02: 0xbb59, 0x1b03: 0xbb71, 0x1b04: 0xbb89, 0x1b05: 0x2109,
- 0x1b06: 0x1111, 0x1b07: 0xbba1, 0x1b08: 0xbba1, 0x1b09: 0xbbb9, 0x1b0a: 0xbbd1, 0x1b0b: 0x10e1,
- 0x1b0c: 0x10f9, 0x1b0d: 0xbbe9, 0x1b0e: 0x2079, 0x1b0f: 0xbc21, 0x1b10: 0xbac9, 0x1b11: 0x1429,
- 0x1b12: 0xbb11, 0x1b13: 0x10e1, 0x1b14: 0x1111, 0x1b15: 0x2109, 0x1b16: 0xbab1, 0x1b17: 0x1099,
- 0x1b18: 0x10b1, 0x1b19: 0x10c9, 0x1b1a: 0xbac9, 0x1b1b: 0xbae1, 0x1b1c: 0xbaf9, 0x1b1d: 0x1429,
- 0x1b1e: 0x1a31, 0x1b1f: 0xbb11, 0x1b20: 0xbb29, 0x1b21: 0xbb41, 0x1b22: 0xbb59, 0x1b23: 0xbb71,
- 0x1b24: 0xbb89, 0x1b25: 0x2109, 0x1b26: 0x1111, 0x1b27: 0x1429, 0x1b28: 0xbba1, 0x1b29: 0xbbb9,
- 0x1b2a: 0xbbd1, 0x1b2b: 0x10e1, 0x1b2c: 0x10f9, 0x1b2d: 0xbbe9, 0x1b2e: 0x2079, 0x1b2f: 0xbc01,
- 0x1b30: 0xbab1, 0x1b31: 0x1099, 0x1b32: 0x10b1, 0x1b33: 0x10c9, 0x1b34: 0xbac9, 0x1b35: 0xbae1,
- 0x1b36: 0xbaf9, 0x1b37: 0x1429, 0x1b38: 0x1a31, 0x1b39: 0xbb11, 0x1b3a: 0xbb29, 0x1b3b: 0xbb41,
- 0x1b3c: 0xbb59, 0x1b3d: 0xbb71, 0x1b3e: 0xbb89, 0x1b3f: 0x2109,
+ 0x1b00: 0x2079, 0x1b01: 0xbc01, 0x1b02: 0xbab1, 0x1b03: 0x1099, 0x1b04: 0x10b1, 0x1b05: 0x10c9,
+ 0x1b06: 0xbac9, 0x1b07: 0xbae1, 0x1b08: 0xbaf9, 0x1b09: 0x1429, 0x1b0a: 0x1a31, 0x1b0b: 0xbb11,
+ 0x1b0c: 0xbb29, 0x1b0d: 0xbb41, 0x1b0e: 0xbb59, 0x1b0f: 0xbb71, 0x1b10: 0xbb89, 0x1b11: 0x2109,
+ 0x1b12: 0x1111, 0x1b13: 0xbba1, 0x1b14: 0xbba1, 0x1b15: 0xbbb9, 0x1b16: 0xbbd1, 0x1b17: 0x10e1,
+ 0x1b18: 0x10f9, 0x1b19: 0xbbe9, 0x1b1a: 0x2079, 0x1b1b: 0xbc21, 0x1b1c: 0xbac9, 0x1b1d: 0x1429,
+ 0x1b1e: 0xbb11, 0x1b1f: 0x10e1, 0x1b20: 0x1111, 0x1b21: 0x2109, 0x1b22: 0xbab1, 0x1b23: 0x1099,
+ 0x1b24: 0x10b1, 0x1b25: 0x10c9, 0x1b26: 0xbac9, 0x1b27: 0xbae1, 0x1b28: 0xbaf9, 0x1b29: 0x1429,
+ 0x1b2a: 0x1a31, 0x1b2b: 0xbb11, 0x1b2c: 0xbb29, 0x1b2d: 0xbb41, 0x1b2e: 0xbb59, 0x1b2f: 0xbb71,
+ 0x1b30: 0xbb89, 0x1b31: 0x2109, 0x1b32: 0x1111, 0x1b33: 0x1429, 0x1b34: 0xbba1, 0x1b35: 0xbbb9,
+ 0x1b36: 0xbbd1, 0x1b37: 0x10e1, 0x1b38: 0x10f9, 0x1b39: 0xbbe9, 0x1b3a: 0x2079, 0x1b3b: 0xbc01,
+ 0x1b3c: 0xbab1, 0x1b3d: 0x1099, 0x1b3e: 0x10b1, 0x1b3f: 0x10c9,
// Block 0x6d, offset 0x1b40
- 0x1b40: 0x1111, 0x1b41: 0xbba1, 0x1b42: 0xbba1, 0x1b43: 0xbbb9, 0x1b44: 0xbbd1, 0x1b45: 0x10e1,
- 0x1b46: 0x10f9, 0x1b47: 0xbbe9, 0x1b48: 0x2079, 0x1b49: 0xbc21, 0x1b4a: 0xbac9, 0x1b4b: 0x1429,
- 0x1b4c: 0xbb11, 0x1b4d: 0x10e1, 0x1b4e: 0x1111, 0x1b4f: 0x2109, 0x1b50: 0xbab1, 0x1b51: 0x1099,
- 0x1b52: 0x10b1, 0x1b53: 0x10c9, 0x1b54: 0xbac9, 0x1b55: 0xbae1, 0x1b56: 0xbaf9, 0x1b57: 0x1429,
- 0x1b58: 0x1a31, 0x1b59: 0xbb11, 0x1b5a: 0xbb29, 0x1b5b: 0xbb41, 0x1b5c: 0xbb59, 0x1b5d: 0xbb71,
- 0x1b5e: 0xbb89, 0x1b5f: 0x2109, 0x1b60: 0x1111, 0x1b61: 0x1429, 0x1b62: 0xbba1, 0x1b63: 0xbbb9,
- 0x1b64: 0xbbd1, 0x1b65: 0x10e1, 0x1b66: 0x10f9, 0x1b67: 0xbbe9, 0x1b68: 0x2079, 0x1b69: 0xbc01,
- 0x1b6a: 0xbab1, 0x1b6b: 0x1099, 0x1b6c: 0x10b1, 0x1b6d: 0x10c9, 0x1b6e: 0xbac9, 0x1b6f: 0xbae1,
- 0x1b70: 0xbaf9, 0x1b71: 0x1429, 0x1b72: 0x1a31, 0x1b73: 0xbb11, 0x1b74: 0xbb29, 0x1b75: 0xbb41,
- 0x1b76: 0xbb59, 0x1b77: 0xbb71, 0x1b78: 0xbb89, 0x1b79: 0x2109, 0x1b7a: 0x1111, 0x1b7b: 0xbba1,
- 0x1b7c: 0xbba1, 0x1b7d: 0xbbb9, 0x1b7e: 0xbbd1, 0x1b7f: 0x10e1,
+ 0x1b40: 0xbac9, 0x1b41: 0xbae1, 0x1b42: 0xbaf9, 0x1b43: 0x1429, 0x1b44: 0x1a31, 0x1b45: 0xbb11,
+ 0x1b46: 0xbb29, 0x1b47: 0xbb41, 0x1b48: 0xbb59, 0x1b49: 0xbb71, 0x1b4a: 0xbb89, 0x1b4b: 0x2109,
+ 0x1b4c: 0x1111, 0x1b4d: 0xbba1, 0x1b4e: 0xbba1, 0x1b4f: 0xbbb9, 0x1b50: 0xbbd1, 0x1b51: 0x10e1,
+ 0x1b52: 0x10f9, 0x1b53: 0xbbe9, 0x1b54: 0x2079, 0x1b55: 0xbc21, 0x1b56: 0xbac9, 0x1b57: 0x1429,
+ 0x1b58: 0xbb11, 0x1b59: 0x10e1, 0x1b5a: 0x1111, 0x1b5b: 0x2109, 0x1b5c: 0xbab1, 0x1b5d: 0x1099,
+ 0x1b5e: 0x10b1, 0x1b5f: 0x10c9, 0x1b60: 0xbac9, 0x1b61: 0xbae1, 0x1b62: 0xbaf9, 0x1b63: 0x1429,
+ 0x1b64: 0x1a31, 0x1b65: 0xbb11, 0x1b66: 0xbb29, 0x1b67: 0xbb41, 0x1b68: 0xbb59, 0x1b69: 0xbb71,
+ 0x1b6a: 0xbb89, 0x1b6b: 0x2109, 0x1b6c: 0x1111, 0x1b6d: 0x1429, 0x1b6e: 0xbba1, 0x1b6f: 0xbbb9,
+ 0x1b70: 0xbbd1, 0x1b71: 0x10e1, 0x1b72: 0x10f9, 0x1b73: 0xbbe9, 0x1b74: 0x2079, 0x1b75: 0xbc01,
+ 0x1b76: 0xbab1, 0x1b77: 0x1099, 0x1b78: 0x10b1, 0x1b79: 0x10c9, 0x1b7a: 0xbac9, 0x1b7b: 0xbae1,
+ 0x1b7c: 0xbaf9, 0x1b7d: 0x1429, 0x1b7e: 0x1a31, 0x1b7f: 0xbb11,
// Block 0x6e, offset 0x1b80
- 0x1b80: 0x10f9, 0x1b81: 0xbbe9, 0x1b82: 0x2079, 0x1b83: 0xbc21, 0x1b84: 0xbac9, 0x1b85: 0x1429,
- 0x1b86: 0xbb11, 0x1b87: 0x10e1, 0x1b88: 0x1111, 0x1b89: 0x2109, 0x1b8a: 0xbc41, 0x1b8b: 0xbc41,
- 0x1b8c: 0x0040, 0x1b8d: 0x0040, 0x1b8e: 0x1f41, 0x1b8f: 0x00c9, 0x1b90: 0x0069, 0x1b91: 0x0079,
- 0x1b92: 0x1f51, 0x1b93: 0x1f61, 0x1b94: 0x1f71, 0x1b95: 0x1f81, 0x1b96: 0x1f91, 0x1b97: 0x1fa1,
- 0x1b98: 0x1f41, 0x1b99: 0x00c9, 0x1b9a: 0x0069, 0x1b9b: 0x0079, 0x1b9c: 0x1f51, 0x1b9d: 0x1f61,
- 0x1b9e: 0x1f71, 0x1b9f: 0x1f81, 0x1ba0: 0x1f91, 0x1ba1: 0x1fa1, 0x1ba2: 0x1f41, 0x1ba3: 0x00c9,
- 0x1ba4: 0x0069, 0x1ba5: 0x0079, 0x1ba6: 0x1f51, 0x1ba7: 0x1f61, 0x1ba8: 0x1f71, 0x1ba9: 0x1f81,
- 0x1baa: 0x1f91, 0x1bab: 0x1fa1, 0x1bac: 0x1f41, 0x1bad: 0x00c9, 0x1bae: 0x0069, 0x1baf: 0x0079,
- 0x1bb0: 0x1f51, 0x1bb1: 0x1f61, 0x1bb2: 0x1f71, 0x1bb3: 0x1f81, 0x1bb4: 0x1f91, 0x1bb5: 0x1fa1,
- 0x1bb6: 0x1f41, 0x1bb7: 0x00c9, 0x1bb8: 0x0069, 0x1bb9: 0x0079, 0x1bba: 0x1f51, 0x1bbb: 0x1f61,
- 0x1bbc: 0x1f71, 0x1bbd: 0x1f81, 0x1bbe: 0x1f91, 0x1bbf: 0x1fa1,
+ 0x1b80: 0xbb29, 0x1b81: 0xbb41, 0x1b82: 0xbb59, 0x1b83: 0xbb71, 0x1b84: 0xbb89, 0x1b85: 0x2109,
+ 0x1b86: 0x1111, 0x1b87: 0xbba1, 0x1b88: 0xbba1, 0x1b89: 0xbbb9, 0x1b8a: 0xbbd1, 0x1b8b: 0x10e1,
+ 0x1b8c: 0x10f9, 0x1b8d: 0xbbe9, 0x1b8e: 0x2079, 0x1b8f: 0xbc21, 0x1b90: 0xbac9, 0x1b91: 0x1429,
+ 0x1b92: 0xbb11, 0x1b93: 0x10e1, 0x1b94: 0x1111, 0x1b95: 0x2109, 0x1b96: 0xbab1, 0x1b97: 0x1099,
+ 0x1b98: 0x10b1, 0x1b99: 0x10c9, 0x1b9a: 0xbac9, 0x1b9b: 0xbae1, 0x1b9c: 0xbaf9, 0x1b9d: 0x1429,
+ 0x1b9e: 0x1a31, 0x1b9f: 0xbb11, 0x1ba0: 0xbb29, 0x1ba1: 0xbb41, 0x1ba2: 0xbb59, 0x1ba3: 0xbb71,
+ 0x1ba4: 0xbb89, 0x1ba5: 0x2109, 0x1ba6: 0x1111, 0x1ba7: 0x1429, 0x1ba8: 0xbba1, 0x1ba9: 0xbbb9,
+ 0x1baa: 0xbbd1, 0x1bab: 0x10e1, 0x1bac: 0x10f9, 0x1bad: 0xbbe9, 0x1bae: 0x2079, 0x1baf: 0xbc01,
+ 0x1bb0: 0xbab1, 0x1bb1: 0x1099, 0x1bb2: 0x10b1, 0x1bb3: 0x10c9, 0x1bb4: 0xbac9, 0x1bb5: 0xbae1,
+ 0x1bb6: 0xbaf9, 0x1bb7: 0x1429, 0x1bb8: 0x1a31, 0x1bb9: 0xbb11, 0x1bba: 0xbb29, 0x1bbb: 0xbb41,
+ 0x1bbc: 0xbb59, 0x1bbd: 0xbb71, 0x1bbe: 0xbb89, 0x1bbf: 0x2109,
// Block 0x6f, offset 0x1bc0
- 0x1bc0: 0xe115, 0x1bc1: 0xe115, 0x1bc2: 0xe135, 0x1bc3: 0xe135, 0x1bc4: 0xe115, 0x1bc5: 0xe115,
- 0x1bc6: 0xe175, 0x1bc7: 0xe175, 0x1bc8: 0xe115, 0x1bc9: 0xe115, 0x1bca: 0xe135, 0x1bcb: 0xe135,
- 0x1bcc: 0xe115, 0x1bcd: 0xe115, 0x1bce: 0xe1f5, 0x1bcf: 0xe1f5, 0x1bd0: 0xe115, 0x1bd1: 0xe115,
- 0x1bd2: 0xe135, 0x1bd3: 0xe135, 0x1bd4: 0xe115, 0x1bd5: 0xe115, 0x1bd6: 0xe175, 0x1bd7: 0xe175,
- 0x1bd8: 0xe115, 0x1bd9: 0xe115, 0x1bda: 0xe135, 0x1bdb: 0xe135, 0x1bdc: 0xe115, 0x1bdd: 0xe115,
- 0x1bde: 0x8b05, 0x1bdf: 0x8b05, 0x1be0: 0x04b5, 0x1be1: 0x04b5, 0x1be2: 0x0208, 0x1be3: 0x0208,
- 0x1be4: 0x0208, 0x1be5: 0x0208, 0x1be6: 0x0208, 0x1be7: 0x0208, 0x1be8: 0x0208, 0x1be9: 0x0208,
- 0x1bea: 0x0208, 0x1beb: 0x0208, 0x1bec: 0x0208, 0x1bed: 0x0208, 0x1bee: 0x0208, 0x1bef: 0x0208,
- 0x1bf0: 0x0208, 0x1bf1: 0x0208, 0x1bf2: 0x0208, 0x1bf3: 0x0208, 0x1bf4: 0x0208, 0x1bf5: 0x0208,
- 0x1bf6: 0x0208, 0x1bf7: 0x0208, 0x1bf8: 0x0208, 0x1bf9: 0x0208, 0x1bfa: 0x0208, 0x1bfb: 0x0208,
- 0x1bfc: 0x0208, 0x1bfd: 0x0208, 0x1bfe: 0x0208, 0x1bff: 0x0208,
+ 0x1bc0: 0x1111, 0x1bc1: 0xbba1, 0x1bc2: 0xbba1, 0x1bc3: 0xbbb9, 0x1bc4: 0xbbd1, 0x1bc5: 0x10e1,
+ 0x1bc6: 0x10f9, 0x1bc7: 0xbbe9, 0x1bc8: 0x2079, 0x1bc9: 0xbc21, 0x1bca: 0xbac9, 0x1bcb: 0x1429,
+ 0x1bcc: 0xbb11, 0x1bcd: 0x10e1, 0x1bce: 0x1111, 0x1bcf: 0x2109, 0x1bd0: 0xbab1, 0x1bd1: 0x1099,
+ 0x1bd2: 0x10b1, 0x1bd3: 0x10c9, 0x1bd4: 0xbac9, 0x1bd5: 0xbae1, 0x1bd6: 0xbaf9, 0x1bd7: 0x1429,
+ 0x1bd8: 0x1a31, 0x1bd9: 0xbb11, 0x1bda: 0xbb29, 0x1bdb: 0xbb41, 0x1bdc: 0xbb59, 0x1bdd: 0xbb71,
+ 0x1bde: 0xbb89, 0x1bdf: 0x2109, 0x1be0: 0x1111, 0x1be1: 0x1429, 0x1be2: 0xbba1, 0x1be3: 0xbbb9,
+ 0x1be4: 0xbbd1, 0x1be5: 0x10e1, 0x1be6: 0x10f9, 0x1be7: 0xbbe9, 0x1be8: 0x2079, 0x1be9: 0xbc01,
+ 0x1bea: 0xbab1, 0x1beb: 0x1099, 0x1bec: 0x10b1, 0x1bed: 0x10c9, 0x1bee: 0xbac9, 0x1bef: 0xbae1,
+ 0x1bf0: 0xbaf9, 0x1bf1: 0x1429, 0x1bf2: 0x1a31, 0x1bf3: 0xbb11, 0x1bf4: 0xbb29, 0x1bf5: 0xbb41,
+ 0x1bf6: 0xbb59, 0x1bf7: 0xbb71, 0x1bf8: 0xbb89, 0x1bf9: 0x2109, 0x1bfa: 0x1111, 0x1bfb: 0xbba1,
+ 0x1bfc: 0xbba1, 0x1bfd: 0xbbb9, 0x1bfe: 0xbbd1, 0x1bff: 0x10e1,
// Block 0x70, offset 0x1c00
- 0x1c00: 0xb189, 0x1c01: 0xb1a1, 0x1c02: 0xb201, 0x1c03: 0xb249, 0x1c04: 0x0040, 0x1c05: 0xb411,
- 0x1c06: 0xb291, 0x1c07: 0xb219, 0x1c08: 0xb309, 0x1c09: 0xb429, 0x1c0a: 0xb399, 0x1c0b: 0xb3b1,
- 0x1c0c: 0xb3c9, 0x1c0d: 0xb3e1, 0x1c0e: 0xb2a9, 0x1c0f: 0xb339, 0x1c10: 0xb369, 0x1c11: 0xb2d9,
- 0x1c12: 0xb381, 0x1c13: 0xb279, 0x1c14: 0xb2c1, 0x1c15: 0xb1d1, 0x1c16: 0xb1e9, 0x1c17: 0xb231,
- 0x1c18: 0xb261, 0x1c19: 0xb2f1, 0x1c1a: 0xb321, 0x1c1b: 0xb351, 0x1c1c: 0xbc59, 0x1c1d: 0x7949,
- 0x1c1e: 0xbc71, 0x1c1f: 0xbc89, 0x1c20: 0x0040, 0x1c21: 0xb1a1, 0x1c22: 0xb201, 0x1c23: 0x0040,
- 0x1c24: 0xb3f9, 0x1c25: 0x0040, 0x1c26: 0x0040, 0x1c27: 0xb219, 0x1c28: 0x0040, 0x1c29: 0xb429,
- 0x1c2a: 0xb399, 0x1c2b: 0xb3b1, 0x1c2c: 0xb3c9, 0x1c2d: 0xb3e1, 0x1c2e: 0xb2a9, 0x1c2f: 0xb339,
- 0x1c30: 0xb369, 0x1c31: 0xb2d9, 0x1c32: 0xb381, 0x1c33: 0x0040, 0x1c34: 0xb2c1, 0x1c35: 0xb1d1,
- 0x1c36: 0xb1e9, 0x1c37: 0xb231, 0x1c38: 0x0040, 0x1c39: 0xb2f1, 0x1c3a: 0x0040, 0x1c3b: 0xb351,
- 0x1c3c: 0x0040, 0x1c3d: 0x0040, 0x1c3e: 0x0040, 0x1c3f: 0x0040,
+ 0x1c00: 0x10f9, 0x1c01: 0xbbe9, 0x1c02: 0x2079, 0x1c03: 0xbc21, 0x1c04: 0xbac9, 0x1c05: 0x1429,
+ 0x1c06: 0xbb11, 0x1c07: 0x10e1, 0x1c08: 0x1111, 0x1c09: 0x2109, 0x1c0a: 0xbc41, 0x1c0b: 0xbc41,
+ 0x1c0c: 0x0040, 0x1c0d: 0x0040, 0x1c0e: 0x1f41, 0x1c0f: 0x00c9, 0x1c10: 0x0069, 0x1c11: 0x0079,
+ 0x1c12: 0x1f51, 0x1c13: 0x1f61, 0x1c14: 0x1f71, 0x1c15: 0x1f81, 0x1c16: 0x1f91, 0x1c17: 0x1fa1,
+ 0x1c18: 0x1f41, 0x1c19: 0x00c9, 0x1c1a: 0x0069, 0x1c1b: 0x0079, 0x1c1c: 0x1f51, 0x1c1d: 0x1f61,
+ 0x1c1e: 0x1f71, 0x1c1f: 0x1f81, 0x1c20: 0x1f91, 0x1c21: 0x1fa1, 0x1c22: 0x1f41, 0x1c23: 0x00c9,
+ 0x1c24: 0x0069, 0x1c25: 0x0079, 0x1c26: 0x1f51, 0x1c27: 0x1f61, 0x1c28: 0x1f71, 0x1c29: 0x1f81,
+ 0x1c2a: 0x1f91, 0x1c2b: 0x1fa1, 0x1c2c: 0x1f41, 0x1c2d: 0x00c9, 0x1c2e: 0x0069, 0x1c2f: 0x0079,
+ 0x1c30: 0x1f51, 0x1c31: 0x1f61, 0x1c32: 0x1f71, 0x1c33: 0x1f81, 0x1c34: 0x1f91, 0x1c35: 0x1fa1,
+ 0x1c36: 0x1f41, 0x1c37: 0x00c9, 0x1c38: 0x0069, 0x1c39: 0x0079, 0x1c3a: 0x1f51, 0x1c3b: 0x1f61,
+ 0x1c3c: 0x1f71, 0x1c3d: 0x1f81, 0x1c3e: 0x1f91, 0x1c3f: 0x1fa1,
// Block 0x71, offset 0x1c40
- 0x1c40: 0x0040, 0x1c41: 0x0040, 0x1c42: 0xb201, 0x1c43: 0x0040, 0x1c44: 0x0040, 0x1c45: 0x0040,
- 0x1c46: 0x0040, 0x1c47: 0xb219, 0x1c48: 0x0040, 0x1c49: 0xb429, 0x1c4a: 0x0040, 0x1c4b: 0xb3b1,
- 0x1c4c: 0x0040, 0x1c4d: 0xb3e1, 0x1c4e: 0xb2a9, 0x1c4f: 0xb339, 0x1c50: 0x0040, 0x1c51: 0xb2d9,
- 0x1c52: 0xb381, 0x1c53: 0x0040, 0x1c54: 0xb2c1, 0x1c55: 0x0040, 0x1c56: 0x0040, 0x1c57: 0xb231,
- 0x1c58: 0x0040, 0x1c59: 0xb2f1, 0x1c5a: 0x0040, 0x1c5b: 0xb351, 0x1c5c: 0x0040, 0x1c5d: 0x7949,
- 0x1c5e: 0x0040, 0x1c5f: 0xbc89, 0x1c60: 0x0040, 0x1c61: 0xb1a1, 0x1c62: 0xb201, 0x1c63: 0x0040,
- 0x1c64: 0xb3f9, 0x1c65: 0x0040, 0x1c66: 0x0040, 0x1c67: 0xb219, 0x1c68: 0xb309, 0x1c69: 0xb429,
- 0x1c6a: 0xb399, 0x1c6b: 0x0040, 0x1c6c: 0xb3c9, 0x1c6d: 0xb3e1, 0x1c6e: 0xb2a9, 0x1c6f: 0xb339,
- 0x1c70: 0xb369, 0x1c71: 0xb2d9, 0x1c72: 0xb381, 0x1c73: 0x0040, 0x1c74: 0xb2c1, 0x1c75: 0xb1d1,
- 0x1c76: 0xb1e9, 0x1c77: 0xb231, 0x1c78: 0x0040, 0x1c79: 0xb2f1, 0x1c7a: 0xb321, 0x1c7b: 0xb351,
- 0x1c7c: 0xbc59, 0x1c7d: 0x0040, 0x1c7e: 0xbc71, 0x1c7f: 0x0040,
+ 0x1c40: 0xe115, 0x1c41: 0xe115, 0x1c42: 0xe135, 0x1c43: 0xe135, 0x1c44: 0xe115, 0x1c45: 0xe115,
+ 0x1c46: 0xe175, 0x1c47: 0xe175, 0x1c48: 0xe115, 0x1c49: 0xe115, 0x1c4a: 0xe135, 0x1c4b: 0xe135,
+ 0x1c4c: 0xe115, 0x1c4d: 0xe115, 0x1c4e: 0xe1f5, 0x1c4f: 0xe1f5, 0x1c50: 0xe115, 0x1c51: 0xe115,
+ 0x1c52: 0xe135, 0x1c53: 0xe135, 0x1c54: 0xe115, 0x1c55: 0xe115, 0x1c56: 0xe175, 0x1c57: 0xe175,
+ 0x1c58: 0xe115, 0x1c59: 0xe115, 0x1c5a: 0xe135, 0x1c5b: 0xe135, 0x1c5c: 0xe115, 0x1c5d: 0xe115,
+ 0x1c5e: 0x8b05, 0x1c5f: 0x8b05, 0x1c60: 0x04b5, 0x1c61: 0x04b5, 0x1c62: 0x0a08, 0x1c63: 0x0a08,
+ 0x1c64: 0x0a08, 0x1c65: 0x0a08, 0x1c66: 0x0a08, 0x1c67: 0x0a08, 0x1c68: 0x0a08, 0x1c69: 0x0a08,
+ 0x1c6a: 0x0a08, 0x1c6b: 0x0a08, 0x1c6c: 0x0a08, 0x1c6d: 0x0a08, 0x1c6e: 0x0a08, 0x1c6f: 0x0a08,
+ 0x1c70: 0x0a08, 0x1c71: 0x0a08, 0x1c72: 0x0a08, 0x1c73: 0x0a08, 0x1c74: 0x0a08, 0x1c75: 0x0a08,
+ 0x1c76: 0x0a08, 0x1c77: 0x0a08, 0x1c78: 0x0a08, 0x1c79: 0x0a08, 0x1c7a: 0x0a08, 0x1c7b: 0x0a08,
+ 0x1c7c: 0x0a08, 0x1c7d: 0x0a08, 0x1c7e: 0x0a08, 0x1c7f: 0x0a08,
// Block 0x72, offset 0x1c80
- 0x1c80: 0xb189, 0x1c81: 0xb1a1, 0x1c82: 0xb201, 0x1c83: 0xb249, 0x1c84: 0xb3f9, 0x1c85: 0xb411,
- 0x1c86: 0xb291, 0x1c87: 0xb219, 0x1c88: 0xb309, 0x1c89: 0xb429, 0x1c8a: 0x0040, 0x1c8b: 0xb3b1,
+ 0x1c80: 0xb189, 0x1c81: 0xb1a1, 0x1c82: 0xb201, 0x1c83: 0xb249, 0x1c84: 0x0040, 0x1c85: 0xb411,
+ 0x1c86: 0xb291, 0x1c87: 0xb219, 0x1c88: 0xb309, 0x1c89: 0xb429, 0x1c8a: 0xb399, 0x1c8b: 0xb3b1,
0x1c8c: 0xb3c9, 0x1c8d: 0xb3e1, 0x1c8e: 0xb2a9, 0x1c8f: 0xb339, 0x1c90: 0xb369, 0x1c91: 0xb2d9,
0x1c92: 0xb381, 0x1c93: 0xb279, 0x1c94: 0xb2c1, 0x1c95: 0xb1d1, 0x1c96: 0xb1e9, 0x1c97: 0xb231,
- 0x1c98: 0xb261, 0x1c99: 0xb2f1, 0x1c9a: 0xb321, 0x1c9b: 0xb351, 0x1c9c: 0x0040, 0x1c9d: 0x0040,
- 0x1c9e: 0x0040, 0x1c9f: 0x0040, 0x1ca0: 0x0040, 0x1ca1: 0xb1a1, 0x1ca2: 0xb201, 0x1ca3: 0xb249,
- 0x1ca4: 0x0040, 0x1ca5: 0xb411, 0x1ca6: 0xb291, 0x1ca7: 0xb219, 0x1ca8: 0xb309, 0x1ca9: 0xb429,
- 0x1caa: 0x0040, 0x1cab: 0xb3b1, 0x1cac: 0xb3c9, 0x1cad: 0xb3e1, 0x1cae: 0xb2a9, 0x1caf: 0xb339,
- 0x1cb0: 0xb369, 0x1cb1: 0xb2d9, 0x1cb2: 0xb381, 0x1cb3: 0xb279, 0x1cb4: 0xb2c1, 0x1cb5: 0xb1d1,
- 0x1cb6: 0xb1e9, 0x1cb7: 0xb231, 0x1cb8: 0xb261, 0x1cb9: 0xb2f1, 0x1cba: 0xb321, 0x1cbb: 0xb351,
+ 0x1c98: 0xb261, 0x1c99: 0xb2f1, 0x1c9a: 0xb321, 0x1c9b: 0xb351, 0x1c9c: 0xbc59, 0x1c9d: 0x7949,
+ 0x1c9e: 0xbc71, 0x1c9f: 0xbc89, 0x1ca0: 0x0040, 0x1ca1: 0xb1a1, 0x1ca2: 0xb201, 0x1ca3: 0x0040,
+ 0x1ca4: 0xb3f9, 0x1ca5: 0x0040, 0x1ca6: 0x0040, 0x1ca7: 0xb219, 0x1ca8: 0x0040, 0x1ca9: 0xb429,
+ 0x1caa: 0xb399, 0x1cab: 0xb3b1, 0x1cac: 0xb3c9, 0x1cad: 0xb3e1, 0x1cae: 0xb2a9, 0x1caf: 0xb339,
+ 0x1cb0: 0xb369, 0x1cb1: 0xb2d9, 0x1cb2: 0xb381, 0x1cb3: 0x0040, 0x1cb4: 0xb2c1, 0x1cb5: 0xb1d1,
+ 0x1cb6: 0xb1e9, 0x1cb7: 0xb231, 0x1cb8: 0x0040, 0x1cb9: 0xb2f1, 0x1cba: 0x0040, 0x1cbb: 0xb351,
0x1cbc: 0x0040, 0x1cbd: 0x0040, 0x1cbe: 0x0040, 0x1cbf: 0x0040,
// Block 0x73, offset 0x1cc0
- 0x1cc0: 0x0040, 0x1cc1: 0xbca2, 0x1cc2: 0xbcba, 0x1cc3: 0xbcd2, 0x1cc4: 0xbcea, 0x1cc5: 0xbd02,
- 0x1cc6: 0xbd1a, 0x1cc7: 0xbd32, 0x1cc8: 0xbd4a, 0x1cc9: 0xbd62, 0x1cca: 0xbd7a, 0x1ccb: 0x0018,
- 0x1ccc: 0x0018, 0x1ccd: 0x0040, 0x1cce: 0x0040, 0x1ccf: 0x0040, 0x1cd0: 0xbd92, 0x1cd1: 0xbdb2,
- 0x1cd2: 0xbdd2, 0x1cd3: 0xbdf2, 0x1cd4: 0xbe12, 0x1cd5: 0xbe32, 0x1cd6: 0xbe52, 0x1cd7: 0xbe72,
- 0x1cd8: 0xbe92, 0x1cd9: 0xbeb2, 0x1cda: 0xbed2, 0x1cdb: 0xbef2, 0x1cdc: 0xbf12, 0x1cdd: 0xbf32,
- 0x1cde: 0xbf52, 0x1cdf: 0xbf72, 0x1ce0: 0xbf92, 0x1ce1: 0xbfb2, 0x1ce2: 0xbfd2, 0x1ce3: 0xbff2,
- 0x1ce4: 0xc012, 0x1ce5: 0xc032, 0x1ce6: 0xc052, 0x1ce7: 0xc072, 0x1ce8: 0xc092, 0x1ce9: 0xc0b2,
- 0x1cea: 0xc0d1, 0x1ceb: 0x1159, 0x1cec: 0x0269, 0x1ced: 0x6671, 0x1cee: 0xc111, 0x1cef: 0x0040,
- 0x1cf0: 0x0039, 0x1cf1: 0x0ee9, 0x1cf2: 0x1159, 0x1cf3: 0x0ef9, 0x1cf4: 0x0f09, 0x1cf5: 0x1199,
- 0x1cf6: 0x0f31, 0x1cf7: 0x0249, 0x1cf8: 0x0f41, 0x1cf9: 0x0259, 0x1cfa: 0x0f51, 0x1cfb: 0x0359,
- 0x1cfc: 0x0f61, 0x1cfd: 0x0f71, 0x1cfe: 0x00d9, 0x1cff: 0x0f99,
+ 0x1cc0: 0x0040, 0x1cc1: 0x0040, 0x1cc2: 0xb201, 0x1cc3: 0x0040, 0x1cc4: 0x0040, 0x1cc5: 0x0040,
+ 0x1cc6: 0x0040, 0x1cc7: 0xb219, 0x1cc8: 0x0040, 0x1cc9: 0xb429, 0x1cca: 0x0040, 0x1ccb: 0xb3b1,
+ 0x1ccc: 0x0040, 0x1ccd: 0xb3e1, 0x1cce: 0xb2a9, 0x1ccf: 0xb339, 0x1cd0: 0x0040, 0x1cd1: 0xb2d9,
+ 0x1cd2: 0xb381, 0x1cd3: 0x0040, 0x1cd4: 0xb2c1, 0x1cd5: 0x0040, 0x1cd6: 0x0040, 0x1cd7: 0xb231,
+ 0x1cd8: 0x0040, 0x1cd9: 0xb2f1, 0x1cda: 0x0040, 0x1cdb: 0xb351, 0x1cdc: 0x0040, 0x1cdd: 0x7949,
+ 0x1cde: 0x0040, 0x1cdf: 0xbc89, 0x1ce0: 0x0040, 0x1ce1: 0xb1a1, 0x1ce2: 0xb201, 0x1ce3: 0x0040,
+ 0x1ce4: 0xb3f9, 0x1ce5: 0x0040, 0x1ce6: 0x0040, 0x1ce7: 0xb219, 0x1ce8: 0xb309, 0x1ce9: 0xb429,
+ 0x1cea: 0xb399, 0x1ceb: 0x0040, 0x1cec: 0xb3c9, 0x1ced: 0xb3e1, 0x1cee: 0xb2a9, 0x1cef: 0xb339,
+ 0x1cf0: 0xb369, 0x1cf1: 0xb2d9, 0x1cf2: 0xb381, 0x1cf3: 0x0040, 0x1cf4: 0xb2c1, 0x1cf5: 0xb1d1,
+ 0x1cf6: 0xb1e9, 0x1cf7: 0xb231, 0x1cf8: 0x0040, 0x1cf9: 0xb2f1, 0x1cfa: 0xb321, 0x1cfb: 0xb351,
+ 0x1cfc: 0xbc59, 0x1cfd: 0x0040, 0x1cfe: 0xbc71, 0x1cff: 0x0040,
// Block 0x74, offset 0x1d00
- 0x1d00: 0x2039, 0x1d01: 0x0269, 0x1d02: 0x01d9, 0x1d03: 0x0fa9, 0x1d04: 0x0fb9, 0x1d05: 0x1089,
- 0x1d06: 0x0279, 0x1d07: 0x0369, 0x1d08: 0x0289, 0x1d09: 0x13d1, 0x1d0a: 0xc129, 0x1d0b: 0x65b1,
- 0x1d0c: 0xc141, 0x1d0d: 0x1441, 0x1d0e: 0xc159, 0x1d0f: 0xc179, 0x1d10: 0x0018, 0x1d11: 0x0018,
- 0x1d12: 0x0018, 0x1d13: 0x0018, 0x1d14: 0x0018, 0x1d15: 0x0018, 0x1d16: 0x0018, 0x1d17: 0x0018,
- 0x1d18: 0x0018, 0x1d19: 0x0018, 0x1d1a: 0x0018, 0x1d1b: 0x0018, 0x1d1c: 0x0018, 0x1d1d: 0x0018,
- 0x1d1e: 0x0018, 0x1d1f: 0x0018, 0x1d20: 0x0018, 0x1d21: 0x0018, 0x1d22: 0x0018, 0x1d23: 0x0018,
- 0x1d24: 0x0018, 0x1d25: 0x0018, 0x1d26: 0x0018, 0x1d27: 0x0018, 0x1d28: 0x0018, 0x1d29: 0x0018,
- 0x1d2a: 0xc191, 0x1d2b: 0xc1a9, 0x1d2c: 0x0040, 0x1d2d: 0x0040, 0x1d2e: 0x0040, 0x1d2f: 0x0040,
- 0x1d30: 0x0018, 0x1d31: 0x0018, 0x1d32: 0x0018, 0x1d33: 0x0018, 0x1d34: 0x0018, 0x1d35: 0x0018,
- 0x1d36: 0x0018, 0x1d37: 0x0018, 0x1d38: 0x0018, 0x1d39: 0x0018, 0x1d3a: 0x0018, 0x1d3b: 0x0018,
- 0x1d3c: 0x0018, 0x1d3d: 0x0018, 0x1d3e: 0x0018, 0x1d3f: 0x0018,
+ 0x1d00: 0xb189, 0x1d01: 0xb1a1, 0x1d02: 0xb201, 0x1d03: 0xb249, 0x1d04: 0xb3f9, 0x1d05: 0xb411,
+ 0x1d06: 0xb291, 0x1d07: 0xb219, 0x1d08: 0xb309, 0x1d09: 0xb429, 0x1d0a: 0x0040, 0x1d0b: 0xb3b1,
+ 0x1d0c: 0xb3c9, 0x1d0d: 0xb3e1, 0x1d0e: 0xb2a9, 0x1d0f: 0xb339, 0x1d10: 0xb369, 0x1d11: 0xb2d9,
+ 0x1d12: 0xb381, 0x1d13: 0xb279, 0x1d14: 0xb2c1, 0x1d15: 0xb1d1, 0x1d16: 0xb1e9, 0x1d17: 0xb231,
+ 0x1d18: 0xb261, 0x1d19: 0xb2f1, 0x1d1a: 0xb321, 0x1d1b: 0xb351, 0x1d1c: 0x0040, 0x1d1d: 0x0040,
+ 0x1d1e: 0x0040, 0x1d1f: 0x0040, 0x1d20: 0x0040, 0x1d21: 0xb1a1, 0x1d22: 0xb201, 0x1d23: 0xb249,
+ 0x1d24: 0x0040, 0x1d25: 0xb411, 0x1d26: 0xb291, 0x1d27: 0xb219, 0x1d28: 0xb309, 0x1d29: 0xb429,
+ 0x1d2a: 0x0040, 0x1d2b: 0xb3b1, 0x1d2c: 0xb3c9, 0x1d2d: 0xb3e1, 0x1d2e: 0xb2a9, 0x1d2f: 0xb339,
+ 0x1d30: 0xb369, 0x1d31: 0xb2d9, 0x1d32: 0xb381, 0x1d33: 0xb279, 0x1d34: 0xb2c1, 0x1d35: 0xb1d1,
+ 0x1d36: 0xb1e9, 0x1d37: 0xb231, 0x1d38: 0xb261, 0x1d39: 0xb2f1, 0x1d3a: 0xb321, 0x1d3b: 0xb351,
+ 0x1d3c: 0x0040, 0x1d3d: 0x0040, 0x1d3e: 0x0040, 0x1d3f: 0x0040,
// Block 0x75, offset 0x1d40
- 0x1d40: 0xc1d9, 0x1d41: 0xc211, 0x1d42: 0xc249, 0x1d43: 0x0040, 0x1d44: 0x0040, 0x1d45: 0x0040,
- 0x1d46: 0x0040, 0x1d47: 0x0040, 0x1d48: 0x0040, 0x1d49: 0x0040, 0x1d4a: 0x0040, 0x1d4b: 0x0040,
- 0x1d4c: 0x0040, 0x1d4d: 0x0040, 0x1d4e: 0x0040, 0x1d4f: 0x0040, 0x1d50: 0xc269, 0x1d51: 0xc289,
- 0x1d52: 0xc2a9, 0x1d53: 0xc2c9, 0x1d54: 0xc2e9, 0x1d55: 0xc309, 0x1d56: 0xc329, 0x1d57: 0xc349,
- 0x1d58: 0xc369, 0x1d59: 0xc389, 0x1d5a: 0xc3a9, 0x1d5b: 0xc3c9, 0x1d5c: 0xc3e9, 0x1d5d: 0xc409,
- 0x1d5e: 0xc429, 0x1d5f: 0xc449, 0x1d60: 0xc469, 0x1d61: 0xc489, 0x1d62: 0xc4a9, 0x1d63: 0xc4c9,
- 0x1d64: 0xc4e9, 0x1d65: 0xc509, 0x1d66: 0xc529, 0x1d67: 0xc549, 0x1d68: 0xc569, 0x1d69: 0xc589,
- 0x1d6a: 0xc5a9, 0x1d6b: 0xc5c9, 0x1d6c: 0xc5e9, 0x1d6d: 0xc609, 0x1d6e: 0xc629, 0x1d6f: 0xc649,
- 0x1d70: 0xc669, 0x1d71: 0xc689, 0x1d72: 0xc6a9, 0x1d73: 0xc6c9, 0x1d74: 0xc6e9, 0x1d75: 0xc709,
- 0x1d76: 0xc729, 0x1d77: 0xc749, 0x1d78: 0xc769, 0x1d79: 0xc789, 0x1d7a: 0xc7a9, 0x1d7b: 0xc7c9,
- 0x1d7c: 0x0040, 0x1d7d: 0x0040, 0x1d7e: 0x0040, 0x1d7f: 0x0040,
+ 0x1d40: 0x0040, 0x1d41: 0xbca2, 0x1d42: 0xbcba, 0x1d43: 0xbcd2, 0x1d44: 0xbcea, 0x1d45: 0xbd02,
+ 0x1d46: 0xbd1a, 0x1d47: 0xbd32, 0x1d48: 0xbd4a, 0x1d49: 0xbd62, 0x1d4a: 0xbd7a, 0x1d4b: 0x0018,
+ 0x1d4c: 0x0018, 0x1d4d: 0x0040, 0x1d4e: 0x0040, 0x1d4f: 0x0040, 0x1d50: 0xbd92, 0x1d51: 0xbdb2,
+ 0x1d52: 0xbdd2, 0x1d53: 0xbdf2, 0x1d54: 0xbe12, 0x1d55: 0xbe32, 0x1d56: 0xbe52, 0x1d57: 0xbe72,
+ 0x1d58: 0xbe92, 0x1d59: 0xbeb2, 0x1d5a: 0xbed2, 0x1d5b: 0xbef2, 0x1d5c: 0xbf12, 0x1d5d: 0xbf32,
+ 0x1d5e: 0xbf52, 0x1d5f: 0xbf72, 0x1d60: 0xbf92, 0x1d61: 0xbfb2, 0x1d62: 0xbfd2, 0x1d63: 0xbff2,
+ 0x1d64: 0xc012, 0x1d65: 0xc032, 0x1d66: 0xc052, 0x1d67: 0xc072, 0x1d68: 0xc092, 0x1d69: 0xc0b2,
+ 0x1d6a: 0xc0d1, 0x1d6b: 0x1159, 0x1d6c: 0x0269, 0x1d6d: 0x6671, 0x1d6e: 0xc111, 0x1d6f: 0x0040,
+ 0x1d70: 0x0039, 0x1d71: 0x0ee9, 0x1d72: 0x1159, 0x1d73: 0x0ef9, 0x1d74: 0x0f09, 0x1d75: 0x1199,
+ 0x1d76: 0x0f31, 0x1d77: 0x0249, 0x1d78: 0x0f41, 0x1d79: 0x0259, 0x1d7a: 0x0f51, 0x1d7b: 0x0359,
+ 0x1d7c: 0x0f61, 0x1d7d: 0x0f71, 0x1d7e: 0x00d9, 0x1d7f: 0x0f99,
// Block 0x76, offset 0x1d80
- 0x1d80: 0xcaf9, 0x1d81: 0xcb19, 0x1d82: 0xcb39, 0x1d83: 0x8b1d, 0x1d84: 0xcb59, 0x1d85: 0xcb79,
- 0x1d86: 0xcb99, 0x1d87: 0xcbb9, 0x1d88: 0xcbd9, 0x1d89: 0xcbf9, 0x1d8a: 0xcc19, 0x1d8b: 0xcc39,
- 0x1d8c: 0xcc59, 0x1d8d: 0x8b3d, 0x1d8e: 0xcc79, 0x1d8f: 0xcc99, 0x1d90: 0xccb9, 0x1d91: 0xccd9,
- 0x1d92: 0x8b5d, 0x1d93: 0xccf9, 0x1d94: 0xcd19, 0x1d95: 0xc429, 0x1d96: 0x8b7d, 0x1d97: 0xcd39,
- 0x1d98: 0xcd59, 0x1d99: 0xcd79, 0x1d9a: 0xcd99, 0x1d9b: 0xcdb9, 0x1d9c: 0x8b9d, 0x1d9d: 0xcdd9,
- 0x1d9e: 0xcdf9, 0x1d9f: 0xce19, 0x1da0: 0xce39, 0x1da1: 0xce59, 0x1da2: 0xc789, 0x1da3: 0xce79,
- 0x1da4: 0xce99, 0x1da5: 0xceb9, 0x1da6: 0xced9, 0x1da7: 0xcef9, 0x1da8: 0xcf19, 0x1da9: 0xcf39,
- 0x1daa: 0xcf59, 0x1dab: 0xcf79, 0x1dac: 0xcf99, 0x1dad: 0xcfb9, 0x1dae: 0xcfd9, 0x1daf: 0xcff9,
- 0x1db0: 0xd019, 0x1db1: 0xd039, 0x1db2: 0xd039, 0x1db3: 0xd039, 0x1db4: 0x8bbd, 0x1db5: 0xd059,
- 0x1db6: 0xd079, 0x1db7: 0xd099, 0x1db8: 0x8bdd, 0x1db9: 0xd0b9, 0x1dba: 0xd0d9, 0x1dbb: 0xd0f9,
- 0x1dbc: 0xd119, 0x1dbd: 0xd139, 0x1dbe: 0xd159, 0x1dbf: 0xd179,
+ 0x1d80: 0x2039, 0x1d81: 0x0269, 0x1d82: 0x01d9, 0x1d83: 0x0fa9, 0x1d84: 0x0fb9, 0x1d85: 0x1089,
+ 0x1d86: 0x0279, 0x1d87: 0x0369, 0x1d88: 0x0289, 0x1d89: 0x13d1, 0x1d8a: 0xc129, 0x1d8b: 0x65b1,
+ 0x1d8c: 0xc141, 0x1d8d: 0x1441, 0x1d8e: 0xc159, 0x1d8f: 0xc179, 0x1d90: 0x0018, 0x1d91: 0x0018,
+ 0x1d92: 0x0018, 0x1d93: 0x0018, 0x1d94: 0x0018, 0x1d95: 0x0018, 0x1d96: 0x0018, 0x1d97: 0x0018,
+ 0x1d98: 0x0018, 0x1d99: 0x0018, 0x1d9a: 0x0018, 0x1d9b: 0x0018, 0x1d9c: 0x0018, 0x1d9d: 0x0018,
+ 0x1d9e: 0x0018, 0x1d9f: 0x0018, 0x1da0: 0x0018, 0x1da1: 0x0018, 0x1da2: 0x0018, 0x1da3: 0x0018,
+ 0x1da4: 0x0018, 0x1da5: 0x0018, 0x1da6: 0x0018, 0x1da7: 0x0018, 0x1da8: 0x0018, 0x1da9: 0x0018,
+ 0x1daa: 0xc191, 0x1dab: 0xc1a9, 0x1dac: 0x0040, 0x1dad: 0x0040, 0x1dae: 0x0040, 0x1daf: 0x0040,
+ 0x1db0: 0x0018, 0x1db1: 0x0018, 0x1db2: 0x0018, 0x1db3: 0x0018, 0x1db4: 0x0018, 0x1db5: 0x0018,
+ 0x1db6: 0x0018, 0x1db7: 0x0018, 0x1db8: 0x0018, 0x1db9: 0x0018, 0x1dba: 0x0018, 0x1dbb: 0x0018,
+ 0x1dbc: 0x0018, 0x1dbd: 0x0018, 0x1dbe: 0x0018, 0x1dbf: 0x0018,
// Block 0x77, offset 0x1dc0
- 0x1dc0: 0xd199, 0x1dc1: 0xd1b9, 0x1dc2: 0xd1d9, 0x1dc3: 0xd1f9, 0x1dc4: 0xd219, 0x1dc5: 0xd239,
- 0x1dc6: 0xd239, 0x1dc7: 0xd259, 0x1dc8: 0xd279, 0x1dc9: 0xd299, 0x1dca: 0xd2b9, 0x1dcb: 0xd2d9,
- 0x1dcc: 0xd2f9, 0x1dcd: 0xd319, 0x1dce: 0xd339, 0x1dcf: 0xd359, 0x1dd0: 0xd379, 0x1dd1: 0xd399,
- 0x1dd2: 0xd3b9, 0x1dd3: 0xd3d9, 0x1dd4: 0xd3f9, 0x1dd5: 0xd419, 0x1dd6: 0xd439, 0x1dd7: 0xd459,
- 0x1dd8: 0xd479, 0x1dd9: 0x8bfd, 0x1dda: 0xd499, 0x1ddb: 0xd4b9, 0x1ddc: 0xd4d9, 0x1ddd: 0xc309,
- 0x1dde: 0xd4f9, 0x1ddf: 0xd519, 0x1de0: 0x8c1d, 0x1de1: 0x8c3d, 0x1de2: 0xd539, 0x1de3: 0xd559,
- 0x1de4: 0xd579, 0x1de5: 0xd599, 0x1de6: 0xd5b9, 0x1de7: 0xd5d9, 0x1de8: 0x0040, 0x1de9: 0xd5f9,
- 0x1dea: 0xd619, 0x1deb: 0xd619, 0x1dec: 0x8c5d, 0x1ded: 0xd639, 0x1dee: 0xd659, 0x1def: 0xd679,
- 0x1df0: 0xd699, 0x1df1: 0x8c7d, 0x1df2: 0xd6b9, 0x1df3: 0xd6d9, 0x1df4: 0x0040, 0x1df5: 0xd6f9,
- 0x1df6: 0xd719, 0x1df7: 0xd739, 0x1df8: 0xd759, 0x1df9: 0xd779, 0x1dfa: 0xd799, 0x1dfb: 0x8c9d,
- 0x1dfc: 0xd7b9, 0x1dfd: 0x8cbd, 0x1dfe: 0xd7d9, 0x1dff: 0xd7f9,
+ 0x1dc0: 0xc1d9, 0x1dc1: 0xc211, 0x1dc2: 0xc249, 0x1dc3: 0x0040, 0x1dc4: 0x0040, 0x1dc5: 0x0040,
+ 0x1dc6: 0x0040, 0x1dc7: 0x0040, 0x1dc8: 0x0040, 0x1dc9: 0x0040, 0x1dca: 0x0040, 0x1dcb: 0x0040,
+ 0x1dcc: 0x0040, 0x1dcd: 0x0040, 0x1dce: 0x0040, 0x1dcf: 0x0040, 0x1dd0: 0xc269, 0x1dd1: 0xc289,
+ 0x1dd2: 0xc2a9, 0x1dd3: 0xc2c9, 0x1dd4: 0xc2e9, 0x1dd5: 0xc309, 0x1dd6: 0xc329, 0x1dd7: 0xc349,
+ 0x1dd8: 0xc369, 0x1dd9: 0xc389, 0x1dda: 0xc3a9, 0x1ddb: 0xc3c9, 0x1ddc: 0xc3e9, 0x1ddd: 0xc409,
+ 0x1dde: 0xc429, 0x1ddf: 0xc449, 0x1de0: 0xc469, 0x1de1: 0xc489, 0x1de2: 0xc4a9, 0x1de3: 0xc4c9,
+ 0x1de4: 0xc4e9, 0x1de5: 0xc509, 0x1de6: 0xc529, 0x1de7: 0xc549, 0x1de8: 0xc569, 0x1de9: 0xc589,
+ 0x1dea: 0xc5a9, 0x1deb: 0xc5c9, 0x1dec: 0xc5e9, 0x1ded: 0xc609, 0x1dee: 0xc629, 0x1def: 0xc649,
+ 0x1df0: 0xc669, 0x1df1: 0xc689, 0x1df2: 0xc6a9, 0x1df3: 0xc6c9, 0x1df4: 0xc6e9, 0x1df5: 0xc709,
+ 0x1df6: 0xc729, 0x1df7: 0xc749, 0x1df8: 0xc769, 0x1df9: 0xc789, 0x1dfa: 0xc7a9, 0x1dfb: 0xc7c9,
+ 0x1dfc: 0x0040, 0x1dfd: 0x0040, 0x1dfe: 0x0040, 0x1dff: 0x0040,
// Block 0x78, offset 0x1e00
- 0x1e00: 0xd819, 0x1e01: 0xd839, 0x1e02: 0xd859, 0x1e03: 0xd879, 0x1e04: 0xd899, 0x1e05: 0xd8b9,
- 0x1e06: 0xd8d9, 0x1e07: 0xd8f9, 0x1e08: 0xd919, 0x1e09: 0x8cdd, 0x1e0a: 0xd939, 0x1e0b: 0xd959,
- 0x1e0c: 0xd979, 0x1e0d: 0xd999, 0x1e0e: 0xd9b9, 0x1e0f: 0x8cfd, 0x1e10: 0xd9d9, 0x1e11: 0x8d1d,
- 0x1e12: 0x8d3d, 0x1e13: 0xd9f9, 0x1e14: 0xda19, 0x1e15: 0xda19, 0x1e16: 0xda39, 0x1e17: 0x8d5d,
- 0x1e18: 0x8d7d, 0x1e19: 0xda59, 0x1e1a: 0xda79, 0x1e1b: 0xda99, 0x1e1c: 0xdab9, 0x1e1d: 0xdad9,
- 0x1e1e: 0xdaf9, 0x1e1f: 0xdb19, 0x1e20: 0xdb39, 0x1e21: 0xdb59, 0x1e22: 0xdb79, 0x1e23: 0xdb99,
- 0x1e24: 0x8d9d, 0x1e25: 0xdbb9, 0x1e26: 0xdbd9, 0x1e27: 0xdbf9, 0x1e28: 0xdc19, 0x1e29: 0xdbf9,
- 0x1e2a: 0xdc39, 0x1e2b: 0xdc59, 0x1e2c: 0xdc79, 0x1e2d: 0xdc99, 0x1e2e: 0xdcb9, 0x1e2f: 0xdcd9,
- 0x1e30: 0xdcf9, 0x1e31: 0xdd19, 0x1e32: 0xdd39, 0x1e33: 0xdd59, 0x1e34: 0xdd79, 0x1e35: 0xdd99,
- 0x1e36: 0xddb9, 0x1e37: 0xddd9, 0x1e38: 0x8dbd, 0x1e39: 0xddf9, 0x1e3a: 0xde19, 0x1e3b: 0xde39,
- 0x1e3c: 0xde59, 0x1e3d: 0xde79, 0x1e3e: 0x8ddd, 0x1e3f: 0xde99,
+ 0x1e00: 0xcaf9, 0x1e01: 0xcb19, 0x1e02: 0xcb39, 0x1e03: 0x8b1d, 0x1e04: 0xcb59, 0x1e05: 0xcb79,
+ 0x1e06: 0xcb99, 0x1e07: 0xcbb9, 0x1e08: 0xcbd9, 0x1e09: 0xcbf9, 0x1e0a: 0xcc19, 0x1e0b: 0xcc39,
+ 0x1e0c: 0xcc59, 0x1e0d: 0x8b3d, 0x1e0e: 0xcc79, 0x1e0f: 0xcc99, 0x1e10: 0xccb9, 0x1e11: 0xccd9,
+ 0x1e12: 0x8b5d, 0x1e13: 0xccf9, 0x1e14: 0xcd19, 0x1e15: 0xc429, 0x1e16: 0x8b7d, 0x1e17: 0xcd39,
+ 0x1e18: 0xcd59, 0x1e19: 0xcd79, 0x1e1a: 0xcd99, 0x1e1b: 0xcdb9, 0x1e1c: 0x8b9d, 0x1e1d: 0xcdd9,
+ 0x1e1e: 0xcdf9, 0x1e1f: 0xce19, 0x1e20: 0xce39, 0x1e21: 0xce59, 0x1e22: 0xc789, 0x1e23: 0xce79,
+ 0x1e24: 0xce99, 0x1e25: 0xceb9, 0x1e26: 0xced9, 0x1e27: 0xcef9, 0x1e28: 0xcf19, 0x1e29: 0xcf39,
+ 0x1e2a: 0xcf59, 0x1e2b: 0xcf79, 0x1e2c: 0xcf99, 0x1e2d: 0xcfb9, 0x1e2e: 0xcfd9, 0x1e2f: 0xcff9,
+ 0x1e30: 0xd019, 0x1e31: 0xd039, 0x1e32: 0xd039, 0x1e33: 0xd039, 0x1e34: 0x8bbd, 0x1e35: 0xd059,
+ 0x1e36: 0xd079, 0x1e37: 0xd099, 0x1e38: 0x8bdd, 0x1e39: 0xd0b9, 0x1e3a: 0xd0d9, 0x1e3b: 0xd0f9,
+ 0x1e3c: 0xd119, 0x1e3d: 0xd139, 0x1e3e: 0xd159, 0x1e3f: 0xd179,
// Block 0x79, offset 0x1e40
- 0x1e40: 0xe599, 0x1e41: 0xe5b9, 0x1e42: 0xe5d9, 0x1e43: 0xe5f9, 0x1e44: 0xe619, 0x1e45: 0xe639,
- 0x1e46: 0x8efd, 0x1e47: 0xe659, 0x1e48: 0xe679, 0x1e49: 0xe699, 0x1e4a: 0xe6b9, 0x1e4b: 0xe6d9,
- 0x1e4c: 0xe6f9, 0x1e4d: 0x8f1d, 0x1e4e: 0xe719, 0x1e4f: 0xe739, 0x1e50: 0x8f3d, 0x1e51: 0x8f5d,
- 0x1e52: 0xe759, 0x1e53: 0xe779, 0x1e54: 0xe799, 0x1e55: 0xe7b9, 0x1e56: 0xe7d9, 0x1e57: 0xe7f9,
- 0x1e58: 0xe819, 0x1e59: 0xe839, 0x1e5a: 0xe859, 0x1e5b: 0x8f7d, 0x1e5c: 0xe879, 0x1e5d: 0x8f9d,
- 0x1e5e: 0xe899, 0x1e5f: 0x0040, 0x1e60: 0xe8b9, 0x1e61: 0xe8d9, 0x1e62: 0xe8f9, 0x1e63: 0x8fbd,
- 0x1e64: 0xe919, 0x1e65: 0xe939, 0x1e66: 0x8fdd, 0x1e67: 0x8ffd, 0x1e68: 0xe959, 0x1e69: 0xe979,
- 0x1e6a: 0xe999, 0x1e6b: 0xe9b9, 0x1e6c: 0xe9d9, 0x1e6d: 0xe9d9, 0x1e6e: 0xe9f9, 0x1e6f: 0xea19,
- 0x1e70: 0xea39, 0x1e71: 0xea59, 0x1e72: 0xea79, 0x1e73: 0xea99, 0x1e74: 0xeab9, 0x1e75: 0x901d,
- 0x1e76: 0xead9, 0x1e77: 0x903d, 0x1e78: 0xeaf9, 0x1e79: 0x905d, 0x1e7a: 0xeb19, 0x1e7b: 0x907d,
- 0x1e7c: 0x909d, 0x1e7d: 0x90bd, 0x1e7e: 0xeb39, 0x1e7f: 0xeb59,
+ 0x1e40: 0xd199, 0x1e41: 0xd1b9, 0x1e42: 0xd1d9, 0x1e43: 0xd1f9, 0x1e44: 0xd219, 0x1e45: 0xd239,
+ 0x1e46: 0xd239, 0x1e47: 0xd259, 0x1e48: 0xd279, 0x1e49: 0xd299, 0x1e4a: 0xd2b9, 0x1e4b: 0xd2d9,
+ 0x1e4c: 0xd2f9, 0x1e4d: 0xd319, 0x1e4e: 0xd339, 0x1e4f: 0xd359, 0x1e50: 0xd379, 0x1e51: 0xd399,
+ 0x1e52: 0xd3b9, 0x1e53: 0xd3d9, 0x1e54: 0xd3f9, 0x1e55: 0xd419, 0x1e56: 0xd439, 0x1e57: 0xd459,
+ 0x1e58: 0xd479, 0x1e59: 0x8bfd, 0x1e5a: 0xd499, 0x1e5b: 0xd4b9, 0x1e5c: 0xd4d9, 0x1e5d: 0xc309,
+ 0x1e5e: 0xd4f9, 0x1e5f: 0xd519, 0x1e60: 0x8c1d, 0x1e61: 0x8c3d, 0x1e62: 0xd539, 0x1e63: 0xd559,
+ 0x1e64: 0xd579, 0x1e65: 0xd599, 0x1e66: 0xd5b9, 0x1e67: 0xd5d9, 0x1e68: 0x2040, 0x1e69: 0xd5f9,
+ 0x1e6a: 0xd619, 0x1e6b: 0xd619, 0x1e6c: 0x8c5d, 0x1e6d: 0xd639, 0x1e6e: 0xd659, 0x1e6f: 0xd679,
+ 0x1e70: 0xd699, 0x1e71: 0x8c7d, 0x1e72: 0xd6b9, 0x1e73: 0xd6d9, 0x1e74: 0x2040, 0x1e75: 0xd6f9,
+ 0x1e76: 0xd719, 0x1e77: 0xd739, 0x1e78: 0xd759, 0x1e79: 0xd779, 0x1e7a: 0xd799, 0x1e7b: 0x8c9d,
+ 0x1e7c: 0xd7b9, 0x1e7d: 0x8cbd, 0x1e7e: 0xd7d9, 0x1e7f: 0xd7f9,
// Block 0x7a, offset 0x1e80
- 0x1e80: 0xeb79, 0x1e81: 0x90dd, 0x1e82: 0x90fd, 0x1e83: 0x911d, 0x1e84: 0x913d, 0x1e85: 0xeb99,
- 0x1e86: 0xebb9, 0x1e87: 0xebb9, 0x1e88: 0xebd9, 0x1e89: 0xebf9, 0x1e8a: 0xec19, 0x1e8b: 0xec39,
- 0x1e8c: 0xec59, 0x1e8d: 0x915d, 0x1e8e: 0xec79, 0x1e8f: 0xec99, 0x1e90: 0xecb9, 0x1e91: 0xecd9,
- 0x1e92: 0x917d, 0x1e93: 0xecf9, 0x1e94: 0x919d, 0x1e95: 0x91bd, 0x1e96: 0xed19, 0x1e97: 0xed39,
- 0x1e98: 0xed59, 0x1e99: 0xed79, 0x1e9a: 0xed99, 0x1e9b: 0xedb9, 0x1e9c: 0x91dd, 0x1e9d: 0x91fd,
- 0x1e9e: 0x921d, 0x1e9f: 0x0040, 0x1ea0: 0xedd9, 0x1ea1: 0x923d, 0x1ea2: 0xedf9, 0x1ea3: 0xee19,
- 0x1ea4: 0xee39, 0x1ea5: 0x925d, 0x1ea6: 0xee59, 0x1ea7: 0xee79, 0x1ea8: 0xee99, 0x1ea9: 0xeeb9,
- 0x1eaa: 0xeed9, 0x1eab: 0x927d, 0x1eac: 0xeef9, 0x1ead: 0xef19, 0x1eae: 0xef39, 0x1eaf: 0xef59,
- 0x1eb0: 0xef79, 0x1eb1: 0xef99, 0x1eb2: 0x929d, 0x1eb3: 0x92bd, 0x1eb4: 0xefb9, 0x1eb5: 0x92dd,
- 0x1eb6: 0xefd9, 0x1eb7: 0x92fd, 0x1eb8: 0xeff9, 0x1eb9: 0xf019, 0x1eba: 0xf039, 0x1ebb: 0x931d,
- 0x1ebc: 0x933d, 0x1ebd: 0xf059, 0x1ebe: 0x935d, 0x1ebf: 0xf079,
+ 0x1e80: 0xd819, 0x1e81: 0xd839, 0x1e82: 0xd859, 0x1e83: 0xd879, 0x1e84: 0xd899, 0x1e85: 0xd8b9,
+ 0x1e86: 0xd8d9, 0x1e87: 0xd8f9, 0x1e88: 0xd919, 0x1e89: 0x8cdd, 0x1e8a: 0xd939, 0x1e8b: 0xd959,
+ 0x1e8c: 0xd979, 0x1e8d: 0xd999, 0x1e8e: 0xd9b9, 0x1e8f: 0x8cfd, 0x1e90: 0xd9d9, 0x1e91: 0x8d1d,
+ 0x1e92: 0x8d3d, 0x1e93: 0xd9f9, 0x1e94: 0xda19, 0x1e95: 0xda19, 0x1e96: 0xda39, 0x1e97: 0x8d5d,
+ 0x1e98: 0x8d7d, 0x1e99: 0xda59, 0x1e9a: 0xda79, 0x1e9b: 0xda99, 0x1e9c: 0xdab9, 0x1e9d: 0xdad9,
+ 0x1e9e: 0xdaf9, 0x1e9f: 0xdb19, 0x1ea0: 0xdb39, 0x1ea1: 0xdb59, 0x1ea2: 0xdb79, 0x1ea3: 0xdb99,
+ 0x1ea4: 0x8d9d, 0x1ea5: 0xdbb9, 0x1ea6: 0xdbd9, 0x1ea7: 0xdbf9, 0x1ea8: 0xdc19, 0x1ea9: 0xdbf9,
+ 0x1eaa: 0xdc39, 0x1eab: 0xdc59, 0x1eac: 0xdc79, 0x1ead: 0xdc99, 0x1eae: 0xdcb9, 0x1eaf: 0xdcd9,
+ 0x1eb0: 0xdcf9, 0x1eb1: 0xdd19, 0x1eb2: 0xdd39, 0x1eb3: 0xdd59, 0x1eb4: 0xdd79, 0x1eb5: 0xdd99,
+ 0x1eb6: 0xddb9, 0x1eb7: 0xddd9, 0x1eb8: 0x8dbd, 0x1eb9: 0xddf9, 0x1eba: 0xde19, 0x1ebb: 0xde39,
+ 0x1ebc: 0xde59, 0x1ebd: 0xde79, 0x1ebe: 0x8ddd, 0x1ebf: 0xde99,
// Block 0x7b, offset 0x1ec0
- 0x1ec0: 0xf6b9, 0x1ec1: 0xf6d9, 0x1ec2: 0xf6f9, 0x1ec3: 0xf719, 0x1ec4: 0xf739, 0x1ec5: 0x951d,
- 0x1ec6: 0xf759, 0x1ec7: 0xf779, 0x1ec8: 0xf799, 0x1ec9: 0xf7b9, 0x1eca: 0xf7d9, 0x1ecb: 0x953d,
- 0x1ecc: 0x955d, 0x1ecd: 0xf7f9, 0x1ece: 0xf819, 0x1ecf: 0xf839, 0x1ed0: 0xf859, 0x1ed1: 0xf879,
- 0x1ed2: 0xf899, 0x1ed3: 0x957d, 0x1ed4: 0xf8b9, 0x1ed5: 0xf8d9, 0x1ed6: 0xf8f9, 0x1ed7: 0xf919,
- 0x1ed8: 0x959d, 0x1ed9: 0x95bd, 0x1eda: 0xf939, 0x1edb: 0xf959, 0x1edc: 0xf979, 0x1edd: 0x95dd,
- 0x1ede: 0xf999, 0x1edf: 0xf9b9, 0x1ee0: 0x6815, 0x1ee1: 0x95fd, 0x1ee2: 0xf9d9, 0x1ee3: 0xf9f9,
- 0x1ee4: 0xfa19, 0x1ee5: 0x961d, 0x1ee6: 0xfa39, 0x1ee7: 0xfa59, 0x1ee8: 0xfa79, 0x1ee9: 0xfa99,
- 0x1eea: 0xfab9, 0x1eeb: 0xfad9, 0x1eec: 0xfaf9, 0x1eed: 0x963d, 0x1eee: 0xfb19, 0x1eef: 0xfb39,
- 0x1ef0: 0xfb59, 0x1ef1: 0x965d, 0x1ef2: 0xfb79, 0x1ef3: 0xfb99, 0x1ef4: 0xfbb9, 0x1ef5: 0xfbd9,
- 0x1ef6: 0x7b35, 0x1ef7: 0x967d, 0x1ef8: 0xfbf9, 0x1ef9: 0xfc19, 0x1efa: 0xfc39, 0x1efb: 0x969d,
- 0x1efc: 0xfc59, 0x1efd: 0x96bd, 0x1efe: 0xfc79, 0x1eff: 0xfc79,
+ 0x1ec0: 0xe599, 0x1ec1: 0xe5b9, 0x1ec2: 0xe5d9, 0x1ec3: 0xe5f9, 0x1ec4: 0xe619, 0x1ec5: 0xe639,
+ 0x1ec6: 0x8efd, 0x1ec7: 0xe659, 0x1ec8: 0xe679, 0x1ec9: 0xe699, 0x1eca: 0xe6b9, 0x1ecb: 0xe6d9,
+ 0x1ecc: 0xe6f9, 0x1ecd: 0x8f1d, 0x1ece: 0xe719, 0x1ecf: 0xe739, 0x1ed0: 0x8f3d, 0x1ed1: 0x8f5d,
+ 0x1ed2: 0xe759, 0x1ed3: 0xe779, 0x1ed4: 0xe799, 0x1ed5: 0xe7b9, 0x1ed6: 0xe7d9, 0x1ed7: 0xe7f9,
+ 0x1ed8: 0xe819, 0x1ed9: 0xe839, 0x1eda: 0xe859, 0x1edb: 0x8f7d, 0x1edc: 0xe879, 0x1edd: 0x8f9d,
+ 0x1ede: 0xe899, 0x1edf: 0x2040, 0x1ee0: 0xe8b9, 0x1ee1: 0xe8d9, 0x1ee2: 0xe8f9, 0x1ee3: 0x8fbd,
+ 0x1ee4: 0xe919, 0x1ee5: 0xe939, 0x1ee6: 0x8fdd, 0x1ee7: 0x8ffd, 0x1ee8: 0xe959, 0x1ee9: 0xe979,
+ 0x1eea: 0xe999, 0x1eeb: 0xe9b9, 0x1eec: 0xe9d9, 0x1eed: 0xe9d9, 0x1eee: 0xe9f9, 0x1eef: 0xea19,
+ 0x1ef0: 0xea39, 0x1ef1: 0xea59, 0x1ef2: 0xea79, 0x1ef3: 0xea99, 0x1ef4: 0xeab9, 0x1ef5: 0x901d,
+ 0x1ef6: 0xead9, 0x1ef7: 0x903d, 0x1ef8: 0xeaf9, 0x1ef9: 0x905d, 0x1efa: 0xeb19, 0x1efb: 0x907d,
+ 0x1efc: 0x909d, 0x1efd: 0x90bd, 0x1efe: 0xeb39, 0x1eff: 0xeb59,
// Block 0x7c, offset 0x1f00
- 0x1f00: 0xfc99, 0x1f01: 0x96dd, 0x1f02: 0xfcb9, 0x1f03: 0xfcd9, 0x1f04: 0xfcf9, 0x1f05: 0xfd19,
- 0x1f06: 0xfd39, 0x1f07: 0xfd59, 0x1f08: 0xfd79, 0x1f09: 0x96fd, 0x1f0a: 0xfd99, 0x1f0b: 0xfdb9,
- 0x1f0c: 0xfdd9, 0x1f0d: 0xfdf9, 0x1f0e: 0xfe19, 0x1f0f: 0xfe39, 0x1f10: 0x971d, 0x1f11: 0xfe59,
- 0x1f12: 0x973d, 0x1f13: 0x975d, 0x1f14: 0x977d, 0x1f15: 0xfe79, 0x1f16: 0xfe99, 0x1f17: 0xfeb9,
- 0x1f18: 0xfed9, 0x1f19: 0xfef9, 0x1f1a: 0xff19, 0x1f1b: 0xff39, 0x1f1c: 0xff59, 0x1f1d: 0x979d,
- 0x1f1e: 0x0040, 0x1f1f: 0x0040, 0x1f20: 0x0040, 0x1f21: 0x0040, 0x1f22: 0x0040, 0x1f23: 0x0040,
- 0x1f24: 0x0040, 0x1f25: 0x0040, 0x1f26: 0x0040, 0x1f27: 0x0040, 0x1f28: 0x0040, 0x1f29: 0x0040,
- 0x1f2a: 0x0040, 0x1f2b: 0x0040, 0x1f2c: 0x0040, 0x1f2d: 0x0040, 0x1f2e: 0x0040, 0x1f2f: 0x0040,
- 0x1f30: 0x0040, 0x1f31: 0x0040, 0x1f32: 0x0040, 0x1f33: 0x0040, 0x1f34: 0x0040, 0x1f35: 0x0040,
- 0x1f36: 0x0040, 0x1f37: 0x0040, 0x1f38: 0x0040, 0x1f39: 0x0040, 0x1f3a: 0x0040, 0x1f3b: 0x0040,
- 0x1f3c: 0x0040, 0x1f3d: 0x0040, 0x1f3e: 0x0040, 0x1f3f: 0x0040,
+ 0x1f00: 0xeb79, 0x1f01: 0x90dd, 0x1f02: 0x90fd, 0x1f03: 0x911d, 0x1f04: 0x913d, 0x1f05: 0xeb99,
+ 0x1f06: 0xebb9, 0x1f07: 0xebb9, 0x1f08: 0xebd9, 0x1f09: 0xebf9, 0x1f0a: 0xec19, 0x1f0b: 0xec39,
+ 0x1f0c: 0xec59, 0x1f0d: 0x915d, 0x1f0e: 0xec79, 0x1f0f: 0xec99, 0x1f10: 0xecb9, 0x1f11: 0xecd9,
+ 0x1f12: 0x917d, 0x1f13: 0xecf9, 0x1f14: 0x919d, 0x1f15: 0x91bd, 0x1f16: 0xed19, 0x1f17: 0xed39,
+ 0x1f18: 0xed59, 0x1f19: 0xed79, 0x1f1a: 0xed99, 0x1f1b: 0xedb9, 0x1f1c: 0x91dd, 0x1f1d: 0x91fd,
+ 0x1f1e: 0x921d, 0x1f1f: 0x2040, 0x1f20: 0xedd9, 0x1f21: 0x923d, 0x1f22: 0xedf9, 0x1f23: 0xee19,
+ 0x1f24: 0xee39, 0x1f25: 0x925d, 0x1f26: 0xee59, 0x1f27: 0xee79, 0x1f28: 0xee99, 0x1f29: 0xeeb9,
+ 0x1f2a: 0xeed9, 0x1f2b: 0x927d, 0x1f2c: 0xeef9, 0x1f2d: 0xef19, 0x1f2e: 0xef39, 0x1f2f: 0xef59,
+ 0x1f30: 0xef79, 0x1f31: 0xef99, 0x1f32: 0x929d, 0x1f33: 0x92bd, 0x1f34: 0xefb9, 0x1f35: 0x92dd,
+ 0x1f36: 0xefd9, 0x1f37: 0x92fd, 0x1f38: 0xeff9, 0x1f39: 0xf019, 0x1f3a: 0xf039, 0x1f3b: 0x931d,
+ 0x1f3c: 0x933d, 0x1f3d: 0xf059, 0x1f3e: 0x935d, 0x1f3f: 0xf079,
+ // Block 0x7d, offset 0x1f40
+ 0x1f40: 0xf6b9, 0x1f41: 0xf6d9, 0x1f42: 0xf6f9, 0x1f43: 0xf719, 0x1f44: 0xf739, 0x1f45: 0x951d,
+ 0x1f46: 0xf759, 0x1f47: 0xf779, 0x1f48: 0xf799, 0x1f49: 0xf7b9, 0x1f4a: 0xf7d9, 0x1f4b: 0x953d,
+ 0x1f4c: 0x955d, 0x1f4d: 0xf7f9, 0x1f4e: 0xf819, 0x1f4f: 0xf839, 0x1f50: 0xf859, 0x1f51: 0xf879,
+ 0x1f52: 0xf899, 0x1f53: 0x957d, 0x1f54: 0xf8b9, 0x1f55: 0xf8d9, 0x1f56: 0xf8f9, 0x1f57: 0xf919,
+ 0x1f58: 0x959d, 0x1f59: 0x95bd, 0x1f5a: 0xf939, 0x1f5b: 0xf959, 0x1f5c: 0xf979, 0x1f5d: 0x95dd,
+ 0x1f5e: 0xf999, 0x1f5f: 0xf9b9, 0x1f60: 0x6815, 0x1f61: 0x95fd, 0x1f62: 0xf9d9, 0x1f63: 0xf9f9,
+ 0x1f64: 0xfa19, 0x1f65: 0x961d, 0x1f66: 0xfa39, 0x1f67: 0xfa59, 0x1f68: 0xfa79, 0x1f69: 0xfa99,
+ 0x1f6a: 0xfab9, 0x1f6b: 0xfad9, 0x1f6c: 0xfaf9, 0x1f6d: 0x963d, 0x1f6e: 0xfb19, 0x1f6f: 0xfb39,
+ 0x1f70: 0xfb59, 0x1f71: 0x965d, 0x1f72: 0xfb79, 0x1f73: 0xfb99, 0x1f74: 0xfbb9, 0x1f75: 0xfbd9,
+ 0x1f76: 0x7b35, 0x1f77: 0x967d, 0x1f78: 0xfbf9, 0x1f79: 0xfc19, 0x1f7a: 0xfc39, 0x1f7b: 0x969d,
+ 0x1f7c: 0xfc59, 0x1f7d: 0x96bd, 0x1f7e: 0xfc79, 0x1f7f: 0xfc79,
+ // Block 0x7e, offset 0x1f80
+ 0x1f80: 0xfc99, 0x1f81: 0x96dd, 0x1f82: 0xfcb9, 0x1f83: 0xfcd9, 0x1f84: 0xfcf9, 0x1f85: 0xfd19,
+ 0x1f86: 0xfd39, 0x1f87: 0xfd59, 0x1f88: 0xfd79, 0x1f89: 0x96fd, 0x1f8a: 0xfd99, 0x1f8b: 0xfdb9,
+ 0x1f8c: 0xfdd9, 0x1f8d: 0xfdf9, 0x1f8e: 0xfe19, 0x1f8f: 0xfe39, 0x1f90: 0x971d, 0x1f91: 0xfe59,
+ 0x1f92: 0x973d, 0x1f93: 0x975d, 0x1f94: 0x977d, 0x1f95: 0xfe79, 0x1f96: 0xfe99, 0x1f97: 0xfeb9,
+ 0x1f98: 0xfed9, 0x1f99: 0xfef9, 0x1f9a: 0xff19, 0x1f9b: 0xff39, 0x1f9c: 0xff59, 0x1f9d: 0x979d,
+ 0x1f9e: 0x0040, 0x1f9f: 0x0040, 0x1fa0: 0x0040, 0x1fa1: 0x0040, 0x1fa2: 0x0040, 0x1fa3: 0x0040,
+ 0x1fa4: 0x0040, 0x1fa5: 0x0040, 0x1fa6: 0x0040, 0x1fa7: 0x0040, 0x1fa8: 0x0040, 0x1fa9: 0x0040,
+ 0x1faa: 0x0040, 0x1fab: 0x0040, 0x1fac: 0x0040, 0x1fad: 0x0040, 0x1fae: 0x0040, 0x1faf: 0x0040,
+ 0x1fb0: 0x0040, 0x1fb1: 0x0040, 0x1fb2: 0x0040, 0x1fb3: 0x0040, 0x1fb4: 0x0040, 0x1fb5: 0x0040,
+ 0x1fb6: 0x0040, 0x1fb7: 0x0040, 0x1fb8: 0x0040, 0x1fb9: 0x0040, 0x1fba: 0x0040, 0x1fbb: 0x0040,
+ 0x1fbc: 0x0040, 0x1fbd: 0x0040, 0x1fbe: 0x0040, 0x1fbf: 0x0040,
}
-// idnaIndex: 35 blocks, 2240 entries, 4480 bytes
+// idnaIndex: 36 blocks, 2304 entries, 4608 bytes
// Block 0 is the zero block.
-var idnaIndex = [2240]uint16{
+var idnaIndex = [2304]uint16{
// Block 0x0, offset 0x0
// Block 0x1, offset 0x40
// Block 0x2, offset 0x80
// Block 0x3, offset 0xc0
- 0xc2: 0x01, 0xc3: 0x7b, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x04, 0xc7: 0x05,
- 0xc8: 0x06, 0xc9: 0x7c, 0xca: 0x7d, 0xcb: 0x07, 0xcc: 0x7e, 0xcd: 0x08, 0xce: 0x09, 0xcf: 0x0a,
- 0xd0: 0x7f, 0xd1: 0x0b, 0xd2: 0x0c, 0xd3: 0x0d, 0xd4: 0x0e, 0xd5: 0x80, 0xd6: 0x81, 0xd7: 0x82,
- 0xd8: 0x0f, 0xd9: 0x83, 0xda: 0x84, 0xdb: 0x10, 0xdc: 0x11, 0xdd: 0x85, 0xde: 0x86, 0xdf: 0x87,
+ 0xc2: 0x01, 0xc3: 0x7d, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x04, 0xc7: 0x05,
+ 0xc8: 0x06, 0xc9: 0x7e, 0xca: 0x7f, 0xcb: 0x07, 0xcc: 0x80, 0xcd: 0x08, 0xce: 0x09, 0xcf: 0x0a,
+ 0xd0: 0x81, 0xd1: 0x0b, 0xd2: 0x0c, 0xd3: 0x0d, 0xd4: 0x0e, 0xd5: 0x82, 0xd6: 0x83, 0xd7: 0x84,
+ 0xd8: 0x0f, 0xd9: 0x10, 0xda: 0x85, 0xdb: 0x11, 0xdc: 0x12, 0xdd: 0x86, 0xde: 0x87, 0xdf: 0x88,
0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07,
0xe8: 0x07, 0xe9: 0x08, 0xea: 0x09, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x0a, 0xee: 0x0b, 0xef: 0x0c,
- 0xf0: 0x1c, 0xf1: 0x1d, 0xf2: 0x1d, 0xf3: 0x1f, 0xf4: 0x20,
+ 0xf0: 0x1d, 0xf1: 0x1e, 0xf2: 0x1e, 0xf3: 0x20, 0xf4: 0x21,
// Block 0x4, offset 0x100
- 0x120: 0x88, 0x121: 0x89, 0x122: 0x8a, 0x123: 0x8b, 0x124: 0x8c, 0x125: 0x12, 0x126: 0x13, 0x127: 0x14,
- 0x128: 0x15, 0x129: 0x16, 0x12a: 0x17, 0x12b: 0x18, 0x12c: 0x19, 0x12d: 0x1a, 0x12e: 0x1b, 0x12f: 0x8d,
- 0x130: 0x8e, 0x131: 0x1c, 0x132: 0x1d, 0x133: 0x1e, 0x134: 0x8f, 0x135: 0x1f, 0x136: 0x90, 0x137: 0x91,
- 0x138: 0x92, 0x139: 0x93, 0x13a: 0x20, 0x13b: 0x94, 0x13c: 0x95, 0x13d: 0x21, 0x13e: 0x22, 0x13f: 0x96,
+ 0x120: 0x89, 0x121: 0x13, 0x122: 0x8a, 0x123: 0x8b, 0x124: 0x8c, 0x125: 0x14, 0x126: 0x15, 0x127: 0x16,
+ 0x128: 0x17, 0x129: 0x18, 0x12a: 0x19, 0x12b: 0x1a, 0x12c: 0x1b, 0x12d: 0x1c, 0x12e: 0x1d, 0x12f: 0x8d,
+ 0x130: 0x8e, 0x131: 0x1e, 0x132: 0x1f, 0x133: 0x20, 0x134: 0x8f, 0x135: 0x21, 0x136: 0x90, 0x137: 0x91,
+ 0x138: 0x92, 0x139: 0x93, 0x13a: 0x22, 0x13b: 0x94, 0x13c: 0x95, 0x13d: 0x23, 0x13e: 0x24, 0x13f: 0x96,
// Block 0x5, offset 0x140
- 0x140: 0x97, 0x141: 0x98, 0x142: 0x99, 0x143: 0x9a, 0x144: 0x9b, 0x145: 0x9c, 0x146: 0x9b, 0x147: 0x9b,
- 0x148: 0x9d, 0x149: 0x9e, 0x14a: 0x9f, 0x14b: 0xa0, 0x14c: 0xa1, 0x14d: 0xa2, 0x14e: 0xa3, 0x14f: 0xa4,
- 0x150: 0xa5, 0x151: 0x9d, 0x152: 0x9d, 0x153: 0x9d, 0x154: 0x9d, 0x155: 0x9d, 0x156: 0x9d, 0x157: 0x9d,
- 0x158: 0x9d, 0x159: 0xa6, 0x15a: 0xa7, 0x15b: 0xa8, 0x15c: 0xa9, 0x15d: 0xaa, 0x15e: 0xab, 0x15f: 0xac,
- 0x160: 0xad, 0x161: 0xae, 0x162: 0xaf, 0x163: 0xb0, 0x164: 0xb1, 0x165: 0xb2, 0x166: 0xb3, 0x167: 0xb4,
- 0x168: 0xb5, 0x169: 0xb6, 0x16a: 0xb7, 0x16b: 0xb8, 0x16c: 0xb9, 0x16d: 0xba, 0x16e: 0xbb, 0x16f: 0xbc,
- 0x170: 0xbd, 0x171: 0xbe, 0x172: 0xbf, 0x173: 0xc0, 0x174: 0x23, 0x175: 0x24, 0x176: 0x25, 0x177: 0xc1,
- 0x178: 0x26, 0x179: 0x26, 0x17a: 0x27, 0x17b: 0x26, 0x17c: 0xc2, 0x17d: 0x28, 0x17e: 0x29, 0x17f: 0x2a,
+ 0x140: 0x97, 0x141: 0x98, 0x142: 0x99, 0x143: 0x9a, 0x144: 0x9b, 0x145: 0x9c, 0x146: 0x9d, 0x147: 0x9e,
+ 0x148: 0x9f, 0x149: 0xa0, 0x14a: 0xa1, 0x14b: 0xa2, 0x14c: 0xa3, 0x14d: 0xa4, 0x14e: 0xa5, 0x14f: 0xa6,
+ 0x150: 0xa7, 0x151: 0x9f, 0x152: 0x9f, 0x153: 0x9f, 0x154: 0x9f, 0x155: 0x9f, 0x156: 0x9f, 0x157: 0x9f,
+ 0x158: 0x9f, 0x159: 0xa8, 0x15a: 0xa9, 0x15b: 0xaa, 0x15c: 0xab, 0x15d: 0xac, 0x15e: 0xad, 0x15f: 0xae,
+ 0x160: 0xaf, 0x161: 0xb0, 0x162: 0xb1, 0x163: 0xb2, 0x164: 0xb3, 0x165: 0xb4, 0x166: 0xb5, 0x167: 0xb6,
+ 0x168: 0xb7, 0x169: 0xb8, 0x16a: 0xb9, 0x16b: 0xba, 0x16c: 0xbb, 0x16d: 0xbc, 0x16e: 0xbd, 0x16f: 0xbe,
+ 0x170: 0xbf, 0x171: 0xc0, 0x172: 0xc1, 0x173: 0xc2, 0x174: 0x25, 0x175: 0x26, 0x176: 0x27, 0x177: 0xc3,
+ 0x178: 0x28, 0x179: 0x28, 0x17a: 0x29, 0x17b: 0x28, 0x17c: 0xc4, 0x17d: 0x2a, 0x17e: 0x2b, 0x17f: 0x2c,
// Block 0x6, offset 0x180
- 0x180: 0x2b, 0x181: 0x2c, 0x182: 0x2d, 0x183: 0xc3, 0x184: 0x2e, 0x185: 0x2f, 0x186: 0xc4, 0x187: 0x9b,
- 0x188: 0xc5, 0x189: 0xc6, 0x18a: 0x9b, 0x18b: 0x9b, 0x18c: 0xc7, 0x18d: 0x9b, 0x18e: 0x9b, 0x18f: 0xc8,
- 0x190: 0xc9, 0x191: 0x30, 0x192: 0x31, 0x193: 0x32, 0x194: 0x9b, 0x195: 0x9b, 0x196: 0x9b, 0x197: 0x9b,
+ 0x180: 0x2d, 0x181: 0x2e, 0x182: 0x2f, 0x183: 0xc5, 0x184: 0x30, 0x185: 0x31, 0x186: 0xc6, 0x187: 0x9b,
+ 0x188: 0xc7, 0x189: 0xc8, 0x18a: 0x9b, 0x18b: 0x9b, 0x18c: 0xc9, 0x18d: 0x9b, 0x18e: 0x9b, 0x18f: 0x9b,
+ 0x190: 0xca, 0x191: 0x32, 0x192: 0x33, 0x193: 0x34, 0x194: 0x9b, 0x195: 0x9b, 0x196: 0x9b, 0x197: 0x9b,
0x198: 0x9b, 0x199: 0x9b, 0x19a: 0x9b, 0x19b: 0x9b, 0x19c: 0x9b, 0x19d: 0x9b, 0x19e: 0x9b, 0x19f: 0x9b,
0x1a0: 0x9b, 0x1a1: 0x9b, 0x1a2: 0x9b, 0x1a3: 0x9b, 0x1a4: 0x9b, 0x1a5: 0x9b, 0x1a6: 0x9b, 0x1a7: 0x9b,
- 0x1a8: 0xca, 0x1a9: 0xcb, 0x1aa: 0x9b, 0x1ab: 0xcc, 0x1ac: 0x9b, 0x1ad: 0xcd, 0x1ae: 0xce, 0x1af: 0xcf,
- 0x1b0: 0xd0, 0x1b1: 0x33, 0x1b2: 0x26, 0x1b3: 0x34, 0x1b4: 0xd1, 0x1b5: 0xd2, 0x1b6: 0xd3, 0x1b7: 0xd4,
- 0x1b8: 0xd5, 0x1b9: 0xd6, 0x1ba: 0xd7, 0x1bb: 0xd8, 0x1bc: 0xd9, 0x1bd: 0xda, 0x1be: 0xdb, 0x1bf: 0x35,
+ 0x1a8: 0xcb, 0x1a9: 0xcc, 0x1aa: 0x9b, 0x1ab: 0xcd, 0x1ac: 0x9b, 0x1ad: 0xce, 0x1ae: 0xcf, 0x1af: 0xd0,
+ 0x1b0: 0xd1, 0x1b1: 0x35, 0x1b2: 0x28, 0x1b3: 0x36, 0x1b4: 0xd2, 0x1b5: 0xd3, 0x1b6: 0xd4, 0x1b7: 0xd5,
+ 0x1b8: 0xd6, 0x1b9: 0xd7, 0x1ba: 0xd8, 0x1bb: 0xd9, 0x1bc: 0xda, 0x1bd: 0xdb, 0x1be: 0xdc, 0x1bf: 0x37,
// Block 0x7, offset 0x1c0
- 0x1c0: 0x36, 0x1c1: 0xdc, 0x1c2: 0xdd, 0x1c3: 0xde, 0x1c4: 0xdf, 0x1c5: 0x37, 0x1c6: 0x38, 0x1c7: 0xe0,
- 0x1c8: 0xe1, 0x1c9: 0x39, 0x1ca: 0x3a, 0x1cb: 0x3b, 0x1cc: 0x3c, 0x1cd: 0x3d, 0x1ce: 0x3e, 0x1cf: 0x3f,
- 0x1d0: 0x9d, 0x1d1: 0x9d, 0x1d2: 0x9d, 0x1d3: 0x9d, 0x1d4: 0x9d, 0x1d5: 0x9d, 0x1d6: 0x9d, 0x1d7: 0x9d,
- 0x1d8: 0x9d, 0x1d9: 0x9d, 0x1da: 0x9d, 0x1db: 0x9d, 0x1dc: 0x9d, 0x1dd: 0x9d, 0x1de: 0x9d, 0x1df: 0x9d,
- 0x1e0: 0x9d, 0x1e1: 0x9d, 0x1e2: 0x9d, 0x1e3: 0x9d, 0x1e4: 0x9d, 0x1e5: 0x9d, 0x1e6: 0x9d, 0x1e7: 0x9d,
- 0x1e8: 0x9d, 0x1e9: 0x9d, 0x1ea: 0x9d, 0x1eb: 0x9d, 0x1ec: 0x9d, 0x1ed: 0x9d, 0x1ee: 0x9d, 0x1ef: 0x9d,
- 0x1f0: 0x9d, 0x1f1: 0x9d, 0x1f2: 0x9d, 0x1f3: 0x9d, 0x1f4: 0x9d, 0x1f5: 0x9d, 0x1f6: 0x9d, 0x1f7: 0x9d,
- 0x1f8: 0x9d, 0x1f9: 0x9d, 0x1fa: 0x9d, 0x1fb: 0x9d, 0x1fc: 0x9d, 0x1fd: 0x9d, 0x1fe: 0x9d, 0x1ff: 0x9d,
+ 0x1c0: 0x38, 0x1c1: 0xdd, 0x1c2: 0xde, 0x1c3: 0xdf, 0x1c4: 0xe0, 0x1c5: 0x39, 0x1c6: 0x3a, 0x1c7: 0xe1,
+ 0x1c8: 0xe2, 0x1c9: 0x3b, 0x1ca: 0x3c, 0x1cb: 0x3d, 0x1cc: 0x3e, 0x1cd: 0x3f, 0x1ce: 0x40, 0x1cf: 0x41,
+ 0x1d0: 0x9f, 0x1d1: 0x9f, 0x1d2: 0x9f, 0x1d3: 0x9f, 0x1d4: 0x9f, 0x1d5: 0x9f, 0x1d6: 0x9f, 0x1d7: 0x9f,
+ 0x1d8: 0x9f, 0x1d9: 0x9f, 0x1da: 0x9f, 0x1db: 0x9f, 0x1dc: 0x9f, 0x1dd: 0x9f, 0x1de: 0x9f, 0x1df: 0x9f,
+ 0x1e0: 0x9f, 0x1e1: 0x9f, 0x1e2: 0x9f, 0x1e3: 0x9f, 0x1e4: 0x9f, 0x1e5: 0x9f, 0x1e6: 0x9f, 0x1e7: 0x9f,
+ 0x1e8: 0x9f, 0x1e9: 0x9f, 0x1ea: 0x9f, 0x1eb: 0x9f, 0x1ec: 0x9f, 0x1ed: 0x9f, 0x1ee: 0x9f, 0x1ef: 0x9f,
+ 0x1f0: 0x9f, 0x1f1: 0x9f, 0x1f2: 0x9f, 0x1f3: 0x9f, 0x1f4: 0x9f, 0x1f5: 0x9f, 0x1f6: 0x9f, 0x1f7: 0x9f,
+ 0x1f8: 0x9f, 0x1f9: 0x9f, 0x1fa: 0x9f, 0x1fb: 0x9f, 0x1fc: 0x9f, 0x1fd: 0x9f, 0x1fe: 0x9f, 0x1ff: 0x9f,
// Block 0x8, offset 0x200
- 0x200: 0x9d, 0x201: 0x9d, 0x202: 0x9d, 0x203: 0x9d, 0x204: 0x9d, 0x205: 0x9d, 0x206: 0x9d, 0x207: 0x9d,
- 0x208: 0x9d, 0x209: 0x9d, 0x20a: 0x9d, 0x20b: 0x9d, 0x20c: 0x9d, 0x20d: 0x9d, 0x20e: 0x9d, 0x20f: 0x9d,
- 0x210: 0x9d, 0x211: 0x9d, 0x212: 0x9d, 0x213: 0x9d, 0x214: 0x9d, 0x215: 0x9d, 0x216: 0x9d, 0x217: 0x9d,
- 0x218: 0x9d, 0x219: 0x9d, 0x21a: 0x9d, 0x21b: 0x9d, 0x21c: 0x9d, 0x21d: 0x9d, 0x21e: 0x9d, 0x21f: 0x9d,
- 0x220: 0x9d, 0x221: 0x9d, 0x222: 0x9d, 0x223: 0x9d, 0x224: 0x9d, 0x225: 0x9d, 0x226: 0x9d, 0x227: 0x9d,
- 0x228: 0x9d, 0x229: 0x9d, 0x22a: 0x9d, 0x22b: 0x9d, 0x22c: 0x9d, 0x22d: 0x9d, 0x22e: 0x9d, 0x22f: 0x9d,
- 0x230: 0x9d, 0x231: 0x9d, 0x232: 0x9d, 0x233: 0x9d, 0x234: 0x9d, 0x235: 0x9d, 0x236: 0xb0, 0x237: 0x9b,
- 0x238: 0x9d, 0x239: 0x9d, 0x23a: 0x9d, 0x23b: 0x9d, 0x23c: 0x9d, 0x23d: 0x9d, 0x23e: 0x9d, 0x23f: 0x9d,
+ 0x200: 0x9f, 0x201: 0x9f, 0x202: 0x9f, 0x203: 0x9f, 0x204: 0x9f, 0x205: 0x9f, 0x206: 0x9f, 0x207: 0x9f,
+ 0x208: 0x9f, 0x209: 0x9f, 0x20a: 0x9f, 0x20b: 0x9f, 0x20c: 0x9f, 0x20d: 0x9f, 0x20e: 0x9f, 0x20f: 0x9f,
+ 0x210: 0x9f, 0x211: 0x9f, 0x212: 0x9f, 0x213: 0x9f, 0x214: 0x9f, 0x215: 0x9f, 0x216: 0x9f, 0x217: 0x9f,
+ 0x218: 0x9f, 0x219: 0x9f, 0x21a: 0x9f, 0x21b: 0x9f, 0x21c: 0x9f, 0x21d: 0x9f, 0x21e: 0x9f, 0x21f: 0x9f,
+ 0x220: 0x9f, 0x221: 0x9f, 0x222: 0x9f, 0x223: 0x9f, 0x224: 0x9f, 0x225: 0x9f, 0x226: 0x9f, 0x227: 0x9f,
+ 0x228: 0x9f, 0x229: 0x9f, 0x22a: 0x9f, 0x22b: 0x9f, 0x22c: 0x9f, 0x22d: 0x9f, 0x22e: 0x9f, 0x22f: 0x9f,
+ 0x230: 0x9f, 0x231: 0x9f, 0x232: 0x9f, 0x233: 0x9f, 0x234: 0x9f, 0x235: 0x9f, 0x236: 0xb2, 0x237: 0x9b,
+ 0x238: 0x9f, 0x239: 0x9f, 0x23a: 0x9f, 0x23b: 0x9f, 0x23c: 0x9f, 0x23d: 0x9f, 0x23e: 0x9f, 0x23f: 0x9f,
// Block 0x9, offset 0x240
- 0x240: 0x9d, 0x241: 0x9d, 0x242: 0x9d, 0x243: 0x9d, 0x244: 0x9d, 0x245: 0x9d, 0x246: 0x9d, 0x247: 0x9d,
- 0x248: 0x9d, 0x249: 0x9d, 0x24a: 0x9d, 0x24b: 0x9d, 0x24c: 0x9d, 0x24d: 0x9d, 0x24e: 0x9d, 0x24f: 0x9d,
- 0x250: 0x9d, 0x251: 0x9d, 0x252: 0x9d, 0x253: 0x9d, 0x254: 0x9d, 0x255: 0x9d, 0x256: 0x9d, 0x257: 0x9d,
- 0x258: 0x9d, 0x259: 0x9d, 0x25a: 0x9d, 0x25b: 0x9d, 0x25c: 0x9d, 0x25d: 0x9d, 0x25e: 0x9d, 0x25f: 0x9d,
- 0x260: 0x9d, 0x261: 0x9d, 0x262: 0x9d, 0x263: 0x9d, 0x264: 0x9d, 0x265: 0x9d, 0x266: 0x9d, 0x267: 0x9d,
- 0x268: 0x9d, 0x269: 0x9d, 0x26a: 0x9d, 0x26b: 0x9d, 0x26c: 0x9d, 0x26d: 0x9d, 0x26e: 0x9d, 0x26f: 0x9d,
- 0x270: 0x9d, 0x271: 0x9d, 0x272: 0x9d, 0x273: 0x9d, 0x274: 0x9d, 0x275: 0x9d, 0x276: 0x9d, 0x277: 0x9d,
- 0x278: 0x9d, 0x279: 0x9d, 0x27a: 0x9d, 0x27b: 0x9d, 0x27c: 0x9d, 0x27d: 0x9d, 0x27e: 0x9d, 0x27f: 0x9d,
+ 0x240: 0x9f, 0x241: 0x9f, 0x242: 0x9f, 0x243: 0x9f, 0x244: 0x9f, 0x245: 0x9f, 0x246: 0x9f, 0x247: 0x9f,
+ 0x248: 0x9f, 0x249: 0x9f, 0x24a: 0x9f, 0x24b: 0x9f, 0x24c: 0x9f, 0x24d: 0x9f, 0x24e: 0x9f, 0x24f: 0x9f,
+ 0x250: 0x9f, 0x251: 0x9f, 0x252: 0x9f, 0x253: 0x9f, 0x254: 0x9f, 0x255: 0x9f, 0x256: 0x9f, 0x257: 0x9f,
+ 0x258: 0x9f, 0x259: 0x9f, 0x25a: 0x9f, 0x25b: 0x9f, 0x25c: 0x9f, 0x25d: 0x9f, 0x25e: 0x9f, 0x25f: 0x9f,
+ 0x260: 0x9f, 0x261: 0x9f, 0x262: 0x9f, 0x263: 0x9f, 0x264: 0x9f, 0x265: 0x9f, 0x266: 0x9f, 0x267: 0x9f,
+ 0x268: 0x9f, 0x269: 0x9f, 0x26a: 0x9f, 0x26b: 0x9f, 0x26c: 0x9f, 0x26d: 0x9f, 0x26e: 0x9f, 0x26f: 0x9f,
+ 0x270: 0x9f, 0x271: 0x9f, 0x272: 0x9f, 0x273: 0x9f, 0x274: 0x9f, 0x275: 0x9f, 0x276: 0x9f, 0x277: 0x9f,
+ 0x278: 0x9f, 0x279: 0x9f, 0x27a: 0x9f, 0x27b: 0x9f, 0x27c: 0x9f, 0x27d: 0x9f, 0x27e: 0x9f, 0x27f: 0x9f,
// Block 0xa, offset 0x280
- 0x280: 0x9d, 0x281: 0x9d, 0x282: 0x9d, 0x283: 0x9d, 0x284: 0x9d, 0x285: 0x9d, 0x286: 0x9d, 0x287: 0x9d,
- 0x288: 0x9d, 0x289: 0x9d, 0x28a: 0x9d, 0x28b: 0x9d, 0x28c: 0x9d, 0x28d: 0x9d, 0x28e: 0x9d, 0x28f: 0x9d,
- 0x290: 0x9d, 0x291: 0x9d, 0x292: 0x9d, 0x293: 0x9d, 0x294: 0x9d, 0x295: 0x9d, 0x296: 0x9d, 0x297: 0x9d,
- 0x298: 0x9d, 0x299: 0x9d, 0x29a: 0x9d, 0x29b: 0x9d, 0x29c: 0x9d, 0x29d: 0x9d, 0x29e: 0x9d, 0x29f: 0x9d,
- 0x2a0: 0x9d, 0x2a1: 0x9d, 0x2a2: 0x9d, 0x2a3: 0x9d, 0x2a4: 0x9d, 0x2a5: 0x9d, 0x2a6: 0x9d, 0x2a7: 0x9d,
- 0x2a8: 0x9d, 0x2a9: 0x9d, 0x2aa: 0x9d, 0x2ab: 0x9d, 0x2ac: 0x9d, 0x2ad: 0x9d, 0x2ae: 0x9d, 0x2af: 0x9d,
- 0x2b0: 0x9d, 0x2b1: 0x9d, 0x2b2: 0x9d, 0x2b3: 0x9d, 0x2b4: 0x9d, 0x2b5: 0x9d, 0x2b6: 0x9d, 0x2b7: 0x9d,
- 0x2b8: 0x9d, 0x2b9: 0x9d, 0x2ba: 0x9d, 0x2bb: 0x9d, 0x2bc: 0x9d, 0x2bd: 0x9d, 0x2be: 0x9d, 0x2bf: 0xe2,
+ 0x280: 0x9f, 0x281: 0x9f, 0x282: 0x9f, 0x283: 0x9f, 0x284: 0x9f, 0x285: 0x9f, 0x286: 0x9f, 0x287: 0x9f,
+ 0x288: 0x9f, 0x289: 0x9f, 0x28a: 0x9f, 0x28b: 0x9f, 0x28c: 0x9f, 0x28d: 0x9f, 0x28e: 0x9f, 0x28f: 0x9f,
+ 0x290: 0x9f, 0x291: 0x9f, 0x292: 0x9f, 0x293: 0x9f, 0x294: 0x9f, 0x295: 0x9f, 0x296: 0x9f, 0x297: 0x9f,
+ 0x298: 0x9f, 0x299: 0x9f, 0x29a: 0x9f, 0x29b: 0x9f, 0x29c: 0x9f, 0x29d: 0x9f, 0x29e: 0x9f, 0x29f: 0x9f,
+ 0x2a0: 0x9f, 0x2a1: 0x9f, 0x2a2: 0x9f, 0x2a3: 0x9f, 0x2a4: 0x9f, 0x2a5: 0x9f, 0x2a6: 0x9f, 0x2a7: 0x9f,
+ 0x2a8: 0x9f, 0x2a9: 0x9f, 0x2aa: 0x9f, 0x2ab: 0x9f, 0x2ac: 0x9f, 0x2ad: 0x9f, 0x2ae: 0x9f, 0x2af: 0x9f,
+ 0x2b0: 0x9f, 0x2b1: 0x9f, 0x2b2: 0x9f, 0x2b3: 0x9f, 0x2b4: 0x9f, 0x2b5: 0x9f, 0x2b6: 0x9f, 0x2b7: 0x9f,
+ 0x2b8: 0x9f, 0x2b9: 0x9f, 0x2ba: 0x9f, 0x2bb: 0x9f, 0x2bc: 0x9f, 0x2bd: 0x9f, 0x2be: 0x9f, 0x2bf: 0xe3,
// Block 0xb, offset 0x2c0
- 0x2c0: 0x9d, 0x2c1: 0x9d, 0x2c2: 0x9d, 0x2c3: 0x9d, 0x2c4: 0x9d, 0x2c5: 0x9d, 0x2c6: 0x9d, 0x2c7: 0x9d,
- 0x2c8: 0x9d, 0x2c9: 0x9d, 0x2ca: 0x9d, 0x2cb: 0x9d, 0x2cc: 0x9d, 0x2cd: 0x9d, 0x2ce: 0x9d, 0x2cf: 0x9d,
- 0x2d0: 0x9d, 0x2d1: 0x9d, 0x2d2: 0xe3, 0x2d3: 0xe4, 0x2d4: 0x9d, 0x2d5: 0x9d, 0x2d6: 0x9d, 0x2d7: 0x9d,
- 0x2d8: 0xe5, 0x2d9: 0x40, 0x2da: 0x41, 0x2db: 0xe6, 0x2dc: 0x42, 0x2dd: 0x43, 0x2de: 0x44, 0x2df: 0xe7,
- 0x2e0: 0xe8, 0x2e1: 0xe9, 0x2e2: 0xea, 0x2e3: 0xeb, 0x2e4: 0xec, 0x2e5: 0xed, 0x2e6: 0xee, 0x2e7: 0xef,
- 0x2e8: 0xf0, 0x2e9: 0xf1, 0x2ea: 0xf2, 0x2eb: 0xf3, 0x2ec: 0xf4, 0x2ed: 0xf5, 0x2ee: 0xf6, 0x2ef: 0xf7,
- 0x2f0: 0x9d, 0x2f1: 0x9d, 0x2f2: 0x9d, 0x2f3: 0x9d, 0x2f4: 0x9d, 0x2f5: 0x9d, 0x2f6: 0x9d, 0x2f7: 0x9d,
- 0x2f8: 0x9d, 0x2f9: 0x9d, 0x2fa: 0x9d, 0x2fb: 0x9d, 0x2fc: 0x9d, 0x2fd: 0x9d, 0x2fe: 0x9d, 0x2ff: 0x9d,
+ 0x2c0: 0x9f, 0x2c1: 0x9f, 0x2c2: 0x9f, 0x2c3: 0x9f, 0x2c4: 0x9f, 0x2c5: 0x9f, 0x2c6: 0x9f, 0x2c7: 0x9f,
+ 0x2c8: 0x9f, 0x2c9: 0x9f, 0x2ca: 0x9f, 0x2cb: 0x9f, 0x2cc: 0x9f, 0x2cd: 0x9f, 0x2ce: 0x9f, 0x2cf: 0x9f,
+ 0x2d0: 0x9f, 0x2d1: 0x9f, 0x2d2: 0xe4, 0x2d3: 0xe5, 0x2d4: 0x9f, 0x2d5: 0x9f, 0x2d6: 0x9f, 0x2d7: 0x9f,
+ 0x2d8: 0xe6, 0x2d9: 0x42, 0x2da: 0x43, 0x2db: 0xe7, 0x2dc: 0x44, 0x2dd: 0x45, 0x2de: 0x46, 0x2df: 0xe8,
+ 0x2e0: 0xe9, 0x2e1: 0xea, 0x2e2: 0xeb, 0x2e3: 0xec, 0x2e4: 0xed, 0x2e5: 0xee, 0x2e6: 0xef, 0x2e7: 0xf0,
+ 0x2e8: 0xf1, 0x2e9: 0xf2, 0x2ea: 0xf3, 0x2eb: 0xf4, 0x2ec: 0xf5, 0x2ed: 0xf6, 0x2ee: 0xf7, 0x2ef: 0xf8,
+ 0x2f0: 0x9f, 0x2f1: 0x9f, 0x2f2: 0x9f, 0x2f3: 0x9f, 0x2f4: 0x9f, 0x2f5: 0x9f, 0x2f6: 0x9f, 0x2f7: 0x9f,
+ 0x2f8: 0x9f, 0x2f9: 0x9f, 0x2fa: 0x9f, 0x2fb: 0x9f, 0x2fc: 0x9f, 0x2fd: 0x9f, 0x2fe: 0x9f, 0x2ff: 0x9f,
// Block 0xc, offset 0x300
- 0x300: 0x9d, 0x301: 0x9d, 0x302: 0x9d, 0x303: 0x9d, 0x304: 0x9d, 0x305: 0x9d, 0x306: 0x9d, 0x307: 0x9d,
- 0x308: 0x9d, 0x309: 0x9d, 0x30a: 0x9d, 0x30b: 0x9d, 0x30c: 0x9d, 0x30d: 0x9d, 0x30e: 0x9d, 0x30f: 0x9d,
- 0x310: 0x9d, 0x311: 0x9d, 0x312: 0x9d, 0x313: 0x9d, 0x314: 0x9d, 0x315: 0x9d, 0x316: 0x9d, 0x317: 0x9d,
- 0x318: 0x9d, 0x319: 0x9d, 0x31a: 0x9d, 0x31b: 0x9d, 0x31c: 0x9d, 0x31d: 0x9d, 0x31e: 0xf8, 0x31f: 0xf9,
+ 0x300: 0x9f, 0x301: 0x9f, 0x302: 0x9f, 0x303: 0x9f, 0x304: 0x9f, 0x305: 0x9f, 0x306: 0x9f, 0x307: 0x9f,
+ 0x308: 0x9f, 0x309: 0x9f, 0x30a: 0x9f, 0x30b: 0x9f, 0x30c: 0x9f, 0x30d: 0x9f, 0x30e: 0x9f, 0x30f: 0x9f,
+ 0x310: 0x9f, 0x311: 0x9f, 0x312: 0x9f, 0x313: 0x9f, 0x314: 0x9f, 0x315: 0x9f, 0x316: 0x9f, 0x317: 0x9f,
+ 0x318: 0x9f, 0x319: 0x9f, 0x31a: 0x9f, 0x31b: 0x9f, 0x31c: 0x9f, 0x31d: 0x9f, 0x31e: 0xf9, 0x31f: 0xfa,
// Block 0xd, offset 0x340
- 0x340: 0xb8, 0x341: 0xb8, 0x342: 0xb8, 0x343: 0xb8, 0x344: 0xb8, 0x345: 0xb8, 0x346: 0xb8, 0x347: 0xb8,
- 0x348: 0xb8, 0x349: 0xb8, 0x34a: 0xb8, 0x34b: 0xb8, 0x34c: 0xb8, 0x34d: 0xb8, 0x34e: 0xb8, 0x34f: 0xb8,
- 0x350: 0xb8, 0x351: 0xb8, 0x352: 0xb8, 0x353: 0xb8, 0x354: 0xb8, 0x355: 0xb8, 0x356: 0xb8, 0x357: 0xb8,
- 0x358: 0xb8, 0x359: 0xb8, 0x35a: 0xb8, 0x35b: 0xb8, 0x35c: 0xb8, 0x35d: 0xb8, 0x35e: 0xb8, 0x35f: 0xb8,
- 0x360: 0xb8, 0x361: 0xb8, 0x362: 0xb8, 0x363: 0xb8, 0x364: 0xb8, 0x365: 0xb8, 0x366: 0xb8, 0x367: 0xb8,
- 0x368: 0xb8, 0x369: 0xb8, 0x36a: 0xb8, 0x36b: 0xb8, 0x36c: 0xb8, 0x36d: 0xb8, 0x36e: 0xb8, 0x36f: 0xb8,
- 0x370: 0xb8, 0x371: 0xb8, 0x372: 0xb8, 0x373: 0xb8, 0x374: 0xb8, 0x375: 0xb8, 0x376: 0xb8, 0x377: 0xb8,
- 0x378: 0xb8, 0x379: 0xb8, 0x37a: 0xb8, 0x37b: 0xb8, 0x37c: 0xb8, 0x37d: 0xb8, 0x37e: 0xb8, 0x37f: 0xb8,
+ 0x340: 0xba, 0x341: 0xba, 0x342: 0xba, 0x343: 0xba, 0x344: 0xba, 0x345: 0xba, 0x346: 0xba, 0x347: 0xba,
+ 0x348: 0xba, 0x349: 0xba, 0x34a: 0xba, 0x34b: 0xba, 0x34c: 0xba, 0x34d: 0xba, 0x34e: 0xba, 0x34f: 0xba,
+ 0x350: 0xba, 0x351: 0xba, 0x352: 0xba, 0x353: 0xba, 0x354: 0xba, 0x355: 0xba, 0x356: 0xba, 0x357: 0xba,
+ 0x358: 0xba, 0x359: 0xba, 0x35a: 0xba, 0x35b: 0xba, 0x35c: 0xba, 0x35d: 0xba, 0x35e: 0xba, 0x35f: 0xba,
+ 0x360: 0xba, 0x361: 0xba, 0x362: 0xba, 0x363: 0xba, 0x364: 0xba, 0x365: 0xba, 0x366: 0xba, 0x367: 0xba,
+ 0x368: 0xba, 0x369: 0xba, 0x36a: 0xba, 0x36b: 0xba, 0x36c: 0xba, 0x36d: 0xba, 0x36e: 0xba, 0x36f: 0xba,
+ 0x370: 0xba, 0x371: 0xba, 0x372: 0xba, 0x373: 0xba, 0x374: 0xba, 0x375: 0xba, 0x376: 0xba, 0x377: 0xba,
+ 0x378: 0xba, 0x379: 0xba, 0x37a: 0xba, 0x37b: 0xba, 0x37c: 0xba, 0x37d: 0xba, 0x37e: 0xba, 0x37f: 0xba,
// Block 0xe, offset 0x380
- 0x380: 0xb8, 0x381: 0xb8, 0x382: 0xb8, 0x383: 0xb8, 0x384: 0xb8, 0x385: 0xb8, 0x386: 0xb8, 0x387: 0xb8,
- 0x388: 0xb8, 0x389: 0xb8, 0x38a: 0xb8, 0x38b: 0xb8, 0x38c: 0xb8, 0x38d: 0xb8, 0x38e: 0xb8, 0x38f: 0xb8,
- 0x390: 0xb8, 0x391: 0xb8, 0x392: 0xb8, 0x393: 0xb8, 0x394: 0xb8, 0x395: 0xb8, 0x396: 0xb8, 0x397: 0xb8,
- 0x398: 0xb8, 0x399: 0xb8, 0x39a: 0xb8, 0x39b: 0xb8, 0x39c: 0xb8, 0x39d: 0xb8, 0x39e: 0xb8, 0x39f: 0xb8,
- 0x3a0: 0xb8, 0x3a1: 0xb8, 0x3a2: 0xb8, 0x3a3: 0xb8, 0x3a4: 0xfa, 0x3a5: 0xfb, 0x3a6: 0xfc, 0x3a7: 0xfd,
- 0x3a8: 0x45, 0x3a9: 0xfe, 0x3aa: 0xff, 0x3ab: 0x46, 0x3ac: 0x47, 0x3ad: 0x48, 0x3ae: 0x49, 0x3af: 0x4a,
- 0x3b0: 0x100, 0x3b1: 0x4b, 0x3b2: 0x4c, 0x3b3: 0x4d, 0x3b4: 0x4e, 0x3b5: 0x4f, 0x3b6: 0x101, 0x3b7: 0x50,
- 0x3b8: 0x51, 0x3b9: 0x52, 0x3ba: 0x53, 0x3bb: 0x54, 0x3bc: 0x55, 0x3bd: 0x56, 0x3be: 0x57, 0x3bf: 0x58,
+ 0x380: 0xba, 0x381: 0xba, 0x382: 0xba, 0x383: 0xba, 0x384: 0xba, 0x385: 0xba, 0x386: 0xba, 0x387: 0xba,
+ 0x388: 0xba, 0x389: 0xba, 0x38a: 0xba, 0x38b: 0xba, 0x38c: 0xba, 0x38d: 0xba, 0x38e: 0xba, 0x38f: 0xba,
+ 0x390: 0xba, 0x391: 0xba, 0x392: 0xba, 0x393: 0xba, 0x394: 0xba, 0x395: 0xba, 0x396: 0xba, 0x397: 0xba,
+ 0x398: 0xba, 0x399: 0xba, 0x39a: 0xba, 0x39b: 0xba, 0x39c: 0xba, 0x39d: 0xba, 0x39e: 0xba, 0x39f: 0xba,
+ 0x3a0: 0xba, 0x3a1: 0xba, 0x3a2: 0xba, 0x3a3: 0xba, 0x3a4: 0xfb, 0x3a5: 0xfc, 0x3a6: 0xfd, 0x3a7: 0xfe,
+ 0x3a8: 0x47, 0x3a9: 0xff, 0x3aa: 0x100, 0x3ab: 0x48, 0x3ac: 0x49, 0x3ad: 0x4a, 0x3ae: 0x4b, 0x3af: 0x4c,
+ 0x3b0: 0x101, 0x3b1: 0x4d, 0x3b2: 0x4e, 0x3b3: 0x4f, 0x3b4: 0x50, 0x3b5: 0x51, 0x3b6: 0x102, 0x3b7: 0x52,
+ 0x3b8: 0x53, 0x3b9: 0x54, 0x3ba: 0x55, 0x3bb: 0x56, 0x3bc: 0x57, 0x3bd: 0x58, 0x3be: 0x59, 0x3bf: 0x5a,
// Block 0xf, offset 0x3c0
- 0x3c0: 0x102, 0x3c1: 0x103, 0x3c2: 0x9d, 0x3c3: 0x104, 0x3c4: 0x105, 0x3c5: 0x9b, 0x3c6: 0x106, 0x3c7: 0x107,
- 0x3c8: 0xb8, 0x3c9: 0xb8, 0x3ca: 0x108, 0x3cb: 0x109, 0x3cc: 0x10a, 0x3cd: 0x10b, 0x3ce: 0x10c, 0x3cf: 0x10d,
- 0x3d0: 0x10e, 0x3d1: 0x9d, 0x3d2: 0x10f, 0x3d3: 0x110, 0x3d4: 0x111, 0x3d5: 0x112, 0x3d6: 0xb8, 0x3d7: 0xb8,
- 0x3d8: 0x9d, 0x3d9: 0x9d, 0x3da: 0x9d, 0x3db: 0x9d, 0x3dc: 0x113, 0x3dd: 0x114, 0x3de: 0xb8, 0x3df: 0xb8,
- 0x3e0: 0x115, 0x3e1: 0x116, 0x3e2: 0x117, 0x3e3: 0x118, 0x3e4: 0x119, 0x3e5: 0xb8, 0x3e6: 0x11a, 0x3e7: 0x11b,
- 0x3e8: 0x11c, 0x3e9: 0x11d, 0x3ea: 0x11e, 0x3eb: 0x59, 0x3ec: 0x11f, 0x3ed: 0x120, 0x3ee: 0x5a, 0x3ef: 0xb8,
- 0x3f0: 0x9d, 0x3f1: 0x121, 0x3f2: 0x122, 0x3f3: 0x123, 0x3f4: 0xb8, 0x3f5: 0xb8, 0x3f6: 0xb8, 0x3f7: 0xb8,
- 0x3f8: 0xb8, 0x3f9: 0x124, 0x3fa: 0xb8, 0x3fb: 0xb8, 0x3fc: 0xb8, 0x3fd: 0xb8, 0x3fe: 0xb8, 0x3ff: 0xb8,
+ 0x3c0: 0x103, 0x3c1: 0x104, 0x3c2: 0x9f, 0x3c3: 0x105, 0x3c4: 0x106, 0x3c5: 0x9b, 0x3c6: 0x107, 0x3c7: 0x108,
+ 0x3c8: 0xba, 0x3c9: 0xba, 0x3ca: 0x109, 0x3cb: 0x10a, 0x3cc: 0x10b, 0x3cd: 0x10c, 0x3ce: 0x10d, 0x3cf: 0x10e,
+ 0x3d0: 0x10f, 0x3d1: 0x9f, 0x3d2: 0x110, 0x3d3: 0x111, 0x3d4: 0x112, 0x3d5: 0x113, 0x3d6: 0xba, 0x3d7: 0xba,
+ 0x3d8: 0x9f, 0x3d9: 0x9f, 0x3da: 0x9f, 0x3db: 0x9f, 0x3dc: 0x114, 0x3dd: 0x115, 0x3de: 0xba, 0x3df: 0xba,
+ 0x3e0: 0x116, 0x3e1: 0x117, 0x3e2: 0x118, 0x3e3: 0x119, 0x3e4: 0x11a, 0x3e5: 0xba, 0x3e6: 0x11b, 0x3e7: 0x11c,
+ 0x3e8: 0x11d, 0x3e9: 0x11e, 0x3ea: 0x11f, 0x3eb: 0x5b, 0x3ec: 0x120, 0x3ed: 0x121, 0x3ee: 0x5c, 0x3ef: 0xba,
+ 0x3f0: 0x122, 0x3f1: 0x123, 0x3f2: 0x124, 0x3f3: 0x125, 0x3f4: 0xba, 0x3f5: 0xba, 0x3f6: 0xba, 0x3f7: 0xba,
+ 0x3f8: 0xba, 0x3f9: 0x126, 0x3fa: 0xba, 0x3fb: 0xba, 0x3fc: 0xba, 0x3fd: 0xba, 0x3fe: 0xba, 0x3ff: 0xba,
// Block 0x10, offset 0x400
- 0x400: 0x125, 0x401: 0x126, 0x402: 0x127, 0x403: 0x128, 0x404: 0x129, 0x405: 0x12a, 0x406: 0x12b, 0x407: 0x12c,
- 0x408: 0x12d, 0x409: 0xb8, 0x40a: 0x12e, 0x40b: 0x12f, 0x40c: 0x5b, 0x40d: 0x5c, 0x40e: 0xb8, 0x40f: 0xb8,
- 0x410: 0x130, 0x411: 0x131, 0x412: 0x132, 0x413: 0x133, 0x414: 0xb8, 0x415: 0xb8, 0x416: 0x134, 0x417: 0x135,
- 0x418: 0x136, 0x419: 0x137, 0x41a: 0x138, 0x41b: 0x139, 0x41c: 0x13a, 0x41d: 0xb8, 0x41e: 0xb8, 0x41f: 0xb8,
- 0x420: 0xb8, 0x421: 0xb8, 0x422: 0x13b, 0x423: 0x13c, 0x424: 0xb8, 0x425: 0xb8, 0x426: 0xb8, 0x427: 0xb8,
- 0x428: 0xb8, 0x429: 0xb8, 0x42a: 0xb8, 0x42b: 0x13d, 0x42c: 0xb8, 0x42d: 0xb8, 0x42e: 0xb8, 0x42f: 0xb8,
- 0x430: 0x13e, 0x431: 0x13f, 0x432: 0x140, 0x433: 0xb8, 0x434: 0xb8, 0x435: 0xb8, 0x436: 0xb8, 0x437: 0xb8,
- 0x438: 0xb8, 0x439: 0xb8, 0x43a: 0xb8, 0x43b: 0xb8, 0x43c: 0xb8, 0x43d: 0xb8, 0x43e: 0xb8, 0x43f: 0xb8,
+ 0x400: 0x127, 0x401: 0x128, 0x402: 0x129, 0x403: 0x12a, 0x404: 0x12b, 0x405: 0x12c, 0x406: 0x12d, 0x407: 0x12e,
+ 0x408: 0x12f, 0x409: 0xba, 0x40a: 0x130, 0x40b: 0x131, 0x40c: 0x5d, 0x40d: 0x5e, 0x40e: 0xba, 0x40f: 0xba,
+ 0x410: 0x132, 0x411: 0x133, 0x412: 0x134, 0x413: 0x135, 0x414: 0xba, 0x415: 0xba, 0x416: 0x136, 0x417: 0x137,
+ 0x418: 0x138, 0x419: 0x139, 0x41a: 0x13a, 0x41b: 0x13b, 0x41c: 0x13c, 0x41d: 0xba, 0x41e: 0xba, 0x41f: 0xba,
+ 0x420: 0xba, 0x421: 0xba, 0x422: 0x13d, 0x423: 0x13e, 0x424: 0xba, 0x425: 0xba, 0x426: 0xba, 0x427: 0xba,
+ 0x428: 0x13f, 0x429: 0x140, 0x42a: 0x141, 0x42b: 0x142, 0x42c: 0xba, 0x42d: 0xba, 0x42e: 0xba, 0x42f: 0xba,
+ 0x430: 0x143, 0x431: 0x144, 0x432: 0x145, 0x433: 0xba, 0x434: 0x146, 0x435: 0x147, 0x436: 0xba, 0x437: 0xba,
+ 0x438: 0xba, 0x439: 0xba, 0x43a: 0xba, 0x43b: 0xba, 0x43c: 0xba, 0x43d: 0xba, 0x43e: 0xba, 0x43f: 0xba,
// Block 0x11, offset 0x440
- 0x440: 0x9d, 0x441: 0x9d, 0x442: 0x9d, 0x443: 0x9d, 0x444: 0x9d, 0x445: 0x9d, 0x446: 0x9d, 0x447: 0x9d,
- 0x448: 0x9d, 0x449: 0x9d, 0x44a: 0x9d, 0x44b: 0x9d, 0x44c: 0x9d, 0x44d: 0x9d, 0x44e: 0x141, 0x44f: 0xb8,
- 0x450: 0x9b, 0x451: 0x142, 0x452: 0x9d, 0x453: 0x9d, 0x454: 0x9d, 0x455: 0x143, 0x456: 0xb8, 0x457: 0xb8,
- 0x458: 0xb8, 0x459: 0xb8, 0x45a: 0xb8, 0x45b: 0xb8, 0x45c: 0xb8, 0x45d: 0xb8, 0x45e: 0xb8, 0x45f: 0xb8,
- 0x460: 0xb8, 0x461: 0xb8, 0x462: 0xb8, 0x463: 0xb8, 0x464: 0xb8, 0x465: 0xb8, 0x466: 0xb8, 0x467: 0xb8,
- 0x468: 0xb8, 0x469: 0xb8, 0x46a: 0xb8, 0x46b: 0xb8, 0x46c: 0xb8, 0x46d: 0xb8, 0x46e: 0xb8, 0x46f: 0xb8,
- 0x470: 0xb8, 0x471: 0xb8, 0x472: 0xb8, 0x473: 0xb8, 0x474: 0xb8, 0x475: 0xb8, 0x476: 0xb8, 0x477: 0xb8,
- 0x478: 0xb8, 0x479: 0xb8, 0x47a: 0xb8, 0x47b: 0xb8, 0x47c: 0xb8, 0x47d: 0xb8, 0x47e: 0xb8, 0x47f: 0xb8,
+ 0x440: 0x9f, 0x441: 0x9f, 0x442: 0x9f, 0x443: 0x9f, 0x444: 0x9f, 0x445: 0x9f, 0x446: 0x9f, 0x447: 0x9f,
+ 0x448: 0x9f, 0x449: 0x9f, 0x44a: 0x9f, 0x44b: 0x9f, 0x44c: 0x9f, 0x44d: 0x9f, 0x44e: 0x148, 0x44f: 0xba,
+ 0x450: 0x9b, 0x451: 0x149, 0x452: 0x9f, 0x453: 0x9f, 0x454: 0x9f, 0x455: 0x14a, 0x456: 0xba, 0x457: 0xba,
+ 0x458: 0xba, 0x459: 0xba, 0x45a: 0xba, 0x45b: 0xba, 0x45c: 0xba, 0x45d: 0xba, 0x45e: 0xba, 0x45f: 0xba,
+ 0x460: 0xba, 0x461: 0xba, 0x462: 0xba, 0x463: 0xba, 0x464: 0xba, 0x465: 0xba, 0x466: 0xba, 0x467: 0xba,
+ 0x468: 0xba, 0x469: 0xba, 0x46a: 0xba, 0x46b: 0xba, 0x46c: 0xba, 0x46d: 0xba, 0x46e: 0xba, 0x46f: 0xba,
+ 0x470: 0xba, 0x471: 0xba, 0x472: 0xba, 0x473: 0xba, 0x474: 0xba, 0x475: 0xba, 0x476: 0xba, 0x477: 0xba,
+ 0x478: 0xba, 0x479: 0xba, 0x47a: 0xba, 0x47b: 0xba, 0x47c: 0xba, 0x47d: 0xba, 0x47e: 0xba, 0x47f: 0xba,
// Block 0x12, offset 0x480
- 0x480: 0x9d, 0x481: 0x9d, 0x482: 0x9d, 0x483: 0x9d, 0x484: 0x9d, 0x485: 0x9d, 0x486: 0x9d, 0x487: 0x9d,
- 0x488: 0x9d, 0x489: 0x9d, 0x48a: 0x9d, 0x48b: 0x9d, 0x48c: 0x9d, 0x48d: 0x9d, 0x48e: 0x9d, 0x48f: 0x9d,
- 0x490: 0x144, 0x491: 0xb8, 0x492: 0xb8, 0x493: 0xb8, 0x494: 0xb8, 0x495: 0xb8, 0x496: 0xb8, 0x497: 0xb8,
- 0x498: 0xb8, 0x499: 0xb8, 0x49a: 0xb8, 0x49b: 0xb8, 0x49c: 0xb8, 0x49d: 0xb8, 0x49e: 0xb8, 0x49f: 0xb8,
- 0x4a0: 0xb8, 0x4a1: 0xb8, 0x4a2: 0xb8, 0x4a3: 0xb8, 0x4a4: 0xb8, 0x4a5: 0xb8, 0x4a6: 0xb8, 0x4a7: 0xb8,
- 0x4a8: 0xb8, 0x4a9: 0xb8, 0x4aa: 0xb8, 0x4ab: 0xb8, 0x4ac: 0xb8, 0x4ad: 0xb8, 0x4ae: 0xb8, 0x4af: 0xb8,
- 0x4b0: 0xb8, 0x4b1: 0xb8, 0x4b2: 0xb8, 0x4b3: 0xb8, 0x4b4: 0xb8, 0x4b5: 0xb8, 0x4b6: 0xb8, 0x4b7: 0xb8,
- 0x4b8: 0xb8, 0x4b9: 0xb8, 0x4ba: 0xb8, 0x4bb: 0xb8, 0x4bc: 0xb8, 0x4bd: 0xb8, 0x4be: 0xb8, 0x4bf: 0xb8,
+ 0x480: 0x9f, 0x481: 0x9f, 0x482: 0x9f, 0x483: 0x9f, 0x484: 0x9f, 0x485: 0x9f, 0x486: 0x9f, 0x487: 0x9f,
+ 0x488: 0x9f, 0x489: 0x9f, 0x48a: 0x9f, 0x48b: 0x9f, 0x48c: 0x9f, 0x48d: 0x9f, 0x48e: 0x9f, 0x48f: 0x9f,
+ 0x490: 0x14b, 0x491: 0xba, 0x492: 0xba, 0x493: 0xba, 0x494: 0xba, 0x495: 0xba, 0x496: 0xba, 0x497: 0xba,
+ 0x498: 0xba, 0x499: 0xba, 0x49a: 0xba, 0x49b: 0xba, 0x49c: 0xba, 0x49d: 0xba, 0x49e: 0xba, 0x49f: 0xba,
+ 0x4a0: 0xba, 0x4a1: 0xba, 0x4a2: 0xba, 0x4a3: 0xba, 0x4a4: 0xba, 0x4a5: 0xba, 0x4a6: 0xba, 0x4a7: 0xba,
+ 0x4a8: 0xba, 0x4a9: 0xba, 0x4aa: 0xba, 0x4ab: 0xba, 0x4ac: 0xba, 0x4ad: 0xba, 0x4ae: 0xba, 0x4af: 0xba,
+ 0x4b0: 0xba, 0x4b1: 0xba, 0x4b2: 0xba, 0x4b3: 0xba, 0x4b4: 0xba, 0x4b5: 0xba, 0x4b6: 0xba, 0x4b7: 0xba,
+ 0x4b8: 0xba, 0x4b9: 0xba, 0x4ba: 0xba, 0x4bb: 0xba, 0x4bc: 0xba, 0x4bd: 0xba, 0x4be: 0xba, 0x4bf: 0xba,
// Block 0x13, offset 0x4c0
- 0x4c0: 0xb8, 0x4c1: 0xb8, 0x4c2: 0xb8, 0x4c3: 0xb8, 0x4c4: 0xb8, 0x4c5: 0xb8, 0x4c6: 0xb8, 0x4c7: 0xb8,
- 0x4c8: 0xb8, 0x4c9: 0xb8, 0x4ca: 0xb8, 0x4cb: 0xb8, 0x4cc: 0xb8, 0x4cd: 0xb8, 0x4ce: 0xb8, 0x4cf: 0xb8,
- 0x4d0: 0x9d, 0x4d1: 0x9d, 0x4d2: 0x9d, 0x4d3: 0x9d, 0x4d4: 0x9d, 0x4d5: 0x9d, 0x4d6: 0x9d, 0x4d7: 0x9d,
- 0x4d8: 0x9d, 0x4d9: 0x145, 0x4da: 0xb8, 0x4db: 0xb8, 0x4dc: 0xb8, 0x4dd: 0xb8, 0x4de: 0xb8, 0x4df: 0xb8,
- 0x4e0: 0xb8, 0x4e1: 0xb8, 0x4e2: 0xb8, 0x4e3: 0xb8, 0x4e4: 0xb8, 0x4e5: 0xb8, 0x4e6: 0xb8, 0x4e7: 0xb8,
- 0x4e8: 0xb8, 0x4e9: 0xb8, 0x4ea: 0xb8, 0x4eb: 0xb8, 0x4ec: 0xb8, 0x4ed: 0xb8, 0x4ee: 0xb8, 0x4ef: 0xb8,
- 0x4f0: 0xb8, 0x4f1: 0xb8, 0x4f2: 0xb8, 0x4f3: 0xb8, 0x4f4: 0xb8, 0x4f5: 0xb8, 0x4f6: 0xb8, 0x4f7: 0xb8,
- 0x4f8: 0xb8, 0x4f9: 0xb8, 0x4fa: 0xb8, 0x4fb: 0xb8, 0x4fc: 0xb8, 0x4fd: 0xb8, 0x4fe: 0xb8, 0x4ff: 0xb8,
+ 0x4c0: 0xba, 0x4c1: 0xba, 0x4c2: 0xba, 0x4c3: 0xba, 0x4c4: 0xba, 0x4c5: 0xba, 0x4c6: 0xba, 0x4c7: 0xba,
+ 0x4c8: 0xba, 0x4c9: 0xba, 0x4ca: 0xba, 0x4cb: 0xba, 0x4cc: 0xba, 0x4cd: 0xba, 0x4ce: 0xba, 0x4cf: 0xba,
+ 0x4d0: 0x9f, 0x4d1: 0x9f, 0x4d2: 0x9f, 0x4d3: 0x9f, 0x4d4: 0x9f, 0x4d5: 0x9f, 0x4d6: 0x9f, 0x4d7: 0x9f,
+ 0x4d8: 0x9f, 0x4d9: 0x14c, 0x4da: 0xba, 0x4db: 0xba, 0x4dc: 0xba, 0x4dd: 0xba, 0x4de: 0xba, 0x4df: 0xba,
+ 0x4e0: 0xba, 0x4e1: 0xba, 0x4e2: 0xba, 0x4e3: 0xba, 0x4e4: 0xba, 0x4e5: 0xba, 0x4e6: 0xba, 0x4e7: 0xba,
+ 0x4e8: 0xba, 0x4e9: 0xba, 0x4ea: 0xba, 0x4eb: 0xba, 0x4ec: 0xba, 0x4ed: 0xba, 0x4ee: 0xba, 0x4ef: 0xba,
+ 0x4f0: 0xba, 0x4f1: 0xba, 0x4f2: 0xba, 0x4f3: 0xba, 0x4f4: 0xba, 0x4f5: 0xba, 0x4f6: 0xba, 0x4f7: 0xba,
+ 0x4f8: 0xba, 0x4f9: 0xba, 0x4fa: 0xba, 0x4fb: 0xba, 0x4fc: 0xba, 0x4fd: 0xba, 0x4fe: 0xba, 0x4ff: 0xba,
// Block 0x14, offset 0x500
- 0x500: 0xb8, 0x501: 0xb8, 0x502: 0xb8, 0x503: 0xb8, 0x504: 0xb8, 0x505: 0xb8, 0x506: 0xb8, 0x507: 0xb8,
- 0x508: 0xb8, 0x509: 0xb8, 0x50a: 0xb8, 0x50b: 0xb8, 0x50c: 0xb8, 0x50d: 0xb8, 0x50e: 0xb8, 0x50f: 0xb8,
- 0x510: 0xb8, 0x511: 0xb8, 0x512: 0xb8, 0x513: 0xb8, 0x514: 0xb8, 0x515: 0xb8, 0x516: 0xb8, 0x517: 0xb8,
- 0x518: 0xb8, 0x519: 0xb8, 0x51a: 0xb8, 0x51b: 0xb8, 0x51c: 0xb8, 0x51d: 0xb8, 0x51e: 0xb8, 0x51f: 0xb8,
- 0x520: 0x9d, 0x521: 0x9d, 0x522: 0x9d, 0x523: 0x9d, 0x524: 0x9d, 0x525: 0x9d, 0x526: 0x9d, 0x527: 0x9d,
- 0x528: 0x13d, 0x529: 0x146, 0x52a: 0xb8, 0x52b: 0x147, 0x52c: 0x148, 0x52d: 0x149, 0x52e: 0x14a, 0x52f: 0xb8,
- 0x530: 0xb8, 0x531: 0xb8, 0x532: 0xb8, 0x533: 0xb8, 0x534: 0xb8, 0x535: 0xb8, 0x536: 0xb8, 0x537: 0xb8,
- 0x538: 0xb8, 0x539: 0xb8, 0x53a: 0xb8, 0x53b: 0xb8, 0x53c: 0x9d, 0x53d: 0x14b, 0x53e: 0x14c, 0x53f: 0x14d,
+ 0x500: 0xba, 0x501: 0xba, 0x502: 0xba, 0x503: 0xba, 0x504: 0xba, 0x505: 0xba, 0x506: 0xba, 0x507: 0xba,
+ 0x508: 0xba, 0x509: 0xba, 0x50a: 0xba, 0x50b: 0xba, 0x50c: 0xba, 0x50d: 0xba, 0x50e: 0xba, 0x50f: 0xba,
+ 0x510: 0xba, 0x511: 0xba, 0x512: 0xba, 0x513: 0xba, 0x514: 0xba, 0x515: 0xba, 0x516: 0xba, 0x517: 0xba,
+ 0x518: 0xba, 0x519: 0xba, 0x51a: 0xba, 0x51b: 0xba, 0x51c: 0xba, 0x51d: 0xba, 0x51e: 0xba, 0x51f: 0xba,
+ 0x520: 0x9f, 0x521: 0x9f, 0x522: 0x9f, 0x523: 0x9f, 0x524: 0x9f, 0x525: 0x9f, 0x526: 0x9f, 0x527: 0x9f,
+ 0x528: 0x142, 0x529: 0x14d, 0x52a: 0xba, 0x52b: 0x14e, 0x52c: 0x14f, 0x52d: 0x150, 0x52e: 0x151, 0x52f: 0xba,
+ 0x530: 0xba, 0x531: 0xba, 0x532: 0xba, 0x533: 0xba, 0x534: 0xba, 0x535: 0xba, 0x536: 0xba, 0x537: 0xba,
+ 0x538: 0xba, 0x539: 0xba, 0x53a: 0xba, 0x53b: 0xba, 0x53c: 0x9f, 0x53d: 0x152, 0x53e: 0x153, 0x53f: 0x154,
// Block 0x15, offset 0x540
- 0x540: 0x9d, 0x541: 0x9d, 0x542: 0x9d, 0x543: 0x9d, 0x544: 0x9d, 0x545: 0x9d, 0x546: 0x9d, 0x547: 0x9d,
- 0x548: 0x9d, 0x549: 0x9d, 0x54a: 0x9d, 0x54b: 0x9d, 0x54c: 0x9d, 0x54d: 0x9d, 0x54e: 0x9d, 0x54f: 0x9d,
- 0x550: 0x9d, 0x551: 0x9d, 0x552: 0x9d, 0x553: 0x9d, 0x554: 0x9d, 0x555: 0x9d, 0x556: 0x9d, 0x557: 0x9d,
- 0x558: 0x9d, 0x559: 0x9d, 0x55a: 0x9d, 0x55b: 0x9d, 0x55c: 0x9d, 0x55d: 0x9d, 0x55e: 0x9d, 0x55f: 0x14e,
- 0x560: 0x9d, 0x561: 0x9d, 0x562: 0x9d, 0x563: 0x9d, 0x564: 0x9d, 0x565: 0x9d, 0x566: 0x9d, 0x567: 0x9d,
- 0x568: 0x9d, 0x569: 0x9d, 0x56a: 0x9d, 0x56b: 0x14f, 0x56c: 0xb8, 0x56d: 0xb8, 0x56e: 0xb8, 0x56f: 0xb8,
- 0x570: 0xb8, 0x571: 0xb8, 0x572: 0xb8, 0x573: 0xb8, 0x574: 0xb8, 0x575: 0xb8, 0x576: 0xb8, 0x577: 0xb8,
- 0x578: 0xb8, 0x579: 0xb8, 0x57a: 0xb8, 0x57b: 0xb8, 0x57c: 0xb8, 0x57d: 0xb8, 0x57e: 0xb8, 0x57f: 0xb8,
+ 0x540: 0x9f, 0x541: 0x9f, 0x542: 0x9f, 0x543: 0x9f, 0x544: 0x9f, 0x545: 0x9f, 0x546: 0x9f, 0x547: 0x9f,
+ 0x548: 0x9f, 0x549: 0x9f, 0x54a: 0x9f, 0x54b: 0x9f, 0x54c: 0x9f, 0x54d: 0x9f, 0x54e: 0x9f, 0x54f: 0x9f,
+ 0x550: 0x9f, 0x551: 0x9f, 0x552: 0x9f, 0x553: 0x9f, 0x554: 0x9f, 0x555: 0x9f, 0x556: 0x9f, 0x557: 0x9f,
+ 0x558: 0x9f, 0x559: 0x9f, 0x55a: 0x9f, 0x55b: 0x9f, 0x55c: 0x9f, 0x55d: 0x9f, 0x55e: 0x9f, 0x55f: 0x155,
+ 0x560: 0x9f, 0x561: 0x9f, 0x562: 0x9f, 0x563: 0x9f, 0x564: 0x9f, 0x565: 0x9f, 0x566: 0x9f, 0x567: 0x9f,
+ 0x568: 0x9f, 0x569: 0x9f, 0x56a: 0x9f, 0x56b: 0x156, 0x56c: 0xba, 0x56d: 0xba, 0x56e: 0xba, 0x56f: 0xba,
+ 0x570: 0xba, 0x571: 0xba, 0x572: 0xba, 0x573: 0xba, 0x574: 0xba, 0x575: 0xba, 0x576: 0xba, 0x577: 0xba,
+ 0x578: 0xba, 0x579: 0xba, 0x57a: 0xba, 0x57b: 0xba, 0x57c: 0xba, 0x57d: 0xba, 0x57e: 0xba, 0x57f: 0xba,
// Block 0x16, offset 0x580
- 0x580: 0x150, 0x581: 0xb8, 0x582: 0xb8, 0x583: 0xb8, 0x584: 0xb8, 0x585: 0xb8, 0x586: 0xb8, 0x587: 0xb8,
- 0x588: 0xb8, 0x589: 0xb8, 0x58a: 0xb8, 0x58b: 0xb8, 0x58c: 0xb8, 0x58d: 0xb8, 0x58e: 0xb8, 0x58f: 0xb8,
- 0x590: 0xb8, 0x591: 0xb8, 0x592: 0xb8, 0x593: 0xb8, 0x594: 0xb8, 0x595: 0xb8, 0x596: 0xb8, 0x597: 0xb8,
- 0x598: 0xb8, 0x599: 0xb8, 0x59a: 0xb8, 0x59b: 0xb8, 0x59c: 0xb8, 0x59d: 0xb8, 0x59e: 0xb8, 0x59f: 0xb8,
- 0x5a0: 0xb8, 0x5a1: 0xb8, 0x5a2: 0xb8, 0x5a3: 0xb8, 0x5a4: 0xb8, 0x5a5: 0xb8, 0x5a6: 0xb8, 0x5a7: 0xb8,
- 0x5a8: 0xb8, 0x5a9: 0xb8, 0x5aa: 0xb8, 0x5ab: 0xb8, 0x5ac: 0xb8, 0x5ad: 0xb8, 0x5ae: 0xb8, 0x5af: 0xb8,
- 0x5b0: 0x9d, 0x5b1: 0x151, 0x5b2: 0x152, 0x5b3: 0xb8, 0x5b4: 0xb8, 0x5b5: 0xb8, 0x5b6: 0xb8, 0x5b7: 0xb8,
- 0x5b8: 0xb8, 0x5b9: 0xb8, 0x5ba: 0xb8, 0x5bb: 0xb8, 0x5bc: 0xb8, 0x5bd: 0xb8, 0x5be: 0xb8, 0x5bf: 0xb8,
+ 0x580: 0x9f, 0x581: 0x9f, 0x582: 0x9f, 0x583: 0x9f, 0x584: 0x157, 0x585: 0x158, 0x586: 0x9f, 0x587: 0x9f,
+ 0x588: 0x9f, 0x589: 0x9f, 0x58a: 0x9f, 0x58b: 0x159, 0x58c: 0xba, 0x58d: 0xba, 0x58e: 0xba, 0x58f: 0xba,
+ 0x590: 0xba, 0x591: 0xba, 0x592: 0xba, 0x593: 0xba, 0x594: 0xba, 0x595: 0xba, 0x596: 0xba, 0x597: 0xba,
+ 0x598: 0xba, 0x599: 0xba, 0x59a: 0xba, 0x59b: 0xba, 0x59c: 0xba, 0x59d: 0xba, 0x59e: 0xba, 0x59f: 0xba,
+ 0x5a0: 0xba, 0x5a1: 0xba, 0x5a2: 0xba, 0x5a3: 0xba, 0x5a4: 0xba, 0x5a5: 0xba, 0x5a6: 0xba, 0x5a7: 0xba,
+ 0x5a8: 0xba, 0x5a9: 0xba, 0x5aa: 0xba, 0x5ab: 0xba, 0x5ac: 0xba, 0x5ad: 0xba, 0x5ae: 0xba, 0x5af: 0xba,
+ 0x5b0: 0x9f, 0x5b1: 0x15a, 0x5b2: 0x15b, 0x5b3: 0xba, 0x5b4: 0xba, 0x5b5: 0xba, 0x5b6: 0xba, 0x5b7: 0xba,
+ 0x5b8: 0xba, 0x5b9: 0xba, 0x5ba: 0xba, 0x5bb: 0xba, 0x5bc: 0xba, 0x5bd: 0xba, 0x5be: 0xba, 0x5bf: 0xba,
// Block 0x17, offset 0x5c0
- 0x5c0: 0x9b, 0x5c1: 0x9b, 0x5c2: 0x9b, 0x5c3: 0x153, 0x5c4: 0x154, 0x5c5: 0x155, 0x5c6: 0x156, 0x5c7: 0x157,
- 0x5c8: 0x9b, 0x5c9: 0x158, 0x5ca: 0xb8, 0x5cb: 0xb8, 0x5cc: 0x9b, 0x5cd: 0x159, 0x5ce: 0xb8, 0x5cf: 0xb8,
- 0x5d0: 0x5d, 0x5d1: 0x5e, 0x5d2: 0x5f, 0x5d3: 0x60, 0x5d4: 0x61, 0x5d5: 0x62, 0x5d6: 0x63, 0x5d7: 0x64,
- 0x5d8: 0x65, 0x5d9: 0x66, 0x5da: 0x67, 0x5db: 0x68, 0x5dc: 0x69, 0x5dd: 0x6a, 0x5de: 0x6b, 0x5df: 0x6c,
+ 0x5c0: 0x9b, 0x5c1: 0x9b, 0x5c2: 0x9b, 0x5c3: 0x15c, 0x5c4: 0x15d, 0x5c5: 0x15e, 0x5c6: 0x15f, 0x5c7: 0x160,
+ 0x5c8: 0x9b, 0x5c9: 0x161, 0x5ca: 0xba, 0x5cb: 0xba, 0x5cc: 0x9b, 0x5cd: 0x162, 0x5ce: 0xba, 0x5cf: 0xba,
+ 0x5d0: 0x5f, 0x5d1: 0x60, 0x5d2: 0x61, 0x5d3: 0x62, 0x5d4: 0x63, 0x5d5: 0x64, 0x5d6: 0x65, 0x5d7: 0x66,
+ 0x5d8: 0x67, 0x5d9: 0x68, 0x5da: 0x69, 0x5db: 0x6a, 0x5dc: 0x6b, 0x5dd: 0x6c, 0x5de: 0x6d, 0x5df: 0x6e,
0x5e0: 0x9b, 0x5e1: 0x9b, 0x5e2: 0x9b, 0x5e3: 0x9b, 0x5e4: 0x9b, 0x5e5: 0x9b, 0x5e6: 0x9b, 0x5e7: 0x9b,
- 0x5e8: 0x15a, 0x5e9: 0x15b, 0x5ea: 0x15c, 0x5eb: 0xb8, 0x5ec: 0xb8, 0x5ed: 0xb8, 0x5ee: 0xb8, 0x5ef: 0xb8,
- 0x5f0: 0xb8, 0x5f1: 0xb8, 0x5f2: 0xb8, 0x5f3: 0xb8, 0x5f4: 0xb8, 0x5f5: 0xb8, 0x5f6: 0xb8, 0x5f7: 0xb8,
- 0x5f8: 0xb8, 0x5f9: 0xb8, 0x5fa: 0xb8, 0x5fb: 0xb8, 0x5fc: 0xb8, 0x5fd: 0xb8, 0x5fe: 0xb8, 0x5ff: 0xb8,
+ 0x5e8: 0x163, 0x5e9: 0x164, 0x5ea: 0x165, 0x5eb: 0xba, 0x5ec: 0xba, 0x5ed: 0xba, 0x5ee: 0xba, 0x5ef: 0xba,
+ 0x5f0: 0xba, 0x5f1: 0xba, 0x5f2: 0xba, 0x5f3: 0xba, 0x5f4: 0xba, 0x5f5: 0xba, 0x5f6: 0xba, 0x5f7: 0xba,
+ 0x5f8: 0xba, 0x5f9: 0xba, 0x5fa: 0xba, 0x5fb: 0xba, 0x5fc: 0xba, 0x5fd: 0xba, 0x5fe: 0xba, 0x5ff: 0xba,
// Block 0x18, offset 0x600
- 0x600: 0x15d, 0x601: 0xb8, 0x602: 0xb8, 0x603: 0xb8, 0x604: 0xb8, 0x605: 0xb8, 0x606: 0xb8, 0x607: 0xb8,
- 0x608: 0xb8, 0x609: 0xb8, 0x60a: 0xb8, 0x60b: 0xb8, 0x60c: 0xb8, 0x60d: 0xb8, 0x60e: 0xb8, 0x60f: 0xb8,
- 0x610: 0xb8, 0x611: 0xb8, 0x612: 0xb8, 0x613: 0xb8, 0x614: 0xb8, 0x615: 0xb8, 0x616: 0xb8, 0x617: 0xb8,
- 0x618: 0xb8, 0x619: 0xb8, 0x61a: 0xb8, 0x61b: 0xb8, 0x61c: 0xb8, 0x61d: 0xb8, 0x61e: 0xb8, 0x61f: 0xb8,
- 0x620: 0x9d, 0x621: 0x9d, 0x622: 0x9d, 0x623: 0x15e, 0x624: 0x6d, 0x625: 0x15f, 0x626: 0xb8, 0x627: 0xb8,
- 0x628: 0xb8, 0x629: 0xb8, 0x62a: 0xb8, 0x62b: 0xb8, 0x62c: 0xb8, 0x62d: 0xb8, 0x62e: 0xb8, 0x62f: 0xb8,
- 0x630: 0xb8, 0x631: 0xb8, 0x632: 0xb8, 0x633: 0xb8, 0x634: 0xb8, 0x635: 0xb8, 0x636: 0xb8, 0x637: 0xb8,
- 0x638: 0x6e, 0x639: 0x6f, 0x63a: 0x70, 0x63b: 0x160, 0x63c: 0xb8, 0x63d: 0xb8, 0x63e: 0xb8, 0x63f: 0xb8,
+ 0x600: 0x166, 0x601: 0xba, 0x602: 0xba, 0x603: 0xba, 0x604: 0xba, 0x605: 0xba, 0x606: 0xba, 0x607: 0xba,
+ 0x608: 0xba, 0x609: 0xba, 0x60a: 0xba, 0x60b: 0xba, 0x60c: 0xba, 0x60d: 0xba, 0x60e: 0xba, 0x60f: 0xba,
+ 0x610: 0xba, 0x611: 0xba, 0x612: 0xba, 0x613: 0xba, 0x614: 0xba, 0x615: 0xba, 0x616: 0xba, 0x617: 0xba,
+ 0x618: 0xba, 0x619: 0xba, 0x61a: 0xba, 0x61b: 0xba, 0x61c: 0xba, 0x61d: 0xba, 0x61e: 0xba, 0x61f: 0xba,
+ 0x620: 0x122, 0x621: 0x122, 0x622: 0x122, 0x623: 0x167, 0x624: 0x6f, 0x625: 0x168, 0x626: 0xba, 0x627: 0xba,
+ 0x628: 0xba, 0x629: 0xba, 0x62a: 0xba, 0x62b: 0xba, 0x62c: 0xba, 0x62d: 0xba, 0x62e: 0xba, 0x62f: 0xba,
+ 0x630: 0xba, 0x631: 0xba, 0x632: 0xba, 0x633: 0xba, 0x634: 0xba, 0x635: 0xba, 0x636: 0xba, 0x637: 0xba,
+ 0x638: 0x70, 0x639: 0x71, 0x63a: 0x72, 0x63b: 0x169, 0x63c: 0xba, 0x63d: 0xba, 0x63e: 0xba, 0x63f: 0xba,
// Block 0x19, offset 0x640
- 0x640: 0x161, 0x641: 0x9b, 0x642: 0x162, 0x643: 0x163, 0x644: 0x71, 0x645: 0x72, 0x646: 0x164, 0x647: 0x165,
- 0x648: 0x73, 0x649: 0x166, 0x64a: 0xb8, 0x64b: 0xb8, 0x64c: 0x9b, 0x64d: 0x9b, 0x64e: 0x9b, 0x64f: 0x9b,
+ 0x640: 0x16a, 0x641: 0x9b, 0x642: 0x16b, 0x643: 0x16c, 0x644: 0x73, 0x645: 0x74, 0x646: 0x16d, 0x647: 0x16e,
+ 0x648: 0x75, 0x649: 0x16f, 0x64a: 0xba, 0x64b: 0xba, 0x64c: 0x9b, 0x64d: 0x9b, 0x64e: 0x9b, 0x64f: 0x9b,
0x650: 0x9b, 0x651: 0x9b, 0x652: 0x9b, 0x653: 0x9b, 0x654: 0x9b, 0x655: 0x9b, 0x656: 0x9b, 0x657: 0x9b,
- 0x658: 0x9b, 0x659: 0x9b, 0x65a: 0x9b, 0x65b: 0x167, 0x65c: 0x9b, 0x65d: 0x168, 0x65e: 0x9b, 0x65f: 0x169,
- 0x660: 0x16a, 0x661: 0x16b, 0x662: 0x16c, 0x663: 0xb8, 0x664: 0x16d, 0x665: 0x16e, 0x666: 0x16f, 0x667: 0x170,
- 0x668: 0xb8, 0x669: 0xb8, 0x66a: 0xb8, 0x66b: 0xb8, 0x66c: 0xb8, 0x66d: 0xb8, 0x66e: 0xb8, 0x66f: 0xb8,
- 0x670: 0xb8, 0x671: 0xb8, 0x672: 0xb8, 0x673: 0xb8, 0x674: 0xb8, 0x675: 0xb8, 0x676: 0xb8, 0x677: 0xb8,
- 0x678: 0xb8, 0x679: 0xb8, 0x67a: 0xb8, 0x67b: 0xb8, 0x67c: 0xb8, 0x67d: 0xb8, 0x67e: 0xb8, 0x67f: 0xb8,
+ 0x658: 0x9b, 0x659: 0x9b, 0x65a: 0x9b, 0x65b: 0x170, 0x65c: 0x9b, 0x65d: 0x171, 0x65e: 0x9b, 0x65f: 0x172,
+ 0x660: 0x173, 0x661: 0x174, 0x662: 0x175, 0x663: 0xba, 0x664: 0x176, 0x665: 0x177, 0x666: 0x178, 0x667: 0x179,
+ 0x668: 0xba, 0x669: 0xba, 0x66a: 0xba, 0x66b: 0xba, 0x66c: 0xba, 0x66d: 0xba, 0x66e: 0xba, 0x66f: 0xba,
+ 0x670: 0xba, 0x671: 0xba, 0x672: 0xba, 0x673: 0xba, 0x674: 0xba, 0x675: 0xba, 0x676: 0xba, 0x677: 0xba,
+ 0x678: 0xba, 0x679: 0xba, 0x67a: 0xba, 0x67b: 0xba, 0x67c: 0xba, 0x67d: 0xba, 0x67e: 0xba, 0x67f: 0xba,
// Block 0x1a, offset 0x680
- 0x680: 0x9d, 0x681: 0x9d, 0x682: 0x9d, 0x683: 0x9d, 0x684: 0x9d, 0x685: 0x9d, 0x686: 0x9d, 0x687: 0x9d,
- 0x688: 0x9d, 0x689: 0x9d, 0x68a: 0x9d, 0x68b: 0x9d, 0x68c: 0x9d, 0x68d: 0x9d, 0x68e: 0x9d, 0x68f: 0x9d,
- 0x690: 0x9d, 0x691: 0x9d, 0x692: 0x9d, 0x693: 0x9d, 0x694: 0x9d, 0x695: 0x9d, 0x696: 0x9d, 0x697: 0x9d,
- 0x698: 0x9d, 0x699: 0x9d, 0x69a: 0x9d, 0x69b: 0x171, 0x69c: 0x9d, 0x69d: 0x9d, 0x69e: 0x9d, 0x69f: 0x9d,
- 0x6a0: 0x9d, 0x6a1: 0x9d, 0x6a2: 0x9d, 0x6a3: 0x9d, 0x6a4: 0x9d, 0x6a5: 0x9d, 0x6a6: 0x9d, 0x6a7: 0x9d,
- 0x6a8: 0x9d, 0x6a9: 0x9d, 0x6aa: 0x9d, 0x6ab: 0x9d, 0x6ac: 0x9d, 0x6ad: 0x9d, 0x6ae: 0x9d, 0x6af: 0x9d,
- 0x6b0: 0x9d, 0x6b1: 0x9d, 0x6b2: 0x9d, 0x6b3: 0x9d, 0x6b4: 0x9d, 0x6b5: 0x9d, 0x6b6: 0x9d, 0x6b7: 0x9d,
- 0x6b8: 0x9d, 0x6b9: 0x9d, 0x6ba: 0x9d, 0x6bb: 0x9d, 0x6bc: 0x9d, 0x6bd: 0x9d, 0x6be: 0x9d, 0x6bf: 0x9d,
+ 0x680: 0x9f, 0x681: 0x9f, 0x682: 0x9f, 0x683: 0x9f, 0x684: 0x9f, 0x685: 0x9f, 0x686: 0x9f, 0x687: 0x9f,
+ 0x688: 0x9f, 0x689: 0x9f, 0x68a: 0x9f, 0x68b: 0x9f, 0x68c: 0x9f, 0x68d: 0x9f, 0x68e: 0x9f, 0x68f: 0x9f,
+ 0x690: 0x9f, 0x691: 0x9f, 0x692: 0x9f, 0x693: 0x9f, 0x694: 0x9f, 0x695: 0x9f, 0x696: 0x9f, 0x697: 0x9f,
+ 0x698: 0x9f, 0x699: 0x9f, 0x69a: 0x9f, 0x69b: 0x17a, 0x69c: 0x9f, 0x69d: 0x9f, 0x69e: 0x9f, 0x69f: 0x9f,
+ 0x6a0: 0x9f, 0x6a1: 0x9f, 0x6a2: 0x9f, 0x6a3: 0x9f, 0x6a4: 0x9f, 0x6a5: 0x9f, 0x6a6: 0x9f, 0x6a7: 0x9f,
+ 0x6a8: 0x9f, 0x6a9: 0x9f, 0x6aa: 0x9f, 0x6ab: 0x9f, 0x6ac: 0x9f, 0x6ad: 0x9f, 0x6ae: 0x9f, 0x6af: 0x9f,
+ 0x6b0: 0x9f, 0x6b1: 0x9f, 0x6b2: 0x9f, 0x6b3: 0x9f, 0x6b4: 0x9f, 0x6b5: 0x9f, 0x6b6: 0x9f, 0x6b7: 0x9f,
+ 0x6b8: 0x9f, 0x6b9: 0x9f, 0x6ba: 0x9f, 0x6bb: 0x9f, 0x6bc: 0x9f, 0x6bd: 0x9f, 0x6be: 0x9f, 0x6bf: 0x9f,
// Block 0x1b, offset 0x6c0
- 0x6c0: 0x9d, 0x6c1: 0x9d, 0x6c2: 0x9d, 0x6c3: 0x9d, 0x6c4: 0x9d, 0x6c5: 0x9d, 0x6c6: 0x9d, 0x6c7: 0x9d,
- 0x6c8: 0x9d, 0x6c9: 0x9d, 0x6ca: 0x9d, 0x6cb: 0x9d, 0x6cc: 0x9d, 0x6cd: 0x9d, 0x6ce: 0x9d, 0x6cf: 0x9d,
- 0x6d0: 0x9d, 0x6d1: 0x9d, 0x6d2: 0x9d, 0x6d3: 0x9d, 0x6d4: 0x9d, 0x6d5: 0x9d, 0x6d6: 0x9d, 0x6d7: 0x9d,
- 0x6d8: 0x9d, 0x6d9: 0x9d, 0x6da: 0x9d, 0x6db: 0x9d, 0x6dc: 0x172, 0x6dd: 0x9d, 0x6de: 0x9d, 0x6df: 0x9d,
- 0x6e0: 0x173, 0x6e1: 0x9d, 0x6e2: 0x9d, 0x6e3: 0x9d, 0x6e4: 0x9d, 0x6e5: 0x9d, 0x6e6: 0x9d, 0x6e7: 0x9d,
- 0x6e8: 0x9d, 0x6e9: 0x9d, 0x6ea: 0x9d, 0x6eb: 0x9d, 0x6ec: 0x9d, 0x6ed: 0x9d, 0x6ee: 0x9d, 0x6ef: 0x9d,
- 0x6f0: 0x9d, 0x6f1: 0x9d, 0x6f2: 0x9d, 0x6f3: 0x9d, 0x6f4: 0x9d, 0x6f5: 0x9d, 0x6f6: 0x9d, 0x6f7: 0x9d,
- 0x6f8: 0x9d, 0x6f9: 0x9d, 0x6fa: 0x9d, 0x6fb: 0x9d, 0x6fc: 0x9d, 0x6fd: 0x9d, 0x6fe: 0x9d, 0x6ff: 0x9d,
+ 0x6c0: 0x9f, 0x6c1: 0x9f, 0x6c2: 0x9f, 0x6c3: 0x9f, 0x6c4: 0x9f, 0x6c5: 0x9f, 0x6c6: 0x9f, 0x6c7: 0x9f,
+ 0x6c8: 0x9f, 0x6c9: 0x9f, 0x6ca: 0x9f, 0x6cb: 0x9f, 0x6cc: 0x9f, 0x6cd: 0x9f, 0x6ce: 0x9f, 0x6cf: 0x9f,
+ 0x6d0: 0x9f, 0x6d1: 0x9f, 0x6d2: 0x9f, 0x6d3: 0x9f, 0x6d4: 0x9f, 0x6d5: 0x9f, 0x6d6: 0x9f, 0x6d7: 0x9f,
+ 0x6d8: 0x9f, 0x6d9: 0x9f, 0x6da: 0x9f, 0x6db: 0x9f, 0x6dc: 0x17b, 0x6dd: 0x9f, 0x6de: 0x9f, 0x6df: 0x9f,
+ 0x6e0: 0x17c, 0x6e1: 0x9f, 0x6e2: 0x9f, 0x6e3: 0x9f, 0x6e4: 0x9f, 0x6e5: 0x9f, 0x6e6: 0x9f, 0x6e7: 0x9f,
+ 0x6e8: 0x9f, 0x6e9: 0x9f, 0x6ea: 0x9f, 0x6eb: 0x9f, 0x6ec: 0x9f, 0x6ed: 0x9f, 0x6ee: 0x9f, 0x6ef: 0x9f,
+ 0x6f0: 0x9f, 0x6f1: 0x9f, 0x6f2: 0x9f, 0x6f3: 0x9f, 0x6f4: 0x9f, 0x6f5: 0x9f, 0x6f6: 0x9f, 0x6f7: 0x9f,
+ 0x6f8: 0x9f, 0x6f9: 0x9f, 0x6fa: 0x9f, 0x6fb: 0x9f, 0x6fc: 0x9f, 0x6fd: 0x9f, 0x6fe: 0x9f, 0x6ff: 0x9f,
// Block 0x1c, offset 0x700
- 0x700: 0x9d, 0x701: 0x9d, 0x702: 0x9d, 0x703: 0x9d, 0x704: 0x9d, 0x705: 0x9d, 0x706: 0x9d, 0x707: 0x9d,
- 0x708: 0x9d, 0x709: 0x9d, 0x70a: 0x9d, 0x70b: 0x9d, 0x70c: 0x9d, 0x70d: 0x9d, 0x70e: 0x9d, 0x70f: 0x9d,
- 0x710: 0x9d, 0x711: 0x9d, 0x712: 0x9d, 0x713: 0x9d, 0x714: 0x9d, 0x715: 0x9d, 0x716: 0x9d, 0x717: 0x9d,
- 0x718: 0x9d, 0x719: 0x9d, 0x71a: 0x9d, 0x71b: 0x9d, 0x71c: 0x9d, 0x71d: 0x9d, 0x71e: 0x9d, 0x71f: 0x9d,
- 0x720: 0x9d, 0x721: 0x9d, 0x722: 0x9d, 0x723: 0x9d, 0x724: 0x9d, 0x725: 0x9d, 0x726: 0x9d, 0x727: 0x9d,
- 0x728: 0x9d, 0x729: 0x9d, 0x72a: 0x9d, 0x72b: 0x9d, 0x72c: 0x9d, 0x72d: 0x9d, 0x72e: 0x9d, 0x72f: 0x9d,
- 0x730: 0x9d, 0x731: 0x9d, 0x732: 0x9d, 0x733: 0x9d, 0x734: 0x9d, 0x735: 0x9d, 0x736: 0x9d, 0x737: 0x9d,
- 0x738: 0x9d, 0x739: 0x9d, 0x73a: 0x174, 0x73b: 0xb8, 0x73c: 0xb8, 0x73d: 0xb8, 0x73e: 0xb8, 0x73f: 0xb8,
+ 0x700: 0x9f, 0x701: 0x9f, 0x702: 0x9f, 0x703: 0x9f, 0x704: 0x9f, 0x705: 0x9f, 0x706: 0x9f, 0x707: 0x9f,
+ 0x708: 0x9f, 0x709: 0x9f, 0x70a: 0x9f, 0x70b: 0x9f, 0x70c: 0x9f, 0x70d: 0x9f, 0x70e: 0x9f, 0x70f: 0x9f,
+ 0x710: 0x9f, 0x711: 0x9f, 0x712: 0x9f, 0x713: 0x9f, 0x714: 0x9f, 0x715: 0x9f, 0x716: 0x9f, 0x717: 0x9f,
+ 0x718: 0x9f, 0x719: 0x9f, 0x71a: 0x9f, 0x71b: 0x9f, 0x71c: 0x9f, 0x71d: 0x9f, 0x71e: 0x9f, 0x71f: 0x9f,
+ 0x720: 0x9f, 0x721: 0x9f, 0x722: 0x9f, 0x723: 0x9f, 0x724: 0x9f, 0x725: 0x9f, 0x726: 0x9f, 0x727: 0x9f,
+ 0x728: 0x9f, 0x729: 0x9f, 0x72a: 0x9f, 0x72b: 0x9f, 0x72c: 0x9f, 0x72d: 0x9f, 0x72e: 0x9f, 0x72f: 0x9f,
+ 0x730: 0x9f, 0x731: 0x9f, 0x732: 0x9f, 0x733: 0x9f, 0x734: 0x9f, 0x735: 0x9f, 0x736: 0x9f, 0x737: 0x9f,
+ 0x738: 0x9f, 0x739: 0x9f, 0x73a: 0x17d, 0x73b: 0x9f, 0x73c: 0x9f, 0x73d: 0x9f, 0x73e: 0x9f, 0x73f: 0x9f,
// Block 0x1d, offset 0x740
- 0x740: 0xb8, 0x741: 0xb8, 0x742: 0xb8, 0x743: 0xb8, 0x744: 0xb8, 0x745: 0xb8, 0x746: 0xb8, 0x747: 0xb8,
- 0x748: 0xb8, 0x749: 0xb8, 0x74a: 0xb8, 0x74b: 0xb8, 0x74c: 0xb8, 0x74d: 0xb8, 0x74e: 0xb8, 0x74f: 0xb8,
- 0x750: 0xb8, 0x751: 0xb8, 0x752: 0xb8, 0x753: 0xb8, 0x754: 0xb8, 0x755: 0xb8, 0x756: 0xb8, 0x757: 0xb8,
- 0x758: 0xb8, 0x759: 0xb8, 0x75a: 0xb8, 0x75b: 0xb8, 0x75c: 0xb8, 0x75d: 0xb8, 0x75e: 0xb8, 0x75f: 0xb8,
- 0x760: 0x74, 0x761: 0x75, 0x762: 0x76, 0x763: 0x175, 0x764: 0x77, 0x765: 0x78, 0x766: 0x176, 0x767: 0x79,
- 0x768: 0x7a, 0x769: 0xb8, 0x76a: 0xb8, 0x76b: 0xb8, 0x76c: 0xb8, 0x76d: 0xb8, 0x76e: 0xb8, 0x76f: 0xb8,
- 0x770: 0xb8, 0x771: 0xb8, 0x772: 0xb8, 0x773: 0xb8, 0x774: 0xb8, 0x775: 0xb8, 0x776: 0xb8, 0x777: 0xb8,
- 0x778: 0xb8, 0x779: 0xb8, 0x77a: 0xb8, 0x77b: 0xb8, 0x77c: 0xb8, 0x77d: 0xb8, 0x77e: 0xb8, 0x77f: 0xb8,
+ 0x740: 0x9f, 0x741: 0x9f, 0x742: 0x9f, 0x743: 0x9f, 0x744: 0x9f, 0x745: 0x9f, 0x746: 0x9f, 0x747: 0x9f,
+ 0x748: 0x9f, 0x749: 0x9f, 0x74a: 0x9f, 0x74b: 0x9f, 0x74c: 0x9f, 0x74d: 0x9f, 0x74e: 0x9f, 0x74f: 0x9f,
+ 0x750: 0x9f, 0x751: 0x9f, 0x752: 0x9f, 0x753: 0x9f, 0x754: 0x9f, 0x755: 0x9f, 0x756: 0x9f, 0x757: 0x9f,
+ 0x758: 0x9f, 0x759: 0x9f, 0x75a: 0x9f, 0x75b: 0x9f, 0x75c: 0x9f, 0x75d: 0x9f, 0x75e: 0x9f, 0x75f: 0x9f,
+ 0x760: 0x9f, 0x761: 0x9f, 0x762: 0x9f, 0x763: 0x9f, 0x764: 0x9f, 0x765: 0x9f, 0x766: 0x9f, 0x767: 0x9f,
+ 0x768: 0x9f, 0x769: 0x9f, 0x76a: 0x9f, 0x76b: 0x9f, 0x76c: 0x9f, 0x76d: 0x9f, 0x76e: 0x9f, 0x76f: 0x17e,
+ 0x770: 0xba, 0x771: 0xba, 0x772: 0xba, 0x773: 0xba, 0x774: 0xba, 0x775: 0xba, 0x776: 0xba, 0x777: 0xba,
+ 0x778: 0xba, 0x779: 0xba, 0x77a: 0xba, 0x77b: 0xba, 0x77c: 0xba, 0x77d: 0xba, 0x77e: 0xba, 0x77f: 0xba,
// Block 0x1e, offset 0x780
- 0x790: 0x0d, 0x791: 0x0e, 0x792: 0x0f, 0x793: 0x10, 0x794: 0x11, 0x795: 0x0b, 0x796: 0x12, 0x797: 0x07,
- 0x798: 0x13, 0x799: 0x0b, 0x79a: 0x0b, 0x79b: 0x14, 0x79c: 0x0b, 0x79d: 0x15, 0x79e: 0x16, 0x79f: 0x17,
- 0x7a0: 0x07, 0x7a1: 0x07, 0x7a2: 0x07, 0x7a3: 0x07, 0x7a4: 0x07, 0x7a5: 0x07, 0x7a6: 0x07, 0x7a7: 0x07,
- 0x7a8: 0x07, 0x7a9: 0x07, 0x7aa: 0x18, 0x7ab: 0x19, 0x7ac: 0x1a, 0x7ad: 0x0b, 0x7ae: 0x0b, 0x7af: 0x1b,
- 0x7b0: 0x0b, 0x7b1: 0x0b, 0x7b2: 0x0b, 0x7b3: 0x0b, 0x7b4: 0x0b, 0x7b5: 0x0b, 0x7b6: 0x0b, 0x7b7: 0x0b,
- 0x7b8: 0x0b, 0x7b9: 0x0b, 0x7ba: 0x0b, 0x7bb: 0x0b, 0x7bc: 0x0b, 0x7bd: 0x0b, 0x7be: 0x0b, 0x7bf: 0x0b,
+ 0x780: 0xba, 0x781: 0xba, 0x782: 0xba, 0x783: 0xba, 0x784: 0xba, 0x785: 0xba, 0x786: 0xba, 0x787: 0xba,
+ 0x788: 0xba, 0x789: 0xba, 0x78a: 0xba, 0x78b: 0xba, 0x78c: 0xba, 0x78d: 0xba, 0x78e: 0xba, 0x78f: 0xba,
+ 0x790: 0xba, 0x791: 0xba, 0x792: 0xba, 0x793: 0xba, 0x794: 0xba, 0x795: 0xba, 0x796: 0xba, 0x797: 0xba,
+ 0x798: 0xba, 0x799: 0xba, 0x79a: 0xba, 0x79b: 0xba, 0x79c: 0xba, 0x79d: 0xba, 0x79e: 0xba, 0x79f: 0xba,
+ 0x7a0: 0x76, 0x7a1: 0x77, 0x7a2: 0x78, 0x7a3: 0x17f, 0x7a4: 0x79, 0x7a5: 0x7a, 0x7a6: 0x180, 0x7a7: 0x7b,
+ 0x7a8: 0x7c, 0x7a9: 0xba, 0x7aa: 0xba, 0x7ab: 0xba, 0x7ac: 0xba, 0x7ad: 0xba, 0x7ae: 0xba, 0x7af: 0xba,
+ 0x7b0: 0xba, 0x7b1: 0xba, 0x7b2: 0xba, 0x7b3: 0xba, 0x7b4: 0xba, 0x7b5: 0xba, 0x7b6: 0xba, 0x7b7: 0xba,
+ 0x7b8: 0xba, 0x7b9: 0xba, 0x7ba: 0xba, 0x7bb: 0xba, 0x7bc: 0xba, 0x7bd: 0xba, 0x7be: 0xba, 0x7bf: 0xba,
// Block 0x1f, offset 0x7c0
- 0x7c0: 0x0b, 0x7c1: 0x0b, 0x7c2: 0x0b, 0x7c3: 0x0b, 0x7c4: 0x0b, 0x7c5: 0x0b, 0x7c6: 0x0b, 0x7c7: 0x0b,
- 0x7c8: 0x0b, 0x7c9: 0x0b, 0x7ca: 0x0b, 0x7cb: 0x0b, 0x7cc: 0x0b, 0x7cd: 0x0b, 0x7ce: 0x0b, 0x7cf: 0x0b,
- 0x7d0: 0x0b, 0x7d1: 0x0b, 0x7d2: 0x0b, 0x7d3: 0x0b, 0x7d4: 0x0b, 0x7d5: 0x0b, 0x7d6: 0x0b, 0x7d7: 0x0b,
- 0x7d8: 0x0b, 0x7d9: 0x0b, 0x7da: 0x0b, 0x7db: 0x0b, 0x7dc: 0x0b, 0x7dd: 0x0b, 0x7de: 0x0b, 0x7df: 0x0b,
- 0x7e0: 0x0b, 0x7e1: 0x0b, 0x7e2: 0x0b, 0x7e3: 0x0b, 0x7e4: 0x0b, 0x7e5: 0x0b, 0x7e6: 0x0b, 0x7e7: 0x0b,
- 0x7e8: 0x0b, 0x7e9: 0x0b, 0x7ea: 0x0b, 0x7eb: 0x0b, 0x7ec: 0x0b, 0x7ed: 0x0b, 0x7ee: 0x0b, 0x7ef: 0x0b,
+ 0x7d0: 0x0d, 0x7d1: 0x0e, 0x7d2: 0x0f, 0x7d3: 0x10, 0x7d4: 0x11, 0x7d5: 0x0b, 0x7d6: 0x12, 0x7d7: 0x07,
+ 0x7d8: 0x13, 0x7d9: 0x0b, 0x7da: 0x0b, 0x7db: 0x14, 0x7dc: 0x0b, 0x7dd: 0x15, 0x7de: 0x16, 0x7df: 0x17,
+ 0x7e0: 0x07, 0x7e1: 0x07, 0x7e2: 0x07, 0x7e3: 0x07, 0x7e4: 0x07, 0x7e5: 0x07, 0x7e6: 0x07, 0x7e7: 0x07,
+ 0x7e8: 0x07, 0x7e9: 0x07, 0x7ea: 0x18, 0x7eb: 0x19, 0x7ec: 0x1a, 0x7ed: 0x07, 0x7ee: 0x1b, 0x7ef: 0x1c,
0x7f0: 0x0b, 0x7f1: 0x0b, 0x7f2: 0x0b, 0x7f3: 0x0b, 0x7f4: 0x0b, 0x7f5: 0x0b, 0x7f6: 0x0b, 0x7f7: 0x0b,
0x7f8: 0x0b, 0x7f9: 0x0b, 0x7fa: 0x0b, 0x7fb: 0x0b, 0x7fc: 0x0b, 0x7fd: 0x0b, 0x7fe: 0x0b, 0x7ff: 0x0b,
// Block 0x20, offset 0x800
- 0x800: 0x177, 0x801: 0x178, 0x802: 0xb8, 0x803: 0xb8, 0x804: 0x179, 0x805: 0x179, 0x806: 0x179, 0x807: 0x17a,
- 0x808: 0xb8, 0x809: 0xb8, 0x80a: 0xb8, 0x80b: 0xb8, 0x80c: 0xb8, 0x80d: 0xb8, 0x80e: 0xb8, 0x80f: 0xb8,
- 0x810: 0xb8, 0x811: 0xb8, 0x812: 0xb8, 0x813: 0xb8, 0x814: 0xb8, 0x815: 0xb8, 0x816: 0xb8, 0x817: 0xb8,
- 0x818: 0xb8, 0x819: 0xb8, 0x81a: 0xb8, 0x81b: 0xb8, 0x81c: 0xb8, 0x81d: 0xb8, 0x81e: 0xb8, 0x81f: 0xb8,
- 0x820: 0xb8, 0x821: 0xb8, 0x822: 0xb8, 0x823: 0xb8, 0x824: 0xb8, 0x825: 0xb8, 0x826: 0xb8, 0x827: 0xb8,
- 0x828: 0xb8, 0x829: 0xb8, 0x82a: 0xb8, 0x82b: 0xb8, 0x82c: 0xb8, 0x82d: 0xb8, 0x82e: 0xb8, 0x82f: 0xb8,
- 0x830: 0xb8, 0x831: 0xb8, 0x832: 0xb8, 0x833: 0xb8, 0x834: 0xb8, 0x835: 0xb8, 0x836: 0xb8, 0x837: 0xb8,
- 0x838: 0xb8, 0x839: 0xb8, 0x83a: 0xb8, 0x83b: 0xb8, 0x83c: 0xb8, 0x83d: 0xb8, 0x83e: 0xb8, 0x83f: 0xb8,
+ 0x800: 0x0b, 0x801: 0x0b, 0x802: 0x0b, 0x803: 0x0b, 0x804: 0x0b, 0x805: 0x0b, 0x806: 0x0b, 0x807: 0x0b,
+ 0x808: 0x0b, 0x809: 0x0b, 0x80a: 0x0b, 0x80b: 0x0b, 0x80c: 0x0b, 0x80d: 0x0b, 0x80e: 0x0b, 0x80f: 0x0b,
+ 0x810: 0x0b, 0x811: 0x0b, 0x812: 0x0b, 0x813: 0x0b, 0x814: 0x0b, 0x815: 0x0b, 0x816: 0x0b, 0x817: 0x0b,
+ 0x818: 0x0b, 0x819: 0x0b, 0x81a: 0x0b, 0x81b: 0x0b, 0x81c: 0x0b, 0x81d: 0x0b, 0x81e: 0x0b, 0x81f: 0x0b,
+ 0x820: 0x0b, 0x821: 0x0b, 0x822: 0x0b, 0x823: 0x0b, 0x824: 0x0b, 0x825: 0x0b, 0x826: 0x0b, 0x827: 0x0b,
+ 0x828: 0x0b, 0x829: 0x0b, 0x82a: 0x0b, 0x82b: 0x0b, 0x82c: 0x0b, 0x82d: 0x0b, 0x82e: 0x0b, 0x82f: 0x0b,
+ 0x830: 0x0b, 0x831: 0x0b, 0x832: 0x0b, 0x833: 0x0b, 0x834: 0x0b, 0x835: 0x0b, 0x836: 0x0b, 0x837: 0x0b,
+ 0x838: 0x0b, 0x839: 0x0b, 0x83a: 0x0b, 0x83b: 0x0b, 0x83c: 0x0b, 0x83d: 0x0b, 0x83e: 0x0b, 0x83f: 0x0b,
// Block 0x21, offset 0x840
- 0x840: 0x0b, 0x841: 0x0b, 0x842: 0x0b, 0x843: 0x0b, 0x844: 0x0b, 0x845: 0x0b, 0x846: 0x0b, 0x847: 0x0b,
- 0x848: 0x0b, 0x849: 0x0b, 0x84a: 0x0b, 0x84b: 0x0b, 0x84c: 0x0b, 0x84d: 0x0b, 0x84e: 0x0b, 0x84f: 0x0b,
- 0x850: 0x0b, 0x851: 0x0b, 0x852: 0x0b, 0x853: 0x0b, 0x854: 0x0b, 0x855: 0x0b, 0x856: 0x0b, 0x857: 0x0b,
- 0x858: 0x0b, 0x859: 0x0b, 0x85a: 0x0b, 0x85b: 0x0b, 0x85c: 0x0b, 0x85d: 0x0b, 0x85e: 0x0b, 0x85f: 0x0b,
- 0x860: 0x1e, 0x861: 0x0b, 0x862: 0x0b, 0x863: 0x0b, 0x864: 0x0b, 0x865: 0x0b, 0x866: 0x0b, 0x867: 0x0b,
- 0x868: 0x0b, 0x869: 0x0b, 0x86a: 0x0b, 0x86b: 0x0b, 0x86c: 0x0b, 0x86d: 0x0b, 0x86e: 0x0b, 0x86f: 0x0b,
- 0x870: 0x0b, 0x871: 0x0b, 0x872: 0x0b, 0x873: 0x0b, 0x874: 0x0b, 0x875: 0x0b, 0x876: 0x0b, 0x877: 0x0b,
- 0x878: 0x0b, 0x879: 0x0b, 0x87a: 0x0b, 0x87b: 0x0b, 0x87c: 0x0b, 0x87d: 0x0b, 0x87e: 0x0b, 0x87f: 0x0b,
+ 0x840: 0x181, 0x841: 0x182, 0x842: 0xba, 0x843: 0xba, 0x844: 0x183, 0x845: 0x183, 0x846: 0x183, 0x847: 0x184,
+ 0x848: 0xba, 0x849: 0xba, 0x84a: 0xba, 0x84b: 0xba, 0x84c: 0xba, 0x84d: 0xba, 0x84e: 0xba, 0x84f: 0xba,
+ 0x850: 0xba, 0x851: 0xba, 0x852: 0xba, 0x853: 0xba, 0x854: 0xba, 0x855: 0xba, 0x856: 0xba, 0x857: 0xba,
+ 0x858: 0xba, 0x859: 0xba, 0x85a: 0xba, 0x85b: 0xba, 0x85c: 0xba, 0x85d: 0xba, 0x85e: 0xba, 0x85f: 0xba,
+ 0x860: 0xba, 0x861: 0xba, 0x862: 0xba, 0x863: 0xba, 0x864: 0xba, 0x865: 0xba, 0x866: 0xba, 0x867: 0xba,
+ 0x868: 0xba, 0x869: 0xba, 0x86a: 0xba, 0x86b: 0xba, 0x86c: 0xba, 0x86d: 0xba, 0x86e: 0xba, 0x86f: 0xba,
+ 0x870: 0xba, 0x871: 0xba, 0x872: 0xba, 0x873: 0xba, 0x874: 0xba, 0x875: 0xba, 0x876: 0xba, 0x877: 0xba,
+ 0x878: 0xba, 0x879: 0xba, 0x87a: 0xba, 0x87b: 0xba, 0x87c: 0xba, 0x87d: 0xba, 0x87e: 0xba, 0x87f: 0xba,
// Block 0x22, offset 0x880
0x880: 0x0b, 0x881: 0x0b, 0x882: 0x0b, 0x883: 0x0b, 0x884: 0x0b, 0x885: 0x0b, 0x886: 0x0b, 0x887: 0x0b,
0x888: 0x0b, 0x889: 0x0b, 0x88a: 0x0b, 0x88b: 0x0b, 0x88c: 0x0b, 0x88d: 0x0b, 0x88e: 0x0b, 0x88f: 0x0b,
+ 0x890: 0x0b, 0x891: 0x0b, 0x892: 0x0b, 0x893: 0x0b, 0x894: 0x0b, 0x895: 0x0b, 0x896: 0x0b, 0x897: 0x0b,
+ 0x898: 0x0b, 0x899: 0x0b, 0x89a: 0x0b, 0x89b: 0x0b, 0x89c: 0x0b, 0x89d: 0x0b, 0x89e: 0x0b, 0x89f: 0x0b,
+ 0x8a0: 0x1f, 0x8a1: 0x0b, 0x8a2: 0x0b, 0x8a3: 0x0b, 0x8a4: 0x0b, 0x8a5: 0x0b, 0x8a6: 0x0b, 0x8a7: 0x0b,
+ 0x8a8: 0x0b, 0x8a9: 0x0b, 0x8aa: 0x0b, 0x8ab: 0x0b, 0x8ac: 0x0b, 0x8ad: 0x0b, 0x8ae: 0x0b, 0x8af: 0x0b,
+ 0x8b0: 0x0b, 0x8b1: 0x0b, 0x8b2: 0x0b, 0x8b3: 0x0b, 0x8b4: 0x0b, 0x8b5: 0x0b, 0x8b6: 0x0b, 0x8b7: 0x0b,
+ 0x8b8: 0x0b, 0x8b9: 0x0b, 0x8ba: 0x0b, 0x8bb: 0x0b, 0x8bc: 0x0b, 0x8bd: 0x0b, 0x8be: 0x0b, 0x8bf: 0x0b,
+ // Block 0x23, offset 0x8c0
+ 0x8c0: 0x0b, 0x8c1: 0x0b, 0x8c2: 0x0b, 0x8c3: 0x0b, 0x8c4: 0x0b, 0x8c5: 0x0b, 0x8c6: 0x0b, 0x8c7: 0x0b,
+ 0x8c8: 0x0b, 0x8c9: 0x0b, 0x8ca: 0x0b, 0x8cb: 0x0b, 0x8cc: 0x0b, 0x8cd: 0x0b, 0x8ce: 0x0b, 0x8cf: 0x0b,
}
-// idnaSparseOffset: 256 entries, 512 bytes
-var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x34, 0x3f, 0x4b, 0x5c, 0x60, 0x6f, 0x74, 0x7b, 0x87, 0x95, 0xa3, 0xa8, 0xb1, 0xc1, 0xcf, 0xdc, 0xe8, 0xf9, 0x103, 0x10a, 0x117, 0x128, 0x12f, 0x13a, 0x149, 0x157, 0x161, 0x163, 0x167, 0x169, 0x175, 0x180, 0x188, 0x18e, 0x194, 0x199, 0x19e, 0x1a1, 0x1a5, 0x1ab, 0x1b0, 0x1bc, 0x1c6, 0x1cc, 0x1dd, 0x1e7, 0x1ea, 0x1f2, 0x1f5, 0x202, 0x20a, 0x20e, 0x215, 0x21d, 0x22d, 0x239, 0x23b, 0x245, 0x251, 0x25d, 0x269, 0x271, 0x276, 0x280, 0x291, 0x295, 0x2a0, 0x2a4, 0x2ad, 0x2b5, 0x2bb, 0x2c0, 0x2c3, 0x2c6, 0x2ca, 0x2d0, 0x2d4, 0x2d8, 0x2de, 0x2e5, 0x2eb, 0x2f3, 0x2fa, 0x305, 0x30f, 0x313, 0x316, 0x31c, 0x320, 0x322, 0x325, 0x327, 0x32a, 0x334, 0x337, 0x346, 0x34a, 0x34f, 0x352, 0x356, 0x35b, 0x360, 0x366, 0x36c, 0x37b, 0x381, 0x385, 0x394, 0x399, 0x3a1, 0x3ab, 0x3b6, 0x3be, 0x3cf, 0x3d8, 0x3e8, 0x3f5, 0x3ff, 0x404, 0x411, 0x415, 0x41a, 0x41c, 0x420, 0x422, 0x426, 0x42f, 0x435, 0x439, 0x449, 0x453, 0x458, 0x45b, 0x461, 0x468, 0x46d, 0x471, 0x477, 0x47c, 0x485, 0x48a, 0x490, 0x497, 0x49e, 0x4a5, 0x4a9, 0x4ae, 0x4b1, 0x4b6, 0x4c2, 0x4c8, 0x4cd, 0x4d4, 0x4dc, 0x4e1, 0x4e5, 0x4f5, 0x4fc, 0x500, 0x504, 0x50b, 0x50e, 0x511, 0x515, 0x519, 0x51f, 0x528, 0x534, 0x53b, 0x544, 0x54c, 0x553, 0x561, 0x56e, 0x57b, 0x584, 0x588, 0x596, 0x59e, 0x5a9, 0x5b2, 0x5b8, 0x5c0, 0x5c9, 0x5d3, 0x5d6, 0x5e2, 0x5e5, 0x5ea, 0x5ed, 0x5f7, 0x600, 0x60c, 0x60f, 0x614, 0x617, 0x61a, 0x61d, 0x624, 0x62b, 0x62f, 0x63a, 0x63d, 0x643, 0x648, 0x64c, 0x64f, 0x652, 0x655, 0x65a, 0x664, 0x667, 0x66b, 0x67a, 0x686, 0x68a, 0x68f, 0x694, 0x698, 0x69d, 0x6a6, 0x6b1, 0x6b7, 0x6bf, 0x6c3, 0x6c7, 0x6cd, 0x6d3, 0x6d8, 0x6db, 0x6e9, 0x6f0, 0x6f3, 0x6f6, 0x6fa, 0x700, 0x705, 0x70f, 0x714, 0x717, 0x71a, 0x71d, 0x720, 0x724, 0x727, 0x737, 0x748, 0x74d, 0x74f, 0x751}
+// idnaSparseOffset: 264 entries, 528 bytes
+var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x34, 0x3f, 0x4b, 0x4f, 0x5e, 0x63, 0x6b, 0x77, 0x85, 0x8a, 0x93, 0xa3, 0xb1, 0xbd, 0xc9, 0xda, 0xe4, 0xeb, 0xf8, 0x109, 0x110, 0x11b, 0x12a, 0x138, 0x142, 0x144, 0x149, 0x14c, 0x14f, 0x151, 0x15d, 0x168, 0x170, 0x176, 0x17c, 0x181, 0x186, 0x189, 0x18d, 0x193, 0x198, 0x1a4, 0x1ae, 0x1b4, 0x1c5, 0x1cf, 0x1d2, 0x1da, 0x1dd, 0x1ea, 0x1f2, 0x1f6, 0x1fd, 0x205, 0x215, 0x221, 0x223, 0x22d, 0x239, 0x245, 0x251, 0x259, 0x25e, 0x268, 0x279, 0x27d, 0x288, 0x28c, 0x295, 0x29d, 0x2a3, 0x2a8, 0x2ab, 0x2af, 0x2b5, 0x2b9, 0x2bd, 0x2c3, 0x2ca, 0x2d0, 0x2d8, 0x2df, 0x2ea, 0x2f4, 0x2f8, 0x2fb, 0x301, 0x305, 0x307, 0x30a, 0x30c, 0x30f, 0x319, 0x31c, 0x32b, 0x32f, 0x334, 0x337, 0x33b, 0x340, 0x345, 0x34b, 0x351, 0x360, 0x366, 0x36a, 0x379, 0x37e, 0x386, 0x390, 0x39b, 0x3a3, 0x3b4, 0x3bd, 0x3cd, 0x3da, 0x3e4, 0x3e9, 0x3f6, 0x3fa, 0x3ff, 0x401, 0x405, 0x407, 0x40b, 0x414, 0x41a, 0x41e, 0x42e, 0x438, 0x43d, 0x440, 0x446, 0x44d, 0x452, 0x456, 0x45c, 0x461, 0x46a, 0x46f, 0x475, 0x47c, 0x483, 0x48a, 0x48e, 0x493, 0x496, 0x49b, 0x4a7, 0x4ad, 0x4b2, 0x4b9, 0x4c1, 0x4c6, 0x4ca, 0x4da, 0x4e1, 0x4e5, 0x4e9, 0x4f0, 0x4f2, 0x4f5, 0x4f8, 0x4fc, 0x500, 0x506, 0x50f, 0x51b, 0x522, 0x52b, 0x533, 0x53a, 0x548, 0x555, 0x562, 0x56b, 0x56f, 0x57d, 0x585, 0x590, 0x599, 0x59f, 0x5a7, 0x5b0, 0x5ba, 0x5bd, 0x5c9, 0x5cc, 0x5d1, 0x5de, 0x5e7, 0x5f3, 0x5f6, 0x600, 0x609, 0x615, 0x622, 0x62a, 0x62d, 0x632, 0x635, 0x638, 0x63b, 0x642, 0x649, 0x64d, 0x658, 0x65b, 0x661, 0x666, 0x66a, 0x66d, 0x670, 0x673, 0x676, 0x679, 0x67e, 0x688, 0x68b, 0x68f, 0x69e, 0x6aa, 0x6ae, 0x6b3, 0x6b8, 0x6bc, 0x6c1, 0x6ca, 0x6d5, 0x6db, 0x6e3, 0x6e7, 0x6eb, 0x6f1, 0x6f7, 0x6fc, 0x6ff, 0x70f, 0x716, 0x719, 0x71c, 0x720, 0x726, 0x72b, 0x730, 0x735, 0x738, 0x73d, 0x740, 0x743, 0x747, 0x74b, 0x74e, 0x75e, 0x76f, 0x774, 0x776, 0x778}
-// idnaSparseValues: 1876 entries, 7504 bytes
-var idnaSparseValues = [1876]valueRange{
+// idnaSparseValues: 1915 entries, 7660 bytes
+var idnaSparseValues = [1915]valueRange{
// Block 0x0, offset 0x0
{value: 0x0000, lo: 0x07},
{value: 0xe105, lo: 0x80, hi: 0x96},
@@ -2382,7 +2415,7 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0008, lo: 0xb9, hi: 0xbf},
// Block 0x3, offset 0x25
{value: 0x0000, lo: 0x01},
- {value: 0x1308, lo: 0x80, hi: 0xbf},
+ {value: 0x3308, lo: 0x80, hi: 0xbf},
// Block 0x4, offset 0x27
{value: 0x0000, lo: 0x04},
{value: 0x03f5, lo: 0x80, hi: 0x8f},
@@ -2407,155 +2440,123 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0040, lo: 0x8b, hi: 0x8c},
{value: 0x0018, lo: 0x8d, hi: 0x8f},
{value: 0x0040, lo: 0x90, hi: 0x90},
- {value: 0x1308, lo: 0x91, hi: 0xbd},
- {value: 0x0018, lo: 0xbe, hi: 0xbe},
- {value: 0x1308, lo: 0xbf, hi: 0xbf},
+ {value: 0x3308, lo: 0x91, hi: 0xbd},
+ {value: 0x0818, lo: 0xbe, hi: 0xbe},
+ {value: 0x3308, lo: 0xbf, hi: 0xbf},
// Block 0x7, offset 0x3f
{value: 0x0000, lo: 0x0b},
- {value: 0x0018, lo: 0x80, hi: 0x80},
- {value: 0x1308, lo: 0x81, hi: 0x82},
- {value: 0x0018, lo: 0x83, hi: 0x83},
- {value: 0x1308, lo: 0x84, hi: 0x85},
- {value: 0x0018, lo: 0x86, hi: 0x86},
- {value: 0x1308, lo: 0x87, hi: 0x87},
+ {value: 0x0818, lo: 0x80, hi: 0x80},
+ {value: 0x3308, lo: 0x81, hi: 0x82},
+ {value: 0x0818, lo: 0x83, hi: 0x83},
+ {value: 0x3308, lo: 0x84, hi: 0x85},
+ {value: 0x0818, lo: 0x86, hi: 0x86},
+ {value: 0x3308, lo: 0x87, hi: 0x87},
{value: 0x0040, lo: 0x88, hi: 0x8f},
- {value: 0x0008, lo: 0x90, hi: 0xaa},
+ {value: 0x0808, lo: 0x90, hi: 0xaa},
{value: 0x0040, lo: 0xab, hi: 0xaf},
- {value: 0x0008, lo: 0xb0, hi: 0xb4},
+ {value: 0x0808, lo: 0xb0, hi: 0xb4},
{value: 0x0040, lo: 0xb5, hi: 0xbf},
// Block 0x8, offset 0x4b
- {value: 0x0000, lo: 0x10},
- {value: 0x0018, lo: 0x80, hi: 0x80},
- {value: 0x0208, lo: 0x81, hi: 0x87},
- {value: 0x0408, lo: 0x88, hi: 0x88},
- {value: 0x0208, lo: 0x89, hi: 0x8a},
- {value: 0x1308, lo: 0x8b, hi: 0x9f},
- {value: 0x0008, lo: 0xa0, hi: 0xa9},
- {value: 0x0018, lo: 0xaa, hi: 0xad},
- {value: 0x0208, lo: 0xae, hi: 0xaf},
- {value: 0x1308, lo: 0xb0, hi: 0xb0},
- {value: 0x0408, lo: 0xb1, hi: 0xb3},
- {value: 0x0008, lo: 0xb4, hi: 0xb4},
- {value: 0x0429, lo: 0xb5, hi: 0xb5},
- {value: 0x0451, lo: 0xb6, hi: 0xb6},
- {value: 0x0479, lo: 0xb7, hi: 0xb7},
- {value: 0x04a1, lo: 0xb8, hi: 0xb8},
- {value: 0x0208, lo: 0xb9, hi: 0xbf},
- // Block 0x9, offset 0x5c
{value: 0x0000, lo: 0x03},
- {value: 0x0208, lo: 0x80, hi: 0x87},
- {value: 0x0408, lo: 0x88, hi: 0x99},
- {value: 0x0208, lo: 0x9a, hi: 0xbf},
- // Block 0xa, offset 0x60
+ {value: 0x0a08, lo: 0x80, hi: 0x87},
+ {value: 0x0c08, lo: 0x88, hi: 0x99},
+ {value: 0x0a08, lo: 0x9a, hi: 0xbf},
+ // Block 0x9, offset 0x4f
{value: 0x0000, lo: 0x0e},
- {value: 0x1308, lo: 0x80, hi: 0x8a},
+ {value: 0x3308, lo: 0x80, hi: 0x8a},
{value: 0x0040, lo: 0x8b, hi: 0x8c},
- {value: 0x0408, lo: 0x8d, hi: 0x8d},
- {value: 0x0208, lo: 0x8e, hi: 0x98},
- {value: 0x0408, lo: 0x99, hi: 0x9b},
- {value: 0x0208, lo: 0x9c, hi: 0xaa},
- {value: 0x0408, lo: 0xab, hi: 0xac},
- {value: 0x0208, lo: 0xad, hi: 0xb0},
- {value: 0x0408, lo: 0xb1, hi: 0xb1},
- {value: 0x0208, lo: 0xb2, hi: 0xb2},
- {value: 0x0408, lo: 0xb3, hi: 0xb4},
- {value: 0x0208, lo: 0xb5, hi: 0xb7},
- {value: 0x0408, lo: 0xb8, hi: 0xb9},
- {value: 0x0208, lo: 0xba, hi: 0xbf},
- // Block 0xb, offset 0x6f
+ {value: 0x0c08, lo: 0x8d, hi: 0x8d},
+ {value: 0x0a08, lo: 0x8e, hi: 0x98},
+ {value: 0x0c08, lo: 0x99, hi: 0x9b},
+ {value: 0x0a08, lo: 0x9c, hi: 0xaa},
+ {value: 0x0c08, lo: 0xab, hi: 0xac},
+ {value: 0x0a08, lo: 0xad, hi: 0xb0},
+ {value: 0x0c08, lo: 0xb1, hi: 0xb1},
+ {value: 0x0a08, lo: 0xb2, hi: 0xb2},
+ {value: 0x0c08, lo: 0xb3, hi: 0xb4},
+ {value: 0x0a08, lo: 0xb5, hi: 0xb7},
+ {value: 0x0c08, lo: 0xb8, hi: 0xb9},
+ {value: 0x0a08, lo: 0xba, hi: 0xbf},
+ // Block 0xa, offset 0x5e
{value: 0x0000, lo: 0x04},
- {value: 0x0008, lo: 0x80, hi: 0xa5},
- {value: 0x1308, lo: 0xa6, hi: 0xb0},
- {value: 0x0008, lo: 0xb1, hi: 0xb1},
+ {value: 0x0808, lo: 0x80, hi: 0xa5},
+ {value: 0x3308, lo: 0xa6, hi: 0xb0},
+ {value: 0x0808, lo: 0xb1, hi: 0xb1},
{value: 0x0040, lo: 0xb2, hi: 0xbf},
- // Block 0xc, offset 0x74
- {value: 0x0000, lo: 0x06},
- {value: 0x0008, lo: 0x80, hi: 0x89},
- {value: 0x0208, lo: 0x8a, hi: 0xaa},
- {value: 0x1308, lo: 0xab, hi: 0xb3},
- {value: 0x0008, lo: 0xb4, hi: 0xb5},
- {value: 0x0018, lo: 0xb6, hi: 0xba},
+ // Block 0xb, offset 0x63
+ {value: 0x0000, lo: 0x07},
+ {value: 0x0808, lo: 0x80, hi: 0x89},
+ {value: 0x0a08, lo: 0x8a, hi: 0xaa},
+ {value: 0x3308, lo: 0xab, hi: 0xb3},
+ {value: 0x0808, lo: 0xb4, hi: 0xb5},
+ {value: 0x0018, lo: 0xb6, hi: 0xb9},
+ {value: 0x0818, lo: 0xba, hi: 0xba},
{value: 0x0040, lo: 0xbb, hi: 0xbf},
- // Block 0xd, offset 0x7b
+ // Block 0xc, offset 0x6b
{value: 0x0000, lo: 0x0b},
- {value: 0x0008, lo: 0x80, hi: 0x95},
- {value: 0x1308, lo: 0x96, hi: 0x99},
- {value: 0x0008, lo: 0x9a, hi: 0x9a},
- {value: 0x1308, lo: 0x9b, hi: 0xa3},
- {value: 0x0008, lo: 0xa4, hi: 0xa4},
- {value: 0x1308, lo: 0xa5, hi: 0xa7},
- {value: 0x0008, lo: 0xa8, hi: 0xa8},
- {value: 0x1308, lo: 0xa9, hi: 0xad},
+ {value: 0x0808, lo: 0x80, hi: 0x95},
+ {value: 0x3308, lo: 0x96, hi: 0x99},
+ {value: 0x0808, lo: 0x9a, hi: 0x9a},
+ {value: 0x3308, lo: 0x9b, hi: 0xa3},
+ {value: 0x0808, lo: 0xa4, hi: 0xa4},
+ {value: 0x3308, lo: 0xa5, hi: 0xa7},
+ {value: 0x0808, lo: 0xa8, hi: 0xa8},
+ {value: 0x3308, lo: 0xa9, hi: 0xad},
{value: 0x0040, lo: 0xae, hi: 0xaf},
- {value: 0x0018, lo: 0xb0, hi: 0xbe},
+ {value: 0x0818, lo: 0xb0, hi: 0xbe},
{value: 0x0040, lo: 0xbf, hi: 0xbf},
- // Block 0xe, offset 0x87
- {value: 0x0000, lo: 0x0d},
- {value: 0x0408, lo: 0x80, hi: 0x80},
- {value: 0x0208, lo: 0x81, hi: 0x85},
- {value: 0x0408, lo: 0x86, hi: 0x87},
- {value: 0x0208, lo: 0x88, hi: 0x88},
- {value: 0x0408, lo: 0x89, hi: 0x89},
- {value: 0x0208, lo: 0x8a, hi: 0x93},
- {value: 0x0408, lo: 0x94, hi: 0x94},
- {value: 0x0208, lo: 0x95, hi: 0x95},
- {value: 0x0008, lo: 0x96, hi: 0x98},
- {value: 0x1308, lo: 0x99, hi: 0x9b},
- {value: 0x0040, lo: 0x9c, hi: 0x9d},
- {value: 0x0018, lo: 0x9e, hi: 0x9e},
- {value: 0x0040, lo: 0x9f, hi: 0xbf},
- // Block 0xf, offset 0x95
+ // Block 0xd, offset 0x77
{value: 0x0000, lo: 0x0d},
{value: 0x0040, lo: 0x80, hi: 0x9f},
- {value: 0x0208, lo: 0xa0, hi: 0xa9},
- {value: 0x0408, lo: 0xaa, hi: 0xac},
- {value: 0x0008, lo: 0xad, hi: 0xad},
- {value: 0x0408, lo: 0xae, hi: 0xae},
- {value: 0x0208, lo: 0xaf, hi: 0xb0},
- {value: 0x0408, lo: 0xb1, hi: 0xb2},
- {value: 0x0208, lo: 0xb3, hi: 0xb4},
+ {value: 0x0a08, lo: 0xa0, hi: 0xa9},
+ {value: 0x0c08, lo: 0xaa, hi: 0xac},
+ {value: 0x0808, lo: 0xad, hi: 0xad},
+ {value: 0x0c08, lo: 0xae, hi: 0xae},
+ {value: 0x0a08, lo: 0xaf, hi: 0xb0},
+ {value: 0x0c08, lo: 0xb1, hi: 0xb2},
+ {value: 0x0a08, lo: 0xb3, hi: 0xb4},
{value: 0x0040, lo: 0xb5, hi: 0xb5},
- {value: 0x0208, lo: 0xb6, hi: 0xb8},
- {value: 0x0408, lo: 0xb9, hi: 0xb9},
- {value: 0x0208, lo: 0xba, hi: 0xbd},
+ {value: 0x0a08, lo: 0xb6, hi: 0xb8},
+ {value: 0x0c08, lo: 0xb9, hi: 0xb9},
+ {value: 0x0a08, lo: 0xba, hi: 0xbd},
{value: 0x0040, lo: 0xbe, hi: 0xbf},
- // Block 0x10, offset 0xa3
+ // Block 0xe, offset 0x85
{value: 0x0000, lo: 0x04},
{value: 0x0040, lo: 0x80, hi: 0x93},
- {value: 0x1308, lo: 0x94, hi: 0xa1},
- {value: 0x0040, lo: 0xa2, hi: 0xa2},
- {value: 0x1308, lo: 0xa3, hi: 0xbf},
- // Block 0x11, offset 0xa8
+ {value: 0x3308, lo: 0x94, hi: 0xa1},
+ {value: 0x0840, lo: 0xa2, hi: 0xa2},
+ {value: 0x3308, lo: 0xa3, hi: 0xbf},
+ // Block 0xf, offset 0x8a
{value: 0x0000, lo: 0x08},
- {value: 0x1308, lo: 0x80, hi: 0x82},
- {value: 0x1008, lo: 0x83, hi: 0x83},
+ {value: 0x3308, lo: 0x80, hi: 0x82},
+ {value: 0x3008, lo: 0x83, hi: 0x83},
{value: 0x0008, lo: 0x84, hi: 0xb9},
- {value: 0x1308, lo: 0xba, hi: 0xba},
- {value: 0x1008, lo: 0xbb, hi: 0xbb},
- {value: 0x1308, lo: 0xbc, hi: 0xbc},
+ {value: 0x3308, lo: 0xba, hi: 0xba},
+ {value: 0x3008, lo: 0xbb, hi: 0xbb},
+ {value: 0x3308, lo: 0xbc, hi: 0xbc},
{value: 0x0008, lo: 0xbd, hi: 0xbd},
- {value: 0x1008, lo: 0xbe, hi: 0xbf},
- // Block 0x12, offset 0xb1
+ {value: 0x3008, lo: 0xbe, hi: 0xbf},
+ // Block 0x10, offset 0x93
{value: 0x0000, lo: 0x0f},
- {value: 0x1308, lo: 0x80, hi: 0x80},
- {value: 0x1008, lo: 0x81, hi: 0x82},
+ {value: 0x3308, lo: 0x80, hi: 0x80},
+ {value: 0x3008, lo: 0x81, hi: 0x82},
{value: 0x0040, lo: 0x83, hi: 0x85},
- {value: 0x1008, lo: 0x86, hi: 0x88},
+ {value: 0x3008, lo: 0x86, hi: 0x88},
{value: 0x0040, lo: 0x89, hi: 0x89},
- {value: 0x1008, lo: 0x8a, hi: 0x8c},
- {value: 0x1b08, lo: 0x8d, hi: 0x8d},
+ {value: 0x3008, lo: 0x8a, hi: 0x8c},
+ {value: 0x3b08, lo: 0x8d, hi: 0x8d},
{value: 0x0040, lo: 0x8e, hi: 0x8f},
{value: 0x0008, lo: 0x90, hi: 0x90},
{value: 0x0040, lo: 0x91, hi: 0x96},
- {value: 0x1008, lo: 0x97, hi: 0x97},
+ {value: 0x3008, lo: 0x97, hi: 0x97},
{value: 0x0040, lo: 0x98, hi: 0xa5},
{value: 0x0008, lo: 0xa6, hi: 0xaf},
{value: 0x0018, lo: 0xb0, hi: 0xba},
{value: 0x0040, lo: 0xbb, hi: 0xbf},
- // Block 0x13, offset 0xc1
+ // Block 0x11, offset 0xa3
{value: 0x0000, lo: 0x0d},
- {value: 0x1308, lo: 0x80, hi: 0x80},
- {value: 0x1008, lo: 0x81, hi: 0x83},
+ {value: 0x3308, lo: 0x80, hi: 0x80},
+ {value: 0x3008, lo: 0x81, hi: 0x83},
{value: 0x0040, lo: 0x84, hi: 0x84},
{value: 0x0008, lo: 0x85, hi: 0x8c},
{value: 0x0040, lo: 0x8d, hi: 0x8d},
@@ -2566,25 +2567,24 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0008, lo: 0xaa, hi: 0xb9},
{value: 0x0040, lo: 0xba, hi: 0xbc},
{value: 0x0008, lo: 0xbd, hi: 0xbd},
- {value: 0x1308, lo: 0xbe, hi: 0xbf},
- // Block 0x14, offset 0xcf
- {value: 0x0000, lo: 0x0c},
- {value: 0x0040, lo: 0x80, hi: 0x80},
- {value: 0x1308, lo: 0x81, hi: 0x81},
- {value: 0x1008, lo: 0x82, hi: 0x83},
+ {value: 0x3308, lo: 0xbe, hi: 0xbf},
+ // Block 0x12, offset 0xb1
+ {value: 0x0000, lo: 0x0b},
+ {value: 0x3308, lo: 0x80, hi: 0x81},
+ {value: 0x3008, lo: 0x82, hi: 0x83},
{value: 0x0040, lo: 0x84, hi: 0x84},
{value: 0x0008, lo: 0x85, hi: 0x8c},
{value: 0x0040, lo: 0x8d, hi: 0x8d},
{value: 0x0008, lo: 0x8e, hi: 0x90},
{value: 0x0040, lo: 0x91, hi: 0x91},
{value: 0x0008, lo: 0x92, hi: 0xba},
- {value: 0x0040, lo: 0xbb, hi: 0xbc},
+ {value: 0x3b08, lo: 0xbb, hi: 0xbc},
{value: 0x0008, lo: 0xbd, hi: 0xbd},
- {value: 0x1008, lo: 0xbe, hi: 0xbf},
- // Block 0x15, offset 0xdc
+ {value: 0x3008, lo: 0xbe, hi: 0xbf},
+ // Block 0x13, offset 0xbd
{value: 0x0000, lo: 0x0b},
{value: 0x0040, lo: 0x80, hi: 0x81},
- {value: 0x1008, lo: 0x82, hi: 0x83},
+ {value: 0x3008, lo: 0x82, hi: 0x83},
{value: 0x0040, lo: 0x84, hi: 0x84},
{value: 0x0008, lo: 0x85, hi: 0x96},
{value: 0x0040, lo: 0x97, hi: 0x99},
@@ -2594,50 +2594,50 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0040, lo: 0xbc, hi: 0xbc},
{value: 0x0008, lo: 0xbd, hi: 0xbd},
{value: 0x0040, lo: 0xbe, hi: 0xbf},
- // Block 0x16, offset 0xe8
+ // Block 0x14, offset 0xc9
{value: 0x0000, lo: 0x10},
{value: 0x0008, lo: 0x80, hi: 0x86},
{value: 0x0040, lo: 0x87, hi: 0x89},
- {value: 0x1b08, lo: 0x8a, hi: 0x8a},
+ {value: 0x3b08, lo: 0x8a, hi: 0x8a},
{value: 0x0040, lo: 0x8b, hi: 0x8e},
- {value: 0x1008, lo: 0x8f, hi: 0x91},
- {value: 0x1308, lo: 0x92, hi: 0x94},
+ {value: 0x3008, lo: 0x8f, hi: 0x91},
+ {value: 0x3308, lo: 0x92, hi: 0x94},
{value: 0x0040, lo: 0x95, hi: 0x95},
- {value: 0x1308, lo: 0x96, hi: 0x96},
+ {value: 0x3308, lo: 0x96, hi: 0x96},
{value: 0x0040, lo: 0x97, hi: 0x97},
- {value: 0x1008, lo: 0x98, hi: 0x9f},
+ {value: 0x3008, lo: 0x98, hi: 0x9f},
{value: 0x0040, lo: 0xa0, hi: 0xa5},
{value: 0x0008, lo: 0xa6, hi: 0xaf},
{value: 0x0040, lo: 0xb0, hi: 0xb1},
- {value: 0x1008, lo: 0xb2, hi: 0xb3},
+ {value: 0x3008, lo: 0xb2, hi: 0xb3},
{value: 0x0018, lo: 0xb4, hi: 0xb4},
{value: 0x0040, lo: 0xb5, hi: 0xbf},
- // Block 0x17, offset 0xf9
+ // Block 0x15, offset 0xda
{value: 0x0000, lo: 0x09},
{value: 0x0040, lo: 0x80, hi: 0x80},
{value: 0x0008, lo: 0x81, hi: 0xb0},
- {value: 0x1308, lo: 0xb1, hi: 0xb1},
+ {value: 0x3308, lo: 0xb1, hi: 0xb1},
{value: 0x0008, lo: 0xb2, hi: 0xb2},
{value: 0x08f1, lo: 0xb3, hi: 0xb3},
- {value: 0x1308, lo: 0xb4, hi: 0xb9},
- {value: 0x1b08, lo: 0xba, hi: 0xba},
+ {value: 0x3308, lo: 0xb4, hi: 0xb9},
+ {value: 0x3b08, lo: 0xba, hi: 0xba},
{value: 0x0040, lo: 0xbb, hi: 0xbe},
{value: 0x0018, lo: 0xbf, hi: 0xbf},
- // Block 0x18, offset 0x103
+ // Block 0x16, offset 0xe4
{value: 0x0000, lo: 0x06},
{value: 0x0008, lo: 0x80, hi: 0x86},
- {value: 0x1308, lo: 0x87, hi: 0x8e},
+ {value: 0x3308, lo: 0x87, hi: 0x8e},
{value: 0x0018, lo: 0x8f, hi: 0x8f},
{value: 0x0008, lo: 0x90, hi: 0x99},
{value: 0x0018, lo: 0x9a, hi: 0x9b},
{value: 0x0040, lo: 0x9c, hi: 0xbf},
- // Block 0x19, offset 0x10a
+ // Block 0x17, offset 0xeb
{value: 0x0000, lo: 0x0c},
{value: 0x0008, lo: 0x80, hi: 0x84},
{value: 0x0040, lo: 0x85, hi: 0x85},
{value: 0x0008, lo: 0x86, hi: 0x86},
{value: 0x0040, lo: 0x87, hi: 0x87},
- {value: 0x1308, lo: 0x88, hi: 0x8d},
+ {value: 0x3308, lo: 0x88, hi: 0x8d},
{value: 0x0040, lo: 0x8e, hi: 0x8f},
{value: 0x0008, lo: 0x90, hi: 0x99},
{value: 0x0040, lo: 0x9a, hi: 0x9b},
@@ -2645,76 +2645,76 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0999, lo: 0x9d, hi: 0x9d},
{value: 0x0008, lo: 0x9e, hi: 0x9f},
{value: 0x0040, lo: 0xa0, hi: 0xbf},
- // Block 0x1a, offset 0x117
+ // Block 0x18, offset 0xf8
{value: 0x0000, lo: 0x10},
{value: 0x0008, lo: 0x80, hi: 0x80},
{value: 0x0018, lo: 0x81, hi: 0x8a},
{value: 0x0008, lo: 0x8b, hi: 0x8b},
{value: 0xe03d, lo: 0x8c, hi: 0x8c},
{value: 0x0018, lo: 0x8d, hi: 0x97},
- {value: 0x1308, lo: 0x98, hi: 0x99},
+ {value: 0x3308, lo: 0x98, hi: 0x99},
{value: 0x0018, lo: 0x9a, hi: 0x9f},
{value: 0x0008, lo: 0xa0, hi: 0xa9},
{value: 0x0018, lo: 0xaa, hi: 0xb4},
- {value: 0x1308, lo: 0xb5, hi: 0xb5},
+ {value: 0x3308, lo: 0xb5, hi: 0xb5},
{value: 0x0018, lo: 0xb6, hi: 0xb6},
- {value: 0x1308, lo: 0xb7, hi: 0xb7},
+ {value: 0x3308, lo: 0xb7, hi: 0xb7},
{value: 0x0018, lo: 0xb8, hi: 0xb8},
- {value: 0x1308, lo: 0xb9, hi: 0xb9},
+ {value: 0x3308, lo: 0xb9, hi: 0xb9},
{value: 0x0018, lo: 0xba, hi: 0xbd},
- {value: 0x1008, lo: 0xbe, hi: 0xbf},
- // Block 0x1b, offset 0x128
+ {value: 0x3008, lo: 0xbe, hi: 0xbf},
+ // Block 0x19, offset 0x109
{value: 0x0000, lo: 0x06},
{value: 0x0018, lo: 0x80, hi: 0x85},
- {value: 0x1308, lo: 0x86, hi: 0x86},
+ {value: 0x3308, lo: 0x86, hi: 0x86},
{value: 0x0018, lo: 0x87, hi: 0x8c},
{value: 0x0040, lo: 0x8d, hi: 0x8d},
{value: 0x0018, lo: 0x8e, hi: 0x9a},
{value: 0x0040, lo: 0x9b, hi: 0xbf},
- // Block 0x1c, offset 0x12f
+ // Block 0x1a, offset 0x110
{value: 0x0000, lo: 0x0a},
{value: 0x0008, lo: 0x80, hi: 0xaa},
- {value: 0x1008, lo: 0xab, hi: 0xac},
- {value: 0x1308, lo: 0xad, hi: 0xb0},
- {value: 0x1008, lo: 0xb1, hi: 0xb1},
- {value: 0x1308, lo: 0xb2, hi: 0xb7},
- {value: 0x1008, lo: 0xb8, hi: 0xb8},
- {value: 0x1b08, lo: 0xb9, hi: 0xba},
- {value: 0x1008, lo: 0xbb, hi: 0xbc},
- {value: 0x1308, lo: 0xbd, hi: 0xbe},
+ {value: 0x3008, lo: 0xab, hi: 0xac},
+ {value: 0x3308, lo: 0xad, hi: 0xb0},
+ {value: 0x3008, lo: 0xb1, hi: 0xb1},
+ {value: 0x3308, lo: 0xb2, hi: 0xb7},
+ {value: 0x3008, lo: 0xb8, hi: 0xb8},
+ {value: 0x3b08, lo: 0xb9, hi: 0xba},
+ {value: 0x3008, lo: 0xbb, hi: 0xbc},
+ {value: 0x3308, lo: 0xbd, hi: 0xbe},
{value: 0x0008, lo: 0xbf, hi: 0xbf},
- // Block 0x1d, offset 0x13a
+ // Block 0x1b, offset 0x11b
{value: 0x0000, lo: 0x0e},
{value: 0x0008, lo: 0x80, hi: 0x89},
{value: 0x0018, lo: 0x8a, hi: 0x8f},
{value: 0x0008, lo: 0x90, hi: 0x95},
- {value: 0x1008, lo: 0x96, hi: 0x97},
- {value: 0x1308, lo: 0x98, hi: 0x99},
+ {value: 0x3008, lo: 0x96, hi: 0x97},
+ {value: 0x3308, lo: 0x98, hi: 0x99},
{value: 0x0008, lo: 0x9a, hi: 0x9d},
- {value: 0x1308, lo: 0x9e, hi: 0xa0},
+ {value: 0x3308, lo: 0x9e, hi: 0xa0},
{value: 0x0008, lo: 0xa1, hi: 0xa1},
- {value: 0x1008, lo: 0xa2, hi: 0xa4},
+ {value: 0x3008, lo: 0xa2, hi: 0xa4},
{value: 0x0008, lo: 0xa5, hi: 0xa6},
- {value: 0x1008, lo: 0xa7, hi: 0xad},
+ {value: 0x3008, lo: 0xa7, hi: 0xad},
{value: 0x0008, lo: 0xae, hi: 0xb0},
- {value: 0x1308, lo: 0xb1, hi: 0xb4},
+ {value: 0x3308, lo: 0xb1, hi: 0xb4},
{value: 0x0008, lo: 0xb5, hi: 0xbf},
- // Block 0x1e, offset 0x149
+ // Block 0x1c, offset 0x12a
{value: 0x0000, lo: 0x0d},
{value: 0x0008, lo: 0x80, hi: 0x81},
- {value: 0x1308, lo: 0x82, hi: 0x82},
- {value: 0x1008, lo: 0x83, hi: 0x84},
- {value: 0x1308, lo: 0x85, hi: 0x86},
- {value: 0x1008, lo: 0x87, hi: 0x8c},
- {value: 0x1308, lo: 0x8d, hi: 0x8d},
+ {value: 0x3308, lo: 0x82, hi: 0x82},
+ {value: 0x3008, lo: 0x83, hi: 0x84},
+ {value: 0x3308, lo: 0x85, hi: 0x86},
+ {value: 0x3008, lo: 0x87, hi: 0x8c},
+ {value: 0x3308, lo: 0x8d, hi: 0x8d},
{value: 0x0008, lo: 0x8e, hi: 0x8e},
- {value: 0x1008, lo: 0x8f, hi: 0x8f},
+ {value: 0x3008, lo: 0x8f, hi: 0x8f},
{value: 0x0008, lo: 0x90, hi: 0x99},
- {value: 0x1008, lo: 0x9a, hi: 0x9c},
- {value: 0x1308, lo: 0x9d, hi: 0x9d},
+ {value: 0x3008, lo: 0x9a, hi: 0x9c},
+ {value: 0x3308, lo: 0x9d, hi: 0x9d},
{value: 0x0018, lo: 0x9e, hi: 0x9f},
{value: 0x0040, lo: 0xa0, hi: 0xbf},
- // Block 0x1f, offset 0x157
+ // Block 0x1d, offset 0x138
{value: 0x0000, lo: 0x09},
{value: 0x0040, lo: 0x80, hi: 0x86},
{value: 0x055d, lo: 0x87, hi: 0x87},
@@ -2725,18 +2725,27 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0018, lo: 0xbb, hi: 0xbb},
{value: 0xe105, lo: 0xbc, hi: 0xbc},
{value: 0x0008, lo: 0xbd, hi: 0xbf},
- // Block 0x20, offset 0x161
+ // Block 0x1e, offset 0x142
{value: 0x0000, lo: 0x01},
{value: 0x0018, lo: 0x80, hi: 0xbf},
- // Block 0x21, offset 0x163
- {value: 0x0000, lo: 0x03},
+ // Block 0x1f, offset 0x144
+ {value: 0x0000, lo: 0x04},
{value: 0x0018, lo: 0x80, hi: 0x9e},
{value: 0x0040, lo: 0x9f, hi: 0xa0},
- {value: 0x0018, lo: 0xa1, hi: 0xbf},
- // Block 0x22, offset 0x167
+ {value: 0x2018, lo: 0xa1, hi: 0xb5},
+ {value: 0x0018, lo: 0xb6, hi: 0xbf},
+ // Block 0x20, offset 0x149
+ {value: 0x0000, lo: 0x02},
+ {value: 0x0018, lo: 0x80, hi: 0xa7},
+ {value: 0x2018, lo: 0xa8, hi: 0xbf},
+ // Block 0x21, offset 0x14c
+ {value: 0x0000, lo: 0x02},
+ {value: 0x2018, lo: 0x80, hi: 0x82},
+ {value: 0x0018, lo: 0x83, hi: 0xbf},
+ // Block 0x22, offset 0x14f
{value: 0x0000, lo: 0x01},
{value: 0x0008, lo: 0x80, hi: 0xbf},
- // Block 0x23, offset 0x169
+ // Block 0x23, offset 0x151
{value: 0x0000, lo: 0x0b},
{value: 0x0008, lo: 0x80, hi: 0x88},
{value: 0x0040, lo: 0x89, hi: 0x89},
@@ -2749,7 +2758,7 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0008, lo: 0x9a, hi: 0x9d},
{value: 0x0040, lo: 0x9e, hi: 0x9f},
{value: 0x0008, lo: 0xa0, hi: 0xbf},
- // Block 0x24, offset 0x175
+ // Block 0x24, offset 0x15d
{value: 0x0000, lo: 0x0a},
{value: 0x0008, lo: 0x80, hi: 0x88},
{value: 0x0040, lo: 0x89, hi: 0x89},
@@ -2761,7 +2770,7 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0040, lo: 0xb6, hi: 0xb7},
{value: 0x0008, lo: 0xb8, hi: 0xbe},
{value: 0x0040, lo: 0xbf, hi: 0xbf},
- // Block 0x25, offset 0x180
+ // Block 0x25, offset 0x168
{value: 0x0000, lo: 0x07},
{value: 0x0008, lo: 0x80, hi: 0x80},
{value: 0x0040, lo: 0x81, hi: 0x81},
@@ -2770,146 +2779,146 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0008, lo: 0x88, hi: 0x96},
{value: 0x0040, lo: 0x97, hi: 0x97},
{value: 0x0008, lo: 0x98, hi: 0xbf},
- // Block 0x26, offset 0x188
+ // Block 0x26, offset 0x170
{value: 0x0000, lo: 0x05},
{value: 0x0008, lo: 0x80, hi: 0x90},
{value: 0x0040, lo: 0x91, hi: 0x91},
{value: 0x0008, lo: 0x92, hi: 0x95},
{value: 0x0040, lo: 0x96, hi: 0x97},
{value: 0x0008, lo: 0x98, hi: 0xbf},
- // Block 0x27, offset 0x18e
+ // Block 0x27, offset 0x176
{value: 0x0000, lo: 0x05},
{value: 0x0008, lo: 0x80, hi: 0x9a},
{value: 0x0040, lo: 0x9b, hi: 0x9c},
- {value: 0x1308, lo: 0x9d, hi: 0x9f},
+ {value: 0x3308, lo: 0x9d, hi: 0x9f},
{value: 0x0018, lo: 0xa0, hi: 0xbc},
{value: 0x0040, lo: 0xbd, hi: 0xbf},
- // Block 0x28, offset 0x194
+ // Block 0x28, offset 0x17c
{value: 0x0000, lo: 0x04},
{value: 0x0008, lo: 0x80, hi: 0x8f},
{value: 0x0018, lo: 0x90, hi: 0x99},
{value: 0x0040, lo: 0x9a, hi: 0x9f},
{value: 0x0008, lo: 0xa0, hi: 0xbf},
- // Block 0x29, offset 0x199
+ // Block 0x29, offset 0x181
{value: 0x0000, lo: 0x04},
{value: 0x0008, lo: 0x80, hi: 0xb5},
{value: 0x0040, lo: 0xb6, hi: 0xb7},
{value: 0xe045, lo: 0xb8, hi: 0xbd},
{value: 0x0040, lo: 0xbe, hi: 0xbf},
- // Block 0x2a, offset 0x19e
+ // Block 0x2a, offset 0x186
{value: 0x0000, lo: 0x02},
{value: 0x0018, lo: 0x80, hi: 0x80},
{value: 0x0008, lo: 0x81, hi: 0xbf},
- // Block 0x2b, offset 0x1a1
+ // Block 0x2b, offset 0x189
{value: 0x0000, lo: 0x03},
{value: 0x0008, lo: 0x80, hi: 0xac},
{value: 0x0018, lo: 0xad, hi: 0xae},
{value: 0x0008, lo: 0xaf, hi: 0xbf},
- // Block 0x2c, offset 0x1a5
+ // Block 0x2c, offset 0x18d
{value: 0x0000, lo: 0x05},
{value: 0x0040, lo: 0x80, hi: 0x80},
{value: 0x0008, lo: 0x81, hi: 0x9a},
{value: 0x0018, lo: 0x9b, hi: 0x9c},
{value: 0x0040, lo: 0x9d, hi: 0x9f},
{value: 0x0008, lo: 0xa0, hi: 0xbf},
- // Block 0x2d, offset 0x1ab
+ // Block 0x2d, offset 0x193
{value: 0x0000, lo: 0x04},
{value: 0x0008, lo: 0x80, hi: 0xaa},
{value: 0x0018, lo: 0xab, hi: 0xb0},
{value: 0x0008, lo: 0xb1, hi: 0xb8},
{value: 0x0040, lo: 0xb9, hi: 0xbf},
- // Block 0x2e, offset 0x1b0
+ // Block 0x2e, offset 0x198
{value: 0x0000, lo: 0x0b},
{value: 0x0008, lo: 0x80, hi: 0x8c},
{value: 0x0040, lo: 0x8d, hi: 0x8d},
{value: 0x0008, lo: 0x8e, hi: 0x91},
- {value: 0x1308, lo: 0x92, hi: 0x93},
- {value: 0x1b08, lo: 0x94, hi: 0x94},
+ {value: 0x3308, lo: 0x92, hi: 0x93},
+ {value: 0x3b08, lo: 0x94, hi: 0x94},
{value: 0x0040, lo: 0x95, hi: 0x9f},
{value: 0x0008, lo: 0xa0, hi: 0xb1},
- {value: 0x1308, lo: 0xb2, hi: 0xb3},
- {value: 0x1b08, lo: 0xb4, hi: 0xb4},
+ {value: 0x3308, lo: 0xb2, hi: 0xb3},
+ {value: 0x3b08, lo: 0xb4, hi: 0xb4},
{value: 0x0018, lo: 0xb5, hi: 0xb6},
{value: 0x0040, lo: 0xb7, hi: 0xbf},
- // Block 0x2f, offset 0x1bc
+ // Block 0x2f, offset 0x1a4
{value: 0x0000, lo: 0x09},
{value: 0x0008, lo: 0x80, hi: 0x91},
- {value: 0x1308, lo: 0x92, hi: 0x93},
+ {value: 0x3308, lo: 0x92, hi: 0x93},
{value: 0x0040, lo: 0x94, hi: 0x9f},
{value: 0x0008, lo: 0xa0, hi: 0xac},
{value: 0x0040, lo: 0xad, hi: 0xad},
{value: 0x0008, lo: 0xae, hi: 0xb0},
{value: 0x0040, lo: 0xb1, hi: 0xb1},
- {value: 0x1308, lo: 0xb2, hi: 0xb3},
+ {value: 0x3308, lo: 0xb2, hi: 0xb3},
{value: 0x0040, lo: 0xb4, hi: 0xbf},
- // Block 0x30, offset 0x1c6
+ // Block 0x30, offset 0x1ae
{value: 0x0000, lo: 0x05},
{value: 0x0008, lo: 0x80, hi: 0xb3},
- {value: 0x1340, lo: 0xb4, hi: 0xb5},
- {value: 0x1008, lo: 0xb6, hi: 0xb6},
- {value: 0x1308, lo: 0xb7, hi: 0xbd},
- {value: 0x1008, lo: 0xbe, hi: 0xbf},
- // Block 0x31, offset 0x1cc
+ {value: 0x3340, lo: 0xb4, hi: 0xb5},
+ {value: 0x3008, lo: 0xb6, hi: 0xb6},
+ {value: 0x3308, lo: 0xb7, hi: 0xbd},
+ {value: 0x3008, lo: 0xbe, hi: 0xbf},
+ // Block 0x31, offset 0x1b4
{value: 0x0000, lo: 0x10},
- {value: 0x1008, lo: 0x80, hi: 0x85},
- {value: 0x1308, lo: 0x86, hi: 0x86},
- {value: 0x1008, lo: 0x87, hi: 0x88},
- {value: 0x1308, lo: 0x89, hi: 0x91},
- {value: 0x1b08, lo: 0x92, hi: 0x92},
- {value: 0x1308, lo: 0x93, hi: 0x93},
+ {value: 0x3008, lo: 0x80, hi: 0x85},
+ {value: 0x3308, lo: 0x86, hi: 0x86},
+ {value: 0x3008, lo: 0x87, hi: 0x88},
+ {value: 0x3308, lo: 0x89, hi: 0x91},
+ {value: 0x3b08, lo: 0x92, hi: 0x92},
+ {value: 0x3308, lo: 0x93, hi: 0x93},
{value: 0x0018, lo: 0x94, hi: 0x96},
{value: 0x0008, lo: 0x97, hi: 0x97},
{value: 0x0018, lo: 0x98, hi: 0x9b},
{value: 0x0008, lo: 0x9c, hi: 0x9c},
- {value: 0x1308, lo: 0x9d, hi: 0x9d},
+ {value: 0x3308, lo: 0x9d, hi: 0x9d},
{value: 0x0040, lo: 0x9e, hi: 0x9f},
{value: 0x0008, lo: 0xa0, hi: 0xa9},
{value: 0x0040, lo: 0xaa, hi: 0xaf},
{value: 0x0018, lo: 0xb0, hi: 0xb9},
{value: 0x0040, lo: 0xba, hi: 0xbf},
- // Block 0x32, offset 0x1dd
+ // Block 0x32, offset 0x1c5
{value: 0x0000, lo: 0x09},
{value: 0x0018, lo: 0x80, hi: 0x85},
{value: 0x0040, lo: 0x86, hi: 0x86},
{value: 0x0218, lo: 0x87, hi: 0x87},
{value: 0x0018, lo: 0x88, hi: 0x8a},
- {value: 0x13c0, lo: 0x8b, hi: 0x8d},
+ {value: 0x33c0, lo: 0x8b, hi: 0x8d},
{value: 0x0040, lo: 0x8e, hi: 0x8f},
{value: 0x0008, lo: 0x90, hi: 0x99},
{value: 0x0040, lo: 0x9a, hi: 0x9f},
{value: 0x0208, lo: 0xa0, hi: 0xbf},
- // Block 0x33, offset 0x1e7
+ // Block 0x33, offset 0x1cf
{value: 0x0000, lo: 0x02},
{value: 0x0208, lo: 0x80, hi: 0xb7},
{value: 0x0040, lo: 0xb8, hi: 0xbf},
- // Block 0x34, offset 0x1ea
+ // Block 0x34, offset 0x1d2
{value: 0x0000, lo: 0x07},
{value: 0x0008, lo: 0x80, hi: 0x84},
- {value: 0x1308, lo: 0x85, hi: 0x86},
+ {value: 0x3308, lo: 0x85, hi: 0x86},
{value: 0x0208, lo: 0x87, hi: 0xa8},
- {value: 0x1308, lo: 0xa9, hi: 0xa9},
+ {value: 0x3308, lo: 0xa9, hi: 0xa9},
{value: 0x0208, lo: 0xaa, hi: 0xaa},
{value: 0x0040, lo: 0xab, hi: 0xaf},
{value: 0x0008, lo: 0xb0, hi: 0xbf},
- // Block 0x35, offset 0x1f2
+ // Block 0x35, offset 0x1da
{value: 0x0000, lo: 0x02},
{value: 0x0008, lo: 0x80, hi: 0xb5},
{value: 0x0040, lo: 0xb6, hi: 0xbf},
- // Block 0x36, offset 0x1f5
+ // Block 0x36, offset 0x1dd
{value: 0x0000, lo: 0x0c},
{value: 0x0008, lo: 0x80, hi: 0x9e},
{value: 0x0040, lo: 0x9f, hi: 0x9f},
- {value: 0x1308, lo: 0xa0, hi: 0xa2},
- {value: 0x1008, lo: 0xa3, hi: 0xa6},
- {value: 0x1308, lo: 0xa7, hi: 0xa8},
- {value: 0x1008, lo: 0xa9, hi: 0xab},
+ {value: 0x3308, lo: 0xa0, hi: 0xa2},
+ {value: 0x3008, lo: 0xa3, hi: 0xa6},
+ {value: 0x3308, lo: 0xa7, hi: 0xa8},
+ {value: 0x3008, lo: 0xa9, hi: 0xab},
{value: 0x0040, lo: 0xac, hi: 0xaf},
- {value: 0x1008, lo: 0xb0, hi: 0xb1},
- {value: 0x1308, lo: 0xb2, hi: 0xb2},
- {value: 0x1008, lo: 0xb3, hi: 0xb8},
- {value: 0x1308, lo: 0xb9, hi: 0xbb},
+ {value: 0x3008, lo: 0xb0, hi: 0xb1},
+ {value: 0x3308, lo: 0xb2, hi: 0xb2},
+ {value: 0x3008, lo: 0xb3, hi: 0xb8},
+ {value: 0x3308, lo: 0xb9, hi: 0xbb},
{value: 0x0040, lo: 0xbc, hi: 0xbf},
- // Block 0x37, offset 0x202
+ // Block 0x37, offset 0x1ea
{value: 0x0000, lo: 0x07},
{value: 0x0018, lo: 0x80, hi: 0x80},
{value: 0x0040, lo: 0x81, hi: 0x83},
@@ -2918,12 +2927,12 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0040, lo: 0xae, hi: 0xaf},
{value: 0x0008, lo: 0xb0, hi: 0xb4},
{value: 0x0040, lo: 0xb5, hi: 0xbf},
- // Block 0x38, offset 0x20a
+ // Block 0x38, offset 0x1f2
{value: 0x0000, lo: 0x03},
{value: 0x0008, lo: 0x80, hi: 0xab},
{value: 0x0040, lo: 0xac, hi: 0xaf},
{value: 0x0008, lo: 0xb0, hi: 0xbf},
- // Block 0x39, offset 0x20e
+ // Block 0x39, offset 0x1f6
{value: 0x0000, lo: 0x06},
{value: 0x0008, lo: 0x80, hi: 0x89},
{value: 0x0040, lo: 0x8a, hi: 0x8f},
@@ -2931,33 +2940,33 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0028, lo: 0x9a, hi: 0x9a},
{value: 0x0040, lo: 0x9b, hi: 0x9d},
{value: 0x0018, lo: 0x9e, hi: 0xbf},
- // Block 0x3a, offset 0x215
+ // Block 0x3a, offset 0x1fd
{value: 0x0000, lo: 0x07},
{value: 0x0008, lo: 0x80, hi: 0x96},
- {value: 0x1308, lo: 0x97, hi: 0x98},
- {value: 0x1008, lo: 0x99, hi: 0x9a},
- {value: 0x1308, lo: 0x9b, hi: 0x9b},
+ {value: 0x3308, lo: 0x97, hi: 0x98},
+ {value: 0x3008, lo: 0x99, hi: 0x9a},
+ {value: 0x3308, lo: 0x9b, hi: 0x9b},
{value: 0x0040, lo: 0x9c, hi: 0x9d},
{value: 0x0018, lo: 0x9e, hi: 0x9f},
{value: 0x0008, lo: 0xa0, hi: 0xbf},
- // Block 0x3b, offset 0x21d
+ // Block 0x3b, offset 0x205
{value: 0x0000, lo: 0x0f},
{value: 0x0008, lo: 0x80, hi: 0x94},
- {value: 0x1008, lo: 0x95, hi: 0x95},
- {value: 0x1308, lo: 0x96, hi: 0x96},
- {value: 0x1008, lo: 0x97, hi: 0x97},
- {value: 0x1308, lo: 0x98, hi: 0x9e},
+ {value: 0x3008, lo: 0x95, hi: 0x95},
+ {value: 0x3308, lo: 0x96, hi: 0x96},
+ {value: 0x3008, lo: 0x97, hi: 0x97},
+ {value: 0x3308, lo: 0x98, hi: 0x9e},
{value: 0x0040, lo: 0x9f, hi: 0x9f},
- {value: 0x1b08, lo: 0xa0, hi: 0xa0},
- {value: 0x1008, lo: 0xa1, hi: 0xa1},
- {value: 0x1308, lo: 0xa2, hi: 0xa2},
- {value: 0x1008, lo: 0xa3, hi: 0xa4},
- {value: 0x1308, lo: 0xa5, hi: 0xac},
- {value: 0x1008, lo: 0xad, hi: 0xb2},
- {value: 0x1308, lo: 0xb3, hi: 0xbc},
+ {value: 0x3b08, lo: 0xa0, hi: 0xa0},
+ {value: 0x3008, lo: 0xa1, hi: 0xa1},
+ {value: 0x3308, lo: 0xa2, hi: 0xa2},
+ {value: 0x3008, lo: 0xa3, hi: 0xa4},
+ {value: 0x3308, lo: 0xa5, hi: 0xac},
+ {value: 0x3008, lo: 0xad, hi: 0xb2},
+ {value: 0x3308, lo: 0xb3, hi: 0xbc},
{value: 0x0040, lo: 0xbd, hi: 0xbe},
- {value: 0x1308, lo: 0xbf, hi: 0xbf},
- // Block 0x3c, offset 0x22d
+ {value: 0x3308, lo: 0xbf, hi: 0xbf},
+ // Block 0x3c, offset 0x215
{value: 0x0000, lo: 0x0b},
{value: 0x0008, lo: 0x80, hi: 0x89},
{value: 0x0040, lo: 0x8a, hi: 0x8f},
@@ -2967,78 +2976,78 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0008, lo: 0xa7, hi: 0xa7},
{value: 0x0018, lo: 0xa8, hi: 0xad},
{value: 0x0040, lo: 0xae, hi: 0xaf},
- {value: 0x1308, lo: 0xb0, hi: 0xbd},
- {value: 0x1318, lo: 0xbe, hi: 0xbe},
+ {value: 0x3308, lo: 0xb0, hi: 0xbd},
+ {value: 0x3318, lo: 0xbe, hi: 0xbe},
{value: 0x0040, lo: 0xbf, hi: 0xbf},
- // Block 0x3d, offset 0x239
+ // Block 0x3d, offset 0x221
{value: 0x0000, lo: 0x01},
{value: 0x0040, lo: 0x80, hi: 0xbf},
- // Block 0x3e, offset 0x23b
+ // Block 0x3e, offset 0x223
{value: 0x0000, lo: 0x09},
- {value: 0x1308, lo: 0x80, hi: 0x83},
- {value: 0x1008, lo: 0x84, hi: 0x84},
+ {value: 0x3308, lo: 0x80, hi: 0x83},
+ {value: 0x3008, lo: 0x84, hi: 0x84},
{value: 0x0008, lo: 0x85, hi: 0xb3},
- {value: 0x1308, lo: 0xb4, hi: 0xb4},
- {value: 0x1008, lo: 0xb5, hi: 0xb5},
- {value: 0x1308, lo: 0xb6, hi: 0xba},
- {value: 0x1008, lo: 0xbb, hi: 0xbb},
- {value: 0x1308, lo: 0xbc, hi: 0xbc},
- {value: 0x1008, lo: 0xbd, hi: 0xbf},
- // Block 0x3f, offset 0x245
+ {value: 0x3308, lo: 0xb4, hi: 0xb4},
+ {value: 0x3008, lo: 0xb5, hi: 0xb5},
+ {value: 0x3308, lo: 0xb6, hi: 0xba},
+ {value: 0x3008, lo: 0xbb, hi: 0xbb},
+ {value: 0x3308, lo: 0xbc, hi: 0xbc},
+ {value: 0x3008, lo: 0xbd, hi: 0xbf},
+ // Block 0x3f, offset 0x22d
{value: 0x0000, lo: 0x0b},
- {value: 0x1008, lo: 0x80, hi: 0x81},
- {value: 0x1308, lo: 0x82, hi: 0x82},
- {value: 0x1008, lo: 0x83, hi: 0x83},
- {value: 0x1808, lo: 0x84, hi: 0x84},
+ {value: 0x3008, lo: 0x80, hi: 0x81},
+ {value: 0x3308, lo: 0x82, hi: 0x82},
+ {value: 0x3008, lo: 0x83, hi: 0x83},
+ {value: 0x3808, lo: 0x84, hi: 0x84},
{value: 0x0008, lo: 0x85, hi: 0x8b},
{value: 0x0040, lo: 0x8c, hi: 0x8f},
{value: 0x0008, lo: 0x90, hi: 0x99},
{value: 0x0018, lo: 0x9a, hi: 0xaa},
- {value: 0x1308, lo: 0xab, hi: 0xb3},
+ {value: 0x3308, lo: 0xab, hi: 0xb3},
{value: 0x0018, lo: 0xb4, hi: 0xbc},
{value: 0x0040, lo: 0xbd, hi: 0xbf},
- // Block 0x40, offset 0x251
+ // Block 0x40, offset 0x239
{value: 0x0000, lo: 0x0b},
- {value: 0x1308, lo: 0x80, hi: 0x81},
- {value: 0x1008, lo: 0x82, hi: 0x82},
+ {value: 0x3308, lo: 0x80, hi: 0x81},
+ {value: 0x3008, lo: 0x82, hi: 0x82},
{value: 0x0008, lo: 0x83, hi: 0xa0},
- {value: 0x1008, lo: 0xa1, hi: 0xa1},
- {value: 0x1308, lo: 0xa2, hi: 0xa5},
- {value: 0x1008, lo: 0xa6, hi: 0xa7},
- {value: 0x1308, lo: 0xa8, hi: 0xa9},
- {value: 0x1808, lo: 0xaa, hi: 0xaa},
- {value: 0x1b08, lo: 0xab, hi: 0xab},
- {value: 0x1308, lo: 0xac, hi: 0xad},
+ {value: 0x3008, lo: 0xa1, hi: 0xa1},
+ {value: 0x3308, lo: 0xa2, hi: 0xa5},
+ {value: 0x3008, lo: 0xa6, hi: 0xa7},
+ {value: 0x3308, lo: 0xa8, hi: 0xa9},
+ {value: 0x3808, lo: 0xaa, hi: 0xaa},
+ {value: 0x3b08, lo: 0xab, hi: 0xab},
+ {value: 0x3308, lo: 0xac, hi: 0xad},
{value: 0x0008, lo: 0xae, hi: 0xbf},
- // Block 0x41, offset 0x25d
+ // Block 0x41, offset 0x245
{value: 0x0000, lo: 0x0b},
{value: 0x0008, lo: 0x80, hi: 0xa5},
- {value: 0x1308, lo: 0xa6, hi: 0xa6},
- {value: 0x1008, lo: 0xa7, hi: 0xa7},
- {value: 0x1308, lo: 0xa8, hi: 0xa9},
- {value: 0x1008, lo: 0xaa, hi: 0xac},
- {value: 0x1308, lo: 0xad, hi: 0xad},
- {value: 0x1008, lo: 0xae, hi: 0xae},
- {value: 0x1308, lo: 0xaf, hi: 0xb1},
- {value: 0x1808, lo: 0xb2, hi: 0xb3},
+ {value: 0x3308, lo: 0xa6, hi: 0xa6},
+ {value: 0x3008, lo: 0xa7, hi: 0xa7},
+ {value: 0x3308, lo: 0xa8, hi: 0xa9},
+ {value: 0x3008, lo: 0xaa, hi: 0xac},
+ {value: 0x3308, lo: 0xad, hi: 0xad},
+ {value: 0x3008, lo: 0xae, hi: 0xae},
+ {value: 0x3308, lo: 0xaf, hi: 0xb1},
+ {value: 0x3808, lo: 0xb2, hi: 0xb3},
{value: 0x0040, lo: 0xb4, hi: 0xbb},
{value: 0x0018, lo: 0xbc, hi: 0xbf},
- // Block 0x42, offset 0x269
+ // Block 0x42, offset 0x251
{value: 0x0000, lo: 0x07},
{value: 0x0008, lo: 0x80, hi: 0xa3},
- {value: 0x1008, lo: 0xa4, hi: 0xab},
- {value: 0x1308, lo: 0xac, hi: 0xb3},
- {value: 0x1008, lo: 0xb4, hi: 0xb5},
- {value: 0x1308, lo: 0xb6, hi: 0xb7},
+ {value: 0x3008, lo: 0xa4, hi: 0xab},
+ {value: 0x3308, lo: 0xac, hi: 0xb3},
+ {value: 0x3008, lo: 0xb4, hi: 0xb5},
+ {value: 0x3308, lo: 0xb6, hi: 0xb7},
{value: 0x0040, lo: 0xb8, hi: 0xba},
{value: 0x0018, lo: 0xbb, hi: 0xbf},
- // Block 0x43, offset 0x271
+ // Block 0x43, offset 0x259
{value: 0x0000, lo: 0x04},
{value: 0x0008, lo: 0x80, hi: 0x89},
{value: 0x0040, lo: 0x8a, hi: 0x8c},
{value: 0x0008, lo: 0x8d, hi: 0xbd},
{value: 0x0018, lo: 0xbe, hi: 0xbf},
- // Block 0x44, offset 0x276
+ // Block 0x44, offset 0x25e
{value: 0x0000, lo: 0x09},
{value: 0x0e29, lo: 0x80, hi: 0x80},
{value: 0x0e41, lo: 0x81, hi: 0x81},
@@ -3049,30 +3058,30 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0eb9, lo: 0x87, hi: 0x87},
{value: 0x057d, lo: 0x88, hi: 0x88},
{value: 0x0040, lo: 0x89, hi: 0xbf},
- // Block 0x45, offset 0x280
+ // Block 0x45, offset 0x268
{value: 0x0000, lo: 0x10},
{value: 0x0018, lo: 0x80, hi: 0x87},
{value: 0x0040, lo: 0x88, hi: 0x8f},
- {value: 0x1308, lo: 0x90, hi: 0x92},
+ {value: 0x3308, lo: 0x90, hi: 0x92},
{value: 0x0018, lo: 0x93, hi: 0x93},
- {value: 0x1308, lo: 0x94, hi: 0xa0},
- {value: 0x1008, lo: 0xa1, hi: 0xa1},
- {value: 0x1308, lo: 0xa2, hi: 0xa8},
+ {value: 0x3308, lo: 0x94, hi: 0xa0},
+ {value: 0x3008, lo: 0xa1, hi: 0xa1},
+ {value: 0x3308, lo: 0xa2, hi: 0xa8},
{value: 0x0008, lo: 0xa9, hi: 0xac},
- {value: 0x1308, lo: 0xad, hi: 0xad},
+ {value: 0x3308, lo: 0xad, hi: 0xad},
{value: 0x0008, lo: 0xae, hi: 0xb1},
- {value: 0x1008, lo: 0xb2, hi: 0xb3},
- {value: 0x1308, lo: 0xb4, hi: 0xb4},
+ {value: 0x3008, lo: 0xb2, hi: 0xb3},
+ {value: 0x3308, lo: 0xb4, hi: 0xb4},
{value: 0x0008, lo: 0xb5, hi: 0xb6},
- {value: 0x0040, lo: 0xb7, hi: 0xb7},
- {value: 0x1308, lo: 0xb8, hi: 0xb9},
+ {value: 0x3008, lo: 0xb7, hi: 0xb7},
+ {value: 0x3308, lo: 0xb8, hi: 0xb9},
{value: 0x0040, lo: 0xba, hi: 0xbf},
- // Block 0x46, offset 0x291
+ // Block 0x46, offset 0x279
{value: 0x0000, lo: 0x03},
- {value: 0x1308, lo: 0x80, hi: 0xb5},
- {value: 0x0040, lo: 0xb6, hi: 0xba},
- {value: 0x1308, lo: 0xbb, hi: 0xbf},
- // Block 0x47, offset 0x295
+ {value: 0x3308, lo: 0x80, hi: 0xb9},
+ {value: 0x0040, lo: 0xba, hi: 0xba},
+ {value: 0x3308, lo: 0xbb, hi: 0xbf},
+ // Block 0x47, offset 0x27d
{value: 0x0000, lo: 0x0a},
{value: 0x0008, lo: 0x80, hi: 0x87},
{value: 0xe045, lo: 0x88, hi: 0x8f},
@@ -3084,12 +3093,12 @@ var idnaSparseValues = [1876]valueRange{
{value: 0xe045, lo: 0xa8, hi: 0xaf},
{value: 0x0008, lo: 0xb0, hi: 0xb7},
{value: 0xe045, lo: 0xb8, hi: 0xbf},
- // Block 0x48, offset 0x2a0
+ // Block 0x48, offset 0x288
{value: 0x0000, lo: 0x03},
{value: 0x0040, lo: 0x80, hi: 0x8f},
- {value: 0x1318, lo: 0x90, hi: 0xb0},
+ {value: 0x3318, lo: 0x90, hi: 0xb0},
{value: 0x0040, lo: 0xb1, hi: 0xbf},
- // Block 0x49, offset 0x2a4
+ // Block 0x49, offset 0x28c
{value: 0x0000, lo: 0x08},
{value: 0x0018, lo: 0x80, hi: 0x82},
{value: 0x0040, lo: 0x83, hi: 0x83},
@@ -3099,7 +3108,7 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0018, lo: 0x8a, hi: 0x8b},
{value: 0x0040, lo: 0x8c, hi: 0x8f},
{value: 0x0018, lo: 0x90, hi: 0xbf},
- // Block 0x4a, offset 0x2ad
+ // Block 0x4a, offset 0x295
{value: 0x0000, lo: 0x07},
{value: 0x0018, lo: 0x80, hi: 0xab},
{value: 0x24f1, lo: 0xac, hi: 0xac},
@@ -3108,72 +3117,68 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x2579, lo: 0xaf, hi: 0xaf},
{value: 0x25b1, lo: 0xb0, hi: 0xb0},
{value: 0x0018, lo: 0xb1, hi: 0xbf},
- // Block 0x4b, offset 0x2b5
+ // Block 0x4b, offset 0x29d
{value: 0x0000, lo: 0x05},
{value: 0x0018, lo: 0x80, hi: 0x9f},
{value: 0x0080, lo: 0xa0, hi: 0xa0},
{value: 0x0018, lo: 0xa1, hi: 0xad},
{value: 0x0080, lo: 0xae, hi: 0xaf},
{value: 0x0018, lo: 0xb0, hi: 0xbf},
- // Block 0x4c, offset 0x2bb
+ // Block 0x4c, offset 0x2a3
{value: 0x0000, lo: 0x04},
{value: 0x0018, lo: 0x80, hi: 0xa8},
{value: 0x09c5, lo: 0xa9, hi: 0xa9},
{value: 0x09e5, lo: 0xaa, hi: 0xaa},
{value: 0x0018, lo: 0xab, hi: 0xbf},
- // Block 0x4d, offset 0x2c0
- {value: 0x0000, lo: 0x02},
- {value: 0x0018, lo: 0x80, hi: 0xbe},
- {value: 0x0040, lo: 0xbf, hi: 0xbf},
- // Block 0x4e, offset 0x2c3
+ // Block 0x4d, offset 0x2a8
{value: 0x0000, lo: 0x02},
{value: 0x0018, lo: 0x80, hi: 0xa6},
{value: 0x0040, lo: 0xa7, hi: 0xbf},
- // Block 0x4f, offset 0x2c6
+ // Block 0x4e, offset 0x2ab
{value: 0x0000, lo: 0x03},
{value: 0x0018, lo: 0x80, hi: 0x8b},
{value: 0x28c1, lo: 0x8c, hi: 0x8c},
{value: 0x0018, lo: 0x8d, hi: 0xbf},
- // Block 0x50, offset 0x2ca
+ // Block 0x4f, offset 0x2af
{value: 0x0000, lo: 0x05},
{value: 0x0018, lo: 0x80, hi: 0xb3},
{value: 0x0e66, lo: 0xb4, hi: 0xb4},
{value: 0x292a, lo: 0xb5, hi: 0xb5},
{value: 0x0e86, lo: 0xb6, hi: 0xb6},
{value: 0x0018, lo: 0xb7, hi: 0xbf},
- // Block 0x51, offset 0x2d0
+ // Block 0x50, offset 0x2b5
{value: 0x0000, lo: 0x03},
{value: 0x0018, lo: 0x80, hi: 0x9b},
{value: 0x2941, lo: 0x9c, hi: 0x9c},
{value: 0x0018, lo: 0x9d, hi: 0xbf},
- // Block 0x52, offset 0x2d4
+ // Block 0x51, offset 0x2b9
{value: 0x0000, lo: 0x03},
{value: 0x0018, lo: 0x80, hi: 0xb3},
{value: 0x0040, lo: 0xb4, hi: 0xb5},
{value: 0x0018, lo: 0xb6, hi: 0xbf},
- // Block 0x53, offset 0x2d8
+ // Block 0x52, offset 0x2bd
{value: 0x0000, lo: 0x05},
{value: 0x0018, lo: 0x80, hi: 0x95},
{value: 0x0040, lo: 0x96, hi: 0x97},
{value: 0x0018, lo: 0x98, hi: 0xb9},
{value: 0x0040, lo: 0xba, hi: 0xbc},
{value: 0x0018, lo: 0xbd, hi: 0xbf},
- // Block 0x54, offset 0x2de
+ // Block 0x53, offset 0x2c3
{value: 0x0000, lo: 0x06},
{value: 0x0018, lo: 0x80, hi: 0x88},
{value: 0x0040, lo: 0x89, hi: 0x89},
- {value: 0x0018, lo: 0x8a, hi: 0x91},
- {value: 0x0040, lo: 0x92, hi: 0xab},
+ {value: 0x0018, lo: 0x8a, hi: 0x92},
+ {value: 0x0040, lo: 0x93, hi: 0xab},
{value: 0x0018, lo: 0xac, hi: 0xaf},
{value: 0x0040, lo: 0xb0, hi: 0xbf},
- // Block 0x55, offset 0x2e5
+ // Block 0x54, offset 0x2ca
{value: 0x0000, lo: 0x05},
{value: 0xe185, lo: 0x80, hi: 0x8f},
{value: 0x03f5, lo: 0x90, hi: 0x9f},
{value: 0x0ea5, lo: 0xa0, hi: 0xae},
{value: 0x0040, lo: 0xaf, hi: 0xaf},
{value: 0x0008, lo: 0xb0, hi: 0xbf},
- // Block 0x56, offset 0x2eb
+ // Block 0x55, offset 0x2d0
{value: 0x0000, lo: 0x07},
{value: 0x0008, lo: 0x80, hi: 0xa5},
{value: 0x0040, lo: 0xa6, hi: 0xa6},
@@ -3182,15 +3187,15 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0008, lo: 0xad, hi: 0xad},
{value: 0x0040, lo: 0xae, hi: 0xaf},
{value: 0x0008, lo: 0xb0, hi: 0xbf},
- // Block 0x57, offset 0x2f3
+ // Block 0x56, offset 0x2d8
{value: 0x0000, lo: 0x06},
{value: 0x0008, lo: 0x80, hi: 0xa7},
{value: 0x0040, lo: 0xa8, hi: 0xae},
{value: 0xe075, lo: 0xaf, hi: 0xaf},
{value: 0x0018, lo: 0xb0, hi: 0xb0},
{value: 0x0040, lo: 0xb1, hi: 0xbe},
- {value: 0x1b08, lo: 0xbf, hi: 0xbf},
- // Block 0x58, offset 0x2fa
+ {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+ // Block 0x57, offset 0x2df
{value: 0x0000, lo: 0x0a},
{value: 0x0008, lo: 0x80, hi: 0x96},
{value: 0x0040, lo: 0x97, hi: 0x9f},
@@ -3202,7 +3207,7 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0040, lo: 0xb7, hi: 0xb7},
{value: 0x0008, lo: 0xb8, hi: 0xbe},
{value: 0x0040, lo: 0xbf, hi: 0xbf},
- // Block 0x59, offset 0x305
+ // Block 0x58, offset 0x2ea
{value: 0x0000, lo: 0x09},
{value: 0x0008, lo: 0x80, hi: 0x86},
{value: 0x0040, lo: 0x87, hi: 0x87},
@@ -3212,62 +3217,62 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0040, lo: 0x97, hi: 0x97},
{value: 0x0008, lo: 0x98, hi: 0x9e},
{value: 0x0040, lo: 0x9f, hi: 0x9f},
- {value: 0x1308, lo: 0xa0, hi: 0xbf},
- // Block 0x5a, offset 0x30f
+ {value: 0x3308, lo: 0xa0, hi: 0xbf},
+ // Block 0x59, offset 0x2f4
{value: 0x0000, lo: 0x03},
{value: 0x0018, lo: 0x80, hi: 0xae},
{value: 0x0008, lo: 0xaf, hi: 0xaf},
{value: 0x0018, lo: 0xb0, hi: 0xbf},
- // Block 0x5b, offset 0x313
+ // Block 0x5a, offset 0x2f8
{value: 0x0000, lo: 0x02},
- {value: 0x0018, lo: 0x80, hi: 0x84},
- {value: 0x0040, lo: 0x85, hi: 0xbf},
- // Block 0x5c, offset 0x316
+ {value: 0x0018, lo: 0x80, hi: 0x89},
+ {value: 0x0040, lo: 0x8a, hi: 0xbf},
+ // Block 0x5b, offset 0x2fb
{value: 0x0000, lo: 0x05},
{value: 0x0018, lo: 0x80, hi: 0x99},
{value: 0x0040, lo: 0x9a, hi: 0x9a},
{value: 0x0018, lo: 0x9b, hi: 0x9e},
{value: 0x0edd, lo: 0x9f, hi: 0x9f},
{value: 0x0018, lo: 0xa0, hi: 0xbf},
- // Block 0x5d, offset 0x31c
+ // Block 0x5c, offset 0x301
{value: 0x0000, lo: 0x03},
{value: 0x0018, lo: 0x80, hi: 0xb2},
{value: 0x0efd, lo: 0xb3, hi: 0xb3},
{value: 0x0040, lo: 0xb4, hi: 0xbf},
- // Block 0x5e, offset 0x320
+ // Block 0x5d, offset 0x305
{value: 0x0020, lo: 0x01},
{value: 0x0f1d, lo: 0x80, hi: 0xbf},
- // Block 0x5f, offset 0x322
+ // Block 0x5e, offset 0x307
{value: 0x0020, lo: 0x02},
{value: 0x171d, lo: 0x80, hi: 0x8f},
{value: 0x18fd, lo: 0x90, hi: 0xbf},
- // Block 0x60, offset 0x325
+ // Block 0x5f, offset 0x30a
{value: 0x0020, lo: 0x01},
{value: 0x1efd, lo: 0x80, hi: 0xbf},
- // Block 0x61, offset 0x327
+ // Block 0x60, offset 0x30c
{value: 0x0000, lo: 0x02},
{value: 0x0040, lo: 0x80, hi: 0x80},
{value: 0x0008, lo: 0x81, hi: 0xbf},
- // Block 0x62, offset 0x32a
+ // Block 0x61, offset 0x30f
{value: 0x0000, lo: 0x09},
{value: 0x0008, lo: 0x80, hi: 0x96},
{value: 0x0040, lo: 0x97, hi: 0x98},
- {value: 0x1308, lo: 0x99, hi: 0x9a},
+ {value: 0x3308, lo: 0x99, hi: 0x9a},
{value: 0x29e2, lo: 0x9b, hi: 0x9b},
{value: 0x2a0a, lo: 0x9c, hi: 0x9c},
{value: 0x0008, lo: 0x9d, hi: 0x9e},
{value: 0x2a31, lo: 0x9f, hi: 0x9f},
{value: 0x0018, lo: 0xa0, hi: 0xa0},
{value: 0x0008, lo: 0xa1, hi: 0xbf},
- // Block 0x63, offset 0x334
+ // Block 0x62, offset 0x319
{value: 0x0000, lo: 0x02},
{value: 0x0008, lo: 0x80, hi: 0xbe},
{value: 0x2a69, lo: 0xbf, hi: 0xbf},
- // Block 0x64, offset 0x337
+ // Block 0x63, offset 0x31c
{value: 0x0000, lo: 0x0e},
{value: 0x0040, lo: 0x80, hi: 0x84},
- {value: 0x0008, lo: 0x85, hi: 0xad},
- {value: 0x0040, lo: 0xae, hi: 0xb0},
+ {value: 0x0008, lo: 0x85, hi: 0xae},
+ {value: 0x0040, lo: 0xaf, hi: 0xb0},
{value: 0x2a1d, lo: 0xb1, hi: 0xb1},
{value: 0x2a3d, lo: 0xb2, hi: 0xb2},
{value: 0x2a5d, lo: 0xb3, hi: 0xb3},
@@ -3279,150 +3284,150 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x2afd, lo: 0xba, hi: 0xbb},
{value: 0x2b1d, lo: 0xbc, hi: 0xbd},
{value: 0x2afd, lo: 0xbe, hi: 0xbf},
- // Block 0x65, offset 0x346
+ // Block 0x64, offset 0x32b
{value: 0x0000, lo: 0x03},
{value: 0x0018, lo: 0x80, hi: 0xa3},
{value: 0x0040, lo: 0xa4, hi: 0xaf},
{value: 0x0008, lo: 0xb0, hi: 0xbf},
- // Block 0x66, offset 0x34a
+ // Block 0x65, offset 0x32f
{value: 0x0030, lo: 0x04},
{value: 0x2aa2, lo: 0x80, hi: 0x9d},
{value: 0x305a, lo: 0x9e, hi: 0x9e},
{value: 0x0040, lo: 0x9f, hi: 0x9f},
{value: 0x30a2, lo: 0xa0, hi: 0xbf},
- // Block 0x67, offset 0x34f
+ // Block 0x66, offset 0x334
{value: 0x0000, lo: 0x02},
- {value: 0x0008, lo: 0x80, hi: 0x95},
- {value: 0x0040, lo: 0x96, hi: 0xbf},
- // Block 0x68, offset 0x352
+ {value: 0x0008, lo: 0x80, hi: 0xaa},
+ {value: 0x0040, lo: 0xab, hi: 0xbf},
+ // Block 0x67, offset 0x337
{value: 0x0000, lo: 0x03},
{value: 0x0008, lo: 0x80, hi: 0x8c},
{value: 0x0040, lo: 0x8d, hi: 0x8f},
{value: 0x0018, lo: 0x90, hi: 0xbf},
- // Block 0x69, offset 0x356
+ // Block 0x68, offset 0x33b
{value: 0x0000, lo: 0x04},
{value: 0x0018, lo: 0x80, hi: 0x86},
{value: 0x0040, lo: 0x87, hi: 0x8f},
{value: 0x0008, lo: 0x90, hi: 0xbd},
{value: 0x0018, lo: 0xbe, hi: 0xbf},
- // Block 0x6a, offset 0x35b
+ // Block 0x69, offset 0x340
{value: 0x0000, lo: 0x04},
{value: 0x0008, lo: 0x80, hi: 0x8c},
{value: 0x0018, lo: 0x8d, hi: 0x8f},
{value: 0x0008, lo: 0x90, hi: 0xab},
{value: 0x0040, lo: 0xac, hi: 0xbf},
- // Block 0x6b, offset 0x360
+ // Block 0x6a, offset 0x345
{value: 0x0000, lo: 0x05},
{value: 0x0008, lo: 0x80, hi: 0xa5},
{value: 0x0018, lo: 0xa6, hi: 0xaf},
- {value: 0x1308, lo: 0xb0, hi: 0xb1},
+ {value: 0x3308, lo: 0xb0, hi: 0xb1},
{value: 0x0018, lo: 0xb2, hi: 0xb7},
{value: 0x0040, lo: 0xb8, hi: 0xbf},
- // Block 0x6c, offset 0x366
+ // Block 0x6b, offset 0x34b
{value: 0x0000, lo: 0x05},
{value: 0x0040, lo: 0x80, hi: 0xb6},
{value: 0x0008, lo: 0xb7, hi: 0xb7},
{value: 0x2009, lo: 0xb8, hi: 0xb8},
{value: 0x6e89, lo: 0xb9, hi: 0xb9},
{value: 0x0008, lo: 0xba, hi: 0xbf},
- // Block 0x6d, offset 0x36c
+ // Block 0x6c, offset 0x351
{value: 0x0000, lo: 0x0e},
{value: 0x0008, lo: 0x80, hi: 0x81},
- {value: 0x1308, lo: 0x82, hi: 0x82},
+ {value: 0x3308, lo: 0x82, hi: 0x82},
{value: 0x0008, lo: 0x83, hi: 0x85},
- {value: 0x1b08, lo: 0x86, hi: 0x86},
+ {value: 0x3b08, lo: 0x86, hi: 0x86},
{value: 0x0008, lo: 0x87, hi: 0x8a},
- {value: 0x1308, lo: 0x8b, hi: 0x8b},
+ {value: 0x3308, lo: 0x8b, hi: 0x8b},
{value: 0x0008, lo: 0x8c, hi: 0xa2},
- {value: 0x1008, lo: 0xa3, hi: 0xa4},
- {value: 0x1308, lo: 0xa5, hi: 0xa6},
- {value: 0x1008, lo: 0xa7, hi: 0xa7},
+ {value: 0x3008, lo: 0xa3, hi: 0xa4},
+ {value: 0x3308, lo: 0xa5, hi: 0xa6},
+ {value: 0x3008, lo: 0xa7, hi: 0xa7},
{value: 0x0018, lo: 0xa8, hi: 0xab},
{value: 0x0040, lo: 0xac, hi: 0xaf},
{value: 0x0018, lo: 0xb0, hi: 0xb9},
{value: 0x0040, lo: 0xba, hi: 0xbf},
- // Block 0x6e, offset 0x37b
+ // Block 0x6d, offset 0x360
{value: 0x0000, lo: 0x05},
{value: 0x0208, lo: 0x80, hi: 0xb1},
{value: 0x0108, lo: 0xb2, hi: 0xb2},
{value: 0x0008, lo: 0xb3, hi: 0xb3},
{value: 0x0018, lo: 0xb4, hi: 0xb7},
{value: 0x0040, lo: 0xb8, hi: 0xbf},
- // Block 0x6f, offset 0x381
+ // Block 0x6e, offset 0x366
{value: 0x0000, lo: 0x03},
- {value: 0x1008, lo: 0x80, hi: 0x81},
+ {value: 0x3008, lo: 0x80, hi: 0x81},
{value: 0x0008, lo: 0x82, hi: 0xb3},
- {value: 0x1008, lo: 0xb4, hi: 0xbf},
- // Block 0x70, offset 0x385
+ {value: 0x3008, lo: 0xb4, hi: 0xbf},
+ // Block 0x6f, offset 0x36a
{value: 0x0000, lo: 0x0e},
- {value: 0x1008, lo: 0x80, hi: 0x83},
- {value: 0x1b08, lo: 0x84, hi: 0x84},
- {value: 0x1308, lo: 0x85, hi: 0x85},
+ {value: 0x3008, lo: 0x80, hi: 0x83},
+ {value: 0x3b08, lo: 0x84, hi: 0x84},
+ {value: 0x3308, lo: 0x85, hi: 0x85},
{value: 0x0040, lo: 0x86, hi: 0x8d},
{value: 0x0018, lo: 0x8e, hi: 0x8f},
{value: 0x0008, lo: 0x90, hi: 0x99},
{value: 0x0040, lo: 0x9a, hi: 0x9f},
- {value: 0x1308, lo: 0xa0, hi: 0xb1},
+ {value: 0x3308, lo: 0xa0, hi: 0xb1},
{value: 0x0008, lo: 0xb2, hi: 0xb7},
{value: 0x0018, lo: 0xb8, hi: 0xba},
{value: 0x0008, lo: 0xbb, hi: 0xbb},
{value: 0x0018, lo: 0xbc, hi: 0xbc},
{value: 0x0008, lo: 0xbd, hi: 0xbd},
{value: 0x0040, lo: 0xbe, hi: 0xbf},
- // Block 0x71, offset 0x394
+ // Block 0x70, offset 0x379
{value: 0x0000, lo: 0x04},
{value: 0x0008, lo: 0x80, hi: 0xa5},
- {value: 0x1308, lo: 0xa6, hi: 0xad},
+ {value: 0x3308, lo: 0xa6, hi: 0xad},
{value: 0x0018, lo: 0xae, hi: 0xaf},
{value: 0x0008, lo: 0xb0, hi: 0xbf},
- // Block 0x72, offset 0x399
+ // Block 0x71, offset 0x37e
{value: 0x0000, lo: 0x07},
{value: 0x0008, lo: 0x80, hi: 0x86},
- {value: 0x1308, lo: 0x87, hi: 0x91},
- {value: 0x1008, lo: 0x92, hi: 0x92},
- {value: 0x1808, lo: 0x93, hi: 0x93},
+ {value: 0x3308, lo: 0x87, hi: 0x91},
+ {value: 0x3008, lo: 0x92, hi: 0x92},
+ {value: 0x3808, lo: 0x93, hi: 0x93},
{value: 0x0040, lo: 0x94, hi: 0x9e},
{value: 0x0018, lo: 0x9f, hi: 0xbc},
{value: 0x0040, lo: 0xbd, hi: 0xbf},
- // Block 0x73, offset 0x3a1
+ // Block 0x72, offset 0x386
{value: 0x0000, lo: 0x09},
- {value: 0x1308, lo: 0x80, hi: 0x82},
- {value: 0x1008, lo: 0x83, hi: 0x83},
+ {value: 0x3308, lo: 0x80, hi: 0x82},
+ {value: 0x3008, lo: 0x83, hi: 0x83},
{value: 0x0008, lo: 0x84, hi: 0xb2},
- {value: 0x1308, lo: 0xb3, hi: 0xb3},
- {value: 0x1008, lo: 0xb4, hi: 0xb5},
- {value: 0x1308, lo: 0xb6, hi: 0xb9},
- {value: 0x1008, lo: 0xba, hi: 0xbb},
- {value: 0x1308, lo: 0xbc, hi: 0xbc},
- {value: 0x1008, lo: 0xbd, hi: 0xbf},
- // Block 0x74, offset 0x3ab
+ {value: 0x3308, lo: 0xb3, hi: 0xb3},
+ {value: 0x3008, lo: 0xb4, hi: 0xb5},
+ {value: 0x3308, lo: 0xb6, hi: 0xb9},
+ {value: 0x3008, lo: 0xba, hi: 0xbb},
+ {value: 0x3308, lo: 0xbc, hi: 0xbc},
+ {value: 0x3008, lo: 0xbd, hi: 0xbf},
+ // Block 0x73, offset 0x390
{value: 0x0000, lo: 0x0a},
- {value: 0x1808, lo: 0x80, hi: 0x80},
+ {value: 0x3808, lo: 0x80, hi: 0x80},
{value: 0x0018, lo: 0x81, hi: 0x8d},
{value: 0x0040, lo: 0x8e, hi: 0x8e},
{value: 0x0008, lo: 0x8f, hi: 0x99},
{value: 0x0040, lo: 0x9a, hi: 0x9d},
{value: 0x0018, lo: 0x9e, hi: 0x9f},
{value: 0x0008, lo: 0xa0, hi: 0xa4},
- {value: 0x1308, lo: 0xa5, hi: 0xa5},
+ {value: 0x3308, lo: 0xa5, hi: 0xa5},
{value: 0x0008, lo: 0xa6, hi: 0xbe},
{value: 0x0040, lo: 0xbf, hi: 0xbf},
- // Block 0x75, offset 0x3b6
+ // Block 0x74, offset 0x39b
{value: 0x0000, lo: 0x07},
{value: 0x0008, lo: 0x80, hi: 0xa8},
- {value: 0x1308, lo: 0xa9, hi: 0xae},
- {value: 0x1008, lo: 0xaf, hi: 0xb0},
- {value: 0x1308, lo: 0xb1, hi: 0xb2},
- {value: 0x1008, lo: 0xb3, hi: 0xb4},
- {value: 0x1308, lo: 0xb5, hi: 0xb6},
+ {value: 0x3308, lo: 0xa9, hi: 0xae},
+ {value: 0x3008, lo: 0xaf, hi: 0xb0},
+ {value: 0x3308, lo: 0xb1, hi: 0xb2},
+ {value: 0x3008, lo: 0xb3, hi: 0xb4},
+ {value: 0x3308, lo: 0xb5, hi: 0xb6},
{value: 0x0040, lo: 0xb7, hi: 0xbf},
- // Block 0x76, offset 0x3be
+ // Block 0x75, offset 0x3a3
{value: 0x0000, lo: 0x10},
{value: 0x0008, lo: 0x80, hi: 0x82},
- {value: 0x1308, lo: 0x83, hi: 0x83},
+ {value: 0x3308, lo: 0x83, hi: 0x83},
{value: 0x0008, lo: 0x84, hi: 0x8b},
- {value: 0x1308, lo: 0x8c, hi: 0x8c},
- {value: 0x1008, lo: 0x8d, hi: 0x8d},
+ {value: 0x3308, lo: 0x8c, hi: 0x8c},
+ {value: 0x3008, lo: 0x8d, hi: 0x8d},
{value: 0x0040, lo: 0x8e, hi: 0x8f},
{value: 0x0008, lo: 0x90, hi: 0x99},
{value: 0x0040, lo: 0x9a, hi: 0x9b},
@@ -3430,38 +3435,38 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0008, lo: 0xa0, hi: 0xb6},
{value: 0x0018, lo: 0xb7, hi: 0xb9},
{value: 0x0008, lo: 0xba, hi: 0xba},
- {value: 0x1008, lo: 0xbb, hi: 0xbb},
- {value: 0x1308, lo: 0xbc, hi: 0xbc},
- {value: 0x1008, lo: 0xbd, hi: 0xbd},
+ {value: 0x3008, lo: 0xbb, hi: 0xbb},
+ {value: 0x3308, lo: 0xbc, hi: 0xbc},
+ {value: 0x3008, lo: 0xbd, hi: 0xbd},
{value: 0x0008, lo: 0xbe, hi: 0xbf},
- // Block 0x77, offset 0x3cf
+ // Block 0x76, offset 0x3b4
{value: 0x0000, lo: 0x08},
{value: 0x0008, lo: 0x80, hi: 0xaf},
- {value: 0x1308, lo: 0xb0, hi: 0xb0},
+ {value: 0x3308, lo: 0xb0, hi: 0xb0},
{value: 0x0008, lo: 0xb1, hi: 0xb1},
- {value: 0x1308, lo: 0xb2, hi: 0xb4},
+ {value: 0x3308, lo: 0xb2, hi: 0xb4},
{value: 0x0008, lo: 0xb5, hi: 0xb6},
- {value: 0x1308, lo: 0xb7, hi: 0xb8},
+ {value: 0x3308, lo: 0xb7, hi: 0xb8},
{value: 0x0008, lo: 0xb9, hi: 0xbd},
- {value: 0x1308, lo: 0xbe, hi: 0xbf},
- // Block 0x78, offset 0x3d8
+ {value: 0x3308, lo: 0xbe, hi: 0xbf},
+ // Block 0x77, offset 0x3bd
{value: 0x0000, lo: 0x0f},
{value: 0x0008, lo: 0x80, hi: 0x80},
- {value: 0x1308, lo: 0x81, hi: 0x81},
+ {value: 0x3308, lo: 0x81, hi: 0x81},
{value: 0x0008, lo: 0x82, hi: 0x82},
{value: 0x0040, lo: 0x83, hi: 0x9a},
{value: 0x0008, lo: 0x9b, hi: 0x9d},
{value: 0x0018, lo: 0x9e, hi: 0x9f},
{value: 0x0008, lo: 0xa0, hi: 0xaa},
- {value: 0x1008, lo: 0xab, hi: 0xab},
- {value: 0x1308, lo: 0xac, hi: 0xad},
- {value: 0x1008, lo: 0xae, hi: 0xaf},
+ {value: 0x3008, lo: 0xab, hi: 0xab},
+ {value: 0x3308, lo: 0xac, hi: 0xad},
+ {value: 0x3008, lo: 0xae, hi: 0xaf},
{value: 0x0018, lo: 0xb0, hi: 0xb1},
{value: 0x0008, lo: 0xb2, hi: 0xb4},
- {value: 0x1008, lo: 0xb5, hi: 0xb5},
- {value: 0x1b08, lo: 0xb6, hi: 0xb6},
+ {value: 0x3008, lo: 0xb5, hi: 0xb5},
+ {value: 0x3b08, lo: 0xb6, hi: 0xb6},
{value: 0x0040, lo: 0xb7, hi: 0xbf},
- // Block 0x79, offset 0x3e8
+ // Block 0x78, offset 0x3cd
{value: 0x0000, lo: 0x0c},
{value: 0x0040, lo: 0x80, hi: 0x80},
{value: 0x0008, lo: 0x81, hi: 0x86},
@@ -3475,7 +3480,7 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0008, lo: 0xa8, hi: 0xae},
{value: 0x0040, lo: 0xaf, hi: 0xaf},
{value: 0x0008, lo: 0xb0, hi: 0xbf},
- // Block 0x7a, offset 0x3f5
+ // Block 0x79, offset 0x3da
{value: 0x0000, lo: 0x09},
{value: 0x0008, lo: 0x80, hi: 0x9a},
{value: 0x0018, lo: 0x9b, hi: 0x9b},
@@ -3486,54 +3491,54 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0008, lo: 0xa0, hi: 0xa5},
{value: 0x0040, lo: 0xa6, hi: 0xaf},
{value: 0x4495, lo: 0xb0, hi: 0xbf},
- // Block 0x7b, offset 0x3ff
+ // Block 0x7a, offset 0x3e4
{value: 0x0000, lo: 0x04},
{value: 0x44b5, lo: 0x80, hi: 0x8f},
{value: 0x44d5, lo: 0x90, hi: 0x9f},
{value: 0x44f5, lo: 0xa0, hi: 0xaf},
{value: 0x44d5, lo: 0xb0, hi: 0xbf},
- // Block 0x7c, offset 0x404
+ // Block 0x7b, offset 0x3e9
{value: 0x0000, lo: 0x0c},
{value: 0x0008, lo: 0x80, hi: 0xa2},
- {value: 0x1008, lo: 0xa3, hi: 0xa4},
- {value: 0x1308, lo: 0xa5, hi: 0xa5},
- {value: 0x1008, lo: 0xa6, hi: 0xa7},
- {value: 0x1308, lo: 0xa8, hi: 0xa8},
- {value: 0x1008, lo: 0xa9, hi: 0xaa},
+ {value: 0x3008, lo: 0xa3, hi: 0xa4},
+ {value: 0x3308, lo: 0xa5, hi: 0xa5},
+ {value: 0x3008, lo: 0xa6, hi: 0xa7},
+ {value: 0x3308, lo: 0xa8, hi: 0xa8},
+ {value: 0x3008, lo: 0xa9, hi: 0xaa},
{value: 0x0018, lo: 0xab, hi: 0xab},
- {value: 0x1008, lo: 0xac, hi: 0xac},
- {value: 0x1b08, lo: 0xad, hi: 0xad},
+ {value: 0x3008, lo: 0xac, hi: 0xac},
+ {value: 0x3b08, lo: 0xad, hi: 0xad},
{value: 0x0040, lo: 0xae, hi: 0xaf},
{value: 0x0008, lo: 0xb0, hi: 0xb9},
{value: 0x0040, lo: 0xba, hi: 0xbf},
- // Block 0x7d, offset 0x411
+ // Block 0x7c, offset 0x3f6
{value: 0x0000, lo: 0x03},
{value: 0x0008, lo: 0x80, hi: 0xa3},
{value: 0x0040, lo: 0xa4, hi: 0xaf},
{value: 0x0018, lo: 0xb0, hi: 0xbf},
- // Block 0x7e, offset 0x415
+ // Block 0x7d, offset 0x3fa
{value: 0x0000, lo: 0x04},
{value: 0x0018, lo: 0x80, hi: 0x86},
{value: 0x0040, lo: 0x87, hi: 0x8a},
{value: 0x0018, lo: 0x8b, hi: 0xbb},
{value: 0x0040, lo: 0xbc, hi: 0xbf},
- // Block 0x7f, offset 0x41a
+ // Block 0x7e, offset 0x3ff
{value: 0x0020, lo: 0x01},
{value: 0x4515, lo: 0x80, hi: 0xbf},
- // Block 0x80, offset 0x41c
+ // Block 0x7f, offset 0x401
{value: 0x0020, lo: 0x03},
{value: 0x4d15, lo: 0x80, hi: 0x94},
{value: 0x4ad5, lo: 0x95, hi: 0x95},
{value: 0x4fb5, lo: 0x96, hi: 0xbf},
- // Block 0x81, offset 0x420
+ // Block 0x80, offset 0x405
{value: 0x0020, lo: 0x01},
{value: 0x54f5, lo: 0x80, hi: 0xbf},
- // Block 0x82, offset 0x422
+ // Block 0x81, offset 0x407
{value: 0x0020, lo: 0x03},
{value: 0x5cf5, lo: 0x80, hi: 0x84},
{value: 0x5655, lo: 0x85, hi: 0x85},
{value: 0x5d95, lo: 0x86, hi: 0xbf},
- // Block 0x83, offset 0x426
+ // Block 0x82, offset 0x40b
{value: 0x0020, lo: 0x08},
{value: 0x6b55, lo: 0x80, hi: 0x8f},
{value: 0x6d15, lo: 0x90, hi: 0x90},
@@ -3543,19 +3548,19 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0040, lo: 0xae, hi: 0xae},
{value: 0x0040, lo: 0xaf, hi: 0xaf},
{value: 0x70d5, lo: 0xb0, hi: 0xbf},
- // Block 0x84, offset 0x42f
+ // Block 0x83, offset 0x414
{value: 0x0020, lo: 0x05},
{value: 0x72d5, lo: 0x80, hi: 0xad},
{value: 0x6535, lo: 0xae, hi: 0xae},
{value: 0x7895, lo: 0xaf, hi: 0xb5},
{value: 0x6f55, lo: 0xb6, hi: 0xb6},
{value: 0x7975, lo: 0xb7, hi: 0xbf},
- // Block 0x85, offset 0x435
+ // Block 0x84, offset 0x41a
{value: 0x0028, lo: 0x03},
{value: 0x7c21, lo: 0x80, hi: 0x82},
{value: 0x7be1, lo: 0x83, hi: 0x83},
{value: 0x7c99, lo: 0x84, hi: 0xbf},
- // Block 0x86, offset 0x439
+ // Block 0x85, offset 0x41e
{value: 0x0038, lo: 0x0f},
{value: 0x9db1, lo: 0x80, hi: 0x83},
{value: 0x9e59, lo: 0x84, hi: 0x85},
@@ -3572,7 +3577,7 @@ var idnaSparseValues = [1876]valueRange{
{value: 0xa869, lo: 0xbc, hi: 0xbc},
{value: 0xa7f9, lo: 0xbd, hi: 0xbd},
{value: 0xa8d9, lo: 0xbe, hi: 0xbf},
- // Block 0x87, offset 0x449
+ // Block 0x86, offset 0x42e
{value: 0x0000, lo: 0x09},
{value: 0x0008, lo: 0x80, hi: 0x8b},
{value: 0x0040, lo: 0x8c, hi: 0x8c},
@@ -3583,24 +3588,24 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0008, lo: 0xbc, hi: 0xbd},
{value: 0x0040, lo: 0xbe, hi: 0xbe},
{value: 0x0008, lo: 0xbf, hi: 0xbf},
- // Block 0x88, offset 0x453
+ // Block 0x87, offset 0x438
{value: 0x0000, lo: 0x04},
{value: 0x0008, lo: 0x80, hi: 0x8d},
{value: 0x0040, lo: 0x8e, hi: 0x8f},
{value: 0x0008, lo: 0x90, hi: 0x9d},
{value: 0x0040, lo: 0x9e, hi: 0xbf},
- // Block 0x89, offset 0x458
+ // Block 0x88, offset 0x43d
{value: 0x0000, lo: 0x02},
{value: 0x0008, lo: 0x80, hi: 0xba},
{value: 0x0040, lo: 0xbb, hi: 0xbf},
- // Block 0x8a, offset 0x45b
+ // Block 0x89, offset 0x440
{value: 0x0000, lo: 0x05},
{value: 0x0018, lo: 0x80, hi: 0x82},
{value: 0x0040, lo: 0x83, hi: 0x86},
{value: 0x0018, lo: 0x87, hi: 0xb3},
{value: 0x0040, lo: 0xb4, hi: 0xb6},
{value: 0x0018, lo: 0xb7, hi: 0xbf},
- // Block 0x8b, offset 0x461
+ // Block 0x8a, offset 0x446
{value: 0x0000, lo: 0x06},
{value: 0x0018, lo: 0x80, hi: 0x8e},
{value: 0x0040, lo: 0x8f, hi: 0x8f},
@@ -3608,31 +3613,31 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0040, lo: 0x9c, hi: 0x9f},
{value: 0x0018, lo: 0xa0, hi: 0xa0},
{value: 0x0040, lo: 0xa1, hi: 0xbf},
- // Block 0x8c, offset 0x468
+ // Block 0x8b, offset 0x44d
{value: 0x0000, lo: 0x04},
{value: 0x0040, lo: 0x80, hi: 0x8f},
{value: 0x0018, lo: 0x90, hi: 0xbc},
- {value: 0x1308, lo: 0xbd, hi: 0xbd},
+ {value: 0x3308, lo: 0xbd, hi: 0xbd},
{value: 0x0040, lo: 0xbe, hi: 0xbf},
- // Block 0x8d, offset 0x46d
+ // Block 0x8c, offset 0x452
{value: 0x0000, lo: 0x03},
{value: 0x0008, lo: 0x80, hi: 0x9c},
{value: 0x0040, lo: 0x9d, hi: 0x9f},
{value: 0x0008, lo: 0xa0, hi: 0xbf},
- // Block 0x8e, offset 0x471
+ // Block 0x8d, offset 0x456
{value: 0x0000, lo: 0x05},
{value: 0x0008, lo: 0x80, hi: 0x90},
{value: 0x0040, lo: 0x91, hi: 0x9f},
- {value: 0x1308, lo: 0xa0, hi: 0xa0},
+ {value: 0x3308, lo: 0xa0, hi: 0xa0},
{value: 0x0018, lo: 0xa1, hi: 0xbb},
{value: 0x0040, lo: 0xbc, hi: 0xbf},
- // Block 0x8f, offset 0x477
+ // Block 0x8e, offset 0x45c
{value: 0x0000, lo: 0x04},
{value: 0x0008, lo: 0x80, hi: 0x9f},
{value: 0x0018, lo: 0xa0, hi: 0xa3},
- {value: 0x0040, lo: 0xa4, hi: 0xaf},
- {value: 0x0008, lo: 0xb0, hi: 0xbf},
- // Block 0x90, offset 0x47c
+ {value: 0x0040, lo: 0xa4, hi: 0xac},
+ {value: 0x0008, lo: 0xad, hi: 0xbf},
+ // Block 0x8f, offset 0x461
{value: 0x0000, lo: 0x08},
{value: 0x0008, lo: 0x80, hi: 0x80},
{value: 0x0018, lo: 0x81, hi: 0x81},
@@ -3640,22 +3645,22 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0018, lo: 0x8a, hi: 0x8a},
{value: 0x0040, lo: 0x8b, hi: 0x8f},
{value: 0x0008, lo: 0x90, hi: 0xb5},
- {value: 0x1308, lo: 0xb6, hi: 0xba},
+ {value: 0x3308, lo: 0xb6, hi: 0xba},
{value: 0x0040, lo: 0xbb, hi: 0xbf},
- // Block 0x91, offset 0x485
+ // Block 0x90, offset 0x46a
{value: 0x0000, lo: 0x04},
{value: 0x0008, lo: 0x80, hi: 0x9d},
{value: 0x0040, lo: 0x9e, hi: 0x9e},
{value: 0x0018, lo: 0x9f, hi: 0x9f},
{value: 0x0008, lo: 0xa0, hi: 0xbf},
- // Block 0x92, offset 0x48a
+ // Block 0x91, offset 0x46f
{value: 0x0000, lo: 0x05},
{value: 0x0008, lo: 0x80, hi: 0x83},
{value: 0x0040, lo: 0x84, hi: 0x87},
{value: 0x0008, lo: 0x88, hi: 0x8f},
{value: 0x0018, lo: 0x90, hi: 0x95},
{value: 0x0040, lo: 0x96, hi: 0xbf},
- // Block 0x93, offset 0x490
+ // Block 0x92, offset 0x475
{value: 0x0000, lo: 0x06},
{value: 0xe145, lo: 0x80, hi: 0x87},
{value: 0xe1c5, lo: 0x88, hi: 0x8f},
@@ -3663,7 +3668,7 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x8ad5, lo: 0x98, hi: 0x9f},
{value: 0x8aed, lo: 0xa0, hi: 0xa7},
{value: 0x0008, lo: 0xa8, hi: 0xbf},
- // Block 0x94, offset 0x497
+ // Block 0x93, offset 0x47c
{value: 0x0000, lo: 0x06},
{value: 0x0008, lo: 0x80, hi: 0x9d},
{value: 0x0040, lo: 0x9e, hi: 0x9f},
@@ -3671,7 +3676,7 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0040, lo: 0xaa, hi: 0xaf},
{value: 0x8aed, lo: 0xb0, hi: 0xb7},
{value: 0x8ad5, lo: 0xb8, hi: 0xbf},
- // Block 0x95, offset 0x49e
+ // Block 0x94, offset 0x483
{value: 0x0000, lo: 0x06},
{value: 0xe145, lo: 0x80, hi: 0x87},
{value: 0xe1c5, lo: 0x88, hi: 0x8f},
@@ -3679,173 +3684,176 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0040, lo: 0x94, hi: 0x97},
{value: 0x0008, lo: 0x98, hi: 0xbb},
{value: 0x0040, lo: 0xbc, hi: 0xbf},
- // Block 0x96, offset 0x4a5
+ // Block 0x95, offset 0x48a
{value: 0x0000, lo: 0x03},
{value: 0x0008, lo: 0x80, hi: 0xa7},
{value: 0x0040, lo: 0xa8, hi: 0xaf},
{value: 0x0008, lo: 0xb0, hi: 0xbf},
- // Block 0x97, offset 0x4a9
+ // Block 0x96, offset 0x48e
{value: 0x0000, lo: 0x04},
{value: 0x0008, lo: 0x80, hi: 0xa3},
{value: 0x0040, lo: 0xa4, hi: 0xae},
{value: 0x0018, lo: 0xaf, hi: 0xaf},
{value: 0x0040, lo: 0xb0, hi: 0xbf},
- // Block 0x98, offset 0x4ae
+ // Block 0x97, offset 0x493
{value: 0x0000, lo: 0x02},
{value: 0x0008, lo: 0x80, hi: 0xb6},
{value: 0x0040, lo: 0xb7, hi: 0xbf},
- // Block 0x99, offset 0x4b1
+ // Block 0x98, offset 0x496
{value: 0x0000, lo: 0x04},
{value: 0x0008, lo: 0x80, hi: 0x95},
{value: 0x0040, lo: 0x96, hi: 0x9f},
{value: 0x0008, lo: 0xa0, hi: 0xa7},
{value: 0x0040, lo: 0xa8, hi: 0xbf},
- // Block 0x9a, offset 0x4b6
+ // Block 0x99, offset 0x49b
{value: 0x0000, lo: 0x0b},
- {value: 0x0008, lo: 0x80, hi: 0x85},
+ {value: 0x0808, lo: 0x80, hi: 0x85},
{value: 0x0040, lo: 0x86, hi: 0x87},
- {value: 0x0008, lo: 0x88, hi: 0x88},
+ {value: 0x0808, lo: 0x88, hi: 0x88},
{value: 0x0040, lo: 0x89, hi: 0x89},
- {value: 0x0008, lo: 0x8a, hi: 0xb5},
+ {value: 0x0808, lo: 0x8a, hi: 0xb5},
{value: 0x0040, lo: 0xb6, hi: 0xb6},
- {value: 0x0008, lo: 0xb7, hi: 0xb8},
+ {value: 0x0808, lo: 0xb7, hi: 0xb8},
{value: 0x0040, lo: 0xb9, hi: 0xbb},
- {value: 0x0008, lo: 0xbc, hi: 0xbc},
+ {value: 0x0808, lo: 0xbc, hi: 0xbc},
{value: 0x0040, lo: 0xbd, hi: 0xbe},
- {value: 0x0008, lo: 0xbf, hi: 0xbf},
- // Block 0x9b, offset 0x4c2
+ {value: 0x0808, lo: 0xbf, hi: 0xbf},
+ // Block 0x9a, offset 0x4a7
{value: 0x0000, lo: 0x05},
- {value: 0x0008, lo: 0x80, hi: 0x95},
+ {value: 0x0808, lo: 0x80, hi: 0x95},
{value: 0x0040, lo: 0x96, hi: 0x96},
- {value: 0x0018, lo: 0x97, hi: 0x9f},
- {value: 0x0008, lo: 0xa0, hi: 0xb6},
- {value: 0x0018, lo: 0xb7, hi: 0xbf},
- // Block 0x9c, offset 0x4c8
+ {value: 0x0818, lo: 0x97, hi: 0x9f},
+ {value: 0x0808, lo: 0xa0, hi: 0xb6},
+ {value: 0x0818, lo: 0xb7, hi: 0xbf},
+ // Block 0x9b, offset 0x4ad
{value: 0x0000, lo: 0x04},
- {value: 0x0008, lo: 0x80, hi: 0x9e},
+ {value: 0x0808, lo: 0x80, hi: 0x9e},
{value: 0x0040, lo: 0x9f, hi: 0xa6},
- {value: 0x0018, lo: 0xa7, hi: 0xaf},
+ {value: 0x0818, lo: 0xa7, hi: 0xaf},
{value: 0x0040, lo: 0xb0, hi: 0xbf},
- // Block 0x9d, offset 0x4cd
+ // Block 0x9c, offset 0x4b2
{value: 0x0000, lo: 0x06},
{value: 0x0040, lo: 0x80, hi: 0x9f},
- {value: 0x0008, lo: 0xa0, hi: 0xb2},
+ {value: 0x0808, lo: 0xa0, hi: 0xb2},
{value: 0x0040, lo: 0xb3, hi: 0xb3},
- {value: 0x0008, lo: 0xb4, hi: 0xb5},
+ {value: 0x0808, lo: 0xb4, hi: 0xb5},
{value: 0x0040, lo: 0xb6, hi: 0xba},
- {value: 0x0018, lo: 0xbb, hi: 0xbf},
- // Block 0x9e, offset 0x4d4
+ {value: 0x0818, lo: 0xbb, hi: 0xbf},
+ // Block 0x9d, offset 0x4b9
{value: 0x0000, lo: 0x07},
- {value: 0x0008, lo: 0x80, hi: 0x95},
- {value: 0x0018, lo: 0x96, hi: 0x9b},
+ {value: 0x0808, lo: 0x80, hi: 0x95},
+ {value: 0x0818, lo: 0x96, hi: 0x9b},
{value: 0x0040, lo: 0x9c, hi: 0x9e},
{value: 0x0018, lo: 0x9f, hi: 0x9f},
- {value: 0x0008, lo: 0xa0, hi: 0xb9},
+ {value: 0x0808, lo: 0xa0, hi: 0xb9},
{value: 0x0040, lo: 0xba, hi: 0xbe},
- {value: 0x0018, lo: 0xbf, hi: 0xbf},
- // Block 0x9f, offset 0x4dc
+ {value: 0x0818, lo: 0xbf, hi: 0xbf},
+ // Block 0x9e, offset 0x4c1
{value: 0x0000, lo: 0x04},
- {value: 0x0008, lo: 0x80, hi: 0xb7},
+ {value: 0x0808, lo: 0x80, hi: 0xb7},
{value: 0x0040, lo: 0xb8, hi: 0xbb},
- {value: 0x0018, lo: 0xbc, hi: 0xbd},
- {value: 0x0008, lo: 0xbe, hi: 0xbf},
- // Block 0xa0, offset 0x4e1
+ {value: 0x0818, lo: 0xbc, hi: 0xbd},
+ {value: 0x0808, lo: 0xbe, hi: 0xbf},
+ // Block 0x9f, offset 0x4c6
{value: 0x0000, lo: 0x03},
- {value: 0x0018, lo: 0x80, hi: 0x8f},
+ {value: 0x0818, lo: 0x80, hi: 0x8f},
{value: 0x0040, lo: 0x90, hi: 0x91},
- {value: 0x0018, lo: 0x92, hi: 0xbf},
- // Block 0xa1, offset 0x4e5
+ {value: 0x0818, lo: 0x92, hi: 0xbf},
+ // Block 0xa0, offset 0x4ca
{value: 0x0000, lo: 0x0f},
- {value: 0x0008, lo: 0x80, hi: 0x80},
- {value: 0x1308, lo: 0x81, hi: 0x83},
+ {value: 0x0808, lo: 0x80, hi: 0x80},
+ {value: 0x3308, lo: 0x81, hi: 0x83},
{value: 0x0040, lo: 0x84, hi: 0x84},
- {value: 0x1308, lo: 0x85, hi: 0x86},
+ {value: 0x3308, lo: 0x85, hi: 0x86},
{value: 0x0040, lo: 0x87, hi: 0x8b},
- {value: 0x1308, lo: 0x8c, hi: 0x8f},
- {value: 0x0008, lo: 0x90, hi: 0x93},
+ {value: 0x3308, lo: 0x8c, hi: 0x8f},
+ {value: 0x0808, lo: 0x90, hi: 0x93},
{value: 0x0040, lo: 0x94, hi: 0x94},
- {value: 0x0008, lo: 0x95, hi: 0x97},
+ {value: 0x0808, lo: 0x95, hi: 0x97},
{value: 0x0040, lo: 0x98, hi: 0x98},
- {value: 0x0008, lo: 0x99, hi: 0xb3},
+ {value: 0x0808, lo: 0x99, hi: 0xb3},
{value: 0x0040, lo: 0xb4, hi: 0xb7},
- {value: 0x1308, lo: 0xb8, hi: 0xba},
+ {value: 0x3308, lo: 0xb8, hi: 0xba},
{value: 0x0040, lo: 0xbb, hi: 0xbe},
- {value: 0x1b08, lo: 0xbf, hi: 0xbf},
- // Block 0xa2, offset 0x4f5
+ {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+ // Block 0xa1, offset 0x4da
{value: 0x0000, lo: 0x06},
- {value: 0x0018, lo: 0x80, hi: 0x87},
+ {value: 0x0818, lo: 0x80, hi: 0x87},
{value: 0x0040, lo: 0x88, hi: 0x8f},
- {value: 0x0018, lo: 0x90, hi: 0x98},
+ {value: 0x0818, lo: 0x90, hi: 0x98},
{value: 0x0040, lo: 0x99, hi: 0x9f},
- {value: 0x0008, lo: 0xa0, hi: 0xbc},
- {value: 0x0018, lo: 0xbd, hi: 0xbf},
- // Block 0xa3, offset 0x4fc
+ {value: 0x0808, lo: 0xa0, hi: 0xbc},
+ {value: 0x0818, lo: 0xbd, hi: 0xbf},
+ // Block 0xa2, offset 0x4e1
{value: 0x0000, lo: 0x03},
- {value: 0x0008, lo: 0x80, hi: 0x9c},
- {value: 0x0018, lo: 0x9d, hi: 0x9f},
+ {value: 0x0808, lo: 0x80, hi: 0x9c},
+ {value: 0x0818, lo: 0x9d, hi: 0x9f},
{value: 0x0040, lo: 0xa0, hi: 0xbf},
- // Block 0xa4, offset 0x500
+ // Block 0xa3, offset 0x4e5
{value: 0x0000, lo: 0x03},
- {value: 0x0008, lo: 0x80, hi: 0xb5},
+ {value: 0x0808, lo: 0x80, hi: 0xb5},
{value: 0x0040, lo: 0xb6, hi: 0xb8},
{value: 0x0018, lo: 0xb9, hi: 0xbf},
- // Block 0xa5, offset 0x504
+ // Block 0xa4, offset 0x4e9
{value: 0x0000, lo: 0x06},
- {value: 0x0008, lo: 0x80, hi: 0x95},
+ {value: 0x0808, lo: 0x80, hi: 0x95},
{value: 0x0040, lo: 0x96, hi: 0x97},
- {value: 0x0018, lo: 0x98, hi: 0x9f},
- {value: 0x0008, lo: 0xa0, hi: 0xb2},
+ {value: 0x0818, lo: 0x98, hi: 0x9f},
+ {value: 0x0808, lo: 0xa0, hi: 0xb2},
{value: 0x0040, lo: 0xb3, hi: 0xb7},
- {value: 0x0018, lo: 0xb8, hi: 0xbf},
- // Block 0xa6, offset 0x50b
+ {value: 0x0818, lo: 0xb8, hi: 0xbf},
+ // Block 0xa5, offset 0x4f0
+ {value: 0x0000, lo: 0x01},
+ {value: 0x0808, lo: 0x80, hi: 0xbf},
+ // Block 0xa6, offset 0x4f2
{value: 0x0000, lo: 0x02},
- {value: 0x0008, lo: 0x80, hi: 0x88},
+ {value: 0x0808, lo: 0x80, hi: 0x88},
{value: 0x0040, lo: 0x89, hi: 0xbf},
- // Block 0xa7, offset 0x50e
+ // Block 0xa7, offset 0x4f5
{value: 0x0000, lo: 0x02},
{value: 0x03dd, lo: 0x80, hi: 0xb2},
{value: 0x0040, lo: 0xb3, hi: 0xbf},
- // Block 0xa8, offset 0x511
+ // Block 0xa8, offset 0x4f8
{value: 0x0000, lo: 0x03},
- {value: 0x0008, lo: 0x80, hi: 0xb2},
+ {value: 0x0808, lo: 0x80, hi: 0xb2},
{value: 0x0040, lo: 0xb3, hi: 0xb9},
- {value: 0x0018, lo: 0xba, hi: 0xbf},
- // Block 0xa9, offset 0x515
+ {value: 0x0818, lo: 0xba, hi: 0xbf},
+ // Block 0xa9, offset 0x4fc
{value: 0x0000, lo: 0x03},
{value: 0x0040, lo: 0x80, hi: 0x9f},
- {value: 0x0018, lo: 0xa0, hi: 0xbe},
+ {value: 0x0818, lo: 0xa0, hi: 0xbe},
{value: 0x0040, lo: 0xbf, hi: 0xbf},
- // Block 0xaa, offset 0x519
+ // Block 0xaa, offset 0x500
{value: 0x0000, lo: 0x05},
- {value: 0x1008, lo: 0x80, hi: 0x80},
- {value: 0x1308, lo: 0x81, hi: 0x81},
- {value: 0x1008, lo: 0x82, hi: 0x82},
+ {value: 0x3008, lo: 0x80, hi: 0x80},
+ {value: 0x3308, lo: 0x81, hi: 0x81},
+ {value: 0x3008, lo: 0x82, hi: 0x82},
{value: 0x0008, lo: 0x83, hi: 0xb7},
- {value: 0x1308, lo: 0xb8, hi: 0xbf},
- // Block 0xab, offset 0x51f
+ {value: 0x3308, lo: 0xb8, hi: 0xbf},
+ // Block 0xab, offset 0x506
{value: 0x0000, lo: 0x08},
- {value: 0x1308, lo: 0x80, hi: 0x85},
- {value: 0x1b08, lo: 0x86, hi: 0x86},
+ {value: 0x3308, lo: 0x80, hi: 0x85},
+ {value: 0x3b08, lo: 0x86, hi: 0x86},
{value: 0x0018, lo: 0x87, hi: 0x8d},
{value: 0x0040, lo: 0x8e, hi: 0x91},
{value: 0x0018, lo: 0x92, hi: 0xa5},
{value: 0x0008, lo: 0xa6, hi: 0xaf},
{value: 0x0040, lo: 0xb0, hi: 0xbe},
- {value: 0x1b08, lo: 0xbf, hi: 0xbf},
- // Block 0xac, offset 0x528
+ {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+ // Block 0xac, offset 0x50f
{value: 0x0000, lo: 0x0b},
- {value: 0x1308, lo: 0x80, hi: 0x81},
- {value: 0x1008, lo: 0x82, hi: 0x82},
+ {value: 0x3308, lo: 0x80, hi: 0x81},
+ {value: 0x3008, lo: 0x82, hi: 0x82},
{value: 0x0008, lo: 0x83, hi: 0xaf},
- {value: 0x1008, lo: 0xb0, hi: 0xb2},
- {value: 0x1308, lo: 0xb3, hi: 0xb6},
- {value: 0x1008, lo: 0xb7, hi: 0xb8},
- {value: 0x1b08, lo: 0xb9, hi: 0xb9},
- {value: 0x1308, lo: 0xba, hi: 0xba},
+ {value: 0x3008, lo: 0xb0, hi: 0xb2},
+ {value: 0x3308, lo: 0xb3, hi: 0xb6},
+ {value: 0x3008, lo: 0xb7, hi: 0xb8},
+ {value: 0x3b08, lo: 0xb9, hi: 0xb9},
+ {value: 0x3308, lo: 0xba, hi: 0xba},
{value: 0x0018, lo: 0xbb, hi: 0xbc},
{value: 0x0340, lo: 0xbd, hi: 0xbd},
{value: 0x0018, lo: 0xbe, hi: 0xbf},
- // Block 0xad, offset 0x534
+ // Block 0xad, offset 0x51b
{value: 0x0000, lo: 0x06},
{value: 0x0018, lo: 0x80, hi: 0x81},
{value: 0x0040, lo: 0x82, hi: 0x8f},
@@ -3853,39 +3861,39 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0040, lo: 0xa9, hi: 0xaf},
{value: 0x0008, lo: 0xb0, hi: 0xb9},
{value: 0x0040, lo: 0xba, hi: 0xbf},
- // Block 0xae, offset 0x53b
+ // Block 0xae, offset 0x522
{value: 0x0000, lo: 0x08},
- {value: 0x1308, lo: 0x80, hi: 0x82},
+ {value: 0x3308, lo: 0x80, hi: 0x82},
{value: 0x0008, lo: 0x83, hi: 0xa6},
- {value: 0x1308, lo: 0xa7, hi: 0xab},
- {value: 0x1008, lo: 0xac, hi: 0xac},
- {value: 0x1308, lo: 0xad, hi: 0xb2},
- {value: 0x1b08, lo: 0xb3, hi: 0xb4},
+ {value: 0x3308, lo: 0xa7, hi: 0xab},
+ {value: 0x3008, lo: 0xac, hi: 0xac},
+ {value: 0x3308, lo: 0xad, hi: 0xb2},
+ {value: 0x3b08, lo: 0xb3, hi: 0xb4},
{value: 0x0040, lo: 0xb5, hi: 0xb5},
{value: 0x0008, lo: 0xb6, hi: 0xbf},
- // Block 0xaf, offset 0x544
+ // Block 0xaf, offset 0x52b
{value: 0x0000, lo: 0x07},
{value: 0x0018, lo: 0x80, hi: 0x83},
{value: 0x0040, lo: 0x84, hi: 0x8f},
{value: 0x0008, lo: 0x90, hi: 0xb2},
- {value: 0x1308, lo: 0xb3, hi: 0xb3},
+ {value: 0x3308, lo: 0xb3, hi: 0xb3},
{value: 0x0018, lo: 0xb4, hi: 0xb5},
{value: 0x0008, lo: 0xb6, hi: 0xb6},
{value: 0x0040, lo: 0xb7, hi: 0xbf},
- // Block 0xb0, offset 0x54c
+ // Block 0xb0, offset 0x533
{value: 0x0000, lo: 0x06},
- {value: 0x1308, lo: 0x80, hi: 0x81},
- {value: 0x1008, lo: 0x82, hi: 0x82},
+ {value: 0x3308, lo: 0x80, hi: 0x81},
+ {value: 0x3008, lo: 0x82, hi: 0x82},
{value: 0x0008, lo: 0x83, hi: 0xb2},
- {value: 0x1008, lo: 0xb3, hi: 0xb5},
- {value: 0x1308, lo: 0xb6, hi: 0xbe},
- {value: 0x1008, lo: 0xbf, hi: 0xbf},
- // Block 0xb1, offset 0x553
+ {value: 0x3008, lo: 0xb3, hi: 0xb5},
+ {value: 0x3308, lo: 0xb6, hi: 0xbe},
+ {value: 0x3008, lo: 0xbf, hi: 0xbf},
+ // Block 0xb1, offset 0x53a
{value: 0x0000, lo: 0x0d},
- {value: 0x1808, lo: 0x80, hi: 0x80},
+ {value: 0x3808, lo: 0x80, hi: 0x80},
{value: 0x0008, lo: 0x81, hi: 0x84},
{value: 0x0018, lo: 0x85, hi: 0x89},
- {value: 0x1308, lo: 0x8a, hi: 0x8c},
+ {value: 0x3308, lo: 0x8a, hi: 0x8c},
{value: 0x0018, lo: 0x8d, hi: 0x8d},
{value: 0x0040, lo: 0x8e, hi: 0x8f},
{value: 0x0008, lo: 0x90, hi: 0x9a},
@@ -3895,21 +3903,21 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0040, lo: 0xa0, hi: 0xa0},
{value: 0x0018, lo: 0xa1, hi: 0xb4},
{value: 0x0040, lo: 0xb5, hi: 0xbf},
- // Block 0xb2, offset 0x561
+ // Block 0xb2, offset 0x548
{value: 0x0000, lo: 0x0c},
{value: 0x0008, lo: 0x80, hi: 0x91},
{value: 0x0040, lo: 0x92, hi: 0x92},
{value: 0x0008, lo: 0x93, hi: 0xab},
- {value: 0x1008, lo: 0xac, hi: 0xae},
- {value: 0x1308, lo: 0xaf, hi: 0xb1},
- {value: 0x1008, lo: 0xb2, hi: 0xb3},
- {value: 0x1308, lo: 0xb4, hi: 0xb4},
- {value: 0x1808, lo: 0xb5, hi: 0xb5},
- {value: 0x1308, lo: 0xb6, hi: 0xb7},
+ {value: 0x3008, lo: 0xac, hi: 0xae},
+ {value: 0x3308, lo: 0xaf, hi: 0xb1},
+ {value: 0x3008, lo: 0xb2, hi: 0xb3},
+ {value: 0x3308, lo: 0xb4, hi: 0xb4},
+ {value: 0x3808, lo: 0xb5, hi: 0xb5},
+ {value: 0x3308, lo: 0xb6, hi: 0xb7},
{value: 0x0018, lo: 0xb8, hi: 0xbd},
- {value: 0x1308, lo: 0xbe, hi: 0xbe},
+ {value: 0x3308, lo: 0xbe, hi: 0xbe},
{value: 0x0040, lo: 0xbf, hi: 0xbf},
- // Block 0xb3, offset 0x56e
+ // Block 0xb3, offset 0x555
{value: 0x0000, lo: 0x0c},
{value: 0x0008, lo: 0x80, hi: 0x86},
{value: 0x0040, lo: 0x87, hi: 0x87},
@@ -3923,28 +3931,28 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0018, lo: 0xa9, hi: 0xa9},
{value: 0x0040, lo: 0xaa, hi: 0xaf},
{value: 0x0008, lo: 0xb0, hi: 0xbf},
- // Block 0xb4, offset 0x57b
+ // Block 0xb4, offset 0x562
{value: 0x0000, lo: 0x08},
{value: 0x0008, lo: 0x80, hi: 0x9e},
- {value: 0x1308, lo: 0x9f, hi: 0x9f},
- {value: 0x1008, lo: 0xa0, hi: 0xa2},
- {value: 0x1308, lo: 0xa3, hi: 0xa9},
- {value: 0x1b08, lo: 0xaa, hi: 0xaa},
+ {value: 0x3308, lo: 0x9f, hi: 0x9f},
+ {value: 0x3008, lo: 0xa0, hi: 0xa2},
+ {value: 0x3308, lo: 0xa3, hi: 0xa9},
+ {value: 0x3b08, lo: 0xaa, hi: 0xaa},
{value: 0x0040, lo: 0xab, hi: 0xaf},
{value: 0x0008, lo: 0xb0, hi: 0xb9},
{value: 0x0040, lo: 0xba, hi: 0xbf},
- // Block 0xb5, offset 0x584
+ // Block 0xb5, offset 0x56b
{value: 0x0000, lo: 0x03},
{value: 0x0008, lo: 0x80, hi: 0xb4},
- {value: 0x1008, lo: 0xb5, hi: 0xb7},
- {value: 0x1308, lo: 0xb8, hi: 0xbf},
- // Block 0xb6, offset 0x588
+ {value: 0x3008, lo: 0xb5, hi: 0xb7},
+ {value: 0x3308, lo: 0xb8, hi: 0xbf},
+ // Block 0xb6, offset 0x56f
{value: 0x0000, lo: 0x0d},
- {value: 0x1008, lo: 0x80, hi: 0x81},
- {value: 0x1b08, lo: 0x82, hi: 0x82},
- {value: 0x1308, lo: 0x83, hi: 0x84},
- {value: 0x1008, lo: 0x85, hi: 0x85},
- {value: 0x1308, lo: 0x86, hi: 0x86},
+ {value: 0x3008, lo: 0x80, hi: 0x81},
+ {value: 0x3b08, lo: 0x82, hi: 0x82},
+ {value: 0x3308, lo: 0x83, hi: 0x84},
+ {value: 0x3008, lo: 0x85, hi: 0x85},
+ {value: 0x3308, lo: 0x86, hi: 0x86},
{value: 0x0008, lo: 0x87, hi: 0x8a},
{value: 0x0018, lo: 0x8b, hi: 0x8f},
{value: 0x0008, lo: 0x90, hi: 0x99},
@@ -3953,56 +3961,56 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0040, lo: 0x9c, hi: 0x9c},
{value: 0x0018, lo: 0x9d, hi: 0x9d},
{value: 0x0040, lo: 0x9e, hi: 0xbf},
- // Block 0xb7, offset 0x596
+ // Block 0xb7, offset 0x57d
{value: 0x0000, lo: 0x07},
{value: 0x0008, lo: 0x80, hi: 0xaf},
- {value: 0x1008, lo: 0xb0, hi: 0xb2},
- {value: 0x1308, lo: 0xb3, hi: 0xb8},
- {value: 0x1008, lo: 0xb9, hi: 0xb9},
- {value: 0x1308, lo: 0xba, hi: 0xba},
- {value: 0x1008, lo: 0xbb, hi: 0xbe},
- {value: 0x1308, lo: 0xbf, hi: 0xbf},
- // Block 0xb8, offset 0x59e
+ {value: 0x3008, lo: 0xb0, hi: 0xb2},
+ {value: 0x3308, lo: 0xb3, hi: 0xb8},
+ {value: 0x3008, lo: 0xb9, hi: 0xb9},
+ {value: 0x3308, lo: 0xba, hi: 0xba},
+ {value: 0x3008, lo: 0xbb, hi: 0xbe},
+ {value: 0x3308, lo: 0xbf, hi: 0xbf},
+ // Block 0xb8, offset 0x585
{value: 0x0000, lo: 0x0a},
- {value: 0x1308, lo: 0x80, hi: 0x80},
- {value: 0x1008, lo: 0x81, hi: 0x81},
- {value: 0x1b08, lo: 0x82, hi: 0x82},
- {value: 0x1308, lo: 0x83, hi: 0x83},
+ {value: 0x3308, lo: 0x80, hi: 0x80},
+ {value: 0x3008, lo: 0x81, hi: 0x81},
+ {value: 0x3b08, lo: 0x82, hi: 0x82},
+ {value: 0x3308, lo: 0x83, hi: 0x83},
{value: 0x0008, lo: 0x84, hi: 0x85},
{value: 0x0018, lo: 0x86, hi: 0x86},
{value: 0x0008, lo: 0x87, hi: 0x87},
{value: 0x0040, lo: 0x88, hi: 0x8f},
{value: 0x0008, lo: 0x90, hi: 0x99},
{value: 0x0040, lo: 0x9a, hi: 0xbf},
- // Block 0xb9, offset 0x5a9
+ // Block 0xb9, offset 0x590
{value: 0x0000, lo: 0x08},
{value: 0x0008, lo: 0x80, hi: 0xae},
- {value: 0x1008, lo: 0xaf, hi: 0xb1},
- {value: 0x1308, lo: 0xb2, hi: 0xb5},
+ {value: 0x3008, lo: 0xaf, hi: 0xb1},
+ {value: 0x3308, lo: 0xb2, hi: 0xb5},
{value: 0x0040, lo: 0xb6, hi: 0xb7},
- {value: 0x1008, lo: 0xb8, hi: 0xbb},
- {value: 0x1308, lo: 0xbc, hi: 0xbd},
- {value: 0x1008, lo: 0xbe, hi: 0xbe},
- {value: 0x1b08, lo: 0xbf, hi: 0xbf},
- // Block 0xba, offset 0x5b2
+ {value: 0x3008, lo: 0xb8, hi: 0xbb},
+ {value: 0x3308, lo: 0xbc, hi: 0xbd},
+ {value: 0x3008, lo: 0xbe, hi: 0xbe},
+ {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+ // Block 0xba, offset 0x599
{value: 0x0000, lo: 0x05},
- {value: 0x1308, lo: 0x80, hi: 0x80},
+ {value: 0x3308, lo: 0x80, hi: 0x80},
{value: 0x0018, lo: 0x81, hi: 0x97},
{value: 0x0008, lo: 0x98, hi: 0x9b},
- {value: 0x1308, lo: 0x9c, hi: 0x9d},
+ {value: 0x3308, lo: 0x9c, hi: 0x9d},
{value: 0x0040, lo: 0x9e, hi: 0xbf},
- // Block 0xbb, offset 0x5b8
+ // Block 0xbb, offset 0x59f
{value: 0x0000, lo: 0x07},
{value: 0x0008, lo: 0x80, hi: 0xaf},
- {value: 0x1008, lo: 0xb0, hi: 0xb2},
- {value: 0x1308, lo: 0xb3, hi: 0xba},
- {value: 0x1008, lo: 0xbb, hi: 0xbc},
- {value: 0x1308, lo: 0xbd, hi: 0xbd},
- {value: 0x1008, lo: 0xbe, hi: 0xbe},
- {value: 0x1b08, lo: 0xbf, hi: 0xbf},
- // Block 0xbc, offset 0x5c0
+ {value: 0x3008, lo: 0xb0, hi: 0xb2},
+ {value: 0x3308, lo: 0xb3, hi: 0xba},
+ {value: 0x3008, lo: 0xbb, hi: 0xbc},
+ {value: 0x3308, lo: 0xbd, hi: 0xbd},
+ {value: 0x3008, lo: 0xbe, hi: 0xbe},
+ {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+ // Block 0xbc, offset 0x5a7
{value: 0x0000, lo: 0x08},
- {value: 0x1308, lo: 0x80, hi: 0x80},
+ {value: 0x3308, lo: 0x80, hi: 0x80},
{value: 0x0018, lo: 0x81, hi: 0x83},
{value: 0x0008, lo: 0x84, hi: 0x84},
{value: 0x0040, lo: 0x85, hi: 0x8f},
@@ -4010,60 +4018,97 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0040, lo: 0x9a, hi: 0x9f},
{value: 0x0018, lo: 0xa0, hi: 0xac},
{value: 0x0040, lo: 0xad, hi: 0xbf},
- // Block 0xbd, offset 0x5c9
+ // Block 0xbd, offset 0x5b0
{value: 0x0000, lo: 0x09},
{value: 0x0008, lo: 0x80, hi: 0xaa},
- {value: 0x1308, lo: 0xab, hi: 0xab},
- {value: 0x1008, lo: 0xac, hi: 0xac},
- {value: 0x1308, lo: 0xad, hi: 0xad},
- {value: 0x1008, lo: 0xae, hi: 0xaf},
- {value: 0x1308, lo: 0xb0, hi: 0xb5},
- {value: 0x1808, lo: 0xb6, hi: 0xb6},
- {value: 0x1308, lo: 0xb7, hi: 0xb7},
+ {value: 0x3308, lo: 0xab, hi: 0xab},
+ {value: 0x3008, lo: 0xac, hi: 0xac},
+ {value: 0x3308, lo: 0xad, hi: 0xad},
+ {value: 0x3008, lo: 0xae, hi: 0xaf},
+ {value: 0x3308, lo: 0xb0, hi: 0xb5},
+ {value: 0x3808, lo: 0xb6, hi: 0xb6},
+ {value: 0x3308, lo: 0xb7, hi: 0xb7},
{value: 0x0040, lo: 0xb8, hi: 0xbf},
- // Block 0xbe, offset 0x5d3
+ // Block 0xbe, offset 0x5ba
{value: 0x0000, lo: 0x02},
{value: 0x0008, lo: 0x80, hi: 0x89},
{value: 0x0040, lo: 0x8a, hi: 0xbf},
- // Block 0xbf, offset 0x5d6
+ // Block 0xbf, offset 0x5bd
{value: 0x0000, lo: 0x0b},
{value: 0x0008, lo: 0x80, hi: 0x99},
{value: 0x0040, lo: 0x9a, hi: 0x9c},
- {value: 0x1308, lo: 0x9d, hi: 0x9f},
- {value: 0x1008, lo: 0xa0, hi: 0xa1},
- {value: 0x1308, lo: 0xa2, hi: 0xa5},
- {value: 0x1008, lo: 0xa6, hi: 0xa6},
- {value: 0x1308, lo: 0xa7, hi: 0xaa},
- {value: 0x1b08, lo: 0xab, hi: 0xab},
+ {value: 0x3308, lo: 0x9d, hi: 0x9f},
+ {value: 0x3008, lo: 0xa0, hi: 0xa1},
+ {value: 0x3308, lo: 0xa2, hi: 0xa5},
+ {value: 0x3008, lo: 0xa6, hi: 0xa6},
+ {value: 0x3308, lo: 0xa7, hi: 0xaa},
+ {value: 0x3b08, lo: 0xab, hi: 0xab},
{value: 0x0040, lo: 0xac, hi: 0xaf},
{value: 0x0008, lo: 0xb0, hi: 0xb9},
{value: 0x0018, lo: 0xba, hi: 0xbf},
- // Block 0xc0, offset 0x5e2
+ // Block 0xc0, offset 0x5c9
{value: 0x0000, lo: 0x02},
{value: 0x0040, lo: 0x80, hi: 0x9f},
{value: 0x049d, lo: 0xa0, hi: 0xbf},
- // Block 0xc1, offset 0x5e5
+ // Block 0xc1, offset 0x5cc
{value: 0x0000, lo: 0x04},
{value: 0x0008, lo: 0x80, hi: 0xa9},
{value: 0x0018, lo: 0xaa, hi: 0xb2},
{value: 0x0040, lo: 0xb3, hi: 0xbe},
{value: 0x0008, lo: 0xbf, hi: 0xbf},
- // Block 0xc2, offset 0x5ea
+ // Block 0xc2, offset 0x5d1
+ {value: 0x0000, lo: 0x0c},
+ {value: 0x0008, lo: 0x80, hi: 0x80},
+ {value: 0x3308, lo: 0x81, hi: 0x86},
+ {value: 0x3008, lo: 0x87, hi: 0x88},
+ {value: 0x3308, lo: 0x89, hi: 0x8a},
+ {value: 0x0008, lo: 0x8b, hi: 0xb2},
+ {value: 0x3308, lo: 0xb3, hi: 0xb3},
+ {value: 0x3b08, lo: 0xb4, hi: 0xb4},
+ {value: 0x3308, lo: 0xb5, hi: 0xb8},
+ {value: 0x3008, lo: 0xb9, hi: 0xb9},
+ {value: 0x0008, lo: 0xba, hi: 0xba},
+ {value: 0x3308, lo: 0xbb, hi: 0xbe},
+ {value: 0x0018, lo: 0xbf, hi: 0xbf},
+ // Block 0xc3, offset 0x5de
+ {value: 0x0000, lo: 0x08},
+ {value: 0x0018, lo: 0x80, hi: 0x86},
+ {value: 0x3b08, lo: 0x87, hi: 0x87},
+ {value: 0x0040, lo: 0x88, hi: 0x8f},
+ {value: 0x0008, lo: 0x90, hi: 0x90},
+ {value: 0x3308, lo: 0x91, hi: 0x96},
+ {value: 0x3008, lo: 0x97, hi: 0x98},
+ {value: 0x3308, lo: 0x99, hi: 0x9b},
+ {value: 0x0008, lo: 0x9c, hi: 0xbf},
+ // Block 0xc4, offset 0x5e7
+ {value: 0x0000, lo: 0x0b},
+ {value: 0x0008, lo: 0x80, hi: 0x83},
+ {value: 0x0040, lo: 0x84, hi: 0x85},
+ {value: 0x0008, lo: 0x86, hi: 0x89},
+ {value: 0x3308, lo: 0x8a, hi: 0x96},
+ {value: 0x3008, lo: 0x97, hi: 0x97},
+ {value: 0x3308, lo: 0x98, hi: 0x98},
+ {value: 0x3b08, lo: 0x99, hi: 0x99},
+ {value: 0x0018, lo: 0x9a, hi: 0x9c},
+ {value: 0x0040, lo: 0x9d, hi: 0x9d},
+ {value: 0x0018, lo: 0x9e, hi: 0xa2},
+ {value: 0x0040, lo: 0xa3, hi: 0xbf},
+ // Block 0xc5, offset 0x5f3
{value: 0x0000, lo: 0x02},
{value: 0x0008, lo: 0x80, hi: 0xb8},
{value: 0x0040, lo: 0xb9, hi: 0xbf},
- // Block 0xc3, offset 0x5ed
+ // Block 0xc6, offset 0x5f6
{value: 0x0000, lo: 0x09},
{value: 0x0008, lo: 0x80, hi: 0x88},
{value: 0x0040, lo: 0x89, hi: 0x89},
{value: 0x0008, lo: 0x8a, hi: 0xae},
- {value: 0x1008, lo: 0xaf, hi: 0xaf},
- {value: 0x1308, lo: 0xb0, hi: 0xb6},
+ {value: 0x3008, lo: 0xaf, hi: 0xaf},
+ {value: 0x3308, lo: 0xb0, hi: 0xb6},
{value: 0x0040, lo: 0xb7, hi: 0xb7},
- {value: 0x1308, lo: 0xb8, hi: 0xbd},
- {value: 0x1008, lo: 0xbe, hi: 0xbe},
- {value: 0x1b08, lo: 0xbf, hi: 0xbf},
- // Block 0xc4, offset 0x5f7
+ {value: 0x3308, lo: 0xb8, hi: 0xbd},
+ {value: 0x3008, lo: 0xbe, hi: 0xbe},
+ {value: 0x3b08, lo: 0xbf, hi: 0xbf},
+ // Block 0xc7, offset 0x600
{value: 0x0000, lo: 0x08},
{value: 0x0008, lo: 0x80, hi: 0x80},
{value: 0x0018, lo: 0x81, hi: 0x85},
@@ -4073,42 +4118,65 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0040, lo: 0xad, hi: 0xaf},
{value: 0x0018, lo: 0xb0, hi: 0xb1},
{value: 0x0008, lo: 0xb2, hi: 0xbf},
- // Block 0xc5, offset 0x600
+ // Block 0xc8, offset 0x609
{value: 0x0000, lo: 0x0b},
{value: 0x0008, lo: 0x80, hi: 0x8f},
{value: 0x0040, lo: 0x90, hi: 0x91},
- {value: 0x1308, lo: 0x92, hi: 0xa7},
+ {value: 0x3308, lo: 0x92, hi: 0xa7},
{value: 0x0040, lo: 0xa8, hi: 0xa8},
- {value: 0x1008, lo: 0xa9, hi: 0xa9},
- {value: 0x1308, lo: 0xaa, hi: 0xb0},
- {value: 0x1008, lo: 0xb1, hi: 0xb1},
- {value: 0x1308, lo: 0xb2, hi: 0xb3},
- {value: 0x1008, lo: 0xb4, hi: 0xb4},
- {value: 0x1308, lo: 0xb5, hi: 0xb6},
+ {value: 0x3008, lo: 0xa9, hi: 0xa9},
+ {value: 0x3308, lo: 0xaa, hi: 0xb0},
+ {value: 0x3008, lo: 0xb1, hi: 0xb1},
+ {value: 0x3308, lo: 0xb2, hi: 0xb3},
+ {value: 0x3008, lo: 0xb4, hi: 0xb4},
+ {value: 0x3308, lo: 0xb5, hi: 0xb6},
{value: 0x0040, lo: 0xb7, hi: 0xbf},
- // Block 0xc6, offset 0x60c
+ // Block 0xc9, offset 0x615
+ {value: 0x0000, lo: 0x0c},
+ {value: 0x0008, lo: 0x80, hi: 0x86},
+ {value: 0x0040, lo: 0x87, hi: 0x87},
+ {value: 0x0008, lo: 0x88, hi: 0x89},
+ {value: 0x0040, lo: 0x8a, hi: 0x8a},
+ {value: 0x0008, lo: 0x8b, hi: 0xb0},
+ {value: 0x3308, lo: 0xb1, hi: 0xb6},
+ {value: 0x0040, lo: 0xb7, hi: 0xb9},
+ {value: 0x3308, lo: 0xba, hi: 0xba},
+ {value: 0x0040, lo: 0xbb, hi: 0xbb},
+ {value: 0x3308, lo: 0xbc, hi: 0xbd},
+ {value: 0x0040, lo: 0xbe, hi: 0xbe},
+ {value: 0x3308, lo: 0xbf, hi: 0xbf},
+ // Block 0xca, offset 0x622
+ {value: 0x0000, lo: 0x07},
+ {value: 0x3308, lo: 0x80, hi: 0x83},
+ {value: 0x3b08, lo: 0x84, hi: 0x85},
+ {value: 0x0008, lo: 0x86, hi: 0x86},
+ {value: 0x3308, lo: 0x87, hi: 0x87},
+ {value: 0x0040, lo: 0x88, hi: 0x8f},
+ {value: 0x0008, lo: 0x90, hi: 0x99},
+ {value: 0x0040, lo: 0x9a, hi: 0xbf},
+ // Block 0xcb, offset 0x62a
{value: 0x0000, lo: 0x02},
{value: 0x0008, lo: 0x80, hi: 0x99},
{value: 0x0040, lo: 0x9a, hi: 0xbf},
- // Block 0xc7, offset 0x60f
+ // Block 0xcc, offset 0x62d
{value: 0x0000, lo: 0x04},
{value: 0x0018, lo: 0x80, hi: 0xae},
{value: 0x0040, lo: 0xaf, hi: 0xaf},
{value: 0x0018, lo: 0xb0, hi: 0xb4},
{value: 0x0040, lo: 0xb5, hi: 0xbf},
- // Block 0xc8, offset 0x614
+ // Block 0xcd, offset 0x632
{value: 0x0000, lo: 0x02},
{value: 0x0008, lo: 0x80, hi: 0x83},
{value: 0x0040, lo: 0x84, hi: 0xbf},
- // Block 0xc9, offset 0x617
+ // Block 0xce, offset 0x635
{value: 0x0000, lo: 0x02},
{value: 0x0008, lo: 0x80, hi: 0xae},
{value: 0x0040, lo: 0xaf, hi: 0xbf},
- // Block 0xca, offset 0x61a
+ // Block 0xcf, offset 0x638
{value: 0x0000, lo: 0x02},
{value: 0x0008, lo: 0x80, hi: 0x86},
{value: 0x0040, lo: 0x87, hi: 0xbf},
- // Block 0xcb, offset 0x61d
+ // Block 0xd0, offset 0x63b
{value: 0x0000, lo: 0x06},
{value: 0x0008, lo: 0x80, hi: 0x9e},
{value: 0x0040, lo: 0x9f, hi: 0x9f},
@@ -4116,20 +4184,20 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0040, lo: 0xaa, hi: 0xad},
{value: 0x0018, lo: 0xae, hi: 0xaf},
{value: 0x0040, lo: 0xb0, hi: 0xbf},
- // Block 0xcc, offset 0x624
+ // Block 0xd1, offset 0x642
{value: 0x0000, lo: 0x06},
{value: 0x0040, lo: 0x80, hi: 0x8f},
{value: 0x0008, lo: 0x90, hi: 0xad},
{value: 0x0040, lo: 0xae, hi: 0xaf},
- {value: 0x1308, lo: 0xb0, hi: 0xb4},
+ {value: 0x3308, lo: 0xb0, hi: 0xb4},
{value: 0x0018, lo: 0xb5, hi: 0xb5},
{value: 0x0040, lo: 0xb6, hi: 0xbf},
- // Block 0xcd, offset 0x62b
+ // Block 0xd2, offset 0x649
{value: 0x0000, lo: 0x03},
{value: 0x0008, lo: 0x80, hi: 0xaf},
- {value: 0x1308, lo: 0xb0, hi: 0xb6},
+ {value: 0x3308, lo: 0xb0, hi: 0xb6},
{value: 0x0018, lo: 0xb7, hi: 0xbf},
- // Block 0xce, offset 0x62f
+ // Block 0xd3, offset 0x64d
{value: 0x0000, lo: 0x0a},
{value: 0x0008, lo: 0x80, hi: 0x83},
{value: 0x0018, lo: 0x84, hi: 0x85},
@@ -4141,67 +4209,75 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0008, lo: 0xa3, hi: 0xb7},
{value: 0x0040, lo: 0xb8, hi: 0xbc},
{value: 0x0008, lo: 0xbd, hi: 0xbf},
- // Block 0xcf, offset 0x63a
+ // Block 0xd4, offset 0x658
{value: 0x0000, lo: 0x02},
{value: 0x0008, lo: 0x80, hi: 0x8f},
{value: 0x0040, lo: 0x90, hi: 0xbf},
- // Block 0xd0, offset 0x63d
+ // Block 0xd5, offset 0x65b
{value: 0x0000, lo: 0x05},
{value: 0x0008, lo: 0x80, hi: 0x84},
{value: 0x0040, lo: 0x85, hi: 0x8f},
{value: 0x0008, lo: 0x90, hi: 0x90},
- {value: 0x1008, lo: 0x91, hi: 0xbe},
+ {value: 0x3008, lo: 0x91, hi: 0xbe},
{value: 0x0040, lo: 0xbf, hi: 0xbf},
- // Block 0xd1, offset 0x643
+ // Block 0xd6, offset 0x661
{value: 0x0000, lo: 0x04},
{value: 0x0040, lo: 0x80, hi: 0x8e},
- {value: 0x1308, lo: 0x8f, hi: 0x92},
+ {value: 0x3308, lo: 0x8f, hi: 0x92},
{value: 0x0008, lo: 0x93, hi: 0x9f},
{value: 0x0040, lo: 0xa0, hi: 0xbf},
- // Block 0xd2, offset 0x648
+ // Block 0xd7, offset 0x666
{value: 0x0000, lo: 0x03},
{value: 0x0040, lo: 0x80, hi: 0x9f},
- {value: 0x0008, lo: 0xa0, hi: 0xa0},
- {value: 0x0040, lo: 0xa1, hi: 0xbf},
- // Block 0xd3, offset 0x64c
+ {value: 0x0008, lo: 0xa0, hi: 0xa1},
+ {value: 0x0040, lo: 0xa2, hi: 0xbf},
+ // Block 0xd8, offset 0x66a
{value: 0x0000, lo: 0x02},
{value: 0x0008, lo: 0x80, hi: 0xac},
{value: 0x0040, lo: 0xad, hi: 0xbf},
- // Block 0xd4, offset 0x64f
+ // Block 0xd9, offset 0x66d
{value: 0x0000, lo: 0x02},
{value: 0x0008, lo: 0x80, hi: 0xb2},
{value: 0x0040, lo: 0xb3, hi: 0xbf},
- // Block 0xd5, offset 0x652
+ // Block 0xda, offset 0x670
{value: 0x0000, lo: 0x02},
- {value: 0x0008, lo: 0x80, hi: 0x81},
- {value: 0x0040, lo: 0x82, hi: 0xbf},
- // Block 0xd6, offset 0x655
+ {value: 0x0008, lo: 0x80, hi: 0x9e},
+ {value: 0x0040, lo: 0x9f, hi: 0xbf},
+ // Block 0xdb, offset 0x673
+ {value: 0x0000, lo: 0x02},
+ {value: 0x0040, lo: 0x80, hi: 0xaf},
+ {value: 0x0008, lo: 0xb0, hi: 0xbf},
+ // Block 0xdc, offset 0x676
+ {value: 0x0000, lo: 0x02},
+ {value: 0x0008, lo: 0x80, hi: 0xbb},
+ {value: 0x0040, lo: 0xbc, hi: 0xbf},
+ // Block 0xdd, offset 0x679
{value: 0x0000, lo: 0x04},
{value: 0x0008, lo: 0x80, hi: 0xaa},
{value: 0x0040, lo: 0xab, hi: 0xaf},
{value: 0x0008, lo: 0xb0, hi: 0xbc},
{value: 0x0040, lo: 0xbd, hi: 0xbf},
- // Block 0xd7, offset 0x65a
+ // Block 0xde, offset 0x67e
{value: 0x0000, lo: 0x09},
{value: 0x0008, lo: 0x80, hi: 0x88},
{value: 0x0040, lo: 0x89, hi: 0x8f},
{value: 0x0008, lo: 0x90, hi: 0x99},
{value: 0x0040, lo: 0x9a, hi: 0x9b},
{value: 0x0018, lo: 0x9c, hi: 0x9c},
- {value: 0x1308, lo: 0x9d, hi: 0x9e},
+ {value: 0x3308, lo: 0x9d, hi: 0x9e},
{value: 0x0018, lo: 0x9f, hi: 0x9f},
{value: 0x03c0, lo: 0xa0, hi: 0xa3},
{value: 0x0040, lo: 0xa4, hi: 0xbf},
- // Block 0xd8, offset 0x664
+ // Block 0xdf, offset 0x688
{value: 0x0000, lo: 0x02},
{value: 0x0018, lo: 0x80, hi: 0xb5},
{value: 0x0040, lo: 0xb6, hi: 0xbf},
- // Block 0xd9, offset 0x667
+ // Block 0xe0, offset 0x68b
{value: 0x0000, lo: 0x03},
{value: 0x0018, lo: 0x80, hi: 0xa6},
{value: 0x0040, lo: 0xa7, hi: 0xa8},
{value: 0x0018, lo: 0xa9, hi: 0xbf},
- // Block 0xda, offset 0x66b
+ // Block 0xe1, offset 0x68f
{value: 0x0000, lo: 0x0e},
{value: 0x0018, lo: 0x80, hi: 0x9d},
{value: 0xb5b9, lo: 0x9e, hi: 0x9e},
@@ -4211,127 +4287,127 @@ var idnaSparseValues = [1876]valueRange{
{value: 0xb719, lo: 0xa2, hi: 0xa2},
{value: 0xb781, lo: 0xa3, hi: 0xa3},
{value: 0xb7e9, lo: 0xa4, hi: 0xa4},
- {value: 0x1018, lo: 0xa5, hi: 0xa6},
- {value: 0x1318, lo: 0xa7, hi: 0xa9},
+ {value: 0x3018, lo: 0xa5, hi: 0xa6},
+ {value: 0x3318, lo: 0xa7, hi: 0xa9},
{value: 0x0018, lo: 0xaa, hi: 0xac},
- {value: 0x1018, lo: 0xad, hi: 0xb2},
+ {value: 0x3018, lo: 0xad, hi: 0xb2},
{value: 0x0340, lo: 0xb3, hi: 0xba},
- {value: 0x1318, lo: 0xbb, hi: 0xbf},
- // Block 0xdb, offset 0x67a
+ {value: 0x3318, lo: 0xbb, hi: 0xbf},
+ // Block 0xe2, offset 0x69e
{value: 0x0000, lo: 0x0b},
- {value: 0x1318, lo: 0x80, hi: 0x82},
+ {value: 0x3318, lo: 0x80, hi: 0x82},
{value: 0x0018, lo: 0x83, hi: 0x84},
- {value: 0x1318, lo: 0x85, hi: 0x8b},
+ {value: 0x3318, lo: 0x85, hi: 0x8b},
{value: 0x0018, lo: 0x8c, hi: 0xa9},
- {value: 0x1318, lo: 0xaa, hi: 0xad},
+ {value: 0x3318, lo: 0xaa, hi: 0xad},
{value: 0x0018, lo: 0xae, hi: 0xba},
{value: 0xb851, lo: 0xbb, hi: 0xbb},
{value: 0xb899, lo: 0xbc, hi: 0xbc},
{value: 0xb8e1, lo: 0xbd, hi: 0xbd},
{value: 0xb949, lo: 0xbe, hi: 0xbe},
{value: 0xb9b1, lo: 0xbf, hi: 0xbf},
- // Block 0xdc, offset 0x686
+ // Block 0xe3, offset 0x6aa
{value: 0x0000, lo: 0x03},
{value: 0xba19, lo: 0x80, hi: 0x80},
{value: 0x0018, lo: 0x81, hi: 0xa8},
{value: 0x0040, lo: 0xa9, hi: 0xbf},
- // Block 0xdd, offset 0x68a
+ // Block 0xe4, offset 0x6ae
{value: 0x0000, lo: 0x04},
{value: 0x0018, lo: 0x80, hi: 0x81},
- {value: 0x1318, lo: 0x82, hi: 0x84},
+ {value: 0x3318, lo: 0x82, hi: 0x84},
{value: 0x0018, lo: 0x85, hi: 0x85},
{value: 0x0040, lo: 0x86, hi: 0xbf},
- // Block 0xde, offset 0x68f
+ // Block 0xe5, offset 0x6b3
{value: 0x0000, lo: 0x04},
{value: 0x0018, lo: 0x80, hi: 0x96},
{value: 0x0040, lo: 0x97, hi: 0x9f},
{value: 0x0018, lo: 0xa0, hi: 0xb1},
{value: 0x0040, lo: 0xb2, hi: 0xbf},
- // Block 0xdf, offset 0x694
+ // Block 0xe6, offset 0x6b8
{value: 0x0000, lo: 0x03},
- {value: 0x1308, lo: 0x80, hi: 0xb6},
+ {value: 0x3308, lo: 0x80, hi: 0xb6},
{value: 0x0018, lo: 0xb7, hi: 0xba},
- {value: 0x1308, lo: 0xbb, hi: 0xbf},
- // Block 0xe0, offset 0x698
+ {value: 0x3308, lo: 0xbb, hi: 0xbf},
+ // Block 0xe7, offset 0x6bc
{value: 0x0000, lo: 0x04},
- {value: 0x1308, lo: 0x80, hi: 0xac},
+ {value: 0x3308, lo: 0x80, hi: 0xac},
{value: 0x0018, lo: 0xad, hi: 0xb4},
- {value: 0x1308, lo: 0xb5, hi: 0xb5},
+ {value: 0x3308, lo: 0xb5, hi: 0xb5},
{value: 0x0018, lo: 0xb6, hi: 0xbf},
- // Block 0xe1, offset 0x69d
+ // Block 0xe8, offset 0x6c1
{value: 0x0000, lo: 0x08},
{value: 0x0018, lo: 0x80, hi: 0x83},
- {value: 0x1308, lo: 0x84, hi: 0x84},
+ {value: 0x3308, lo: 0x84, hi: 0x84},
{value: 0x0018, lo: 0x85, hi: 0x8b},
{value: 0x0040, lo: 0x8c, hi: 0x9a},
- {value: 0x1308, lo: 0x9b, hi: 0x9f},
+ {value: 0x3308, lo: 0x9b, hi: 0x9f},
{value: 0x0040, lo: 0xa0, hi: 0xa0},
- {value: 0x1308, lo: 0xa1, hi: 0xaf},
+ {value: 0x3308, lo: 0xa1, hi: 0xaf},
{value: 0x0040, lo: 0xb0, hi: 0xbf},
- // Block 0xe2, offset 0x6a6
+ // Block 0xe9, offset 0x6ca
{value: 0x0000, lo: 0x0a},
- {value: 0x1308, lo: 0x80, hi: 0x86},
+ {value: 0x3308, lo: 0x80, hi: 0x86},
{value: 0x0040, lo: 0x87, hi: 0x87},
- {value: 0x1308, lo: 0x88, hi: 0x98},
+ {value: 0x3308, lo: 0x88, hi: 0x98},
{value: 0x0040, lo: 0x99, hi: 0x9a},
- {value: 0x1308, lo: 0x9b, hi: 0xa1},
+ {value: 0x3308, lo: 0x9b, hi: 0xa1},
{value: 0x0040, lo: 0xa2, hi: 0xa2},
- {value: 0x1308, lo: 0xa3, hi: 0xa4},
+ {value: 0x3308, lo: 0xa3, hi: 0xa4},
{value: 0x0040, lo: 0xa5, hi: 0xa5},
- {value: 0x1308, lo: 0xa6, hi: 0xaa},
+ {value: 0x3308, lo: 0xa6, hi: 0xaa},
{value: 0x0040, lo: 0xab, hi: 0xbf},
- // Block 0xe3, offset 0x6b1
+ // Block 0xea, offset 0x6d5
{value: 0x0000, lo: 0x05},
- {value: 0x0008, lo: 0x80, hi: 0x84},
+ {value: 0x0808, lo: 0x80, hi: 0x84},
{value: 0x0040, lo: 0x85, hi: 0x86},
- {value: 0x0018, lo: 0x87, hi: 0x8f},
- {value: 0x1308, lo: 0x90, hi: 0x96},
+ {value: 0x0818, lo: 0x87, hi: 0x8f},
+ {value: 0x3308, lo: 0x90, hi: 0x96},
{value: 0x0040, lo: 0x97, hi: 0xbf},
- // Block 0xe4, offset 0x6b7
+ // Block 0xeb, offset 0x6db
{value: 0x0000, lo: 0x07},
- {value: 0x0208, lo: 0x80, hi: 0x83},
- {value: 0x1308, lo: 0x84, hi: 0x8a},
+ {value: 0x0a08, lo: 0x80, hi: 0x83},
+ {value: 0x3308, lo: 0x84, hi: 0x8a},
{value: 0x0040, lo: 0x8b, hi: 0x8f},
- {value: 0x0008, lo: 0x90, hi: 0x99},
+ {value: 0x0808, lo: 0x90, hi: 0x99},
{value: 0x0040, lo: 0x9a, hi: 0x9d},
- {value: 0x0018, lo: 0x9e, hi: 0x9f},
+ {value: 0x0818, lo: 0x9e, hi: 0x9f},
{value: 0x0040, lo: 0xa0, hi: 0xbf},
- // Block 0xe5, offset 0x6bf
+ // Block 0xec, offset 0x6e3
{value: 0x0000, lo: 0x03},
{value: 0x0040, lo: 0x80, hi: 0xaf},
{value: 0x0018, lo: 0xb0, hi: 0xb1},
{value: 0x0040, lo: 0xb2, hi: 0xbf},
- // Block 0xe6, offset 0x6c3
+ // Block 0xed, offset 0x6e7
{value: 0x0000, lo: 0x03},
{value: 0x0018, lo: 0x80, hi: 0xab},
{value: 0x0040, lo: 0xac, hi: 0xaf},
{value: 0x0018, lo: 0xb0, hi: 0xbf},
- // Block 0xe7, offset 0x6c7
+ // Block 0xee, offset 0x6eb
{value: 0x0000, lo: 0x05},
{value: 0x0018, lo: 0x80, hi: 0x93},
{value: 0x0040, lo: 0x94, hi: 0x9f},
{value: 0x0018, lo: 0xa0, hi: 0xae},
{value: 0x0040, lo: 0xaf, hi: 0xb0},
{value: 0x0018, lo: 0xb1, hi: 0xbf},
- // Block 0xe8, offset 0x6cd
+ // Block 0xef, offset 0x6f1
{value: 0x0000, lo: 0x05},
{value: 0x0040, lo: 0x80, hi: 0x80},
{value: 0x0018, lo: 0x81, hi: 0x8f},
{value: 0x0040, lo: 0x90, hi: 0x90},
{value: 0x0018, lo: 0x91, hi: 0xb5},
{value: 0x0040, lo: 0xb6, hi: 0xbf},
- // Block 0xe9, offset 0x6d3
+ // Block 0xf0, offset 0x6f7
{value: 0x0000, lo: 0x04},
{value: 0x0018, lo: 0x80, hi: 0x8f},
{value: 0xc1c1, lo: 0x90, hi: 0x90},
{value: 0x0018, lo: 0x91, hi: 0xac},
{value: 0x0040, lo: 0xad, hi: 0xbf},
- // Block 0xea, offset 0x6d8
+ // Block 0xf1, offset 0x6fc
{value: 0x0000, lo: 0x02},
{value: 0x0040, lo: 0x80, hi: 0xa5},
{value: 0x0018, lo: 0xa6, hi: 0xbf},
- // Block 0xeb, offset 0x6db
- {value: 0x0000, lo: 0x0d},
+ // Block 0xf2, offset 0x6ff
+ {value: 0x0000, lo: 0x0f},
{value: 0xc7e9, lo: 0x80, hi: 0x80},
{value: 0xc839, lo: 0x81, hi: 0x81},
{value: 0xc889, lo: 0x82, hi: 0x82},
@@ -4344,84 +4420,88 @@ var idnaSparseValues = [1876]valueRange{
{value: 0x0040, lo: 0x89, hi: 0x8f},
{value: 0xcab9, lo: 0x90, hi: 0x90},
{value: 0xcad9, lo: 0x91, hi: 0x91},
- {value: 0x0040, lo: 0x92, hi: 0xbf},
- // Block 0xec, offset 0x6e9
+ {value: 0x0040, lo: 0x92, hi: 0x9f},
+ {value: 0x0018, lo: 0xa0, hi: 0xa5},
+ {value: 0x0040, lo: 0xa6, hi: 0xbf},
+ // Block 0xf3, offset 0x70f
{value: 0x0000, lo: 0x06},
- {value: 0x0018, lo: 0x80, hi: 0x92},
- {value: 0x0040, lo: 0x93, hi: 0x9f},
+ {value: 0x0018, lo: 0x80, hi: 0x94},
+ {value: 0x0040, lo: 0x95, hi: 0x9f},
{value: 0x0018, lo: 0xa0, hi: 0xac},
{value: 0x0040, lo: 0xad, hi: 0xaf},
- {value: 0x0018, lo: 0xb0, hi: 0xb6},
- {value: 0x0040, lo: 0xb7, hi: 0xbf},
- // Block 0xed, offset 0x6f0
+ {value: 0x0018, lo: 0xb0, hi: 0xb8},
+ {value: 0x0040, lo: 0xb9, hi: 0xbf},
+ // Block 0xf4, offset 0x716
{value: 0x0000, lo: 0x02},
{value: 0x0018, lo: 0x80, hi: 0xb3},
{value: 0x0040, lo: 0xb4, hi: 0xbf},
- // Block 0xee, offset 0x6f3
+ // Block 0xf5, offset 0x719
{value: 0x0000, lo: 0x02},
{value: 0x0018, lo: 0x80, hi: 0x94},
{value: 0x0040, lo: 0x95, hi: 0xbf},
- // Block 0xef, offset 0x6f6
+ // Block 0xf6, offset 0x71c
{value: 0x0000, lo: 0x03},
{value: 0x0018, lo: 0x80, hi: 0x8b},
{value: 0x0040, lo: 0x8c, hi: 0x8f},
{value: 0x0018, lo: 0x90, hi: 0xbf},
- // Block 0xf0, offset 0x6fa
+ // Block 0xf7, offset 0x720
{value: 0x0000, lo: 0x05},
{value: 0x0018, lo: 0x80, hi: 0x87},
{value: 0x0040, lo: 0x88, hi: 0x8f},
{value: 0x0018, lo: 0x90, hi: 0x99},
{value: 0x0040, lo: 0x9a, hi: 0x9f},
{value: 0x0018, lo: 0xa0, hi: 0xbf},
- // Block 0xf1, offset 0x700
+ // Block 0xf8, offset 0x726
{value: 0x0000, lo: 0x04},
{value: 0x0018, lo: 0x80, hi: 0x87},
{value: 0x0040, lo: 0x88, hi: 0x8f},
{value: 0x0018, lo: 0x90, hi: 0xad},
{value: 0x0040, lo: 0xae, hi: 0xbf},
- // Block 0xf2, offset 0x705
- {value: 0x0000, lo: 0x09},
- {value: 0x0040, lo: 0x80, hi: 0x8f},
- {value: 0x0018, lo: 0x90, hi: 0x9e},
- {value: 0x0040, lo: 0x9f, hi: 0x9f},
- {value: 0x0018, lo: 0xa0, hi: 0xa7},
- {value: 0x0040, lo: 0xa8, hi: 0xaf},
- {value: 0x0018, lo: 0xb0, hi: 0xb0},
- {value: 0x0040, lo: 0xb1, hi: 0xb2},
- {value: 0x0018, lo: 0xb3, hi: 0xbe},
- {value: 0x0040, lo: 0xbf, hi: 0xbf},
- // Block 0xf3, offset 0x70f
+ // Block 0xf9, offset 0x72b
{value: 0x0000, lo: 0x04},
{value: 0x0018, lo: 0x80, hi: 0x8b},
{value: 0x0040, lo: 0x8c, hi: 0x8f},
- {value: 0x0018, lo: 0x90, hi: 0x9e},
- {value: 0x0040, lo: 0x9f, hi: 0xbf},
- // Block 0xf4, offset 0x714
- {value: 0x0000, lo: 0x02},
- {value: 0x0018, lo: 0x80, hi: 0x91},
- {value: 0x0040, lo: 0x92, hi: 0xbf},
- // Block 0xf5, offset 0x717
+ {value: 0x0018, lo: 0x90, hi: 0xbe},
+ {value: 0x0040, lo: 0xbf, hi: 0xbf},
+ // Block 0xfa, offset 0x730
+ {value: 0x0000, lo: 0x04},
+ {value: 0x0018, lo: 0x80, hi: 0x8c},
+ {value: 0x0040, lo: 0x8d, hi: 0x8f},
+ {value: 0x0018, lo: 0x90, hi: 0xab},
+ {value: 0x0040, lo: 0xac, hi: 0xbf},
+ // Block 0xfb, offset 0x735
{value: 0x0000, lo: 0x02},
+ {value: 0x0018, lo: 0x80, hi: 0x97},
+ {value: 0x0040, lo: 0x98, hi: 0xbf},
+ // Block 0xfc, offset 0x738
+ {value: 0x0000, lo: 0x04},
{value: 0x0018, lo: 0x80, hi: 0x80},
- {value: 0x0040, lo: 0x81, hi: 0xbf},
- // Block 0xf6, offset 0x71a
+ {value: 0x0040, lo: 0x81, hi: 0x8f},
+ {value: 0x0018, lo: 0x90, hi: 0xa6},
+ {value: 0x0040, lo: 0xa7, hi: 0xbf},
+ // Block 0xfd, offset 0x73d
{value: 0x0000, lo: 0x02},
{value: 0x0008, lo: 0x80, hi: 0x96},
{value: 0x0040, lo: 0x97, hi: 0xbf},
- // Block 0xf7, offset 0x71d
+ // Block 0xfe, offset 0x740
{value: 0x0000, lo: 0x02},
{value: 0x0008, lo: 0x80, hi: 0xb4},
{value: 0x0040, lo: 0xb5, hi: 0xbf},
- // Block 0xf8, offset 0x720
+ // Block 0xff, offset 0x743
{value: 0x0000, lo: 0x03},
{value: 0x0008, lo: 0x80, hi: 0x9d},
{value: 0x0040, lo: 0x9e, hi: 0x9f},
{value: 0x0008, lo: 0xa0, hi: 0xbf},
- // Block 0xf9, offset 0x724
- {value: 0x0000, lo: 0x02},
+ // Block 0x100, offset 0x747
+ {value: 0x0000, lo: 0x03},
{value: 0x0008, lo: 0x80, hi: 0xa1},
- {value: 0x0040, lo: 0xa2, hi: 0xbf},
- // Block 0xfa, offset 0x727
+ {value: 0x0040, lo: 0xa2, hi: 0xaf},
+ {value: 0x0008, lo: 0xb0, hi: 0xbf},
+ // Block 0x101, offset 0x74b
+ {value: 0x0000, lo: 0x02},
+ {value: 0x0008, lo: 0x80, hi: 0xa0},
+ {value: 0x0040, lo: 0xa1, hi: 0xbf},
+ // Block 0x102, offset 0x74e
{value: 0x0020, lo: 0x0f},
{value: 0xdeb9, lo: 0x80, hi: 0x89},
{value: 0x8dfd, lo: 0x8a, hi: 0x8a},
@@ -4438,7 +4518,7 @@ var idnaSparseValues = [1876]valueRange{
{value: 0xe4f9, lo: 0xba, hi: 0xba},
{value: 0x8edd, lo: 0xbb, hi: 0xbb},
{value: 0xe519, lo: 0xbc, hi: 0xbf},
- // Block 0xfb, offset 0x737
+ // Block 0x103, offset 0x75e
{value: 0x0020, lo: 0x10},
{value: 0x937d, lo: 0x80, hi: 0x80},
{value: 0xf099, lo: 0x81, hi: 0x86},
@@ -4455,23 +4535,23 @@ var idnaSparseValues = [1876]valueRange{
{value: 0xf4d9, lo: 0xae, hi: 0xaf},
{value: 0x94dd, lo: 0xb0, hi: 0xb1},
{value: 0xf519, lo: 0xb2, hi: 0xbe},
- {value: 0x0040, lo: 0xbf, hi: 0xbf},
- // Block 0xfc, offset 0x748
+ {value: 0x2040, lo: 0xbf, hi: 0xbf},
+ // Block 0x104, offset 0x76f
{value: 0x0000, lo: 0x04},
{value: 0x0040, lo: 0x80, hi: 0x80},
{value: 0x0340, lo: 0x81, hi: 0x81},
{value: 0x0040, lo: 0x82, hi: 0x9f},
{value: 0x0340, lo: 0xa0, hi: 0xbf},
- // Block 0xfd, offset 0x74d
+ // Block 0x105, offset 0x774
{value: 0x0000, lo: 0x01},
{value: 0x0340, lo: 0x80, hi: 0xbf},
- // Block 0xfe, offset 0x74f
+ // Block 0x106, offset 0x776
{value: 0x0000, lo: 0x01},
- {value: 0x13c0, lo: 0x80, hi: 0xbf},
- // Block 0xff, offset 0x751
+ {value: 0x33c0, lo: 0x80, hi: 0xbf},
+ // Block 0x107, offset 0x778
{value: 0x0000, lo: 0x02},
- {value: 0x13c0, lo: 0x80, hi: 0xaf},
+ {value: 0x33c0, lo: 0x80, hi: 0xaf},
{value: 0x0040, lo: 0xb0, hi: 0xbf},
}
-// Total table size 41559 bytes (40KiB); checksum: F4A1FA4E
+// Total table size 42115 bytes (41KiB); checksum: F4A1FA4E
diff --git a/vendor/golang.org/x/net/idna/trieval.go b/vendor/golang.org/x/net/idna/trieval.go
index 63cb03b..7a8cf88 100644
--- a/vendor/golang.org/x/net/idna/trieval.go
+++ b/vendor/golang.org/x/net/idna/trieval.go
@@ -26,9 +26,9 @@ package idna
// 15..3 index into xor or mapping table
// }
// } else {
-// 15..13 unused
-// 12 modifier (including virama)
-// 11 virama modifier
+// 15..14 unused
+// 13 mayNeedNorm
+// 12..11 attributes
// 10..8 joining type
// 7..3 category type
// }
@@ -49,15 +49,20 @@ const (
joinShift = 8
joinMask = 0x07
- viramaModifier = 0x0800
+ // Attributes
+ attributesMask = 0x1800
+ viramaModifier = 0x1800
modifier = 0x1000
+ rtl = 0x0800
+
+ mayNeedNorm = 0x2000
)
// A category corresponds to a category defined in the IDNA mapping table.
type category uint16
const (
- unknown category = 0 // not defined currently in unicode.
+ unknown category = 0 // not currently defined in unicode.
mapped category = 1
disallowedSTD3Mapped category = 2
deviation category = 3
@@ -110,5 +115,5 @@ func (c info) isModifier() bool {
}
func (c info) isViramaModifier() bool {
- return c&(viramaModifier|catSmallMask) == viramaModifier
+ return c&(attributesMask|catSmallMask) == viramaModifier
}
diff --git a/vendor/golang.org/x/net/internal/socket/socket.go b/vendor/golang.org/x/net/internal/socket/socket.go
index 729dea1..5f9730e 100644
--- a/vendor/golang.org/x/net/internal/socket/socket.go
+++ b/vendor/golang.org/x/net/internal/socket/socket.go
@@ -110,7 +110,7 @@ func ControlMessageSpace(dataLen int) int {
type ControlMessage []byte
// Data returns the data field of the control message at the head on
-// w.
+// m.
func (m ControlMessage) Data(dataLen int) []byte {
l := controlHeaderLen()
if len(m) < l || len(m) < l+dataLen {
@@ -119,7 +119,7 @@ func (m ControlMessage) Data(dataLen int) []byte {
return m[l : l+dataLen]
}
-// Next returns the control message at the next on w.
+// Next returns the control message at the next on m.
//
// Next works only for standard control messages.
func (m ControlMessage) Next(dataLen int) ControlMessage {
@@ -131,7 +131,7 @@ func (m ControlMessage) Next(dataLen int) ControlMessage {
}
// MarshalHeader marshals the header fields of the control message at
-// the head on w.
+// the head on m.
func (m ControlMessage) MarshalHeader(lvl, typ, dataLen int) error {
if len(m) < controlHeaderLen() {
return errors.New("short message")
@@ -142,7 +142,7 @@ func (m ControlMessage) MarshalHeader(lvl, typ, dataLen int) error {
}
// ParseHeader parses and returns the header fields of the control
-// message at the head on w.
+// message at the head on m.
func (m ControlMessage) ParseHeader() (lvl, typ, dataLen int, err error) {
l := controlHeaderLen()
if len(m) < l {
@@ -152,7 +152,7 @@ func (m ControlMessage) ParseHeader() (lvl, typ, dataLen int, err error) {
return h.lvl(), h.typ(), int(uint64(h.len()) - uint64(l)), nil
}
-// Marshal marshals the control message at the head on w, and returns
+// Marshal marshals the control message at the head on m, and returns
// the next control message.
func (m ControlMessage) Marshal(lvl, typ int, data []byte) (ControlMessage, error) {
l := len(data)
@@ -167,7 +167,7 @@ func (m ControlMessage) Marshal(lvl, typ int, data []byte) (ControlMessage, erro
return m.Next(l), nil
}
-// Parse parses w as a single or multiple control messages.
+// Parse parses m as a single or multiple control messages.
//
// Parse works for both standard and compatible messages.
func (m ControlMessage) Parse() ([]ControlMessage, error) {
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go b/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go
new file mode 100644
index 0000000..e2987f7
--- /dev/null
+++ b/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go
@@ -0,0 +1,61 @@
+// Created by cgo -godefs - DO NOT EDIT
+// cgo -godefs defs_darwin.go
+
+package socket
+
+const (
+ sysAF_UNSPEC = 0x0
+ sysAF_INET = 0x2
+ sysAF_INET6 = 0x1e
+
+ sysSOCK_RAW = 0x3
+)
+
+type iovec struct {
+ Base *byte
+ Len uint64
+}
+
+type msghdr struct {
+ Name *byte
+ Namelen uint32
+ Pad_cgo_0 [4]byte
+ Iov *iovec
+ Iovlen int32
+ Pad_cgo_1 [4]byte
+ Control *byte
+ Controllen uint32
+ Flags int32
+}
+
+type cmsghdr struct {
+ Len uint32
+ Level int32
+ Type int32
+}
+
+type sockaddrInet struct {
+ Len uint8
+ Family uint8
+ Port uint16
+ Addr [4]byte /* in_addr */
+ Zero [8]int8
+}
+
+type sockaddrInet6 struct {
+ Len uint8
+ Family uint8
+ Port uint16
+ Flowinfo uint32
+ Addr [16]byte /* in6_addr */
+ Scope_id uint32
+}
+
+const (
+ sizeofIovec = 0x10
+ sizeofMsghdr = 0x30
+ sizeofCmsghdr = 0xc
+
+ sizeofSockaddrInet = 0x10
+ sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/sys/unix/.gitignore b/vendor/golang.org/x/sys/unix/.gitignore
index e482715..e3e0fc6 100644
--- a/vendor/golang.org/x/sys/unix/.gitignore
+++ b/vendor/golang.org/x/sys/unix/.gitignore
@@ -1 +1,2 @@
_obj/
+unix.test
diff --git a/vendor/golang.org/x/sys/unix/asm_linux_386.s b/vendor/golang.org/x/sys/unix/asm_linux_386.s
index 4db2909..448bebb 100644
--- a/vendor/golang.org/x/sys/unix/asm_linux_386.s
+++ b/vendor/golang.org/x/sys/unix/asm_linux_386.s
@@ -10,21 +10,51 @@
// System calls for 386, Linux
//
+// See ../runtime/sys_linux_386.s for the reason why we always use int 0x80
+// instead of the glibc-specific "CALL 0x10(GS)".
+#define INVOKE_SYSCALL INT $0x80
+
// Just jump to package syscall's implementation for all these functions.
// The runtime may know about them.
-TEXT ·Syscall(SB),NOSPLIT,$0-28
+TEXT ·Syscall(SB),NOSPLIT,$0-28
JMP syscall·Syscall(SB)
-TEXT ·Syscall6(SB),NOSPLIT,$0-40
+TEXT ·Syscall6(SB),NOSPLIT,$0-40
JMP syscall·Syscall6(SB)
+TEXT ·SyscallNoError(SB),NOSPLIT,$0-24
+ CALL runtime·entersyscall(SB)
+ MOVL trap+0(FP), AX // syscall entry
+ MOVL a1+4(FP), BX
+ MOVL a2+8(FP), CX
+ MOVL a3+12(FP), DX
+ MOVL $0, SI
+ MOVL $0, DI
+ INVOKE_SYSCALL
+ MOVL AX, r1+16(FP)
+ MOVL DX, r2+20(FP)
+ CALL runtime·exitsyscall(SB)
+ RET
+
TEXT ·RawSyscall(SB),NOSPLIT,$0-28
JMP syscall·RawSyscall(SB)
-TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
+TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
JMP syscall·RawSyscall6(SB)
+TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-24
+ MOVL trap+0(FP), AX // syscall entry
+ MOVL a1+4(FP), BX
+ MOVL a2+8(FP), CX
+ MOVL a3+12(FP), DX
+ MOVL $0, SI
+ MOVL $0, DI
+ INVOKE_SYSCALL
+ MOVL AX, r1+16(FP)
+ MOVL DX, r2+20(FP)
+ RET
+
TEXT ·socketcall(SB),NOSPLIT,$0-36
JMP syscall·socketcall(SB)
diff --git a/vendor/golang.org/x/sys/unix/asm_linux_amd64.s b/vendor/golang.org/x/sys/unix/asm_linux_amd64.s
index 44e25c6..c6468a9 100644
--- a/vendor/golang.org/x/sys/unix/asm_linux_amd64.s
+++ b/vendor/golang.org/x/sys/unix/asm_linux_amd64.s
@@ -13,17 +13,45 @@
// Just jump to package syscall's implementation for all these functions.
// The runtime may know about them.
-TEXT ·Syscall(SB),NOSPLIT,$0-56
+TEXT ·Syscall(SB),NOSPLIT,$0-56
JMP syscall·Syscall(SB)
TEXT ·Syscall6(SB),NOSPLIT,$0-80
JMP syscall·Syscall6(SB)
+TEXT ·SyscallNoError(SB),NOSPLIT,$0-48
+ CALL runtime·entersyscall(SB)
+ MOVQ a1+8(FP), DI
+ MOVQ a2+16(FP), SI
+ MOVQ a3+24(FP), DX
+ MOVQ $0, R10
+ MOVQ $0, R8
+ MOVQ $0, R9
+ MOVQ trap+0(FP), AX // syscall entry
+ SYSCALL
+ MOVQ AX, r1+32(FP)
+ MOVQ DX, r2+40(FP)
+ CALL runtime·exitsyscall(SB)
+ RET
+
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
JMP syscall·RawSyscall(SB)
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
JMP syscall·RawSyscall6(SB)
+TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48
+ MOVQ a1+8(FP), DI
+ MOVQ a2+16(FP), SI
+ MOVQ a3+24(FP), DX
+ MOVQ $0, R10
+ MOVQ $0, R8
+ MOVQ $0, R9
+ MOVQ trap+0(FP), AX // syscall entry
+ SYSCALL
+ MOVQ AX, r1+32(FP)
+ MOVQ DX, r2+40(FP)
+ RET
+
TEXT ·gettimeofday(SB),NOSPLIT,$0-16
JMP syscall·gettimeofday(SB)
diff --git a/vendor/golang.org/x/sys/unix/asm_linux_arm.s b/vendor/golang.org/x/sys/unix/asm_linux_arm.s
index cf0b574..b90a883 100644
--- a/vendor/golang.org/x/sys/unix/asm_linux_arm.s
+++ b/vendor/golang.org/x/sys/unix/asm_linux_arm.s
@@ -13,17 +13,45 @@
// Just jump to package syscall's implementation for all these functions.
// The runtime may know about them.
-TEXT ·Syscall(SB),NOSPLIT,$0-28
+TEXT ·Syscall(SB),NOSPLIT,$0-28
B syscall·Syscall(SB)
-TEXT ·Syscall6(SB),NOSPLIT,$0-40
+TEXT ·Syscall6(SB),NOSPLIT,$0-40
B syscall·Syscall6(SB)
+TEXT ·SyscallNoError(SB),NOSPLIT,$0-24
+ BL runtime·entersyscall(SB)
+ MOVW trap+0(FP), R7
+ MOVW a1+4(FP), R0
+ MOVW a2+8(FP), R1
+ MOVW a3+12(FP), R2
+ MOVW $0, R3
+ MOVW $0, R4
+ MOVW $0, R5
+ SWI $0
+ MOVW R0, r1+16(FP)
+ MOVW $0, R0
+ MOVW R0, r2+20(FP)
+ BL runtime·exitsyscall(SB)
+ RET
+
+
TEXT ·RawSyscall(SB),NOSPLIT,$0-28
B syscall·RawSyscall(SB)
-TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
+TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
B syscall·RawSyscall6(SB)
+TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-24
+ MOVW trap+0(FP), R7 // syscall entry
+ MOVW a1+4(FP), R0
+ MOVW a2+8(FP), R1
+ MOVW a3+12(FP), R2
+ SWI $0
+ MOVW R0, r1+16(FP)
+ MOVW $0, R0
+ MOVW R0, r2+20(FP)
+ RET
+
TEXT ·seek(SB),NOSPLIT,$0-32
B syscall·seek(SB)
diff --git a/vendor/golang.org/x/sys/unix/asm_linux_arm64.s b/vendor/golang.org/x/sys/unix/asm_linux_arm64.s
index 4be9bfe..d84fd46 100644
--- a/vendor/golang.org/x/sys/unix/asm_linux_arm64.s
+++ b/vendor/golang.org/x/sys/unix/asm_linux_arm64.s
@@ -11,14 +11,42 @@
// Just jump to package syscall's implementation for all these functions.
// The runtime may know about them.
-TEXT ·Syscall(SB),NOSPLIT,$0-56
+TEXT ·Syscall(SB),NOSPLIT,$0-56
B syscall·Syscall(SB)
TEXT ·Syscall6(SB),NOSPLIT,$0-80
B syscall·Syscall6(SB)
+TEXT ·Syscall(SB),NOSPLIT,$0-48
+ BL runtime·entersyscall(SB)
+ MOVD a1+8(FP), R0
+ MOVD a2+16(FP), R1
+ MOVD a3+24(FP), R2
+ MOVD $0, R3
+ MOVD $0, R4
+ MOVD $0, R5
+ MOVD trap+0(FP), R8 // syscall entry
+ SVC
+ MOVD R0, r1+32(FP) // r1
+ MOVD R1, r2+40(FP) // r2
+ BL runtime·exitsyscall(SB)
+ RET
+
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
B syscall·RawSyscall(SB)
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
B syscall·RawSyscall6(SB)
+
+TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48
+ MOVD a1+8(FP), R0
+ MOVD a2+16(FP), R1
+ MOVD a3+24(FP), R2
+ MOVD $0, R3
+ MOVD $0, R4
+ MOVD $0, R5
+ MOVD trap+0(FP), R8 // syscall entry
+ SVC
+ MOVD R0, r1+32(FP)
+ MOVD R1, r2+40(FP)
+ RET
diff --git a/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s b/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s
index 724e580..ab9d638 100644
--- a/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s
+++ b/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s
@@ -15,14 +15,42 @@
// Just jump to package syscall's implementation for all these functions.
// The runtime may know about them.
-TEXT ·Syscall(SB),NOSPLIT,$0-56
+TEXT ·Syscall(SB),NOSPLIT,$0-56
JMP syscall·Syscall(SB)
-TEXT ·Syscall6(SB),NOSPLIT,$0-80
+TEXT ·Syscall6(SB),NOSPLIT,$0-80
JMP syscall·Syscall6(SB)
-TEXT ·RawSyscall(SB),NOSPLIT,$0-56
+TEXT ·SyscallNoError(SB),NOSPLIT,$0-48
+ JAL runtime·entersyscall(SB)
+ MOVV a1+8(FP), R4
+ MOVV a2+16(FP), R5
+ MOVV a3+24(FP), R6
+ MOVV R0, R7
+ MOVV R0, R8
+ MOVV R0, R9
+ MOVV trap+0(FP), R2 // syscall entry
+ SYSCALL
+ MOVV R2, r1+32(FP)
+ MOVV R3, r2+40(FP)
+ JAL runtime·exitsyscall(SB)
+ RET
+
+TEXT ·RawSyscall(SB),NOSPLIT,$0-56
JMP syscall·RawSyscall(SB)
-TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
+TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
JMP syscall·RawSyscall6(SB)
+
+TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48
+ MOVV a1+8(FP), R4
+ MOVV a2+16(FP), R5
+ MOVV a3+24(FP), R6
+ MOVV R0, R7
+ MOVV R0, R8
+ MOVV R0, R9
+ MOVV trap+0(FP), R2 // syscall entry
+ SYSCALL
+ MOVV R2, r1+32(FP)
+ MOVV R3, r2+40(FP)
+ RET
diff --git a/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s b/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s
index 2ea4257..99e5399 100644
--- a/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s
+++ b/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s
@@ -15,17 +15,40 @@
// Just jump to package syscall's implementation for all these functions.
// The runtime may know about them.
-TEXT ·Syscall(SB),NOSPLIT,$0-28
+TEXT ·Syscall(SB),NOSPLIT,$0-28
JMP syscall·Syscall(SB)
-TEXT ·Syscall6(SB),NOSPLIT,$0-40
+TEXT ·Syscall6(SB),NOSPLIT,$0-40
JMP syscall·Syscall6(SB)
-TEXT ·Syscall9(SB),NOSPLIT,$0-52
+TEXT ·Syscall9(SB),NOSPLIT,$0-52
JMP syscall·Syscall9(SB)
-TEXT ·RawSyscall(SB),NOSPLIT,$0-28
+TEXT ·SyscallNoError(SB),NOSPLIT,$0-24
+ JAL runtime·entersyscall(SB)
+ MOVW a1+4(FP), R4
+ MOVW a2+8(FP), R5
+ MOVW a3+12(FP), R6
+ MOVW R0, R7
+ MOVW trap+0(FP), R2 // syscall entry
+ SYSCALL
+ MOVW R2, r1+16(FP) // r1
+ MOVW R3, r2+20(FP) // r2
+ JAL runtime·exitsyscall(SB)
+ RET
+
+TEXT ·RawSyscall(SB),NOSPLIT,$0-28
JMP syscall·RawSyscall(SB)
-TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
+TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
JMP syscall·RawSyscall6(SB)
+
+TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-24
+ MOVW a1+4(FP), R4
+ MOVW a2+8(FP), R5
+ MOVW a3+12(FP), R6
+ MOVW trap+0(FP), R2 // syscall entry
+ SYSCALL
+ MOVW R2, r1+16(FP)
+ MOVW R3, r2+20(FP)
+ RET
diff --git a/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s b/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s
index 8d231fe..649e587 100644
--- a/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s
+++ b/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s
@@ -15,14 +15,42 @@
// Just jump to package syscall's implementation for all these functions.
// The runtime may know about them.
-TEXT ·Syscall(SB),NOSPLIT,$0-56
+TEXT ·Syscall(SB),NOSPLIT,$0-56
BR syscall·Syscall(SB)
TEXT ·Syscall6(SB),NOSPLIT,$0-80
BR syscall·Syscall6(SB)
+TEXT ·SyscallNoError(SB),NOSPLIT,$0-48
+ BL runtime·entersyscall(SB)
+ MOVD a1+8(FP), R3
+ MOVD a2+16(FP), R4
+ MOVD a3+24(FP), R5
+ MOVD R0, R6
+ MOVD R0, R7
+ MOVD R0, R8
+ MOVD trap+0(FP), R9 // syscall entry
+ SYSCALL R9
+ MOVD R3, r1+32(FP)
+ MOVD R4, r2+40(FP)
+ BL runtime·exitsyscall(SB)
+ RET
+
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
BR syscall·RawSyscall(SB)
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
BR syscall·RawSyscall6(SB)
+
+TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48
+ MOVD a1+8(FP), R3
+ MOVD a2+16(FP), R4
+ MOVD a3+24(FP), R5
+ MOVD R0, R6
+ MOVD R0, R7
+ MOVD R0, R8
+ MOVD trap+0(FP), R9 // syscall entry
+ SYSCALL R9
+ MOVD R3, r1+32(FP)
+ MOVD R4, r2+40(FP)
+ RET
diff --git a/vendor/golang.org/x/sys/unix/asm_linux_s390x.s b/vendor/golang.org/x/sys/unix/asm_linux_s390x.s
index 1188985..a5a863c 100644
--- a/vendor/golang.org/x/sys/unix/asm_linux_s390x.s
+++ b/vendor/golang.org/x/sys/unix/asm_linux_s390x.s
@@ -21,8 +21,36 @@ TEXT ·Syscall(SB),NOSPLIT,$0-56
TEXT ·Syscall6(SB),NOSPLIT,$0-80
BR syscall·Syscall6(SB)
+TEXT ·SyscallNoError(SB),NOSPLIT,$0-48
+ BL runtime·entersyscall(SB)
+ MOVD a1+8(FP), R2
+ MOVD a2+16(FP), R3
+ MOVD a3+24(FP), R4
+ MOVD $0, R5
+ MOVD $0, R6
+ MOVD $0, R7
+ MOVD trap+0(FP), R1 // syscall entry
+ SYSCALL
+ MOVD R2, r1+32(FP)
+ MOVD R3, r2+40(FP)
+ BL runtime·exitsyscall(SB)
+ RET
+
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
BR syscall·RawSyscall(SB)
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
BR syscall·RawSyscall6(SB)
+
+TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48
+ MOVD a1+8(FP), R2
+ MOVD a2+16(FP), R3
+ MOVD a3+24(FP), R4
+ MOVD $0, R5
+ MOVD $0, R6
+ MOVD $0, R7
+ MOVD trap+0(FP), R1 // syscall entry
+ SYSCALL
+ MOVD R2, r1+32(FP)
+ MOVD R3, r2+40(FP)
+ RET
diff --git a/vendor/golang.org/x/sys/unix/creds_test.go b/vendor/golang.org/x/sys/unix/creds_test.go
index 7ae3305..6b292b1 100644
--- a/vendor/golang.org/x/sys/unix/creds_test.go
+++ b/vendor/golang.org/x/sys/unix/creds_test.go
@@ -1,4 +1,4 @@
-// Copyright 2012 The Go Authors. All rights reserved.
+// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
@@ -8,6 +8,7 @@ package unix_test
import (
"bytes"
+ "go/build"
"net"
"os"
"syscall"
@@ -35,6 +36,11 @@ func TestSCMCredentials(t *testing.T) {
}
for _, tt := range socketTypeTests {
+ if tt.socketType == unix.SOCK_DGRAM && !atLeast1p10() {
+ t.Log("skipping DGRAM test on pre-1.10")
+ continue
+ }
+
fds, err := unix.Socketpair(unix.AF_LOCAL, tt.socketType, 0)
if err != nil {
t.Fatalf("Socketpair: %v", err)
@@ -134,3 +140,13 @@ func TestSCMCredentials(t *testing.T) {
}
}
}
+
+// atLeast1p10 reports whether we are running on Go 1.10 or later.
+func atLeast1p10() bool {
+ for _, ver := range build.Default.ReleaseTags {
+ if ver == "go1.10" {
+ return true
+ }
+ }
+ return false
+}
diff --git a/vendor/golang.org/x/sys/unix/dev_darwin_test.go b/vendor/golang.org/x/sys/unix/dev_darwin_test.go
index 48d0448..bf1adf3 100644
--- a/vendor/golang.org/x/sys/unix/dev_darwin_test.go
+++ b/vendor/golang.org/x/sys/unix/dev_darwin_test.go
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+// +build go1.7
+
package unix_test
import (
diff --git a/vendor/golang.org/x/sys/unix/dev_dragonfly_test.go b/vendor/golang.org/x/sys/unix/dev_dragonfly_test.go
index 2caba08..9add376 100644
--- a/vendor/golang.org/x/sys/unix/dev_dragonfly_test.go
+++ b/vendor/golang.org/x/sys/unix/dev_dragonfly_test.go
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+// +build go1.7
+
package unix_test
import (
diff --git a/vendor/golang.org/x/sys/unix/dev_linux_test.go b/vendor/golang.org/x/sys/unix/dev_linux_test.go
index 6e001f3..2fd3ead 100644
--- a/vendor/golang.org/x/sys/unix/dev_linux_test.go
+++ b/vendor/golang.org/x/sys/unix/dev_linux_test.go
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+// +build go1.7
+
package unix_test
import (
diff --git a/vendor/golang.org/x/sys/unix/dev_netbsd_test.go b/vendor/golang.org/x/sys/unix/dev_netbsd_test.go
index c39a80a..441058a 100644
--- a/vendor/golang.org/x/sys/unix/dev_netbsd_test.go
+++ b/vendor/golang.org/x/sys/unix/dev_netbsd_test.go
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+// +build go1.7
+
package unix_test
import (
@@ -18,11 +20,9 @@ func TestDevices(t *testing.T) {
minor uint32
}{
// well known major/minor numbers according to /dev/MAKEDEV on
- // NetBSD 7.0
+ // NetBSD 8.0
{"/dev/null", 2, 2},
{"/dev/zero", 2, 12},
- {"/dev/ttyp0", 5, 0},
- {"/dev/ttyp1", 5, 1},
{"/dev/random", 46, 0},
{"/dev/urandom", 46, 1},
}
diff --git a/vendor/golang.org/x/sys/unix/dev_openbsd_test.go b/vendor/golang.org/x/sys/unix/dev_openbsd_test.go
index 5635d27..e6cb64f 100644
--- a/vendor/golang.org/x/sys/unix/dev_openbsd_test.go
+++ b/vendor/golang.org/x/sys/unix/dev_openbsd_test.go
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+// +build go1.7
+
package unix_test
import (
diff --git a/vendor/golang.org/x/sys/unix/dev_solaris_test.go b/vendor/golang.org/x/sys/unix/dev_solaris_test.go
index db58c0d..656508c 100644
--- a/vendor/golang.org/x/sys/unix/dev_solaris_test.go
+++ b/vendor/golang.org/x/sys/unix/dev_solaris_test.go
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+// +build go1.7
+
package unix_test
import (
diff --git a/vendor/golang.org/x/sys/unix/env_unix.go b/vendor/golang.org/x/sys/unix/env_unix.go
index 45e281a..2e06b33 100644
--- a/vendor/golang.org/x/sys/unix/env_unix.go
+++ b/vendor/golang.org/x/sys/unix/env_unix.go
@@ -1,4 +1,4 @@
-// Copyright 2010 The Go Authors. All rights reserved.
+// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
diff --git a/vendor/golang.org/x/sys/unix/env_unset.go b/vendor/golang.org/x/sys/unix/env_unset.go
index 9222262..c44fdc4 100644
--- a/vendor/golang.org/x/sys/unix/env_unset.go
+++ b/vendor/golang.org/x/sys/unix/env_unset.go
@@ -1,4 +1,4 @@
-// Copyright 2014 The Go Authors. All rights reserved.
+// Copyright 2014 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
diff --git a/vendor/golang.org/x/sys/unix/export_test.go b/vendor/golang.org/x/sys/unix/export_test.go
index b4fdd97..e802469 100644
--- a/vendor/golang.org/x/sys/unix/export_test.go
+++ b/vendor/golang.org/x/sys/unix/export_test.go
@@ -1,4 +1,4 @@
-// Copyright 2015 The Go Authors. All rights reserved.
+// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
diff --git a/vendor/golang.org/x/sys/unix/file_unix.go b/vendor/golang.org/x/sys/unix/file_unix.go
deleted file mode 100644
index 47f6a83..0000000
--- a/vendor/golang.org/x/sys/unix/file_unix.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package unix
-
-import (
- "os"
- "syscall"
-)
-
-// FIXME: unexported function from os
-// syscallMode returns the syscall-specific mode bits from Go's portable mode bits.
-func syscallMode(i os.FileMode) (o uint32) {
- o |= uint32(i.Perm())
- if i&os.ModeSetuid != 0 {
- o |= syscall.S_ISUID
- }
- if i&os.ModeSetgid != 0 {
- o |= syscall.S_ISGID
- }
- if i&os.ModeSticky != 0 {
- o |= syscall.S_ISVTX
- }
- // No mapping for Go's ModeTemporary (plan9 only).
- return
-}
diff --git a/vendor/golang.org/x/sys/unix/gccgo.go b/vendor/golang.org/x/sys/unix/gccgo.go
index 94c8232..40bed3f 100644
--- a/vendor/golang.org/x/sys/unix/gccgo.go
+++ b/vendor/golang.org/x/sys/unix/gccgo.go
@@ -1,4 +1,4 @@
-// Copyright 2015 The Go Authors. All rights reserved.
+// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
@@ -8,7 +8,7 @@ package unix
import "syscall"
-// We can't use the gc-syntax .s files for gccgo. On the plus side
+// We can't use the gc-syntax .s files for gccgo. On the plus side
// much of the functionality can be written directly in Go.
//extern gccgoRealSyscall
diff --git a/vendor/golang.org/x/sys/unix/gccgo_c.c b/vendor/golang.org/x/sys/unix/gccgo_c.c
index 07f6be0..99a774f 100644
--- a/vendor/golang.org/x/sys/unix/gccgo_c.c
+++ b/vendor/golang.org/x/sys/unix/gccgo_c.c
@@ -1,4 +1,4 @@
-// Copyright 2015 The Go Authors. All rights reserved.
+// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
diff --git a/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go b/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go
index bffe1a7..251a977 100644
--- a/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go
+++ b/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go
@@ -1,4 +1,4 @@
-// Copyright 2015 The Go Authors. All rights reserved.
+// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
diff --git a/vendor/golang.org/x/sys/unix/mkall.sh b/vendor/golang.org/x/sys/unix/mkall.sh
index c3a0809..1715122 100755
--- a/vendor/golang.org/x/sys/unix/mkall.sh
+++ b/vendor/golang.org/x/sys/unix/mkall.sh
@@ -80,12 +80,6 @@ darwin_arm64)
mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h"
mktypes="GOARCH=$GOARCH go tool cgo -godefs"
;;
-dragonfly_386)
- mkerrors="$mkerrors -m32"
- mksyscall="./mksyscall.pl -l32 -dragonfly"
- mksysnum="curl -s 'http://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master' | ./mksysnum_dragonfly.pl"
- mktypes="GOARCH=$GOARCH go tool cgo -godefs"
- ;;
dragonfly_amd64)
mkerrors="$mkerrors -m64"
mksyscall="./mksyscall.pl -dragonfly"
@@ -142,7 +136,6 @@ openbsd_386)
mkerrors="$mkerrors -m32"
mksyscall="./mksyscall.pl -l32 -openbsd"
mksysctl="./mksysctl_openbsd.pl"
- zsysctl="zsysctl_openbsd.go"
mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl"
mktypes="GOARCH=$GOARCH go tool cgo -godefs"
;;
@@ -150,7 +143,6 @@ openbsd_amd64)
mkerrors="$mkerrors -m64"
mksyscall="./mksyscall.pl -openbsd"
mksysctl="./mksysctl_openbsd.pl"
- zsysctl="zsysctl_openbsd.go"
mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl"
mktypes="GOARCH=$GOARCH go tool cgo -godefs"
;;
@@ -158,7 +150,6 @@ openbsd_arm)
mkerrors="$mkerrors"
mksyscall="./mksyscall.pl -l32 -openbsd -arm"
mksysctl="./mksysctl_openbsd.pl"
- zsysctl="zsysctl_openbsd.go"
mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl"
# Let the type of C char be signed for making the bare syscall
# API consistent across platforms.
diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh
index f9f5e56..2a44da5 100755
--- a/vendor/golang.org/x/sys/unix/mkerrors.sh
+++ b/vendor/golang.org/x/sys/unix/mkerrors.sh
@@ -38,6 +38,8 @@ includes_Darwin='
#define _DARWIN_C_SOURCE
#define KERNEL
#define _DARWIN_USE_64_BIT_INODE
+#include
+#include
#include
#include
#include
@@ -46,6 +48,7 @@ includes_Darwin='
#include
#include
#include
+#include
#include
#include
#include
@@ -84,6 +87,7 @@ includes_FreeBSD='
#include
#include
#include
+#include
#include
#include
#include
@@ -183,6 +187,7 @@ struct ltchars {
#include
#include
#include
+#include
#include
#include
@@ -382,7 +387,9 @@ ccflags="$@"
$2 == "SOMAXCONN" ||
$2 == "NAME_MAX" ||
$2 == "IFNAMSIZ" ||
- $2 ~ /^CTL_(MAXNAME|NET|QUERY)$/ ||
+ $2 ~ /^CTL_(HW|KERN|MAXNAME|NET|QUERY)$/ ||
+ $2 ~ /^KERN_(HOSTNAME|OS(RELEASE|TYPE)|VERSION)$/ ||
+ $2 ~ /^HW_MACHINE$/ ||
$2 ~ /^SYSCTL_VERS/ ||
$2 ~ /^(MS|MNT|UMOUNT)_/ ||
$2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ ||
@@ -417,9 +424,14 @@ ccflags="$@"
$2 ~ /^SECCOMP_MODE_/ ||
$2 ~ /^SPLICE_/ ||
$2 ~ /^(VM|VMADDR)_/ ||
+ $2 ~ /^IOCTL_VM_SOCKETS_/ ||
$2 ~ /^(TASKSTATS|TS)_/ ||
$2 ~ /^GENL_/ ||
+ $2 ~ /^UTIME_/ ||
$2 ~ /^XATTR_(CREATE|REPLACE)/ ||
+ $2 ~ /^ATTR_(BIT_MAP_COUNT|(CMN|VOL|FILE)_)/ ||
+ $2 ~ /^FSOPT_/ ||
+ $2 ~ /^WDIOC_/ ||
$2 !~ "WMESGLEN" &&
$2 ~ /^W[A-Z0-9]+$/ ||
$2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)}
diff --git a/vendor/golang.org/x/sys/unix/mkpost.go b/vendor/golang.org/x/sys/unix/mkpost.go
index d3ff659..dbdfd0a 100644
--- a/vendor/golang.org/x/sys/unix/mkpost.go
+++ b/vendor/golang.org/x/sys/unix/mkpost.go
@@ -56,6 +56,11 @@ func main() {
removeFieldsRegex := regexp.MustCompile(`X__glibc\S*`)
b = removeFieldsRegex.ReplaceAll(b, []byte("_"))
+ // Convert [65]int8 to [65]byte in Utsname members to simplify
+ // conversion to string; see golang.org/issue/20753
+ convertUtsnameRegex := regexp.MustCompile(`((Sys|Node|Domain)name|Release|Version|Machine)(\s+)\[(\d+)\]u?int8`)
+ b = convertUtsnameRegex.ReplaceAll(b, []byte("$1$3[$4]byte"))
+
// We refuse to export private fields on s390x
if goarch == "s390x" && goos == "linux" {
// Remove cgo padding fields
diff --git a/vendor/golang.org/x/sys/unix/mksyscall.pl b/vendor/golang.org/x/sys/unix/mksyscall.pl
index fb929b4..73e26ca 100755
--- a/vendor/golang.org/x/sys/unix/mksyscall.pl
+++ b/vendor/golang.org/x/sys/unix/mksyscall.pl
@@ -210,7 +210,15 @@ while(<>) {
# Determine which form to use; pad args with zeros.
my $asm = "Syscall";
if ($nonblock) {
- $asm = "RawSyscall";
+ if ($errvar ne "") {
+ $asm = "RawSyscall";
+ } else {
+ $asm = "RawSyscallNoError";
+ }
+ } else {
+ if ($errvar eq "") {
+ $asm = "SyscallNoError";
+ }
}
if(@args <= 3) {
while(@args < 3) {
@@ -284,7 +292,11 @@ while(<>) {
if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") {
$text .= "\t$call\n";
} else {
- $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n";
+ if ($errvar ne "") {
+ $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n";
+ } else {
+ $text .= "\t$ret[0], $ret[1] := $call\n";
+ }
}
$text .= $body;
diff --git a/vendor/golang.org/x/sys/unix/pagesize_unix.go b/vendor/golang.org/x/sys/unix/pagesize_unix.go
index 45afcf7..83c85e0 100644
--- a/vendor/golang.org/x/sys/unix/pagesize_unix.go
+++ b/vendor/golang.org/x/sys/unix/pagesize_unix.go
@@ -1,4 +1,4 @@
-// Copyright 2017 The Go Authors. All rights reserved.
+// Copyright 2017 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
diff --git a/vendor/golang.org/x/sys/unix/race.go b/vendor/golang.org/x/sys/unix/race.go
index 3c7627e..61712b5 100644
--- a/vendor/golang.org/x/sys/unix/race.go
+++ b/vendor/golang.org/x/sys/unix/race.go
@@ -1,4 +1,4 @@
-// Copyright 2012 The Go Authors. All rights reserved.
+// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
diff --git a/vendor/golang.org/x/sys/unix/race0.go b/vendor/golang.org/x/sys/unix/race0.go
index f8678e0..dd08204 100644
--- a/vendor/golang.org/x/sys/unix/race0.go
+++ b/vendor/golang.org/x/sys/unix/race0.go
@@ -1,4 +1,4 @@
-// Copyright 2012 The Go Authors. All rights reserved.
+// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
diff --git a/vendor/golang.org/x/sys/unix/sockcmsg_linux.go b/vendor/golang.org/x/sys/unix/sockcmsg_linux.go
index d9ff473..6079eb4 100644
--- a/vendor/golang.org/x/sys/unix/sockcmsg_linux.go
+++ b/vendor/golang.org/x/sys/unix/sockcmsg_linux.go
@@ -1,4 +1,4 @@
-// Copyright 2011 The Go Authors. All rights reserved.
+// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
diff --git a/vendor/golang.org/x/sys/unix/syscall.go b/vendor/golang.org/x/sys/unix/syscall.go
index 85e3502..857d2a4 100644
--- a/vendor/golang.org/x/sys/unix/syscall.go
+++ b/vendor/golang.org/x/sys/unix/syscall.go
@@ -5,10 +5,10 @@
// +build darwin dragonfly freebsd linux netbsd openbsd solaris
// Package unix contains an interface to the low-level operating system
-// primitives. OS details vary depending on the underlying system, and
+// primitives. OS details vary depending on the underlying system, and
// by default, godoc will display OS-specific documentation for the current
-// system. If you want godoc to display OS documentation for another
-// system, set $GOOS and $GOARCH to the desired system. For example, if
+// system. If you want godoc to display OS documentation for another
+// system, set $GOOS and $GOARCH to the desired system. For example, if
// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS
// to freebsd and $GOARCH to arm.
// The primary use of this package is inside other packages that provide a more
@@ -49,21 +49,3 @@ func BytePtrFromString(s string) (*byte, error) {
// Single-word zero for use when we need a valid pointer to 0 bytes.
// See mkunix.pl.
var _zero uintptr
-
-func (ts *Timespec) Unix() (sec int64, nsec int64) {
- return int64(ts.Sec), int64(ts.Nsec)
-}
-
-func (tv *Timeval) Unix() (sec int64, nsec int64) {
- return int64(tv.Sec), int64(tv.Usec) * 1000
-}
-
-func (ts *Timespec) Nano() int64 {
- return int64(ts.Sec)*1e9 + int64(ts.Nsec)
-}
-
-func (tv *Timeval) Nano() int64 {
- return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000
-}
-
-func TimevalToNsec(tv Timeval) int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1e3 }
diff --git a/vendor/golang.org/x/sys/unix/syscall_bsd.go b/vendor/golang.org/x/sys/unix/syscall_bsd.go
index c2846b3..d3903ed 100644
--- a/vendor/golang.org/x/sys/unix/syscall_bsd.go
+++ b/vendor/golang.org/x/sys/unix/syscall_bsd.go
@@ -34,7 +34,7 @@ func Getgroups() (gids []int, err error) {
return nil, nil
}
- // Sanity check group count. Max is 16 on BSD.
+ // Sanity check group count. Max is 16 on BSD.
if n < 0 || n > 1000 {
return nil, EINVAL
}
@@ -352,6 +352,18 @@ func GetsockoptICMPv6Filter(fd, level, opt int) (*ICMPv6Filter, error) {
return &value, err
}
+// GetsockoptString returns the string value of the socket option opt for the
+// socket associated with fd at the given socket level.
+func GetsockoptString(fd, level, opt int) (string, error) {
+ buf := make([]byte, 256)
+ vallen := _Socklen(len(buf))
+ err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen)
+ if err != nil {
+ return "", err
+ }
+ return string(buf[:vallen-1]), nil
+}
+
//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
@@ -570,7 +582,12 @@ func UtimesNano(path string, ts []Timespec) error {
if len(ts) != 2 {
return EINVAL
}
- err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
+ // Darwin setattrlist can set nanosecond timestamps
+ err := setattrlistTimes(path, ts, 0)
+ if err != ENOSYS {
+ return err
+ }
+ err = utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
if err != ENOSYS {
return err
}
@@ -590,6 +607,10 @@ func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error {
if len(ts) != 2 {
return EINVAL
}
+ err := setattrlistTimes(path, ts, flags)
+ if err != ENOSYS {
+ return err
+ }
return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags)
}
@@ -607,6 +628,15 @@ func Futimes(fd int, tv []Timeval) error {
//sys fcntl(fd int, cmd int, arg int) (val int, err error)
+//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error)
+
+func Poll(fds []PollFd, timeout int) (n int, err error) {
+ if len(fds) == 0 {
+ return poll(nil, 0, timeout)
+ }
+ return poll(&fds[0], len(fds), timeout)
+}
+
// TODO: wrap
// Acct(name nil-string) (err error)
// Gethostuuid(uuid *byte, timeout *Timespec) (err error)
diff --git a/vendor/golang.org/x/sys/unix/syscall_bsd_test.go b/vendor/golang.org/x/sys/unix/syscall_bsd_test.go
index d8085a0..6c4e2ac 100644
--- a/vendor/golang.org/x/sys/unix/syscall_bsd_test.go
+++ b/vendor/golang.org/x/sys/unix/syscall_bsd_test.go
@@ -10,6 +10,7 @@ import (
"os/exec"
"runtime"
"testing"
+ "time"
"golang.org/x/sys/unix"
)
@@ -50,6 +51,28 @@ func TestGetfsstat(t *testing.T) {
}
}
+func TestSelect(t *testing.T) {
+ err := unix.Select(0, nil, nil, nil, &unix.Timeval{Sec: 0, Usec: 0})
+ if err != nil {
+ t.Fatalf("Select: %v", err)
+ }
+
+ dur := 250 * time.Millisecond
+ tv := unix.NsecToTimeval(int64(dur))
+ start := time.Now()
+ err = unix.Select(0, nil, nil, nil, &tv)
+ took := time.Since(start)
+ if err != nil {
+ t.Fatalf("Select: %v", err)
+ }
+
+ // On some BSDs the actual timeout might also be slightly less than the requested.
+ // Add an acceptable margin to avoid flaky tests.
+ if took < dur*2/3 {
+ t.Errorf("Select: timeout should have been at least %v, got %v", dur, took)
+ }
+}
+
func TestSysctlRaw(t *testing.T) {
if runtime.GOOS == "openbsd" {
t.Skip("kern.proc.pid does not exist on OpenBSD")
@@ -60,3 +83,11 @@ func TestSysctlRaw(t *testing.T) {
t.Fatal(err)
}
}
+
+func TestSysctlUint32(t *testing.T) {
+ maxproc, err := unix.SysctlUint32("kern.maxproc")
+ if err != nil {
+ t.Fatal(err)
+ }
+ t.Logf("kern.maxproc: %v", maxproc)
+}
diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/golang.org/x/sys/unix/syscall_darwin.go
index ad74a11..d6c472a 100644
--- a/vendor/golang.org/x/sys/unix/syscall_darwin.go
+++ b/vendor/golang.org/x/sys/unix/syscall_darwin.go
@@ -54,7 +54,7 @@ func nametomib(name string) (mib []_C_int, err error) {
// NOTE(rsc): It seems strange to set the buffer to have
// size CTL_MAXNAME+2 but use only CTL_MAXNAME
- // as the size. I don't know why the +2 is here, but the
+ // as the size. I don't know why the +2 is here, but the
// kernel uses +2 for its own implementation of this function.
// I am scared that if we don't include the +2 here, the kernel
// will silently write 2 words farther than we specify
@@ -187,6 +187,37 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
return
}
+func setattrlistTimes(path string, times []Timespec, flags int) error {
+ _p0, err := BytePtrFromString(path)
+ if err != nil {
+ return err
+ }
+
+ var attrList attrList
+ attrList.bitmapCount = ATTR_BIT_MAP_COUNT
+ attrList.CommonAttr = ATTR_CMN_MODTIME | ATTR_CMN_ACCTIME
+
+ // order is mtime, atime: the opposite of Chtimes
+ attributes := [2]Timespec{times[1], times[0]}
+ options := 0
+ if flags&AT_SYMLINK_NOFOLLOW != 0 {
+ options |= FSOPT_NOFOLLOW
+ }
+ _, _, e1 := Syscall6(
+ SYS_SETATTRLIST,
+ uintptr(unsafe.Pointer(_p0)),
+ uintptr(unsafe.Pointer(&attrList)),
+ uintptr(unsafe.Pointer(&attributes)),
+ uintptr(unsafe.Sizeof(attributes)),
+ uintptr(options),
+ 0,
+ )
+ if e1 != 0 {
+ return e1
+ }
+ return nil
+}
+
func utimensat(dirfd int, path string, times *[2]Timespec, flags int) error {
// Darwin doesn't support SYS_UTIMENSAT
return ENOSYS
@@ -239,6 +270,52 @@ func IoctlGetTermios(fd int, req uint) (*Termios, error) {
return &value, err
}
+func Uname(uname *Utsname) error {
+ mib := []_C_int{CTL_KERN, KERN_OSTYPE}
+ n := unsafe.Sizeof(uname.Sysname)
+ if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil {
+ return err
+ }
+
+ mib = []_C_int{CTL_KERN, KERN_HOSTNAME}
+ n = unsafe.Sizeof(uname.Nodename)
+ if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil {
+ return err
+ }
+
+ mib = []_C_int{CTL_KERN, KERN_OSRELEASE}
+ n = unsafe.Sizeof(uname.Release)
+ if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil {
+ return err
+ }
+
+ mib = []_C_int{CTL_KERN, KERN_VERSION}
+ n = unsafe.Sizeof(uname.Version)
+ if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil {
+ return err
+ }
+
+ // The version might have newlines or tabs in it, convert them to
+ // spaces.
+ for i, b := range uname.Version {
+ if b == '\n' || b == '\t' {
+ if i == len(uname.Version)-1 {
+ uname.Version[i] = 0
+ } else {
+ uname.Version[i] = ' '
+ }
+ }
+ }
+
+ mib = []_C_int{CTL_HW, HW_MACHINE}
+ n = unsafe.Sizeof(uname.Machine)
+ if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil {
+ return err
+ }
+
+ return nil
+}
+
/*
* Exposed directly
*/
@@ -377,7 +454,6 @@ func IoctlGetTermios(fd int, req uint) (*Termios, error) {
// Searchfs
// Delete
// Copyfile
-// Poll
// Watchevent
// Waitevent
// Modwatch
diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_386.go b/vendor/golang.org/x/sys/unix/syscall_darwin_386.go
index 76634f7..b3ac109 100644
--- a/vendor/golang.org/x/sys/unix/syscall_darwin_386.go
+++ b/vendor/golang.org/x/sys/unix/syscall_darwin_386.go
@@ -11,25 +11,18 @@ import (
"unsafe"
)
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = int32(nsec / 1e9)
- ts.Nsec = int32(nsec % 1e9)
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: int32(sec), Nsec: int32(nsec)}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Usec = int32(nsec % 1e9 / 1e3)
- tv.Sec = int32(nsec / 1e9)
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: int32(sec), Usec: int32(usec)}
}
//sysnb gettimeofday(tp *Timeval) (sec int32, usec int32, err error)
func Gettimeofday(tv *Timeval) (err error) {
// The tv passed to gettimeofday must be non-nil
- // but is otherwise unused. The answers come back
+ // but is otherwise unused. The answers come back
// in the two registers.
sec, usec, err := gettimeofday(tv)
tv.Sec = int32(sec)
diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go
index 7be02da..7521944 100644
--- a/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go
+++ b/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go
@@ -11,25 +11,18 @@ import (
"unsafe"
)
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = nsec / 1e9
- ts.Nsec = nsec % 1e9
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: sec, Nsec: nsec}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Usec = int32(nsec % 1e9 / 1e3)
- tv.Sec = int64(nsec / 1e9)
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: sec, Usec: int32(usec)}
}
//sysnb gettimeofday(tp *Timeval) (sec int64, usec int32, err error)
func Gettimeofday(tv *Timeval) (err error) {
// The tv passed to gettimeofday must be non-nil
- // but is otherwise unused. The answers come back
+ // but is otherwise unused. The answers come back
// in the two registers.
sec, usec, err := gettimeofday(tv)
tv.Sec = sec
diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go b/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go
index 26b6697..faae207 100644
--- a/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go
+++ b/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go
@@ -9,25 +9,18 @@ import (
"unsafe"
)
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = int32(nsec / 1e9)
- ts.Nsec = int32(nsec % 1e9)
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: int32(sec), Nsec: int32(nsec)}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Usec = int32(nsec % 1e9 / 1e3)
- tv.Sec = int32(nsec / 1e9)
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: int32(sec), Usec: int32(usec)}
}
//sysnb gettimeofday(tp *Timeval) (sec int32, usec int32, err error)
func Gettimeofday(tv *Timeval) (err error) {
// The tv passed to gettimeofday must be non-nil
- // but is otherwise unused. The answers come back
+ // but is otherwise unused. The answers come back
// in the two registers.
sec, usec, err := gettimeofday(tv)
tv.Sec = int32(sec)
@@ -67,3 +60,7 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
}
func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // sic
+
+// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
+// of darwin/arm the syscall is called sysctl instead of __sysctl.
+const SYS___SYSCTL = SYS_SYSCTL
diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go
index 4d67a87..d6d9628 100644
--- a/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go
+++ b/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go
@@ -11,25 +11,18 @@ import (
"unsafe"
)
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = nsec / 1e9
- ts.Nsec = nsec % 1e9
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: sec, Nsec: nsec}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Usec = int32(nsec % 1e9 / 1e3)
- tv.Sec = int64(nsec / 1e9)
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: sec, Usec: int32(usec)}
}
//sysnb gettimeofday(tp *Timeval) (sec int64, usec int32, err error)
func Gettimeofday(tv *Timeval) (err error) {
// The tv passed to gettimeofday must be non-nil
- // but is otherwise unused. The answers come back
+ // but is otherwise unused. The answers come back
// in the two registers.
sec, usec, err := gettimeofday(tv)
tv.Sec = sec
diff --git a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go
index 3a48337..6dfc89a 100644
--- a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go
+++ b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go
@@ -110,6 +110,23 @@ func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) {
return
}
+const ImplementsGetwd = true
+
+//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD
+
+func Getwd() (string, error) {
+ var buf [PathMax]byte
+ _, err := Getcwd(buf[0:])
+ if err != nil {
+ return "", err
+ }
+ n := clen(buf[:])
+ if n < 1 {
+ return "", EINVAL
+ }
+ return string(buf[:n]), nil
+}
+
func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
var _p0 unsafe.Pointer
var bufsize uintptr
@@ -125,6 +142,113 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
return
}
+func setattrlistTimes(path string, times []Timespec, flags int) error {
+ // used on Darwin for UtimesNano
+ return ENOSYS
+}
+
+//sys ioctl(fd int, req uint, arg uintptr) (err error)
+
+// ioctl itself should not be exposed directly, but additional get/set
+// functions for specific types are permissible.
+
+// IoctlSetInt performs an ioctl operation which sets an integer value
+// on fd, using the specified request number.
+func IoctlSetInt(fd int, req uint, value int) error {
+ return ioctl(fd, req, uintptr(value))
+}
+
+func IoctlSetWinsize(fd int, req uint, value *Winsize) error {
+ return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
+}
+
+func IoctlSetTermios(fd int, req uint, value *Termios) error {
+ return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
+}
+
+// IoctlGetInt performs an ioctl operation which gets an integer value
+// from fd, using the specified request number.
+func IoctlGetInt(fd int, req uint) (int, error) {
+ var value int
+ err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
+ return value, err
+}
+
+func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
+ var value Winsize
+ err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
+ return &value, err
+}
+
+func IoctlGetTermios(fd int, req uint) (*Termios, error) {
+ var value Termios
+ err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
+ return &value, err
+}
+
+func sysctlUname(mib []_C_int, old *byte, oldlen *uintptr) error {
+ err := sysctl(mib, old, oldlen, nil, 0)
+ if err != nil {
+ // Utsname members on Dragonfly are only 32 bytes and
+ // the syscall returns ENOMEM in case the actual value
+ // is longer.
+ if err == ENOMEM {
+ err = nil
+ }
+ }
+ return err
+}
+
+func Uname(uname *Utsname) error {
+ mib := []_C_int{CTL_KERN, KERN_OSTYPE}
+ n := unsafe.Sizeof(uname.Sysname)
+ if err := sysctlUname(mib, &uname.Sysname[0], &n); err != nil {
+ return err
+ }
+ uname.Sysname[unsafe.Sizeof(uname.Sysname)-1] = 0
+
+ mib = []_C_int{CTL_KERN, KERN_HOSTNAME}
+ n = unsafe.Sizeof(uname.Nodename)
+ if err := sysctlUname(mib, &uname.Nodename[0], &n); err != nil {
+ return err
+ }
+ uname.Nodename[unsafe.Sizeof(uname.Nodename)-1] = 0
+
+ mib = []_C_int{CTL_KERN, KERN_OSRELEASE}
+ n = unsafe.Sizeof(uname.Release)
+ if err := sysctlUname(mib, &uname.Release[0], &n); err != nil {
+ return err
+ }
+ uname.Release[unsafe.Sizeof(uname.Release)-1] = 0
+
+ mib = []_C_int{CTL_KERN, KERN_VERSION}
+ n = unsafe.Sizeof(uname.Version)
+ if err := sysctlUname(mib, &uname.Version[0], &n); err != nil {
+ return err
+ }
+
+ // The version might have newlines or tabs in it, convert them to
+ // spaces.
+ for i, b := range uname.Version {
+ if b == '\n' || b == '\t' {
+ if i == len(uname.Version)-1 {
+ uname.Version[i] = 0
+ } else {
+ uname.Version[i] = ' '
+ }
+ }
+ }
+
+ mib = []_C_int{CTL_HW, HW_MACHINE}
+ n = unsafe.Sizeof(uname.Machine)
+ if err := sysctlUname(mib, &uname.Machine[0], &n); err != nil {
+ return err
+ }
+ uname.Machine[unsafe.Sizeof(uname.Machine)-1] = 0
+
+ return nil
+}
+
/*
* Exposed directly
*/
@@ -225,7 +349,6 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
// Getlogin
// Sigpending
// Sigaltstack
-// Ioctl
// Reboot
// Execve
// Vfork
@@ -257,7 +380,6 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
// Searchfs
// Delete
// Copyfile
-// Poll
// Watchevent
// Waitevent
// Modwatch
@@ -403,7 +525,6 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
// Pread_nocancel
// Pwrite_nocancel
// Waitid_nocancel
-// Poll_nocancel
// Msgsnd_nocancel
// Msgrcv_nocancel
// Sem_wait_nocancel
diff --git a/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go
index 6d8952d..9babb31 100644
--- a/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go
+++ b/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go
@@ -11,19 +11,12 @@ import (
"unsafe"
)
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = nsec / 1e9
- ts.Nsec = nsec % 1e9
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: sec, Nsec: nsec}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Usec = nsec % 1e9 / 1e3
- tv.Sec = int64(nsec / 1e9)
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: sec, Usec: usec}
}
func SetKevent(k *Kevent_t, fd, mode, flags int) {
diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/vendor/golang.org/x/sys/unix/syscall_freebsd.go
index d26e52e..b8ecf6c 100644
--- a/vendor/golang.org/x/sys/unix/syscall_freebsd.go
+++ b/vendor/golang.org/x/sys/unix/syscall_freebsd.go
@@ -32,7 +32,7 @@ func nametomib(name string) (mib []_C_int, err error) {
// NOTE(rsc): It seems strange to set the buffer to have
// size CTL_MAXNAME+2 but use only CTL_MAXNAME
- // as the size. I don't know why the +2 is here, but the
+ // as the size. I don't know why the +2 is here, but the
// kernel uses +2 for its own implementation of this function.
// I am scared that if we don't include the +2 here, the kernel
// will silently write 2 words farther than we specify
@@ -105,6 +105,23 @@ func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) {
return
}
+const ImplementsGetwd = true
+
+//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD
+
+func Getwd() (string, error) {
+ var buf [PathMax]byte
+ _, err := Getcwd(buf[0:])
+ if err != nil {
+ return "", err
+ }
+ n := clen(buf[:])
+ if n < 1 {
+ return "", EINVAL
+ }
+ return string(buf[:n]), nil
+}
+
func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
var _p0 unsafe.Pointer
var bufsize uintptr
@@ -120,6 +137,11 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
return
}
+func setattrlistTimes(path string, times []Timespec, flags int) error {
+ // used on Darwin for UtimesNano
+ return ENOSYS
+}
+
// Derive extattr namespace and attribute name
func xattrnamespace(fullattr string) (ns int, attr string, err error) {
@@ -271,7 +293,6 @@ func Listxattr(file string, dest []byte) (sz int, err error) {
// FreeBSD won't allow you to list xattrs from multiple namespaces
s := 0
- var e error
for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} {
stmp, e := ExtattrListFile(file, nsid, uintptr(d), destsiz)
@@ -283,7 +304,6 @@ func Listxattr(file string, dest []byte) (sz int, err error) {
* we don't have read permissions on, so don't ignore those errors
*/
if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER {
- e = nil
continue
} else if e != nil {
return s, e
@@ -297,7 +317,7 @@ func Listxattr(file string, dest []byte) (sz int, err error) {
d = initxattrdest(dest, s)
}
- return s, e
+ return s, nil
}
func Flistxattr(fd int, dest []byte) (sz int, err error) {
@@ -305,11 +325,9 @@ func Flistxattr(fd int, dest []byte) (sz int, err error) {
destsiz := len(dest)
s := 0
- var e error
for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} {
stmp, e := ExtattrListFd(fd, nsid, uintptr(d), destsiz)
if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER {
- e = nil
continue
} else if e != nil {
return s, e
@@ -323,7 +341,7 @@ func Flistxattr(fd int, dest []byte) (sz int, err error) {
d = initxattrdest(dest, s)
}
- return s, e
+ return s, nil
}
func Llistxattr(link string, dest []byte) (sz int, err error) {
@@ -331,11 +349,9 @@ func Llistxattr(link string, dest []byte) (sz int, err error) {
destsiz := len(dest)
s := 0
- var e error
for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} {
stmp, e := ExtattrListLink(link, nsid, uintptr(d), destsiz)
if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER {
- e = nil
continue
} else if e != nil {
return s, e
@@ -349,7 +365,7 @@ func Llistxattr(link string, dest []byte) (sz int, err error) {
d = initxattrdest(dest, s)
}
- return s, e
+ return s, nil
}
//sys ioctl(fd int, req uint, arg uintptr) (err error)
@@ -391,6 +407,52 @@ func IoctlGetTermios(fd int, req uint) (*Termios, error) {
return &value, err
}
+func Uname(uname *Utsname) error {
+ mib := []_C_int{CTL_KERN, KERN_OSTYPE}
+ n := unsafe.Sizeof(uname.Sysname)
+ if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil {
+ return err
+ }
+
+ mib = []_C_int{CTL_KERN, KERN_HOSTNAME}
+ n = unsafe.Sizeof(uname.Nodename)
+ if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil {
+ return err
+ }
+
+ mib = []_C_int{CTL_KERN, KERN_OSRELEASE}
+ n = unsafe.Sizeof(uname.Release)
+ if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil {
+ return err
+ }
+
+ mib = []_C_int{CTL_KERN, KERN_VERSION}
+ n = unsafe.Sizeof(uname.Version)
+ if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil {
+ return err
+ }
+
+ // The version might have newlines or tabs in it, convert them to
+ // spaces.
+ for i, b := range uname.Version {
+ if b == '\n' || b == '\t' {
+ if i == len(uname.Version)-1 {
+ uname.Version[i] = 0
+ } else {
+ uname.Version[i] = ' '
+ }
+ }
+ }
+
+ mib = []_C_int{CTL_HW, HW_MACHINE}
+ n = unsafe.Sizeof(uname.Machine)
+ if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil {
+ return err
+ }
+
+ return nil
+}
+
/*
* Exposed directly
*/
@@ -434,6 +496,7 @@ func IoctlGetTermios(fd int, req uint) (*Termios, error) {
//sys Fstatfs(fd int, stat *Statfs_t) (err error)
//sys Fsync(fd int) (err error)
//sys Ftruncate(fd int, length int64) (err error)
+//sys Getdents(fd int, buf []byte) (n int, err error)
//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error)
//sys Getdtablesize() (size int)
//sysnb Getegid() (egid int)
@@ -550,7 +613,6 @@ func IoctlGetTermios(fd int, req uint) (*Termios, error) {
// Searchfs
// Delete
// Copyfile
-// Poll
// Watchevent
// Waitevent
// Modwatch
diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go
index 4cf5f45..21e0395 100644
--- a/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go
+++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go
@@ -11,19 +11,12 @@ import (
"unsafe"
)
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = int32(nsec / 1e9)
- ts.Nsec = int32(nsec % 1e9)
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: int32(sec), Nsec: int32(nsec)}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Usec = int32(nsec % 1e9 / 1e3)
- tv.Sec = int32(nsec / 1e9)
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: int32(sec), Usec: int32(usec)}
}
func SetKevent(k *Kevent_t, fd, mode, flags int) {
diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go
index b8036e7..9c945a6 100644
--- a/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go
@@ -11,19 +11,12 @@ import (
"unsafe"
)
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = nsec / 1e9
- ts.Nsec = nsec % 1e9
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: sec, Nsec: nsec}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Usec = nsec % 1e9 / 1e3
- tv.Sec = int64(nsec / 1e9)
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: sec, Usec: usec}
}
func SetKevent(k *Kevent_t, fd, mode, flags int) {
diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go
index 5a3bb6a..5cd6243 100644
--- a/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go
+++ b/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go
@@ -11,19 +11,12 @@ import (
"unsafe"
)
-func TimespecToNsec(ts Timespec) int64 { return ts.Sec*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = nsec / 1e9
- ts.Nsec = int32(nsec % 1e9)
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: sec, Nsec: int32(nsec)}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Usec = int32(nsec % 1e9 / 1e3)
- tv.Sec = nsec / 1e9
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: sec, Usec: int32(usec)}
}
func SetKevent(k *Kevent_t, fd, mode, flags int) {
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go
index 1b7d59d..f77f44a 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux.go
@@ -16,6 +16,13 @@ import (
"unsafe"
)
+// SyscallNoError may be used instead of Syscall for syscalls that don't fail.
+func SyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr)
+
+// RawSyscallNoError may be used instead of RawSyscall for syscalls that don't
+// fail.
+func RawSyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr)
+
/*
* Wrapped
*/
@@ -255,7 +262,7 @@ func Getgroups() (gids []int, err error) {
return nil, nil
}
- // Sanity check group count. Max is 1<<16 on Linux.
+ // Sanity check group count. Max is 1<<16 on Linux.
if n < 0 || n > 1<<20 {
return nil, EINVAL
}
@@ -290,8 +297,8 @@ type WaitStatus uint32
// 0x7F (stopped), or a signal number that caused an exit.
// The 0x80 bit is whether there was a core dump.
// An extra number (exit code, signal causing a stop)
-// is in the high bits. At least that's the idea.
-// There are various irregularities. For example, the
+// is in the high bits. At least that's the idea.
+// There are various irregularities. For example, the
// "continued" status is 0xFFFF, distinguishing itself
// from stopped via the core dump bit.
@@ -808,6 +815,24 @@ func GetsockoptTCPInfo(fd, level, opt int) (*TCPInfo, error) {
return &value, err
}
+// GetsockoptString returns the string value of the socket option opt for the
+// socket associated with fd at the given socket level.
+func GetsockoptString(fd, level, opt int) (string, error) {
+ buf := make([]byte, 256)
+ vallen := _Socklen(len(buf))
+ err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen)
+ if err != nil {
+ if err == ERANGE {
+ buf = make([]byte, vallen)
+ err = getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen)
+ }
+ if err != nil {
+ return "", err
+ }
+ }
+ return string(buf[:vallen-1]), nil
+}
+
func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) {
return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq))
}
@@ -926,7 +951,7 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from
msg.Namelen = uint32(SizeofSockaddrAny)
var iov Iovec
if len(p) > 0 {
- iov.Base = (*byte)(unsafe.Pointer(&p[0]))
+ iov.Base = &p[0]
iov.SetLen(len(p))
}
var dummy byte
@@ -941,7 +966,7 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from
iov.Base = &dummy
iov.SetLen(1)
}
- msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
+ msg.Control = &oob[0]
msg.SetControllen(len(oob))
}
msg.Iov = &iov
@@ -974,11 +999,11 @@ func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error)
}
}
var msg Msghdr
- msg.Name = (*byte)(unsafe.Pointer(ptr))
+ msg.Name = (*byte)(ptr)
msg.Namelen = uint32(salen)
var iov Iovec
if len(p) > 0 {
- iov.Base = (*byte)(unsafe.Pointer(&p[0]))
+ iov.Base = &p[0]
iov.SetLen(len(p))
}
var dummy byte
@@ -993,7 +1018,7 @@ func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error)
iov.Base = &dummy
iov.SetLen(1)
}
- msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
+ msg.Control = &oob[0]
msg.SetControllen(len(oob))
}
msg.Iov = &iov
@@ -1023,7 +1048,7 @@ func ptracePeek(req int, pid int, addr uintptr, out []byte) (count int, err erro
var buf [sizeofPtr]byte
- // Leading edge. PEEKTEXT/PEEKDATA don't require aligned
+ // Leading edge. PEEKTEXT/PEEKDATA don't require aligned
// access (PEEKUSER warns that it might), but if we don't
// align our reads, we might straddle an unmapped page
// boundary and not get the bytes leading up to the page
@@ -1125,6 +1150,10 @@ func PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) {
return ptracePoke(PTRACE_POKEDATA, PTRACE_PEEKDATA, pid, addr, data)
}
+func PtracePokeUser(pid int, addr uintptr, data []byte) (count int, err error) {
+ return ptracePoke(PTRACE_POKEUSR, PTRACE_PEEKUSR, pid, addr, data)
+}
+
func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) {
return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
}
@@ -1262,6 +1291,7 @@ func Getpgrp() (pid int) {
//sys PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT
//sysnb prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT64
//sys Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error)
+//sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) = SYS_PSELECT6
//sys read(fd int, p []byte) (n int, err error)
//sys Removexattr(path string, attr string) (err error)
//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
@@ -1405,7 +1435,6 @@ func Vmsplice(fd int, iovs []Iovec, flags int) (int, error) {
// Msgget
// Msgrcv
// Msgsnd
-// Newfstatat
// Nfsservctl
// Personality
// Pselect6
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_386.go b/vendor/golang.org/x/sys/unix/syscall_linux_386.go
index f4c826a..bb8e4fb 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux_386.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux_386.go
@@ -14,19 +14,12 @@ import (
"unsafe"
)
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = int32(nsec / 1e9)
- ts.Nsec = int32(nsec % 1e9)
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: int32(sec), Nsec: int32(nsec)}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Sec = int32(nsec / 1e9)
- tv.Usec = int32(nsec % 1e9 / 1e3)
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: int32(sec), Usec: int32(usec)}
}
//sysnb pipe(p *[2]_C_int) (err error)
@@ -61,6 +54,7 @@ func Pipe2(p []int, flags int) (err error) {
//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64_64
//sys Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32
//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
+//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64
//sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64
//sysnb Getegid() (egid int) = SYS_GETEGID32
//sysnb Geteuid() (euid int) = SYS_GETEUID32
@@ -183,9 +177,9 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
// On x86 Linux, all the socket calls go through an extra indirection,
// I think because the 5-register system call interface can't handle
-// the 6-argument calls like sendto and recvfrom. Instead the
+// the 6-argument calls like sendto and recvfrom. Instead the
// arguments to the underlying system call are the number below
-// and a pointer to an array of uintptr. We hide the pointer in the
+// and a pointer to an array of uintptr. We hide the pointer in the
// socketcall assembly to avoid allocation on every system call.
const (
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go
index 0715200..53d38a5 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go
@@ -11,6 +11,7 @@ package unix
//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64
//sys Fchown(fd int, uid int, gid int) (err error)
//sys Fstat(fd int, stat *Stat_t) (err error)
+//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT
//sys Fstatfs(fd int, buf *Statfs_t) (err error)
//sys Ftruncate(fd int, length int64) (err error)
//sysnb Getegid() (egid int)
@@ -83,19 +84,12 @@ func Time(t *Time_t) (tt Time_t, err error) {
//sys Utime(path string, buf *Utimbuf) (err error)
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = nsec / 1e9
- ts.Nsec = nsec % 1e9
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: sec, Nsec: nsec}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Sec = nsec / 1e9
- tv.Usec = nsec % 1e9 / 1e3
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: sec, Usec: usec}
}
//sysnb pipe(p *[2]_C_int) (err error)
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go
index 2b79c84..c59f858 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go
@@ -11,19 +11,12 @@ import (
"unsafe"
)
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = int32(nsec / 1e9)
- ts.Nsec = int32(nsec % 1e9)
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: int32(sec), Nsec: int32(nsec)}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Sec = int32(nsec / 1e9)
- tv.Usec = int32(nsec % 1e9 / 1e3)
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: int32(sec), Usec: int32(usec)}
}
func Pipe(p []int) (err error) {
@@ -84,6 +77,7 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
//sys Dup2(oldfd int, newfd int) (err error)
//sys Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32
//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
+//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64
//sysnb Getegid() (egid int) = SYS_GETEGID32
//sysnb Geteuid() (euid int) = SYS_GETEUID32
//sysnb Getgid() (gid int) = SYS_GETGID32
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go
index 68cc975..9a8e6e4 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go
@@ -21,7 +21,12 @@ package unix
//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
-//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS_PSELECT6
+
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+ ts := Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000}
+ return Pselect(nfd, r, w, e, &ts, nil)
+}
+
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
//sys Setfsgid(gid int) (err error)
//sys Setfsuid(uid int) (err error)
@@ -68,19 +73,12 @@ func Lstat(path string, stat *Stat_t) (err error) {
//sysnb Gettimeofday(tv *Timeval) (err error)
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = nsec / 1e9
- ts.Nsec = nsec % 1e9
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: sec, Nsec: nsec}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Sec = nsec / 1e9
- tv.Usec = nsec % 1e9 / 1e3
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: sec, Usec: usec}
}
func Time(t *Time_t) (Time_t, error) {
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go
index 977df44..46aa4ff 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go
@@ -10,6 +10,7 @@ package unix
//sys Dup2(oldfd int, newfd int) (err error)
//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
//sys Fchown(fd int, uid int, gid int) (err error)
+//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT
//sys Fstatfs(fd int, buf *Statfs_t) (err error)
//sys Ftruncate(fd int, length int64) (err error)
//sysnb Getegid() (egid int)
@@ -23,7 +24,12 @@ package unix
//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
-//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS_PSELECT6
+
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+ ts := Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000}
+ return Pselect(nfd, r, w, e, &ts, nil)
+}
+
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
//sys Setfsgid(gid int) (err error)
//sys Setfsuid(uid int) (err error)
@@ -71,19 +77,12 @@ func Time(t *Time_t) (tt Time_t, err error) {
//sys Utime(path string, buf *Utimbuf) (err error)
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = nsec / 1e9
- ts.Nsec = nsec % 1e9
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: sec, Nsec: nsec}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Sec = nsec / 1e9
- tv.Usec = nsec % 1e9 / 1e3
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: sec, Usec: usec}
}
func Pipe(p []int) (err error) {
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go
index 25a5a0d..40b8e4f 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go
@@ -65,6 +65,7 @@ func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr,
//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
+//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64
//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
//sys Utime(path string, buf *Utimbuf) (err error)
@@ -99,19 +100,12 @@ func Seek(fd int, offset int64, whence int) (off int64, err error) {
return
}
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = int32(nsec / 1e9)
- ts.Nsec = int32(nsec % 1e9)
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: int32(sec), Nsec: int32(nsec)}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Sec = int32(nsec / 1e9)
- tv.Usec = int32(nsec % 1e9 / 1e3)
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: int32(sec), Usec: int32(usec)}
}
//sysnb pipe2(p *[2]_C_int, flags int) (err error)
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go
index a4a8e4e..17c9116 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go
@@ -11,6 +11,7 @@ package unix
//sys Dup2(oldfd int, newfd int) (err error)
//sys Fchown(fd int, uid int, gid int) (err error)
//sys Fstat(fd int, stat *Stat_t) (err error)
+//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT
//sys Fstatfs(fd int, buf *Statfs_t) (err error)
//sys Ftruncate(fd int, length int64) (err error)
//sysnb Getegid() (egid int)
@@ -66,19 +67,12 @@ package unix
//sys Utime(path string, buf *Utimbuf) (err error)
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = nsec / 1e9
- ts.Nsec = nsec % 1e9
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: sec, Nsec: nsec}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Sec = nsec / 1e9
- tv.Usec = nsec % 1e9 / 1e3
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: sec, Usec: usec}
}
func (r *PtraceRegs) PC() uint64 { return r.Nip }
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go
index 3845fc9..c0d86e7 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go
@@ -15,6 +15,7 @@ import (
//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64
//sys Fchown(fd int, uid int, gid int) (err error)
//sys Fstat(fd int, stat *Stat_t) (err error)
+//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT
//sys Fstatfs(fd int, buf *Statfs_t) (err error)
//sys Ftruncate(fd int, length int64) (err error)
//sysnb Getegid() (egid int)
@@ -62,19 +63,12 @@ func Time(t *Time_t) (tt Time_t, err error) {
//sys Utime(path string, buf *Utimbuf) (err error)
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = nsec / 1e9
- ts.Nsec = nsec % 1e9
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: sec, Nsec: nsec}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Sec = nsec / 1e9
- tv.Usec = nsec % 1e9 / 1e3
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: sec, Usec: usec}
}
//sysnb pipe2(p *[2]_C_int, flags int) (err error)
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go
index bd9de3e..a00f992 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go
@@ -10,6 +10,7 @@ package unix
//sys Dup2(oldfd int, newfd int) (err error)
//sys Fchown(fd int, uid int, gid int) (err error)
//sys Fstat(fd int, stat *Stat_t) (err error)
+//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64
//sys Fstatfs(fd int, buf *Statfs_t) (err error)
//sys Ftruncate(fd int, length int64) (err error)
//sysnb Getegid() (egid int)
@@ -82,19 +83,12 @@ func Time(t *Time_t) (tt Time_t, err error) {
//sys Utime(path string, buf *Utimbuf) (err error)
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = nsec / 1e9
- ts.Nsec = nsec % 1e9
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: sec, Nsec: nsec}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Sec = nsec / 1e9
- tv.Usec = int32(nsec % 1e9 / 1e3)
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: sec, Usec: int32(usec)}
}
func (r *PtraceRegs) PC() uint64 { return r.Tpc }
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_test.go b/vendor/golang.org/x/sys/unix/syscall_linux_test.go
index c0ab2db..ea9562f 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux_test.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux_test.go
@@ -56,34 +56,6 @@ func TestIoctlGetInt(t *testing.T) {
t.Logf("%d bits of entropy available", v)
}
-func TestPoll(t *testing.T) {
- f, cleanup := mktmpfifo(t)
- defer cleanup()
-
- const timeout = 100
-
- ok := make(chan bool, 1)
- go func() {
- select {
- case <-time.After(10 * timeout * time.Millisecond):
- t.Errorf("Poll: failed to timeout after %d milliseconds", 10*timeout)
- case <-ok:
- }
- }()
-
- fds := []unix.PollFd{{Fd: int32(f.Fd()), Events: unix.POLLIN}}
- n, err := unix.Poll(fds, timeout)
- ok <- true
- if err != nil {
- t.Errorf("Poll: unexpected error: %v", err)
- return
- }
- if n != 0 {
- t.Errorf("Poll: wrong number of events: got %v, expected %v", n, 0)
- return
- }
-}
-
func TestPpoll(t *testing.T) {
f, cleanup := mktmpfifo(t)
defer cleanup()
@@ -113,25 +85,6 @@ func TestPpoll(t *testing.T) {
}
}
-// mktmpfifo creates a temporary FIFO and provides a cleanup function.
-func mktmpfifo(t *testing.T) (*os.File, func()) {
- err := unix.Mkfifo("fifo", 0666)
- if err != nil {
- t.Fatalf("mktmpfifo: failed to create FIFO: %v", err)
- }
-
- f, err := os.OpenFile("fifo", os.O_RDWR, 0666)
- if err != nil {
- os.Remove("fifo")
- t.Fatalf("mktmpfifo: failed to open FIFO: %v", err)
- }
-
- return f, func() {
- f.Close()
- os.Remove("fifo")
- }
-}
-
func TestTime(t *testing.T) {
var ut unix.Time_t
ut2, err := unix.Time(&ut)
@@ -184,6 +137,38 @@ func TestUtime(t *testing.T) {
}
}
+func TestUtimesNanoAt(t *testing.T) {
+ defer chtmpdir(t)()
+
+ symlink := "symlink1"
+ os.Remove(symlink)
+ err := os.Symlink("nonexisting", symlink)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ ts := []unix.Timespec{
+ {Sec: 1111, Nsec: 2222},
+ {Sec: 3333, Nsec: 4444},
+ }
+ err = unix.UtimesNanoAt(unix.AT_FDCWD, symlink, ts, unix.AT_SYMLINK_NOFOLLOW)
+ if err != nil {
+ t.Fatalf("UtimesNanoAt: %v", err)
+ }
+
+ var st unix.Stat_t
+ err = unix.Lstat(symlink, &st)
+ if err != nil {
+ t.Fatalf("Lstat: %v", err)
+ }
+ if st.Atim != ts[0] {
+ t.Errorf("UtimesNanoAt: wrong atime: %v", st.Atim)
+ }
+ if st.Mtim != ts[1] {
+ t.Errorf("UtimesNanoAt: wrong mtime: %v", st.Mtim)
+ }
+}
+
func TestGetrlimit(t *testing.T) {
var rlim unix.Rlimit
err := unix.Getrlimit(unix.RLIMIT_AS, &rlim)
@@ -193,10 +178,81 @@ func TestGetrlimit(t *testing.T) {
}
func TestSelect(t *testing.T) {
- _, err := unix.Select(0, nil, nil, nil, &unix.Timeval{0, 0})
+ _, err := unix.Select(0, nil, nil, nil, &unix.Timeval{Sec: 0, Usec: 0})
if err != nil {
t.Fatalf("Select: %v", err)
}
+
+ dur := 150 * time.Millisecond
+ tv := unix.NsecToTimeval(int64(dur))
+ start := time.Now()
+ _, err = unix.Select(0, nil, nil, nil, &tv)
+ took := time.Since(start)
+ if err != nil {
+ t.Fatalf("Select: %v", err)
+ }
+
+ if took < dur {
+ t.Errorf("Select: timeout should have been at least %v, got %v", dur, took)
+ }
+}
+
+func TestPselect(t *testing.T) {
+ _, err := unix.Pselect(0, nil, nil, nil, &unix.Timespec{Sec: 0, Nsec: 0}, nil)
+ if err != nil {
+ t.Fatalf("Pselect: %v", err)
+ }
+
+ dur := 2500 * time.Microsecond
+ ts := unix.NsecToTimespec(int64(dur))
+ start := time.Now()
+ _, err = unix.Pselect(0, nil, nil, nil, &ts, nil)
+ took := time.Since(start)
+ if err != nil {
+ t.Fatalf("Pselect: %v", err)
+ }
+
+ if took < dur {
+ t.Errorf("Pselect: timeout should have been at least %v, got %v", dur, took)
+ }
+}
+
+func TestFstatat(t *testing.T) {
+ defer chtmpdir(t)()
+
+ touch(t, "file1")
+
+ var st1 unix.Stat_t
+ err := unix.Stat("file1", &st1)
+ if err != nil {
+ t.Fatalf("Stat: %v", err)
+ }
+
+ var st2 unix.Stat_t
+ err = unix.Fstatat(unix.AT_FDCWD, "file1", &st2, 0)
+ if err != nil {
+ t.Fatalf("Fstatat: %v", err)
+ }
+
+ if st1 != st2 {
+ t.Errorf("Fstatat: returned stat does not match Stat")
+ }
+
+ os.Symlink("file1", "symlink1")
+
+ err = unix.Lstat("symlink1", &st1)
+ if err != nil {
+ t.Fatalf("Lstat: %v", err)
+ }
+
+ err = unix.Fstatat(unix.AT_FDCWD, "symlink1", &st2, unix.AT_SYMLINK_NOFOLLOW)
+ if err != nil {
+ t.Fatalf("Fstatat: %v", err)
+ }
+
+ if st1 != st2 {
+ t.Errorf("Fstatat: returned stat does not match Lstat")
+ }
}
// utilities taken from os/os_test.go
diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/vendor/golang.org/x/sys/unix/syscall_netbsd.go
index e129668..d81106d 100644
--- a/vendor/golang.org/x/sys/unix/syscall_netbsd.go
+++ b/vendor/golang.org/x/sys/unix/syscall_netbsd.go
@@ -55,7 +55,6 @@ func sysctlNodes(mib []_C_int) (nodes []Sysctlnode, err error) {
}
func nametomib(name string) (mib []_C_int, err error) {
-
// Split name into components.
var parts []string
last := 0
@@ -119,11 +118,118 @@ func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
return getdents(fd, buf)
}
+const ImplementsGetwd = true
+
+//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD
+
+func Getwd() (string, error) {
+ var buf [PathMax]byte
+ _, err := Getcwd(buf[0:])
+ if err != nil {
+ return "", err
+ }
+ n := clen(buf[:])
+ if n < 1 {
+ return "", EINVAL
+ }
+ return string(buf[:n]), nil
+}
+
// TODO
func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
return -1, ENOSYS
}
+func setattrlistTimes(path string, times []Timespec, flags int) error {
+ // used on Darwin for UtimesNano
+ return ENOSYS
+}
+
+//sys ioctl(fd int, req uint, arg uintptr) (err error)
+
+// ioctl itself should not be exposed directly, but additional get/set
+// functions for specific types are permissible.
+
+// IoctlSetInt performs an ioctl operation which sets an integer value
+// on fd, using the specified request number.
+func IoctlSetInt(fd int, req uint, value int) error {
+ return ioctl(fd, req, uintptr(value))
+}
+
+func IoctlSetWinsize(fd int, req uint, value *Winsize) error {
+ return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
+}
+
+func IoctlSetTermios(fd int, req uint, value *Termios) error {
+ return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
+}
+
+// IoctlGetInt performs an ioctl operation which gets an integer value
+// from fd, using the specified request number.
+func IoctlGetInt(fd int, req uint) (int, error) {
+ var value int
+ err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
+ return value, err
+}
+
+func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
+ var value Winsize
+ err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
+ return &value, err
+}
+
+func IoctlGetTermios(fd int, req uint) (*Termios, error) {
+ var value Termios
+ err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
+ return &value, err
+}
+
+func Uname(uname *Utsname) error {
+ mib := []_C_int{CTL_KERN, KERN_OSTYPE}
+ n := unsafe.Sizeof(uname.Sysname)
+ if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil {
+ return err
+ }
+
+ mib = []_C_int{CTL_KERN, KERN_HOSTNAME}
+ n = unsafe.Sizeof(uname.Nodename)
+ if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil {
+ return err
+ }
+
+ mib = []_C_int{CTL_KERN, KERN_OSRELEASE}
+ n = unsafe.Sizeof(uname.Release)
+ if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil {
+ return err
+ }
+
+ mib = []_C_int{CTL_KERN, KERN_VERSION}
+ n = unsafe.Sizeof(uname.Version)
+ if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil {
+ return err
+ }
+
+ // The version might have newlines or tabs in it, convert them to
+ // spaces.
+ for i, b := range uname.Version {
+ if b == '\n' || b == '\t' {
+ if i == len(uname.Version)-1 {
+ uname.Version[i] = 0
+ } else {
+ uname.Version[i] = ' '
+ }
+ }
+ }
+
+ mib = []_C_int{CTL_HW, HW_MACHINE}
+ n = unsafe.Sizeof(uname.Machine)
+ if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil {
+ return err
+ }
+
+ return nil
+}
+
/*
* Exposed directly
*/
@@ -384,7 +490,6 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
// getitimer
// getvfsstat
// getxattr
-// ioctl
// ktrace
// lchflags
// lchmod
@@ -422,7 +527,6 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
// ntp_adjtime
// pmc_control
// pmc_get_info
-// poll
// pollts
// preadv
// profil
diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go
index baefa41..24f74e5 100644
--- a/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go
+++ b/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go
@@ -6,19 +6,12 @@
package unix
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = int64(nsec / 1e9)
- ts.Nsec = int32(nsec % 1e9)
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: sec, Nsec: int32(nsec)}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Usec = int32(nsec % 1e9 / 1e3)
- tv.Sec = int64(nsec / 1e9)
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: sec, Usec: int32(usec)}
}
func SetKevent(k *Kevent_t, fd, mode, flags int) {
diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go
index 59c2ab7..6878bf7 100644
--- a/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go
@@ -6,19 +6,12 @@
package unix
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = int64(nsec / 1e9)
- ts.Nsec = int64(nsec % 1e9)
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: sec, Nsec: nsec}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Usec = int32(nsec % 1e9 / 1e3)
- tv.Sec = int64(nsec / 1e9)
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: sec, Usec: int32(usec)}
}
func SetKevent(k *Kevent_t, fd, mode, flags int) {
diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go
index 7208108..dbbfcf7 100644
--- a/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go
+++ b/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go
@@ -6,19 +6,12 @@
package unix
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = int64(nsec / 1e9)
- ts.Nsec = int32(nsec % 1e9)
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: sec, Nsec: int32(nsec)}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Usec = int32(nsec % 1e9 / 1e3)
- tv.Sec = int64(nsec / 1e9)
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: sec, Usec: int32(usec)}
}
func SetKevent(k *Kevent_t, fd, mode, flags int) {
diff --git a/vendor/golang.org/x/sys/unix/syscall_no_getwd.go b/vendor/golang.org/x/sys/unix/syscall_no_getwd.go
deleted file mode 100644
index 530792e..0000000
--- a/vendor/golang.org/x/sys/unix/syscall_no_getwd.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// 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 dragonfly freebsd netbsd openbsd
-
-package unix
-
-const ImplementsGetwd = false
-
-func Getwd() (string, error) { return "", ENOTSUP }
diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/golang.org/x/sys/unix/syscall_openbsd.go
index 408e630..553c2fb 100644
--- a/vendor/golang.org/x/sys/unix/syscall_openbsd.go
+++ b/vendor/golang.org/x/sys/unix/syscall_openbsd.go
@@ -13,6 +13,7 @@
package unix
import (
+ "sort"
"syscall"
"unsafe"
)
@@ -32,23 +33,11 @@ type SockaddrDatalink struct {
func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
func nametomib(name string) (mib []_C_int, err error) {
-
- // Perform lookup via a binary search
- left := 0
- right := len(sysctlMib) - 1
- for {
- idx := left + (right-left)/2
- switch {
- case name == sysctlMib[idx].ctlname:
- return sysctlMib[idx].ctloid, nil
- case name > sysctlMib[idx].ctlname:
- left = idx + 1
- default:
- right = idx - 1
- }
- if left > right {
- break
- }
+ i := sort.Search(len(sysctlMib), func(i int) bool {
+ return sysctlMib[i].ctlname >= name
+ })
+ if i < len(sysctlMib) && sysctlMib[i].ctlname == name {
+ return sysctlMib[i].ctloid, nil
}
return nil, EINVAL
}
@@ -82,6 +71,23 @@ func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
return getdents(fd, buf)
}
+const ImplementsGetwd = true
+
+//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD
+
+func Getwd() (string, error) {
+ var buf [PathMax]byte
+ _, err := Getcwd(buf[0:])
+ if err != nil {
+ return "", err
+ }
+ n := clen(buf[:])
+ if n < 1 {
+ return "", EINVAL
+ }
+ return string(buf[:n]), nil
+}
+
// TODO
func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
return -1, ENOSYS
@@ -102,6 +108,96 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
return
}
+func setattrlistTimes(path string, times []Timespec, flags int) error {
+ // used on Darwin for UtimesNano
+ return ENOSYS
+}
+
+//sys ioctl(fd int, req uint, arg uintptr) (err error)
+
+// ioctl itself should not be exposed directly, but additional get/set
+// functions for specific types are permissible.
+
+// IoctlSetInt performs an ioctl operation which sets an integer value
+// on fd, using the specified request number.
+func IoctlSetInt(fd int, req uint, value int) error {
+ return ioctl(fd, req, uintptr(value))
+}
+
+func IoctlSetWinsize(fd int, req uint, value *Winsize) error {
+ return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
+}
+
+func IoctlSetTermios(fd int, req uint, value *Termios) error {
+ return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
+}
+
+// IoctlGetInt performs an ioctl operation which gets an integer value
+// from fd, using the specified request number.
+func IoctlGetInt(fd int, req uint) (int, error) {
+ var value int
+ err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
+ return value, err
+}
+
+func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
+ var value Winsize
+ err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
+ return &value, err
+}
+
+func IoctlGetTermios(fd int, req uint) (*Termios, error) {
+ var value Termios
+ err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
+ return &value, err
+}
+
+func Uname(uname *Utsname) error {
+ mib := []_C_int{CTL_KERN, KERN_OSTYPE}
+ n := unsafe.Sizeof(uname.Sysname)
+ if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil {
+ return err
+ }
+
+ mib = []_C_int{CTL_KERN, KERN_HOSTNAME}
+ n = unsafe.Sizeof(uname.Nodename)
+ if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil {
+ return err
+ }
+
+ mib = []_C_int{CTL_KERN, KERN_OSRELEASE}
+ n = unsafe.Sizeof(uname.Release)
+ if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil {
+ return err
+ }
+
+ mib = []_C_int{CTL_KERN, KERN_VERSION}
+ n = unsafe.Sizeof(uname.Version)
+ if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil {
+ return err
+ }
+
+ // The version might have newlines or tabs in it, convert them to
+ // spaces.
+ for i, b := range uname.Version {
+ if b == '\n' || b == '\t' {
+ if i == len(uname.Version)-1 {
+ uname.Version[i] = 0
+ } else {
+ uname.Version[i] = ' '
+ }
+ }
+ }
+
+ mib = []_C_int{CTL_HW, HW_MACHINE}
+ n = unsafe.Sizeof(uname.Machine)
+ if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil {
+ return err
+ }
+
+ return nil
+}
+
/*
* Exposed directly
*/
@@ -222,7 +318,6 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
// getresuid
// getrtable
// getthrid
-// ioctl
// ktrace
// lfs_bmapv
// lfs_markv
@@ -243,7 +338,6 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
// nfssvc
// nnpfspioctl
// openat
-// poll
// preadv
// profil
// pwritev
diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go
index d3809b4..994964a 100644
--- a/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go
+++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go
@@ -6,19 +6,12 @@
package unix
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = int64(nsec / 1e9)
- ts.Nsec = int32(nsec % 1e9)
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: sec, Nsec: int32(nsec)}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Usec = int32(nsec % 1e9 / 1e3)
- tv.Sec = int64(nsec / 1e9)
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: sec, Usec: int32(usec)}
}
func SetKevent(k *Kevent_t, fd, mode, flags int) {
diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go
index 9a9dfce..649e67f 100644
--- a/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go
@@ -6,19 +6,12 @@
package unix
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = nsec / 1e9
- ts.Nsec = nsec % 1e9
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: sec, Nsec: nsec}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Usec = nsec % 1e9 / 1e3
- tv.Sec = nsec / 1e9
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: sec, Usec: usec}
}
func SetKevent(k *Kevent_t, fd, mode, flags int) {
diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go
index ba86490..59844f5 100644
--- a/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go
+++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go
@@ -6,19 +6,12 @@
package unix
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = int64(nsec / 1e9)
- ts.Nsec = int32(nsec % 1e9)
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: sec, Nsec: int32(nsec)}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Usec = int32(nsec % 1e9 / 1e3)
- tv.Sec = int64(nsec / 1e9)
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: sec, Usec: int32(usec)}
}
func SetKevent(k *Kevent_t, fd, mode, flags int) {
diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go
index 35e5d72..9dc01e7 100644
--- a/vendor/golang.org/x/sys/unix/syscall_solaris.go
+++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go
@@ -34,15 +34,6 @@ type SockaddrDatalink struct {
raw RawSockaddrDatalink
}
-func clen(n []byte) int {
- for i := 0; i < len(n); i++ {
- if n[i] == 0 {
- return i
- }
- }
- return len(n)
-}
-
func direntIno(buf []byte) (uint64, bool) {
return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino))
}
@@ -139,6 +130,18 @@ func Getsockname(fd int) (sa Sockaddr, err error) {
return anyToSockaddr(&rsa)
}
+// GetsockoptString returns the string value of the socket option opt for the
+// socket associated with fd at the given socket level.
+func GetsockoptString(fd, level, opt int) (string, error) {
+ buf := make([]byte, 256)
+ vallen := _Socklen(len(buf))
+ err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen)
+ if err != nil {
+ return "", err
+ }
+ return string(buf[:vallen-1]), nil
+}
+
const ImplementsGetwd = true
//sys Getcwd(buf []byte) (n int, err error)
@@ -166,7 +169,7 @@ func Getwd() (wd string, err error) {
func Getgroups() (gids []int, err error) {
n, err := getgroups(0, nil)
- // Check for error and sanity check group count. Newer versions of
+ // Check for error and sanity check group count. Newer versions of
// Solaris allow up to 1024 (NGROUPS_MAX).
if n < 0 || n > 1024 {
if err != nil {
@@ -350,7 +353,7 @@ func Futimesat(dirfd int, path string, tv []Timeval) error {
}
// Solaris doesn't have an futimes function because it allows NULL to be
-// specified as the path for futimesat. However, Go doesn't like
+// specified as the path for futimesat. However, Go doesn't like
// NULL-style string interfaces, so this simple wrapper is provided.
func Futimes(fd int, tv []Timeval) error {
if tv == nil {
@@ -578,6 +581,15 @@ func IoctlGetTermio(fd int, req uint) (*Termio, error) {
return &value, err
}
+//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error)
+
+func Poll(fds []PollFd, timeout int) (n int, err error) {
+ if len(fds) == 0 {
+ return poll(nil, 0, timeout)
+ }
+ return poll(&fds[0], len(fds), timeout)
+}
+
/*
* Exposed directly
*/
@@ -646,6 +658,7 @@ func IoctlGetTermio(fd int, req uint) (*Termio, error) {
//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
//sys Rmdir(path string) (err error)
//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = lseek
+//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)
//sysnb Setegid(egid int) (err error)
//sysnb Seteuid(euid int) (err error)
//sysnb Setgid(gid int) (err error)
diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go
index 5aff62c..9d4e7a6 100644
--- a/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go
+++ b/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go
@@ -6,19 +6,12 @@
package unix
-func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
-
-func NsecToTimespec(nsec int64) (ts Timespec) {
- ts.Sec = nsec / 1e9
- ts.Nsec = nsec % 1e9
- return
+func setTimespec(sec, nsec int64) Timespec {
+ return Timespec{Sec: sec, Nsec: nsec}
}
-func NsecToTimeval(nsec int64) (tv Timeval) {
- nsec += 999 // round up to microsecond
- tv.Usec = nsec % 1e9 / 1e3
- tv.Sec = int64(nsec / 1e9)
- return
+func setTimeval(sec, usec int64) Timeval {
+ return Timeval{Sec: sec, Usec: usec}
}
func (iov *Iovec) SetLen(length int) {
diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris_test.go b/vendor/golang.org/x/sys/unix/syscall_solaris_test.go
index d3e7d2b..57dba88 100644
--- a/vendor/golang.org/x/sys/unix/syscall_solaris_test.go
+++ b/vendor/golang.org/x/sys/unix/syscall_solaris_test.go
@@ -9,10 +9,31 @@ package unix_test
import (
"os/exec"
"testing"
+ "time"
"golang.org/x/sys/unix"
)
+func TestSelect(t *testing.T) {
+ err := unix.Select(0, nil, nil, nil, &unix.Timeval{Sec: 0, Usec: 0})
+ if err != nil {
+ t.Fatalf("Select: %v", err)
+ }
+
+ dur := 150 * time.Millisecond
+ tv := unix.NsecToTimeval(int64(dur))
+ start := time.Now()
+ err = unix.Select(0, nil, nil, nil, &tv)
+ took := time.Since(start)
+ if err != nil {
+ t.Fatalf("Select: %v", err)
+ }
+
+ if took < dur {
+ t.Errorf("Select: timeout should have been at least %v, got %v", dur, took)
+ }
+}
+
func TestStatvfs(t *testing.T) {
if err := unix.Statvfs("", nil); err == nil {
t.Fatal(`Statvfs("") expected failure`)
diff --git a/vendor/golang.org/x/sys/unix/syscall_test.go b/vendor/golang.org/x/sys/unix/syscall_test.go
index 95eac92..a8eef7c 100644
--- a/vendor/golang.org/x/sys/unix/syscall_test.go
+++ b/vendor/golang.org/x/sys/unix/syscall_test.go
@@ -48,3 +48,13 @@ func TestItoa(t *testing.T) {
t.Fatalf("itoa(%d) = %s, want %s", i, s, f)
}
}
+
+func TestUname(t *testing.T) {
+ var utsname unix.Utsname
+ err := unix.Uname(&utsname)
+ if err != nil {
+ t.Fatalf("Uname: %v", err)
+ }
+
+ t.Logf("OS: %s/%s %s", utsname.Sysname[:], utsname.Machine[:], utsname.Release[:])
+}
diff --git a/vendor/golang.org/x/sys/unix/syscall_unix.go b/vendor/golang.org/x/sys/unix/syscall_unix.go
index 3ed8a91..35c1cd5 100644
--- a/vendor/golang.org/x/sys/unix/syscall_unix.go
+++ b/vendor/golang.org/x/sys/unix/syscall_unix.go
@@ -50,6 +50,17 @@ func errnoErr(e syscall.Errno) error {
return e
}
+// clen returns the index of the first NULL byte in n or len(n) if n contains no
+// NULL byte or len(n) if n contains no NULL byte
+func clen(n []byte) int {
+ for i := 0; i < len(n); i++ {
+ if n[i] == 0 {
+ return i
+ }
+ }
+ return len(n)
+}
+
// Mmap manager, for use by operating system-specific implementations.
type mmapper struct {
diff --git a/vendor/golang.org/x/sys/unix/syscall_unix_test.go b/vendor/golang.org/x/sys/unix/syscall_unix_test.go
index 394b350..496e471 100644
--- a/vendor/golang.org/x/sys/unix/syscall_unix_test.go
+++ b/vendor/golang.org/x/sys/unix/syscall_unix_test.go
@@ -138,6 +138,9 @@ func TestPassFD(t *testing.T) {
uc.Close()
})
_, oobn, _, _, err := uc.ReadMsgUnix(buf, oob)
+ if err != nil {
+ t.Fatalf("ReadMsgUnix: %v", err)
+ }
closeUnix.Stop()
scms, err := unix.ParseSocketControlMessage(oob[:oobn])
@@ -335,6 +338,9 @@ func TestDup(t *testing.T) {
t.Fatalf("Write to dup2 fd failed: %v", err)
}
_, err = unix.Seek(f, 0, 0)
+ if err != nil {
+ t.Fatalf("Seek failed: %v", err)
+ }
_, err = unix.Read(f, b2)
if err != nil {
t.Fatalf("Read back failed: %v", err)
@@ -343,3 +349,98 @@ func TestDup(t *testing.T) {
t.Errorf("Dup: stdout write not in file, expected %v, got %v", string(b1), string(b2))
}
}
+
+func TestPoll(t *testing.T) {
+ f, cleanup := mktmpfifo(t)
+ defer cleanup()
+
+ const timeout = 100
+
+ ok := make(chan bool, 1)
+ go func() {
+ select {
+ case <-time.After(10 * timeout * time.Millisecond):
+ t.Errorf("Poll: failed to timeout after %d milliseconds", 10*timeout)
+ case <-ok:
+ }
+ }()
+
+ fds := []unix.PollFd{{Fd: int32(f.Fd()), Events: unix.POLLIN}}
+ n, err := unix.Poll(fds, timeout)
+ ok <- true
+ if err != nil {
+ t.Errorf("Poll: unexpected error: %v", err)
+ return
+ }
+ if n != 0 {
+ t.Errorf("Poll: wrong number of events: got %v, expected %v", n, 0)
+ return
+ }
+}
+
+func TestGetwd(t *testing.T) {
+ fd, err := os.Open(".")
+ if err != nil {
+ t.Fatalf("Open .: %s", err)
+ }
+ defer fd.Close()
+ // These are chosen carefully not to be symlinks on a Mac
+ // (unlike, say, /var, /etc)
+ dirs := []string{"/", "/usr/bin"}
+ if runtime.GOOS == "darwin" {
+ switch runtime.GOARCH {
+ case "arm", "arm64":
+ d1, err := ioutil.TempDir("", "d1")
+ if err != nil {
+ t.Fatalf("TempDir: %v", err)
+ }
+ d2, err := ioutil.TempDir("", "d2")
+ if err != nil {
+ t.Fatalf("TempDir: %v", err)
+ }
+ dirs = []string{d1, d2}
+ }
+ }
+ oldwd := os.Getenv("PWD")
+ for _, d := range dirs {
+ err = os.Chdir(d)
+ if err != nil {
+ t.Fatalf("Chdir: %v", err)
+ }
+ pwd, err := unix.Getwd()
+ if err != nil {
+ t.Fatalf("Getwd in %s: %s", d, err)
+ }
+ os.Setenv("PWD", oldwd)
+ err = fd.Chdir()
+ if err != nil {
+ // We changed the current directory and cannot go back.
+ // Don't let the tests continue; they'll scribble
+ // all over some other directory.
+ fmt.Fprintf(os.Stderr, "fchdir back to dot failed: %s\n", err)
+ os.Exit(1)
+ }
+ if pwd != d {
+ t.Fatalf("Getwd returned %q want %q", pwd, d)
+ }
+ }
+}
+
+// mktmpfifo creates a temporary FIFO and provides a cleanup function.
+func mktmpfifo(t *testing.T) (*os.File, func()) {
+ err := unix.Mkfifo("fifo", 0666)
+ if err != nil {
+ t.Fatalf("mktmpfifo: failed to create FIFO: %v", err)
+ }
+
+ f, err := os.OpenFile("fifo", os.O_RDWR, 0666)
+ if err != nil {
+ os.Remove("fifo")
+ t.Fatalf("mktmpfifo: failed to open FIFO: %v", err)
+ }
+
+ return f, func() {
+ f.Close()
+ os.Remove("fifo")
+ }
+}
diff --git a/vendor/golang.org/x/sys/unix/timestruct.go b/vendor/golang.org/x/sys/unix/timestruct.go
new file mode 100644
index 0000000..47b9011
--- /dev/null
+++ b/vendor/golang.org/x/sys/unix/timestruct.go
@@ -0,0 +1,82 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd linux netbsd openbsd solaris
+
+package unix
+
+import "time"
+
+// TimespecToNsec converts a Timespec value into a number of
+// nanoseconds since the Unix epoch.
+func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
+
+// NsecToTimespec takes a number of nanoseconds since the Unix epoch
+// and returns the corresponding Timespec value.
+func NsecToTimespec(nsec int64) Timespec {
+ sec := nsec / 1e9
+ nsec = nsec % 1e9
+ if nsec < 0 {
+ nsec += 1e9
+ sec--
+ }
+ return setTimespec(sec, nsec)
+}
+
+// TimeToTimespec converts t into a Timespec.
+// On some 32-bit systems the range of valid Timespec values are smaller
+// than that of time.Time values. So if t is out of the valid range of
+// Timespec, it returns a zero Timespec and ERANGE.
+func TimeToTimespec(t time.Time) (Timespec, error) {
+ sec := t.Unix()
+ nsec := int64(t.Nanosecond())
+ ts := setTimespec(sec, nsec)
+
+ // Currently all targets have either int32 or int64 for Timespec.Sec.
+ // If there were a new target with floating point type for it, we have
+ // to consider the rounding error.
+ if int64(ts.Sec) != sec {
+ return Timespec{}, ERANGE
+ }
+ return ts, nil
+}
+
+// TimevalToNsec converts a Timeval value into a number of nanoseconds
+// since the Unix epoch.
+func TimevalToNsec(tv Timeval) int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1e3 }
+
+// NsecToTimeval takes a number of nanoseconds since the Unix epoch
+// and returns the corresponding Timeval value.
+func NsecToTimeval(nsec int64) Timeval {
+ nsec += 999 // round up to microsecond
+ usec := nsec % 1e9 / 1e3
+ sec := nsec / 1e9
+ if usec < 0 {
+ usec += 1e6
+ sec--
+ }
+ return setTimeval(sec, usec)
+}
+
+// Unix returns ts as the number of seconds and nanoseconds elapsed since the
+// Unix epoch.
+func (ts *Timespec) Unix() (sec int64, nsec int64) {
+ return int64(ts.Sec), int64(ts.Nsec)
+}
+
+// Unix returns tv as the number of seconds and nanoseconds elapsed since the
+// Unix epoch.
+func (tv *Timeval) Unix() (sec int64, nsec int64) {
+ return int64(tv.Sec), int64(tv.Usec) * 1000
+}
+
+// Nano returns ts as the number of nanoseconds elapsed since the Unix epoch.
+func (ts *Timespec) Nano() int64 {
+ return int64(ts.Sec)*1e9 + int64(ts.Nsec)
+}
+
+// Nano returns tv as the number of nanoseconds elapsed since the Unix epoch.
+func (tv *Timeval) Nano() int64 {
+ return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000
+}
diff --git a/vendor/golang.org/x/sys/unix/timestruct_test.go b/vendor/golang.org/x/sys/unix/timestruct_test.go
new file mode 100644
index 0000000..4215f46
--- /dev/null
+++ b/vendor/golang.org/x/sys/unix/timestruct_test.go
@@ -0,0 +1,54 @@
+// Copyright 2017 The Go Authors. All right reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin dragonfly freebsd linux netbsd openbsd solaris
+
+package unix_test
+
+import (
+ "testing"
+ "time"
+ "unsafe"
+
+ "golang.org/x/sys/unix"
+)
+
+func TestTimeToTimespec(t *testing.T) {
+ timeTests := []struct {
+ time time.Time
+ valid bool
+ }{
+ {time.Unix(0, 0), true},
+ {time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC), true},
+ {time.Date(2262, time.December, 31, 23, 0, 0, 0, time.UTC), false},
+ {time.Unix(0x7FFFFFFF, 0), true},
+ {time.Unix(0x80000000, 0), false},
+ {time.Unix(0x7FFFFFFF, 1000000000), false},
+ {time.Unix(0x7FFFFFFF, 999999999), true},
+ {time.Unix(-0x80000000, 0), true},
+ {time.Unix(-0x80000001, 0), false},
+ {time.Date(2038, time.January, 19, 3, 14, 7, 0, time.UTC), true},
+ {time.Date(2038, time.January, 19, 3, 14, 8, 0, time.UTC), false},
+ {time.Date(1901, time.December, 13, 20, 45, 52, 0, time.UTC), true},
+ {time.Date(1901, time.December, 13, 20, 45, 51, 0, time.UTC), false},
+ }
+
+ // Currently all targets have either int32 or int64 for Timespec.Sec.
+ // If there were a new target with unsigned or floating point type for
+ // it, this test must be adjusted.
+ have64BitTime := (unsafe.Sizeof(unix.Timespec{}.Sec) == 8)
+ for _, tt := range timeTests {
+ ts, err := unix.TimeToTimespec(tt.time)
+ tt.valid = tt.valid || have64BitTime
+ if tt.valid && err != nil {
+ t.Errorf("TimeToTimespec(%v): %v", tt.time, err)
+ }
+ if err == nil {
+ tstime := time.Unix(int64(ts.Sec), int64(ts.Nsec))
+ if !tstime.Equal(tt.time) {
+ t.Errorf("TimeToTimespec(%v) is the time %v", tt.time, tstime)
+ }
+ }
+ }
+}
diff --git a/vendor/golang.org/x/sys/unix/types_darwin.go b/vendor/golang.org/x/sys/unix/types_darwin.go
index 415124d..46b9908 100644
--- a/vendor/golang.org/x/sys/unix/types_darwin.go
+++ b/vendor/golang.org/x/sys/unix/types_darwin.go
@@ -19,6 +19,7 @@ package unix
#define _DARWIN_USE_64_BIT_INODE
#include
#include
+#include
#include
#include
#include
@@ -38,6 +39,7 @@ package unix
#include
#include
#include
+#include
#include
#include
#include
@@ -252,3 +254,24 @@ const (
AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW
AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW
)
+
+// poll
+
+type PollFd C.struct_pollfd
+
+const (
+ POLLERR = C.POLLERR
+ POLLHUP = C.POLLHUP
+ POLLIN = C.POLLIN
+ POLLNVAL = C.POLLNVAL
+ POLLOUT = C.POLLOUT
+ POLLPRI = C.POLLPRI
+ POLLRDBAND = C.POLLRDBAND
+ POLLRDNORM = C.POLLRDNORM
+ POLLWRBAND = C.POLLWRBAND
+ POLLWRNORM = C.POLLWRNORM
+)
+
+// uname
+
+type Utsname C.struct_utsname
diff --git a/vendor/golang.org/x/sys/unix/types_dragonfly.go b/vendor/golang.org/x/sys/unix/types_dragonfly.go
index 80b2778..0c63304 100644
--- a/vendor/golang.org/x/sys/unix/types_dragonfly.go
+++ b/vendor/golang.org/x/sys/unix/types_dragonfly.go
@@ -17,6 +17,7 @@ package unix
#define KERNEL
#include
#include
+#include
#include
#include
#include
@@ -34,6 +35,7 @@ package unix
#include
#include
#include
+#include
#include
#include
#include
@@ -125,6 +127,12 @@ type Dirent C.struct_dirent
type Fsid C.struct_fsid
+// File system limits
+
+const (
+ PathMax = C.PATH_MAX
+)
+
// Sockets
type RawSockaddrInet4 C.struct_sockaddr_in
@@ -241,9 +249,32 @@ type BpfHdr C.struct_bpf_hdr
type Termios C.struct_termios
+type Winsize C.struct_winsize
+
// fchmodat-like syscalls.
const (
AT_FDCWD = C.AT_FDCWD
AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW
)
+
+// poll
+
+type PollFd C.struct_pollfd
+
+const (
+ POLLERR = C.POLLERR
+ POLLHUP = C.POLLHUP
+ POLLIN = C.POLLIN
+ POLLNVAL = C.POLLNVAL
+ POLLOUT = C.POLLOUT
+ POLLPRI = C.POLLPRI
+ POLLRDBAND = C.POLLRDBAND
+ POLLRDNORM = C.POLLRDNORM
+ POLLWRBAND = C.POLLWRBAND
+ POLLWRNORM = C.POLLWRNORM
+)
+
+// Uname
+
+type Utsname C.struct_utsname
diff --git a/vendor/golang.org/x/sys/unix/types_freebsd.go b/vendor/golang.org/x/sys/unix/types_freebsd.go
index 934fd7a..4eb02cd 100644
--- a/vendor/golang.org/x/sys/unix/types_freebsd.go
+++ b/vendor/golang.org/x/sys/unix/types_freebsd.go
@@ -17,6 +17,7 @@ package unix
#define KERNEL
#include
#include
+#include
#include
#include
#include
@@ -35,6 +36,7 @@ package unix
#include
#include
#include
+#include
#include
#include
#include
@@ -214,6 +216,12 @@ type Dirent C.struct_dirent
type Fsid C.struct_fsid
+// File system limits
+
+const (
+ PathMax = C.PATH_MAX
+)
+
// Advice to Fadvise
const (
@@ -367,6 +375,28 @@ const (
AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW
)
+// poll
+
+type PollFd C.struct_pollfd
+
+const (
+ POLLERR = C.POLLERR
+ POLLHUP = C.POLLHUP
+ POLLIN = C.POLLIN
+ POLLINIGNEOF = C.POLLINIGNEOF
+ POLLNVAL = C.POLLNVAL
+ POLLOUT = C.POLLOUT
+ POLLPRI = C.POLLPRI
+ POLLRDBAND = C.POLLRDBAND
+ POLLRDNORM = C.POLLRDNORM
+ POLLWRBAND = C.POLLWRBAND
+ POLLWRNORM = C.POLLWRNORM
+)
+
// Capabilities
type CapRights C.struct_cap_rights
+
+// Uname
+
+type Utsname C.struct_utsname
diff --git a/vendor/golang.org/x/sys/unix/types_netbsd.go b/vendor/golang.org/x/sys/unix/types_netbsd.go
index cb95c80..10aa9b3 100644
--- a/vendor/golang.org/x/sys/unix/types_netbsd.go
+++ b/vendor/golang.org/x/sys/unix/types_netbsd.go
@@ -17,6 +17,7 @@ package unix
#define KERNEL
#include
#include
+#include
#include
#include
#include
@@ -36,6 +37,7 @@ package unix
#include
#include
#include
+#include
#include
#include
#include
@@ -110,6 +112,12 @@ type Dirent C.struct_dirent
type Fsid C.fsid_t
+// File system limits
+
+const (
+ PathMax = C.PATH_MAX
+)
+
// Sockets
type RawSockaddrInet4 C.struct_sockaddr_in
@@ -227,6 +235,8 @@ type BpfTimeval C.struct_bpf_timeval
type Termios C.struct_termios
+type Winsize C.struct_winsize
+
// fchmodat-like syscalls.
const (
@@ -234,6 +244,27 @@ const (
AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW
)
+// poll
+
+type PollFd C.struct_pollfd
+
+const (
+ POLLERR = C.POLLERR
+ POLLHUP = C.POLLHUP
+ POLLIN = C.POLLIN
+ POLLNVAL = C.POLLNVAL
+ POLLOUT = C.POLLOUT
+ POLLPRI = C.POLLPRI
+ POLLRDBAND = C.POLLRDBAND
+ POLLRDNORM = C.POLLRDNORM
+ POLLWRBAND = C.POLLWRBAND
+ POLLWRNORM = C.POLLWRNORM
+)
+
// Sysctl
type Sysctlnode C.struct_sysctlnode
+
+// Uname
+
+type Utsname C.struct_utsname
diff --git a/vendor/golang.org/x/sys/unix/types_openbsd.go b/vendor/golang.org/x/sys/unix/types_openbsd.go
index 392da69..649e559 100644
--- a/vendor/golang.org/x/sys/unix/types_openbsd.go
+++ b/vendor/golang.org/x/sys/unix/types_openbsd.go
@@ -17,6 +17,7 @@ package unix
#define KERNEL
#include
#include
+#include
#include
#include
#include
@@ -35,6 +36,7 @@ package unix
#include
#include
#include
+#include
#include
#include
#include
@@ -126,6 +128,12 @@ type Dirent C.struct_dirent
type Fsid C.fsid_t
+// File system limits
+
+const (
+ PathMax = C.PATH_MAX
+)
+
// Sockets
type RawSockaddrInet4 C.struct_sockaddr_in
@@ -243,9 +251,32 @@ type BpfTimeval C.struct_bpf_timeval
type Termios C.struct_termios
+type Winsize C.struct_winsize
+
// fchmodat-like syscalls.
const (
AT_FDCWD = C.AT_FDCWD
AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW
)
+
+// poll
+
+type PollFd C.struct_pollfd
+
+const (
+ POLLERR = C.POLLERR
+ POLLHUP = C.POLLHUP
+ POLLIN = C.POLLIN
+ POLLNVAL = C.POLLNVAL
+ POLLOUT = C.POLLOUT
+ POLLPRI = C.POLLPRI
+ POLLRDBAND = C.POLLRDBAND
+ POLLRDNORM = C.POLLRDNORM
+ POLLWRBAND = C.POLLWRBAND
+ POLLWRNORM = C.POLLWRNORM
+)
+
+// Uname
+
+type Utsname C.struct_utsname
diff --git a/vendor/golang.org/x/sys/unix/types_solaris.go b/vendor/golang.org/x/sys/unix/types_solaris.go
index 6d74614..f777155 100644
--- a/vendor/golang.org/x/sys/unix/types_solaris.go
+++ b/vendor/golang.org/x/sys/unix/types_solaris.go
@@ -24,6 +24,7 @@ package unix
#include
#include
#include
+#include
#include
#include
#include
@@ -263,3 +264,20 @@ type Termios C.struct_termios
type Termio C.struct_termio
type Winsize C.struct_winsize
+
+// poll
+
+type PollFd C.struct_pollfd
+
+const (
+ POLLERR = C.POLLERR
+ POLLHUP = C.POLLHUP
+ POLLIN = C.POLLIN
+ POLLNVAL = C.POLLNVAL
+ POLLOUT = C.POLLOUT
+ POLLPRI = C.POLLPRI
+ POLLRDBAND = C.POLLRDBAND
+ POLLRDNORM = C.POLLRDNORM
+ POLLWRBAND = C.POLLWRBAND
+ POLLWRNORM = C.POLLWRNORM
+)
diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go
index 1c68758..dcba884 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go
@@ -49,6 +49,86 @@ const (
AF_UNSPEC = 0x0
AF_UTUN = 0x26
ALTWERASE = 0x200
+ ATTR_BIT_MAP_COUNT = 0x5
+ ATTR_CMN_ACCESSMASK = 0x20000
+ ATTR_CMN_ACCTIME = 0x1000
+ ATTR_CMN_ADDEDTIME = 0x10000000
+ ATTR_CMN_BKUPTIME = 0x2000
+ ATTR_CMN_CHGTIME = 0x800
+ ATTR_CMN_CRTIME = 0x200
+ ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000
+ ATTR_CMN_DEVID = 0x2
+ ATTR_CMN_DOCUMENT_ID = 0x100000
+ ATTR_CMN_ERROR = 0x20000000
+ ATTR_CMN_EXTENDED_SECURITY = 0x400000
+ ATTR_CMN_FILEID = 0x2000000
+ ATTR_CMN_FLAGS = 0x40000
+ ATTR_CMN_FNDRINFO = 0x4000
+ ATTR_CMN_FSID = 0x4
+ ATTR_CMN_FULLPATH = 0x8000000
+ ATTR_CMN_GEN_COUNT = 0x80000
+ ATTR_CMN_GRPID = 0x10000
+ ATTR_CMN_GRPUUID = 0x1000000
+ ATTR_CMN_MODTIME = 0x400
+ ATTR_CMN_NAME = 0x1
+ ATTR_CMN_NAMEDATTRCOUNT = 0x80000
+ ATTR_CMN_NAMEDATTRLIST = 0x100000
+ ATTR_CMN_OBJID = 0x20
+ ATTR_CMN_OBJPERMANENTID = 0x40
+ ATTR_CMN_OBJTAG = 0x10
+ ATTR_CMN_OBJTYPE = 0x8
+ ATTR_CMN_OWNERID = 0x8000
+ ATTR_CMN_PARENTID = 0x4000000
+ ATTR_CMN_PAROBJID = 0x80
+ ATTR_CMN_RETURNED_ATTRS = 0x80000000
+ ATTR_CMN_SCRIPT = 0x100
+ ATTR_CMN_SETMASK = 0x41c7ff00
+ ATTR_CMN_USERACCESS = 0x200000
+ ATTR_CMN_UUID = 0x800000
+ ATTR_CMN_VALIDMASK = 0xffffffff
+ ATTR_CMN_VOLSETMASK = 0x6700
+ ATTR_FILE_ALLOCSIZE = 0x4
+ ATTR_FILE_CLUMPSIZE = 0x10
+ ATTR_FILE_DATAALLOCSIZE = 0x400
+ ATTR_FILE_DATAEXTENTS = 0x800
+ ATTR_FILE_DATALENGTH = 0x200
+ ATTR_FILE_DEVTYPE = 0x20
+ ATTR_FILE_FILETYPE = 0x40
+ ATTR_FILE_FORKCOUNT = 0x80
+ ATTR_FILE_FORKLIST = 0x100
+ ATTR_FILE_IOBLOCKSIZE = 0x8
+ ATTR_FILE_LINKCOUNT = 0x1
+ ATTR_FILE_RSRCALLOCSIZE = 0x2000
+ ATTR_FILE_RSRCEXTENTS = 0x4000
+ ATTR_FILE_RSRCLENGTH = 0x1000
+ ATTR_FILE_SETMASK = 0x20
+ ATTR_FILE_TOTALSIZE = 0x2
+ ATTR_FILE_VALIDMASK = 0x37ff
+ ATTR_VOL_ALLOCATIONCLUMP = 0x40
+ ATTR_VOL_ATTRIBUTES = 0x40000000
+ ATTR_VOL_CAPABILITIES = 0x20000
+ ATTR_VOL_DIRCOUNT = 0x400
+ ATTR_VOL_ENCODINGSUSED = 0x10000
+ ATTR_VOL_FILECOUNT = 0x200
+ ATTR_VOL_FSTYPE = 0x1
+ ATTR_VOL_INFO = 0x80000000
+ ATTR_VOL_IOBLOCKSIZE = 0x80
+ ATTR_VOL_MAXOBJCOUNT = 0x800
+ ATTR_VOL_MINALLOCATION = 0x20
+ ATTR_VOL_MOUNTEDDEVICE = 0x8000
+ ATTR_VOL_MOUNTFLAGS = 0x4000
+ ATTR_VOL_MOUNTPOINT = 0x1000
+ ATTR_VOL_NAME = 0x2000
+ ATTR_VOL_OBJCOUNT = 0x100
+ ATTR_VOL_QUOTA_SIZE = 0x10000000
+ ATTR_VOL_RESERVED_SIZE = 0x20000000
+ ATTR_VOL_SETMASK = 0x80002000
+ ATTR_VOL_SIGNATURE = 0x2
+ ATTR_VOL_SIZE = 0x4
+ ATTR_VOL_SPACEAVAIL = 0x10
+ ATTR_VOL_SPACEFREE = 0x8
+ ATTR_VOL_UUID = 0x40000
+ ATTR_VOL_VALIDMASK = 0xf007ffff
B0 = 0x0
B110 = 0x6e
B115200 = 0x1c200
@@ -169,6 +249,8 @@ const (
CSTOP = 0x13
CSTOPB = 0x400
CSUSP = 0x1a
+ CTL_HW = 0x6
+ CTL_KERN = 0x1
CTL_MAXNAME = 0xc
CTL_NET = 0x4
DLT_A429 = 0xb8
@@ -390,6 +472,11 @@ const (
FF1 = 0x4000
FFDLY = 0x4000
FLUSHO = 0x800000
+ FSOPT_ATTR_CMN_EXTENDED = 0x20
+ FSOPT_NOFOLLOW = 0x1
+ FSOPT_NOINMEMUPDATE = 0x2
+ FSOPT_PACK_INVAL_ATTRS = 0x8
+ FSOPT_REPORT_FULLSIZE = 0x4
F_ADDFILESIGS = 0x3d
F_ADDFILESIGS_FOR_DYLD_SIM = 0x53
F_ADDFILESIGS_RETURN = 0x61
@@ -425,6 +512,7 @@ const (
F_PATHPKG_CHECK = 0x34
F_PEOFPOSMODE = 0x3
F_PREALLOCATE = 0x2a
+ F_PUNCHHOLE = 0x63
F_RDADVISE = 0x2c
F_RDAHEAD = 0x2d
F_RDLCK = 0x1
@@ -441,10 +529,12 @@ const (
F_SINGLE_WRITER = 0x4c
F_THAW_FS = 0x36
F_TRANSCODEKEY = 0x4b
+ F_TRIM_ACTIVE_FILE = 0x64
F_UNLCK = 0x2
F_VOLPOSMODE = 0x4
F_WRLCK = 0x3
HUPCL = 0x4000
+ HW_MACHINE = 0x1
ICANON = 0x100
ICMP6_FILTER = 0x12
ICRNL = 0x100
@@ -681,6 +771,7 @@ const (
IPV6_FAITH = 0x1d
IPV6_FLOWINFO_MASK = 0xffffff0f
IPV6_FLOWLABEL_MASK = 0xffff0f00
+ IPV6_FLOW_ECN_MASK = 0x300
IPV6_FRAGTTL = 0x3c
IPV6_FW_ADD = 0x1e
IPV6_FW_DEL = 0x1f
@@ -771,6 +862,7 @@ const (
IP_RECVOPTS = 0x5
IP_RECVPKTINFO = 0x1a
IP_RECVRETOPTS = 0x6
+ IP_RECVTOS = 0x1b
IP_RECVTTL = 0x18
IP_RETOPTS = 0x8
IP_RF = 0x8000
@@ -789,6 +881,10 @@ const (
IXANY = 0x800
IXOFF = 0x400
IXON = 0x200
+ KERN_HOSTNAME = 0xa
+ KERN_OSRELEASE = 0x2
+ KERN_OSTYPE = 0x1
+ KERN_VERSION = 0x4
LOCK_EX = 0x2
LOCK_NB = 0x4
LOCK_SH = 0x1
diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go
index 48f63d4..1a51c96 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go
@@ -49,6 +49,86 @@ const (
AF_UNSPEC = 0x0
AF_UTUN = 0x26
ALTWERASE = 0x200
+ ATTR_BIT_MAP_COUNT = 0x5
+ ATTR_CMN_ACCESSMASK = 0x20000
+ ATTR_CMN_ACCTIME = 0x1000
+ ATTR_CMN_ADDEDTIME = 0x10000000
+ ATTR_CMN_BKUPTIME = 0x2000
+ ATTR_CMN_CHGTIME = 0x800
+ ATTR_CMN_CRTIME = 0x200
+ ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000
+ ATTR_CMN_DEVID = 0x2
+ ATTR_CMN_DOCUMENT_ID = 0x100000
+ ATTR_CMN_ERROR = 0x20000000
+ ATTR_CMN_EXTENDED_SECURITY = 0x400000
+ ATTR_CMN_FILEID = 0x2000000
+ ATTR_CMN_FLAGS = 0x40000
+ ATTR_CMN_FNDRINFO = 0x4000
+ ATTR_CMN_FSID = 0x4
+ ATTR_CMN_FULLPATH = 0x8000000
+ ATTR_CMN_GEN_COUNT = 0x80000
+ ATTR_CMN_GRPID = 0x10000
+ ATTR_CMN_GRPUUID = 0x1000000
+ ATTR_CMN_MODTIME = 0x400
+ ATTR_CMN_NAME = 0x1
+ ATTR_CMN_NAMEDATTRCOUNT = 0x80000
+ ATTR_CMN_NAMEDATTRLIST = 0x100000
+ ATTR_CMN_OBJID = 0x20
+ ATTR_CMN_OBJPERMANENTID = 0x40
+ ATTR_CMN_OBJTAG = 0x10
+ ATTR_CMN_OBJTYPE = 0x8
+ ATTR_CMN_OWNERID = 0x8000
+ ATTR_CMN_PARENTID = 0x4000000
+ ATTR_CMN_PAROBJID = 0x80
+ ATTR_CMN_RETURNED_ATTRS = 0x80000000
+ ATTR_CMN_SCRIPT = 0x100
+ ATTR_CMN_SETMASK = 0x41c7ff00
+ ATTR_CMN_USERACCESS = 0x200000
+ ATTR_CMN_UUID = 0x800000
+ ATTR_CMN_VALIDMASK = 0xffffffff
+ ATTR_CMN_VOLSETMASK = 0x6700
+ ATTR_FILE_ALLOCSIZE = 0x4
+ ATTR_FILE_CLUMPSIZE = 0x10
+ ATTR_FILE_DATAALLOCSIZE = 0x400
+ ATTR_FILE_DATAEXTENTS = 0x800
+ ATTR_FILE_DATALENGTH = 0x200
+ ATTR_FILE_DEVTYPE = 0x20
+ ATTR_FILE_FILETYPE = 0x40
+ ATTR_FILE_FORKCOUNT = 0x80
+ ATTR_FILE_FORKLIST = 0x100
+ ATTR_FILE_IOBLOCKSIZE = 0x8
+ ATTR_FILE_LINKCOUNT = 0x1
+ ATTR_FILE_RSRCALLOCSIZE = 0x2000
+ ATTR_FILE_RSRCEXTENTS = 0x4000
+ ATTR_FILE_RSRCLENGTH = 0x1000
+ ATTR_FILE_SETMASK = 0x20
+ ATTR_FILE_TOTALSIZE = 0x2
+ ATTR_FILE_VALIDMASK = 0x37ff
+ ATTR_VOL_ALLOCATIONCLUMP = 0x40
+ ATTR_VOL_ATTRIBUTES = 0x40000000
+ ATTR_VOL_CAPABILITIES = 0x20000
+ ATTR_VOL_DIRCOUNT = 0x400
+ ATTR_VOL_ENCODINGSUSED = 0x10000
+ ATTR_VOL_FILECOUNT = 0x200
+ ATTR_VOL_FSTYPE = 0x1
+ ATTR_VOL_INFO = 0x80000000
+ ATTR_VOL_IOBLOCKSIZE = 0x80
+ ATTR_VOL_MAXOBJCOUNT = 0x800
+ ATTR_VOL_MINALLOCATION = 0x20
+ ATTR_VOL_MOUNTEDDEVICE = 0x8000
+ ATTR_VOL_MOUNTFLAGS = 0x4000
+ ATTR_VOL_MOUNTPOINT = 0x1000
+ ATTR_VOL_NAME = 0x2000
+ ATTR_VOL_OBJCOUNT = 0x100
+ ATTR_VOL_QUOTA_SIZE = 0x10000000
+ ATTR_VOL_RESERVED_SIZE = 0x20000000
+ ATTR_VOL_SETMASK = 0x80002000
+ ATTR_VOL_SIGNATURE = 0x2
+ ATTR_VOL_SIZE = 0x4
+ ATTR_VOL_SPACEAVAIL = 0x10
+ ATTR_VOL_SPACEFREE = 0x8
+ ATTR_VOL_UUID = 0x40000
+ ATTR_VOL_VALIDMASK = 0xf007ffff
B0 = 0x0
B110 = 0x6e
B115200 = 0x1c200
@@ -169,6 +249,8 @@ const (
CSTOP = 0x13
CSTOPB = 0x400
CSUSP = 0x1a
+ CTL_HW = 0x6
+ CTL_KERN = 0x1
CTL_MAXNAME = 0xc
CTL_NET = 0x4
DLT_A429 = 0xb8
@@ -390,6 +472,11 @@ const (
FF1 = 0x4000
FFDLY = 0x4000
FLUSHO = 0x800000
+ FSOPT_ATTR_CMN_EXTENDED = 0x20
+ FSOPT_NOFOLLOW = 0x1
+ FSOPT_NOINMEMUPDATE = 0x2
+ FSOPT_PACK_INVAL_ATTRS = 0x8
+ FSOPT_REPORT_FULLSIZE = 0x4
F_ADDFILESIGS = 0x3d
F_ADDFILESIGS_FOR_DYLD_SIM = 0x53
F_ADDFILESIGS_RETURN = 0x61
@@ -425,6 +512,7 @@ const (
F_PATHPKG_CHECK = 0x34
F_PEOFPOSMODE = 0x3
F_PREALLOCATE = 0x2a
+ F_PUNCHHOLE = 0x63
F_RDADVISE = 0x2c
F_RDAHEAD = 0x2d
F_RDLCK = 0x1
@@ -441,10 +529,12 @@ const (
F_SINGLE_WRITER = 0x4c
F_THAW_FS = 0x36
F_TRANSCODEKEY = 0x4b
+ F_TRIM_ACTIVE_FILE = 0x64
F_UNLCK = 0x2
F_VOLPOSMODE = 0x4
F_WRLCK = 0x3
HUPCL = 0x4000
+ HW_MACHINE = 0x1
ICANON = 0x100
ICMP6_FILTER = 0x12
ICRNL = 0x100
@@ -681,6 +771,7 @@ const (
IPV6_FAITH = 0x1d
IPV6_FLOWINFO_MASK = 0xffffff0f
IPV6_FLOWLABEL_MASK = 0xffff0f00
+ IPV6_FLOW_ECN_MASK = 0x300
IPV6_FRAGTTL = 0x3c
IPV6_FW_ADD = 0x1e
IPV6_FW_DEL = 0x1f
@@ -771,6 +862,7 @@ const (
IP_RECVOPTS = 0x5
IP_RECVPKTINFO = 0x1a
IP_RECVRETOPTS = 0x6
+ IP_RECVTOS = 0x1b
IP_RECVTTL = 0x18
IP_RETOPTS = 0x8
IP_RF = 0x8000
@@ -789,6 +881,10 @@ const (
IXANY = 0x800
IXOFF = 0x400
IXON = 0x200
+ KERN_HOSTNAME = 0xa
+ KERN_OSRELEASE = 0x2
+ KERN_OSTYPE = 0x1
+ KERN_VERSION = 0x4
LOCK_EX = 0x2
LOCK_NB = 0x4
LOCK_SH = 0x1
diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go
index 24cb522..fa135b1 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go
@@ -49,6 +49,86 @@ const (
AF_UNSPEC = 0x0
AF_UTUN = 0x26
ALTWERASE = 0x200
+ ATTR_BIT_MAP_COUNT = 0x5
+ ATTR_CMN_ACCESSMASK = 0x20000
+ ATTR_CMN_ACCTIME = 0x1000
+ ATTR_CMN_ADDEDTIME = 0x10000000
+ ATTR_CMN_BKUPTIME = 0x2000
+ ATTR_CMN_CHGTIME = 0x800
+ ATTR_CMN_CRTIME = 0x200
+ ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000
+ ATTR_CMN_DEVID = 0x2
+ ATTR_CMN_DOCUMENT_ID = 0x100000
+ ATTR_CMN_ERROR = 0x20000000
+ ATTR_CMN_EXTENDED_SECURITY = 0x400000
+ ATTR_CMN_FILEID = 0x2000000
+ ATTR_CMN_FLAGS = 0x40000
+ ATTR_CMN_FNDRINFO = 0x4000
+ ATTR_CMN_FSID = 0x4
+ ATTR_CMN_FULLPATH = 0x8000000
+ ATTR_CMN_GEN_COUNT = 0x80000
+ ATTR_CMN_GRPID = 0x10000
+ ATTR_CMN_GRPUUID = 0x1000000
+ ATTR_CMN_MODTIME = 0x400
+ ATTR_CMN_NAME = 0x1
+ ATTR_CMN_NAMEDATTRCOUNT = 0x80000
+ ATTR_CMN_NAMEDATTRLIST = 0x100000
+ ATTR_CMN_OBJID = 0x20
+ ATTR_CMN_OBJPERMANENTID = 0x40
+ ATTR_CMN_OBJTAG = 0x10
+ ATTR_CMN_OBJTYPE = 0x8
+ ATTR_CMN_OWNERID = 0x8000
+ ATTR_CMN_PARENTID = 0x4000000
+ ATTR_CMN_PAROBJID = 0x80
+ ATTR_CMN_RETURNED_ATTRS = 0x80000000
+ ATTR_CMN_SCRIPT = 0x100
+ ATTR_CMN_SETMASK = 0x41c7ff00
+ ATTR_CMN_USERACCESS = 0x200000
+ ATTR_CMN_UUID = 0x800000
+ ATTR_CMN_VALIDMASK = 0xffffffff
+ ATTR_CMN_VOLSETMASK = 0x6700
+ ATTR_FILE_ALLOCSIZE = 0x4
+ ATTR_FILE_CLUMPSIZE = 0x10
+ ATTR_FILE_DATAALLOCSIZE = 0x400
+ ATTR_FILE_DATAEXTENTS = 0x800
+ ATTR_FILE_DATALENGTH = 0x200
+ ATTR_FILE_DEVTYPE = 0x20
+ ATTR_FILE_FILETYPE = 0x40
+ ATTR_FILE_FORKCOUNT = 0x80
+ ATTR_FILE_FORKLIST = 0x100
+ ATTR_FILE_IOBLOCKSIZE = 0x8
+ ATTR_FILE_LINKCOUNT = 0x1
+ ATTR_FILE_RSRCALLOCSIZE = 0x2000
+ ATTR_FILE_RSRCEXTENTS = 0x4000
+ ATTR_FILE_RSRCLENGTH = 0x1000
+ ATTR_FILE_SETMASK = 0x20
+ ATTR_FILE_TOTALSIZE = 0x2
+ ATTR_FILE_VALIDMASK = 0x37ff
+ ATTR_VOL_ALLOCATIONCLUMP = 0x40
+ ATTR_VOL_ATTRIBUTES = 0x40000000
+ ATTR_VOL_CAPABILITIES = 0x20000
+ ATTR_VOL_DIRCOUNT = 0x400
+ ATTR_VOL_ENCODINGSUSED = 0x10000
+ ATTR_VOL_FILECOUNT = 0x200
+ ATTR_VOL_FSTYPE = 0x1
+ ATTR_VOL_INFO = 0x80000000
+ ATTR_VOL_IOBLOCKSIZE = 0x80
+ ATTR_VOL_MAXOBJCOUNT = 0x800
+ ATTR_VOL_MINALLOCATION = 0x20
+ ATTR_VOL_MOUNTEDDEVICE = 0x8000
+ ATTR_VOL_MOUNTFLAGS = 0x4000
+ ATTR_VOL_MOUNTPOINT = 0x1000
+ ATTR_VOL_NAME = 0x2000
+ ATTR_VOL_OBJCOUNT = 0x100
+ ATTR_VOL_QUOTA_SIZE = 0x10000000
+ ATTR_VOL_RESERVED_SIZE = 0x20000000
+ ATTR_VOL_SETMASK = 0x80002000
+ ATTR_VOL_SIGNATURE = 0x2
+ ATTR_VOL_SIZE = 0x4
+ ATTR_VOL_SPACEAVAIL = 0x10
+ ATTR_VOL_SPACEFREE = 0x8
+ ATTR_VOL_UUID = 0x40000
+ ATTR_VOL_VALIDMASK = 0xf007ffff
B0 = 0x0
B110 = 0x6e
B115200 = 0x1c200
@@ -169,6 +249,8 @@ const (
CSTOP = 0x13
CSTOPB = 0x400
CSUSP = 0x1a
+ CTL_HW = 0x6
+ CTL_KERN = 0x1
CTL_MAXNAME = 0xc
CTL_NET = 0x4
DLT_A429 = 0xb8
@@ -390,6 +472,11 @@ const (
FF1 = 0x4000
FFDLY = 0x4000
FLUSHO = 0x800000
+ FSOPT_ATTR_CMN_EXTENDED = 0x20
+ FSOPT_NOFOLLOW = 0x1
+ FSOPT_NOINMEMUPDATE = 0x2
+ FSOPT_PACK_INVAL_ATTRS = 0x8
+ FSOPT_REPORT_FULLSIZE = 0x4
F_ADDFILESIGS = 0x3d
F_ADDFILESIGS_FOR_DYLD_SIM = 0x53
F_ADDFILESIGS_RETURN = 0x61
@@ -425,6 +512,7 @@ const (
F_PATHPKG_CHECK = 0x34
F_PEOFPOSMODE = 0x3
F_PREALLOCATE = 0x2a
+ F_PUNCHHOLE = 0x63
F_RDADVISE = 0x2c
F_RDAHEAD = 0x2d
F_RDLCK = 0x1
@@ -441,10 +529,12 @@ const (
F_SINGLE_WRITER = 0x4c
F_THAW_FS = 0x36
F_TRANSCODEKEY = 0x4b
+ F_TRIM_ACTIVE_FILE = 0x64
F_UNLCK = 0x2
F_VOLPOSMODE = 0x4
F_WRLCK = 0x3
HUPCL = 0x4000
+ HW_MACHINE = 0x1
ICANON = 0x100
ICMP6_FILTER = 0x12
ICRNL = 0x100
@@ -681,6 +771,7 @@ const (
IPV6_FAITH = 0x1d
IPV6_FLOWINFO_MASK = 0xffffff0f
IPV6_FLOWLABEL_MASK = 0xffff0f00
+ IPV6_FLOW_ECN_MASK = 0x300
IPV6_FRAGTTL = 0x3c
IPV6_FW_ADD = 0x1e
IPV6_FW_DEL = 0x1f
@@ -771,6 +862,7 @@ const (
IP_RECVOPTS = 0x5
IP_RECVPKTINFO = 0x1a
IP_RECVRETOPTS = 0x6
+ IP_RECVTOS = 0x1b
IP_RECVTTL = 0x18
IP_RETOPTS = 0x8
IP_RF = 0x8000
@@ -789,6 +881,10 @@ const (
IXANY = 0x800
IXOFF = 0x400
IXON = 0x200
+ KERN_HOSTNAME = 0xa
+ KERN_OSRELEASE = 0x2
+ KERN_OSTYPE = 0x1
+ KERN_VERSION = 0x4
LOCK_EX = 0x2
LOCK_NB = 0x4
LOCK_SH = 0x1
diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go
index cc8cc5b..6419c65 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go
@@ -49,6 +49,86 @@ const (
AF_UNSPEC = 0x0
AF_UTUN = 0x26
ALTWERASE = 0x200
+ ATTR_BIT_MAP_COUNT = 0x5
+ ATTR_CMN_ACCESSMASK = 0x20000
+ ATTR_CMN_ACCTIME = 0x1000
+ ATTR_CMN_ADDEDTIME = 0x10000000
+ ATTR_CMN_BKUPTIME = 0x2000
+ ATTR_CMN_CHGTIME = 0x800
+ ATTR_CMN_CRTIME = 0x200
+ ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000
+ ATTR_CMN_DEVID = 0x2
+ ATTR_CMN_DOCUMENT_ID = 0x100000
+ ATTR_CMN_ERROR = 0x20000000
+ ATTR_CMN_EXTENDED_SECURITY = 0x400000
+ ATTR_CMN_FILEID = 0x2000000
+ ATTR_CMN_FLAGS = 0x40000
+ ATTR_CMN_FNDRINFO = 0x4000
+ ATTR_CMN_FSID = 0x4
+ ATTR_CMN_FULLPATH = 0x8000000
+ ATTR_CMN_GEN_COUNT = 0x80000
+ ATTR_CMN_GRPID = 0x10000
+ ATTR_CMN_GRPUUID = 0x1000000
+ ATTR_CMN_MODTIME = 0x400
+ ATTR_CMN_NAME = 0x1
+ ATTR_CMN_NAMEDATTRCOUNT = 0x80000
+ ATTR_CMN_NAMEDATTRLIST = 0x100000
+ ATTR_CMN_OBJID = 0x20
+ ATTR_CMN_OBJPERMANENTID = 0x40
+ ATTR_CMN_OBJTAG = 0x10
+ ATTR_CMN_OBJTYPE = 0x8
+ ATTR_CMN_OWNERID = 0x8000
+ ATTR_CMN_PARENTID = 0x4000000
+ ATTR_CMN_PAROBJID = 0x80
+ ATTR_CMN_RETURNED_ATTRS = 0x80000000
+ ATTR_CMN_SCRIPT = 0x100
+ ATTR_CMN_SETMASK = 0x41c7ff00
+ ATTR_CMN_USERACCESS = 0x200000
+ ATTR_CMN_UUID = 0x800000
+ ATTR_CMN_VALIDMASK = 0xffffffff
+ ATTR_CMN_VOLSETMASK = 0x6700
+ ATTR_FILE_ALLOCSIZE = 0x4
+ ATTR_FILE_CLUMPSIZE = 0x10
+ ATTR_FILE_DATAALLOCSIZE = 0x400
+ ATTR_FILE_DATAEXTENTS = 0x800
+ ATTR_FILE_DATALENGTH = 0x200
+ ATTR_FILE_DEVTYPE = 0x20
+ ATTR_FILE_FILETYPE = 0x40
+ ATTR_FILE_FORKCOUNT = 0x80
+ ATTR_FILE_FORKLIST = 0x100
+ ATTR_FILE_IOBLOCKSIZE = 0x8
+ ATTR_FILE_LINKCOUNT = 0x1
+ ATTR_FILE_RSRCALLOCSIZE = 0x2000
+ ATTR_FILE_RSRCEXTENTS = 0x4000
+ ATTR_FILE_RSRCLENGTH = 0x1000
+ ATTR_FILE_SETMASK = 0x20
+ ATTR_FILE_TOTALSIZE = 0x2
+ ATTR_FILE_VALIDMASK = 0x37ff
+ ATTR_VOL_ALLOCATIONCLUMP = 0x40
+ ATTR_VOL_ATTRIBUTES = 0x40000000
+ ATTR_VOL_CAPABILITIES = 0x20000
+ ATTR_VOL_DIRCOUNT = 0x400
+ ATTR_VOL_ENCODINGSUSED = 0x10000
+ ATTR_VOL_FILECOUNT = 0x200
+ ATTR_VOL_FSTYPE = 0x1
+ ATTR_VOL_INFO = 0x80000000
+ ATTR_VOL_IOBLOCKSIZE = 0x80
+ ATTR_VOL_MAXOBJCOUNT = 0x800
+ ATTR_VOL_MINALLOCATION = 0x20
+ ATTR_VOL_MOUNTEDDEVICE = 0x8000
+ ATTR_VOL_MOUNTFLAGS = 0x4000
+ ATTR_VOL_MOUNTPOINT = 0x1000
+ ATTR_VOL_NAME = 0x2000
+ ATTR_VOL_OBJCOUNT = 0x100
+ ATTR_VOL_QUOTA_SIZE = 0x10000000
+ ATTR_VOL_RESERVED_SIZE = 0x20000000
+ ATTR_VOL_SETMASK = 0x80002000
+ ATTR_VOL_SIGNATURE = 0x2
+ ATTR_VOL_SIZE = 0x4
+ ATTR_VOL_SPACEAVAIL = 0x10
+ ATTR_VOL_SPACEFREE = 0x8
+ ATTR_VOL_UUID = 0x40000
+ ATTR_VOL_VALIDMASK = 0xf007ffff
B0 = 0x0
B110 = 0x6e
B115200 = 0x1c200
@@ -169,6 +249,8 @@ const (
CSTOP = 0x13
CSTOPB = 0x400
CSUSP = 0x1a
+ CTL_HW = 0x6
+ CTL_KERN = 0x1
CTL_MAXNAME = 0xc
CTL_NET = 0x4
DLT_A429 = 0xb8
@@ -390,6 +472,11 @@ const (
FF1 = 0x4000
FFDLY = 0x4000
FLUSHO = 0x800000
+ FSOPT_ATTR_CMN_EXTENDED = 0x20
+ FSOPT_NOFOLLOW = 0x1
+ FSOPT_NOINMEMUPDATE = 0x2
+ FSOPT_PACK_INVAL_ATTRS = 0x8
+ FSOPT_REPORT_FULLSIZE = 0x4
F_ADDFILESIGS = 0x3d
F_ADDFILESIGS_FOR_DYLD_SIM = 0x53
F_ADDFILESIGS_RETURN = 0x61
@@ -425,6 +512,7 @@ const (
F_PATHPKG_CHECK = 0x34
F_PEOFPOSMODE = 0x3
F_PREALLOCATE = 0x2a
+ F_PUNCHHOLE = 0x63
F_RDADVISE = 0x2c
F_RDAHEAD = 0x2d
F_RDLCK = 0x1
@@ -441,10 +529,12 @@ const (
F_SINGLE_WRITER = 0x4c
F_THAW_FS = 0x36
F_TRANSCODEKEY = 0x4b
+ F_TRIM_ACTIVE_FILE = 0x64
F_UNLCK = 0x2
F_VOLPOSMODE = 0x4
F_WRLCK = 0x3
HUPCL = 0x4000
+ HW_MACHINE = 0x1
ICANON = 0x100
ICMP6_FILTER = 0x12
ICRNL = 0x100
@@ -681,6 +771,7 @@ const (
IPV6_FAITH = 0x1d
IPV6_FLOWINFO_MASK = 0xffffff0f
IPV6_FLOWLABEL_MASK = 0xffff0f00
+ IPV6_FLOW_ECN_MASK = 0x300
IPV6_FRAGTTL = 0x3c
IPV6_FW_ADD = 0x1e
IPV6_FW_DEL = 0x1f
@@ -771,6 +862,7 @@ const (
IP_RECVOPTS = 0x5
IP_RECVPKTINFO = 0x1a
IP_RECVRETOPTS = 0x6
+ IP_RECVTOS = 0x1b
IP_RECVTTL = 0x18
IP_RETOPTS = 0x8
IP_RF = 0x8000
@@ -789,6 +881,10 @@ const (
IXANY = 0x800
IXOFF = 0x400
IXON = 0x200
+ KERN_HOSTNAME = 0xa
+ KERN_OSRELEASE = 0x2
+ KERN_OSTYPE = 0x1
+ KERN_VERSION = 0x4
LOCK_EX = 0x2
LOCK_NB = 0x4
LOCK_SH = 0x1
diff --git a/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go
index 8f40598..d960155 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go
@@ -168,6 +168,8 @@ const (
CSTOP = 0x13
CSTOPB = 0x400
CSUSP = 0x1a
+ CTL_HW = 0x6
+ CTL_KERN = 0x1
CTL_MAXNAME = 0xc
CTL_NET = 0x4
DLT_A429 = 0xb8
@@ -353,6 +355,7 @@ const (
F_UNLCK = 0x2
F_WRLCK = 0x3
HUPCL = 0x4000
+ HW_MACHINE = 0x1
ICANON = 0x100
ICMP6_FILTER = 0x12
ICRNL = 0x100
@@ -835,6 +838,10 @@ const (
IXANY = 0x800
IXOFF = 0x400
IXON = 0x200
+ KERN_HOSTNAME = 0xa
+ KERN_OSRELEASE = 0x2
+ KERN_OSTYPE = 0x1
+ KERN_VERSION = 0x4
LOCK_EX = 0x2
LOCK_NB = 0x4
LOCK_SH = 0x1
diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go
index 1d3eec4..a8b0587 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go
@@ -351,6 +351,8 @@ const (
CSTOP = 0x13
CSTOPB = 0x400
CSUSP = 0x1a
+ CTL_HW = 0x6
+ CTL_KERN = 0x1
CTL_MAXNAME = 0x18
CTL_NET = 0x4
DLT_A429 = 0xb8
@@ -608,6 +610,7 @@ const (
F_UNLCKSYS = 0x4
F_WRLCK = 0x3
HUPCL = 0x4000
+ HW_MACHINE = 0x1
ICANON = 0x100
ICMP6_FILTER = 0x12
ICRNL = 0x100
@@ -944,6 +947,10 @@ const (
IXANY = 0x800
IXOFF = 0x400
IXON = 0x200
+ KERN_HOSTNAME = 0xa
+ KERN_OSRELEASE = 0x2
+ KERN_OSTYPE = 0x1
+ KERN_VERSION = 0x4
LOCK_EX = 0x2
LOCK_NB = 0x4
LOCK_SH = 0x1
@@ -981,6 +988,49 @@ const (
MAP_STACK = 0x400
MCL_CURRENT = 0x1
MCL_FUTURE = 0x2
+ MNT_ACLS = 0x8000000
+ MNT_ASYNC = 0x40
+ MNT_AUTOMOUNTED = 0x200000000
+ MNT_BYFSID = 0x8000000
+ MNT_CMDFLAGS = 0xd0f0000
+ MNT_DEFEXPORTED = 0x200
+ MNT_DELEXPORT = 0x20000
+ MNT_EXKERB = 0x800
+ MNT_EXPORTANON = 0x400
+ MNT_EXPORTED = 0x100
+ MNT_EXPUBLIC = 0x20000000
+ MNT_EXRDONLY = 0x80
+ MNT_FORCE = 0x80000
+ MNT_GJOURNAL = 0x2000000
+ MNT_IGNORE = 0x800000
+ MNT_LAZY = 0x3
+ MNT_LOCAL = 0x1000
+ MNT_MULTILABEL = 0x4000000
+ MNT_NFS4ACLS = 0x10
+ MNT_NOATIME = 0x10000000
+ MNT_NOCLUSTERR = 0x40000000
+ MNT_NOCLUSTERW = 0x80000000
+ MNT_NOEXEC = 0x4
+ MNT_NONBUSY = 0x4000000
+ MNT_NOSUID = 0x8
+ MNT_NOSYMFOLLOW = 0x400000
+ MNT_NOWAIT = 0x2
+ MNT_QUOTA = 0x2000
+ MNT_RDONLY = 0x1
+ MNT_RELOAD = 0x40000
+ MNT_ROOTFS = 0x4000
+ MNT_SNAPSHOT = 0x1000000
+ MNT_SOFTDEP = 0x200000
+ MNT_SUIDDIR = 0x100000
+ MNT_SUJ = 0x100000000
+ MNT_SUSPEND = 0x4
+ MNT_SYNCHRONOUS = 0x2
+ MNT_UNION = 0x20
+ MNT_UPDATE = 0x10000
+ MNT_UPDATEMASK = 0x2d8d0807e
+ MNT_USER = 0x8000
+ MNT_VISFLAGMASK = 0x3fef0ffff
+ MNT_WAIT = 0x1
MSG_CMSG_CLOEXEC = 0x40000
MSG_COMPAT = 0x8000
MSG_CTRUNC = 0x20
diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go
index ac094f9..cf5f012 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go
@@ -351,6 +351,8 @@ const (
CSTOP = 0x13
CSTOPB = 0x400
CSUSP = 0x1a
+ CTL_HW = 0x6
+ CTL_KERN = 0x1
CTL_MAXNAME = 0x18
CTL_NET = 0x4
DLT_A429 = 0xb8
@@ -608,6 +610,7 @@ const (
F_UNLCKSYS = 0x4
F_WRLCK = 0x3
HUPCL = 0x4000
+ HW_MACHINE = 0x1
ICANON = 0x100
ICMP6_FILTER = 0x12
ICRNL = 0x100
@@ -944,6 +947,10 @@ const (
IXANY = 0x800
IXOFF = 0x400
IXON = 0x200
+ KERN_HOSTNAME = 0xa
+ KERN_OSRELEASE = 0x2
+ KERN_OSTYPE = 0x1
+ KERN_VERSION = 0x4
LOCK_EX = 0x2
LOCK_NB = 0x4
LOCK_SH = 0x1
@@ -982,6 +989,49 @@ const (
MAP_STACK = 0x400
MCL_CURRENT = 0x1
MCL_FUTURE = 0x2
+ MNT_ACLS = 0x8000000
+ MNT_ASYNC = 0x40
+ MNT_AUTOMOUNTED = 0x200000000
+ MNT_BYFSID = 0x8000000
+ MNT_CMDFLAGS = 0xd0f0000
+ MNT_DEFEXPORTED = 0x200
+ MNT_DELEXPORT = 0x20000
+ MNT_EXKERB = 0x800
+ MNT_EXPORTANON = 0x400
+ MNT_EXPORTED = 0x100
+ MNT_EXPUBLIC = 0x20000000
+ MNT_EXRDONLY = 0x80
+ MNT_FORCE = 0x80000
+ MNT_GJOURNAL = 0x2000000
+ MNT_IGNORE = 0x800000
+ MNT_LAZY = 0x3
+ MNT_LOCAL = 0x1000
+ MNT_MULTILABEL = 0x4000000
+ MNT_NFS4ACLS = 0x10
+ MNT_NOATIME = 0x10000000
+ MNT_NOCLUSTERR = 0x40000000
+ MNT_NOCLUSTERW = 0x80000000
+ MNT_NOEXEC = 0x4
+ MNT_NONBUSY = 0x4000000
+ MNT_NOSUID = 0x8
+ MNT_NOSYMFOLLOW = 0x400000
+ MNT_NOWAIT = 0x2
+ MNT_QUOTA = 0x2000
+ MNT_RDONLY = 0x1
+ MNT_RELOAD = 0x40000
+ MNT_ROOTFS = 0x4000
+ MNT_SNAPSHOT = 0x1000000
+ MNT_SOFTDEP = 0x200000
+ MNT_SUIDDIR = 0x100000
+ MNT_SUJ = 0x100000000
+ MNT_SUSPEND = 0x4
+ MNT_SYNCHRONOUS = 0x2
+ MNT_UNION = 0x20
+ MNT_UPDATE = 0x10000
+ MNT_UPDATEMASK = 0x2d8d0807e
+ MNT_USER = 0x8000
+ MNT_VISFLAGMASK = 0x3fef0ffff
+ MNT_WAIT = 0x1
MSG_CMSG_CLOEXEC = 0x40000
MSG_COMPAT = 0x8000
MSG_CTRUNC = 0x20
diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go
index c5c6f13..9bbb90a 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go
@@ -351,6 +351,8 @@ const (
CSTOP = 0x13
CSTOPB = 0x400
CSUSP = 0x1a
+ CTL_HW = 0x6
+ CTL_KERN = 0x1
CTL_MAXNAME = 0x18
CTL_NET = 0x4
DLT_A429 = 0xb8
@@ -615,6 +617,7 @@ const (
F_UNLCKSYS = 0x4
F_WRLCK = 0x3
HUPCL = 0x4000
+ HW_MACHINE = 0x1
ICANON = 0x100
ICMP6_FILTER = 0x12
ICRNL = 0x100
@@ -951,6 +954,10 @@ const (
IXANY = 0x800
IXOFF = 0x400
IXON = 0x200
+ KERN_HOSTNAME = 0xa
+ KERN_OSRELEASE = 0x2
+ KERN_OSTYPE = 0x1
+ KERN_VERSION = 0x4
LOCK_EX = 0x2
LOCK_NB = 0x4
LOCK_SH = 0x1
@@ -989,6 +996,49 @@ const (
MAP_STACK = 0x400
MCL_CURRENT = 0x1
MCL_FUTURE = 0x2
+ MNT_ACLS = 0x8000000
+ MNT_ASYNC = 0x40
+ MNT_AUTOMOUNTED = 0x200000000
+ MNT_BYFSID = 0x8000000
+ MNT_CMDFLAGS = 0xd0f0000
+ MNT_DEFEXPORTED = 0x200
+ MNT_DELEXPORT = 0x20000
+ MNT_EXKERB = 0x800
+ MNT_EXPORTANON = 0x400
+ MNT_EXPORTED = 0x100
+ MNT_EXPUBLIC = 0x20000000
+ MNT_EXRDONLY = 0x80
+ MNT_FORCE = 0x80000
+ MNT_GJOURNAL = 0x2000000
+ MNT_IGNORE = 0x800000
+ MNT_LAZY = 0x3
+ MNT_LOCAL = 0x1000
+ MNT_MULTILABEL = 0x4000000
+ MNT_NFS4ACLS = 0x10
+ MNT_NOATIME = 0x10000000
+ MNT_NOCLUSTERR = 0x40000000
+ MNT_NOCLUSTERW = 0x80000000
+ MNT_NOEXEC = 0x4
+ MNT_NONBUSY = 0x4000000
+ MNT_NOSUID = 0x8
+ MNT_NOSYMFOLLOW = 0x400000
+ MNT_NOWAIT = 0x2
+ MNT_QUOTA = 0x2000
+ MNT_RDONLY = 0x1
+ MNT_RELOAD = 0x40000
+ MNT_ROOTFS = 0x4000
+ MNT_SNAPSHOT = 0x1000000
+ MNT_SOFTDEP = 0x200000
+ MNT_SUIDDIR = 0x100000
+ MNT_SUJ = 0x100000000
+ MNT_SUSPEND = 0x4
+ MNT_SYNCHRONOUS = 0x2
+ MNT_UNION = 0x20
+ MNT_UPDATE = 0x10000
+ MNT_UPDATEMASK = 0x2d8d0807e
+ MNT_USER = 0x8000
+ MNT_VISFLAGMASK = 0x3fef0ffff
+ MNT_WAIT = 0x1
MSG_CMSG_CLOEXEC = 0x40000
MSG_COMPAT = 0x8000
MSG_CTRUNC = 0x20
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go
index 4066ad1..8947248 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go
@@ -623,6 +623,7 @@ const (
IN_OPEN = 0x20
IN_Q_OVERFLOW = 0x4000
IN_UNMOUNT = 0x2000
+ IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9
IPPROTO_AH = 0x33
IPPROTO_BEETPH = 0x5e
IPPROTO_COMP = 0x6c
@@ -1277,7 +1278,7 @@ const (
RLIMIT_RTTIME = 0xf
RLIMIT_SIGPENDING = 0xb
RLIMIT_STACK = 0x3
- RLIM_INFINITY = -0x1
+ RLIM_INFINITY = 0xffffffffffffffff
RTAX_ADVMSS = 0x8
RTAX_CC_ALGO = 0x10
RTAX_CWND = 0x7
@@ -1842,6 +1843,8 @@ const (
TUNSETVNETHDRSZ = 0x400454d8
TUNSETVNETLE = 0x400454dc
UMOUNT_NOFOLLOW = 0x8
+ UTIME_NOW = 0x3fffffff
+ UTIME_OMIT = 0x3ffffffe
VDISCARD = 0xd
VEOF = 0x4
VEOL = 0xb
@@ -1871,6 +1874,17 @@ const (
WALL = 0x40000000
WCLONE = 0x80000000
WCONTINUED = 0x8
+ WDIOC_GETBOOTSTATUS = 0x80045702
+ WDIOC_GETPRETIMEOUT = 0x80045709
+ WDIOC_GETSTATUS = 0x80045701
+ WDIOC_GETSUPPORT = 0x80285700
+ WDIOC_GETTEMP = 0x80045703
+ WDIOC_GETTIMELEFT = 0x8004570a
+ WDIOC_GETTIMEOUT = 0x80045707
+ WDIOC_KEEPALIVE = 0x80045705
+ WDIOC_SETOPTIONS = 0x80045704
+ WDIOC_SETPRETIMEOUT = 0xc0045708
+ WDIOC_SETTIMEOUT = 0xc0045706
WEXITED = 0x4
WNOHANG = 0x1
WNOTHREAD = 0x20000000
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go
index c9f53b0..4083cb2 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go
@@ -623,6 +623,7 @@ const (
IN_OPEN = 0x20
IN_Q_OVERFLOW = 0x4000
IN_UNMOUNT = 0x2000
+ IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9
IPPROTO_AH = 0x33
IPPROTO_BEETPH = 0x5e
IPPROTO_COMP = 0x6c
@@ -1187,7 +1188,7 @@ const (
PR_SET_NO_NEW_PRIVS = 0x26
PR_SET_PDEATHSIG = 0x1
PR_SET_PTRACER = 0x59616d61
- PR_SET_PTRACER_ANY = -0x1
+ PR_SET_PTRACER_ANY = 0xffffffffffffffff
PR_SET_SECCOMP = 0x16
PR_SET_SECUREBITS = 0x1c
PR_SET_THP_DISABLE = 0x29
@@ -1278,7 +1279,7 @@ const (
RLIMIT_RTTIME = 0xf
RLIMIT_SIGPENDING = 0xb
RLIMIT_STACK = 0x3
- RLIM_INFINITY = -0x1
+ RLIM_INFINITY = 0xffffffffffffffff
RTAX_ADVMSS = 0x8
RTAX_CC_ALGO = 0x10
RTAX_CWND = 0x7
@@ -1843,6 +1844,8 @@ const (
TUNSETVNETHDRSZ = 0x400454d8
TUNSETVNETLE = 0x400454dc
UMOUNT_NOFOLLOW = 0x8
+ UTIME_NOW = 0x3fffffff
+ UTIME_OMIT = 0x3ffffffe
VDISCARD = 0xd
VEOF = 0x4
VEOL = 0xb
@@ -1872,6 +1875,17 @@ const (
WALL = 0x40000000
WCLONE = 0x80000000
WCONTINUED = 0x8
+ WDIOC_GETBOOTSTATUS = 0x80045702
+ WDIOC_GETPRETIMEOUT = 0x80045709
+ WDIOC_GETSTATUS = 0x80045701
+ WDIOC_GETSUPPORT = 0x80285700
+ WDIOC_GETTEMP = 0x80045703
+ WDIOC_GETTIMELEFT = 0x8004570a
+ WDIOC_GETTIMEOUT = 0x80045707
+ WDIOC_KEEPALIVE = 0x80045705
+ WDIOC_SETOPTIONS = 0x80045704
+ WDIOC_SETPRETIMEOUT = 0xc0045708
+ WDIOC_SETTIMEOUT = 0xc0045706
WEXITED = 0x4
WNOHANG = 0x1
WNOTHREAD = 0x20000000
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go
index 3e8c2c7..27d3835 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go
@@ -623,6 +623,7 @@ const (
IN_OPEN = 0x20
IN_Q_OVERFLOW = 0x4000
IN_UNMOUNT = 0x2000
+ IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9
IPPROTO_AH = 0x33
IPPROTO_BEETPH = 0x5e
IPPROTO_COMP = 0x6c
@@ -1282,7 +1283,7 @@ const (
RLIMIT_RTTIME = 0xf
RLIMIT_SIGPENDING = 0xb
RLIMIT_STACK = 0x3
- RLIM_INFINITY = -0x1
+ RLIM_INFINITY = 0xffffffffffffffff
RTAX_ADVMSS = 0x8
RTAX_CC_ALGO = 0x10
RTAX_CWND = 0x7
@@ -1847,6 +1848,8 @@ const (
TUNSETVNETHDRSZ = 0x400454d8
TUNSETVNETLE = 0x400454dc
UMOUNT_NOFOLLOW = 0x8
+ UTIME_NOW = 0x3fffffff
+ UTIME_OMIT = 0x3ffffffe
VDISCARD = 0xd
VEOF = 0x4
VEOL = 0xb
@@ -1876,6 +1879,17 @@ const (
WALL = 0x40000000
WCLONE = 0x80000000
WCONTINUED = 0x8
+ WDIOC_GETBOOTSTATUS = 0x80045702
+ WDIOC_GETPRETIMEOUT = 0x80045709
+ WDIOC_GETSTATUS = 0x80045701
+ WDIOC_GETSUPPORT = 0x80285700
+ WDIOC_GETTEMP = 0x80045703
+ WDIOC_GETTIMELEFT = 0x8004570a
+ WDIOC_GETTIMEOUT = 0x80045707
+ WDIOC_KEEPALIVE = 0x80045705
+ WDIOC_SETOPTIONS = 0x80045704
+ WDIOC_SETPRETIMEOUT = 0xc0045708
+ WDIOC_SETTIMEOUT = 0xc0045706
WEXITED = 0x4
WNOHANG = 0x1
WNOTHREAD = 0x20000000
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go
index 3834533..69ad314 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go
@@ -625,6 +625,7 @@ const (
IN_OPEN = 0x20
IN_Q_OVERFLOW = 0x4000
IN_UNMOUNT = 0x2000
+ IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9
IPPROTO_AH = 0x33
IPPROTO_BEETPH = 0x5e
IPPROTO_COMP = 0x6c
@@ -1188,7 +1189,7 @@ const (
PR_SET_NO_NEW_PRIVS = 0x26
PR_SET_PDEATHSIG = 0x1
PR_SET_PTRACER = 0x59616d61
- PR_SET_PTRACER_ANY = -0x1
+ PR_SET_PTRACER_ANY = 0xffffffffffffffff
PR_SET_SECCOMP = 0x16
PR_SET_SECUREBITS = 0x1c
PR_SET_THP_DISABLE = 0x29
@@ -1268,7 +1269,7 @@ const (
RLIMIT_RTTIME = 0xf
RLIMIT_SIGPENDING = 0xb
RLIMIT_STACK = 0x3
- RLIM_INFINITY = -0x1
+ RLIM_INFINITY = 0xffffffffffffffff
RTAX_ADVMSS = 0x8
RTAX_CC_ALGO = 0x10
RTAX_CWND = 0x7
@@ -1833,6 +1834,8 @@ const (
TUNSETVNETHDRSZ = 0x400454d8
TUNSETVNETLE = 0x400454dc
UMOUNT_NOFOLLOW = 0x8
+ UTIME_NOW = 0x3fffffff
+ UTIME_OMIT = 0x3ffffffe
VDISCARD = 0xd
VEOF = 0x4
VEOL = 0xb
@@ -1862,6 +1865,17 @@ const (
WALL = 0x40000000
WCLONE = 0x80000000
WCONTINUED = 0x8
+ WDIOC_GETBOOTSTATUS = 0x80045702
+ WDIOC_GETPRETIMEOUT = 0x80045709
+ WDIOC_GETSTATUS = 0x80045701
+ WDIOC_GETSUPPORT = 0x80285700
+ WDIOC_GETTEMP = 0x80045703
+ WDIOC_GETTIMELEFT = 0x8004570a
+ WDIOC_GETTIMEOUT = 0x80045707
+ WDIOC_KEEPALIVE = 0x80045705
+ WDIOC_SETOPTIONS = 0x80045704
+ WDIOC_SETPRETIMEOUT = 0xc0045708
+ WDIOC_SETTIMEOUT = 0xc0045706
WEXITED = 0x4
WNOHANG = 0x1
WNOTHREAD = 0x20000000
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go
index bde8f7d..d131a4c 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go
@@ -623,6 +623,7 @@ const (
IN_OPEN = 0x20
IN_Q_OVERFLOW = 0x4000
IN_UNMOUNT = 0x2000
+ IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9
IPPROTO_AH = 0x33
IPPROTO_BEETPH = 0x5e
IPPROTO_COMP = 0x6c
@@ -1279,7 +1280,7 @@ const (
RLIMIT_RTTIME = 0xf
RLIMIT_SIGPENDING = 0xb
RLIMIT_STACK = 0x3
- RLIM_INFINITY = -0x1
+ RLIM_INFINITY = 0xffffffffffffffff
RTAX_ADVMSS = 0x8
RTAX_CC_ALGO = 0x10
RTAX_CWND = 0x7
@@ -1846,6 +1847,8 @@ const (
TUNSETVNETHDRSZ = 0x800454d8
TUNSETVNETLE = 0x800454dc
UMOUNT_NOFOLLOW = 0x8
+ UTIME_NOW = 0x3fffffff
+ UTIME_OMIT = 0x3ffffffe
VDISCARD = 0xd
VEOF = 0x10
VEOL = 0x11
@@ -1876,6 +1879,17 @@ const (
WALL = 0x40000000
WCLONE = 0x80000000
WCONTINUED = 0x8
+ WDIOC_GETBOOTSTATUS = 0x40045702
+ WDIOC_GETPRETIMEOUT = 0x40045709
+ WDIOC_GETSTATUS = 0x40045701
+ WDIOC_GETSUPPORT = 0x40285700
+ WDIOC_GETTEMP = 0x40045703
+ WDIOC_GETTIMELEFT = 0x4004570a
+ WDIOC_GETTIMEOUT = 0x40045707
+ WDIOC_KEEPALIVE = 0x40045705
+ WDIOC_SETOPTIONS = 0x40045704
+ WDIOC_SETPRETIMEOUT = 0xc0045708
+ WDIOC_SETTIMEOUT = 0xc0045706
WEXITED = 0x4
WNOHANG = 0x1
WNOTHREAD = 0x20000000
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go
index 42b6397..62dd203 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go
@@ -623,6 +623,7 @@ const (
IN_OPEN = 0x20
IN_Q_OVERFLOW = 0x4000
IN_UNMOUNT = 0x2000
+ IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9
IPPROTO_AH = 0x33
IPPROTO_BEETPH = 0x5e
IPPROTO_COMP = 0x6c
@@ -1187,7 +1188,7 @@ const (
PR_SET_NO_NEW_PRIVS = 0x26
PR_SET_PDEATHSIG = 0x1
PR_SET_PTRACER = 0x59616d61
- PR_SET_PTRACER_ANY = -0x1
+ PR_SET_PTRACER_ANY = 0xffffffffffffffff
PR_SET_SECCOMP = 0x16
PR_SET_SECUREBITS = 0x1c
PR_SET_THP_DISABLE = 0x29
@@ -1279,7 +1280,7 @@ const (
RLIMIT_RTTIME = 0xf
RLIMIT_SIGPENDING = 0xb
RLIMIT_STACK = 0x3
- RLIM_INFINITY = -0x1
+ RLIM_INFINITY = 0xffffffffffffffff
RTAX_ADVMSS = 0x8
RTAX_CC_ALGO = 0x10
RTAX_CWND = 0x7
@@ -1846,6 +1847,8 @@ const (
TUNSETVNETHDRSZ = 0x800454d8
TUNSETVNETLE = 0x800454dc
UMOUNT_NOFOLLOW = 0x8
+ UTIME_NOW = 0x3fffffff
+ UTIME_OMIT = 0x3ffffffe
VDISCARD = 0xd
VEOF = 0x10
VEOL = 0x11
@@ -1876,6 +1879,17 @@ const (
WALL = 0x40000000
WCLONE = 0x80000000
WCONTINUED = 0x8
+ WDIOC_GETBOOTSTATUS = 0x40045702
+ WDIOC_GETPRETIMEOUT = 0x40045709
+ WDIOC_GETSTATUS = 0x40045701
+ WDIOC_GETSUPPORT = 0x40285700
+ WDIOC_GETTEMP = 0x40045703
+ WDIOC_GETTIMELEFT = 0x4004570a
+ WDIOC_GETTIMEOUT = 0x40045707
+ WDIOC_KEEPALIVE = 0x40045705
+ WDIOC_SETOPTIONS = 0x40045704
+ WDIOC_SETPRETIMEOUT = 0xc0045708
+ WDIOC_SETTIMEOUT = 0xc0045706
WEXITED = 0x4
WNOHANG = 0x1
WNOTHREAD = 0x20000000
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go
index bd4ff81..dc8e56e 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go
@@ -623,6 +623,7 @@ const (
IN_OPEN = 0x20
IN_Q_OVERFLOW = 0x4000
IN_UNMOUNT = 0x2000
+ IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9
IPPROTO_AH = 0x33
IPPROTO_BEETPH = 0x5e
IPPROTO_COMP = 0x6c
@@ -1187,7 +1188,7 @@ const (
PR_SET_NO_NEW_PRIVS = 0x26
PR_SET_PDEATHSIG = 0x1
PR_SET_PTRACER = 0x59616d61
- PR_SET_PTRACER_ANY = -0x1
+ PR_SET_PTRACER_ANY = 0xffffffffffffffff
PR_SET_SECCOMP = 0x16
PR_SET_SECUREBITS = 0x1c
PR_SET_THP_DISABLE = 0x29
@@ -1279,7 +1280,7 @@ const (
RLIMIT_RTTIME = 0xf
RLIMIT_SIGPENDING = 0xb
RLIMIT_STACK = 0x3
- RLIM_INFINITY = -0x1
+ RLIM_INFINITY = 0xffffffffffffffff
RTAX_ADVMSS = 0x8
RTAX_CC_ALGO = 0x10
RTAX_CWND = 0x7
@@ -1846,6 +1847,8 @@ const (
TUNSETVNETHDRSZ = 0x800454d8
TUNSETVNETLE = 0x800454dc
UMOUNT_NOFOLLOW = 0x8
+ UTIME_NOW = 0x3fffffff
+ UTIME_OMIT = 0x3ffffffe
VDISCARD = 0xd
VEOF = 0x10
VEOL = 0x11
@@ -1876,6 +1879,17 @@ const (
WALL = 0x40000000
WCLONE = 0x80000000
WCONTINUED = 0x8
+ WDIOC_GETBOOTSTATUS = 0x40045702
+ WDIOC_GETPRETIMEOUT = 0x40045709
+ WDIOC_GETSTATUS = 0x40045701
+ WDIOC_GETSUPPORT = 0x40285700
+ WDIOC_GETTEMP = 0x40045703
+ WDIOC_GETTIMELEFT = 0x4004570a
+ WDIOC_GETTIMEOUT = 0x40045707
+ WDIOC_KEEPALIVE = 0x40045705
+ WDIOC_SETOPTIONS = 0x40045704
+ WDIOC_SETPRETIMEOUT = 0xc0045708
+ WDIOC_SETTIMEOUT = 0xc0045706
WEXITED = 0x4
WNOHANG = 0x1
WNOTHREAD = 0x20000000
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go
index 6dfc95c..9067662 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go
@@ -623,6 +623,7 @@ const (
IN_OPEN = 0x20
IN_Q_OVERFLOW = 0x4000
IN_UNMOUNT = 0x2000
+ IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9
IPPROTO_AH = 0x33
IPPROTO_BEETPH = 0x5e
IPPROTO_COMP = 0x6c
@@ -1279,7 +1280,7 @@ const (
RLIMIT_RTTIME = 0xf
RLIMIT_SIGPENDING = 0xb
RLIMIT_STACK = 0x3
- RLIM_INFINITY = -0x1
+ RLIM_INFINITY = 0xffffffffffffffff
RTAX_ADVMSS = 0x8
RTAX_CC_ALGO = 0x10
RTAX_CWND = 0x7
@@ -1846,6 +1847,8 @@ const (
TUNSETVNETHDRSZ = 0x800454d8
TUNSETVNETLE = 0x800454dc
UMOUNT_NOFOLLOW = 0x8
+ UTIME_NOW = 0x3fffffff
+ UTIME_OMIT = 0x3ffffffe
VDISCARD = 0xd
VEOF = 0x10
VEOL = 0x11
@@ -1876,6 +1879,17 @@ const (
WALL = 0x40000000
WCLONE = 0x80000000
WCONTINUED = 0x8
+ WDIOC_GETBOOTSTATUS = 0x40045702
+ WDIOC_GETPRETIMEOUT = 0x40045709
+ WDIOC_GETSTATUS = 0x40045701
+ WDIOC_GETSUPPORT = 0x40285700
+ WDIOC_GETTEMP = 0x40045703
+ WDIOC_GETTIMELEFT = 0x4004570a
+ WDIOC_GETTIMEOUT = 0x40045707
+ WDIOC_KEEPALIVE = 0x40045705
+ WDIOC_SETOPTIONS = 0x40045704
+ WDIOC_SETPRETIMEOUT = 0xc0045708
+ WDIOC_SETTIMEOUT = 0xc0045706
WEXITED = 0x4
WNOHANG = 0x1
WNOTHREAD = 0x20000000
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go
index 46b09d3..f6ca82c 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go
@@ -623,6 +623,7 @@ const (
IN_OPEN = 0x20
IN_Q_OVERFLOW = 0x4000
IN_UNMOUNT = 0x2000
+ IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9
IPPROTO_AH = 0x33
IPPROTO_BEETPH = 0x5e
IPPROTO_COMP = 0x6c
@@ -1189,7 +1190,7 @@ const (
PR_SET_NO_NEW_PRIVS = 0x26
PR_SET_PDEATHSIG = 0x1
PR_SET_PTRACER = 0x59616d61
- PR_SET_PTRACER_ANY = -0x1
+ PR_SET_PTRACER_ANY = 0xffffffffffffffff
PR_SET_SECCOMP = 0x16
PR_SET_SECUREBITS = 0x1c
PR_SET_THP_DISABLE = 0x29
@@ -1335,7 +1336,7 @@ const (
RLIMIT_RTTIME = 0xf
RLIMIT_SIGPENDING = 0xb
RLIMIT_STACK = 0x3
- RLIM_INFINITY = -0x1
+ RLIM_INFINITY = 0xffffffffffffffff
RTAX_ADVMSS = 0x8
RTAX_CC_ALGO = 0x10
RTAX_CWND = 0x7
@@ -1904,6 +1905,8 @@ const (
TUNSETVNETHDRSZ = 0x800454d8
TUNSETVNETLE = 0x800454dc
UMOUNT_NOFOLLOW = 0x8
+ UTIME_NOW = 0x3fffffff
+ UTIME_OMIT = 0x3ffffffe
VDISCARD = 0x10
VEOF = 0x4
VEOL = 0x6
@@ -1933,6 +1936,17 @@ const (
WALL = 0x40000000
WCLONE = 0x80000000
WCONTINUED = 0x8
+ WDIOC_GETBOOTSTATUS = 0x40045702
+ WDIOC_GETPRETIMEOUT = 0x40045709
+ WDIOC_GETSTATUS = 0x40045701
+ WDIOC_GETSUPPORT = 0x40285700
+ WDIOC_GETTEMP = 0x40045703
+ WDIOC_GETTIMELEFT = 0x4004570a
+ WDIOC_GETTIMEOUT = 0x40045707
+ WDIOC_KEEPALIVE = 0x40045705
+ WDIOC_SETOPTIONS = 0x40045704
+ WDIOC_SETPRETIMEOUT = 0xc0045708
+ WDIOC_SETTIMEOUT = 0xc0045706
WEXITED = 0x4
WNOHANG = 0x1
WNOTHREAD = 0x20000000
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go
index 08adb1d..ddd2562 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go
@@ -623,6 +623,7 @@ const (
IN_OPEN = 0x20
IN_Q_OVERFLOW = 0x4000
IN_UNMOUNT = 0x2000
+ IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9
IPPROTO_AH = 0x33
IPPROTO_BEETPH = 0x5e
IPPROTO_COMP = 0x6c
@@ -1189,7 +1190,7 @@ const (
PR_SET_NO_NEW_PRIVS = 0x26
PR_SET_PDEATHSIG = 0x1
PR_SET_PTRACER = 0x59616d61
- PR_SET_PTRACER_ANY = -0x1
+ PR_SET_PTRACER_ANY = 0xffffffffffffffff
PR_SET_SECCOMP = 0x16
PR_SET_SECUREBITS = 0x1c
PR_SET_THP_DISABLE = 0x29
@@ -1335,7 +1336,7 @@ const (
RLIMIT_RTTIME = 0xf
RLIMIT_SIGPENDING = 0xb
RLIMIT_STACK = 0x3
- RLIM_INFINITY = -0x1
+ RLIM_INFINITY = 0xffffffffffffffff
RTAX_ADVMSS = 0x8
RTAX_CC_ALGO = 0x10
RTAX_CWND = 0x7
@@ -1904,6 +1905,8 @@ const (
TUNSETVNETHDRSZ = 0x800454d8
TUNSETVNETLE = 0x800454dc
UMOUNT_NOFOLLOW = 0x8
+ UTIME_NOW = 0x3fffffff
+ UTIME_OMIT = 0x3ffffffe
VDISCARD = 0x10
VEOF = 0x4
VEOL = 0x6
@@ -1933,6 +1936,17 @@ const (
WALL = 0x40000000
WCLONE = 0x80000000
WCONTINUED = 0x8
+ WDIOC_GETBOOTSTATUS = 0x40045702
+ WDIOC_GETPRETIMEOUT = 0x40045709
+ WDIOC_GETSTATUS = 0x40045701
+ WDIOC_GETSUPPORT = 0x40285700
+ WDIOC_GETTEMP = 0x40045703
+ WDIOC_GETTIMELEFT = 0x4004570a
+ WDIOC_GETTIMEOUT = 0x40045707
+ WDIOC_KEEPALIVE = 0x40045705
+ WDIOC_SETOPTIONS = 0x40045704
+ WDIOC_SETPRETIMEOUT = 0xc0045708
+ WDIOC_SETTIMEOUT = 0xc0045706
WEXITED = 0x4
WNOHANG = 0x1
WNOTHREAD = 0x20000000
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go
index 70bc1a2..fc304a6 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go
@@ -623,6 +623,7 @@ const (
IN_OPEN = 0x20
IN_Q_OVERFLOW = 0x4000
IN_UNMOUNT = 0x2000
+ IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9
IPPROTO_AH = 0x33
IPPROTO_BEETPH = 0x5e
IPPROTO_COMP = 0x6c
@@ -1186,7 +1187,7 @@ const (
PR_SET_NO_NEW_PRIVS = 0x26
PR_SET_PDEATHSIG = 0x1
PR_SET_PTRACER = 0x59616d61
- PR_SET_PTRACER_ANY = -0x1
+ PR_SET_PTRACER_ANY = 0xffffffffffffffff
PR_SET_SECCOMP = 0x16
PR_SET_SECUREBITS = 0x1c
PR_SET_THP_DISABLE = 0x29
@@ -1339,7 +1340,7 @@ const (
RLIMIT_RTTIME = 0xf
RLIMIT_SIGPENDING = 0xb
RLIMIT_STACK = 0x3
- RLIM_INFINITY = -0x1
+ RLIM_INFINITY = 0xffffffffffffffff
RTAX_ADVMSS = 0x8
RTAX_CC_ALGO = 0x10
RTAX_CWND = 0x7
@@ -1904,6 +1905,8 @@ const (
TUNSETVNETHDRSZ = 0x400454d8
TUNSETVNETLE = 0x400454dc
UMOUNT_NOFOLLOW = 0x8
+ UTIME_NOW = 0x3fffffff
+ UTIME_OMIT = 0x3ffffffe
VDISCARD = 0xd
VEOF = 0x4
VEOL = 0xb
@@ -1933,6 +1936,17 @@ const (
WALL = 0x40000000
WCLONE = 0x80000000
WCONTINUED = 0x8
+ WDIOC_GETBOOTSTATUS = 0x80045702
+ WDIOC_GETPRETIMEOUT = 0x80045709
+ WDIOC_GETSTATUS = 0x80045701
+ WDIOC_GETSUPPORT = 0x80285700
+ WDIOC_GETTEMP = 0x80045703
+ WDIOC_GETTIMELEFT = 0x8004570a
+ WDIOC_GETTIMEOUT = 0x80045707
+ WDIOC_KEEPALIVE = 0x80045705
+ WDIOC_SETOPTIONS = 0x80045704
+ WDIOC_SETPRETIMEOUT = 0xc0045708
+ WDIOC_SETTIMEOUT = 0xc0045706
WEXITED = 0x4
WNOHANG = 0x1
WNOTHREAD = 0x20000000
diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go
index b4338d5..1612b66 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go
@@ -1,5 +1,5 @@
// mkerrors.sh -m32
-// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
+// Code generated by the command above; see README.md. DO NOT EDIT.
// +build 386,netbsd
@@ -169,6 +169,8 @@ const (
CSTOP = 0x13
CSTOPB = 0x400
CSUSP = 0x1a
+ CTL_HW = 0x6
+ CTL_KERN = 0x1
CTL_MAXNAME = 0xc
CTL_NET = 0x4
CTL_QUERY = -0x2
@@ -581,6 +583,7 @@ const (
F_UNLCK = 0x2
F_WRLCK = 0x3
HUPCL = 0x4000
+ HW_MACHINE = 0x1
ICANON = 0x100
ICMP6_FILTER = 0x12
ICRNL = 0x100
@@ -970,6 +973,10 @@ const (
IXANY = 0x800
IXOFF = 0x400
IXON = 0x200
+ KERN_HOSTNAME = 0xa
+ KERN_OSRELEASE = 0x2
+ KERN_OSTYPE = 0x1
+ KERN_VERSION = 0x4
LOCK_EX = 0x2
LOCK_NB = 0x4
LOCK_SH = 0x1
diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go
index 4994437..c994ab6 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go
@@ -1,5 +1,5 @@
// mkerrors.sh -m64
-// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
+// Code generated by the command above; see README.md. DO NOT EDIT.
// +build amd64,netbsd
@@ -169,6 +169,8 @@ const (
CSTOP = 0x13
CSTOPB = 0x400
CSUSP = 0x1a
+ CTL_HW = 0x6
+ CTL_KERN = 0x1
CTL_MAXNAME = 0xc
CTL_NET = 0x4
CTL_QUERY = -0x2
@@ -571,6 +573,7 @@ const (
F_UNLCK = 0x2
F_WRLCK = 0x3
HUPCL = 0x4000
+ HW_MACHINE = 0x1
ICANON = 0x100
ICMP6_FILTER = 0x12
ICRNL = 0x100
@@ -960,6 +963,10 @@ const (
IXANY = 0x800
IXOFF = 0x400
IXON = 0x200
+ KERN_HOSTNAME = 0xa
+ KERN_OSRELEASE = 0x2
+ KERN_OSTYPE = 0x1
+ KERN_VERSION = 0x4
LOCK_EX = 0x2
LOCK_NB = 0x4
LOCK_SH = 0x1
diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go
index 206c75f..a8f9efe 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go
@@ -1,5 +1,5 @@
// mkerrors.sh -marm
-// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
+// Code generated by the command above; see README.md. DO NOT EDIT.
// +build arm,netbsd
@@ -161,6 +161,8 @@ const (
CSTOP = 0x13
CSTOPB = 0x400
CSUSP = 0x1a
+ CTL_HW = 0x6
+ CTL_KERN = 0x1
CTL_MAXNAME = 0xc
CTL_NET = 0x4
CTL_QUERY = -0x2
@@ -563,6 +565,7 @@ const (
F_UNLCK = 0x2
F_WRLCK = 0x3
HUPCL = 0x4000
+ HW_MACHINE = 0x1
ICANON = 0x100
ICMP6_FILTER = 0x12
ICRNL = 0x100
@@ -952,6 +955,10 @@ const (
IXANY = 0x800
IXOFF = 0x400
IXON = 0x200
+ KERN_HOSTNAME = 0xa
+ KERN_OSRELEASE = 0x2
+ KERN_OSTYPE = 0x1
+ KERN_VERSION = 0x4
LOCK_EX = 0x2
LOCK_NB = 0x4
LOCK_SH = 0x1
diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go
index 3322e99..04e4f33 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go
@@ -1,5 +1,5 @@
// mkerrors.sh -m32
-// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
+// Code generated by the command above; see README.md. DO NOT EDIT.
// +build 386,openbsd
@@ -157,6 +157,8 @@ const (
CSTOP = 0x13
CSTOPB = 0x400
CSUSP = 0x1a
+ CTL_HW = 0x6
+ CTL_KERN = 0x1
CTL_MAXNAME = 0xc
CTL_NET = 0x4
DIOCOSFPFLUSH = 0x2000444e
@@ -442,6 +444,7 @@ const (
F_UNLCK = 0x2
F_WRLCK = 0x3
HUPCL = 0x4000
+ HW_MACHINE = 0x1
ICANON = 0x100
ICMP6_FILTER = 0x12
ICRNL = 0x100
@@ -860,6 +863,10 @@ const (
IXANY = 0x800
IXOFF = 0x400
IXON = 0x200
+ KERN_HOSTNAME = 0xa
+ KERN_OSRELEASE = 0x2
+ KERN_OSTYPE = 0x1
+ KERN_VERSION = 0x4
LCNT_OVERLOAD_FLUSH = 0x6
LOCK_EX = 0x2
LOCK_NB = 0x4
diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go
index 1758ecc..c80ff98 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go
@@ -1,5 +1,5 @@
// mkerrors.sh -m64
-// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
+// Code generated by the command above; see README.md. DO NOT EDIT.
// +build amd64,openbsd
@@ -157,6 +157,8 @@ const (
CSTOP = 0x13
CSTOPB = 0x400
CSUSP = 0x1a
+ CTL_HW = 0x6
+ CTL_KERN = 0x1
CTL_MAXNAME = 0xc
CTL_NET = 0x4
DIOCOSFPFLUSH = 0x2000444e
@@ -442,6 +444,7 @@ const (
F_UNLCK = 0x2
F_WRLCK = 0x3
HUPCL = 0x4000
+ HW_MACHINE = 0x1
ICANON = 0x100
ICMP6_FILTER = 0x12
ICRNL = 0x100
@@ -860,6 +863,10 @@ const (
IXANY = 0x800
IXOFF = 0x400
IXON = 0x200
+ KERN_HOSTNAME = 0xa
+ KERN_OSRELEASE = 0x2
+ KERN_OSTYPE = 0x1
+ KERN_VERSION = 0x4
LCNT_OVERLOAD_FLUSH = 0x6
LOCK_EX = 0x2
LOCK_NB = 0x4
diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go
index 3ed0b26..4c32049 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go
@@ -1,5 +1,5 @@
// mkerrors.sh
-// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
+// Code generated by the command above; see README.md. DO NOT EDIT.
// Created by cgo -godefs - DO NOT EDIT
// cgo -godefs -- _const.go
@@ -157,6 +157,8 @@ const (
CSTOP = 0x13
CSTOPB = 0x400
CSUSP = 0x1a
+ CTL_HW = 0x6
+ CTL_KERN = 0x1
CTL_MAXNAME = 0xc
CTL_NET = 0x4
DIOCOSFPFLUSH = 0x2000444e
@@ -441,6 +443,7 @@ const (
F_UNLCK = 0x2
F_WRLCK = 0x3
HUPCL = 0x4000
+ HW_MACHINE = 0x1
ICANON = 0x100
ICMP6_FILTER = 0x12
ICRNL = 0x100
@@ -859,6 +862,10 @@ const (
IXANY = 0x800
IXOFF = 0x400
IXON = 0x200
+ KERN_HOSTNAME = 0xa
+ KERN_OSRELEASE = 0x2
+ KERN_OSTYPE = 0x1
+ KERN_VERSION = 0x4
LCNT_OVERLOAD_FLUSH = 0x6
LOCK_EX = 0x2
LOCK_NB = 0x4
diff --git a/vendor/golang.org/x/sys/unix/zptrace386_linux.go b/vendor/golang.org/x/sys/unix/zptrace386_linux.go
new file mode 100644
index 0000000..2d21c49
--- /dev/null
+++ b/vendor/golang.org/x/sys/unix/zptrace386_linux.go
@@ -0,0 +1,80 @@
+// Code generated by linux/mkall.go generatePtracePair(386, amd64). DO NOT EDIT.
+
+// +build linux
+// +build 386 amd64
+
+package unix
+
+import "unsafe"
+
+// PtraceRegs386 is the registers used by 386 binaries.
+type PtraceRegs386 struct {
+ Ebx int32
+ Ecx int32
+ Edx int32
+ Esi int32
+ Edi int32
+ Ebp int32
+ Eax int32
+ Xds int32
+ Xes int32
+ Xfs int32
+ Xgs int32
+ Orig_eax int32
+ Eip int32
+ Xcs int32
+ Eflags int32
+ Esp int32
+ Xss int32
+}
+
+// PtraceGetRegs386 fetches the registers used by 386 binaries.
+func PtraceGetRegs386(pid int, regsout *PtraceRegs386) error {
+ return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
+}
+
+// PtraceSetRegs386 sets the registers used by 386 binaries.
+func PtraceSetRegs386(pid int, regs *PtraceRegs386) error {
+ return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
+}
+
+// PtraceRegsAmd64 is the registers used by amd64 binaries.
+type PtraceRegsAmd64 struct {
+ R15 uint64
+ R14 uint64
+ R13 uint64
+ R12 uint64
+ Rbp uint64
+ Rbx uint64
+ R11 uint64
+ R10 uint64
+ R9 uint64
+ R8 uint64
+ Rax uint64
+ Rcx uint64
+ Rdx uint64
+ Rsi uint64
+ Rdi uint64
+ Orig_rax uint64
+ Rip uint64
+ Cs uint64
+ Eflags uint64
+ Rsp uint64
+ Ss uint64
+ Fs_base uint64
+ Gs_base uint64
+ Ds uint64
+ Es uint64
+ Fs uint64
+ Gs uint64
+}
+
+// PtraceGetRegsAmd64 fetches the registers used by amd64 binaries.
+func PtraceGetRegsAmd64(pid int, regsout *PtraceRegsAmd64) error {
+ return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
+}
+
+// PtraceSetRegsAmd64 sets the registers used by amd64 binaries.
+func PtraceSetRegsAmd64(pid int, regs *PtraceRegsAmd64) error {
+ return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
+}
diff --git a/vendor/golang.org/x/sys/unix/zptracearm_linux.go b/vendor/golang.org/x/sys/unix/zptracearm_linux.go
new file mode 100644
index 0000000..faf23bb
--- /dev/null
+++ b/vendor/golang.org/x/sys/unix/zptracearm_linux.go
@@ -0,0 +1,41 @@
+// Code generated by linux/mkall.go generatePtracePair(arm, arm64). DO NOT EDIT.
+
+// +build linux
+// +build arm arm64
+
+package unix
+
+import "unsafe"
+
+// PtraceRegsArm is the registers used by arm binaries.
+type PtraceRegsArm struct {
+ Uregs [18]uint32
+}
+
+// PtraceGetRegsArm fetches the registers used by arm binaries.
+func PtraceGetRegsArm(pid int, regsout *PtraceRegsArm) error {
+ return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
+}
+
+// PtraceSetRegsArm sets the registers used by arm binaries.
+func PtraceSetRegsArm(pid int, regs *PtraceRegsArm) error {
+ return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
+}
+
+// PtraceRegsArm64 is the registers used by arm64 binaries.
+type PtraceRegsArm64 struct {
+ Regs [31]uint64
+ Sp uint64
+ Pc uint64
+ Pstate uint64
+}
+
+// PtraceGetRegsArm64 fetches the registers used by arm64 binaries.
+func PtraceGetRegsArm64(pid int, regsout *PtraceRegsArm64) error {
+ return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
+}
+
+// PtraceSetRegsArm64 sets the registers used by arm64 binaries.
+func PtraceSetRegsArm64(pid int, regs *PtraceRegsArm64) error {
+ return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
+}
diff --git a/vendor/golang.org/x/sys/unix/zptracemips_linux.go b/vendor/golang.org/x/sys/unix/zptracemips_linux.go
new file mode 100644
index 0000000..c431131
--- /dev/null
+++ b/vendor/golang.org/x/sys/unix/zptracemips_linux.go
@@ -0,0 +1,50 @@
+// Code generated by linux/mkall.go generatePtracePair(mips, mips64). DO NOT EDIT.
+
+// +build linux
+// +build mips mips64
+
+package unix
+
+import "unsafe"
+
+// PtraceRegsMips is the registers used by mips binaries.
+type PtraceRegsMips struct {
+ Regs [32]uint64
+ Lo uint64
+ Hi uint64
+ Epc uint64
+ Badvaddr uint64
+ Status uint64
+ Cause uint64
+}
+
+// PtraceGetRegsMips fetches the registers used by mips binaries.
+func PtraceGetRegsMips(pid int, regsout *PtraceRegsMips) error {
+ return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
+}
+
+// PtraceSetRegsMips sets the registers used by mips binaries.
+func PtraceSetRegsMips(pid int, regs *PtraceRegsMips) error {
+ return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
+}
+
+// PtraceRegsMips64 is the registers used by mips64 binaries.
+type PtraceRegsMips64 struct {
+ Regs [32]uint64
+ Lo uint64
+ Hi uint64
+ Epc uint64
+ Badvaddr uint64
+ Status uint64
+ Cause uint64
+}
+
+// PtraceGetRegsMips64 fetches the registers used by mips64 binaries.
+func PtraceGetRegsMips64(pid int, regsout *PtraceRegsMips64) error {
+ return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
+}
+
+// PtraceSetRegsMips64 sets the registers used by mips64 binaries.
+func PtraceSetRegsMips64(pid int, regs *PtraceRegsMips64) error {
+ return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
+}
diff --git a/vendor/golang.org/x/sys/unix/zptracemipsle_linux.go b/vendor/golang.org/x/sys/unix/zptracemipsle_linux.go
new file mode 100644
index 0000000..dc3d6d3
--- /dev/null
+++ b/vendor/golang.org/x/sys/unix/zptracemipsle_linux.go
@@ -0,0 +1,50 @@
+// Code generated by linux/mkall.go generatePtracePair(mipsle, mips64le). DO NOT EDIT.
+
+// +build linux
+// +build mipsle mips64le
+
+package unix
+
+import "unsafe"
+
+// PtraceRegsMipsle is the registers used by mipsle binaries.
+type PtraceRegsMipsle struct {
+ Regs [32]uint64
+ Lo uint64
+ Hi uint64
+ Epc uint64
+ Badvaddr uint64
+ Status uint64
+ Cause uint64
+}
+
+// PtraceGetRegsMipsle fetches the registers used by mipsle binaries.
+func PtraceGetRegsMipsle(pid int, regsout *PtraceRegsMipsle) error {
+ return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
+}
+
+// PtraceSetRegsMipsle sets the registers used by mipsle binaries.
+func PtraceSetRegsMipsle(pid int, regs *PtraceRegsMipsle) error {
+ return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
+}
+
+// PtraceRegsMips64le is the registers used by mips64le binaries.
+type PtraceRegsMips64le struct {
+ Regs [32]uint64
+ Lo uint64
+ Hi uint64
+ Epc uint64
+ Badvaddr uint64
+ Status uint64
+ Cause uint64
+}
+
+// PtraceGetRegsMips64le fetches the registers used by mips64le binaries.
+func PtraceGetRegsMips64le(pid int, regsout *PtraceRegsMips64le) error {
+ return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
+}
+
+// PtraceSetRegsMips64le sets the registers used by mips64le binaries.
+func PtraceSetRegsMips64le(pid int, regs *PtraceRegsMips64le) error {
+ return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
+}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go
index 10491e9..763ae4f 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go
@@ -266,6 +266,17 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Madvise(b []byte, behav int) (err error) {
var _p0 unsafe.Pointer
if len(b) > 0 {
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go
index 5f1f6bf..d6808e0 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go
@@ -266,6 +266,17 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Madvise(b []byte, behav int) (err error) {
var _p0 unsafe.Pointer
if len(b) > 0 {
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go
index 7a40974..6ae95e6 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go
@@ -221,7 +221,7 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr)
} else {
_p0 = unsafe.Pointer(&_zero)
}
- _, _, e1 := Syscall6(SYS_SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
+ _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))
if e1 != 0 {
err = errnoErr(e1)
}
@@ -266,6 +266,17 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Madvise(b []byte, behav int) (err error) {
var _p0 unsafe.Pointer
if len(b) > 0 {
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go
index 07c6ebc..ca6a7ea 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go
@@ -266,6 +266,17 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Madvise(b []byte, behav int) (err error) {
var _p0 unsafe.Pointer
if len(b) > 0 {
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go
index 7fa205c..a0241de 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go
@@ -266,6 +266,17 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Madvise(b []byte, behav int) (err error) {
var _p0 unsafe.Pointer
if len(b) > 0 {
@@ -412,6 +423,33 @@ func extpwrite(fd int, p []byte, flags int, offset int64) (n int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Getcwd(buf []byte) (n int, err error) {
+ var _p0 unsafe.Pointer
+ if len(buf) > 0 {
+ _p0 = unsafe.Pointer(&buf[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ioctl(fd int, req uint, arg uintptr) (err error) {
+ _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Access(path string, mode uint32) (err error) {
var _p0 *byte
_p0, err = BytePtrFromString(path)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go
index 1a0bb4c..fd9ca5a 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go
@@ -266,6 +266,17 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Madvise(b []byte, behav int) (err error) {
var _p0 unsafe.Pointer
if len(b) > 0 {
@@ -378,6 +389,23 @@ func pipe() (r int, w int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Getcwd(buf []byte) (n int, err error) {
+ var _p0 unsafe.Pointer
+ if len(buf) > 0 {
+ _p0 = unsafe.Pointer(&buf[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func ioctl(fd int, req uint, arg uintptr) (err error) {
_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
if e1 != 0 {
@@ -926,6 +954,23 @@ func Ftruncate(fd int, length int64) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Getdents(fd int, buf []byte) (n int, err error) {
+ var _p0 unsafe.Pointer
+ if len(buf) > 0 {
+ _p0 = unsafe.Pointer(&buf[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf)))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
var _p0 unsafe.Pointer
if len(buf) > 0 {
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go
index ac1e8e0..a9f18b2 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go
@@ -266,6 +266,17 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Madvise(b []byte, behav int) (err error) {
var _p0 unsafe.Pointer
if len(b) > 0 {
@@ -378,6 +389,23 @@ func pipe() (r int, w int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Getcwd(buf []byte) (n int, err error) {
+ var _p0 unsafe.Pointer
+ if len(buf) > 0 {
+ _p0 = unsafe.Pointer(&buf[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func ioctl(fd int, req uint, arg uintptr) (err error) {
_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
if e1 != 0 {
@@ -926,6 +954,23 @@ func Ftruncate(fd int, length int64) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Getdents(fd int, buf []byte) (n int, err error) {
+ var _p0 unsafe.Pointer
+ if len(buf) > 0 {
+ _p0 = unsafe.Pointer(&buf[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf)))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
var _p0 unsafe.Pointer
if len(buf) > 0 {
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go
index 2b4e6ac..9823e18 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go
@@ -266,6 +266,17 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Madvise(b []byte, behav int) (err error) {
var _p0 unsafe.Pointer
if len(b) > 0 {
@@ -378,6 +389,23 @@ func pipe() (r int, w int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Getcwd(buf []byte) (n int, err error) {
+ var _p0 unsafe.Pointer
+ if len(buf) > 0 {
+ _p0 = unsafe.Pointer(&buf[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func ioctl(fd int, req uint, arg uintptr) (err error) {
_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
if e1 != 0 {
@@ -926,6 +954,23 @@ func Ftruncate(fd int, length int64) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Getdents(fd int, buf []byte) (n int, err error) {
+ var _p0 unsafe.Pointer
+ if len(buf) > 0 {
+ _p0 = unsafe.Pointer(&buf[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf)))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
var _p0 unsafe.Pointer
if len(buf) > 0 {
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go
index 000a468..dcb9547 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go
@@ -538,7 +538,7 @@ func Eventfd(initval uint, flags int) (fd int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Exit(code int) {
- Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)
+ SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0)
return
}
@@ -674,7 +674,7 @@ func Getpgid(pid int) (pgid int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getpid() (pid int) {
- r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0)
pid = int(r0)
return
}
@@ -682,7 +682,7 @@ func Getpid() (pid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getppid() (ppid int) {
- r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0)
ppid = int(r0)
return
}
@@ -739,7 +739,7 @@ func Getsid(pid int) (sid int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Gettid() (tid int) {
- r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0)
tid = int(r0)
return
}
@@ -1035,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
+ r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func read(fd int, p []byte) (n int, err error) {
var _p0 unsafe.Pointer
if len(p) > 0 {
@@ -1228,7 +1239,7 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Sync() {
- Syscall(SYS_SYNC, 0, 0, 0)
+ SyscallNoError(SYS_SYNC, 0, 0, 0)
return
}
@@ -1287,7 +1298,7 @@ func Times(tms *Tms) (ticks uintptr, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Umask(mask int) (oldmask int) {
- r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)
+ r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0)
oldmask = int(r0)
return
}
@@ -1558,6 +1569,21 @@ func Fstat(fd int, stat *Stat_t) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Ftruncate(fd int, length int64) (err error) {
_, _, e1 := Syscall(SYS_FTRUNCATE64, uintptr(fd), uintptr(length), uintptr(length>>32))
if e1 != 0 {
@@ -1569,7 +1595,7 @@ func Ftruncate(fd int, length int64) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getegid() (egid int) {
- r0, _, _ := RawSyscall(SYS_GETEGID32, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETEGID32, 0, 0, 0)
egid = int(r0)
return
}
@@ -1577,7 +1603,7 @@ func Getegid() (egid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Geteuid() (euid int) {
- r0, _, _ := RawSyscall(SYS_GETEUID32, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETEUID32, 0, 0, 0)
euid = int(r0)
return
}
@@ -1585,7 +1611,7 @@ func Geteuid() (euid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getgid() (gid int) {
- r0, _, _ := RawSyscall(SYS_GETGID32, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETGID32, 0, 0, 0)
gid = int(r0)
return
}
@@ -1593,7 +1619,7 @@ func Getgid() (gid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getuid() (uid int) {
- r0, _, _ := RawSyscall(SYS_GETUID32, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETUID32, 0, 0, 0)
uid = int(r0)
return
}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go
index 712dffd..badf57e 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go
@@ -538,7 +538,7 @@ func Eventfd(initval uint, flags int) (fd int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Exit(code int) {
- Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)
+ SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0)
return
}
@@ -674,7 +674,7 @@ func Getpgid(pid int) (pgid int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getpid() (pid int) {
- r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0)
pid = int(r0)
return
}
@@ -682,7 +682,7 @@ func Getpid() (pid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getppid() (ppid int) {
- r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0)
ppid = int(r0)
return
}
@@ -739,7 +739,7 @@ func Getsid(pid int) (sid int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Gettid() (tid int) {
- r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0)
tid = int(r0)
return
}
@@ -1035,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
+ r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func read(fd int, p []byte) (n int, err error) {
var _p0 unsafe.Pointer
if len(p) > 0 {
@@ -1228,7 +1239,7 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Sync() {
- Syscall(SYS_SYNC, 0, 0, 0)
+ SyscallNoError(SYS_SYNC, 0, 0, 0)
return
}
@@ -1287,7 +1298,7 @@ func Times(tms *Tms) (ticks uintptr, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Umask(mask int) (oldmask int) {
- r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)
+ r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0)
oldmask = int(r0)
return
}
@@ -1555,6 +1566,21 @@ func Fstat(fd int, stat *Stat_t) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Fstatfs(fd int, buf *Statfs_t) (err error) {
_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0)
if e1 != 0 {
@@ -1576,7 +1602,7 @@ func Ftruncate(fd int, length int64) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getegid() (egid int) {
- r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0)
egid = int(r0)
return
}
@@ -1584,7 +1610,7 @@ func Getegid() (egid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Geteuid() (euid int) {
- r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0)
euid = int(r0)
return
}
@@ -1592,7 +1618,7 @@ func Geteuid() (euid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getgid() (gid int) {
- r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0)
gid = int(r0)
return
}
@@ -1610,7 +1636,7 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getuid() (uid int) {
- r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0)
uid = int(r0)
return
}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go
index 338796d..69765c3 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go
@@ -538,7 +538,7 @@ func Eventfd(initval uint, flags int) (fd int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Exit(code int) {
- Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)
+ SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0)
return
}
@@ -674,7 +674,7 @@ func Getpgid(pid int) (pgid int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getpid() (pid int) {
- r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0)
pid = int(r0)
return
}
@@ -682,7 +682,7 @@ func Getpid() (pid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getppid() (ppid int) {
- r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0)
ppid = int(r0)
return
}
@@ -739,7 +739,7 @@ func Getsid(pid int) (sid int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Gettid() (tid int) {
- r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0)
tid = int(r0)
return
}
@@ -1035,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
+ r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func read(fd int, p []byte) (n int, err error) {
var _p0 unsafe.Pointer
if len(p) > 0 {
@@ -1228,7 +1239,7 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Sync() {
- Syscall(SYS_SYNC, 0, 0, 0)
+ SyscallNoError(SYS_SYNC, 0, 0, 0)
return
}
@@ -1287,7 +1298,7 @@ func Times(tms *Tms) (ticks uintptr, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Umask(mask int) (oldmask int) {
- r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)
+ r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0)
oldmask = int(r0)
return
}
@@ -1717,8 +1728,23 @@ func Fstat(fd int, stat *Stat_t) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Getegid() (egid int) {
- r0, _, _ := RawSyscall(SYS_GETEGID32, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETEGID32, 0, 0, 0)
egid = int(r0)
return
}
@@ -1726,7 +1752,7 @@ func Getegid() (egid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Geteuid() (euid int) {
- r0, _, _ := RawSyscall(SYS_GETEUID32, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETEUID32, 0, 0, 0)
euid = int(r0)
return
}
@@ -1734,7 +1760,7 @@ func Geteuid() (euid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getgid() (gid int) {
- r0, _, _ := RawSyscall(SYS_GETGID32, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETGID32, 0, 0, 0)
gid = int(r0)
return
}
@@ -1742,7 +1768,7 @@ func Getgid() (gid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getuid() (uid int) {
- r0, _, _ := RawSyscall(SYS_GETUID32, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETUID32, 0, 0, 0)
uid = int(r0)
return
}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go
index fc3006d..dc8e642 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go
@@ -538,7 +538,7 @@ func Eventfd(initval uint, flags int) (fd int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Exit(code int) {
- Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)
+ SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0)
return
}
@@ -674,7 +674,7 @@ func Getpgid(pid int) (pgid int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getpid() (pid int) {
- r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0)
pid = int(r0)
return
}
@@ -682,7 +682,7 @@ func Getpid() (pid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getppid() (ppid int) {
- r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0)
ppid = int(r0)
return
}
@@ -739,7 +739,7 @@ func Getsid(pid int) (sid int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Gettid() (tid int) {
- r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0)
tid = int(r0)
return
}
@@ -1035,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
+ r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func read(fd int, p []byte) (n int, err error) {
var _p0 unsafe.Pointer
if len(p) > 0 {
@@ -1228,7 +1239,7 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Sync() {
- Syscall(SYS_SYNC, 0, 0, 0)
+ SyscallNoError(SYS_SYNC, 0, 0, 0)
return
}
@@ -1287,7 +1298,7 @@ func Times(tms *Tms) (ticks uintptr, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Umask(mask int) (oldmask int) {
- r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)
+ r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0)
oldmask = int(r0)
return
}
@@ -1571,7 +1582,7 @@ func Ftruncate(fd int, length int64) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getegid() (egid int) {
- r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0)
egid = int(r0)
return
}
@@ -1579,7 +1590,7 @@ func Getegid() (egid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Geteuid() (euid int) {
- r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0)
euid = int(r0)
return
}
@@ -1587,7 +1598,7 @@ func Geteuid() (euid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getgid() (gid int) {
- r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0)
gid = int(r0)
return
}
@@ -1605,7 +1616,7 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getuid() (uid int) {
- r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0)
uid = int(r0)
return
}
@@ -1667,17 +1678,6 @@ func Seek(fd int, offset int64, whence int) (off int64, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
- r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
- n = int(r0)
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0)
written = int(r0)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go
index 4b0ef20..59f50c8 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go
@@ -538,7 +538,7 @@ func Eventfd(initval uint, flags int) (fd int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Exit(code int) {
- Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)
+ SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0)
return
}
@@ -674,7 +674,7 @@ func Getpgid(pid int) (pgid int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getpid() (pid int) {
- r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0)
pid = int(r0)
return
}
@@ -682,7 +682,7 @@ func Getpid() (pid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getppid() (ppid int) {
- r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0)
ppid = int(r0)
return
}
@@ -739,7 +739,7 @@ func Getsid(pid int) (sid int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Gettid() (tid int) {
- r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0)
tid = int(r0)
return
}
@@ -1035,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
+ r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func read(fd int, p []byte) (n int, err error) {
var _p0 unsafe.Pointer
if len(p) > 0 {
@@ -1228,7 +1239,7 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Sync() {
- Syscall(SYS_SYNC, 0, 0, 0)
+ SyscallNoError(SYS_SYNC, 0, 0, 0)
return
}
@@ -1287,7 +1298,7 @@ func Times(tms *Tms) (ticks uintptr, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Umask(mask int) (oldmask int) {
- r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)
+ r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0)
oldmask = int(r0)
return
}
@@ -1529,7 +1540,7 @@ func Ftruncate(fd int, length int64) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getegid() (egid int) {
- r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0)
egid = int(r0)
return
}
@@ -1537,7 +1548,7 @@ func Getegid() (egid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Geteuid() (euid int) {
- r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0)
euid = int(r0)
return
}
@@ -1545,7 +1556,7 @@ func Geteuid() (euid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getgid() (gid int) {
- r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0)
gid = int(r0)
return
}
@@ -1553,7 +1564,7 @@ func Getgid() (gid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getuid() (uid int) {
- r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0)
uid = int(r0)
return
}
@@ -2003,6 +2014,21 @@ func Fstat(fd int, stat *Stat_t) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Stat(path string, stat *Stat_t) (err error) {
var _p0 *byte
_p0, err = BytePtrFromString(path)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go
index 31eb98c..3803380 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go
@@ -538,7 +538,7 @@ func Eventfd(initval uint, flags int) (fd int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Exit(code int) {
- Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)
+ SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0)
return
}
@@ -674,7 +674,7 @@ func Getpgid(pid int) (pgid int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getpid() (pid int) {
- r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0)
pid = int(r0)
return
}
@@ -682,7 +682,7 @@ func Getpid() (pid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getppid() (ppid int) {
- r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0)
ppid = int(r0)
return
}
@@ -739,7 +739,7 @@ func Getsid(pid int) (sid int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Gettid() (tid int) {
- r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0)
tid = int(r0)
return
}
@@ -1035,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
+ r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func read(fd int, p []byte) (n int, err error) {
var _p0 unsafe.Pointer
if len(p) > 0 {
@@ -1228,7 +1239,7 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Sync() {
- Syscall(SYS_SYNC, 0, 0, 0)
+ SyscallNoError(SYS_SYNC, 0, 0, 0)
return
}
@@ -1287,7 +1298,7 @@ func Times(tms *Tms) (ticks uintptr, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Umask(mask int) (oldmask int) {
- r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)
+ r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0)
oldmask = int(r0)
return
}
@@ -1535,6 +1546,21 @@ func Fchown(fd int, uid int, gid int) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Fstatfs(fd int, buf *Statfs_t) (err error) {
_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0)
if e1 != 0 {
@@ -1556,7 +1582,7 @@ func Ftruncate(fd int, length int64) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getegid() (egid int) {
- r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0)
egid = int(r0)
return
}
@@ -1564,7 +1590,7 @@ func Getegid() (egid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Geteuid() (euid int) {
- r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0)
euid = int(r0)
return
}
@@ -1572,7 +1598,7 @@ func Geteuid() (euid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getgid() (gid int) {
- r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0)
gid = int(r0)
return
}
@@ -1590,7 +1616,7 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getuid() (uid int) {
- r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0)
uid = int(r0)
return
}
@@ -1677,17 +1703,6 @@ func Seek(fd int, offset int64, whence int) (off int64, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
- r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
- n = int(r0)
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0)
written = int(r0)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go
index 875ffa3..fee2f85 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go
@@ -538,7 +538,7 @@ func Eventfd(initval uint, flags int) (fd int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Exit(code int) {
- Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)
+ SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0)
return
}
@@ -674,7 +674,7 @@ func Getpgid(pid int) (pgid int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getpid() (pid int) {
- r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0)
pid = int(r0)
return
}
@@ -682,7 +682,7 @@ func Getpid() (pid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getppid() (ppid int) {
- r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0)
ppid = int(r0)
return
}
@@ -739,7 +739,7 @@ func Getsid(pid int) (sid int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Gettid() (tid int) {
- r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0)
tid = int(r0)
return
}
@@ -1035,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
+ r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func read(fd int, p []byte) (n int, err error) {
var _p0 unsafe.Pointer
if len(p) > 0 {
@@ -1228,7 +1239,7 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Sync() {
- Syscall(SYS_SYNC, 0, 0, 0)
+ SyscallNoError(SYS_SYNC, 0, 0, 0)
return
}
@@ -1287,7 +1298,7 @@ func Times(tms *Tms) (ticks uintptr, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Umask(mask int) (oldmask int) {
- r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)
+ r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0)
oldmask = int(r0)
return
}
@@ -1535,6 +1546,21 @@ func Fchown(fd int, uid int, gid int) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Fstatfs(fd int, buf *Statfs_t) (err error) {
_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0)
if e1 != 0 {
@@ -1556,7 +1582,7 @@ func Ftruncate(fd int, length int64) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getegid() (egid int) {
- r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0)
egid = int(r0)
return
}
@@ -1564,7 +1590,7 @@ func Getegid() (egid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Geteuid() (euid int) {
- r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0)
euid = int(r0)
return
}
@@ -1572,7 +1598,7 @@ func Geteuid() (euid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getgid() (gid int) {
- r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0)
gid = int(r0)
return
}
@@ -1590,7 +1616,7 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getuid() (uid int) {
- r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0)
uid = int(r0)
return
}
@@ -1677,17 +1703,6 @@ func Seek(fd int, offset int64, whence int) (off int64, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
- r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
- n = int(r0)
- if e1 != 0 {
- err = errnoErr(e1)
- }
- return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0)
written = int(r0)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go
index 6863e81..4094d3d 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go
@@ -538,7 +538,7 @@ func Eventfd(initval uint, flags int) (fd int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Exit(code int) {
- Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)
+ SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0)
return
}
@@ -674,7 +674,7 @@ func Getpgid(pid int) (pgid int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getpid() (pid int) {
- r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0)
pid = int(r0)
return
}
@@ -682,7 +682,7 @@ func Getpid() (pid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getppid() (ppid int) {
- r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0)
ppid = int(r0)
return
}
@@ -739,7 +739,7 @@ func Getsid(pid int) (sid int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Gettid() (tid int) {
- r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0)
tid = int(r0)
return
}
@@ -1035,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
+ r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func read(fd int, p []byte) (n int, err error) {
var _p0 unsafe.Pointer
if len(p) > 0 {
@@ -1228,7 +1239,7 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Sync() {
- Syscall(SYS_SYNC, 0, 0, 0)
+ SyscallNoError(SYS_SYNC, 0, 0, 0)
return
}
@@ -1287,7 +1298,7 @@ func Times(tms *Tms) (ticks uintptr, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Umask(mask int) (oldmask int) {
- r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)
+ r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0)
oldmask = int(r0)
return
}
@@ -1529,7 +1540,7 @@ func Ftruncate(fd int, length int64) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getegid() (egid int) {
- r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0)
egid = int(r0)
return
}
@@ -1537,7 +1548,7 @@ func Getegid() (egid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Geteuid() (euid int) {
- r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0)
euid = int(r0)
return
}
@@ -1545,7 +1556,7 @@ func Geteuid() (euid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getgid() (gid int) {
- r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0)
gid = int(r0)
return
}
@@ -1553,7 +1564,7 @@ func Getgid() (gid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getuid() (uid int) {
- r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0)
uid = int(r0)
return
}
@@ -2003,6 +2014,21 @@ func Fstat(fd int, stat *Stat_t) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Stat(path string, stat *Stat_t) (err error) {
var _p0 *byte
_p0, err = BytePtrFromString(path)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go
index 2a32c6b..d83bafb 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go
@@ -538,7 +538,7 @@ func Eventfd(initval uint, flags int) (fd int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Exit(code int) {
- Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)
+ SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0)
return
}
@@ -674,7 +674,7 @@ func Getpgid(pid int) (pgid int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getpid() (pid int) {
- r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0)
pid = int(r0)
return
}
@@ -682,7 +682,7 @@ func Getpid() (pid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getppid() (ppid int) {
- r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0)
ppid = int(r0)
return
}
@@ -739,7 +739,7 @@ func Getsid(pid int) (sid int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Gettid() (tid int) {
- r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0)
tid = int(r0)
return
}
@@ -1035,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
+ r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func read(fd int, p []byte) (n int, err error) {
var _p0 unsafe.Pointer
if len(p) > 0 {
@@ -1228,7 +1239,7 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Sync() {
- Syscall(SYS_SYNC, 0, 0, 0)
+ SyscallNoError(SYS_SYNC, 0, 0, 0)
return
}
@@ -1287,7 +1298,7 @@ func Times(tms *Tms) (ticks uintptr, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Umask(mask int) (oldmask int) {
- r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)
+ r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0)
oldmask = int(r0)
return
}
@@ -1545,6 +1556,21 @@ func Fstat(fd int, stat *Stat_t) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Fstatfs(fd int, buf *Statfs_t) (err error) {
_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0)
if e1 != 0 {
@@ -1566,7 +1592,7 @@ func Ftruncate(fd int, length int64) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getegid() (egid int) {
- r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0)
egid = int(r0)
return
}
@@ -1574,7 +1600,7 @@ func Getegid() (egid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Geteuid() (euid int) {
- r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0)
euid = int(r0)
return
}
@@ -1582,7 +1608,7 @@ func Geteuid() (euid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getgid() (gid int) {
- r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0)
gid = int(r0)
return
}
@@ -1600,7 +1626,7 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getuid() (uid int) {
- r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0)
uid = int(r0)
return
}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go
index 8172d35..460971c 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go
@@ -538,7 +538,7 @@ func Eventfd(initval uint, flags int) (fd int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Exit(code int) {
- Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)
+ SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0)
return
}
@@ -674,7 +674,7 @@ func Getpgid(pid int) (pgid int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getpid() (pid int) {
- r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0)
pid = int(r0)
return
}
@@ -682,7 +682,7 @@ func Getpid() (pid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getppid() (ppid int) {
- r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0)
ppid = int(r0)
return
}
@@ -739,7 +739,7 @@ func Getsid(pid int) (sid int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Gettid() (tid int) {
- r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0)
tid = int(r0)
return
}
@@ -1035,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
+ r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func read(fd int, p []byte) (n int, err error) {
var _p0 unsafe.Pointer
if len(p) > 0 {
@@ -1228,7 +1239,7 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Sync() {
- Syscall(SYS_SYNC, 0, 0, 0)
+ SyscallNoError(SYS_SYNC, 0, 0, 0)
return
}
@@ -1287,7 +1298,7 @@ func Times(tms *Tms) (ticks uintptr, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Umask(mask int) (oldmask int) {
- r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)
+ r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0)
oldmask = int(r0)
return
}
@@ -1545,6 +1556,21 @@ func Fstat(fd int, stat *Stat_t) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Fstatfs(fd int, buf *Statfs_t) (err error) {
_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0)
if e1 != 0 {
@@ -1566,7 +1592,7 @@ func Ftruncate(fd int, length int64) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getegid() (egid int) {
- r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0)
egid = int(r0)
return
}
@@ -1574,7 +1600,7 @@ func Getegid() (egid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Geteuid() (euid int) {
- r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0)
euid = int(r0)
return
}
@@ -1582,7 +1608,7 @@ func Geteuid() (euid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getgid() (gid int) {
- r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0)
gid = int(r0)
return
}
@@ -1600,7 +1626,7 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getuid() (uid int) {
- r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0)
uid = int(r0)
return
}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go
index 4902196..b7ef121 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go
@@ -538,7 +538,7 @@ func Eventfd(initval uint, flags int) (fd int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Exit(code int) {
- Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)
+ SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0)
return
}
@@ -674,7 +674,7 @@ func Getpgid(pid int) (pgid int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getpid() (pid int) {
- r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0)
pid = int(r0)
return
}
@@ -682,7 +682,7 @@ func Getpid() (pid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getppid() (ppid int) {
- r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0)
ppid = int(r0)
return
}
@@ -739,7 +739,7 @@ func Getsid(pid int) (sid int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Gettid() (tid int) {
- r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0)
tid = int(r0)
return
}
@@ -1035,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {
+ r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func read(fd int, p []byte) (n int, err error) {
var _p0 unsafe.Pointer
if len(p) > 0 {
@@ -1228,7 +1239,7 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Sync() {
- Syscall(SYS_SYNC, 0, 0, 0)
+ SyscallNoError(SYS_SYNC, 0, 0, 0)
return
}
@@ -1287,7 +1298,7 @@ func Times(tms *Tms) (ticks uintptr, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Umask(mask int) (oldmask int) {
- r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)
+ r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0)
oldmask = int(r0)
return
}
@@ -1555,6 +1566,21 @@ func Fstat(fd int, stat *Stat_t) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) {
+ var _p0 *byte
+ _p0, err = BytePtrFromString(path)
+ if err != nil {
+ return
+ }
+ _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Fstatfs(fd int, buf *Statfs_t) (err error) {
_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0)
if e1 != 0 {
@@ -1576,7 +1602,7 @@ func Ftruncate(fd int, length int64) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getegid() (egid int) {
- r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0)
egid = int(r0)
return
}
@@ -1584,7 +1610,7 @@ func Getegid() (egid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Geteuid() (euid int) {
- r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0)
euid = int(r0)
return
}
@@ -1592,7 +1618,7 @@ func Geteuid() (euid int) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getgid() (gid int) {
- r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0)
gid = int(r0)
return
}
@@ -1610,7 +1636,7 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
func Getuid() (uid int) {
- r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)
+ r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0)
uid = int(r0)
return
}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go
index db99fd0..62eadff 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go
@@ -266,6 +266,17 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Madvise(b []byte, behav int) (err error) {
var _p0 unsafe.Pointer
if len(b) > 0 {
@@ -395,6 +406,33 @@ func getdents(fd int, buf []byte) (n int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Getcwd(buf []byte) (n int, err error) {
+ var _p0 unsafe.Pointer
+ if len(buf) > 0 {
+ _p0 = unsafe.Pointer(&buf[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ioctl(fd int, req uint, arg uintptr) (err error) {
+ _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Access(path string, mode uint32) (err error) {
var _p0 *byte
_p0, err = BytePtrFromString(path)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go
index 7b6c2c8..307f4e9 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go
@@ -266,6 +266,17 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Madvise(b []byte, behav int) (err error) {
var _p0 unsafe.Pointer
if len(b) > 0 {
@@ -395,6 +406,33 @@ func getdents(fd int, buf []byte) (n int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Getcwd(buf []byte) (n int, err error) {
+ var _p0 unsafe.Pointer
+ if len(buf) > 0 {
+ _p0 = unsafe.Pointer(&buf[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ioctl(fd int, req uint, arg uintptr) (err error) {
+ _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Access(path string, mode uint32) (err error) {
var _p0 *byte
_p0, err = BytePtrFromString(path)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go
index 0f4cc3b..6110931 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go
@@ -266,6 +266,17 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Madvise(b []byte, behav int) (err error) {
var _p0 unsafe.Pointer
if len(b) > 0 {
@@ -395,6 +406,33 @@ func getdents(fd int, buf []byte) (n int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Getcwd(buf []byte) (n int, err error) {
+ var _p0 unsafe.Pointer
+ if len(buf) > 0 {
+ _p0 = unsafe.Pointer(&buf[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ioctl(fd int, req uint, arg uintptr) (err error) {
+ _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Access(path string, mode uint32) (err error) {
var _p0 *byte
_p0, err = BytePtrFromString(path)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go
index 7baea87..003f820 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go
@@ -266,6 +266,17 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Madvise(b []byte, behav int) (err error) {
var _p0 unsafe.Pointer
if len(b) > 0 {
@@ -393,6 +404,33 @@ func getdents(fd int, buf []byte) (n int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Getcwd(buf []byte) (n int, err error) {
+ var _p0 unsafe.Pointer
+ if len(buf) > 0 {
+ _p0 = unsafe.Pointer(&buf[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ioctl(fd int, req uint, arg uintptr) (err error) {
+ _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Access(path string, mode uint32) (err error) {
var _p0 *byte
_p0, err = BytePtrFromString(path)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go
index 0d69ce6..ba0e8f3 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go
@@ -266,6 +266,17 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Madvise(b []byte, behav int) (err error) {
var _p0 unsafe.Pointer
if len(b) > 0 {
@@ -393,6 +404,33 @@ func getdents(fd int, buf []byte) (n int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Getcwd(buf []byte) (n int, err error) {
+ var _p0 unsafe.Pointer
+ if len(buf) > 0 {
+ _p0 = unsafe.Pointer(&buf[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ioctl(fd int, req uint, arg uintptr) (err error) {
+ _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Access(path string, mode uint32) (err error) {
var _p0 *byte
_p0, err = BytePtrFromString(path)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go
index 41572c2..2ce02c7 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go
@@ -266,6 +266,17 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Madvise(b []byte, behav int) (err error) {
var _p0 unsafe.Pointer
if len(b) > 0 {
@@ -393,6 +404,33 @@ func getdents(fd int, buf []byte) (n int, err error) {
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func Getcwd(buf []byte) (n int, err error) {
+ var _p0 unsafe.Pointer
+ if len(buf) > 0 {
+ _p0 = unsafe.Pointer(&buf[0])
+ } else {
+ _p0 = unsafe.Pointer(&_zero)
+ }
+ r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ioctl(fd int, req uint, arg uintptr) (err error) {
+ _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func Access(path string, mode uint32) (err error) {
var _p0 *byte
_p0, err = BytePtrFromString(path)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go
index 98b2665..f5d01b3 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go
@@ -29,6 +29,7 @@ import (
//go:cgo_import_dynamic libc___major __major "libc.so"
//go:cgo_import_dynamic libc___minor __minor "libc.so"
//go:cgo_import_dynamic libc_ioctl ioctl "libc.so"
+//go:cgo_import_dynamic libc_poll poll "libc.so"
//go:cgo_import_dynamic libc_access access "libc.so"
//go:cgo_import_dynamic libc_adjtime adjtime "libc.so"
//go:cgo_import_dynamic libc_chdir chdir "libc.so"
@@ -94,6 +95,7 @@ import (
//go:cgo_import_dynamic libc_renameat renameat "libc.so"
//go:cgo_import_dynamic libc_rmdir rmdir "libc.so"
//go:cgo_import_dynamic libc_lseek lseek "libc.so"
+//go:cgo_import_dynamic libc_select select "libc.so"
//go:cgo_import_dynamic libc_setegid setegid "libc.so"
//go:cgo_import_dynamic libc_seteuid seteuid "libc.so"
//go:cgo_import_dynamic libc_setgid setgid "libc.so"
@@ -153,6 +155,7 @@ import (
//go:linkname proc__major libc___major
//go:linkname proc__minor libc___minor
//go:linkname procioctl libc_ioctl
+//go:linkname procpoll libc_poll
//go:linkname procAccess libc_access
//go:linkname procAdjtime libc_adjtime
//go:linkname procChdir libc_chdir
@@ -218,6 +221,7 @@ import (
//go:linkname procRenameat libc_renameat
//go:linkname procRmdir libc_rmdir
//go:linkname proclseek libc_lseek
+//go:linkname procSelect libc_select
//go:linkname procSetegid libc_setegid
//go:linkname procSeteuid libc_seteuid
//go:linkname procSetgid libc_setgid
@@ -278,6 +282,7 @@ var (
proc__major,
proc__minor,
procioctl,
+ procpoll,
procAccess,
procAdjtime,
procChdir,
@@ -343,6 +348,7 @@ var (
procRenameat,
procRmdir,
proclseek,
+ procSelect,
procSetegid,
procSeteuid,
procSetgid,
@@ -557,6 +563,15 @@ func ioctl(fd int, req uint, arg uintptr) (err error) {
return
}
+func poll(fds *PollFd, nfds int, timeout int) (n int, err error) {
+ r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procpoll)), 3, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout), 0, 0, 0)
+ n = int(r0)
+ if e1 != 0 {
+ err = e1
+ }
+ return
+}
+
func Access(path string, mode uint32) (err error) {
var _p0 *byte
_p0, err = BytePtrFromString(path)
@@ -1252,6 +1267,14 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
return
}
+func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {
+ _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSelect)), 5, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
+ if e1 != 0 {
+ err = e1
+ }
+ return
+}
+
func Setegid(egid int) (err error) {
_, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetegid)), 1, uintptr(egid), 0, 0, 0, 0, 0)
if e1 != 0 {
diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go
similarity index 100%
rename from vendor/golang.org/x/sys/unix/zsysctl_openbsd.go
rename to vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go
diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go
new file mode 100644
index 0000000..83bb935
--- /dev/null
+++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go
@@ -0,0 +1,270 @@
+// mksysctl_openbsd.pl
+// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT
+
+package unix
+
+type mibentry struct {
+ ctlname string
+ ctloid []_C_int
+}
+
+var sysctlMib = []mibentry{
+ {"ddb.console", []_C_int{9, 6}},
+ {"ddb.log", []_C_int{9, 7}},
+ {"ddb.max_line", []_C_int{9, 3}},
+ {"ddb.max_width", []_C_int{9, 2}},
+ {"ddb.panic", []_C_int{9, 5}},
+ {"ddb.radix", []_C_int{9, 1}},
+ {"ddb.tab_stop_width", []_C_int{9, 4}},
+ {"ddb.trigger", []_C_int{9, 8}},
+ {"fs.posix.setuid", []_C_int{3, 1, 1}},
+ {"hw.allowpowerdown", []_C_int{6, 22}},
+ {"hw.byteorder", []_C_int{6, 4}},
+ {"hw.cpuspeed", []_C_int{6, 12}},
+ {"hw.diskcount", []_C_int{6, 10}},
+ {"hw.disknames", []_C_int{6, 8}},
+ {"hw.diskstats", []_C_int{6, 9}},
+ {"hw.machine", []_C_int{6, 1}},
+ {"hw.model", []_C_int{6, 2}},
+ {"hw.ncpu", []_C_int{6, 3}},
+ {"hw.ncpufound", []_C_int{6, 21}},
+ {"hw.pagesize", []_C_int{6, 7}},
+ {"hw.physmem", []_C_int{6, 19}},
+ {"hw.product", []_C_int{6, 15}},
+ {"hw.serialno", []_C_int{6, 17}},
+ {"hw.setperf", []_C_int{6, 13}},
+ {"hw.usermem", []_C_int{6, 20}},
+ {"hw.uuid", []_C_int{6, 18}},
+ {"hw.vendor", []_C_int{6, 14}},
+ {"hw.version", []_C_int{6, 16}},
+ {"kern.arandom", []_C_int{1, 37}},
+ {"kern.argmax", []_C_int{1, 8}},
+ {"kern.boottime", []_C_int{1, 21}},
+ {"kern.bufcachepercent", []_C_int{1, 72}},
+ {"kern.ccpu", []_C_int{1, 45}},
+ {"kern.clockrate", []_C_int{1, 12}},
+ {"kern.consdev", []_C_int{1, 75}},
+ {"kern.cp_time", []_C_int{1, 40}},
+ {"kern.cp_time2", []_C_int{1, 71}},
+ {"kern.cryptodevallowsoft", []_C_int{1, 53}},
+ {"kern.domainname", []_C_int{1, 22}},
+ {"kern.file", []_C_int{1, 73}},
+ {"kern.forkstat", []_C_int{1, 42}},
+ {"kern.fscale", []_C_int{1, 46}},
+ {"kern.fsync", []_C_int{1, 33}},
+ {"kern.hostid", []_C_int{1, 11}},
+ {"kern.hostname", []_C_int{1, 10}},
+ {"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}},
+ {"kern.job_control", []_C_int{1, 19}},
+ {"kern.malloc.buckets", []_C_int{1, 39, 1}},
+ {"kern.malloc.kmemnames", []_C_int{1, 39, 3}},
+ {"kern.maxclusters", []_C_int{1, 67}},
+ {"kern.maxfiles", []_C_int{1, 7}},
+ {"kern.maxlocksperuid", []_C_int{1, 70}},
+ {"kern.maxpartitions", []_C_int{1, 23}},
+ {"kern.maxproc", []_C_int{1, 6}},
+ {"kern.maxthread", []_C_int{1, 25}},
+ {"kern.maxvnodes", []_C_int{1, 5}},
+ {"kern.mbstat", []_C_int{1, 59}},
+ {"kern.msgbuf", []_C_int{1, 48}},
+ {"kern.msgbufsize", []_C_int{1, 38}},
+ {"kern.nchstats", []_C_int{1, 41}},
+ {"kern.netlivelocks", []_C_int{1, 76}},
+ {"kern.nfiles", []_C_int{1, 56}},
+ {"kern.ngroups", []_C_int{1, 18}},
+ {"kern.nosuidcoredump", []_C_int{1, 32}},
+ {"kern.nprocs", []_C_int{1, 47}},
+ {"kern.nselcoll", []_C_int{1, 43}},
+ {"kern.nthreads", []_C_int{1, 26}},
+ {"kern.numvnodes", []_C_int{1, 58}},
+ {"kern.osrelease", []_C_int{1, 2}},
+ {"kern.osrevision", []_C_int{1, 3}},
+ {"kern.ostype", []_C_int{1, 1}},
+ {"kern.osversion", []_C_int{1, 27}},
+ {"kern.pool_debug", []_C_int{1, 77}},
+ {"kern.posix1version", []_C_int{1, 17}},
+ {"kern.proc", []_C_int{1, 66}},
+ {"kern.random", []_C_int{1, 31}},
+ {"kern.rawpartition", []_C_int{1, 24}},
+ {"kern.saved_ids", []_C_int{1, 20}},
+ {"kern.securelevel", []_C_int{1, 9}},
+ {"kern.seminfo", []_C_int{1, 61}},
+ {"kern.shminfo", []_C_int{1, 62}},
+ {"kern.somaxconn", []_C_int{1, 28}},
+ {"kern.sominconn", []_C_int{1, 29}},
+ {"kern.splassert", []_C_int{1, 54}},
+ {"kern.stackgap_random", []_C_int{1, 50}},
+ {"kern.sysvipc_info", []_C_int{1, 51}},
+ {"kern.sysvmsg", []_C_int{1, 34}},
+ {"kern.sysvsem", []_C_int{1, 35}},
+ {"kern.sysvshm", []_C_int{1, 36}},
+ {"kern.timecounter.choice", []_C_int{1, 69, 4}},
+ {"kern.timecounter.hardware", []_C_int{1, 69, 3}},
+ {"kern.timecounter.tick", []_C_int{1, 69, 1}},
+ {"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}},
+ {"kern.tty.maxptys", []_C_int{1, 44, 6}},
+ {"kern.tty.nptys", []_C_int{1, 44, 7}},
+ {"kern.tty.tk_cancc", []_C_int{1, 44, 4}},
+ {"kern.tty.tk_nin", []_C_int{1, 44, 1}},
+ {"kern.tty.tk_nout", []_C_int{1, 44, 2}},
+ {"kern.tty.tk_rawcc", []_C_int{1, 44, 3}},
+ {"kern.tty.ttyinfo", []_C_int{1, 44, 5}},
+ {"kern.ttycount", []_C_int{1, 57}},
+ {"kern.userasymcrypto", []_C_int{1, 60}},
+ {"kern.usercrypto", []_C_int{1, 52}},
+ {"kern.usermount", []_C_int{1, 30}},
+ {"kern.version", []_C_int{1, 4}},
+ {"kern.vnode", []_C_int{1, 13}},
+ {"kern.watchdog.auto", []_C_int{1, 64, 2}},
+ {"kern.watchdog.period", []_C_int{1, 64, 1}},
+ {"net.bpf.bufsize", []_C_int{4, 31, 1}},
+ {"net.bpf.maxbufsize", []_C_int{4, 31, 2}},
+ {"net.inet.ah.enable", []_C_int{4, 2, 51, 1}},
+ {"net.inet.ah.stats", []_C_int{4, 2, 51, 2}},
+ {"net.inet.carp.allow", []_C_int{4, 2, 112, 1}},
+ {"net.inet.carp.log", []_C_int{4, 2, 112, 3}},
+ {"net.inet.carp.preempt", []_C_int{4, 2, 112, 2}},
+ {"net.inet.carp.stats", []_C_int{4, 2, 112, 4}},
+ {"net.inet.divert.recvspace", []_C_int{4, 2, 258, 1}},
+ {"net.inet.divert.sendspace", []_C_int{4, 2, 258, 2}},
+ {"net.inet.divert.stats", []_C_int{4, 2, 258, 3}},
+ {"net.inet.esp.enable", []_C_int{4, 2, 50, 1}},
+ {"net.inet.esp.stats", []_C_int{4, 2, 50, 4}},
+ {"net.inet.esp.udpencap", []_C_int{4, 2, 50, 2}},
+ {"net.inet.esp.udpencap_port", []_C_int{4, 2, 50, 3}},
+ {"net.inet.etherip.allow", []_C_int{4, 2, 97, 1}},
+ {"net.inet.etherip.stats", []_C_int{4, 2, 97, 2}},
+ {"net.inet.gre.allow", []_C_int{4, 2, 47, 1}},
+ {"net.inet.gre.wccp", []_C_int{4, 2, 47, 2}},
+ {"net.inet.icmp.bmcastecho", []_C_int{4, 2, 1, 2}},
+ {"net.inet.icmp.errppslimit", []_C_int{4, 2, 1, 3}},
+ {"net.inet.icmp.maskrepl", []_C_int{4, 2, 1, 1}},
+ {"net.inet.icmp.rediraccept", []_C_int{4, 2, 1, 4}},
+ {"net.inet.icmp.redirtimeout", []_C_int{4, 2, 1, 5}},
+ {"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}},
+ {"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}},
+ {"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}},
+ {"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}},
+ {"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}},
+ {"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}},
+ {"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}},
+ {"net.inet.ip.ifq.drops", []_C_int{4, 2, 0, 30, 3}},
+ {"net.inet.ip.ifq.len", []_C_int{4, 2, 0, 30, 1}},
+ {"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}},
+ {"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}},
+ {"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}},
+ {"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}},
+ {"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}},
+ {"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}},
+ {"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}},
+ {"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}},
+ {"net.inet.ip.multipath", []_C_int{4, 2, 0, 32}},
+ {"net.inet.ip.portfirst", []_C_int{4, 2, 0, 7}},
+ {"net.inet.ip.porthifirst", []_C_int{4, 2, 0, 9}},
+ {"net.inet.ip.porthilast", []_C_int{4, 2, 0, 10}},
+ {"net.inet.ip.portlast", []_C_int{4, 2, 0, 8}},
+ {"net.inet.ip.redirect", []_C_int{4, 2, 0, 2}},
+ {"net.inet.ip.sourceroute", []_C_int{4, 2, 0, 5}},
+ {"net.inet.ip.stats", []_C_int{4, 2, 0, 33}},
+ {"net.inet.ip.ttl", []_C_int{4, 2, 0, 3}},
+ {"net.inet.ipcomp.enable", []_C_int{4, 2, 108, 1}},
+ {"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}},
+ {"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}},
+ {"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}},
+ {"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}},
+ {"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}},
+ {"net.inet.pim.stats", []_C_int{4, 2, 103, 1}},
+ {"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}},
+ {"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}},
+ {"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}},
+ {"net.inet.tcp.drop", []_C_int{4, 2, 6, 19}},
+ {"net.inet.tcp.ecn", []_C_int{4, 2, 6, 14}},
+ {"net.inet.tcp.ident", []_C_int{4, 2, 6, 9}},
+ {"net.inet.tcp.keepidle", []_C_int{4, 2, 6, 3}},
+ {"net.inet.tcp.keepinittime", []_C_int{4, 2, 6, 2}},
+ {"net.inet.tcp.keepintvl", []_C_int{4, 2, 6, 4}},
+ {"net.inet.tcp.mssdflt", []_C_int{4, 2, 6, 11}},
+ {"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}},
+ {"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}},
+ {"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}},
+ {"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}},
+ {"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}},
+ {"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}},
+ {"net.inet.tcp.slowhz", []_C_int{4, 2, 6, 5}},
+ {"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}},
+ {"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}},
+ {"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}},
+ {"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}},
+ {"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}},
+ {"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}},
+ {"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}},
+ {"net.inet.udp.stats", []_C_int{4, 2, 17, 5}},
+ {"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}},
+ {"net.inet6.divert.sendspace", []_C_int{4, 24, 86, 2}},
+ {"net.inet6.divert.stats", []_C_int{4, 24, 86, 3}},
+ {"net.inet6.icmp6.errppslimit", []_C_int{4, 24, 30, 14}},
+ {"net.inet6.icmp6.mtudisc_hiwat", []_C_int{4, 24, 30, 16}},
+ {"net.inet6.icmp6.mtudisc_lowat", []_C_int{4, 24, 30, 17}},
+ {"net.inet6.icmp6.nd6_debug", []_C_int{4, 24, 30, 18}},
+ {"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}},
+ {"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}},
+ {"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}},
+ {"net.inet6.icmp6.nd6_prune", []_C_int{4, 24, 30, 6}},
+ {"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}},
+ {"net.inet6.icmp6.nd6_useloopback", []_C_int{4, 24, 30, 11}},
+ {"net.inet6.icmp6.nodeinfo", []_C_int{4, 24, 30, 13}},
+ {"net.inet6.icmp6.rediraccept", []_C_int{4, 24, 30, 2}},
+ {"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}},
+ {"net.inet6.ip6.accept_rtadv", []_C_int{4, 24, 17, 12}},
+ {"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}},
+ {"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}},
+ {"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}},
+ {"net.inet6.ip6.defmcasthlim", []_C_int{4, 24, 17, 18}},
+ {"net.inet6.ip6.forwarding", []_C_int{4, 24, 17, 1}},
+ {"net.inet6.ip6.forwsrcrt", []_C_int{4, 24, 17, 5}},
+ {"net.inet6.ip6.hdrnestlimit", []_C_int{4, 24, 17, 15}},
+ {"net.inet6.ip6.hlim", []_C_int{4, 24, 17, 3}},
+ {"net.inet6.ip6.log_interval", []_C_int{4, 24, 17, 14}},
+ {"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}},
+ {"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}},
+ {"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}},
+ {"net.inet6.ip6.maxifdefrouters", []_C_int{4, 24, 17, 47}},
+ {"net.inet6.ip6.maxifprefixes", []_C_int{4, 24, 17, 46}},
+ {"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}},
+ {"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}},
+ {"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}},
+ {"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}},
+ {"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}},
+ {"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}},
+ {"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}},
+ {"net.inet6.ip6.rr_prune", []_C_int{4, 24, 17, 22}},
+ {"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}},
+ {"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}},
+ {"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}},
+ {"net.inet6.ip6.v6only", []_C_int{4, 24, 17, 24}},
+ {"net.key.sadb_dump", []_C_int{4, 30, 1}},
+ {"net.key.spd_dump", []_C_int{4, 30, 2}},
+ {"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}},
+ {"net.mpls.ifq.drops", []_C_int{4, 33, 3, 3}},
+ {"net.mpls.ifq.len", []_C_int{4, 33, 3, 1}},
+ {"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}},
+ {"net.mpls.mapttl_ip", []_C_int{4, 33, 5}},
+ {"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}},
+ {"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}},
+ {"net.mpls.ttl", []_C_int{4, 33, 2}},
+ {"net.pflow.stats", []_C_int{4, 34, 1}},
+ {"net.pipex.enable", []_C_int{4, 35, 1}},
+ {"vm.anonmin", []_C_int{2, 7}},
+ {"vm.loadavg", []_C_int{2, 2}},
+ {"vm.maxslp", []_C_int{2, 10}},
+ {"vm.nkmempages", []_C_int{2, 6}},
+ {"vm.psstrings", []_C_int{2, 3}},
+ {"vm.swapencrypt.enable", []_C_int{2, 5, 0}},
+ {"vm.swapencrypt.keyscreated", []_C_int{2, 5, 1}},
+ {"vm.swapencrypt.keysdeleted", []_C_int{2, 5, 2}},
+ {"vm.uspace", []_C_int{2, 11}},
+ {"vm.uvmexp", []_C_int{2, 4}},
+ {"vm.vmmeter", []_C_int{2, 1}},
+ {"vm.vnodemin", []_C_int{2, 9}},
+ {"vm.vtextmin", []_C_int{2, 8}},
+}
diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go
new file mode 100644
index 0000000..83bb935
--- /dev/null
+++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go
@@ -0,0 +1,270 @@
+// mksysctl_openbsd.pl
+// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT
+
+package unix
+
+type mibentry struct {
+ ctlname string
+ ctloid []_C_int
+}
+
+var sysctlMib = []mibentry{
+ {"ddb.console", []_C_int{9, 6}},
+ {"ddb.log", []_C_int{9, 7}},
+ {"ddb.max_line", []_C_int{9, 3}},
+ {"ddb.max_width", []_C_int{9, 2}},
+ {"ddb.panic", []_C_int{9, 5}},
+ {"ddb.radix", []_C_int{9, 1}},
+ {"ddb.tab_stop_width", []_C_int{9, 4}},
+ {"ddb.trigger", []_C_int{9, 8}},
+ {"fs.posix.setuid", []_C_int{3, 1, 1}},
+ {"hw.allowpowerdown", []_C_int{6, 22}},
+ {"hw.byteorder", []_C_int{6, 4}},
+ {"hw.cpuspeed", []_C_int{6, 12}},
+ {"hw.diskcount", []_C_int{6, 10}},
+ {"hw.disknames", []_C_int{6, 8}},
+ {"hw.diskstats", []_C_int{6, 9}},
+ {"hw.machine", []_C_int{6, 1}},
+ {"hw.model", []_C_int{6, 2}},
+ {"hw.ncpu", []_C_int{6, 3}},
+ {"hw.ncpufound", []_C_int{6, 21}},
+ {"hw.pagesize", []_C_int{6, 7}},
+ {"hw.physmem", []_C_int{6, 19}},
+ {"hw.product", []_C_int{6, 15}},
+ {"hw.serialno", []_C_int{6, 17}},
+ {"hw.setperf", []_C_int{6, 13}},
+ {"hw.usermem", []_C_int{6, 20}},
+ {"hw.uuid", []_C_int{6, 18}},
+ {"hw.vendor", []_C_int{6, 14}},
+ {"hw.version", []_C_int{6, 16}},
+ {"kern.arandom", []_C_int{1, 37}},
+ {"kern.argmax", []_C_int{1, 8}},
+ {"kern.boottime", []_C_int{1, 21}},
+ {"kern.bufcachepercent", []_C_int{1, 72}},
+ {"kern.ccpu", []_C_int{1, 45}},
+ {"kern.clockrate", []_C_int{1, 12}},
+ {"kern.consdev", []_C_int{1, 75}},
+ {"kern.cp_time", []_C_int{1, 40}},
+ {"kern.cp_time2", []_C_int{1, 71}},
+ {"kern.cryptodevallowsoft", []_C_int{1, 53}},
+ {"kern.domainname", []_C_int{1, 22}},
+ {"kern.file", []_C_int{1, 73}},
+ {"kern.forkstat", []_C_int{1, 42}},
+ {"kern.fscale", []_C_int{1, 46}},
+ {"kern.fsync", []_C_int{1, 33}},
+ {"kern.hostid", []_C_int{1, 11}},
+ {"kern.hostname", []_C_int{1, 10}},
+ {"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}},
+ {"kern.job_control", []_C_int{1, 19}},
+ {"kern.malloc.buckets", []_C_int{1, 39, 1}},
+ {"kern.malloc.kmemnames", []_C_int{1, 39, 3}},
+ {"kern.maxclusters", []_C_int{1, 67}},
+ {"kern.maxfiles", []_C_int{1, 7}},
+ {"kern.maxlocksperuid", []_C_int{1, 70}},
+ {"kern.maxpartitions", []_C_int{1, 23}},
+ {"kern.maxproc", []_C_int{1, 6}},
+ {"kern.maxthread", []_C_int{1, 25}},
+ {"kern.maxvnodes", []_C_int{1, 5}},
+ {"kern.mbstat", []_C_int{1, 59}},
+ {"kern.msgbuf", []_C_int{1, 48}},
+ {"kern.msgbufsize", []_C_int{1, 38}},
+ {"kern.nchstats", []_C_int{1, 41}},
+ {"kern.netlivelocks", []_C_int{1, 76}},
+ {"kern.nfiles", []_C_int{1, 56}},
+ {"kern.ngroups", []_C_int{1, 18}},
+ {"kern.nosuidcoredump", []_C_int{1, 32}},
+ {"kern.nprocs", []_C_int{1, 47}},
+ {"kern.nselcoll", []_C_int{1, 43}},
+ {"kern.nthreads", []_C_int{1, 26}},
+ {"kern.numvnodes", []_C_int{1, 58}},
+ {"kern.osrelease", []_C_int{1, 2}},
+ {"kern.osrevision", []_C_int{1, 3}},
+ {"kern.ostype", []_C_int{1, 1}},
+ {"kern.osversion", []_C_int{1, 27}},
+ {"kern.pool_debug", []_C_int{1, 77}},
+ {"kern.posix1version", []_C_int{1, 17}},
+ {"kern.proc", []_C_int{1, 66}},
+ {"kern.random", []_C_int{1, 31}},
+ {"kern.rawpartition", []_C_int{1, 24}},
+ {"kern.saved_ids", []_C_int{1, 20}},
+ {"kern.securelevel", []_C_int{1, 9}},
+ {"kern.seminfo", []_C_int{1, 61}},
+ {"kern.shminfo", []_C_int{1, 62}},
+ {"kern.somaxconn", []_C_int{1, 28}},
+ {"kern.sominconn", []_C_int{1, 29}},
+ {"kern.splassert", []_C_int{1, 54}},
+ {"kern.stackgap_random", []_C_int{1, 50}},
+ {"kern.sysvipc_info", []_C_int{1, 51}},
+ {"kern.sysvmsg", []_C_int{1, 34}},
+ {"kern.sysvsem", []_C_int{1, 35}},
+ {"kern.sysvshm", []_C_int{1, 36}},
+ {"kern.timecounter.choice", []_C_int{1, 69, 4}},
+ {"kern.timecounter.hardware", []_C_int{1, 69, 3}},
+ {"kern.timecounter.tick", []_C_int{1, 69, 1}},
+ {"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}},
+ {"kern.tty.maxptys", []_C_int{1, 44, 6}},
+ {"kern.tty.nptys", []_C_int{1, 44, 7}},
+ {"kern.tty.tk_cancc", []_C_int{1, 44, 4}},
+ {"kern.tty.tk_nin", []_C_int{1, 44, 1}},
+ {"kern.tty.tk_nout", []_C_int{1, 44, 2}},
+ {"kern.tty.tk_rawcc", []_C_int{1, 44, 3}},
+ {"kern.tty.ttyinfo", []_C_int{1, 44, 5}},
+ {"kern.ttycount", []_C_int{1, 57}},
+ {"kern.userasymcrypto", []_C_int{1, 60}},
+ {"kern.usercrypto", []_C_int{1, 52}},
+ {"kern.usermount", []_C_int{1, 30}},
+ {"kern.version", []_C_int{1, 4}},
+ {"kern.vnode", []_C_int{1, 13}},
+ {"kern.watchdog.auto", []_C_int{1, 64, 2}},
+ {"kern.watchdog.period", []_C_int{1, 64, 1}},
+ {"net.bpf.bufsize", []_C_int{4, 31, 1}},
+ {"net.bpf.maxbufsize", []_C_int{4, 31, 2}},
+ {"net.inet.ah.enable", []_C_int{4, 2, 51, 1}},
+ {"net.inet.ah.stats", []_C_int{4, 2, 51, 2}},
+ {"net.inet.carp.allow", []_C_int{4, 2, 112, 1}},
+ {"net.inet.carp.log", []_C_int{4, 2, 112, 3}},
+ {"net.inet.carp.preempt", []_C_int{4, 2, 112, 2}},
+ {"net.inet.carp.stats", []_C_int{4, 2, 112, 4}},
+ {"net.inet.divert.recvspace", []_C_int{4, 2, 258, 1}},
+ {"net.inet.divert.sendspace", []_C_int{4, 2, 258, 2}},
+ {"net.inet.divert.stats", []_C_int{4, 2, 258, 3}},
+ {"net.inet.esp.enable", []_C_int{4, 2, 50, 1}},
+ {"net.inet.esp.stats", []_C_int{4, 2, 50, 4}},
+ {"net.inet.esp.udpencap", []_C_int{4, 2, 50, 2}},
+ {"net.inet.esp.udpencap_port", []_C_int{4, 2, 50, 3}},
+ {"net.inet.etherip.allow", []_C_int{4, 2, 97, 1}},
+ {"net.inet.etherip.stats", []_C_int{4, 2, 97, 2}},
+ {"net.inet.gre.allow", []_C_int{4, 2, 47, 1}},
+ {"net.inet.gre.wccp", []_C_int{4, 2, 47, 2}},
+ {"net.inet.icmp.bmcastecho", []_C_int{4, 2, 1, 2}},
+ {"net.inet.icmp.errppslimit", []_C_int{4, 2, 1, 3}},
+ {"net.inet.icmp.maskrepl", []_C_int{4, 2, 1, 1}},
+ {"net.inet.icmp.rediraccept", []_C_int{4, 2, 1, 4}},
+ {"net.inet.icmp.redirtimeout", []_C_int{4, 2, 1, 5}},
+ {"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}},
+ {"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}},
+ {"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}},
+ {"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}},
+ {"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}},
+ {"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}},
+ {"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}},
+ {"net.inet.ip.ifq.drops", []_C_int{4, 2, 0, 30, 3}},
+ {"net.inet.ip.ifq.len", []_C_int{4, 2, 0, 30, 1}},
+ {"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}},
+ {"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}},
+ {"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}},
+ {"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}},
+ {"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}},
+ {"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}},
+ {"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}},
+ {"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}},
+ {"net.inet.ip.multipath", []_C_int{4, 2, 0, 32}},
+ {"net.inet.ip.portfirst", []_C_int{4, 2, 0, 7}},
+ {"net.inet.ip.porthifirst", []_C_int{4, 2, 0, 9}},
+ {"net.inet.ip.porthilast", []_C_int{4, 2, 0, 10}},
+ {"net.inet.ip.portlast", []_C_int{4, 2, 0, 8}},
+ {"net.inet.ip.redirect", []_C_int{4, 2, 0, 2}},
+ {"net.inet.ip.sourceroute", []_C_int{4, 2, 0, 5}},
+ {"net.inet.ip.stats", []_C_int{4, 2, 0, 33}},
+ {"net.inet.ip.ttl", []_C_int{4, 2, 0, 3}},
+ {"net.inet.ipcomp.enable", []_C_int{4, 2, 108, 1}},
+ {"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}},
+ {"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}},
+ {"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}},
+ {"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}},
+ {"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}},
+ {"net.inet.pim.stats", []_C_int{4, 2, 103, 1}},
+ {"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}},
+ {"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}},
+ {"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}},
+ {"net.inet.tcp.drop", []_C_int{4, 2, 6, 19}},
+ {"net.inet.tcp.ecn", []_C_int{4, 2, 6, 14}},
+ {"net.inet.tcp.ident", []_C_int{4, 2, 6, 9}},
+ {"net.inet.tcp.keepidle", []_C_int{4, 2, 6, 3}},
+ {"net.inet.tcp.keepinittime", []_C_int{4, 2, 6, 2}},
+ {"net.inet.tcp.keepintvl", []_C_int{4, 2, 6, 4}},
+ {"net.inet.tcp.mssdflt", []_C_int{4, 2, 6, 11}},
+ {"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}},
+ {"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}},
+ {"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}},
+ {"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}},
+ {"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}},
+ {"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}},
+ {"net.inet.tcp.slowhz", []_C_int{4, 2, 6, 5}},
+ {"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}},
+ {"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}},
+ {"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}},
+ {"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}},
+ {"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}},
+ {"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}},
+ {"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}},
+ {"net.inet.udp.stats", []_C_int{4, 2, 17, 5}},
+ {"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}},
+ {"net.inet6.divert.sendspace", []_C_int{4, 24, 86, 2}},
+ {"net.inet6.divert.stats", []_C_int{4, 24, 86, 3}},
+ {"net.inet6.icmp6.errppslimit", []_C_int{4, 24, 30, 14}},
+ {"net.inet6.icmp6.mtudisc_hiwat", []_C_int{4, 24, 30, 16}},
+ {"net.inet6.icmp6.mtudisc_lowat", []_C_int{4, 24, 30, 17}},
+ {"net.inet6.icmp6.nd6_debug", []_C_int{4, 24, 30, 18}},
+ {"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}},
+ {"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}},
+ {"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}},
+ {"net.inet6.icmp6.nd6_prune", []_C_int{4, 24, 30, 6}},
+ {"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}},
+ {"net.inet6.icmp6.nd6_useloopback", []_C_int{4, 24, 30, 11}},
+ {"net.inet6.icmp6.nodeinfo", []_C_int{4, 24, 30, 13}},
+ {"net.inet6.icmp6.rediraccept", []_C_int{4, 24, 30, 2}},
+ {"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}},
+ {"net.inet6.ip6.accept_rtadv", []_C_int{4, 24, 17, 12}},
+ {"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}},
+ {"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}},
+ {"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}},
+ {"net.inet6.ip6.defmcasthlim", []_C_int{4, 24, 17, 18}},
+ {"net.inet6.ip6.forwarding", []_C_int{4, 24, 17, 1}},
+ {"net.inet6.ip6.forwsrcrt", []_C_int{4, 24, 17, 5}},
+ {"net.inet6.ip6.hdrnestlimit", []_C_int{4, 24, 17, 15}},
+ {"net.inet6.ip6.hlim", []_C_int{4, 24, 17, 3}},
+ {"net.inet6.ip6.log_interval", []_C_int{4, 24, 17, 14}},
+ {"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}},
+ {"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}},
+ {"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}},
+ {"net.inet6.ip6.maxifdefrouters", []_C_int{4, 24, 17, 47}},
+ {"net.inet6.ip6.maxifprefixes", []_C_int{4, 24, 17, 46}},
+ {"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}},
+ {"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}},
+ {"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}},
+ {"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}},
+ {"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}},
+ {"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}},
+ {"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}},
+ {"net.inet6.ip6.rr_prune", []_C_int{4, 24, 17, 22}},
+ {"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}},
+ {"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}},
+ {"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}},
+ {"net.inet6.ip6.v6only", []_C_int{4, 24, 17, 24}},
+ {"net.key.sadb_dump", []_C_int{4, 30, 1}},
+ {"net.key.spd_dump", []_C_int{4, 30, 2}},
+ {"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}},
+ {"net.mpls.ifq.drops", []_C_int{4, 33, 3, 3}},
+ {"net.mpls.ifq.len", []_C_int{4, 33, 3, 1}},
+ {"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}},
+ {"net.mpls.mapttl_ip", []_C_int{4, 33, 5}},
+ {"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}},
+ {"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}},
+ {"net.mpls.ttl", []_C_int{4, 33, 2}},
+ {"net.pflow.stats", []_C_int{4, 34, 1}},
+ {"net.pipex.enable", []_C_int{4, 35, 1}},
+ {"vm.anonmin", []_C_int{2, 7}},
+ {"vm.loadavg", []_C_int{2, 2}},
+ {"vm.maxslp", []_C_int{2, 10}},
+ {"vm.nkmempages", []_C_int{2, 6}},
+ {"vm.psstrings", []_C_int{2, 3}},
+ {"vm.swapencrypt.enable", []_C_int{2, 5, 0}},
+ {"vm.swapencrypt.keyscreated", []_C_int{2, 5, 1}},
+ {"vm.swapencrypt.keysdeleted", []_C_int{2, 5, 2}},
+ {"vm.uspace", []_C_int{2, 11}},
+ {"vm.uvmexp", []_C_int{2, 4}},
+ {"vm.vmmeter", []_C_int{2, 1}},
+ {"vm.vnodemin", []_C_int{2, 9}},
+ {"vm.vtextmin", []_C_int{2, 8}},
+}
diff --git a/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go b/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go
index 2786773..d1d36da 100644
--- a/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go
+++ b/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go
@@ -1,5 +1,5 @@
-// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/sys/syscall.h
-// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT
+// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/sys/syscall.h
+// Code generated by the command above; see README.md. DO NOT EDIT.
// +build 386,darwin
@@ -121,13 +121,15 @@ const (
SYS_CSOPS = 169
SYS_CSOPS_AUDITTOKEN = 170
SYS_WAITID = 173
+ SYS_KDEBUG_TYPEFILTER = 177
+ SYS_KDEBUG_TRACE_STRING = 178
SYS_KDEBUG_TRACE64 = 179
SYS_KDEBUG_TRACE = 180
SYS_SETGID = 181
SYS_SETEGID = 182
SYS_SETEUID = 183
SYS_SIGRETURN = 184
- SYS_CHUD = 185
+ SYS_THREAD_SELFCOUNTS = 186
SYS_FDATASYNC = 187
SYS_STAT = 188
SYS_FSTAT = 189
@@ -278,7 +280,6 @@ const (
SYS_KQUEUE = 362
SYS_KEVENT = 363
SYS_LCHOWN = 364
- SYS_STACK_SNAPSHOT = 365
SYS_BSDTHREAD_REGISTER = 366
SYS_WORKQ_OPEN = 367
SYS_WORKQ_KERNRETURN = 368
@@ -287,6 +288,8 @@ const (
SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371
SYS_THREAD_SELFID = 372
SYS_LEDGER = 373
+ SYS_KEVENT_QOS = 374
+ SYS_KEVENT_ID = 375
SYS___MAC_EXECVE = 380
SYS___MAC_SYSCALL = 381
SYS___MAC_GET_FILE = 382
@@ -298,11 +301,8 @@ const (
SYS___MAC_GET_FD = 388
SYS___MAC_SET_FD = 389
SYS___MAC_GET_PID = 390
- SYS___MAC_GET_LCID = 391
- SYS___MAC_GET_LCTX = 392
- SYS___MAC_SET_LCTX = 393
- SYS_SETLCID = 394
- SYS_GETLCID = 395
+ SYS_PSELECT = 394
+ SYS_PSELECT_NOCANCEL = 395
SYS_READ_NOCANCEL = 396
SYS_WRITE_NOCANCEL = 397
SYS_OPEN_NOCANCEL = 398
@@ -351,6 +351,7 @@ const (
SYS_GUARDED_CLOSE_NP = 442
SYS_GUARDED_KQUEUE_NP = 443
SYS_CHANGE_FDGUARD_NP = 444
+ SYS_USRCTL = 445
SYS_PROC_RLIMIT_CONTROL = 446
SYS_CONNECTX = 447
SYS_DISCONNECTX = 448
@@ -367,6 +368,7 @@ const (
SYS_COALITION_INFO = 459
SYS_NECP_MATCH_POLICY = 460
SYS_GETATTRLISTBULK = 461
+ SYS_CLONEFILEAT = 462
SYS_OPENAT = 463
SYS_OPENAT_NOCANCEL = 464
SYS_RENAMEAT = 465
@@ -392,7 +394,43 @@ const (
SYS_GUARDED_WRITE_NP = 485
SYS_GUARDED_PWRITE_NP = 486
SYS_GUARDED_WRITEV_NP = 487
- SYS_RENAME_EXT = 488
+ SYS_RENAMEATX_NP = 488
SYS_MREMAP_ENCRYPTED = 489
- SYS_MAXSYSCALL = 490
+ SYS_NETAGENT_TRIGGER = 490
+ SYS_STACK_SNAPSHOT_WITH_CONFIG = 491
+ SYS_MICROSTACKSHOT = 492
+ SYS_GRAB_PGO_DATA = 493
+ SYS_PERSONA = 494
+ SYS_WORK_INTERVAL_CTL = 499
+ SYS_GETENTROPY = 500
+ SYS_NECP_OPEN = 501
+ SYS_NECP_CLIENT_ACTION = 502
+ SYS___NEXUS_OPEN = 503
+ SYS___NEXUS_REGISTER = 504
+ SYS___NEXUS_DEREGISTER = 505
+ SYS___NEXUS_CREATE = 506
+ SYS___NEXUS_DESTROY = 507
+ SYS___NEXUS_GET_OPT = 508
+ SYS___NEXUS_SET_OPT = 509
+ SYS___CHANNEL_OPEN = 510
+ SYS___CHANNEL_GET_INFO = 511
+ SYS___CHANNEL_SYNC = 512
+ SYS___CHANNEL_GET_OPT = 513
+ SYS___CHANNEL_SET_OPT = 514
+ SYS_ULOCK_WAIT = 515
+ SYS_ULOCK_WAKE = 516
+ SYS_FCLONEFILEAT = 517
+ SYS_FS_SNAPSHOT = 518
+ SYS_TERMINATE_WITH_PAYLOAD = 520
+ SYS_ABORT_WITH_PAYLOAD = 521
+ SYS_NECP_SESSION_OPEN = 522
+ SYS_NECP_SESSION_ACTION = 523
+ SYS_SETATTRLISTAT = 524
+ SYS_NET_QOS_GUIDELINE = 525
+ SYS_FMOUNT = 526
+ SYS_NTP_ADJTIME = 527
+ SYS_NTP_GETTIME = 528
+ SYS_OS_FAULT_WITH_PAYLOAD = 529
+ SYS_MAXSYSCALL = 530
+ SYS_INVALID = 63
)
diff --git a/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go
index 09de240..e35de41 100644
--- a/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go
@@ -1,5 +1,5 @@
-// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/sys/syscall.h
-// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT
+// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/sys/syscall.h
+// Code generated by the command above; see README.md. DO NOT EDIT.
// +build amd64,darwin
@@ -121,13 +121,15 @@ const (
SYS_CSOPS = 169
SYS_CSOPS_AUDITTOKEN = 170
SYS_WAITID = 173
+ SYS_KDEBUG_TYPEFILTER = 177
+ SYS_KDEBUG_TRACE_STRING = 178
SYS_KDEBUG_TRACE64 = 179
SYS_KDEBUG_TRACE = 180
SYS_SETGID = 181
SYS_SETEGID = 182
SYS_SETEUID = 183
SYS_SIGRETURN = 184
- SYS_CHUD = 185
+ SYS_THREAD_SELFCOUNTS = 186
SYS_FDATASYNC = 187
SYS_STAT = 188
SYS_FSTAT = 189
@@ -278,7 +280,6 @@ const (
SYS_KQUEUE = 362
SYS_KEVENT = 363
SYS_LCHOWN = 364
- SYS_STACK_SNAPSHOT = 365
SYS_BSDTHREAD_REGISTER = 366
SYS_WORKQ_OPEN = 367
SYS_WORKQ_KERNRETURN = 368
@@ -287,6 +288,8 @@ const (
SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371
SYS_THREAD_SELFID = 372
SYS_LEDGER = 373
+ SYS_KEVENT_QOS = 374
+ SYS_KEVENT_ID = 375
SYS___MAC_EXECVE = 380
SYS___MAC_SYSCALL = 381
SYS___MAC_GET_FILE = 382
@@ -298,11 +301,8 @@ const (
SYS___MAC_GET_FD = 388
SYS___MAC_SET_FD = 389
SYS___MAC_GET_PID = 390
- SYS___MAC_GET_LCID = 391
- SYS___MAC_GET_LCTX = 392
- SYS___MAC_SET_LCTX = 393
- SYS_SETLCID = 394
- SYS_GETLCID = 395
+ SYS_PSELECT = 394
+ SYS_PSELECT_NOCANCEL = 395
SYS_READ_NOCANCEL = 396
SYS_WRITE_NOCANCEL = 397
SYS_OPEN_NOCANCEL = 398
@@ -351,6 +351,7 @@ const (
SYS_GUARDED_CLOSE_NP = 442
SYS_GUARDED_KQUEUE_NP = 443
SYS_CHANGE_FDGUARD_NP = 444
+ SYS_USRCTL = 445
SYS_PROC_RLIMIT_CONTROL = 446
SYS_CONNECTX = 447
SYS_DISCONNECTX = 448
@@ -367,6 +368,7 @@ const (
SYS_COALITION_INFO = 459
SYS_NECP_MATCH_POLICY = 460
SYS_GETATTRLISTBULK = 461
+ SYS_CLONEFILEAT = 462
SYS_OPENAT = 463
SYS_OPENAT_NOCANCEL = 464
SYS_RENAMEAT = 465
@@ -392,7 +394,43 @@ const (
SYS_GUARDED_WRITE_NP = 485
SYS_GUARDED_PWRITE_NP = 486
SYS_GUARDED_WRITEV_NP = 487
- SYS_RENAME_EXT = 488
+ SYS_RENAMEATX_NP = 488
SYS_MREMAP_ENCRYPTED = 489
- SYS_MAXSYSCALL = 490
+ SYS_NETAGENT_TRIGGER = 490
+ SYS_STACK_SNAPSHOT_WITH_CONFIG = 491
+ SYS_MICROSTACKSHOT = 492
+ SYS_GRAB_PGO_DATA = 493
+ SYS_PERSONA = 494
+ SYS_WORK_INTERVAL_CTL = 499
+ SYS_GETENTROPY = 500
+ SYS_NECP_OPEN = 501
+ SYS_NECP_CLIENT_ACTION = 502
+ SYS___NEXUS_OPEN = 503
+ SYS___NEXUS_REGISTER = 504
+ SYS___NEXUS_DEREGISTER = 505
+ SYS___NEXUS_CREATE = 506
+ SYS___NEXUS_DESTROY = 507
+ SYS___NEXUS_GET_OPT = 508
+ SYS___NEXUS_SET_OPT = 509
+ SYS___CHANNEL_OPEN = 510
+ SYS___CHANNEL_GET_INFO = 511
+ SYS___CHANNEL_SYNC = 512
+ SYS___CHANNEL_GET_OPT = 513
+ SYS___CHANNEL_SET_OPT = 514
+ SYS_ULOCK_WAIT = 515
+ SYS_ULOCK_WAKE = 516
+ SYS_FCLONEFILEAT = 517
+ SYS_FS_SNAPSHOT = 518
+ SYS_TERMINATE_WITH_PAYLOAD = 520
+ SYS_ABORT_WITH_PAYLOAD = 521
+ SYS_NECP_SESSION_OPEN = 522
+ SYS_NECP_SESSION_ACTION = 523
+ SYS_SETATTRLISTAT = 524
+ SYS_NET_QOS_GUIDELINE = 525
+ SYS_FMOUNT = 526
+ SYS_NTP_ADJTIME = 527
+ SYS_NTP_GETTIME = 528
+ SYS_OS_FAULT_WITH_PAYLOAD = 529
+ SYS_MAXSYSCALL = 530
+ SYS_INVALID = 63
)
diff --git a/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go
index 41cb6ed..f2df27d 100644
--- a/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go
+++ b/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go
@@ -1,4 +1,4 @@
-// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.2.sdk/usr/include/sys/syscall.h
+// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/sys/syscall.h
// Code generated by the command above; see README.md. DO NOT EDIT.
// +build arm,darwin
@@ -129,6 +129,7 @@ const (
SYS_SETEGID = 182
SYS_SETEUID = 183
SYS_SIGRETURN = 184
+ SYS_THREAD_SELFCOUNTS = 186
SYS_FDATASYNC = 187
SYS_STAT = 188
SYS_FSTAT = 189
@@ -288,6 +289,7 @@ const (
SYS_THREAD_SELFID = 372
SYS_LEDGER = 373
SYS_KEVENT_QOS = 374
+ SYS_KEVENT_ID = 375
SYS___MAC_EXECVE = 380
SYS___MAC_SYSCALL = 381
SYS___MAC_GET_FILE = 382
@@ -421,6 +423,14 @@ const (
SYS_FS_SNAPSHOT = 518
SYS_TERMINATE_WITH_PAYLOAD = 520
SYS_ABORT_WITH_PAYLOAD = 521
- SYS_MAXSYSCALL = 522
+ SYS_NECP_SESSION_OPEN = 522
+ SYS_NECP_SESSION_ACTION = 523
+ SYS_SETATTRLISTAT = 524
+ SYS_NET_QOS_GUIDELINE = 525
+ SYS_FMOUNT = 526
+ SYS_NTP_ADJTIME = 527
+ SYS_NTP_GETTIME = 528
+ SYS_OS_FAULT_WITH_PAYLOAD = 529
+ SYS_MAXSYSCALL = 530
SYS_INVALID = 63
)
diff --git a/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go
index 075816c..9694630 100644
--- a/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go
+++ b/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go
@@ -1,4 +1,4 @@
-// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.2.sdk/usr/include/sys/syscall.h
+// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/sys/syscall.h
// Code generated by the command above; see README.md. DO NOT EDIT.
// +build arm64,darwin
@@ -129,6 +129,7 @@ const (
SYS_SETEGID = 182
SYS_SETEUID = 183
SYS_SIGRETURN = 184
+ SYS_THREAD_SELFCOUNTS = 186
SYS_FDATASYNC = 187
SYS_STAT = 188
SYS_FSTAT = 189
@@ -288,6 +289,7 @@ const (
SYS_THREAD_SELFID = 372
SYS_LEDGER = 373
SYS_KEVENT_QOS = 374
+ SYS_KEVENT_ID = 375
SYS___MAC_EXECVE = 380
SYS___MAC_SYSCALL = 381
SYS___MAC_GET_FILE = 382
@@ -421,6 +423,14 @@ const (
SYS_FS_SNAPSHOT = 518
SYS_TERMINATE_WITH_PAYLOAD = 520
SYS_ABORT_WITH_PAYLOAD = 521
- SYS_MAXSYSCALL = 522
+ SYS_NECP_SESSION_OPEN = 522
+ SYS_NECP_SESSION_ACTION = 523
+ SYS_SETATTRLISTAT = 524
+ SYS_NET_QOS_GUIDELINE = 525
+ SYS_FMOUNT = 526
+ SYS_NTP_ADJTIME = 527
+ SYS_NTP_GETTIME = 528
+ SYS_OS_FAULT_WITH_PAYLOAD = 529
+ SYS_MAXSYSCALL = 530
SYS_INVALID = 63
)
diff --git a/vendor/golang.org/x/sys/unix/zsysnum_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_solaris_amd64.go
deleted file mode 100644
index c708659..0000000
--- a/vendor/golang.org/x/sys/unix/zsysnum_solaris_amd64.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build amd64,solaris
-
-package unix
-
-// TODO(aram): remove these before Go 1.3.
-const (
- SYS_EXECVE = 59
- SYS_FCNTL = 62
-)
diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go
index e61d78a..bc4bc89 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go
@@ -460,3 +460,30 @@ const (
AT_SYMLINK_FOLLOW = 0x40
AT_SYMLINK_NOFOLLOW = 0x20
)
+
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLIN = 0x1
+ POLLNVAL = 0x20
+ POLLOUT = 0x4
+ POLLPRI = 0x2
+ POLLRDBAND = 0x80
+ POLLRDNORM = 0x40
+ POLLWRBAND = 0x100
+ POLLWRNORM = 0x4
+)
+
+type Utsname struct {
+ Sysname [256]byte
+ Nodename [256]byte
+ Release [256]byte
+ Version [256]byte
+ Machine [256]byte
+}
diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go
index 2619155..d8abcab 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go
@@ -470,3 +470,30 @@ const (
AT_SYMLINK_FOLLOW = 0x40
AT_SYMLINK_NOFOLLOW = 0x20
)
+
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLIN = 0x1
+ POLLNVAL = 0x20
+ POLLOUT = 0x4
+ POLLPRI = 0x2
+ POLLRDBAND = 0x80
+ POLLRDNORM = 0x40
+ POLLWRBAND = 0x100
+ POLLWRNORM = 0x4
+)
+
+type Utsname struct {
+ Sysname [256]byte
+ Nodename [256]byte
+ Release [256]byte
+ Version [256]byte
+ Machine [256]byte
+}
diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go
index 4dca0d4..9749c9f 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go
@@ -461,3 +461,30 @@ const (
AT_SYMLINK_FOLLOW = 0x40
AT_SYMLINK_NOFOLLOW = 0x20
)
+
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLIN = 0x1
+ POLLNVAL = 0x20
+ POLLOUT = 0x4
+ POLLPRI = 0x2
+ POLLRDBAND = 0x80
+ POLLRDNORM = 0x40
+ POLLWRBAND = 0x100
+ POLLWRNORM = 0x4
+)
+
+type Utsname struct {
+ Sysname [256]byte
+ Nodename [256]byte
+ Release [256]byte
+ Version [256]byte
+ Machine [256]byte
+}
diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go
index f2881fd..810b0bd 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go
@@ -1,6 +1,7 @@
+// cgo -godefs types_darwin.go | go run mkpost.go
+// Code generated by the command above; see README.md. DO NOT EDIT.
+
// +build arm64,darwin
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs types_darwin.go
package unix
@@ -469,3 +470,30 @@ const (
AT_SYMLINK_FOLLOW = 0x40
AT_SYMLINK_NOFOLLOW = 0x20
)
+
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLIN = 0x1
+ POLLNVAL = 0x20
+ POLLOUT = 0x4
+ POLLPRI = 0x2
+ POLLRDBAND = 0x80
+ POLLRDNORM = 0x40
+ POLLWRBAND = 0x100
+ POLLWRNORM = 0x4
+)
+
+type Utsname struct {
+ Sysname [256]byte
+ Nodename [256]byte
+ Release [256]byte
+ Version [256]byte
+ Machine [256]byte
+}
diff --git a/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go
index 67c6bf8..e3b8ebb 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go
@@ -143,6 +143,10 @@ type Fsid struct {
Val [2]int32
}
+const (
+ PathMax = 0x400
+)
+
type RawSockaddrInet4 struct {
Len uint8
Family uint8
@@ -442,7 +446,41 @@ type Termios struct {
Ospeed uint32
}
+type Winsize struct {
+ Row uint16
+ Col uint16
+ Xpixel uint16
+ Ypixel uint16
+}
+
const (
AT_FDCWD = 0xfffafdcd
AT_SYMLINK_NOFOLLOW = 0x1
)
+
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLIN = 0x1
+ POLLNVAL = 0x20
+ POLLOUT = 0x4
+ POLLPRI = 0x2
+ POLLRDBAND = 0x80
+ POLLRDNORM = 0x40
+ POLLWRBAND = 0x100
+ POLLWRNORM = 0x4
+)
+
+type Utsname struct {
+ Sysname [32]byte
+ Nodename [32]byte
+ Release [32]byte
+ Version [32]byte
+ Machine [32]byte
+}
diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go
index 5b28bcb..878a21a 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go
@@ -140,6 +140,10 @@ type Fsid struct {
Val [2]int32
}
+const (
+ PathMax = 0x400
+)
+
const (
FADV_NORMAL = 0x0
FADV_RANDOM = 0x1
@@ -516,6 +520,34 @@ const (
AT_SYMLINK_NOFOLLOW = 0x200
)
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLIN = 0x1
+ POLLINIGNEOF = 0x2000
+ POLLNVAL = 0x20
+ POLLOUT = 0x4
+ POLLPRI = 0x2
+ POLLRDBAND = 0x80
+ POLLRDNORM = 0x40
+ POLLWRBAND = 0x100
+ POLLWRNORM = 0x4
+)
+
type CapRights struct {
Rights [2]uint64
}
+
+type Utsname struct {
+ Sysname [256]byte
+ Nodename [256]byte
+ Release [256]byte
+ Version [256]byte
+ Machine [256]byte
+}
diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go
index c65d89e..8408af1 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go
@@ -140,6 +140,10 @@ type Fsid struct {
Val [2]int32
}
+const (
+ PathMax = 0x400
+)
+
const (
FADV_NORMAL = 0x0
FADV_RANDOM = 0x1
@@ -519,6 +523,34 @@ const (
AT_SYMLINK_NOFOLLOW = 0x200
)
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLIN = 0x1
+ POLLINIGNEOF = 0x2000
+ POLLNVAL = 0x20
+ POLLOUT = 0x4
+ POLLPRI = 0x2
+ POLLRDBAND = 0x80
+ POLLRDNORM = 0x40
+ POLLWRBAND = 0x100
+ POLLWRNORM = 0x4
+)
+
type CapRights struct {
Rights [2]uint64
}
+
+type Utsname struct {
+ Sysname [256]byte
+ Nodename [256]byte
+ Release [256]byte
+ Version [256]byte
+ Machine [256]byte
+}
diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go
index 42c0a50..4b2d9a4 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go
@@ -142,6 +142,10 @@ type Fsid struct {
Val [2]int32
}
+const (
+ PathMax = 0x400
+)
+
const (
FADV_NORMAL = 0x0
FADV_RANDOM = 0x1
@@ -519,6 +523,34 @@ const (
AT_SYMLINK_NOFOLLOW = 0x200
)
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLIN = 0x1
+ POLLINIGNEOF = 0x2000
+ POLLNVAL = 0x20
+ POLLOUT = 0x4
+ POLLPRI = 0x2
+ POLLRDBAND = 0x80
+ POLLRDNORM = 0x40
+ POLLWRBAND = 0x100
+ POLLWRNORM = 0x4
+)
+
type CapRights struct {
Rights [2]uint64
}
+
+type Utsname struct {
+ Sysname [256]byte
+ Nodename [256]byte
+ Release [256]byte
+ Version [256]byte
+ Machine [256]byte
+}
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go
index 8b30c69..295a9bd 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go
@@ -621,12 +621,12 @@ type Sysinfo_t struct {
}
type Utsname struct {
- Sysname [65]int8
- Nodename [65]int8
- Release [65]int8
- Version [65]int8
- Machine [65]int8
- Domainname [65]int8
+ Sysname [65]byte
+ Nodename [65]byte
+ Release [65]byte
+ Version [65]byte
+ Machine [65]byte
+ Domainname [65]byte
}
type Ustat_t struct {
@@ -644,6 +644,7 @@ type EpollEvent struct {
const (
AT_FDCWD = -0x64
+ AT_NO_AUTOMOUNT = 0x800
AT_REMOVEDIR = 0x200
AT_SYMLINK_FOLLOW = 0x400
AT_SYMLINK_NOFOLLOW = 0x100
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go
index cf03589..cdd4a1d 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go
@@ -637,12 +637,12 @@ type Sysinfo_t struct {
}
type Utsname struct {
- Sysname [65]int8
- Nodename [65]int8
- Release [65]int8
- Version [65]int8
- Machine [65]int8
- Domainname [65]int8
+ Sysname [65]byte
+ Nodename [65]byte
+ Release [65]byte
+ Version [65]byte
+ Machine [65]byte
+ Domainname [65]byte
}
type Ustat_t struct {
@@ -662,6 +662,7 @@ type EpollEvent struct {
const (
AT_FDCWD = -0x64
+ AT_NO_AUTOMOUNT = 0x800
AT_REMOVEDIR = 0x200
AT_SYMLINK_FOLLOW = 0x400
AT_SYMLINK_NOFOLLOW = 0x100
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go
index 8ef7d85..086620a 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go
@@ -609,12 +609,12 @@ type Sysinfo_t struct {
}
type Utsname struct {
- Sysname [65]uint8
- Nodename [65]uint8
- Release [65]uint8
- Version [65]uint8
- Machine [65]uint8
- Domainname [65]uint8
+ Sysname [65]byte
+ Nodename [65]byte
+ Release [65]byte
+ Version [65]byte
+ Machine [65]byte
+ Domainname [65]byte
}
type Ustat_t struct {
@@ -633,6 +633,7 @@ type EpollEvent struct {
const (
AT_FDCWD = -0x64
+ AT_NO_AUTOMOUNT = 0x800
AT_REMOVEDIR = 0x200
AT_SYMLINK_FOLLOW = 0x400
AT_SYMLINK_NOFOLLOW = 0x100
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go
index 3110268..c53db98 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go
@@ -615,12 +615,12 @@ type Sysinfo_t struct {
}
type Utsname struct {
- Sysname [65]int8
- Nodename [65]int8
- Release [65]int8
- Version [65]int8
- Machine [65]int8
- Domainname [65]int8
+ Sysname [65]byte
+ Nodename [65]byte
+ Release [65]byte
+ Version [65]byte
+ Machine [65]byte
+ Domainname [65]byte
}
type Ustat_t struct {
@@ -641,6 +641,7 @@ type EpollEvent struct {
const (
AT_FDCWD = -0x64
+ AT_NO_AUTOMOUNT = 0x800
AT_REMOVEDIR = 0x200
AT_SYMLINK_FOLLOW = 0x400
AT_SYMLINK_NOFOLLOW = 0x100
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go
index d2c1bc2..69e529b 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go
@@ -614,12 +614,12 @@ type Sysinfo_t struct {
}
type Utsname struct {
- Sysname [65]int8
- Nodename [65]int8
- Release [65]int8
- Version [65]int8
- Machine [65]int8
- Domainname [65]int8
+ Sysname [65]byte
+ Nodename [65]byte
+ Release [65]byte
+ Version [65]byte
+ Machine [65]byte
+ Domainname [65]byte
}
type Ustat_t struct {
@@ -638,6 +638,7 @@ type EpollEvent struct {
const (
AT_FDCWD = -0x64
+ AT_NO_AUTOMOUNT = 0x800
AT_REMOVEDIR = 0x200
AT_SYMLINK_FOLLOW = 0x400
AT_SYMLINK_NOFOLLOW = 0x100
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go
index ec7a0cd..4460279 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go
@@ -618,12 +618,12 @@ type Sysinfo_t struct {
}
type Utsname struct {
- Sysname [65]int8
- Nodename [65]int8
- Release [65]int8
- Version [65]int8
- Machine [65]int8
- Domainname [65]int8
+ Sysname [65]byte
+ Nodename [65]byte
+ Release [65]byte
+ Version [65]byte
+ Machine [65]byte
+ Domainname [65]byte
}
type Ustat_t struct {
@@ -643,6 +643,7 @@ type EpollEvent struct {
const (
AT_FDCWD = -0x64
+ AT_NO_AUTOMOUNT = 0x800
AT_REMOVEDIR = 0x200
AT_SYMLINK_FOLLOW = 0x400
AT_SYMLINK_NOFOLLOW = 0x100
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go
index bbe08d7..9892381 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go
@@ -618,12 +618,12 @@ type Sysinfo_t struct {
}
type Utsname struct {
- Sysname [65]int8
- Nodename [65]int8
- Release [65]int8
- Version [65]int8
- Machine [65]int8
- Domainname [65]int8
+ Sysname [65]byte
+ Nodename [65]byte
+ Release [65]byte
+ Version [65]byte
+ Machine [65]byte
+ Domainname [65]byte
}
type Ustat_t struct {
@@ -643,6 +643,7 @@ type EpollEvent struct {
const (
AT_FDCWD = -0x64
+ AT_NO_AUTOMOUNT = 0x800
AT_REMOVEDIR = 0x200
AT_SYMLINK_FOLLOW = 0x400
AT_SYMLINK_NOFOLLOW = 0x100
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go
index 75ee05a..c2f4c03 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go
@@ -614,12 +614,12 @@ type Sysinfo_t struct {
}
type Utsname struct {
- Sysname [65]int8
- Nodename [65]int8
- Release [65]int8
- Version [65]int8
- Machine [65]int8
- Domainname [65]int8
+ Sysname [65]byte
+ Nodename [65]byte
+ Release [65]byte
+ Version [65]byte
+ Machine [65]byte
+ Domainname [65]byte
}
type Ustat_t struct {
@@ -638,6 +638,7 @@ type EpollEvent struct {
const (
AT_FDCWD = -0x64
+ AT_NO_AUTOMOUNT = 0x800
AT_REMOVEDIR = 0x200
AT_SYMLINK_FOLLOW = 0x400
AT_SYMLINK_NOFOLLOW = 0x100
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go
index 30a257f..ffe7883 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go
@@ -625,12 +625,12 @@ type Sysinfo_t struct {
}
type Utsname struct {
- Sysname [65]uint8
- Nodename [65]uint8
- Release [65]uint8
- Version [65]uint8
- Machine [65]uint8
- Domainname [65]uint8
+ Sysname [65]byte
+ Nodename [65]byte
+ Release [65]byte
+ Version [65]byte
+ Machine [65]byte
+ Domainname [65]byte
}
type Ustat_t struct {
@@ -651,6 +651,7 @@ type EpollEvent struct {
const (
AT_FDCWD = -0x64
+ AT_NO_AUTOMOUNT = 0x800
AT_REMOVEDIR = 0x200
AT_SYMLINK_FOLLOW = 0x400
AT_SYMLINK_NOFOLLOW = 0x100
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go
index bebed6f..7e3d946 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go
@@ -625,12 +625,12 @@ type Sysinfo_t struct {
}
type Utsname struct {
- Sysname [65]uint8
- Nodename [65]uint8
- Release [65]uint8
- Version [65]uint8
- Machine [65]uint8
- Domainname [65]uint8
+ Sysname [65]byte
+ Nodename [65]byte
+ Release [65]byte
+ Version [65]byte
+ Machine [65]byte
+ Domainname [65]byte
}
type Ustat_t struct {
@@ -651,6 +651,7 @@ type EpollEvent struct {
const (
AT_FDCWD = -0x64
+ AT_NO_AUTOMOUNT = 0x800
AT_REMOVEDIR = 0x200
AT_SYMLINK_FOLLOW = 0x400
AT_SYMLINK_NOFOLLOW = 0x100
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go
index 286661b..730fa8a 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go
@@ -642,12 +642,12 @@ type Sysinfo_t struct {
}
type Utsname struct {
- Sysname [65]int8
- Nodename [65]int8
- Release [65]int8
- Version [65]int8
- Machine [65]int8
- Domainname [65]int8
+ Sysname [65]byte
+ Nodename [65]byte
+ Release [65]byte
+ Version [65]byte
+ Machine [65]byte
+ Domainname [65]byte
}
type Ustat_t struct {
@@ -668,6 +668,7 @@ type EpollEvent struct {
const (
AT_FDCWD = -0x64
+ AT_NO_AUTOMOUNT = 0x800
AT_REMOVEDIR = 0x200
AT_SYMLINK_FOLLOW = 0x400
AT_SYMLINK_NOFOLLOW = 0x100
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go
index 22bdab9..9dbbb1c 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go
@@ -601,12 +601,12 @@ type Sysinfo_t struct {
}
type Utsname struct {
- Sysname [65]int8
- Nodename [65]int8
- Release [65]int8
- Version [65]int8
- Machine [65]int8
- Domainname [65]int8
+ Sysname [65]byte
+ Nodename [65]byte
+ Release [65]byte
+ Version [65]byte
+ Machine [65]byte
+ Domainname [65]byte
}
type Ustat_t struct {
@@ -652,8 +652,6 @@ type Sigset_t struct {
X__val [16]uint64
}
-const _SC_PAGESIZE = 0x1e
-
type Termios struct {
Iflag uint32
Oflag uint32
diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go
index 42f99c0..da70faa 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go
@@ -1,5 +1,5 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs types_netbsd.go
+// cgo -godefs types_netbsd.go | go run mkpost.go
+// Code generated by the command above; see README.md. DO NOT EDIT.
// +build 386,netbsd
@@ -99,6 +99,10 @@ type Fsid struct {
X__fsid_val [2]int32
}
+const (
+ PathMax = 0x400
+)
+
type RawSockaddrInet4 struct {
Len uint8
Family uint8
@@ -382,11 +386,37 @@ type Termios struct {
Ospeed int32
}
+type Winsize struct {
+ Row uint16
+ Col uint16
+ Xpixel uint16
+ Ypixel uint16
+}
+
const (
AT_FDCWD = -0x64
AT_SYMLINK_NOFOLLOW = 0x200
)
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLIN = 0x1
+ POLLNVAL = 0x20
+ POLLOUT = 0x4
+ POLLPRI = 0x2
+ POLLRDBAND = 0x80
+ POLLRDNORM = 0x40
+ POLLWRBAND = 0x100
+ POLLWRNORM = 0x4
+)
+
type Sysctlnode struct {
Flags uint32
Num int32
@@ -399,3 +429,11 @@ type Sysctlnode struct {
X_sysctl_parent [8]byte
X_sysctl_desc [8]byte
}
+
+type Utsname struct {
+ Sysname [256]byte
+ Nodename [256]byte
+ Release [256]byte
+ Version [256]byte
+ Machine [256]byte
+}
diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go
index ff290ba..0963ab8 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go
@@ -1,5 +1,5 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs types_netbsd.go
+// cgo -godefs types_netbsd.go | go run mkpost.go
+// Code generated by the command above; see README.md. DO NOT EDIT.
// +build amd64,netbsd
@@ -103,6 +103,10 @@ type Fsid struct {
X__fsid_val [2]int32
}
+const (
+ PathMax = 0x400
+)
+
type RawSockaddrInet4 struct {
Len uint8
Family uint8
@@ -389,11 +393,37 @@ type Termios struct {
Ospeed int32
}
+type Winsize struct {
+ Row uint16
+ Col uint16
+ Xpixel uint16
+ Ypixel uint16
+}
+
const (
AT_FDCWD = -0x64
AT_SYMLINK_NOFOLLOW = 0x200
)
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLIN = 0x1
+ POLLNVAL = 0x20
+ POLLOUT = 0x4
+ POLLPRI = 0x2
+ POLLRDBAND = 0x80
+ POLLRDNORM = 0x40
+ POLLWRBAND = 0x100
+ POLLWRNORM = 0x4
+)
+
type Sysctlnode struct {
Flags uint32
Num int32
@@ -406,3 +436,11 @@ type Sysctlnode struct {
X_sysctl_parent [8]byte
X_sysctl_desc [8]byte
}
+
+type Utsname struct {
+ Sysname [256]byte
+ Nodename [256]byte
+ Release [256]byte
+ Version [256]byte
+ Machine [256]byte
+}
diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go
index 66dbd7c..211f641 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go
@@ -1,5 +1,5 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs types_netbsd.go
+// cgo -godefs types_netbsd.go | go run mkpost.go
+// Code generated by the command above; see README.md. DO NOT EDIT.
// +build arm,netbsd
@@ -104,6 +104,10 @@ type Fsid struct {
X__fsid_val [2]int32
}
+const (
+ PathMax = 0x400
+)
+
type RawSockaddrInet4 struct {
Len uint8
Family uint8
@@ -387,11 +391,37 @@ type Termios struct {
Ospeed int32
}
+type Winsize struct {
+ Row uint16
+ Col uint16
+ Xpixel uint16
+ Ypixel uint16
+}
+
const (
AT_FDCWD = -0x64
AT_SYMLINK_NOFOLLOW = 0x200
)
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLIN = 0x1
+ POLLNVAL = 0x20
+ POLLOUT = 0x4
+ POLLPRI = 0x2
+ POLLRDBAND = 0x80
+ POLLRDNORM = 0x40
+ POLLWRBAND = 0x100
+ POLLWRNORM = 0x4
+)
+
type Sysctlnode struct {
Flags uint32
Num int32
@@ -404,3 +434,11 @@ type Sysctlnode struct {
X_sysctl_parent [8]byte
X_sysctl_desc [8]byte
}
+
+type Utsname struct {
+ Sysname [256]byte
+ Nodename [256]byte
+ Release [256]byte
+ Version [256]byte
+ Machine [256]byte
+}
diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go
index 20fc9f4..d5a2d75 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go
@@ -1,5 +1,5 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs types_openbsd.go
+// cgo -godefs types_openbsd.go | go run mkpost.go
+// Code generated by the command above; see README.md. DO NOT EDIT.
// +build 386,openbsd
@@ -140,6 +140,10 @@ type Fsid struct {
Val [2]int32
}
+const (
+ PathMax = 0x400
+)
+
type RawSockaddrInet4 struct {
Len uint8
Family uint8
@@ -440,7 +444,41 @@ type Termios struct {
Ospeed int32
}
+type Winsize struct {
+ Row uint16
+ Col uint16
+ Xpixel uint16
+ Ypixel uint16
+}
+
const (
AT_FDCWD = -0x64
AT_SYMLINK_NOFOLLOW = 0x2
)
+
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLIN = 0x1
+ POLLNVAL = 0x20
+ POLLOUT = 0x4
+ POLLPRI = 0x2
+ POLLRDBAND = 0x80
+ POLLRDNORM = 0x40
+ POLLWRBAND = 0x100
+ POLLWRNORM = 0x4
+)
+
+type Utsname struct {
+ Sysname [256]byte
+ Nodename [256]byte
+ Release [256]byte
+ Version [256]byte
+ Machine [256]byte
+}
diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go
index 46fe949..d531410 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go
@@ -1,5 +1,5 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs types_openbsd.go
+// cgo -godefs types_openbsd.go | go run mkpost.go
+// Code generated by the command above; see README.md. DO NOT EDIT.
// +build amd64,openbsd
@@ -142,6 +142,10 @@ type Fsid struct {
Val [2]int32
}
+const (
+ PathMax = 0x400
+)
+
type RawSockaddrInet4 struct {
Len uint8
Family uint8
@@ -447,7 +451,41 @@ type Termios struct {
Ospeed int32
}
+type Winsize struct {
+ Row uint16
+ Col uint16
+ Xpixel uint16
+ Ypixel uint16
+}
+
const (
AT_FDCWD = -0x64
AT_SYMLINK_NOFOLLOW = 0x2
)
+
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLIN = 0x1
+ POLLNVAL = 0x20
+ POLLOUT = 0x4
+ POLLPRI = 0x2
+ POLLRDBAND = 0x80
+ POLLRDNORM = 0x40
+ POLLWRBAND = 0x100
+ POLLWRNORM = 0x4
+)
+
+type Utsname struct {
+ Sysname [256]byte
+ Nodename [256]byte
+ Release [256]byte
+ Version [256]byte
+ Machine [256]byte
+}
diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go
index 62e1f7c..e35b13b 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go
@@ -1,5 +1,5 @@
-// Created by cgo -godefs - DO NOT EDIT
-// cgo -godefs types_openbsd.go
+// cgo -godefs types_openbsd.go | go run mkpost.go
+// Code generated by the command above; see README.md. DO NOT EDIT.
// +build arm,openbsd
@@ -140,6 +140,10 @@ type Fsid struct {
Val [2]int32
}
+const (
+ PathMax = 0x400
+)
+
type RawSockaddrInet4 struct {
Len uint8
Family uint8
@@ -433,7 +437,41 @@ type Termios struct {
Ospeed int32
}
+type Winsize struct {
+ Row uint16
+ Col uint16
+ Xpixel uint16
+ Ypixel uint16
+}
+
const (
AT_FDCWD = -0x64
AT_SYMLINK_NOFOLLOW = 0x2
)
+
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLIN = 0x1
+ POLLNVAL = 0x20
+ POLLOUT = 0x4
+ POLLPRI = 0x2
+ POLLRDBAND = 0x80
+ POLLRDNORM = 0x40
+ POLLWRBAND = 0x100
+ POLLWRNORM = 0x4
+)
+
+type Utsname struct {
+ Sysname [256]byte
+ Nodename [256]byte
+ Release [256]byte
+ Version [256]byte
+ Machine [256]byte
+}
diff --git a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go
index a979a33..d445452 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go
@@ -263,11 +263,11 @@ type FdSet struct {
}
type Utsname struct {
- Sysname [257]int8
- Nodename [257]int8
- Release [257]int8
- Version [257]int8
- Machine [257]int8
+ Sysname [257]byte
+ Nodename [257]byte
+ Release [257]byte
+ Version [257]byte
+ Machine [257]byte
}
type Ustat_t struct {
@@ -438,3 +438,22 @@ type Winsize struct {
Xpixel uint16
Ypixel uint16
}
+
+type PollFd struct {
+ Fd int32
+ Events int16
+ Revents int16
+}
+
+const (
+ POLLERR = 0x8
+ POLLHUP = 0x10
+ POLLIN = 0x1
+ POLLNVAL = 0x20
+ POLLOUT = 0x4
+ POLLPRI = 0x2
+ POLLRDBAND = 0x80
+ POLLRDNORM = 0x40
+ POLLWRBAND = 0x100
+ POLLWRNORM = 0x4
+)
diff --git a/vendor/golang.org/x/text/README.md b/vendor/golang.org/x/text/README.md
index 75e29bc..b3f365e 100644
--- a/vendor/golang.org/x/text/README.md
+++ b/vendor/golang.org/x/text/README.md
@@ -9,16 +9,18 @@ This repo uses Semantic versioning (http://semver.org/), so
and
1. PATCH version when you make backwards-compatible bug fixes.
-A Unicode major and minor version bump is mapped to a major version bump in
-x/text.
-A path version bump in Unicode is mapped to a minor version bump in x/text.
-Note that, consistent with the definitions in semver, until version 1.0.0 of
-x/text is reached, the minor version is considered a major version.
-So going from 0.1.0 to 0.2.0 is considered to be a major version bump.
+Until version 1.0.0 of x/text is reached, the minor version is considered a
+major version. So going from 0.1.0 to 0.2.0 is considered to be a major version
+bump.
A major new CLDR version is mapped to a minor version increase in x/text.
Any other new CLDR version is mapped to a patch version increase in x/text.
+It is important that the Unicode version used in `x/text` matches the one used
+by your Go compiler. The `x/text` repository supports multiple versions of
+Unicode and will match the version of Unicode to that of the Go compiler. At the
+moment this is supported for Go compilers from version 1.7.
+
## Download/Install
The easiest way to install is to run `go get -u golang.org/x/text`. You can
diff --git a/vendor/golang.org/x/text/gen.go b/vendor/golang.org/x/text/gen.go
index 4257a18..757fefb 100644
--- a/vendor/golang.org/x/text/gen.go
+++ b/vendor/golang.org/x/text/gen.go
@@ -117,14 +117,15 @@ pkg unicode, var *RangeTable
width = generate("./width", unicode)
bidi = generate("./unicode/bidi", unicode, norm, rangetable)
mib = generate("./encoding/internal/identifier", unicode)
+ number = generate("./internal/number", unicode, cldr, language, internal)
_ = generate("./encoding/htmlindex", unicode, language, mib)
_ = generate("./encoding/ianaindex", unicode, language, mib)
_ = generate("./secure/precis", unicode, norm, rangetable, cases, width, bidi)
- _ = generate("./currency", unicode, cldr, language, internal)
- _ = generate("./internal/number", unicode, cldr, language, internal)
- _ = generate("./feature/plural", unicode, cldr, language, internal)
+ _ = generate("./internal/cldrtree", language)
+ _ = generate("./currency", unicode, cldr, language, internal, number)
+ _ = generate("./feature/plural", unicode, cldr, language, internal, number)
_ = generate("./internal/export/idna", unicode, bidi, norm)
- _ = generate("./language/display", unicode, cldr, language, internal)
+ _ = generate("./language/display", unicode, cldr, language, internal, number)
_ = generate("./collate", unicode, norm, cldr, language, rangetable)
_ = generate("./search", unicode, norm, cldr, language, rangetable)
)
diff --git a/vendor/golang.org/x/text/internal/gen/code.go b/vendor/golang.org/x/text/internal/gen/code.go
index d7031b6..0389509 100644
--- a/vendor/golang.org/x/text/internal/gen/code.go
+++ b/vendor/golang.org/x/text/internal/gen/code.go
@@ -55,18 +55,36 @@ func (w *CodeWriter) WriteGoFile(filename, pkg string) {
log.Fatalf("Could not create file %s: %v", filename, err)
}
defer f.Close()
- if _, err = w.WriteGo(f, pkg); err != nil {
+ if _, err = w.WriteGo(f, pkg, ""); err != nil {
+ log.Fatalf("Error writing file %s: %v", filename, err)
+ }
+}
+
+// WriteVersionedGoFile appends the buffer with the total size of all created
+// structures and writes it as a Go file to the the given file with the given
+// package name and build tags for the current Unicode version,
+func (w *CodeWriter) WriteVersionedGoFile(filename, pkg string) {
+ tags := buildTags()
+ if tags != "" {
+ filename = insertVersion(filename, UnicodeVersion())
+ }
+ f, err := os.Create(filename)
+ if err != nil {
+ log.Fatalf("Could not create file %s: %v", filename, err)
+ }
+ defer f.Close()
+ if _, err = w.WriteGo(f, pkg, tags); err != nil {
log.Fatalf("Error writing file %s: %v", filename, err)
}
}
// WriteGo appends the buffer with the total size of all created structures and
// writes it as a Go file to the the given writer with the given package name.
-func (w *CodeWriter) WriteGo(out io.Writer, pkg string) (n int, err error) {
+func (w *CodeWriter) WriteGo(out io.Writer, pkg, tags string) (n int, err error) {
sz := w.Size
w.WriteComment("Total table size %d bytes (%dKiB); checksum: %X\n", sz, sz/1024, w.Hash.Sum32())
defer w.buf.Reset()
- return WriteGo(out, pkg, w.buf.Bytes())
+ return WriteGo(out, pkg, tags, w.buf.Bytes())
}
func (w *CodeWriter) printf(f string, x ...interface{}) {
diff --git a/vendor/golang.org/x/text/internal/gen/gen.go b/vendor/golang.org/x/text/internal/gen/gen.go
index 2acb035..4c3f760 100644
--- a/vendor/golang.org/x/text/internal/gen/gen.go
+++ b/vendor/golang.org/x/text/internal/gen/gen.go
@@ -31,6 +31,7 @@ import (
"os"
"path"
"path/filepath"
+ "strings"
"sync"
"unicode"
@@ -69,8 +70,6 @@ func Init() {
const header = `// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
-package %s
-
`
// UnicodeVersion reports the requested Unicode version.
@@ -78,11 +77,33 @@ func UnicodeVersion() string {
return *unicodeVersion
}
-// UnicodeVersion reports the requested CLDR version.
+// CLDRVersion reports the requested CLDR version.
func CLDRVersion() string {
return *cldrVersion
}
+var tags = []struct{ version, buildTags string }{
+ {"10.0.0", "go1.10"},
+ {"", "!go1.10"},
+}
+
+// buildTags reports the build tags used for the current Unicode version.
+func buildTags() string {
+ v := UnicodeVersion()
+ for _, x := range tags {
+ // We should do a numeric comparison, but including the collate package
+ // would create an import cycle. We approximate it by assuming that
+ // longer version strings are later.
+ if len(x.version) <= len(v) {
+ return x.buildTags
+ }
+ if len(x.version) == len(v) && x.version <= v {
+ return x.buildTags
+ }
+ }
+ return tags[0].buildTags
+}
+
// IsLocal reports whether data files are available locally.
func IsLocal() bool {
dir, err := localReadmeFile()
@@ -243,15 +264,46 @@ func WriteGoFile(filename, pkg string, b []byte) {
log.Fatalf("Could not create file %s: %v", filename, err)
}
defer w.Close()
- if _, err = WriteGo(w, pkg, b); err != nil {
+ if _, err = WriteGo(w, pkg, "", b); err != nil {
+ log.Fatalf("Error writing file %s: %v", filename, err)
+ }
+}
+
+func insertVersion(filename, version string) string {
+ suffix := ".go"
+ if strings.HasSuffix(filename, "_test.go") {
+ suffix = "_test.go"
+ }
+ return fmt.Sprint(filename[:len(filename)-len(suffix)], version, suffix)
+}
+
+// WriteVersionedGoFile prepends a standard file comment, adds build tags to
+// version the file for the current Unicode version, and package statement to
+// the given bytes, applies gofmt, and writes them to a file with the given
+// name. It will call log.Fatal if there are any errors.
+func WriteVersionedGoFile(filename, pkg string, b []byte) {
+ tags := buildTags()
+ if tags != "" {
+ filename = insertVersion(filename, UnicodeVersion())
+ }
+ w, err := os.Create(filename)
+ if err != nil {
+ log.Fatalf("Could not create file %s: %v", filename, err)
+ }
+ defer w.Close()
+ if _, err = WriteGo(w, pkg, tags, b); err != nil {
log.Fatalf("Error writing file %s: %v", filename, err)
}
}
// WriteGo prepends a standard file comment and package statement to the given
// bytes, applies gofmt, and writes them to w.
-func WriteGo(w io.Writer, pkg string, b []byte) (n int, err error) {
- src := []byte(fmt.Sprintf(header, pkg))
+func WriteGo(w io.Writer, pkg, tags string, b []byte) (n int, err error) {
+ src := []byte(header)
+ if tags != "" {
+ src = append(src, fmt.Sprintf("// +build %s\n\n", tags)...)
+ }
+ src = append(src, fmt.Sprintf("package %s\n\n", pkg)...)
src = append(src, b...)
formatted, err := format.Source(src)
if err != nil {
diff --git a/vendor/golang.org/x/text/internal/tables.go b/vendor/golang.org/x/text/internal/tables.go
index a53042a..85991d3 100644
--- a/vendor/golang.org/x/text/internal/tables.go
+++ b/vendor/golang.org/x/text/internal/tables.go
@@ -4,9 +4,9 @@ package internal
// Parent maps a compact index of a tag to the compact index of the parent of
// this tag.
-var Parent = []uint16{ // 754 elements
+var Parent = []uint16{ // 768 elements
// Entry 0 - 3F
- 0x0000, 0x0053, 0x00e5, 0x0000, 0x0003, 0x0003, 0x0000, 0x0006,
+ 0x0000, 0x0053, 0x00e8, 0x0000, 0x0003, 0x0003, 0x0000, 0x0006,
0x0000, 0x0008, 0x0000, 0x000a, 0x0000, 0x000c, 0x000c, 0x000c,
0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c,
0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c,
@@ -18,100 +18,101 @@ var Parent = []uint16{ // 754 elements
0x0000, 0x0040, 0x0000, 0x0042, 0x0042, 0x0000, 0x0045, 0x0045,
0x0000, 0x0048, 0x0000, 0x004a, 0x0000, 0x0000, 0x004d, 0x004c,
0x004c, 0x0000, 0x0051, 0x0051, 0x0051, 0x0051, 0x0000, 0x0056,
- 0x0000, 0x0058, 0x0000, 0x005a, 0x0000, 0x005c, 0x005c, 0x0000,
- 0x005f, 0x0000, 0x0061, 0x0000, 0x0063, 0x0000, 0x0065, 0x0065,
- 0x0000, 0x0068, 0x0000, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a,
- 0x006a, 0x006a, 0x0000, 0x0072, 0x0000, 0x0074, 0x0000, 0x0076,
- 0x0000, 0x0000, 0x0079, 0x0000, 0x007b, 0x0000, 0x007d, 0x0000,
+ 0x0056, 0x0000, 0x0059, 0x0000, 0x005b, 0x0000, 0x005d, 0x0000,
+ 0x005f, 0x005f, 0x0000, 0x0062, 0x0000, 0x0064, 0x0000, 0x0066,
+ 0x0000, 0x0068, 0x0068, 0x0000, 0x006b, 0x0000, 0x006d, 0x006d,
+ 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x0000, 0x0075, 0x0000,
+ 0x0077, 0x0000, 0x0079, 0x0000, 0x0000, 0x007c, 0x0000, 0x007e,
// Entry 80 - BF
- 0x007f, 0x007f, 0x0000, 0x0082, 0x0082, 0x0000, 0x0085, 0x0086,
- 0x0086, 0x0086, 0x0085, 0x0087, 0x0086, 0x0086, 0x0086, 0x0085,
- 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0087, 0x0086,
- 0x0086, 0x0086, 0x0086, 0x0087, 0x0086, 0x0087, 0x0086, 0x0086,
- 0x0087, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086,
- 0x0086, 0x0086, 0x0085, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086,
- 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086,
- 0x0086, 0x0086, 0x0086, 0x0086, 0x0085, 0x0086, 0x0085, 0x0086,
+ 0x0000, 0x0080, 0x0000, 0x0082, 0x0082, 0x0000, 0x0085, 0x0085,
+ 0x0000, 0x0088, 0x0089, 0x0089, 0x0089, 0x0088, 0x008a, 0x0089,
+ 0x0089, 0x0089, 0x0088, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089,
+ 0x0089, 0x008a, 0x0089, 0x0089, 0x0089, 0x0089, 0x008a, 0x0089,
+ 0x008a, 0x0089, 0x0089, 0x008a, 0x0089, 0x0089, 0x0089, 0x0089,
+ 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0088, 0x0089, 0x0089,
+ 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089,
+ 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0088,
// Entry C0 - FF
- 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0087,
- 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0085,
- 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0087, 0x0086, 0x0086,
- 0x0087, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086,
- 0x0086, 0x0086, 0x0086, 0x0086, 0x0085, 0x0085, 0x0086, 0x0086,
- 0x0085, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0000, 0x00ee,
- 0x0000, 0x00f0, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1,
- 0x00f1, 0x00f1, 0x00f1, 0x00f0, 0x00f1, 0x00f0, 0x00f0, 0x00f1,
+ 0x0089, 0x0088, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089,
+ 0x0089, 0x0089, 0x008a, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089,
+ 0x0089, 0x0089, 0x0088, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089,
+ 0x008a, 0x0089, 0x0089, 0x008a, 0x0089, 0x0089, 0x0089, 0x0089,
+ 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0088,
+ 0x0088, 0x0089, 0x0089, 0x0088, 0x0089, 0x0089, 0x0089, 0x0089,
+ 0x0089, 0x0000, 0x00f1, 0x0000, 0x00f3, 0x00f4, 0x00f4, 0x00f4,
+ 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f3, 0x00f4,
// Entry 100 - 13F
- 0x00f1, 0x00f0, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f0, 0x00f1,
- 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x0000, 0x010d, 0x0000,
- 0x010f, 0x0000, 0x0111, 0x0000, 0x0113, 0x0113, 0x0000, 0x0116,
- 0x0116, 0x0116, 0x0116, 0x0000, 0x011b, 0x0000, 0x011d, 0x0000,
- 0x011f, 0x011f, 0x0000, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122,
- 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122,
- 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122,
- 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122,
+ 0x00f3, 0x00f3, 0x00f4, 0x00f4, 0x00f3, 0x00f4, 0x00f4, 0x00f4,
+ 0x00f4, 0x00f3, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4,
+ 0x0000, 0x0110, 0x0000, 0x0112, 0x0000, 0x0114, 0x0000, 0x0116,
+ 0x0116, 0x0000, 0x0119, 0x0119, 0x0119, 0x0119, 0x0000, 0x011e,
+ 0x0000, 0x0120, 0x0000, 0x0122, 0x0122, 0x0000, 0x0125, 0x0125,
+ 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125,
+ 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125,
+ 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125,
// Entry 140 - 17F
- 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122,
- 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122,
- 0x0122, 0x0000, 0x0151, 0x0000, 0x0153, 0x0000, 0x0155, 0x0000,
- 0x0157, 0x0000, 0x0159, 0x0000, 0x015b, 0x015b, 0x015b, 0x0000,
- 0x015f, 0x0000, 0x0000, 0x0162, 0x0000, 0x0164, 0x0000, 0x0166,
- 0x0166, 0x0166, 0x0000, 0x016a, 0x0000, 0x016c, 0x0000, 0x016e,
- 0x0000, 0x0170, 0x0170, 0x0000, 0x0173, 0x0000, 0x0175, 0x0000,
- 0x0177, 0x0000, 0x0179, 0x0000, 0x017b, 0x0000, 0x017d, 0x0000,
+ 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125,
+ 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125,
+ 0x0125, 0x0125, 0x0125, 0x0125, 0x0000, 0x0154, 0x0000, 0x0156,
+ 0x0000, 0x0158, 0x0000, 0x015a, 0x0000, 0x015c, 0x0000, 0x015e,
+ 0x015e, 0x015e, 0x0000, 0x0162, 0x0000, 0x0000, 0x0165, 0x0000,
+ 0x0167, 0x0000, 0x0169, 0x0169, 0x0169, 0x0000, 0x016d, 0x0000,
+ 0x016f, 0x0000, 0x0171, 0x0000, 0x0173, 0x0173, 0x0000, 0x0176,
+ 0x0000, 0x0178, 0x0000, 0x017a, 0x0000, 0x017c, 0x0000, 0x017e,
// Entry 180 - 1BF
- 0x017f, 0x0000, 0x0181, 0x0181, 0x0181, 0x0181, 0x0000, 0x0000,
- 0x0187, 0x0000, 0x0000, 0x018a, 0x0000, 0x018c, 0x0000, 0x0000,
- 0x018f, 0x0000, 0x0191, 0x0000, 0x0000, 0x0194, 0x0000, 0x0000,
- 0x0197, 0x0000, 0x0199, 0x0000, 0x019b, 0x0000, 0x019d, 0x0000,
+ 0x0000, 0x0180, 0x0000, 0x0000, 0x0183, 0x0000, 0x0185, 0x0185,
+ 0x0185, 0x0185, 0x0000, 0x0000, 0x018b, 0x0000, 0x0000, 0x018e,
+ 0x0000, 0x0190, 0x0000, 0x0000, 0x0193, 0x0000, 0x0195, 0x0000,
+ 0x0000, 0x0198, 0x0000, 0x0000, 0x019b, 0x0000, 0x019d, 0x0000,
0x019f, 0x0000, 0x01a1, 0x0000, 0x01a3, 0x0000, 0x01a5, 0x0000,
- 0x01a7, 0x0000, 0x01a9, 0x0000, 0x01ab, 0x01ab, 0x0000, 0x01ae,
- 0x0000, 0x01b0, 0x0000, 0x01b2, 0x0000, 0x01b4, 0x0000, 0x01b6,
- 0x0000, 0x0000, 0x01b9, 0x0000, 0x01bb, 0x0000, 0x01bd, 0x0000,
+ 0x01a7, 0x0000, 0x01a9, 0x0000, 0x01ab, 0x0000, 0x01ad, 0x0000,
+ 0x01af, 0x01af, 0x0000, 0x01b2, 0x0000, 0x01b4, 0x0000, 0x01b6,
+ 0x0000, 0x01b8, 0x0000, 0x01ba, 0x0000, 0x0000, 0x01bd, 0x0000,
// Entry 1C0 - 1FF
- 0x01bf, 0x0000, 0x01c1, 0x0000, 0x01c3, 0x0000, 0x01c5, 0x01c5,
- 0x01c5, 0x01c5, 0x0000, 0x01ca, 0x0000, 0x01cc, 0x01cc, 0x0000,
- 0x01cf, 0x0000, 0x01d1, 0x0000, 0x01d3, 0x0000, 0x01d5, 0x0000,
- 0x01d7, 0x0000, 0x01d9, 0x01d9, 0x0000, 0x01dc, 0x0000, 0x01de,
+ 0x01bf, 0x0000, 0x01c1, 0x0000, 0x01c3, 0x0000, 0x01c5, 0x0000,
+ 0x01c7, 0x0000, 0x01c9, 0x01c9, 0x01c9, 0x01c9, 0x0000, 0x01ce,
+ 0x0000, 0x01d0, 0x01d0, 0x0000, 0x01d3, 0x0000, 0x01d5, 0x0000,
+ 0x01d7, 0x0000, 0x01d9, 0x0000, 0x01db, 0x0000, 0x01dd, 0x01dd,
0x0000, 0x01e0, 0x0000, 0x01e2, 0x0000, 0x01e4, 0x0000, 0x01e6,
0x0000, 0x01e8, 0x0000, 0x01ea, 0x0000, 0x01ec, 0x0000, 0x01ee,
- 0x01ee, 0x01ee, 0x0000, 0x01f2, 0x0000, 0x01f4, 0x0000, 0x01f6,
- 0x0000, 0x01f8, 0x0000, 0x0000, 0x01fb, 0x0000, 0x01fd, 0x01fd,
+ 0x0000, 0x01f0, 0x0000, 0x01f2, 0x01f2, 0x01f2, 0x0000, 0x01f6,
+ 0x0000, 0x01f8, 0x0000, 0x01fa, 0x0000, 0x01fc, 0x0000, 0x0000,
// Entry 200 - 23F
- 0x0000, 0x0200, 0x0000, 0x0202, 0x0202, 0x0000, 0x0205, 0x0205,
- 0x0000, 0x0208, 0x0208, 0x0208, 0x0208, 0x0208, 0x0208, 0x0208,
- 0x0000, 0x0210, 0x0000, 0x0212, 0x0000, 0x0214, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x021a, 0x0000, 0x0000, 0x021d, 0x0000,
- 0x021f, 0x021f, 0x0000, 0x0222, 0x0000, 0x0224, 0x0224, 0x0000,
- 0x0000, 0x0228, 0x0227, 0x0227, 0x0000, 0x0000, 0x022d, 0x0000,
- 0x022f, 0x0000, 0x0231, 0x0000, 0x023d, 0x0233, 0x023d, 0x023d,
- 0x023d, 0x023d, 0x023d, 0x023d, 0x023d, 0x0233, 0x023d, 0x023d,
+ 0x01ff, 0x0000, 0x0201, 0x0201, 0x0000, 0x0204, 0x0000, 0x0206,
+ 0x0206, 0x0000, 0x0209, 0x0209, 0x0000, 0x020c, 0x020c, 0x020c,
+ 0x020c, 0x020c, 0x020c, 0x020c, 0x0000, 0x0214, 0x0000, 0x0216,
+ 0x0000, 0x0218, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x021e,
+ 0x0000, 0x0000, 0x0221, 0x0000, 0x0223, 0x0223, 0x0000, 0x0226,
+ 0x0000, 0x0228, 0x0228, 0x0000, 0x0000, 0x022c, 0x022b, 0x022b,
+ 0x0000, 0x0000, 0x0231, 0x0000, 0x0233, 0x0000, 0x0235, 0x0000,
+ 0x0241, 0x0237, 0x0241, 0x0241, 0x0241, 0x0241, 0x0241, 0x0241,
// Entry 240 - 27F
- 0x0000, 0x0240, 0x0240, 0x0240, 0x0000, 0x0244, 0x0000, 0x0246,
- 0x0000, 0x0248, 0x0248, 0x0000, 0x024b, 0x0000, 0x024d, 0x024d,
- 0x024d, 0x024d, 0x024d, 0x024d, 0x0000, 0x0254, 0x0000, 0x0256,
- 0x0000, 0x0258, 0x0000, 0x025a, 0x0000, 0x025c, 0x0000, 0x0000,
- 0x025f, 0x025f, 0x025f, 0x0000, 0x0263, 0x0000, 0x0265, 0x0000,
- 0x0267, 0x0000, 0x0000, 0x026a, 0x0269, 0x0269, 0x0000, 0x026e,
- 0x0000, 0x0270, 0x0000, 0x0272, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0277, 0x0000, 0x0000, 0x027a, 0x0000, 0x027c, 0x027c, 0x027c,
+ 0x0241, 0x0237, 0x0241, 0x0241, 0x0000, 0x0244, 0x0244, 0x0244,
+ 0x0000, 0x0248, 0x0000, 0x024a, 0x0000, 0x024c, 0x024c, 0x0000,
+ 0x024f, 0x0000, 0x0251, 0x0251, 0x0251, 0x0251, 0x0251, 0x0251,
+ 0x0000, 0x0258, 0x0000, 0x025a, 0x0000, 0x025c, 0x0000, 0x025e,
+ 0x0000, 0x0260, 0x0000, 0x0262, 0x0000, 0x0000, 0x0265, 0x0265,
+ 0x0265, 0x0000, 0x0269, 0x0000, 0x026b, 0x0000, 0x026d, 0x0000,
+ 0x0000, 0x0270, 0x026f, 0x026f, 0x0000, 0x0274, 0x0000, 0x0276,
+ 0x0000, 0x0278, 0x0000, 0x0000, 0x0000, 0x0000, 0x027d, 0x0000,
// Entry 280 - 2BF
- 0x027c, 0x0000, 0x0281, 0x0281, 0x0281, 0x0000, 0x0285, 0x0285,
- 0x0285, 0x0285, 0x0285, 0x0000, 0x028b, 0x028b, 0x028b, 0x028b,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0293, 0x0293, 0x0293, 0x0000,
- 0x0297, 0x0297, 0x0297, 0x0297, 0x0000, 0x0000, 0x029d, 0x029d,
- 0x029d, 0x029d, 0x0000, 0x02a2, 0x0000, 0x02a4, 0x02a4, 0x0000,
- 0x02a7, 0x0000, 0x02a9, 0x02a9, 0x0000, 0x0000, 0x02ad, 0x0000,
- 0x0000, 0x02b0, 0x0000, 0x02b2, 0x02b2, 0x0000, 0x0000, 0x02b6,
- 0x0000, 0x02b8, 0x0000, 0x02ba, 0x0000, 0x02bc, 0x0000, 0x02be,
+ 0x0000, 0x0280, 0x0000, 0x0282, 0x0282, 0x0282, 0x0282, 0x0000,
+ 0x0287, 0x0287, 0x0287, 0x0000, 0x028b, 0x028b, 0x028b, 0x028b,
+ 0x028b, 0x0000, 0x0291, 0x0291, 0x0291, 0x0291, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0299, 0x0299, 0x0299, 0x0000, 0x029d, 0x029d,
+ 0x029d, 0x029d, 0x0000, 0x0000, 0x02a3, 0x02a3, 0x02a3, 0x02a3,
+ 0x0000, 0x02a8, 0x0000, 0x02aa, 0x02aa, 0x0000, 0x02ad, 0x0000,
+ 0x02af, 0x0000, 0x02b1, 0x02b1, 0x0000, 0x0000, 0x02b5, 0x0000,
+ 0x0000, 0x02b8, 0x0000, 0x02ba, 0x02ba, 0x0000, 0x0000, 0x02be,
// Entry 2C0 - 2FF
- 0x02be, 0x0000, 0x0000, 0x02c2, 0x0000, 0x02c4, 0x02c1, 0x02c1,
- 0x0000, 0x0000, 0x02c9, 0x02c8, 0x02c8, 0x0000, 0x0000, 0x02ce,
- 0x0000, 0x02d0, 0x0000, 0x02d2, 0x0000, 0x0000, 0x02d5, 0x0000,
- 0x0000, 0x0000, 0x02d9, 0x0000, 0x02db, 0x0000, 0x02dd, 0x0000,
- 0x02df, 0x02df, 0x0000, 0x02e2, 0x0000, 0x02e4, 0x0000, 0x02e6,
- 0x02e6, 0x02e6, 0x02e6, 0x02e6, 0x0000, 0x02ec, 0x02ed, 0x02ec,
- 0x0000, 0x02f0,
-} // Size: 1532 bytes
+ 0x0000, 0x02c0, 0x0000, 0x02c2, 0x0000, 0x02c4, 0x0000, 0x02c6,
+ 0x0000, 0x02c8, 0x02c8, 0x0000, 0x0000, 0x02cc, 0x0000, 0x02ce,
+ 0x02cb, 0x02cb, 0x0000, 0x0000, 0x02d3, 0x02d2, 0x02d2, 0x0000,
+ 0x0000, 0x02d8, 0x0000, 0x02da, 0x0000, 0x02dc, 0x0000, 0x0000,
+ 0x02df, 0x0000, 0x02e1, 0x0000, 0x0000, 0x02e4, 0x0000, 0x02e6,
+ 0x0000, 0x02e8, 0x0000, 0x02ea, 0x02ea, 0x0000, 0x0000, 0x02ee,
+ 0x02ed, 0x02ed, 0x0000, 0x02f2, 0x0000, 0x02f4, 0x02f4, 0x02f4,
+ 0x02f4, 0x02f4, 0x0000, 0x02fa, 0x02fb, 0x02fa, 0x0000, 0x02fe,
+} // Size: 1560 bytes
-// Total table size 1532 bytes (1KiB); checksum: 90718A2
+// Total table size 1560 bytes (1KiB); checksum: 4897681C
diff --git a/vendor/golang.org/x/text/language/gen.go b/vendor/golang.org/x/text/language/gen.go
index 7c260e5..302f194 100644
--- a/vendor/golang.org/x/text/language/gen.go
+++ b/vendor/golang.org/x/text/language/gen.go
@@ -1497,8 +1497,14 @@ func (b *builder) writeMatchData() {
if desired == supported && desired == "*_*_*" {
continue
}
- if desired != supported { // (Weird but correct.)
- log.Fatalf("not supported: desired=%q; supported=%q", desired, supported)
+ if desired != supported {
+ // This is now supported by CLDR, but only one case, which
+ // should already be covered by paradigm locales. For instance,
+ // test case "und, en, en-GU, en-IN, en-GB ; en-ZA ; en-GB" in
+ // testdata/CLDRLocaleMatcherTest.txt tests this.
+ if supported != "en_*_GB" {
+ log.Fatalf("not supported: desired=%q; supported=%q", desired, supported)
+ }
continue
}
ri := regionIntelligibility{
diff --git a/vendor/golang.org/x/text/language/gen_index.go b/vendor/golang.org/x/text/language/gen_index.go
index eef555c..5ca9bcc 100644
--- a/vendor/golang.org/x/text/language/gen_index.go
+++ b/vendor/golang.org/x/text/language/gen_index.go
@@ -49,7 +49,7 @@ func main() {
defer func() {
buf := &bytes.Buffer{}
- if _, err = w.WriteGo(buf, "language"); err != nil {
+ if _, err = w.WriteGo(buf, "language", ""); err != nil {
log.Fatalf("Error formatting file index.go: %v", err)
}
diff --git a/vendor/golang.org/x/text/language/index.go b/vendor/golang.org/x/text/language/index.go
index 69ac557..5311e5c 100644
--- a/vendor/golang.org/x/text/language/index.go
+++ b/vendor/golang.org/x/text/language/index.go
@@ -4,11 +4,11 @@ package language
// NumCompactTags is the number of common tags. The maximum tag is
// NumCompactTags-1.
-const NumCompactTags = 754
+const NumCompactTags = 768
var specialTags = []Tag{ // 2 elements
0: {lang: 0xd7, region: 0x6e, script: 0x0, pVariant: 0x5, pExt: 0xe, str: "ca-ES-valencia"},
- 1: {lang: 0x138, region: 0x135, script: 0x0, pVariant: 0x5, pExt: 0x5, str: "en-US-u-va-posix"},
+ 1: {lang: 0x139, region: 0x135, script: 0x0, pVariant: 0x5, pExt: 0x5, str: "en-US-u-va-posix"},
} // Size: 72 bytes
var coreTags = map[uint32]uint16{
@@ -59,10 +59,10 @@ var coreTags = map[uint32]uint16{
0x04800000: 46, // ast
0x0480006e: 47, // ast-ES
0x05800000: 48, // az
- 0x0581e000: 49, // az-Cyrl
- 0x0581e032: 50, // az-Cyrl-AZ
- 0x05855000: 51, // az-Latn
- 0x05855032: 52, // az-Latn-AZ
+ 0x0581f000: 49, // az-Cyrl
+ 0x0581f032: 50, // az-Cyrl-AZ
+ 0x05857000: 51, // az-Latn
+ 0x05857032: 52, // az-Latn-AZ
0x05e00000: 53, // bas
0x05e00052: 54, // bas-CM
0x07100000: 55, // be
@@ -87,683 +87,697 @@ var coreTags = map[uint32]uint16{
0x0b500000: 74, // brx
0x0b500099: 75, // brx-IN
0x0b700000: 76, // bs
- 0x0b71e000: 77, // bs-Cyrl
- 0x0b71e033: 78, // bs-Cyrl-BA
- 0x0b755000: 79, // bs-Latn
- 0x0b755033: 80, // bs-Latn-BA
+ 0x0b71f000: 77, // bs-Cyrl
+ 0x0b71f033: 78, // bs-Cyrl-BA
+ 0x0b757000: 79, // bs-Latn
+ 0x0b757033: 80, // bs-Latn-BA
0x0d700000: 81, // ca
0x0d700022: 82, // ca-AD
0x0d70006e: 83, // ca-ES
0x0d700078: 84, // ca-FR
0x0d70009e: 85, // ca-IT
- 0x0dc00000: 86, // ce
- 0x0dc00106: 87, // ce-RU
- 0x0df00000: 88, // cgg
- 0x0df00131: 89, // cgg-UG
- 0x0e500000: 90, // chr
- 0x0e500135: 91, // chr-US
- 0x0e900000: 92, // ckb
- 0x0e90009b: 93, // ckb-IQ
- 0x0e90009c: 94, // ckb-IR
- 0x0f900000: 95, // cs
- 0x0f90005e: 96, // cs-CZ
- 0x0fd00000: 97, // cu
- 0x0fd00106: 98, // cu-RU
- 0x0ff00000: 99, // cy
- 0x0ff0007b: 100, // cy-GB
- 0x10000000: 101, // da
- 0x10000063: 102, // da-DK
- 0x10000082: 103, // da-GL
- 0x10700000: 104, // dav
- 0x107000a4: 105, // dav-KE
- 0x10c00000: 106, // de
- 0x10c0002e: 107, // de-AT
- 0x10c00036: 108, // de-BE
- 0x10c0004e: 109, // de-CH
- 0x10c00060: 110, // de-DE
- 0x10c0009e: 111, // de-IT
- 0x10c000b2: 112, // de-LI
- 0x10c000b7: 113, // de-LU
- 0x11600000: 114, // dje
- 0x116000d4: 115, // dje-NE
- 0x11e00000: 116, // dsb
- 0x11e00060: 117, // dsb-DE
- 0x12300000: 118, // dua
- 0x12300052: 119, // dua-CM
- 0x12700000: 120, // dv
- 0x12a00000: 121, // dyo
- 0x12a00114: 122, // dyo-SN
- 0x12c00000: 123, // dz
- 0x12c00043: 124, // dz-BT
- 0x12e00000: 125, // ebu
- 0x12e000a4: 126, // ebu-KE
- 0x12f00000: 127, // ee
- 0x12f00080: 128, // ee-GH
- 0x12f00122: 129, // ee-TG
- 0x13500000: 130, // el
- 0x1350005d: 131, // el-CY
- 0x13500087: 132, // el-GR
- 0x13800000: 133, // en
- 0x13800001: 134, // en-001
- 0x1380001a: 135, // en-150
- 0x13800025: 136, // en-AG
- 0x13800026: 137, // en-AI
- 0x1380002d: 138, // en-AS
- 0x1380002e: 139, // en-AT
- 0x1380002f: 140, // en-AU
- 0x13800034: 141, // en-BB
- 0x13800036: 142, // en-BE
- 0x1380003a: 143, // en-BI
- 0x1380003d: 144, // en-BM
- 0x13800042: 145, // en-BS
- 0x13800046: 146, // en-BW
- 0x13800048: 147, // en-BZ
- 0x13800049: 148, // en-CA
- 0x1380004a: 149, // en-CC
- 0x1380004e: 150, // en-CH
- 0x13800050: 151, // en-CK
- 0x13800052: 152, // en-CM
- 0x1380005c: 153, // en-CX
- 0x1380005d: 154, // en-CY
- 0x13800060: 155, // en-DE
- 0x13800061: 156, // en-DG
- 0x13800063: 157, // en-DK
- 0x13800064: 158, // en-DM
- 0x1380006d: 159, // en-ER
- 0x13800072: 160, // en-FI
- 0x13800073: 161, // en-FJ
- 0x13800074: 162, // en-FK
- 0x13800075: 163, // en-FM
- 0x1380007b: 164, // en-GB
- 0x1380007c: 165, // en-GD
- 0x1380007f: 166, // en-GG
- 0x13800080: 167, // en-GH
- 0x13800081: 168, // en-GI
- 0x13800083: 169, // en-GM
- 0x1380008a: 170, // en-GU
- 0x1380008c: 171, // en-GY
- 0x1380008d: 172, // en-HK
- 0x13800096: 173, // en-IE
- 0x13800097: 174, // en-IL
- 0x13800098: 175, // en-IM
- 0x13800099: 176, // en-IN
- 0x1380009a: 177, // en-IO
- 0x1380009f: 178, // en-JE
- 0x138000a0: 179, // en-JM
- 0x138000a4: 180, // en-KE
- 0x138000a7: 181, // en-KI
- 0x138000a9: 182, // en-KN
- 0x138000ad: 183, // en-KY
- 0x138000b1: 184, // en-LC
- 0x138000b4: 185, // en-LR
- 0x138000b5: 186, // en-LS
- 0x138000bf: 187, // en-MG
- 0x138000c0: 188, // en-MH
- 0x138000c6: 189, // en-MO
- 0x138000c7: 190, // en-MP
- 0x138000ca: 191, // en-MS
- 0x138000cb: 192, // en-MT
- 0x138000cc: 193, // en-MU
- 0x138000ce: 194, // en-MW
- 0x138000d0: 195, // en-MY
- 0x138000d2: 196, // en-NA
- 0x138000d5: 197, // en-NF
- 0x138000d6: 198, // en-NG
- 0x138000d9: 199, // en-NL
- 0x138000dd: 200, // en-NR
- 0x138000df: 201, // en-NU
- 0x138000e0: 202, // en-NZ
- 0x138000e6: 203, // en-PG
- 0x138000e7: 204, // en-PH
- 0x138000e8: 205, // en-PK
- 0x138000eb: 206, // en-PN
- 0x138000ec: 207, // en-PR
- 0x138000f0: 208, // en-PW
- 0x13800107: 209, // en-RW
- 0x13800109: 210, // en-SB
- 0x1380010a: 211, // en-SC
- 0x1380010b: 212, // en-SD
- 0x1380010c: 213, // en-SE
- 0x1380010d: 214, // en-SG
- 0x1380010e: 215, // en-SH
- 0x1380010f: 216, // en-SI
- 0x13800112: 217, // en-SL
- 0x13800117: 218, // en-SS
- 0x1380011b: 219, // en-SX
- 0x1380011d: 220, // en-SZ
- 0x1380011f: 221, // en-TC
- 0x13800125: 222, // en-TK
- 0x13800129: 223, // en-TO
- 0x1380012c: 224, // en-TT
- 0x1380012d: 225, // en-TV
- 0x1380012f: 226, // en-TZ
- 0x13800131: 227, // en-UG
- 0x13800133: 228, // en-UM
- 0x13800135: 229, // en-US
- 0x13800139: 230, // en-VC
- 0x1380013c: 231, // en-VG
- 0x1380013d: 232, // en-VI
- 0x1380013f: 233, // en-VU
- 0x13800142: 234, // en-WS
- 0x13800161: 235, // en-ZA
- 0x13800162: 236, // en-ZM
- 0x13800164: 237, // en-ZW
- 0x13b00000: 238, // eo
- 0x13b00001: 239, // eo-001
- 0x13d00000: 240, // es
- 0x13d0001f: 241, // es-419
- 0x13d0002c: 242, // es-AR
- 0x13d0003f: 243, // es-BO
- 0x13d00041: 244, // es-BR
- 0x13d00048: 245, // es-BZ
- 0x13d00051: 246, // es-CL
- 0x13d00054: 247, // es-CO
- 0x13d00056: 248, // es-CR
- 0x13d00059: 249, // es-CU
- 0x13d00065: 250, // es-DO
- 0x13d00068: 251, // es-EA
- 0x13d00069: 252, // es-EC
- 0x13d0006e: 253, // es-ES
- 0x13d00086: 254, // es-GQ
- 0x13d00089: 255, // es-GT
- 0x13d0008f: 256, // es-HN
- 0x13d00094: 257, // es-IC
- 0x13d000cf: 258, // es-MX
- 0x13d000d8: 259, // es-NI
- 0x13d000e2: 260, // es-PA
- 0x13d000e4: 261, // es-PE
- 0x13d000e7: 262, // es-PH
- 0x13d000ec: 263, // es-PR
- 0x13d000f1: 264, // es-PY
- 0x13d0011a: 265, // es-SV
- 0x13d00135: 266, // es-US
- 0x13d00136: 267, // es-UY
- 0x13d0013b: 268, // es-VE
- 0x13f00000: 269, // et
- 0x13f0006a: 270, // et-EE
- 0x14400000: 271, // eu
- 0x1440006e: 272, // eu-ES
- 0x14500000: 273, // ewo
- 0x14500052: 274, // ewo-CM
- 0x14700000: 275, // fa
- 0x14700024: 276, // fa-AF
- 0x1470009c: 277, // fa-IR
- 0x14d00000: 278, // ff
- 0x14d00052: 279, // ff-CM
- 0x14d00084: 280, // ff-GN
- 0x14d000c9: 281, // ff-MR
- 0x14d00114: 282, // ff-SN
- 0x15000000: 283, // fi
- 0x15000072: 284, // fi-FI
- 0x15200000: 285, // fil
- 0x152000e7: 286, // fil-PH
- 0x15700000: 287, // fo
- 0x15700063: 288, // fo-DK
- 0x15700076: 289, // fo-FO
- 0x15d00000: 290, // fr
- 0x15d00036: 291, // fr-BE
- 0x15d00037: 292, // fr-BF
- 0x15d0003a: 293, // fr-BI
- 0x15d0003b: 294, // fr-BJ
- 0x15d0003c: 295, // fr-BL
- 0x15d00049: 296, // fr-CA
- 0x15d0004b: 297, // fr-CD
- 0x15d0004c: 298, // fr-CF
- 0x15d0004d: 299, // fr-CG
- 0x15d0004e: 300, // fr-CH
- 0x15d0004f: 301, // fr-CI
- 0x15d00052: 302, // fr-CM
- 0x15d00062: 303, // fr-DJ
- 0x15d00067: 304, // fr-DZ
- 0x15d00078: 305, // fr-FR
- 0x15d0007a: 306, // fr-GA
- 0x15d0007e: 307, // fr-GF
- 0x15d00084: 308, // fr-GN
- 0x15d00085: 309, // fr-GP
- 0x15d00086: 310, // fr-GQ
- 0x15d00091: 311, // fr-HT
- 0x15d000a8: 312, // fr-KM
- 0x15d000b7: 313, // fr-LU
- 0x15d000ba: 314, // fr-MA
- 0x15d000bb: 315, // fr-MC
- 0x15d000be: 316, // fr-MF
- 0x15d000bf: 317, // fr-MG
- 0x15d000c3: 318, // fr-ML
- 0x15d000c8: 319, // fr-MQ
- 0x15d000c9: 320, // fr-MR
- 0x15d000cc: 321, // fr-MU
- 0x15d000d3: 322, // fr-NC
- 0x15d000d4: 323, // fr-NE
- 0x15d000e5: 324, // fr-PF
- 0x15d000ea: 325, // fr-PM
- 0x15d00102: 326, // fr-RE
- 0x15d00107: 327, // fr-RW
- 0x15d0010a: 328, // fr-SC
- 0x15d00114: 329, // fr-SN
- 0x15d0011c: 330, // fr-SY
- 0x15d00120: 331, // fr-TD
- 0x15d00122: 332, // fr-TG
- 0x15d00128: 333, // fr-TN
- 0x15d0013f: 334, // fr-VU
- 0x15d00140: 335, // fr-WF
- 0x15d0015f: 336, // fr-YT
- 0x16800000: 337, // fur
- 0x1680009e: 338, // fur-IT
- 0x16c00000: 339, // fy
- 0x16c000d9: 340, // fy-NL
- 0x16d00000: 341, // ga
- 0x16d00096: 342, // ga-IE
- 0x17c00000: 343, // gd
- 0x17c0007b: 344, // gd-GB
- 0x18e00000: 345, // gl
- 0x18e0006e: 346, // gl-ES
- 0x1a100000: 347, // gsw
- 0x1a10004e: 348, // gsw-CH
- 0x1a100078: 349, // gsw-FR
- 0x1a1000b2: 350, // gsw-LI
- 0x1a200000: 351, // gu
- 0x1a200099: 352, // gu-IN
- 0x1a700000: 353, // guw
- 0x1a900000: 354, // guz
- 0x1a9000a4: 355, // guz-KE
- 0x1aa00000: 356, // gv
- 0x1aa00098: 357, // gv-IM
- 0x1b200000: 358, // ha
- 0x1b200080: 359, // ha-GH
- 0x1b2000d4: 360, // ha-NE
- 0x1b2000d6: 361, // ha-NG
- 0x1b600000: 362, // haw
- 0x1b600135: 363, // haw-US
- 0x1ba00000: 364, // he
- 0x1ba00097: 365, // he-IL
- 0x1bc00000: 366, // hi
- 0x1bc00099: 367, // hi-IN
- 0x1cf00000: 368, // hr
- 0x1cf00033: 369, // hr-BA
- 0x1cf00090: 370, // hr-HR
- 0x1d000000: 371, // hsb
- 0x1d000060: 372, // hsb-DE
- 0x1d300000: 373, // hu
- 0x1d300092: 374, // hu-HU
- 0x1d500000: 375, // hy
- 0x1d500028: 376, // hy-AM
- 0x1df00000: 377, // id
- 0x1df00095: 378, // id-ID
- 0x1e500000: 379, // ig
- 0x1e5000d6: 380, // ig-NG
- 0x1e800000: 381, // ii
- 0x1e800053: 382, // ii-CN
- 0x1f600000: 383, // is
- 0x1f60009d: 384, // is-IS
- 0x1f700000: 385, // it
- 0x1f70004e: 386, // it-CH
- 0x1f70009e: 387, // it-IT
- 0x1f700113: 388, // it-SM
- 0x1f700138: 389, // it-VA
- 0x1f800000: 390, // iu
- 0x1fe00000: 391, // ja
- 0x1fe000a2: 392, // ja-JP
- 0x20100000: 393, // jbo
- 0x20500000: 394, // jgo
- 0x20500052: 395, // jgo-CM
- 0x20800000: 396, // jmc
- 0x2080012f: 397, // jmc-TZ
- 0x20c00000: 398, // jv
- 0x20e00000: 399, // ka
- 0x20e0007d: 400, // ka-GE
- 0x21000000: 401, // kab
- 0x21000067: 402, // kab-DZ
- 0x21400000: 403, // kaj
- 0x21500000: 404, // kam
- 0x215000a4: 405, // kam-KE
- 0x21d00000: 406, // kcg
- 0x22100000: 407, // kde
- 0x2210012f: 408, // kde-TZ
- 0x22500000: 409, // kea
- 0x2250005a: 410, // kea-CV
- 0x23200000: 411, // khq
- 0x232000c3: 412, // khq-ML
- 0x23700000: 413, // ki
- 0x237000a4: 414, // ki-KE
- 0x24000000: 415, // kk
- 0x240000ae: 416, // kk-KZ
- 0x24200000: 417, // kkj
- 0x24200052: 418, // kkj-CM
- 0x24300000: 419, // kl
- 0x24300082: 420, // kl-GL
- 0x24400000: 421, // kln
- 0x244000a4: 422, // kln-KE
- 0x24800000: 423, // km
- 0x248000a6: 424, // km-KH
- 0x24f00000: 425, // kn
- 0x24f00099: 426, // kn-IN
- 0x25200000: 427, // ko
- 0x252000aa: 428, // ko-KP
- 0x252000ab: 429, // ko-KR
- 0x25400000: 430, // kok
- 0x25400099: 431, // kok-IN
- 0x26800000: 432, // ks
- 0x26800099: 433, // ks-IN
- 0x26900000: 434, // ksb
- 0x2690012f: 435, // ksb-TZ
- 0x26b00000: 436, // ksf
- 0x26b00052: 437, // ksf-CM
- 0x26c00000: 438, // ksh
- 0x26c00060: 439, // ksh-DE
- 0x27200000: 440, // ku
- 0x27f00000: 441, // kw
- 0x27f0007b: 442, // kw-GB
- 0x28800000: 443, // ky
- 0x288000a5: 444, // ky-KG
- 0x28f00000: 445, // lag
- 0x28f0012f: 446, // lag-TZ
- 0x29300000: 447, // lb
- 0x293000b7: 448, // lb-LU
- 0x2a100000: 449, // lg
- 0x2a100131: 450, // lg-UG
- 0x2ad00000: 451, // lkt
- 0x2ad00135: 452, // lkt-US
- 0x2b300000: 453, // ln
- 0x2b30002a: 454, // ln-AO
- 0x2b30004b: 455, // ln-CD
- 0x2b30004c: 456, // ln-CF
- 0x2b30004d: 457, // ln-CG
- 0x2b600000: 458, // lo
- 0x2b6000af: 459, // lo-LA
- 0x2bd00000: 460, // lrc
- 0x2bd0009b: 461, // lrc-IQ
- 0x2bd0009c: 462, // lrc-IR
- 0x2be00000: 463, // lt
- 0x2be000b6: 464, // lt-LT
- 0x2c000000: 465, // lu
- 0x2c00004b: 466, // lu-CD
- 0x2c200000: 467, // luo
- 0x2c2000a4: 468, // luo-KE
- 0x2c300000: 469, // luy
- 0x2c3000a4: 470, // luy-KE
- 0x2c500000: 471, // lv
- 0x2c5000b8: 472, // lv-LV
- 0x2cf00000: 473, // mas
- 0x2cf000a4: 474, // mas-KE
- 0x2cf0012f: 475, // mas-TZ
- 0x2e700000: 476, // mer
- 0x2e7000a4: 477, // mer-KE
- 0x2eb00000: 478, // mfe
- 0x2eb000cc: 479, // mfe-MU
- 0x2ef00000: 480, // mg
- 0x2ef000bf: 481, // mg-MG
- 0x2f000000: 482, // mgh
- 0x2f0000d1: 483, // mgh-MZ
- 0x2f200000: 484, // mgo
- 0x2f200052: 485, // mgo-CM
- 0x2fd00000: 486, // mk
- 0x2fd000c2: 487, // mk-MK
- 0x30200000: 488, // ml
- 0x30200099: 489, // ml-IN
- 0x30900000: 490, // mn
- 0x309000c5: 491, // mn-MN
- 0x31900000: 492, // mr
- 0x31900099: 493, // mr-IN
- 0x31d00000: 494, // ms
- 0x31d0003e: 495, // ms-BN
- 0x31d000d0: 496, // ms-MY
- 0x31d0010d: 497, // ms-SG
- 0x31e00000: 498, // mt
- 0x31e000cb: 499, // mt-MT
- 0x32300000: 500, // mua
- 0x32300052: 501, // mua-CM
- 0x32f00000: 502, // my
- 0x32f000c4: 503, // my-MM
- 0x33800000: 504, // mzn
- 0x3380009c: 505, // mzn-IR
- 0x33f00000: 506, // nah
- 0x34300000: 507, // naq
- 0x343000d2: 508, // naq-NA
- 0x34500000: 509, // nb
- 0x345000da: 510, // nb-NO
- 0x34500110: 511, // nb-SJ
- 0x34c00000: 512, // nd
- 0x34c00164: 513, // nd-ZW
- 0x34e00000: 514, // nds
- 0x34e00060: 515, // nds-DE
- 0x34e000d9: 516, // nds-NL
- 0x34f00000: 517, // ne
- 0x34f00099: 518, // ne-IN
- 0x34f000db: 519, // ne-NP
- 0x36500000: 520, // nl
- 0x36500030: 521, // nl-AW
- 0x36500036: 522, // nl-BE
- 0x36500040: 523, // nl-BQ
- 0x3650005b: 524, // nl-CW
- 0x365000d9: 525, // nl-NL
- 0x36500116: 526, // nl-SR
- 0x3650011b: 527, // nl-SX
- 0x36600000: 528, // nmg
- 0x36600052: 529, // nmg-CM
- 0x36800000: 530, // nn
- 0x368000da: 531, // nn-NO
- 0x36a00000: 532, // nnh
- 0x36a00052: 533, // nnh-CM
- 0x36d00000: 534, // no
- 0x37300000: 535, // nqo
- 0x37400000: 536, // nr
- 0x37800000: 537, // nso
- 0x37e00000: 538, // nus
- 0x37e00117: 539, // nus-SS
- 0x38500000: 540, // ny
- 0x38700000: 541, // nyn
- 0x38700131: 542, // nyn-UG
- 0x38e00000: 543, // om
- 0x38e0006f: 544, // om-ET
- 0x38e000a4: 545, // om-KE
- 0x39300000: 546, // or
- 0x39300099: 547, // or-IN
- 0x39600000: 548, // os
- 0x3960007d: 549, // os-GE
- 0x39600106: 550, // os-RU
- 0x39b00000: 551, // pa
- 0x39b05000: 552, // pa-Arab
- 0x39b050e8: 553, // pa-Arab-PK
- 0x39b32000: 554, // pa-Guru
- 0x39b32099: 555, // pa-Guru-IN
- 0x39f00000: 556, // pap
- 0x3b100000: 557, // pl
- 0x3b1000e9: 558, // pl-PL
- 0x3bb00000: 559, // prg
- 0x3bb00001: 560, // prg-001
- 0x3bc00000: 561, // ps
- 0x3bc00024: 562, // ps-AF
- 0x3be00000: 563, // pt
- 0x3be0002a: 564, // pt-AO
- 0x3be00041: 565, // pt-BR
- 0x3be0004e: 566, // pt-CH
- 0x3be0005a: 567, // pt-CV
- 0x3be00086: 568, // pt-GQ
- 0x3be0008b: 569, // pt-GW
- 0x3be000b7: 570, // pt-LU
- 0x3be000c6: 571, // pt-MO
- 0x3be000d1: 572, // pt-MZ
- 0x3be000ee: 573, // pt-PT
- 0x3be00118: 574, // pt-ST
- 0x3be00126: 575, // pt-TL
- 0x3c200000: 576, // qu
- 0x3c20003f: 577, // qu-BO
- 0x3c200069: 578, // qu-EC
- 0x3c2000e4: 579, // qu-PE
- 0x3d200000: 580, // rm
- 0x3d20004e: 581, // rm-CH
- 0x3d700000: 582, // rn
- 0x3d70003a: 583, // rn-BI
- 0x3da00000: 584, // ro
- 0x3da000bc: 585, // ro-MD
- 0x3da00104: 586, // ro-RO
- 0x3dc00000: 587, // rof
- 0x3dc0012f: 588, // rof-TZ
- 0x3e000000: 589, // ru
- 0x3e000047: 590, // ru-BY
- 0x3e0000a5: 591, // ru-KG
- 0x3e0000ae: 592, // ru-KZ
- 0x3e0000bc: 593, // ru-MD
- 0x3e000106: 594, // ru-RU
- 0x3e000130: 595, // ru-UA
- 0x3e300000: 596, // rw
- 0x3e300107: 597, // rw-RW
- 0x3e400000: 598, // rwk
- 0x3e40012f: 599, // rwk-TZ
- 0x3e900000: 600, // sah
- 0x3e900106: 601, // sah-RU
- 0x3ea00000: 602, // saq
- 0x3ea000a4: 603, // saq-KE
- 0x3f100000: 604, // sbp
- 0x3f10012f: 605, // sbp-TZ
- 0x3fa00000: 606, // sdh
- 0x3fb00000: 607, // se
- 0x3fb00072: 608, // se-FI
- 0x3fb000da: 609, // se-NO
- 0x3fb0010c: 610, // se-SE
- 0x3fd00000: 611, // seh
- 0x3fd000d1: 612, // seh-MZ
- 0x3ff00000: 613, // ses
- 0x3ff000c3: 614, // ses-ML
- 0x40000000: 615, // sg
- 0x4000004c: 616, // sg-CF
- 0x40600000: 617, // shi
- 0x40655000: 618, // shi-Latn
- 0x406550ba: 619, // shi-Latn-MA
- 0x406d8000: 620, // shi-Tfng
- 0x406d80ba: 621, // shi-Tfng-MA
- 0x40a00000: 622, // si
- 0x40a000b3: 623, // si-LK
- 0x41000000: 624, // sk
- 0x41000111: 625, // sk-SK
- 0x41400000: 626, // sl
- 0x4140010f: 627, // sl-SI
- 0x41a00000: 628, // sma
- 0x41b00000: 629, // smi
- 0x41c00000: 630, // smj
- 0x41d00000: 631, // smn
- 0x41d00072: 632, // smn-FI
- 0x42000000: 633, // sms
- 0x42100000: 634, // sn
- 0x42100164: 635, // sn-ZW
- 0x42700000: 636, // so
- 0x42700062: 637, // so-DJ
- 0x4270006f: 638, // so-ET
- 0x427000a4: 639, // so-KE
- 0x42700115: 640, // so-SO
- 0x42f00000: 641, // sq
- 0x42f00027: 642, // sq-AL
- 0x42f000c2: 643, // sq-MK
- 0x42f0014d: 644, // sq-XK
- 0x43000000: 645, // sr
- 0x4301e000: 646, // sr-Cyrl
- 0x4301e033: 647, // sr-Cyrl-BA
- 0x4301e0bd: 648, // sr-Cyrl-ME
- 0x4301e105: 649, // sr-Cyrl-RS
- 0x4301e14d: 650, // sr-Cyrl-XK
- 0x43055000: 651, // sr-Latn
- 0x43055033: 652, // sr-Latn-BA
- 0x430550bd: 653, // sr-Latn-ME
- 0x43055105: 654, // sr-Latn-RS
- 0x4305514d: 655, // sr-Latn-XK
- 0x43500000: 656, // ss
- 0x43800000: 657, // ssy
- 0x43900000: 658, // st
- 0x44200000: 659, // sv
- 0x44200031: 660, // sv-AX
- 0x44200072: 661, // sv-FI
- 0x4420010c: 662, // sv-SE
- 0x44300000: 663, // sw
- 0x4430004b: 664, // sw-CD
- 0x443000a4: 665, // sw-KE
- 0x4430012f: 666, // sw-TZ
- 0x44300131: 667, // sw-UG
- 0x44c00000: 668, // syr
- 0x44e00000: 669, // ta
- 0x44e00099: 670, // ta-IN
- 0x44e000b3: 671, // ta-LK
- 0x44e000d0: 672, // ta-MY
- 0x44e0010d: 673, // ta-SG
- 0x45f00000: 674, // te
- 0x45f00099: 675, // te-IN
- 0x46200000: 676, // teo
- 0x462000a4: 677, // teo-KE
- 0x46200131: 678, // teo-UG
- 0x46900000: 679, // th
- 0x46900123: 680, // th-TH
- 0x46d00000: 681, // ti
- 0x46d0006d: 682, // ti-ER
- 0x46d0006f: 683, // ti-ET
- 0x46f00000: 684, // tig
- 0x47400000: 685, // tk
- 0x47400127: 686, // tk-TM
- 0x47e00000: 687, // tn
- 0x48000000: 688, // to
- 0x48000129: 689, // to-TO
- 0x48800000: 690, // tr
- 0x4880005d: 691, // tr-CY
- 0x4880012b: 692, // tr-TR
- 0x48c00000: 693, // ts
- 0x4a200000: 694, // twq
- 0x4a2000d4: 695, // twq-NE
- 0x4a700000: 696, // tzm
- 0x4a7000ba: 697, // tzm-MA
- 0x4aa00000: 698, // ug
- 0x4aa00053: 699, // ug-CN
- 0x4ac00000: 700, // uk
- 0x4ac00130: 701, // uk-UA
- 0x4b200000: 702, // ur
- 0x4b200099: 703, // ur-IN
- 0x4b2000e8: 704, // ur-PK
- 0x4ba00000: 705, // uz
- 0x4ba05000: 706, // uz-Arab
- 0x4ba05024: 707, // uz-Arab-AF
- 0x4ba1e000: 708, // uz-Cyrl
- 0x4ba1e137: 709, // uz-Cyrl-UZ
- 0x4ba55000: 710, // uz-Latn
- 0x4ba55137: 711, // uz-Latn-UZ
- 0x4bc00000: 712, // vai
- 0x4bc55000: 713, // vai-Latn
- 0x4bc550b4: 714, // vai-Latn-LR
- 0x4bcdf000: 715, // vai-Vaii
- 0x4bcdf0b4: 716, // vai-Vaii-LR
- 0x4be00000: 717, // ve
- 0x4c100000: 718, // vi
- 0x4c10013e: 719, // vi-VN
- 0x4c700000: 720, // vo
- 0x4c700001: 721, // vo-001
- 0x4ca00000: 722, // vun
- 0x4ca0012f: 723, // vun-TZ
- 0x4cc00000: 724, // wa
- 0x4cd00000: 725, // wae
- 0x4cd0004e: 726, // wae-CH
- 0x4e300000: 727, // wo
- 0x4f000000: 728, // xh
- 0x4f900000: 729, // xog
- 0x4f900131: 730, // xog-UG
- 0x50700000: 731, // yav
- 0x50700052: 732, // yav-CM
- 0x51000000: 733, // yi
- 0x51000001: 734, // yi-001
- 0x51600000: 735, // yo
- 0x5160003b: 736, // yo-BJ
- 0x516000d6: 737, // yo-NG
- 0x51d00000: 738, // yue
- 0x51d0008d: 739, // yue-HK
- 0x52600000: 740, // zgh
- 0x526000ba: 741, // zgh-MA
- 0x52700000: 742, // zh
- 0x52737000: 743, // zh-Hans
- 0x52737053: 744, // zh-Hans-CN
- 0x5273708d: 745, // zh-Hans-HK
- 0x527370c6: 746, // zh-Hans-MO
- 0x5273710d: 747, // zh-Hans-SG
- 0x52738000: 748, // zh-Hant
- 0x5273808d: 749, // zh-Hant-HK
- 0x527380c6: 750, // zh-Hant-MO
- 0x5273812e: 751, // zh-Hant-TW
- 0x52c00000: 752, // zu
- 0x52c00161: 753, // zu-ZA
+ 0x0db00000: 86, // ccp
+ 0x0db00035: 87, // ccp-BD
+ 0x0db00099: 88, // ccp-IN
+ 0x0dc00000: 89, // ce
+ 0x0dc00106: 90, // ce-RU
+ 0x0df00000: 91, // cgg
+ 0x0df00131: 92, // cgg-UG
+ 0x0e500000: 93, // chr
+ 0x0e500135: 94, // chr-US
+ 0x0e900000: 95, // ckb
+ 0x0e90009b: 96, // ckb-IQ
+ 0x0e90009c: 97, // ckb-IR
+ 0x0fa00000: 98, // cs
+ 0x0fa0005e: 99, // cs-CZ
+ 0x0fe00000: 100, // cu
+ 0x0fe00106: 101, // cu-RU
+ 0x10000000: 102, // cy
+ 0x1000007b: 103, // cy-GB
+ 0x10100000: 104, // da
+ 0x10100063: 105, // da-DK
+ 0x10100082: 106, // da-GL
+ 0x10800000: 107, // dav
+ 0x108000a4: 108, // dav-KE
+ 0x10d00000: 109, // de
+ 0x10d0002e: 110, // de-AT
+ 0x10d00036: 111, // de-BE
+ 0x10d0004e: 112, // de-CH
+ 0x10d00060: 113, // de-DE
+ 0x10d0009e: 114, // de-IT
+ 0x10d000b2: 115, // de-LI
+ 0x10d000b7: 116, // de-LU
+ 0x11700000: 117, // dje
+ 0x117000d4: 118, // dje-NE
+ 0x11f00000: 119, // dsb
+ 0x11f00060: 120, // dsb-DE
+ 0x12400000: 121, // dua
+ 0x12400052: 122, // dua-CM
+ 0x12800000: 123, // dv
+ 0x12b00000: 124, // dyo
+ 0x12b00114: 125, // dyo-SN
+ 0x12d00000: 126, // dz
+ 0x12d00043: 127, // dz-BT
+ 0x12f00000: 128, // ebu
+ 0x12f000a4: 129, // ebu-KE
+ 0x13000000: 130, // ee
+ 0x13000080: 131, // ee-GH
+ 0x13000122: 132, // ee-TG
+ 0x13600000: 133, // el
+ 0x1360005d: 134, // el-CY
+ 0x13600087: 135, // el-GR
+ 0x13900000: 136, // en
+ 0x13900001: 137, // en-001
+ 0x1390001a: 138, // en-150
+ 0x13900025: 139, // en-AG
+ 0x13900026: 140, // en-AI
+ 0x1390002d: 141, // en-AS
+ 0x1390002e: 142, // en-AT
+ 0x1390002f: 143, // en-AU
+ 0x13900034: 144, // en-BB
+ 0x13900036: 145, // en-BE
+ 0x1390003a: 146, // en-BI
+ 0x1390003d: 147, // en-BM
+ 0x13900042: 148, // en-BS
+ 0x13900046: 149, // en-BW
+ 0x13900048: 150, // en-BZ
+ 0x13900049: 151, // en-CA
+ 0x1390004a: 152, // en-CC
+ 0x1390004e: 153, // en-CH
+ 0x13900050: 154, // en-CK
+ 0x13900052: 155, // en-CM
+ 0x1390005c: 156, // en-CX
+ 0x1390005d: 157, // en-CY
+ 0x13900060: 158, // en-DE
+ 0x13900061: 159, // en-DG
+ 0x13900063: 160, // en-DK
+ 0x13900064: 161, // en-DM
+ 0x1390006d: 162, // en-ER
+ 0x13900072: 163, // en-FI
+ 0x13900073: 164, // en-FJ
+ 0x13900074: 165, // en-FK
+ 0x13900075: 166, // en-FM
+ 0x1390007b: 167, // en-GB
+ 0x1390007c: 168, // en-GD
+ 0x1390007f: 169, // en-GG
+ 0x13900080: 170, // en-GH
+ 0x13900081: 171, // en-GI
+ 0x13900083: 172, // en-GM
+ 0x1390008a: 173, // en-GU
+ 0x1390008c: 174, // en-GY
+ 0x1390008d: 175, // en-HK
+ 0x13900096: 176, // en-IE
+ 0x13900097: 177, // en-IL
+ 0x13900098: 178, // en-IM
+ 0x13900099: 179, // en-IN
+ 0x1390009a: 180, // en-IO
+ 0x1390009f: 181, // en-JE
+ 0x139000a0: 182, // en-JM
+ 0x139000a4: 183, // en-KE
+ 0x139000a7: 184, // en-KI
+ 0x139000a9: 185, // en-KN
+ 0x139000ad: 186, // en-KY
+ 0x139000b1: 187, // en-LC
+ 0x139000b4: 188, // en-LR
+ 0x139000b5: 189, // en-LS
+ 0x139000bf: 190, // en-MG
+ 0x139000c0: 191, // en-MH
+ 0x139000c6: 192, // en-MO
+ 0x139000c7: 193, // en-MP
+ 0x139000ca: 194, // en-MS
+ 0x139000cb: 195, // en-MT
+ 0x139000cc: 196, // en-MU
+ 0x139000ce: 197, // en-MW
+ 0x139000d0: 198, // en-MY
+ 0x139000d2: 199, // en-NA
+ 0x139000d5: 200, // en-NF
+ 0x139000d6: 201, // en-NG
+ 0x139000d9: 202, // en-NL
+ 0x139000dd: 203, // en-NR
+ 0x139000df: 204, // en-NU
+ 0x139000e0: 205, // en-NZ
+ 0x139000e6: 206, // en-PG
+ 0x139000e7: 207, // en-PH
+ 0x139000e8: 208, // en-PK
+ 0x139000eb: 209, // en-PN
+ 0x139000ec: 210, // en-PR
+ 0x139000f0: 211, // en-PW
+ 0x13900107: 212, // en-RW
+ 0x13900109: 213, // en-SB
+ 0x1390010a: 214, // en-SC
+ 0x1390010b: 215, // en-SD
+ 0x1390010c: 216, // en-SE
+ 0x1390010d: 217, // en-SG
+ 0x1390010e: 218, // en-SH
+ 0x1390010f: 219, // en-SI
+ 0x13900112: 220, // en-SL
+ 0x13900117: 221, // en-SS
+ 0x1390011b: 222, // en-SX
+ 0x1390011d: 223, // en-SZ
+ 0x1390011f: 224, // en-TC
+ 0x13900125: 225, // en-TK
+ 0x13900129: 226, // en-TO
+ 0x1390012c: 227, // en-TT
+ 0x1390012d: 228, // en-TV
+ 0x1390012f: 229, // en-TZ
+ 0x13900131: 230, // en-UG
+ 0x13900133: 231, // en-UM
+ 0x13900135: 232, // en-US
+ 0x13900139: 233, // en-VC
+ 0x1390013c: 234, // en-VG
+ 0x1390013d: 235, // en-VI
+ 0x1390013f: 236, // en-VU
+ 0x13900142: 237, // en-WS
+ 0x13900161: 238, // en-ZA
+ 0x13900162: 239, // en-ZM
+ 0x13900164: 240, // en-ZW
+ 0x13c00000: 241, // eo
+ 0x13c00001: 242, // eo-001
+ 0x13e00000: 243, // es
+ 0x13e0001f: 244, // es-419
+ 0x13e0002c: 245, // es-AR
+ 0x13e0003f: 246, // es-BO
+ 0x13e00041: 247, // es-BR
+ 0x13e00048: 248, // es-BZ
+ 0x13e00051: 249, // es-CL
+ 0x13e00054: 250, // es-CO
+ 0x13e00056: 251, // es-CR
+ 0x13e00059: 252, // es-CU
+ 0x13e00065: 253, // es-DO
+ 0x13e00068: 254, // es-EA
+ 0x13e00069: 255, // es-EC
+ 0x13e0006e: 256, // es-ES
+ 0x13e00086: 257, // es-GQ
+ 0x13e00089: 258, // es-GT
+ 0x13e0008f: 259, // es-HN
+ 0x13e00094: 260, // es-IC
+ 0x13e000cf: 261, // es-MX
+ 0x13e000d8: 262, // es-NI
+ 0x13e000e2: 263, // es-PA
+ 0x13e000e4: 264, // es-PE
+ 0x13e000e7: 265, // es-PH
+ 0x13e000ec: 266, // es-PR
+ 0x13e000f1: 267, // es-PY
+ 0x13e0011a: 268, // es-SV
+ 0x13e00135: 269, // es-US
+ 0x13e00136: 270, // es-UY
+ 0x13e0013b: 271, // es-VE
+ 0x14000000: 272, // et
+ 0x1400006a: 273, // et-EE
+ 0x14500000: 274, // eu
+ 0x1450006e: 275, // eu-ES
+ 0x14600000: 276, // ewo
+ 0x14600052: 277, // ewo-CM
+ 0x14800000: 278, // fa
+ 0x14800024: 279, // fa-AF
+ 0x1480009c: 280, // fa-IR
+ 0x14e00000: 281, // ff
+ 0x14e00052: 282, // ff-CM
+ 0x14e00084: 283, // ff-GN
+ 0x14e000c9: 284, // ff-MR
+ 0x14e00114: 285, // ff-SN
+ 0x15100000: 286, // fi
+ 0x15100072: 287, // fi-FI
+ 0x15300000: 288, // fil
+ 0x153000e7: 289, // fil-PH
+ 0x15800000: 290, // fo
+ 0x15800063: 291, // fo-DK
+ 0x15800076: 292, // fo-FO
+ 0x15e00000: 293, // fr
+ 0x15e00036: 294, // fr-BE
+ 0x15e00037: 295, // fr-BF
+ 0x15e0003a: 296, // fr-BI
+ 0x15e0003b: 297, // fr-BJ
+ 0x15e0003c: 298, // fr-BL
+ 0x15e00049: 299, // fr-CA
+ 0x15e0004b: 300, // fr-CD
+ 0x15e0004c: 301, // fr-CF
+ 0x15e0004d: 302, // fr-CG
+ 0x15e0004e: 303, // fr-CH
+ 0x15e0004f: 304, // fr-CI
+ 0x15e00052: 305, // fr-CM
+ 0x15e00062: 306, // fr-DJ
+ 0x15e00067: 307, // fr-DZ
+ 0x15e00078: 308, // fr-FR
+ 0x15e0007a: 309, // fr-GA
+ 0x15e0007e: 310, // fr-GF
+ 0x15e00084: 311, // fr-GN
+ 0x15e00085: 312, // fr-GP
+ 0x15e00086: 313, // fr-GQ
+ 0x15e00091: 314, // fr-HT
+ 0x15e000a8: 315, // fr-KM
+ 0x15e000b7: 316, // fr-LU
+ 0x15e000ba: 317, // fr-MA
+ 0x15e000bb: 318, // fr-MC
+ 0x15e000be: 319, // fr-MF
+ 0x15e000bf: 320, // fr-MG
+ 0x15e000c3: 321, // fr-ML
+ 0x15e000c8: 322, // fr-MQ
+ 0x15e000c9: 323, // fr-MR
+ 0x15e000cc: 324, // fr-MU
+ 0x15e000d3: 325, // fr-NC
+ 0x15e000d4: 326, // fr-NE
+ 0x15e000e5: 327, // fr-PF
+ 0x15e000ea: 328, // fr-PM
+ 0x15e00102: 329, // fr-RE
+ 0x15e00107: 330, // fr-RW
+ 0x15e0010a: 331, // fr-SC
+ 0x15e00114: 332, // fr-SN
+ 0x15e0011c: 333, // fr-SY
+ 0x15e00120: 334, // fr-TD
+ 0x15e00122: 335, // fr-TG
+ 0x15e00128: 336, // fr-TN
+ 0x15e0013f: 337, // fr-VU
+ 0x15e00140: 338, // fr-WF
+ 0x15e0015f: 339, // fr-YT
+ 0x16900000: 340, // fur
+ 0x1690009e: 341, // fur-IT
+ 0x16d00000: 342, // fy
+ 0x16d000d9: 343, // fy-NL
+ 0x16e00000: 344, // ga
+ 0x16e00096: 345, // ga-IE
+ 0x17e00000: 346, // gd
+ 0x17e0007b: 347, // gd-GB
+ 0x19000000: 348, // gl
+ 0x1900006e: 349, // gl-ES
+ 0x1a300000: 350, // gsw
+ 0x1a30004e: 351, // gsw-CH
+ 0x1a300078: 352, // gsw-FR
+ 0x1a3000b2: 353, // gsw-LI
+ 0x1a400000: 354, // gu
+ 0x1a400099: 355, // gu-IN
+ 0x1a900000: 356, // guw
+ 0x1ab00000: 357, // guz
+ 0x1ab000a4: 358, // guz-KE
+ 0x1ac00000: 359, // gv
+ 0x1ac00098: 360, // gv-IM
+ 0x1b400000: 361, // ha
+ 0x1b400080: 362, // ha-GH
+ 0x1b4000d4: 363, // ha-NE
+ 0x1b4000d6: 364, // ha-NG
+ 0x1b800000: 365, // haw
+ 0x1b800135: 366, // haw-US
+ 0x1bc00000: 367, // he
+ 0x1bc00097: 368, // he-IL
+ 0x1be00000: 369, // hi
+ 0x1be00099: 370, // hi-IN
+ 0x1d100000: 371, // hr
+ 0x1d100033: 372, // hr-BA
+ 0x1d100090: 373, // hr-HR
+ 0x1d200000: 374, // hsb
+ 0x1d200060: 375, // hsb-DE
+ 0x1d500000: 376, // hu
+ 0x1d500092: 377, // hu-HU
+ 0x1d700000: 378, // hy
+ 0x1d700028: 379, // hy-AM
+ 0x1e100000: 380, // id
+ 0x1e100095: 381, // id-ID
+ 0x1e700000: 382, // ig
+ 0x1e7000d6: 383, // ig-NG
+ 0x1ea00000: 384, // ii
+ 0x1ea00053: 385, // ii-CN
+ 0x1f500000: 386, // io
+ 0x1f800000: 387, // is
+ 0x1f80009d: 388, // is-IS
+ 0x1f900000: 389, // it
+ 0x1f90004e: 390, // it-CH
+ 0x1f90009e: 391, // it-IT
+ 0x1f900113: 392, // it-SM
+ 0x1f900138: 393, // it-VA
+ 0x1fa00000: 394, // iu
+ 0x20000000: 395, // ja
+ 0x200000a2: 396, // ja-JP
+ 0x20300000: 397, // jbo
+ 0x20700000: 398, // jgo
+ 0x20700052: 399, // jgo-CM
+ 0x20a00000: 400, // jmc
+ 0x20a0012f: 401, // jmc-TZ
+ 0x20e00000: 402, // jv
+ 0x21000000: 403, // ka
+ 0x2100007d: 404, // ka-GE
+ 0x21200000: 405, // kab
+ 0x21200067: 406, // kab-DZ
+ 0x21600000: 407, // kaj
+ 0x21700000: 408, // kam
+ 0x217000a4: 409, // kam-KE
+ 0x21f00000: 410, // kcg
+ 0x22300000: 411, // kde
+ 0x2230012f: 412, // kde-TZ
+ 0x22700000: 413, // kea
+ 0x2270005a: 414, // kea-CV
+ 0x23400000: 415, // khq
+ 0x234000c3: 416, // khq-ML
+ 0x23900000: 417, // ki
+ 0x239000a4: 418, // ki-KE
+ 0x24200000: 419, // kk
+ 0x242000ae: 420, // kk-KZ
+ 0x24400000: 421, // kkj
+ 0x24400052: 422, // kkj-CM
+ 0x24500000: 423, // kl
+ 0x24500082: 424, // kl-GL
+ 0x24600000: 425, // kln
+ 0x246000a4: 426, // kln-KE
+ 0x24a00000: 427, // km
+ 0x24a000a6: 428, // km-KH
+ 0x25100000: 429, // kn
+ 0x25100099: 430, // kn-IN
+ 0x25400000: 431, // ko
+ 0x254000aa: 432, // ko-KP
+ 0x254000ab: 433, // ko-KR
+ 0x25600000: 434, // kok
+ 0x25600099: 435, // kok-IN
+ 0x26a00000: 436, // ks
+ 0x26a00099: 437, // ks-IN
+ 0x26b00000: 438, // ksb
+ 0x26b0012f: 439, // ksb-TZ
+ 0x26d00000: 440, // ksf
+ 0x26d00052: 441, // ksf-CM
+ 0x26e00000: 442, // ksh
+ 0x26e00060: 443, // ksh-DE
+ 0x27400000: 444, // ku
+ 0x28100000: 445, // kw
+ 0x2810007b: 446, // kw-GB
+ 0x28a00000: 447, // ky
+ 0x28a000a5: 448, // ky-KG
+ 0x29100000: 449, // lag
+ 0x2910012f: 450, // lag-TZ
+ 0x29500000: 451, // lb
+ 0x295000b7: 452, // lb-LU
+ 0x2a300000: 453, // lg
+ 0x2a300131: 454, // lg-UG
+ 0x2af00000: 455, // lkt
+ 0x2af00135: 456, // lkt-US
+ 0x2b500000: 457, // ln
+ 0x2b50002a: 458, // ln-AO
+ 0x2b50004b: 459, // ln-CD
+ 0x2b50004c: 460, // ln-CF
+ 0x2b50004d: 461, // ln-CG
+ 0x2b800000: 462, // lo
+ 0x2b8000af: 463, // lo-LA
+ 0x2bf00000: 464, // lrc
+ 0x2bf0009b: 465, // lrc-IQ
+ 0x2bf0009c: 466, // lrc-IR
+ 0x2c000000: 467, // lt
+ 0x2c0000b6: 468, // lt-LT
+ 0x2c200000: 469, // lu
+ 0x2c20004b: 470, // lu-CD
+ 0x2c400000: 471, // luo
+ 0x2c4000a4: 472, // luo-KE
+ 0x2c500000: 473, // luy
+ 0x2c5000a4: 474, // luy-KE
+ 0x2c700000: 475, // lv
+ 0x2c7000b8: 476, // lv-LV
+ 0x2d100000: 477, // mas
+ 0x2d1000a4: 478, // mas-KE
+ 0x2d10012f: 479, // mas-TZ
+ 0x2e900000: 480, // mer
+ 0x2e9000a4: 481, // mer-KE
+ 0x2ed00000: 482, // mfe
+ 0x2ed000cc: 483, // mfe-MU
+ 0x2f100000: 484, // mg
+ 0x2f1000bf: 485, // mg-MG
+ 0x2f200000: 486, // mgh
+ 0x2f2000d1: 487, // mgh-MZ
+ 0x2f400000: 488, // mgo
+ 0x2f400052: 489, // mgo-CM
+ 0x2ff00000: 490, // mk
+ 0x2ff000c2: 491, // mk-MK
+ 0x30400000: 492, // ml
+ 0x30400099: 493, // ml-IN
+ 0x30b00000: 494, // mn
+ 0x30b000c5: 495, // mn-MN
+ 0x31b00000: 496, // mr
+ 0x31b00099: 497, // mr-IN
+ 0x31f00000: 498, // ms
+ 0x31f0003e: 499, // ms-BN
+ 0x31f000d0: 500, // ms-MY
+ 0x31f0010d: 501, // ms-SG
+ 0x32000000: 502, // mt
+ 0x320000cb: 503, // mt-MT
+ 0x32500000: 504, // mua
+ 0x32500052: 505, // mua-CM
+ 0x33100000: 506, // my
+ 0x331000c4: 507, // my-MM
+ 0x33a00000: 508, // mzn
+ 0x33a0009c: 509, // mzn-IR
+ 0x34100000: 510, // nah
+ 0x34500000: 511, // naq
+ 0x345000d2: 512, // naq-NA
+ 0x34700000: 513, // nb
+ 0x347000da: 514, // nb-NO
+ 0x34700110: 515, // nb-SJ
+ 0x34e00000: 516, // nd
+ 0x34e00164: 517, // nd-ZW
+ 0x35000000: 518, // nds
+ 0x35000060: 519, // nds-DE
+ 0x350000d9: 520, // nds-NL
+ 0x35100000: 521, // ne
+ 0x35100099: 522, // ne-IN
+ 0x351000db: 523, // ne-NP
+ 0x36700000: 524, // nl
+ 0x36700030: 525, // nl-AW
+ 0x36700036: 526, // nl-BE
+ 0x36700040: 527, // nl-BQ
+ 0x3670005b: 528, // nl-CW
+ 0x367000d9: 529, // nl-NL
+ 0x36700116: 530, // nl-SR
+ 0x3670011b: 531, // nl-SX
+ 0x36800000: 532, // nmg
+ 0x36800052: 533, // nmg-CM
+ 0x36a00000: 534, // nn
+ 0x36a000da: 535, // nn-NO
+ 0x36c00000: 536, // nnh
+ 0x36c00052: 537, // nnh-CM
+ 0x36f00000: 538, // no
+ 0x37500000: 539, // nqo
+ 0x37600000: 540, // nr
+ 0x37a00000: 541, // nso
+ 0x38000000: 542, // nus
+ 0x38000117: 543, // nus-SS
+ 0x38700000: 544, // ny
+ 0x38900000: 545, // nyn
+ 0x38900131: 546, // nyn-UG
+ 0x39000000: 547, // om
+ 0x3900006f: 548, // om-ET
+ 0x390000a4: 549, // om-KE
+ 0x39500000: 550, // or
+ 0x39500099: 551, // or-IN
+ 0x39800000: 552, // os
+ 0x3980007d: 553, // os-GE
+ 0x39800106: 554, // os-RU
+ 0x39d00000: 555, // pa
+ 0x39d05000: 556, // pa-Arab
+ 0x39d050e8: 557, // pa-Arab-PK
+ 0x39d33000: 558, // pa-Guru
+ 0x39d33099: 559, // pa-Guru-IN
+ 0x3a100000: 560, // pap
+ 0x3b300000: 561, // pl
+ 0x3b3000e9: 562, // pl-PL
+ 0x3bd00000: 563, // prg
+ 0x3bd00001: 564, // prg-001
+ 0x3be00000: 565, // ps
+ 0x3be00024: 566, // ps-AF
+ 0x3c000000: 567, // pt
+ 0x3c00002a: 568, // pt-AO
+ 0x3c000041: 569, // pt-BR
+ 0x3c00004e: 570, // pt-CH
+ 0x3c00005a: 571, // pt-CV
+ 0x3c000086: 572, // pt-GQ
+ 0x3c00008b: 573, // pt-GW
+ 0x3c0000b7: 574, // pt-LU
+ 0x3c0000c6: 575, // pt-MO
+ 0x3c0000d1: 576, // pt-MZ
+ 0x3c0000ee: 577, // pt-PT
+ 0x3c000118: 578, // pt-ST
+ 0x3c000126: 579, // pt-TL
+ 0x3c400000: 580, // qu
+ 0x3c40003f: 581, // qu-BO
+ 0x3c400069: 582, // qu-EC
+ 0x3c4000e4: 583, // qu-PE
+ 0x3d400000: 584, // rm
+ 0x3d40004e: 585, // rm-CH
+ 0x3d900000: 586, // rn
+ 0x3d90003a: 587, // rn-BI
+ 0x3dc00000: 588, // ro
+ 0x3dc000bc: 589, // ro-MD
+ 0x3dc00104: 590, // ro-RO
+ 0x3de00000: 591, // rof
+ 0x3de0012f: 592, // rof-TZ
+ 0x3e200000: 593, // ru
+ 0x3e200047: 594, // ru-BY
+ 0x3e2000a5: 595, // ru-KG
+ 0x3e2000ae: 596, // ru-KZ
+ 0x3e2000bc: 597, // ru-MD
+ 0x3e200106: 598, // ru-RU
+ 0x3e200130: 599, // ru-UA
+ 0x3e500000: 600, // rw
+ 0x3e500107: 601, // rw-RW
+ 0x3e600000: 602, // rwk
+ 0x3e60012f: 603, // rwk-TZ
+ 0x3eb00000: 604, // sah
+ 0x3eb00106: 605, // sah-RU
+ 0x3ec00000: 606, // saq
+ 0x3ec000a4: 607, // saq-KE
+ 0x3f300000: 608, // sbp
+ 0x3f30012f: 609, // sbp-TZ
+ 0x3fa00000: 610, // sd
+ 0x3fa000e8: 611, // sd-PK
+ 0x3fc00000: 612, // sdh
+ 0x3fd00000: 613, // se
+ 0x3fd00072: 614, // se-FI
+ 0x3fd000da: 615, // se-NO
+ 0x3fd0010c: 616, // se-SE
+ 0x3ff00000: 617, // seh
+ 0x3ff000d1: 618, // seh-MZ
+ 0x40100000: 619, // ses
+ 0x401000c3: 620, // ses-ML
+ 0x40200000: 621, // sg
+ 0x4020004c: 622, // sg-CF
+ 0x40800000: 623, // shi
+ 0x40857000: 624, // shi-Latn
+ 0x408570ba: 625, // shi-Latn-MA
+ 0x408dc000: 626, // shi-Tfng
+ 0x408dc0ba: 627, // shi-Tfng-MA
+ 0x40c00000: 628, // si
+ 0x40c000b3: 629, // si-LK
+ 0x41200000: 630, // sk
+ 0x41200111: 631, // sk-SK
+ 0x41600000: 632, // sl
+ 0x4160010f: 633, // sl-SI
+ 0x41c00000: 634, // sma
+ 0x41d00000: 635, // smi
+ 0x41e00000: 636, // smj
+ 0x41f00000: 637, // smn
+ 0x41f00072: 638, // smn-FI
+ 0x42200000: 639, // sms
+ 0x42300000: 640, // sn
+ 0x42300164: 641, // sn-ZW
+ 0x42900000: 642, // so
+ 0x42900062: 643, // so-DJ
+ 0x4290006f: 644, // so-ET
+ 0x429000a4: 645, // so-KE
+ 0x42900115: 646, // so-SO
+ 0x43100000: 647, // sq
+ 0x43100027: 648, // sq-AL
+ 0x431000c2: 649, // sq-MK
+ 0x4310014d: 650, // sq-XK
+ 0x43200000: 651, // sr
+ 0x4321f000: 652, // sr-Cyrl
+ 0x4321f033: 653, // sr-Cyrl-BA
+ 0x4321f0bd: 654, // sr-Cyrl-ME
+ 0x4321f105: 655, // sr-Cyrl-RS
+ 0x4321f14d: 656, // sr-Cyrl-XK
+ 0x43257000: 657, // sr-Latn
+ 0x43257033: 658, // sr-Latn-BA
+ 0x432570bd: 659, // sr-Latn-ME
+ 0x43257105: 660, // sr-Latn-RS
+ 0x4325714d: 661, // sr-Latn-XK
+ 0x43700000: 662, // ss
+ 0x43a00000: 663, // ssy
+ 0x43b00000: 664, // st
+ 0x44400000: 665, // sv
+ 0x44400031: 666, // sv-AX
+ 0x44400072: 667, // sv-FI
+ 0x4440010c: 668, // sv-SE
+ 0x44500000: 669, // sw
+ 0x4450004b: 670, // sw-CD
+ 0x445000a4: 671, // sw-KE
+ 0x4450012f: 672, // sw-TZ
+ 0x44500131: 673, // sw-UG
+ 0x44e00000: 674, // syr
+ 0x45000000: 675, // ta
+ 0x45000099: 676, // ta-IN
+ 0x450000b3: 677, // ta-LK
+ 0x450000d0: 678, // ta-MY
+ 0x4500010d: 679, // ta-SG
+ 0x46100000: 680, // te
+ 0x46100099: 681, // te-IN
+ 0x46400000: 682, // teo
+ 0x464000a4: 683, // teo-KE
+ 0x46400131: 684, // teo-UG
+ 0x46700000: 685, // tg
+ 0x46700124: 686, // tg-TJ
+ 0x46b00000: 687, // th
+ 0x46b00123: 688, // th-TH
+ 0x46f00000: 689, // ti
+ 0x46f0006d: 690, // ti-ER
+ 0x46f0006f: 691, // ti-ET
+ 0x47100000: 692, // tig
+ 0x47600000: 693, // tk
+ 0x47600127: 694, // tk-TM
+ 0x48000000: 695, // tn
+ 0x48200000: 696, // to
+ 0x48200129: 697, // to-TO
+ 0x48a00000: 698, // tr
+ 0x48a0005d: 699, // tr-CY
+ 0x48a0012b: 700, // tr-TR
+ 0x48e00000: 701, // ts
+ 0x49400000: 702, // tt
+ 0x49400106: 703, // tt-RU
+ 0x4a400000: 704, // twq
+ 0x4a4000d4: 705, // twq-NE
+ 0x4a900000: 706, // tzm
+ 0x4a9000ba: 707, // tzm-MA
+ 0x4ac00000: 708, // ug
+ 0x4ac00053: 709, // ug-CN
+ 0x4ae00000: 710, // uk
+ 0x4ae00130: 711, // uk-UA
+ 0x4b400000: 712, // ur
+ 0x4b400099: 713, // ur-IN
+ 0x4b4000e8: 714, // ur-PK
+ 0x4bc00000: 715, // uz
+ 0x4bc05000: 716, // uz-Arab
+ 0x4bc05024: 717, // uz-Arab-AF
+ 0x4bc1f000: 718, // uz-Cyrl
+ 0x4bc1f137: 719, // uz-Cyrl-UZ
+ 0x4bc57000: 720, // uz-Latn
+ 0x4bc57137: 721, // uz-Latn-UZ
+ 0x4be00000: 722, // vai
+ 0x4be57000: 723, // vai-Latn
+ 0x4be570b4: 724, // vai-Latn-LR
+ 0x4bee3000: 725, // vai-Vaii
+ 0x4bee30b4: 726, // vai-Vaii-LR
+ 0x4c000000: 727, // ve
+ 0x4c300000: 728, // vi
+ 0x4c30013e: 729, // vi-VN
+ 0x4c900000: 730, // vo
+ 0x4c900001: 731, // vo-001
+ 0x4cc00000: 732, // vun
+ 0x4cc0012f: 733, // vun-TZ
+ 0x4ce00000: 734, // wa
+ 0x4cf00000: 735, // wae
+ 0x4cf0004e: 736, // wae-CH
+ 0x4e500000: 737, // wo
+ 0x4e500114: 738, // wo-SN
+ 0x4f200000: 739, // xh
+ 0x4fb00000: 740, // xog
+ 0x4fb00131: 741, // xog-UG
+ 0x50900000: 742, // yav
+ 0x50900052: 743, // yav-CM
+ 0x51200000: 744, // yi
+ 0x51200001: 745, // yi-001
+ 0x51800000: 746, // yo
+ 0x5180003b: 747, // yo-BJ
+ 0x518000d6: 748, // yo-NG
+ 0x51f00000: 749, // yue
+ 0x51f38000: 750, // yue-Hans
+ 0x51f38053: 751, // yue-Hans-CN
+ 0x51f39000: 752, // yue-Hant
+ 0x51f3908d: 753, // yue-Hant-HK
+ 0x52800000: 754, // zgh
+ 0x528000ba: 755, // zgh-MA
+ 0x52900000: 756, // zh
+ 0x52938000: 757, // zh-Hans
+ 0x52938053: 758, // zh-Hans-CN
+ 0x5293808d: 759, // zh-Hans-HK
+ 0x529380c6: 760, // zh-Hans-MO
+ 0x5293810d: 761, // zh-Hans-SG
+ 0x52939000: 762, // zh-Hant
+ 0x5293908d: 763, // zh-Hant-HK
+ 0x529390c6: 764, // zh-Hant-MO
+ 0x5293912e: 765, // zh-Hant-TW
+ 0x52f00000: 766, // zu
+ 0x52f00161: 767, // zu-ZA
}
-// Total table size 4592 bytes (4KiB); checksum: C25F8AFF
+// Total table size 4676 bytes (4KiB); checksum: 17BE3673
diff --git a/vendor/golang.org/x/text/language/language.go b/vendor/golang.org/x/text/language/language.go
index ed1011f..b65e213 100644
--- a/vendor/golang.org/x/text/language/language.go
+++ b/vendor/golang.org/x/text/language/language.go
@@ -299,6 +299,26 @@ func (t Tag) String() string {
return string(buf[:t.genCoreBytes(buf[:])])
}
+// MarshalText implements encoding.TextMarshaler.
+func (t Tag) MarshalText() (text []byte, err error) {
+ if t.str != "" {
+ text = append(text, t.str...)
+ } else if t.script == 0 && t.region == 0 {
+ text = append(text, t.lang.String()...)
+ } else {
+ buf := [maxCoreSize]byte{}
+ text = buf[:t.genCoreBytes(buf[:])]
+ }
+ return text, nil
+}
+
+// UnmarshalText implements encoding.TextUnmarshaler.
+func (t *Tag) UnmarshalText(text []byte) error {
+ tag, err := Raw.Parse(string(text))
+ *t = tag
+ return err
+}
+
// Base returns the base language of the language tag. If the base language is
// unspecified, an attempt will be made to infer it from the context.
// It uses a variant of CLDR's Add Likely Subtags algorithm. This is subject to change.
diff --git a/vendor/golang.org/x/text/language/language_test.go b/vendor/golang.org/x/text/language/language_test.go
index f7c2d88..9e42d15 100644
--- a/vendor/golang.org/x/text/language/language_test.go
+++ b/vendor/golang.org/x/text/language/language_test.go
@@ -91,11 +91,11 @@ func TestCompactIndex(t *testing.T) {
{"ca-ES-valencia-u-co-phonebk", 1, true},
{"ca-ES-valencia-u-co-phonebk-va-posix", 0, false},
{"x-klingon", 0, false},
- {"en-US", 229, true},
+ {"en-US", 232, true},
{"en-US-u-va-posix", 2, true},
- {"en", 133, true},
- {"en-u-co-phonebk", 133, true},
- {"en-001", 134, true},
+ {"en", 136, true},
+ {"en-u-co-phonebk", 136, true},
+ {"en-001", 137, true},
{"sh", 0, false}, // We don't normalize.
}
for _, tt := range tests {
@@ -106,6 +106,39 @@ func TestCompactIndex(t *testing.T) {
}
}
+func TestMarshal(t *testing.T) {
+ testCases := []string{
+ // TODO: these values will change with each CLDR update. This issue
+ // will be solved if we decide to fix the indexes.
+ "und",
+ "ca-ES-valencia",
+ "ca-ES-valencia-u-va-posix",
+ "ca-ES-valencia-u-co-phonebk",
+ "ca-ES-valencia-u-co-phonebk-va-posix",
+ "x-klingon",
+ "en-US",
+ "en-US-u-va-posix",
+ "en",
+ "en-u-co-phonebk",
+ "en-001",
+ "sh",
+ }
+ for _, tc := range testCases {
+ var tag Tag
+ err := tag.UnmarshalText([]byte(tc))
+ if err != nil {
+ t.Errorf("UnmarshalText(%q): unexpected error: %v", tc, err)
+ }
+ b, err := tag.MarshalText()
+ if err != nil {
+ t.Errorf("MarshalText(%q): unexpected error: %v", tc, err)
+ }
+ if got := string(b); got != tc {
+ t.Errorf("%s: got %q; want %q", tc, got, tc)
+ }
+ }
+}
+
func TestBase(t *testing.T) {
tests := []struct {
loc, lang string
diff --git a/vendor/golang.org/x/text/language/tables.go b/vendor/golang.org/x/text/language/tables.go
index ec17f97..b738d45 100644
--- a/vendor/golang.org/x/text/language/tables.go
+++ b/vendor/golang.org/x/text/language/tables.go
@@ -5,11 +5,11 @@ package language
import "golang.org/x/text/internal/tag"
// CLDRVersion is the CLDR version from which the tables in this package are derived.
-const CLDRVersion = "31"
+const CLDRVersion = "32"
const numLanguages = 8665
-const numScripts = 237
+const numScripts = 242
const numRegions = 357
@@ -18,7 +18,7 @@ type fromTo struct {
to uint16
}
-const nonCanonicalUnd = 1199
+const nonCanonicalUnd = 1201
const (
_af = 22
_am = 39
@@ -27,96 +27,96 @@ const (
_bg = 126
_bn = 165
_ca = 215
- _cs = 249
- _da = 256
- _de = 268
- _el = 309
- _en = 312
- _es = 317
- _et = 319
- _fa = 327
- _fi = 336
- _fil = 338
- _fr = 349
- _gu = 418
- _he = 442
- _hi = 444
- _hr = 463
- _hu = 467
- _hy = 469
- _id = 479
- _is = 502
- _it = 503
- _ja = 510
- _ka = 526
- _kk = 576
- _km = 584
- _kn = 591
- _ko = 594
- _ky = 648
- _lo = 694
- _lt = 702
- _lv = 709
- _mk = 765
- _ml = 770
- _mn = 777
- _mo = 782
- _mr = 793
- _ms = 797
- _mul = 804
- _my = 815
- _nb = 837
- _ne = 847
- _nl = 869
- _no = 877
- _pa = 923
- _pl = 945
- _pt = 958
- _ro = 986
- _ru = 992
- _sh = 1029
- _si = 1034
- _sk = 1040
- _sl = 1044
- _sq = 1071
- _sr = 1072
- _sv = 1090
- _sw = 1091
- _ta = 1102
- _te = 1119
- _th = 1129
- _tl = 1144
- _tn = 1150
- _tr = 1160
- _uk = 1196
- _ur = 1202
- _uz = 1210
- _vi = 1217
- _zh = 1319
- _zu = 1324
- _jbo = 513
- _ami = 1647
- _bnn = 2354
- _hak = 436
- _tlh = 14464
- _lb = 659
- _nv = 897
- _pwn = 12052
- _tao = 14185
- _tay = 14195
- _tsu = 14659
- _nn = 872
- _sfb = 13626
- _vgt = 15698
- _sgg = 13657
- _cmn = 3004
- _nan = 833
- _hsn = 465
+ _cs = 250
+ _da = 257
+ _de = 269
+ _el = 310
+ _en = 313
+ _es = 318
+ _et = 320
+ _fa = 328
+ _fi = 337
+ _fil = 339
+ _fr = 350
+ _gu = 420
+ _he = 444
+ _hi = 446
+ _hr = 465
+ _hu = 469
+ _hy = 471
+ _id = 481
+ _is = 504
+ _it = 505
+ _ja = 512
+ _ka = 528
+ _kk = 578
+ _km = 586
+ _kn = 593
+ _ko = 596
+ _ky = 650
+ _lo = 696
+ _lt = 704
+ _lv = 711
+ _mk = 767
+ _ml = 772
+ _mn = 779
+ _mo = 784
+ _mr = 795
+ _ms = 799
+ _mul = 806
+ _my = 817
+ _nb = 839
+ _ne = 849
+ _nl = 871
+ _no = 879
+ _pa = 925
+ _pl = 947
+ _pt = 960
+ _ro = 988
+ _ru = 994
+ _sh = 1031
+ _si = 1036
+ _sk = 1042
+ _sl = 1046
+ _sq = 1073
+ _sr = 1074
+ _sv = 1092
+ _sw = 1093
+ _ta = 1104
+ _te = 1121
+ _th = 1131
+ _tl = 1146
+ _tn = 1152
+ _tr = 1162
+ _uk = 1198
+ _ur = 1204
+ _uz = 1212
+ _vi = 1219
+ _zh = 1321
+ _zu = 1327
+ _jbo = 515
+ _ami = 1650
+ _bnn = 2357
+ _hak = 438
+ _tlh = 14467
+ _lb = 661
+ _nv = 899
+ _pwn = 12055
+ _tao = 14188
+ _tay = 14198
+ _tsu = 14662
+ _nn = 874
+ _sfb = 13629
+ _vgt = 15701
+ _sgg = 13660
+ _cmn = 3007
+ _nan = 835
+ _hsn = 467
)
-const langPrivateStart = 0x2f6f
+const langPrivateStart = 0x2f72
-const langPrivateEnd = 0x3176
+const langPrivateEnd = 0x3179
// lang holds an alphabetically sorted list of ISO-639 language identifiers.
// All entries are 4 bytes. The index of the identifier (divided by 4) is the language tag.
@@ -125,7 +125,7 @@ const langPrivateEnd = 0x3176
// the second and third letter of the 3-letter ISO code.
// - otherwise: a 0 and a by 2 bits right-shifted index into altLangISO3.
// For 3-byte language identifiers the 4th byte is 0.
-const lang tag.Index = "" + // Size: 5312 bytes
+const lang tag.Index = "" + // Size: 5324 bytes
"---\x00aaaraai\x00aak\x00aau\x00abbkabi\x00abq\x00abr\x00abt\x00aby\x00a" +
"cd\x00ace\x00ach\x00ada\x00ade\x00adj\x00ady\x00adz\x00aeveaeb\x00aey" +
"\x00affragc\x00agd\x00agg\x00agm\x00ago\x00agq\x00aha\x00ahl\x00aho\x00a" +
@@ -148,110 +148,110 @@ const lang tag.Index = "" + // Size: 5312 bytes
"\x00bxh\x00bye\x00byn\x00byr\x00bys\x00byv\x00byx\x00bza\x00bze\x00bzf" +
"\x00bzh\x00bzw\x00caatcan\x00cbj\x00cch\x00ccp\x00ceheceb\x00cfa\x00cgg" +
"\x00chhachk\x00chm\x00cho\x00chp\x00chr\x00cja\x00cjm\x00cjv\x00ckb\x00c" +
- "kl\x00cko\x00cky\x00cla\x00cme\x00cooscop\x00cps\x00crrecrh\x00crj\x00cr" +
- "k\x00crl\x00crm\x00crs\x00csescsb\x00csw\x00ctd\x00cuhucvhvcyymdaandad" +
- "\x00daf\x00dag\x00dah\x00dak\x00dar\x00dav\x00dbd\x00dbq\x00dcc\x00ddn" +
- "\x00deeuded\x00den\x00dga\x00dgh\x00dgi\x00dgl\x00dgr\x00dgz\x00dia\x00d" +
- "je\x00dnj\x00dob\x00doi\x00dop\x00dow\x00dri\x00drs\x00dsb\x00dtm\x00dtp" +
- "\x00dts\x00dty\x00dua\x00duc\x00dud\x00dug\x00dvivdva\x00dww\x00dyo\x00d" +
- "yu\x00dzzodzg\x00ebu\x00eeweefi\x00egl\x00egy\x00eka\x00eky\x00elllema" +
- "\x00emi\x00enngenn\x00enq\x00eopoeri\x00es\x00\x05esu\x00etstetr\x00ett" +
- "\x00etu\x00etx\x00euusewo\x00ext\x00faasfaa\x00fab\x00fag\x00fai\x00fan" +
- "\x00ffulffi\x00ffm\x00fiinfia\x00fil\x00fit\x00fjijflr\x00fmp\x00foaofod" +
- "\x00fon\x00for\x00fpe\x00fqs\x00frrafrc\x00frp\x00frr\x00frs\x00fub\x00f" +
- "ud\x00fue\x00fuf\x00fuh\x00fuq\x00fur\x00fuv\x00fuy\x00fvr\x00fyrygalega" +
- "a\x00gaf\x00gag\x00gah\x00gaj\x00gam\x00gan\x00gaw\x00gay\x00gbf\x00gbm" +
- "\x00gby\x00gbz\x00gcr\x00gdlagde\x00gdn\x00gdr\x00geb\x00gej\x00gel\x00g" +
- "ez\x00gfk\x00ggn\x00ghs\x00gil\x00gim\x00gjk\x00gjn\x00gju\x00gkn\x00gkp" +
- "\x00gllgglk\x00gmm\x00gmv\x00gnrngnd\x00gng\x00god\x00gof\x00goi\x00gom" +
- "\x00gon\x00gor\x00gos\x00got\x00grb\x00grc\x00grt\x00grw\x00gsw\x00guujg" +
- "ub\x00guc\x00gud\x00gur\x00guw\x00gux\x00guz\x00gvlvgvf\x00gvr\x00gvs" +
- "\x00gwc\x00gwi\x00gwt\x00gyi\x00haauhag\x00hak\x00ham\x00haw\x00haz\x00h" +
- "bb\x00hdy\x00heebhhy\x00hiinhia\x00hif\x00hig\x00hih\x00hil\x00hla\x00hl" +
- "u\x00hmd\x00hmt\x00hnd\x00hne\x00hnj\x00hnn\x00hno\x00homohoc\x00hoj\x00" +
- "hot\x00hrrvhsb\x00hsn\x00htathuunhui\x00hyyehzerianaian\x00iar\x00iba" +
- "\x00ibb\x00iby\x00ica\x00ich\x00idndidd\x00idi\x00idu\x00ieleife\x00igbo" +
- "igb\x00ige\x00iiiiijj\x00ikpkikk\x00ikt\x00ikw\x00ikx\x00ilo\x00imo\x00i" +
- "nndinh\x00iodoiou\x00iri\x00isslittaiukuiw\x00\x03iwm\x00iws\x00izh\x00i" +
- "zi\x00japnjab\x00jam\x00jbo\x00jbu\x00jen\x00jgk\x00jgo\x00ji\x00\x06jib" +
- "\x00jmc\x00jml\x00jra\x00jut\x00jvavjwavkaatkaa\x00kab\x00kac\x00kad\x00" +
- "kai\x00kaj\x00kam\x00kao\x00kbd\x00kbm\x00kbp\x00kbq\x00kbx\x00kby\x00kc" +
- "g\x00kck\x00kcl\x00kct\x00kde\x00kdh\x00kdl\x00kdt\x00kea\x00ken\x00kez" +
- "\x00kfo\x00kfr\x00kfy\x00kgonkge\x00kgf\x00kgp\x00kha\x00khb\x00khn\x00k" +
- "hq\x00khs\x00kht\x00khw\x00khz\x00kiikkij\x00kiu\x00kiw\x00kjuakjd\x00kj" +
- "g\x00kjs\x00kjy\x00kkazkkc\x00kkj\x00klalkln\x00klq\x00klt\x00klx\x00kmh" +
- "mkmb\x00kmh\x00kmo\x00kms\x00kmu\x00kmw\x00knanknf\x00knp\x00koorkoi\x00" +
- "kok\x00kol\x00kos\x00koz\x00kpe\x00kpf\x00kpo\x00kpr\x00kpx\x00kqb\x00kq" +
- "f\x00kqs\x00kqy\x00kraukrc\x00kri\x00krj\x00krl\x00krs\x00kru\x00ksasksb" +
- "\x00ksd\x00ksf\x00ksh\x00ksj\x00ksr\x00ktb\x00ktm\x00kto\x00kuurkub\x00k" +
- "ud\x00kue\x00kuj\x00kum\x00kun\x00kup\x00kus\x00kvomkvg\x00kvr\x00kvx" +
- "\x00kw\x00\x01kwj\x00kwo\x00kxa\x00kxc\x00kxm\x00kxp\x00kxw\x00kxz\x00ky" +
- "irkye\x00kyx\x00kzr\x00laatlab\x00lad\x00lag\x00lah\x00laj\x00las\x00lbt" +
- "zlbe\x00lbu\x00lbw\x00lcm\x00lcp\x00ldb\x00led\x00lee\x00lem\x00lep\x00l" +
- "eq\x00leu\x00lez\x00lguglgg\x00liimlia\x00lid\x00lif\x00lig\x00lih\x00li" +
- "j\x00lis\x00ljp\x00lki\x00lkt\x00lle\x00lln\x00lmn\x00lmo\x00lmp\x00lnin" +
- "lns\x00lnu\x00loaoloj\x00lok\x00lol\x00lor\x00los\x00loz\x00lrc\x00ltitl" +
- "tg\x00luublua\x00luo\x00luy\x00luz\x00lvavlwl\x00lzh\x00lzz\x00mad\x00ma" +
- "f\x00mag\x00mai\x00mak\x00man\x00mas\x00maw\x00maz\x00mbh\x00mbo\x00mbq" +
- "\x00mbu\x00mbw\x00mci\x00mcp\x00mcq\x00mcr\x00mcu\x00mda\x00mde\x00mdf" +
- "\x00mdh\x00mdj\x00mdr\x00mdx\x00med\x00mee\x00mek\x00men\x00mer\x00met" +
- "\x00meu\x00mfa\x00mfe\x00mfn\x00mfo\x00mfq\x00mglgmgh\x00mgl\x00mgo\x00m" +
- "gp\x00mgy\x00mhahmhi\x00mhl\x00mirimif\x00min\x00mis\x00miw\x00mkkdmki" +
- "\x00mkl\x00mkp\x00mkw\x00mlalmle\x00mlp\x00mls\x00mmo\x00mmu\x00mmx\x00m" +
- "nonmna\x00mnf\x00mni\x00mnw\x00moolmoa\x00moe\x00moh\x00mos\x00mox\x00mp" +
- "p\x00mps\x00mpt\x00mpx\x00mql\x00mrarmrd\x00mrj\x00mro\x00mssamtltmtc" +
- "\x00mtf\x00mti\x00mtr\x00mua\x00mul\x00mur\x00mus\x00mva\x00mvn\x00mvy" +
- "\x00mwk\x00mwr\x00mwv\x00mxc\x00mxm\x00myyamyk\x00mym\x00myv\x00myw\x00m" +
- "yx\x00myz\x00mzk\x00mzm\x00mzn\x00mzp\x00mzw\x00mzz\x00naaunac\x00naf" +
- "\x00nah\x00nak\x00nan\x00nap\x00naq\x00nas\x00nbobnca\x00nce\x00ncf\x00n" +
- "ch\x00nco\x00ncu\x00nddendc\x00nds\x00neepneb\x00new\x00nex\x00nfr\x00ng" +
- "donga\x00ngb\x00ngl\x00nhb\x00nhe\x00nhw\x00nif\x00nii\x00nij\x00nin\x00" +
- "niu\x00niy\x00niz\x00njo\x00nkg\x00nko\x00nlldnmg\x00nmz\x00nnnonnf\x00n" +
- "nh\x00nnk\x00nnm\x00noornod\x00noe\x00non\x00nop\x00nou\x00nqo\x00nrblnr" +
- "b\x00nsk\x00nsn\x00nso\x00nss\x00ntm\x00ntr\x00nui\x00nup\x00nus\x00nuv" +
- "\x00nux\x00nvavnwb\x00nxq\x00nxr\x00nyyanym\x00nyn\x00nzi\x00occiogc\x00" +
- "ojjiokr\x00okv\x00omrmong\x00onn\x00ons\x00opm\x00orrioro\x00oru\x00osss" +
- "osa\x00ota\x00otk\x00ozm\x00paanpag\x00pal\x00pam\x00pap\x00pau\x00pbi" +
- "\x00pcd\x00pcm\x00pdc\x00pdt\x00ped\x00peo\x00pex\x00pfl\x00phl\x00phn" +
- "\x00pilipil\x00pip\x00pka\x00pko\x00plolpla\x00pms\x00png\x00pnn\x00pnt" +
- "\x00pon\x00ppo\x00pra\x00prd\x00prg\x00psuspss\x00ptorptp\x00puu\x00pwa" +
- "\x00quuequc\x00qug\x00rai\x00raj\x00rao\x00rcf\x00rej\x00rel\x00res\x00r" +
- "gn\x00rhg\x00ria\x00rif\x00rjs\x00rkt\x00rmohrmf\x00rmo\x00rmt\x00rmu" +
- "\x00rnunrna\x00rng\x00roonrob\x00rof\x00roo\x00rro\x00rtm\x00ruusrue\x00" +
- "rug\x00rw\x00\x04rwk\x00rwo\x00ryu\x00saansaf\x00sah\x00saq\x00sas\x00sa" +
- "t\x00sav\x00saz\x00sba\x00sbe\x00sbp\x00scrdsck\x00scl\x00scn\x00sco\x00" +
- "scs\x00sdndsdc\x00sdh\x00semesef\x00seh\x00sei\x00ses\x00sgagsga\x00sgs" +
- "\x00sgw\x00sgz\x00sh\x00\x02shi\x00shk\x00shn\x00shu\x00siinsid\x00sig" +
- "\x00sil\x00sim\x00sjr\x00sklkskc\x00skr\x00sks\x00sllvsld\x00sli\x00sll" +
- "\x00sly\x00smmosma\x00smi\x00smj\x00smn\x00smp\x00smq\x00sms\x00snnasnc" +
- "\x00snk\x00snp\x00snx\x00sny\x00soomsok\x00soq\x00sou\x00soy\x00spd\x00s" +
- "pl\x00sps\x00sqqisrrpsrb\x00srn\x00srr\x00srx\x00ssswssd\x00ssg\x00ssy" +
- "\x00stotstk\x00stq\x00suunsua\x00sue\x00suk\x00sur\x00sus\x00svweswwaswb" +
- "\x00swc\x00swg\x00swp\x00swv\x00sxn\x00sxw\x00syl\x00syr\x00szl\x00taamt" +
- "aj\x00tal\x00tan\x00taq\x00tbc\x00tbd\x00tbf\x00tbg\x00tbo\x00tbw\x00tbz" +
- "\x00tci\x00tcy\x00tdd\x00tdg\x00tdh\x00teelted\x00tem\x00teo\x00tet\x00t" +
- "fi\x00tggktgc\x00tgo\x00tgu\x00thhathl\x00thq\x00thr\x00tiirtif\x00tig" +
- "\x00tik\x00tim\x00tio\x00tiv\x00tkuktkl\x00tkr\x00tkt\x00tlgltlf\x00tlx" +
- "\x00tly\x00tmh\x00tmy\x00tnsntnh\x00toontof\x00tog\x00toq\x00tpi\x00tpm" +
- "\x00tpz\x00tqo\x00trurtru\x00trv\x00trw\x00tssotsd\x00tsf\x00tsg\x00tsj" +
- "\x00tsw\x00ttatttd\x00tte\x00ttj\x00ttr\x00tts\x00ttt\x00tuh\x00tul\x00t" +
- "um\x00tuq\x00tvd\x00tvl\x00tvu\x00twwitwh\x00twq\x00txg\x00tyahtya\x00ty" +
- "v\x00tzm\x00ubu\x00udm\x00ugiguga\x00ukkruli\x00umb\x00und\x00unr\x00unx" +
- "\x00urrduri\x00urt\x00urw\x00usa\x00utr\x00uvh\x00uvl\x00uzzbvag\x00vai" +
- "\x00van\x00veenvec\x00vep\x00viievic\x00viv\x00vls\x00vmf\x00vmw\x00vool" +
- "vot\x00vro\x00vun\x00vut\x00walnwae\x00waj\x00wal\x00wan\x00war\x00wbp" +
- "\x00wbq\x00wbr\x00wci\x00wer\x00wgi\x00whg\x00wib\x00wiu\x00wiv\x00wja" +
- "\x00wji\x00wls\x00wmo\x00wnc\x00wni\x00wnu\x00woolwob\x00wos\x00wrs\x00w" +
- "sk\x00wtm\x00wuu\x00wuv\x00wwa\x00xav\x00xbi\x00xcr\x00xes\x00xhhoxla" +
- "\x00xlc\x00xld\x00xmf\x00xmn\x00xmr\x00xna\x00xnr\x00xog\x00xon\x00xpr" +
- "\x00xrb\x00xsa\x00xsi\x00xsm\x00xsr\x00xwe\x00yam\x00yao\x00yap\x00yas" +
- "\x00yat\x00yav\x00yay\x00yaz\x00yba\x00ybb\x00yby\x00yer\x00ygr\x00ygw" +
- "\x00yiidyko\x00yle\x00ylg\x00yll\x00yml\x00yooryon\x00yrb\x00yre\x00yrl" +
- "\x00yss\x00yua\x00yue\x00yuj\x00yut\x00yuw\x00zahazag\x00zbl\x00zdj\x00z" +
- "ea\x00zgh\x00zhhozia\x00zlm\x00zmi\x00zne\x00zuulzxx\x00zza\x00\xff\xff" +
- "\xff\xff"
+ "kl\x00cko\x00cky\x00cla\x00cme\x00cmg\x00cooscop\x00cps\x00crrecrh\x00cr" +
+ "j\x00crk\x00crl\x00crm\x00crs\x00csescsb\x00csw\x00ctd\x00cuhucvhvcyymda" +
+ "andad\x00daf\x00dag\x00dah\x00dak\x00dar\x00dav\x00dbd\x00dbq\x00dcc\x00" +
+ "ddn\x00deeuded\x00den\x00dga\x00dgh\x00dgi\x00dgl\x00dgr\x00dgz\x00dia" +
+ "\x00dje\x00dnj\x00dob\x00doi\x00dop\x00dow\x00dri\x00drs\x00dsb\x00dtm" +
+ "\x00dtp\x00dts\x00dty\x00dua\x00duc\x00dud\x00dug\x00dvivdva\x00dww\x00d" +
+ "yo\x00dyu\x00dzzodzg\x00ebu\x00eeweefi\x00egl\x00egy\x00eka\x00eky\x00el" +
+ "llema\x00emi\x00enngenn\x00enq\x00eopoeri\x00es\x00\x05esu\x00etstetr" +
+ "\x00ett\x00etu\x00etx\x00euusewo\x00ext\x00faasfaa\x00fab\x00fag\x00fai" +
+ "\x00fan\x00ffulffi\x00ffm\x00fiinfia\x00fil\x00fit\x00fjijflr\x00fmp\x00" +
+ "foaofod\x00fon\x00for\x00fpe\x00fqs\x00frrafrc\x00frp\x00frr\x00frs\x00f" +
+ "ub\x00fud\x00fue\x00fuf\x00fuh\x00fuq\x00fur\x00fuv\x00fuy\x00fvr\x00fyr" +
+ "ygalegaa\x00gaf\x00gag\x00gah\x00gaj\x00gam\x00gan\x00gaw\x00gay\x00gba" +
+ "\x00gbf\x00gbm\x00gby\x00gbz\x00gcr\x00gdlagde\x00gdn\x00gdr\x00geb\x00g" +
+ "ej\x00gel\x00gez\x00gfk\x00ggn\x00ghs\x00gil\x00gim\x00gjk\x00gjn\x00gju" +
+ "\x00gkn\x00gkp\x00gllgglk\x00gmm\x00gmv\x00gnrngnd\x00gng\x00god\x00gof" +
+ "\x00goi\x00gom\x00gon\x00gor\x00gos\x00got\x00grb\x00grc\x00grt\x00grw" +
+ "\x00gsw\x00guujgub\x00guc\x00gud\x00gur\x00guw\x00gux\x00guz\x00gvlvgvf" +
+ "\x00gvr\x00gvs\x00gwc\x00gwi\x00gwt\x00gyi\x00haauhag\x00hak\x00ham\x00h" +
+ "aw\x00haz\x00hbb\x00hdy\x00heebhhy\x00hiinhia\x00hif\x00hig\x00hih\x00hi" +
+ "l\x00hla\x00hlu\x00hmd\x00hmt\x00hnd\x00hne\x00hnj\x00hnn\x00hno\x00homo" +
+ "hoc\x00hoj\x00hot\x00hrrvhsb\x00hsn\x00htathuunhui\x00hyyehzerianaian" +
+ "\x00iar\x00iba\x00ibb\x00iby\x00ica\x00ich\x00idndidd\x00idi\x00idu\x00i" +
+ "eleife\x00igboigb\x00ige\x00iiiiijj\x00ikpkikk\x00ikt\x00ikw\x00ikx\x00i" +
+ "lo\x00imo\x00inndinh\x00iodoiou\x00iri\x00isslittaiukuiw\x00\x03iwm\x00i" +
+ "ws\x00izh\x00izi\x00japnjab\x00jam\x00jbo\x00jbu\x00jen\x00jgk\x00jgo" +
+ "\x00ji\x00\x06jib\x00jmc\x00jml\x00jra\x00jut\x00jvavjwavkaatkaa\x00kab" +
+ "\x00kac\x00kad\x00kai\x00kaj\x00kam\x00kao\x00kbd\x00kbm\x00kbp\x00kbq" +
+ "\x00kbx\x00kby\x00kcg\x00kck\x00kcl\x00kct\x00kde\x00kdh\x00kdl\x00kdt" +
+ "\x00kea\x00ken\x00kez\x00kfo\x00kfr\x00kfy\x00kgonkge\x00kgf\x00kgp\x00k" +
+ "ha\x00khb\x00khn\x00khq\x00khs\x00kht\x00khw\x00khz\x00kiikkij\x00kiu" +
+ "\x00kiw\x00kjuakjd\x00kjg\x00kjs\x00kjy\x00kkazkkc\x00kkj\x00klalkln\x00" +
+ "klq\x00klt\x00klx\x00kmhmkmb\x00kmh\x00kmo\x00kms\x00kmu\x00kmw\x00knank" +
+ "nf\x00knp\x00koorkoi\x00kok\x00kol\x00kos\x00koz\x00kpe\x00kpf\x00kpo" +
+ "\x00kpr\x00kpx\x00kqb\x00kqf\x00kqs\x00kqy\x00kraukrc\x00kri\x00krj\x00k" +
+ "rl\x00krs\x00kru\x00ksasksb\x00ksd\x00ksf\x00ksh\x00ksj\x00ksr\x00ktb" +
+ "\x00ktm\x00kto\x00kuurkub\x00kud\x00kue\x00kuj\x00kum\x00kun\x00kup\x00k" +
+ "us\x00kvomkvg\x00kvr\x00kvx\x00kw\x00\x01kwj\x00kwo\x00kxa\x00kxc\x00kxm" +
+ "\x00kxp\x00kxw\x00kxz\x00kyirkye\x00kyx\x00kzr\x00laatlab\x00lad\x00lag" +
+ "\x00lah\x00laj\x00las\x00lbtzlbe\x00lbu\x00lbw\x00lcm\x00lcp\x00ldb\x00l" +
+ "ed\x00lee\x00lem\x00lep\x00leq\x00leu\x00lez\x00lguglgg\x00liimlia\x00li" +
+ "d\x00lif\x00lig\x00lih\x00lij\x00lis\x00ljp\x00lki\x00lkt\x00lle\x00lln" +
+ "\x00lmn\x00lmo\x00lmp\x00lninlns\x00lnu\x00loaoloj\x00lok\x00lol\x00lor" +
+ "\x00los\x00loz\x00lrc\x00ltitltg\x00luublua\x00luo\x00luy\x00luz\x00lvav" +
+ "lwl\x00lzh\x00lzz\x00mad\x00maf\x00mag\x00mai\x00mak\x00man\x00mas\x00ma" +
+ "w\x00maz\x00mbh\x00mbo\x00mbq\x00mbu\x00mbw\x00mci\x00mcp\x00mcq\x00mcr" +
+ "\x00mcu\x00mda\x00mde\x00mdf\x00mdh\x00mdj\x00mdr\x00mdx\x00med\x00mee" +
+ "\x00mek\x00men\x00mer\x00met\x00meu\x00mfa\x00mfe\x00mfn\x00mfo\x00mfq" +
+ "\x00mglgmgh\x00mgl\x00mgo\x00mgp\x00mgy\x00mhahmhi\x00mhl\x00mirimif\x00" +
+ "min\x00mis\x00miw\x00mkkdmki\x00mkl\x00mkp\x00mkw\x00mlalmle\x00mlp\x00m" +
+ "ls\x00mmo\x00mmu\x00mmx\x00mnonmna\x00mnf\x00mni\x00mnw\x00moolmoa\x00mo" +
+ "e\x00moh\x00mos\x00mox\x00mpp\x00mps\x00mpt\x00mpx\x00mql\x00mrarmrd\x00" +
+ "mrj\x00mro\x00mssamtltmtc\x00mtf\x00mti\x00mtr\x00mua\x00mul\x00mur\x00m" +
+ "us\x00mva\x00mvn\x00mvy\x00mwk\x00mwr\x00mwv\x00mxc\x00mxm\x00myyamyk" +
+ "\x00mym\x00myv\x00myw\x00myx\x00myz\x00mzk\x00mzm\x00mzn\x00mzp\x00mzw" +
+ "\x00mzz\x00naaunac\x00naf\x00nah\x00nak\x00nan\x00nap\x00naq\x00nas\x00n" +
+ "bobnca\x00nce\x00ncf\x00nch\x00nco\x00ncu\x00nddendc\x00nds\x00neepneb" +
+ "\x00new\x00nex\x00nfr\x00ngdonga\x00ngb\x00ngl\x00nhb\x00nhe\x00nhw\x00n" +
+ "if\x00nii\x00nij\x00nin\x00niu\x00niy\x00niz\x00njo\x00nkg\x00nko\x00nll" +
+ "dnmg\x00nmz\x00nnnonnf\x00nnh\x00nnk\x00nnm\x00noornod\x00noe\x00non\x00" +
+ "nop\x00nou\x00nqo\x00nrblnrb\x00nsk\x00nsn\x00nso\x00nss\x00ntm\x00ntr" +
+ "\x00nui\x00nup\x00nus\x00nuv\x00nux\x00nvavnwb\x00nxq\x00nxr\x00nyyanym" +
+ "\x00nyn\x00nzi\x00occiogc\x00ojjiokr\x00okv\x00omrmong\x00onn\x00ons\x00" +
+ "opm\x00orrioro\x00oru\x00osssosa\x00ota\x00otk\x00ozm\x00paanpag\x00pal" +
+ "\x00pam\x00pap\x00pau\x00pbi\x00pcd\x00pcm\x00pdc\x00pdt\x00ped\x00peo" +
+ "\x00pex\x00pfl\x00phl\x00phn\x00pilipil\x00pip\x00pka\x00pko\x00plolpla" +
+ "\x00pms\x00png\x00pnn\x00pnt\x00pon\x00ppo\x00pra\x00prd\x00prg\x00psusp" +
+ "ss\x00ptorptp\x00puu\x00pwa\x00quuequc\x00qug\x00rai\x00raj\x00rao\x00rc" +
+ "f\x00rej\x00rel\x00res\x00rgn\x00rhg\x00ria\x00rif\x00rjs\x00rkt\x00rmoh" +
+ "rmf\x00rmo\x00rmt\x00rmu\x00rnunrna\x00rng\x00roonrob\x00rof\x00roo\x00r" +
+ "ro\x00rtm\x00ruusrue\x00rug\x00rw\x00\x04rwk\x00rwo\x00ryu\x00saansaf" +
+ "\x00sah\x00saq\x00sas\x00sat\x00sav\x00saz\x00sba\x00sbe\x00sbp\x00scrds" +
+ "ck\x00scl\x00scn\x00sco\x00scs\x00sdndsdc\x00sdh\x00semesef\x00seh\x00se" +
+ "i\x00ses\x00sgagsga\x00sgs\x00sgw\x00sgz\x00sh\x00\x02shi\x00shk\x00shn" +
+ "\x00shu\x00siinsid\x00sig\x00sil\x00sim\x00sjr\x00sklkskc\x00skr\x00sks" +
+ "\x00sllvsld\x00sli\x00sll\x00sly\x00smmosma\x00smi\x00smj\x00smn\x00smp" +
+ "\x00smq\x00sms\x00snnasnc\x00snk\x00snp\x00snx\x00sny\x00soomsok\x00soq" +
+ "\x00sou\x00soy\x00spd\x00spl\x00sps\x00sqqisrrpsrb\x00srn\x00srr\x00srx" +
+ "\x00ssswssd\x00ssg\x00ssy\x00stotstk\x00stq\x00suunsua\x00sue\x00suk\x00" +
+ "sur\x00sus\x00svweswwaswb\x00swc\x00swg\x00swp\x00swv\x00sxn\x00sxw\x00s" +
+ "yl\x00syr\x00szl\x00taamtaj\x00tal\x00tan\x00taq\x00tbc\x00tbd\x00tbf" +
+ "\x00tbg\x00tbo\x00tbw\x00tbz\x00tci\x00tcy\x00tdd\x00tdg\x00tdh\x00teelt" +
+ "ed\x00tem\x00teo\x00tet\x00tfi\x00tggktgc\x00tgo\x00tgu\x00thhathl\x00th" +
+ "q\x00thr\x00tiirtif\x00tig\x00tik\x00tim\x00tio\x00tiv\x00tkuktkl\x00tkr" +
+ "\x00tkt\x00tlgltlf\x00tlx\x00tly\x00tmh\x00tmy\x00tnsntnh\x00toontof\x00" +
+ "tog\x00toq\x00tpi\x00tpm\x00tpz\x00tqo\x00trurtru\x00trv\x00trw\x00tssot" +
+ "sd\x00tsf\x00tsg\x00tsj\x00tsw\x00ttatttd\x00tte\x00ttj\x00ttr\x00tts" +
+ "\x00ttt\x00tuh\x00tul\x00tum\x00tuq\x00tvd\x00tvl\x00tvu\x00twwitwh\x00t" +
+ "wq\x00txg\x00tyahtya\x00tyv\x00tzm\x00ubu\x00udm\x00ugiguga\x00ukkruli" +
+ "\x00umb\x00und\x00unr\x00unx\x00urrduri\x00urt\x00urw\x00usa\x00utr\x00u" +
+ "vh\x00uvl\x00uzzbvag\x00vai\x00van\x00veenvec\x00vep\x00viievic\x00viv" +
+ "\x00vls\x00vmf\x00vmw\x00voolvot\x00vro\x00vun\x00vut\x00walnwae\x00waj" +
+ "\x00wal\x00wan\x00war\x00wbp\x00wbq\x00wbr\x00wci\x00wer\x00wgi\x00whg" +
+ "\x00wib\x00wiu\x00wiv\x00wja\x00wji\x00wls\x00wmo\x00wnc\x00wni\x00wnu" +
+ "\x00woolwob\x00wos\x00wrs\x00wsk\x00wtm\x00wuu\x00wuv\x00wwa\x00xav\x00x" +
+ "bi\x00xcr\x00xes\x00xhhoxla\x00xlc\x00xld\x00xmf\x00xmn\x00xmr\x00xna" +
+ "\x00xnr\x00xog\x00xon\x00xpr\x00xrb\x00xsa\x00xsi\x00xsm\x00xsr\x00xwe" +
+ "\x00yam\x00yao\x00yap\x00yas\x00yat\x00yav\x00yay\x00yaz\x00yba\x00ybb" +
+ "\x00yby\x00yer\x00ygr\x00ygw\x00yiidyko\x00yle\x00ylg\x00yll\x00yml\x00y" +
+ "ooryon\x00yrb\x00yre\x00yrl\x00yss\x00yua\x00yue\x00yuj\x00yut\x00yuw" +
+ "\x00zahazag\x00zbl\x00zdj\x00zea\x00zgh\x00zhhozhx\x00zia\x00zlm\x00zmi" +
+ "\x00zne\x00zuulzxx\x00zza\x00\xff\xff\xff\xff"
-const langNoIndexOffset = 1327
+const langNoIndexOffset = 1330
// langNoIndex is a bit vector of all 3-letter language codes that are not used as an index
// in lookup tables. The language ids for these language codes are derived directly
@@ -288,7 +288,7 @@ var langNoIndex = [2197]uint8{
// Entry C0 - FF
0xfb, 0x4a, 0xf2, 0x9f, 0xb4, 0x42, 0x41, 0x96,
0x1b, 0x14, 0x08, 0xf2, 0x2b, 0xe7, 0x17, 0x56,
- 0x45, 0x7d, 0x0e, 0x1c, 0x37, 0x71, 0xf3, 0xef,
+ 0x05, 0x7d, 0x0e, 0x1c, 0x37, 0x71, 0xf3, 0xef,
0x97, 0xff, 0x5d, 0x38, 0x64, 0x08, 0x00, 0x10,
0xbc, 0x85, 0xaf, 0xdf, 0xff, 0xf7, 0x73, 0x35,
0x3e, 0x87, 0xc7, 0xdf, 0xff, 0x00, 0x81, 0x00,
@@ -329,7 +329,7 @@ var langNoIndex = [2197]uint8{
0x02, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00, 0x40,
0x30, 0x83, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x1e, 0xcd, 0xbf, 0x7e, 0xbf,
+ 0x00, 0x00, 0x00, 0x1e, 0xcd, 0xbf, 0x7a, 0xbf,
// Entry 200 - 23F
0xdf, 0xc3, 0x83, 0x82, 0xc0, 0xfb, 0x57, 0x27,
0xcd, 0x55, 0xe7, 0x01, 0x00, 0x20, 0xb2, 0xc5,
@@ -559,7 +559,7 @@ var langNoIndex = [2197]uint8{
0xf0, 0xfb, 0xfd, 0x3f, 0x05, 0x00, 0x12, 0x81,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x02,
0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x02, 0x28,
- 0x84, 0x00, 0x23, 0xc0, 0x23, 0x24, 0x00, 0x00,
+ 0x84, 0x00, 0x21, 0xc0, 0x23, 0x24, 0x00, 0x00,
0x00, 0xcb, 0xe4, 0x3a, 0x42, 0x88, 0x14, 0xf1,
0xef, 0xff, 0x7f, 0x12, 0x01, 0x01, 0x84, 0x50,
0x07, 0xfc, 0xff, 0xff, 0x0f, 0x01, 0x00, 0x40,
@@ -578,176 +578,176 @@ const altLangISO3 tag.Index = "---\x00cor\x00hbs\x01heb\x02kin\x03spa\x04yid\x05
// altLangIndex is used to convert indexes in altLangISO3 to langIDs.
// Size: 12 bytes, 6 elements
var altLangIndex = [6]uint16{
- 0x027f, 0x0405, 0x01f9, 0x03e3, 0x013d, 0x0206,
+ 0x0281, 0x0407, 0x01fb, 0x03e5, 0x013e, 0x0208,
}
// langAliasMap maps langIDs to their suggested replacements.
// Size: 656 bytes, 164 elements
var langAliasMap = [164]fromTo{
0: {from: 0x82, to: 0x88},
- 1: {from: 0x185, to: 0x1ac},
- 2: {from: 0x1f1, to: 0x1df},
- 3: {from: 0x1f9, to: 0x1ba},
- 4: {from: 0x206, to: 0x510},
- 5: {from: 0x20d, to: 0x20c},
- 6: {from: 0x30e, to: 0x3da},
- 7: {from: 0x345, to: 0x36d},
- 8: {from: 0x405, to: 0x430},
- 9: {from: 0x478, to: 0x152},
- 10: {from: 0x48e, to: 0x44f},
- 11: {from: 0x4a0, to: 0x21},
- 12: {from: 0x53b, to: 0x541},
- 13: {from: 0x58c, to: 0x12c},
- 14: {from: 0x62d, to: 0x1eae},
- 15: {from: 0x64e, to: 0x42f},
- 16: {from: 0x65f, to: 0x42f},
- 17: {from: 0x6ea, to: 0x3a},
- 18: {from: 0x6f5, to: 0x1d5},
- 19: {from: 0x73b, to: 0x219e},
- 20: {from: 0x7b0, to: 0x56},
- 21: {from: 0x7b6, to: 0x2998},
- 22: {from: 0x7c2, to: 0x58},
- 23: {from: 0x7e3, to: 0x144},
- 24: {from: 0x809, to: 0x5a},
- 25: {from: 0x812, to: 0x8d},
- 26: {from: 0x87b, to: 0x80d},
- 27: {from: 0x8c0, to: 0xee0},
- 28: {from: 0x9ec, to: 0x32f},
- 29: {from: 0xa33, to: 0x2c3},
- 30: {from: 0xa3a, to: 0xbf},
- 31: {from: 0xabb, to: 0x331f},
- 32: {from: 0xb35, to: 0x527},
- 33: {from: 0xb72, to: 0x2657},
- 34: {from: 0xb7b, to: 0xbc0},
- 35: {from: 0xb98, to: 0x44c},
- 36: {from: 0xbb9, to: 0x4226},
- 37: {from: 0xbbc, to: 0x527},
- 38: {from: 0xbfb, to: 0x2da4},
- 39: {from: 0xc2b, to: 0x317e},
- 40: {from: 0xcb6, to: 0xf2},
- 41: {from: 0xd05, to: 0xf9},
- 42: {from: 0xdc5, to: 0x119},
- 43: {from: 0xdd4, to: 0x32b},
- 44: {from: 0xdf5, to: 0xdf8},
- 45: {from: 0xdfb, to: 0x52e},
- 46: {from: 0xedc, to: 0x2057},
- 47: {from: 0xeeb, to: 0x2e97},
- 48: {from: 0xf36, to: 0x365},
- 49: {from: 0x10cd, to: 0x13f},
- 50: {from: 0x1101, to: 0x2ce},
- 51: {from: 0x119d, to: 0x1ea},
- 52: {from: 0x1276, to: 0x21},
- 53: {from: 0x1421, to: 0x15d},
- 54: {from: 0x146d, to: 0x14d},
- 55: {from: 0x151c, to: 0xd98},
- 56: {from: 0x1520, to: 0x38e},
- 57: {from: 0x152f, to: 0x19d},
- 58: {from: 0x157d, to: 0x20e},
- 59: {from: 0x1580, to: 0x10c},
- 60: {from: 0x15a0, to: 0x3cac},
- 61: {from: 0x1667, to: 0x199},
- 62: {from: 0x16c5, to: 0x135},
- 63: {from: 0x16fd, to: 0x29f5},
- 64: {from: 0x1715, to: 0x192},
- 65: {from: 0x1724, to: 0xf3c},
- 66: {from: 0x1777, to: 0x1521},
- 67: {from: 0x1806, to: 0x17b3},
- 68: {from: 0x1813, to: 0x18f0},
- 69: {from: 0x1887, to: 0x434},
- 70: {from: 0x1976, to: 0x1cfe},
- 71: {from: 0x1a71, to: 0x2bad},
- 72: {from: 0x1a87, to: 0x1f6},
- 73: {from: 0x1b57, to: 0x1f8},
- 74: {from: 0x1b83, to: 0x1512},
- 75: {from: 0x1d61, to: 0x2c98},
- 76: {from: 0x2035, to: 0x37ae},
- 77: {from: 0x203a, to: 0x20da},
- 78: {from: 0x2057, to: 0x309},
- 79: {from: 0x20e0, to: 0x272},
- 80: {from: 0x20eb, to: 0x261},
- 81: {from: 0x20ef, to: 0x22b},
- 82: {from: 0x20f6, to: 0x254},
- 83: {from: 0x210c, to: 0x21e8},
- 84: {from: 0x2132, to: 0x27b},
- 85: {from: 0x215d, to: 0x910},
- 86: {from: 0x2196, to: 0x120},
- 87: {from: 0x21cb, to: 0x155e},
- 88: {from: 0x21e3, to: 0x502},
- 89: {from: 0x21f1, to: 0x49d},
- 90: {from: 0x222a, to: 0x120},
- 91: {from: 0x2234, to: 0x120},
- 92: {from: 0x225f, to: 0x927},
- 93: {from: 0x2313, to: 0x3223},
- 94: {from: 0x237f, to: 0x3362},
- 95: {from: 0x246f, to: 0x2c5},
- 96: {from: 0x24e1, to: 0x2fd},
- 97: {from: 0x24ed, to: 0x2f8},
- 98: {from: 0x24f7, to: 0x31d},
- 99: {from: 0x254d, to: 0xb58},
- 100: {from: 0x25a6, to: 0xe2},
- 101: {from: 0x263b, to: 0x2ce},
- 102: {from: 0x26c6, to: 0x26b1},
- 103: {from: 0x26f6, to: 0x3c6},
- 104: {from: 0x2724, to: 0x3cac},
- 105: {from: 0x2762, to: 0x26b1},
- 106: {from: 0x2786, to: 0x4355},
- 107: {from: 0x28ec, to: 0x2834},
- 108: {from: 0x2911, to: 0x34f},
- 109: {from: 0x2983, to: 0x2da4},
- 110: {from: 0x2b17, to: 0x38b},
- 111: {from: 0x2bf9, to: 0x393},
- 112: {from: 0x2c3c, to: 0x3cac},
- 113: {from: 0x2cf9, to: 0x3bc},
- 114: {from: 0x2d10, to: 0x594},
- 115: {from: 0x2d44, to: 0x147},
- 116: {from: 0x2d45, to: 0x147},
- 117: {from: 0x2dfc, to: 0x2ef},
- 118: {from: 0x2e05, to: 0x19c9},
- 119: {from: 0x2e17, to: 0x2d92},
- 120: {from: 0x2e1e, to: 0x290},
- 121: {from: 0x2e51, to: 0x7d},
- 122: {from: 0x2e62, to: 0x227f},
- 123: {from: 0x2e9d, to: 0x2e98},
- 124: {from: 0x2eec, to: 0x2ed4},
- 125: {from: 0x3190, to: 0x3c2},
- 126: {from: 0x3363, to: 0x338b},
- 127: {from: 0x3427, to: 0x3da},
- 128: {from: 0x34eb, to: 0x18cd},
- 129: {from: 0x35c5, to: 0x2c98},
- 130: {from: 0x35e3, to: 0x410},
- 131: {from: 0x3655, to: 0x244},
- 132: {from: 0x3673, to: 0x3f2},
- 133: {from: 0x36fa, to: 0x443},
- 134: {from: 0x37bd, to: 0x120},
- 135: {from: 0x3813, to: 0x38ef},
- 136: {from: 0x3828, to: 0x2c98},
- 137: {from: 0x382c, to: 0xa9},
- 138: {from: 0x382f, to: 0x3225},
- 139: {from: 0x3869, to: 0x39a3},
- 140: {from: 0x388f, to: 0x3fbd},
- 141: {from: 0x38a2, to: 0x39d4},
- 142: {from: 0x38b1, to: 0x1fa1},
- 143: {from: 0x38b2, to: 0x2e97},
- 144: {from: 0x3959, to: 0x47c},
- 145: {from: 0x3b4b, to: 0xd8e},
- 146: {from: 0x3b75, to: 0x136},
- 147: {from: 0x3c96, to: 0x4ba},
- 148: {from: 0x3fba, to: 0xff},
- 149: {from: 0x4205, to: 0xa8e},
- 150: {from: 0x42bb, to: 0x570},
- 151: {from: 0x42f6, to: 0x3f5d},
- 152: {from: 0x4375, to: 0x258},
- 153: {from: 0x43c8, to: 0x36c8},
- 154: {from: 0x43ca, to: 0x10e},
- 155: {from: 0x44ac, to: 0x331f},
- 156: {from: 0x44e0, to: 0x510},
- 157: {from: 0x45c7, to: 0x2406},
- 158: {from: 0x45da, to: 0x26d9},
- 159: {from: 0x460d, to: 0x48ab},
- 160: {from: 0x46ab, to: 0x469d},
- 161: {from: 0x473b, to: 0x4742},
- 162: {from: 0x4913, to: 0x31d},
- 163: {from: 0x49a4, to: 0x521},
+ 1: {from: 0x187, to: 0x1ae},
+ 2: {from: 0x1f3, to: 0x1e1},
+ 3: {from: 0x1fb, to: 0x1bc},
+ 4: {from: 0x208, to: 0x512},
+ 5: {from: 0x20f, to: 0x20e},
+ 6: {from: 0x310, to: 0x3dc},
+ 7: {from: 0x347, to: 0x36f},
+ 8: {from: 0x407, to: 0x432},
+ 9: {from: 0x47a, to: 0x153},
+ 10: {from: 0x490, to: 0x451},
+ 11: {from: 0x4a2, to: 0x21},
+ 12: {from: 0x53e, to: 0x544},
+ 13: {from: 0x58f, to: 0x12d},
+ 14: {from: 0x630, to: 0x1eb1},
+ 15: {from: 0x651, to: 0x431},
+ 16: {from: 0x662, to: 0x431},
+ 17: {from: 0x6ed, to: 0x3a},
+ 18: {from: 0x6f8, to: 0x1d7},
+ 19: {from: 0x73e, to: 0x21a1},
+ 20: {from: 0x7b3, to: 0x56},
+ 21: {from: 0x7b9, to: 0x299b},
+ 22: {from: 0x7c5, to: 0x58},
+ 23: {from: 0x7e6, to: 0x145},
+ 24: {from: 0x80c, to: 0x5a},
+ 25: {from: 0x815, to: 0x8d},
+ 26: {from: 0x87e, to: 0x810},
+ 27: {from: 0x8c3, to: 0xee3},
+ 28: {from: 0x9ef, to: 0x331},
+ 29: {from: 0xa36, to: 0x2c5},
+ 30: {from: 0xa3d, to: 0xbf},
+ 31: {from: 0xabe, to: 0x3322},
+ 32: {from: 0xb38, to: 0x529},
+ 33: {from: 0xb75, to: 0x265a},
+ 34: {from: 0xb7e, to: 0xbc3},
+ 35: {from: 0xb9b, to: 0x44e},
+ 36: {from: 0xbbc, to: 0x4229},
+ 37: {from: 0xbbf, to: 0x529},
+ 38: {from: 0xbfe, to: 0x2da7},
+ 39: {from: 0xc2e, to: 0x3181},
+ 40: {from: 0xcb9, to: 0xf3},
+ 41: {from: 0xd08, to: 0xfa},
+ 42: {from: 0xdc8, to: 0x11a},
+ 43: {from: 0xdd7, to: 0x32d},
+ 44: {from: 0xdf8, to: 0xdfb},
+ 45: {from: 0xdfe, to: 0x531},
+ 46: {from: 0xedf, to: 0x205a},
+ 47: {from: 0xeee, to: 0x2e9a},
+ 48: {from: 0xf39, to: 0x367},
+ 49: {from: 0x10d0, to: 0x140},
+ 50: {from: 0x1104, to: 0x2d0},
+ 51: {from: 0x11a0, to: 0x1ec},
+ 52: {from: 0x1279, to: 0x21},
+ 53: {from: 0x1424, to: 0x15e},
+ 54: {from: 0x1470, to: 0x14e},
+ 55: {from: 0x151f, to: 0xd9b},
+ 56: {from: 0x1523, to: 0x390},
+ 57: {from: 0x1532, to: 0x19f},
+ 58: {from: 0x1580, to: 0x210},
+ 59: {from: 0x1583, to: 0x10d},
+ 60: {from: 0x15a3, to: 0x3caf},
+ 61: {from: 0x166a, to: 0x19b},
+ 62: {from: 0x16c8, to: 0x136},
+ 63: {from: 0x1700, to: 0x29f8},
+ 64: {from: 0x1718, to: 0x194},
+ 65: {from: 0x1727, to: 0xf3f},
+ 66: {from: 0x177a, to: 0x178},
+ 67: {from: 0x1809, to: 0x17b6},
+ 68: {from: 0x1816, to: 0x18f3},
+ 69: {from: 0x188a, to: 0x436},
+ 70: {from: 0x1979, to: 0x1d01},
+ 71: {from: 0x1a74, to: 0x2bb0},
+ 72: {from: 0x1a8a, to: 0x1f8},
+ 73: {from: 0x1b5a, to: 0x1fa},
+ 74: {from: 0x1b86, to: 0x1515},
+ 75: {from: 0x1d64, to: 0x2c9b},
+ 76: {from: 0x2038, to: 0x37b1},
+ 77: {from: 0x203d, to: 0x20dd},
+ 78: {from: 0x205a, to: 0x30b},
+ 79: {from: 0x20e3, to: 0x274},
+ 80: {from: 0x20ee, to: 0x263},
+ 81: {from: 0x20f2, to: 0x22d},
+ 82: {from: 0x20f9, to: 0x256},
+ 83: {from: 0x210f, to: 0x21eb},
+ 84: {from: 0x2135, to: 0x27d},
+ 85: {from: 0x2160, to: 0x913},
+ 86: {from: 0x2199, to: 0x121},
+ 87: {from: 0x21ce, to: 0x1561},
+ 88: {from: 0x21e6, to: 0x504},
+ 89: {from: 0x21f4, to: 0x49f},
+ 90: {from: 0x222d, to: 0x121},
+ 91: {from: 0x2237, to: 0x121},
+ 92: {from: 0x2262, to: 0x92a},
+ 93: {from: 0x2316, to: 0x3226},
+ 94: {from: 0x2382, to: 0x3365},
+ 95: {from: 0x2472, to: 0x2c7},
+ 96: {from: 0x24e4, to: 0x2ff},
+ 97: {from: 0x24f0, to: 0x2fa},
+ 98: {from: 0x24fa, to: 0x31f},
+ 99: {from: 0x2550, to: 0xb5b},
+ 100: {from: 0x25a9, to: 0xe2},
+ 101: {from: 0x263e, to: 0x2d0},
+ 102: {from: 0x26c9, to: 0x26b4},
+ 103: {from: 0x26f9, to: 0x3c8},
+ 104: {from: 0x2727, to: 0x3caf},
+ 105: {from: 0x2765, to: 0x26b4},
+ 106: {from: 0x2789, to: 0x4358},
+ 107: {from: 0x28ef, to: 0x2837},
+ 108: {from: 0x2914, to: 0x351},
+ 109: {from: 0x2986, to: 0x2da7},
+ 110: {from: 0x2b1a, to: 0x38d},
+ 111: {from: 0x2bfc, to: 0x395},
+ 112: {from: 0x2c3f, to: 0x3caf},
+ 113: {from: 0x2cfc, to: 0x3be},
+ 114: {from: 0x2d13, to: 0x597},
+ 115: {from: 0x2d47, to: 0x148},
+ 116: {from: 0x2d48, to: 0x148},
+ 117: {from: 0x2dff, to: 0x2f1},
+ 118: {from: 0x2e08, to: 0x19cc},
+ 119: {from: 0x2e1a, to: 0x2d95},
+ 120: {from: 0x2e21, to: 0x292},
+ 121: {from: 0x2e54, to: 0x7d},
+ 122: {from: 0x2e65, to: 0x2282},
+ 123: {from: 0x2ea0, to: 0x2e9b},
+ 124: {from: 0x2eef, to: 0x2ed7},
+ 125: {from: 0x3193, to: 0x3c4},
+ 126: {from: 0x3366, to: 0x338e},
+ 127: {from: 0x342a, to: 0x3dc},
+ 128: {from: 0x34ee, to: 0x18d0},
+ 129: {from: 0x35c8, to: 0x2c9b},
+ 130: {from: 0x35e6, to: 0x412},
+ 131: {from: 0x3658, to: 0x246},
+ 132: {from: 0x3676, to: 0x3f4},
+ 133: {from: 0x36fd, to: 0x445},
+ 134: {from: 0x37c0, to: 0x121},
+ 135: {from: 0x3816, to: 0x38f2},
+ 136: {from: 0x382b, to: 0x2c9b},
+ 137: {from: 0x382f, to: 0xa9},
+ 138: {from: 0x3832, to: 0x3228},
+ 139: {from: 0x386c, to: 0x39a6},
+ 140: {from: 0x3892, to: 0x3fc0},
+ 141: {from: 0x38a5, to: 0x39d7},
+ 142: {from: 0x38b4, to: 0x1fa4},
+ 143: {from: 0x38b5, to: 0x2e9a},
+ 144: {from: 0x395c, to: 0x47e},
+ 145: {from: 0x3b4e, to: 0xd91},
+ 146: {from: 0x3b78, to: 0x137},
+ 147: {from: 0x3c99, to: 0x4bc},
+ 148: {from: 0x3fbd, to: 0x100},
+ 149: {from: 0x4208, to: 0xa91},
+ 150: {from: 0x42be, to: 0x573},
+ 151: {from: 0x42f9, to: 0x3f60},
+ 152: {from: 0x4378, to: 0x25a},
+ 153: {from: 0x43cb, to: 0x36cb},
+ 154: {from: 0x43cd, to: 0x10f},
+ 155: {from: 0x44af, to: 0x3322},
+ 156: {from: 0x44e3, to: 0x512},
+ 157: {from: 0x45ca, to: 0x2409},
+ 158: {from: 0x45dd, to: 0x26dc},
+ 159: {from: 0x4610, to: 0x48ae},
+ 160: {from: 0x46ae, to: 0x46a0},
+ 161: {from: 0x473e, to: 0x4745},
+ 162: {from: 0x4916, to: 0x31f},
+ 163: {from: 0x49a7, to: 0x523},
}
// Size: 164 bytes, 164 elements
@@ -769,58 +769,58 @@ var langAliasTypes = [164]langAliasType{
}
const (
- _Latn = 85
- _Hani = 53
- _Hans = 55
- _Hant = 56
- _Qaaa = 136
- _Qaai = 144
- _Qabx = 185
- _Zinh = 231
- _Zyyy = 236
- _Zzzz = 237
+ _Latn = 87
+ _Hani = 54
+ _Hans = 56
+ _Hant = 57
+ _Qaaa = 139
+ _Qaai = 147
+ _Qabx = 188
+ _Zinh = 236
+ _Zyyy = 241
+ _Zzzz = 242
)
// script is an alphabetically sorted list of ISO 15924 codes. The index
// of the script in the string, divided by 4, is the internal scriptID.
-const script tag.Index = "" + // Size: 956 bytes
+const script tag.Index = "" + // Size: 976 bytes
"----AdlmAfakAghbAhomArabAranArmiArmnAvstBaliBamuBassBatkBengBhksBlisBopo" +
- "BrahBraiBugiBuhdCakmCansCariChamCherCirtCoptCprtCyrlCyrsDevaDogrDsrtDupl" +
- "EgydEgyhEgypElbaEthiGeokGeorGlagGongGonmGothGranGrekGujrGuruHanbHangHani" +
- "HanoHansHantHatrHebrHiraHluwHmngHrktHungIndsItalJamoJavaJpanJurcKaliKana" +
- "KharKhmrKhojKitlKitsKndaKoreKpelKthiLanaLaooLatfLatgLatnLekeLepcLimbLina" +
- "LinbLisuLomaLyciLydiMahjMakaMandManiMarcMayaMedfMendMercMeroMlymModiMong" +
- "MoonMrooMteiMultMymrNarbNbatNewaNkgbNkooNshuOgamOlckOrkhOryaOsgeOsmaPalm" +
- "PaucPermPhagPhliPhlpPhlvPhnxPiqdPlrdPrtiQaaaQaabQaacQaadQaaeQaafQaagQaah" +
- "QaaiQaajQaakQaalQaamQaanQaaoQaapQaaqQaarQaasQaatQaauQaavQaawQaaxQaayQaaz" +
- "QabaQabbQabcQabdQabeQabfQabgQabhQabiQabjQabkQablQabmQabnQaboQabpQabqQabr" +
- "QabsQabtQabuQabvQabwQabxRjngRoroRunrSamrSaraSarbSaurSgnwShawShrdSiddSind" +
- "SinhSoraSoyoSundSyloSyrcSyreSyrjSyrnTagbTakrTaleTaluTamlTangTavtTeluTeng" +
- "TfngTglgThaaThaiTibtTirhUgarVaiiVispWaraWoleXpeoXsuxYiiiZanbZinhZmthZsye" +
- "ZsymZxxxZyyyZzzz\xff\xff\xff\xff"
+ "BrahBraiBugiBuhdCakmCansCariChamCherCirtCoptCpmnCprtCyrlCyrsDevaDogrDsrt" +
+ "DuplEgydEgyhEgypElbaEthiGeokGeorGlagGongGonmGothGranGrekGujrGuruHanbHang" +
+ "HaniHanoHansHantHatrHebrHiraHluwHmngHmnpHrktHungIndsItalJamoJavaJpanJurc" +
+ "KaliKanaKharKhmrKhojKitlKitsKndaKoreKpelKthiLanaLaooLatfLatgLatnLekeLepc" +
+ "LimbLinaLinbLisuLomaLyciLydiMahjMakaMandManiMarcMayaMedfMendMercMeroMlym" +
+ "ModiMongMoonMrooMteiMultMymrNarbNbatNewaNkdbNkgbNkooNshuOgamOlckOrkhOrya" +
+ "OsgeOsmaPalmPaucPermPhagPhliPhlpPhlvPhnxPiqdPlrdPrtiQaaaQaabQaacQaadQaae" +
+ "QaafQaagQaahQaaiQaajQaakQaalQaamQaanQaaoQaapQaaqQaarQaasQaatQaauQaavQaaw" +
+ "QaaxQaayQaazQabaQabbQabcQabdQabeQabfQabgQabhQabiQabjQabkQablQabmQabnQabo" +
+ "QabpQabqQabrQabsQabtQabuQabvQabwQabxRjngRoroRunrSamrSaraSarbSaurSgnwShaw" +
+ "ShrdShuiSiddSindSinhSoraSoyoSundSyloSyrcSyreSyrjSyrnTagbTakrTaleTaluTaml" +
+ "TangTavtTeluTengTfngTglgThaaThaiTibtTirhUgarVaiiVispWaraWchoWoleXpeoXsux" +
+ "YiiiZanbZinhZmthZsyeZsymZxxxZyyyZzzz\xff\xff\xff\xff"
// suppressScript is an index from langID to the dominant script for that language,
// if it exists. If a script is given, it should be suppressed from the language tag.
-// Size: 1327 bytes, 1327 elements
-var suppressScript = [1327]uint8{
+// Size: 1330 bytes, 1330 elements
+var suppressScript = [1330]uint8{
// Entry 0 - 3F
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
// Entry 40 - 7F
0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00,
+ 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00,
// Entry 80 - BF
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -828,66 +828,66 @@ var suppressScript = [1327]uint8{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
// Entry C0 - FF
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55,
+ 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00,
// Entry 100 - 13F
- 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00,
+ 0x57, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xda,
- 0x00, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
- 0x55, 0x00, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xde, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00,
+ 0x00, 0x57, 0x00, 0x00, 0x57, 0x00, 0x57, 0x00,
// Entry 140 - 17F
- 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x05,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x55, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x55,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00,
- 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
+ 0x57, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00,
+ 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x57, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00,
+ 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00,
+ 0x00, 0x57, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x57, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
// Entry 180 - 1BF
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00,
- 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x55, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x57, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x3a, 0x00, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x57, 0x32, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x21, 0x00,
// Entry 1C0 - 1FF
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55,
- 0x55, 0x00, 0x55, 0x55, 0x00, 0x08, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x57, 0x57, 0x00, 0x57, 0x57, 0x00, 0x08,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55,
- 0x00, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00,
+ 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00,
+ 0x57, 0x57, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x00,
// Entry 200 - 23F
+ 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
// Entry 240 - 27F
- 0x1e, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00,
- 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d,
- 0x00, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1f, 0x00, 0x00, 0x57, 0x00, 0x00,
+ 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x4f, 0x00, 0x00, 0x50, 0x00, 0x21, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -895,101 +895,102 @@ var suppressScript = [1327]uint8{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
// Entry 280 - 2BF
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x52, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00,
+ 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
// Entry 2C0 - 2FF
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
+ 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
// Entry 300 - 33F
- 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x20, 0x00, 0x00, 0x00, 0x55, 0x55, 0x00,
+ 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x57,
+ 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00,
+ 0x00, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00,
// Entry 340 - 37F
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x55, 0x20,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00,
+ 0x57, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00,
- 0x55, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x75, 0x55, 0x00, 0x00, 0x00,
- 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57,
+ 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x57,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x57, 0x00,
+ 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00,
// Entry 380 - 3BF
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00,
- 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x57, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x55, 0x00,
+ 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
// Entry 3C0 - 3FF
- 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x57, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x55,
- 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x1e, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00,
+ 0x00, 0x57, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1f, 0x00, 0x00, 0x57, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
// Entry 400 - 43F
- 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x55, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00,
- 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00,
- 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x57, 0x00,
+ 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57,
+ 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00,
// Entry 440 - 47F
- 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x57, 0x57, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6,
- 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xdb, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00,
- 0x55, 0x00, 0x00, 0x00, 0x55, 0x00, 0x55, 0x00,
+ 0xd7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xda, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0x29,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57,
+ 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x57, 0x00,
// Entry 480 - 4BF
- 0x55, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00,
- 0x55, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00,
+ 0x57, 0x00, 0x57, 0x00, 0x00, 0x00, 0x57, 0x00,
+ 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x57, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00,
+ 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
// Entry 4C0 - 4FF
- 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x57, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
// Entry 500 - 53F
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57,
+ 0x00, 0x00,
}
const (
@@ -1356,147 +1357,151 @@ type likelyLangRegion struct {
// likelyScript is a lookup table, indexed by scriptID, for the most likely
// languages and regions given a script.
-// Size: 956 bytes, 239 elements
-var likelyScript = [239]likelyLangRegion{
- 1: {lang: 0x14d, region: 0x84},
- 3: {lang: 0x2a0, region: 0x106},
+// Size: 976 bytes, 244 elements
+var likelyScript = [244]likelyLangRegion{
+ 1: {lang: 0x14e, region: 0x84},
+ 3: {lang: 0x2a2, region: 0x106},
4: {lang: 0x1f, region: 0x99},
5: {lang: 0x3a, region: 0x6b},
7: {lang: 0x3b, region: 0x9c},
- 8: {lang: 0x1d5, region: 0x28},
+ 8: {lang: 0x1d7, region: 0x28},
9: {lang: 0x13, region: 0x9c},
10: {lang: 0x5b, region: 0x95},
11: {lang: 0x60, region: 0x52},
12: {lang: 0xb9, region: 0xb4},
13: {lang: 0x63, region: 0x95},
14: {lang: 0xa5, region: 0x35},
- 15: {lang: 0x3e7, region: 0x99},
- 17: {lang: 0x527, region: 0x12e},
- 18: {lang: 0x3af, region: 0x99},
- 19: {lang: 0x15d, region: 0x78},
+ 15: {lang: 0x3e9, region: 0x99},
+ 17: {lang: 0x529, region: 0x12e},
+ 18: {lang: 0x3b1, region: 0x99},
+ 19: {lang: 0x15e, region: 0x78},
20: {lang: 0xc2, region: 0x95},
21: {lang: 0x9d, region: 0xe7},
22: {lang: 0xdb, region: 0x35},
- 23: {lang: 0xf2, region: 0x49},
- 24: {lang: 0x4ee, region: 0x12b},
+ 23: {lang: 0xf3, region: 0x49},
+ 24: {lang: 0x4f0, region: 0x12b},
25: {lang: 0xe7, region: 0x13e},
26: {lang: 0xe5, region: 0x135},
- 28: {lang: 0xf0, region: 0x6b},
- 29: {lang: 0x19e, region: 0x5d},
- 30: {lang: 0x3e0, region: 0x106},
- 32: {lang: 0x1bc, region: 0x99},
- 35: {lang: 0x15d, region: 0x78},
- 38: {lang: 0x132, region: 0x6b},
- 39: {lang: 0x42f, region: 0x27},
- 40: {lang: 0x27, region: 0x6f},
- 42: {lang: 0x20e, region: 0x7d},
- 43: {lang: 0xfd, region: 0x38},
- 46: {lang: 0x19c, region: 0x130},
- 47: {lang: 0x3e7, region: 0x99},
- 48: {lang: 0x135, region: 0x87},
- 49: {lang: 0x1a2, region: 0x99},
- 50: {lang: 0x39b, region: 0x99},
- 51: {lang: 0x527, region: 0x12e},
- 52: {lang: 0x252, region: 0xab},
- 53: {lang: 0x527, region: 0x53},
- 54: {lang: 0x1c9, region: 0xe7},
- 55: {lang: 0x527, region: 0x53},
- 56: {lang: 0x527, region: 0x12e},
- 57: {lang: 0x2fb, region: 0x9b},
- 58: {lang: 0x1ba, region: 0x97},
- 59: {lang: 0x1fe, region: 0xa2},
- 60: {lang: 0x1c3, region: 0x12b},
- 61: {lang: 0x1c8, region: 0xaf},
- 63: {lang: 0x1d3, region: 0x92},
- 65: {lang: 0x141, region: 0x9e},
- 66: {lang: 0x252, region: 0xab},
- 67: {lang: 0x20c, region: 0x95},
- 68: {lang: 0x1fe, region: 0xa2},
- 70: {lang: 0x134, region: 0xc4},
- 71: {lang: 0x1fe, region: 0xa2},
- 72: {lang: 0x3b9, region: 0xe8},
- 73: {lang: 0x248, region: 0xa6},
- 74: {lang: 0x3f8, region: 0x99},
- 77: {lang: 0x24f, region: 0x99},
- 78: {lang: 0x252, region: 0xab},
- 80: {lang: 0x88, region: 0x99},
- 81: {lang: 0x36e, region: 0x123},
- 82: {lang: 0x2b6, region: 0xaf},
- 87: {lang: 0x29d, region: 0x99},
- 88: {lang: 0x2a6, region: 0x99},
- 89: {lang: 0x28d, region: 0x87},
- 90: {lang: 0x19e, region: 0x87},
- 91: {lang: 0x2aa, region: 0x53},
- 93: {lang: 0x4f2, region: 0x12b},
- 94: {lang: 0x4f3, region: 0x12b},
- 95: {lang: 0x1bc, region: 0x99},
- 97: {lang: 0x335, region: 0x9c},
- 98: {lang: 0x4f5, region: 0x53},
- 99: {lang: 0xa9, region: 0x53},
- 102: {lang: 0x2e6, region: 0x112},
- 103: {lang: 0x4f6, region: 0x10b},
- 104: {lang: 0x4f6, region: 0x10b},
- 105: {lang: 0x302, region: 0x99},
- 106: {lang: 0x319, region: 0x99},
- 107: {lang: 0x309, region: 0x53},
- 109: {lang: 0x31c, region: 0x35},
- 110: {lang: 0x30c, region: 0x99},
- 111: {lang: 0x412, region: 0xe8},
- 112: {lang: 0x32f, region: 0xc4},
- 113: {lang: 0x4f7, region: 0x108},
- 114: {lang: 0x3b, region: 0xa1},
- 115: {lang: 0x351, region: 0xdb},
- 117: {lang: 0x2ce, region: 0x84},
- 119: {lang: 0x401, region: 0x96},
- 120: {lang: 0x3ec, region: 0x99},
- 121: {lang: 0x399, region: 0xc5},
- 122: {lang: 0x393, region: 0x99},
- 123: {lang: 0x397, region: 0x135},
- 124: {lang: 0x427, region: 0x115},
- 125: {lang: 0x3b, region: 0x11c},
- 126: {lang: 0xfc, region: 0xc4},
- 127: {lang: 0x27b, region: 0x106},
- 128: {lang: 0x2c7, region: 0x53},
- 129: {lang: 0x39d, region: 0x9c},
- 130: {lang: 0x39d, region: 0x53},
- 132: {lang: 0x3ab, region: 0xb0},
- 134: {lang: 0x1c4, region: 0x53},
- 135: {lang: 0x4fb, region: 0x9c},
- 186: {lang: 0x3c9, region: 0x95},
- 188: {lang: 0x370, region: 0x10c},
- 189: {lang: 0x41e, region: 0x97},
- 191: {lang: 0x4fd, region: 0x15e},
- 192: {lang: 0x3ee, region: 0x99},
- 193: {lang: 0x45, region: 0x135},
- 194: {lang: 0x138, region: 0x7b},
- 195: {lang: 0x3e7, region: 0x99},
- 196: {lang: 0x3e7, region: 0x99},
- 197: {lang: 0x3f8, region: 0x99},
- 198: {lang: 0x40a, region: 0xb3},
- 199: {lang: 0x431, region: 0x99},
- 201: {lang: 0x43c, region: 0x95},
- 202: {lang: 0x44b, region: 0x35},
- 203: {lang: 0x44c, region: 0x9b},
- 207: {lang: 0x458, region: 0xe7},
- 208: {lang: 0x119, region: 0x99},
- 209: {lang: 0x45c, region: 0x53},
- 210: {lang: 0x230, region: 0x53},
- 211: {lang: 0x44e, region: 0x99},
- 212: {lang: 0x4a3, region: 0x53},
- 213: {lang: 0x9f, region: 0x13e},
- 214: {lang: 0x45f, region: 0x99},
- 216: {lang: 0x526, region: 0xba},
- 217: {lang: 0x152, region: 0xe7},
- 218: {lang: 0x127, region: 0xcd},
- 219: {lang: 0x469, region: 0x123},
- 220: {lang: 0xa9, region: 0x53},
- 221: {lang: 0x2cc, region: 0x99},
- 222: {lang: 0x4ab, region: 0x11c},
- 223: {lang: 0x4bc, region: 0xb4},
- 225: {lang: 0x1cc, region: 0x99},
- 227: {lang: 0x3a7, region: 0x9c},
- 228: {lang: 0x22, region: 0x9b},
- 229: {lang: 0x1e8, region: 0x53},
+ 28: {lang: 0xf1, region: 0x6b},
+ 30: {lang: 0x1a0, region: 0x5d},
+ 31: {lang: 0x3e2, region: 0x106},
+ 33: {lang: 0x1be, region: 0x99},
+ 36: {lang: 0x15e, region: 0x78},
+ 39: {lang: 0x133, region: 0x6b},
+ 40: {lang: 0x431, region: 0x27},
+ 41: {lang: 0x27, region: 0x6f},
+ 43: {lang: 0x210, region: 0x7d},
+ 44: {lang: 0xfe, region: 0x38},
+ 46: {lang: 0x19b, region: 0x99},
+ 47: {lang: 0x19e, region: 0x130},
+ 48: {lang: 0x3e9, region: 0x99},
+ 49: {lang: 0x136, region: 0x87},
+ 50: {lang: 0x1a4, region: 0x99},
+ 51: {lang: 0x39d, region: 0x99},
+ 52: {lang: 0x529, region: 0x12e},
+ 53: {lang: 0x254, region: 0xab},
+ 54: {lang: 0x529, region: 0x53},
+ 55: {lang: 0x1cb, region: 0xe7},
+ 56: {lang: 0x529, region: 0x53},
+ 57: {lang: 0x529, region: 0x12e},
+ 58: {lang: 0x2fd, region: 0x9b},
+ 59: {lang: 0x1bc, region: 0x97},
+ 60: {lang: 0x200, region: 0xa2},
+ 61: {lang: 0x1c5, region: 0x12b},
+ 62: {lang: 0x1ca, region: 0xaf},
+ 65: {lang: 0x1d5, region: 0x92},
+ 67: {lang: 0x142, region: 0x9e},
+ 68: {lang: 0x254, region: 0xab},
+ 69: {lang: 0x20e, region: 0x95},
+ 70: {lang: 0x200, region: 0xa2},
+ 72: {lang: 0x135, region: 0xc4},
+ 73: {lang: 0x200, region: 0xa2},
+ 74: {lang: 0x3bb, region: 0xe8},
+ 75: {lang: 0x24a, region: 0xa6},
+ 76: {lang: 0x3fa, region: 0x99},
+ 79: {lang: 0x251, region: 0x99},
+ 80: {lang: 0x254, region: 0xab},
+ 82: {lang: 0x88, region: 0x99},
+ 83: {lang: 0x370, region: 0x123},
+ 84: {lang: 0x2b8, region: 0xaf},
+ 89: {lang: 0x29f, region: 0x99},
+ 90: {lang: 0x2a8, region: 0x99},
+ 91: {lang: 0x28f, region: 0x87},
+ 92: {lang: 0x1a0, region: 0x87},
+ 93: {lang: 0x2ac, region: 0x53},
+ 95: {lang: 0x4f4, region: 0x12b},
+ 96: {lang: 0x4f5, region: 0x12b},
+ 97: {lang: 0x1be, region: 0x99},
+ 99: {lang: 0x337, region: 0x9c},
+ 100: {lang: 0x4f7, region: 0x53},
+ 101: {lang: 0xa9, region: 0x53},
+ 104: {lang: 0x2e8, region: 0x112},
+ 105: {lang: 0x4f8, region: 0x10b},
+ 106: {lang: 0x4f8, region: 0x10b},
+ 107: {lang: 0x304, region: 0x99},
+ 108: {lang: 0x31b, region: 0x99},
+ 109: {lang: 0x30b, region: 0x53},
+ 111: {lang: 0x31e, region: 0x35},
+ 112: {lang: 0x30e, region: 0x99},
+ 113: {lang: 0x414, region: 0xe8},
+ 114: {lang: 0x331, region: 0xc4},
+ 115: {lang: 0x4f9, region: 0x108},
+ 116: {lang: 0x3b, region: 0xa1},
+ 117: {lang: 0x353, region: 0xdb},
+ 120: {lang: 0x2d0, region: 0x84},
+ 121: {lang: 0x52a, region: 0x53},
+ 122: {lang: 0x403, region: 0x96},
+ 123: {lang: 0x3ee, region: 0x99},
+ 124: {lang: 0x39b, region: 0xc5},
+ 125: {lang: 0x395, region: 0x99},
+ 126: {lang: 0x399, region: 0x135},
+ 127: {lang: 0x429, region: 0x115},
+ 128: {lang: 0x3b, region: 0x11c},
+ 129: {lang: 0xfd, region: 0xc4},
+ 130: {lang: 0x27d, region: 0x106},
+ 131: {lang: 0x2c9, region: 0x53},
+ 132: {lang: 0x39f, region: 0x9c},
+ 133: {lang: 0x39f, region: 0x53},
+ 135: {lang: 0x3ad, region: 0xb0},
+ 137: {lang: 0x1c6, region: 0x53},
+ 138: {lang: 0x4fd, region: 0x9c},
+ 189: {lang: 0x3cb, region: 0x95},
+ 191: {lang: 0x372, region: 0x10c},
+ 192: {lang: 0x420, region: 0x97},
+ 194: {lang: 0x4ff, region: 0x15e},
+ 195: {lang: 0x3f0, region: 0x99},
+ 196: {lang: 0x45, region: 0x135},
+ 197: {lang: 0x139, region: 0x7b},
+ 198: {lang: 0x3e9, region: 0x99},
+ 200: {lang: 0x3e9, region: 0x99},
+ 201: {lang: 0x3fa, region: 0x99},
+ 202: {lang: 0x40c, region: 0xb3},
+ 203: {lang: 0x433, region: 0x99},
+ 204: {lang: 0xef, region: 0xc5},
+ 205: {lang: 0x43e, region: 0x95},
+ 206: {lang: 0x44d, region: 0x35},
+ 207: {lang: 0x44e, region: 0x9b},
+ 211: {lang: 0x45a, region: 0xe7},
+ 212: {lang: 0x11a, region: 0x99},
+ 213: {lang: 0x45e, region: 0x53},
+ 214: {lang: 0x232, region: 0x53},
+ 215: {lang: 0x450, region: 0x99},
+ 216: {lang: 0x4a5, region: 0x53},
+ 217: {lang: 0x9f, region: 0x13e},
+ 218: {lang: 0x461, region: 0x99},
+ 220: {lang: 0x528, region: 0xba},
+ 221: {lang: 0x153, region: 0xe7},
+ 222: {lang: 0x128, region: 0xcd},
+ 223: {lang: 0x46b, region: 0x123},
+ 224: {lang: 0xa9, region: 0x53},
+ 225: {lang: 0x2ce, region: 0x99},
+ 226: {lang: 0x4ad, region: 0x11c},
+ 227: {lang: 0x4be, region: 0xb4},
+ 229: {lang: 0x1ce, region: 0x99},
+ 232: {lang: 0x3a9, region: 0x9c},
+ 233: {lang: 0x22, region: 0x9b},
+ 234: {lang: 0x1ea, region: 0x53},
+ 235: {lang: 0xef, region: 0xc5},
}
type likelyScriptRegion struct {
@@ -1509,1419 +1514,1425 @@ type likelyScriptRegion struct {
// scripts and regions given incomplete information. If more entries exist for a
// given language, region and script are the index and size respectively
// of the list in likelyLangList.
-// Size: 5308 bytes, 1327 elements
-var likelyLang = [1327]likelyScriptRegion{
- 0: {region: 0x135, script: 0x55, flags: 0x0},
- 1: {region: 0x6f, script: 0x55, flags: 0x0},
- 2: {region: 0x165, script: 0x55, flags: 0x0},
- 3: {region: 0x165, script: 0x55, flags: 0x0},
- 4: {region: 0x165, script: 0x55, flags: 0x0},
- 5: {region: 0x7d, script: 0x1e, flags: 0x0},
- 6: {region: 0x165, script: 0x55, flags: 0x0},
- 7: {region: 0x165, script: 0x1e, flags: 0x0},
- 8: {region: 0x80, script: 0x55, flags: 0x0},
- 9: {region: 0x165, script: 0x55, flags: 0x0},
- 10: {region: 0x165, script: 0x55, flags: 0x0},
- 11: {region: 0x165, script: 0x55, flags: 0x0},
- 12: {region: 0x95, script: 0x55, flags: 0x0},
- 13: {region: 0x131, script: 0x55, flags: 0x0},
- 14: {region: 0x80, script: 0x55, flags: 0x0},
- 15: {region: 0x165, script: 0x55, flags: 0x0},
- 16: {region: 0x165, script: 0x55, flags: 0x0},
- 17: {region: 0x106, script: 0x1e, flags: 0x0},
- 18: {region: 0x165, script: 0x55, flags: 0x0},
+// Size: 5320 bytes, 1330 elements
+var likelyLang = [1330]likelyScriptRegion{
+ 0: {region: 0x135, script: 0x57, flags: 0x0},
+ 1: {region: 0x6f, script: 0x57, flags: 0x0},
+ 2: {region: 0x165, script: 0x57, flags: 0x0},
+ 3: {region: 0x165, script: 0x57, flags: 0x0},
+ 4: {region: 0x165, script: 0x57, flags: 0x0},
+ 5: {region: 0x7d, script: 0x1f, flags: 0x0},
+ 6: {region: 0x165, script: 0x57, flags: 0x0},
+ 7: {region: 0x165, script: 0x1f, flags: 0x0},
+ 8: {region: 0x80, script: 0x57, flags: 0x0},
+ 9: {region: 0x165, script: 0x57, flags: 0x0},
+ 10: {region: 0x165, script: 0x57, flags: 0x0},
+ 11: {region: 0x165, script: 0x57, flags: 0x0},
+ 12: {region: 0x95, script: 0x57, flags: 0x0},
+ 13: {region: 0x131, script: 0x57, flags: 0x0},
+ 14: {region: 0x80, script: 0x57, flags: 0x0},
+ 15: {region: 0x165, script: 0x57, flags: 0x0},
+ 16: {region: 0x165, script: 0x57, flags: 0x0},
+ 17: {region: 0x106, script: 0x1f, flags: 0x0},
+ 18: {region: 0x165, script: 0x57, flags: 0x0},
19: {region: 0x9c, script: 0x9, flags: 0x0},
20: {region: 0x128, script: 0x5, flags: 0x0},
- 21: {region: 0x165, script: 0x55, flags: 0x0},
- 22: {region: 0x161, script: 0x55, flags: 0x0},
- 23: {region: 0x165, script: 0x55, flags: 0x0},
- 24: {region: 0x165, script: 0x55, flags: 0x0},
- 25: {region: 0x165, script: 0x55, flags: 0x0},
- 26: {region: 0x165, script: 0x55, flags: 0x0},
- 27: {region: 0x165, script: 0x55, flags: 0x0},
- 28: {region: 0x52, script: 0x55, flags: 0x0},
- 29: {region: 0x165, script: 0x55, flags: 0x0},
- 30: {region: 0x165, script: 0x55, flags: 0x0},
+ 21: {region: 0x165, script: 0x57, flags: 0x0},
+ 22: {region: 0x161, script: 0x57, flags: 0x0},
+ 23: {region: 0x165, script: 0x57, flags: 0x0},
+ 24: {region: 0x165, script: 0x57, flags: 0x0},
+ 25: {region: 0x165, script: 0x57, flags: 0x0},
+ 26: {region: 0x165, script: 0x57, flags: 0x0},
+ 27: {region: 0x165, script: 0x57, flags: 0x0},
+ 28: {region: 0x52, script: 0x57, flags: 0x0},
+ 29: {region: 0x165, script: 0x57, flags: 0x0},
+ 30: {region: 0x165, script: 0x57, flags: 0x0},
31: {region: 0x99, script: 0x4, flags: 0x0},
- 32: {region: 0x165, script: 0x55, flags: 0x0},
- 33: {region: 0x80, script: 0x55, flags: 0x0},
- 34: {region: 0x9b, script: 0xe4, flags: 0x0},
- 35: {region: 0x165, script: 0x55, flags: 0x0},
- 36: {region: 0x165, script: 0x55, flags: 0x0},
- 37: {region: 0x14d, script: 0x55, flags: 0x0},
- 38: {region: 0x106, script: 0x1e, flags: 0x0},
- 39: {region: 0x6f, script: 0x28, flags: 0x0},
- 40: {region: 0x165, script: 0x55, flags: 0x0},
- 41: {region: 0x165, script: 0x55, flags: 0x0},
- 42: {region: 0xd6, script: 0x55, flags: 0x0},
- 43: {region: 0x165, script: 0x55, flags: 0x0},
- 45: {region: 0x165, script: 0x55, flags: 0x0},
- 46: {region: 0x165, script: 0x55, flags: 0x0},
- 47: {region: 0x165, script: 0x55, flags: 0x0},
- 48: {region: 0x165, script: 0x55, flags: 0x0},
- 49: {region: 0x165, script: 0x55, flags: 0x0},
- 50: {region: 0x165, script: 0x55, flags: 0x0},
- 51: {region: 0x95, script: 0x55, flags: 0x0},
+ 32: {region: 0x165, script: 0x57, flags: 0x0},
+ 33: {region: 0x80, script: 0x57, flags: 0x0},
+ 34: {region: 0x9b, script: 0xe9, flags: 0x0},
+ 35: {region: 0x165, script: 0x57, flags: 0x0},
+ 36: {region: 0x165, script: 0x57, flags: 0x0},
+ 37: {region: 0x14d, script: 0x57, flags: 0x0},
+ 38: {region: 0x106, script: 0x1f, flags: 0x0},
+ 39: {region: 0x6f, script: 0x29, flags: 0x0},
+ 40: {region: 0x165, script: 0x57, flags: 0x0},
+ 41: {region: 0x165, script: 0x57, flags: 0x0},
+ 42: {region: 0xd6, script: 0x57, flags: 0x0},
+ 43: {region: 0x165, script: 0x57, flags: 0x0},
+ 45: {region: 0x165, script: 0x57, flags: 0x0},
+ 46: {region: 0x165, script: 0x57, flags: 0x0},
+ 47: {region: 0x165, script: 0x57, flags: 0x0},
+ 48: {region: 0x165, script: 0x57, flags: 0x0},
+ 49: {region: 0x165, script: 0x57, flags: 0x0},
+ 50: {region: 0x165, script: 0x57, flags: 0x0},
+ 51: {region: 0x95, script: 0x57, flags: 0x0},
52: {region: 0x165, script: 0x5, flags: 0x0},
53: {region: 0x122, script: 0x5, flags: 0x0},
- 54: {region: 0x165, script: 0x55, flags: 0x0},
- 55: {region: 0x165, script: 0x55, flags: 0x0},
- 56: {region: 0x165, script: 0x55, flags: 0x0},
- 57: {region: 0x165, script: 0x55, flags: 0x0},
+ 54: {region: 0x165, script: 0x57, flags: 0x0},
+ 55: {region: 0x165, script: 0x57, flags: 0x0},
+ 56: {region: 0x165, script: 0x57, flags: 0x0},
+ 57: {region: 0x165, script: 0x57, flags: 0x0},
58: {region: 0x6b, script: 0x5, flags: 0x0},
59: {region: 0x0, script: 0x3, flags: 0x1},
- 60: {region: 0x165, script: 0x55, flags: 0x0},
- 61: {region: 0x51, script: 0x55, flags: 0x0},
- 62: {region: 0x3f, script: 0x55, flags: 0x0},
+ 60: {region: 0x165, script: 0x57, flags: 0x0},
+ 61: {region: 0x51, script: 0x57, flags: 0x0},
+ 62: {region: 0x3f, script: 0x57, flags: 0x0},
63: {region: 0x67, script: 0x5, flags: 0x0},
65: {region: 0xba, script: 0x5, flags: 0x0},
66: {region: 0x6b, script: 0x5, flags: 0x0},
67: {region: 0x99, script: 0xe, flags: 0x0},
- 68: {region: 0x12f, script: 0x55, flags: 0x0},
- 69: {region: 0x135, script: 0xc1, flags: 0x0},
- 70: {region: 0x165, script: 0x55, flags: 0x0},
- 71: {region: 0x165, script: 0x55, flags: 0x0},
- 72: {region: 0x6e, script: 0x55, flags: 0x0},
- 73: {region: 0x165, script: 0x55, flags: 0x0},
- 74: {region: 0x165, script: 0x55, flags: 0x0},
- 75: {region: 0x49, script: 0x55, flags: 0x0},
- 76: {region: 0x165, script: 0x55, flags: 0x0},
- 77: {region: 0x106, script: 0x1e, flags: 0x0},
+ 68: {region: 0x12f, script: 0x57, flags: 0x0},
+ 69: {region: 0x135, script: 0xc4, flags: 0x0},
+ 70: {region: 0x165, script: 0x57, flags: 0x0},
+ 71: {region: 0x165, script: 0x57, flags: 0x0},
+ 72: {region: 0x6e, script: 0x57, flags: 0x0},
+ 73: {region: 0x165, script: 0x57, flags: 0x0},
+ 74: {region: 0x165, script: 0x57, flags: 0x0},
+ 75: {region: 0x49, script: 0x57, flags: 0x0},
+ 76: {region: 0x165, script: 0x57, flags: 0x0},
+ 77: {region: 0x106, script: 0x1f, flags: 0x0},
78: {region: 0x165, script: 0x5, flags: 0x0},
- 79: {region: 0x165, script: 0x55, flags: 0x0},
- 80: {region: 0x165, script: 0x55, flags: 0x0},
- 81: {region: 0x165, script: 0x55, flags: 0x0},
- 82: {region: 0x99, script: 0x20, flags: 0x0},
- 83: {region: 0x165, script: 0x55, flags: 0x0},
- 84: {region: 0x165, script: 0x55, flags: 0x0},
- 85: {region: 0x165, script: 0x55, flags: 0x0},
- 86: {region: 0x3f, script: 0x55, flags: 0x0},
- 87: {region: 0x165, script: 0x55, flags: 0x0},
+ 79: {region: 0x165, script: 0x57, flags: 0x0},
+ 80: {region: 0x165, script: 0x57, flags: 0x0},
+ 81: {region: 0x165, script: 0x57, flags: 0x0},
+ 82: {region: 0x99, script: 0x21, flags: 0x0},
+ 83: {region: 0x165, script: 0x57, flags: 0x0},
+ 84: {region: 0x165, script: 0x57, flags: 0x0},
+ 85: {region: 0x165, script: 0x57, flags: 0x0},
+ 86: {region: 0x3f, script: 0x57, flags: 0x0},
+ 87: {region: 0x165, script: 0x57, flags: 0x0},
88: {region: 0x3, script: 0x5, flags: 0x1},
- 89: {region: 0x106, script: 0x1e, flags: 0x0},
+ 89: {region: 0x106, script: 0x1f, flags: 0x0},
90: {region: 0xe8, script: 0x5, flags: 0x0},
- 91: {region: 0x95, script: 0x55, flags: 0x0},
- 92: {region: 0xdb, script: 0x20, flags: 0x0},
- 93: {region: 0x2e, script: 0x55, flags: 0x0},
- 94: {region: 0x52, script: 0x55, flags: 0x0},
- 95: {region: 0x165, script: 0x55, flags: 0x0},
+ 91: {region: 0x95, script: 0x57, flags: 0x0},
+ 92: {region: 0xdb, script: 0x21, flags: 0x0},
+ 93: {region: 0x2e, script: 0x57, flags: 0x0},
+ 94: {region: 0x52, script: 0x57, flags: 0x0},
+ 95: {region: 0x165, script: 0x57, flags: 0x0},
96: {region: 0x52, script: 0xb, flags: 0x0},
- 97: {region: 0x165, script: 0x55, flags: 0x0},
- 98: {region: 0x165, script: 0x55, flags: 0x0},
- 99: {region: 0x95, script: 0x55, flags: 0x0},
- 100: {region: 0x165, script: 0x55, flags: 0x0},
- 101: {region: 0x52, script: 0x55, flags: 0x0},
- 102: {region: 0x165, script: 0x55, flags: 0x0},
- 103: {region: 0x165, script: 0x55, flags: 0x0},
- 104: {region: 0x165, script: 0x55, flags: 0x0},
- 105: {region: 0x165, script: 0x55, flags: 0x0},
- 106: {region: 0x4f, script: 0x55, flags: 0x0},
- 107: {region: 0x165, script: 0x55, flags: 0x0},
- 108: {region: 0x165, script: 0x55, flags: 0x0},
- 109: {region: 0x165, script: 0x55, flags: 0x0},
- 110: {region: 0x165, script: 0x28, flags: 0x0},
- 111: {region: 0x165, script: 0x55, flags: 0x0},
- 112: {region: 0x165, script: 0x55, flags: 0x0},
- 113: {region: 0x47, script: 0x1e, flags: 0x0},
- 114: {region: 0x165, script: 0x55, flags: 0x0},
- 115: {region: 0x165, script: 0x55, flags: 0x0},
+ 97: {region: 0x165, script: 0x57, flags: 0x0},
+ 98: {region: 0x165, script: 0x57, flags: 0x0},
+ 99: {region: 0x95, script: 0x57, flags: 0x0},
+ 100: {region: 0x165, script: 0x57, flags: 0x0},
+ 101: {region: 0x52, script: 0x57, flags: 0x0},
+ 102: {region: 0x165, script: 0x57, flags: 0x0},
+ 103: {region: 0x165, script: 0x57, flags: 0x0},
+ 104: {region: 0x165, script: 0x57, flags: 0x0},
+ 105: {region: 0x165, script: 0x57, flags: 0x0},
+ 106: {region: 0x4f, script: 0x57, flags: 0x0},
+ 107: {region: 0x165, script: 0x57, flags: 0x0},
+ 108: {region: 0x165, script: 0x57, flags: 0x0},
+ 109: {region: 0x165, script: 0x57, flags: 0x0},
+ 110: {region: 0x165, script: 0x29, flags: 0x0},
+ 111: {region: 0x165, script: 0x57, flags: 0x0},
+ 112: {region: 0x165, script: 0x57, flags: 0x0},
+ 113: {region: 0x47, script: 0x1f, flags: 0x0},
+ 114: {region: 0x165, script: 0x57, flags: 0x0},
+ 115: {region: 0x165, script: 0x57, flags: 0x0},
116: {region: 0x10b, script: 0x5, flags: 0x0},
- 117: {region: 0x162, script: 0x55, flags: 0x0},
- 118: {region: 0x165, script: 0x55, flags: 0x0},
- 119: {region: 0x95, script: 0x55, flags: 0x0},
- 120: {region: 0x165, script: 0x55, flags: 0x0},
- 121: {region: 0x12f, script: 0x55, flags: 0x0},
- 122: {region: 0x52, script: 0x55, flags: 0x0},
- 123: {region: 0x99, script: 0xd3, flags: 0x0},
+ 117: {region: 0x162, script: 0x57, flags: 0x0},
+ 118: {region: 0x165, script: 0x57, flags: 0x0},
+ 119: {region: 0x95, script: 0x57, flags: 0x0},
+ 120: {region: 0x165, script: 0x57, flags: 0x0},
+ 121: {region: 0x12f, script: 0x57, flags: 0x0},
+ 122: {region: 0x52, script: 0x57, flags: 0x0},
+ 123: {region: 0x99, script: 0xd7, flags: 0x0},
124: {region: 0xe8, script: 0x5, flags: 0x0},
- 125: {region: 0x99, script: 0x20, flags: 0x0},
- 126: {region: 0x38, script: 0x1e, flags: 0x0},
- 127: {region: 0x99, script: 0x20, flags: 0x0},
+ 125: {region: 0x99, script: 0x21, flags: 0x0},
+ 126: {region: 0x38, script: 0x1f, flags: 0x0},
+ 127: {region: 0x99, script: 0x21, flags: 0x0},
128: {region: 0xe8, script: 0x5, flags: 0x0},
- 129: {region: 0x12b, script: 0x30, flags: 0x0},
- 131: {region: 0x99, script: 0x20, flags: 0x0},
- 132: {region: 0x165, script: 0x55, flags: 0x0},
- 133: {region: 0x99, script: 0x20, flags: 0x0},
- 134: {region: 0xe7, script: 0x55, flags: 0x0},
- 135: {region: 0x165, script: 0x55, flags: 0x0},
- 136: {region: 0x99, script: 0x20, flags: 0x0},
- 137: {region: 0x165, script: 0x55, flags: 0x0},
- 138: {region: 0x13f, script: 0x55, flags: 0x0},
- 139: {region: 0x165, script: 0x55, flags: 0x0},
- 140: {region: 0x165, script: 0x55, flags: 0x0},
- 141: {region: 0xe7, script: 0x55, flags: 0x0},
- 142: {region: 0x165, script: 0x55, flags: 0x0},
- 143: {region: 0xd6, script: 0x55, flags: 0x0},
- 144: {region: 0x165, script: 0x55, flags: 0x0},
- 145: {region: 0x165, script: 0x55, flags: 0x0},
- 146: {region: 0x165, script: 0x55, flags: 0x0},
- 147: {region: 0x165, script: 0x28, flags: 0x0},
- 148: {region: 0x99, script: 0x20, flags: 0x0},
- 149: {region: 0x95, script: 0x55, flags: 0x0},
- 150: {region: 0x165, script: 0x55, flags: 0x0},
- 151: {region: 0x165, script: 0x55, flags: 0x0},
- 152: {region: 0x114, script: 0x55, flags: 0x0},
- 153: {region: 0x165, script: 0x55, flags: 0x0},
- 154: {region: 0x165, script: 0x55, flags: 0x0},
- 155: {region: 0x52, script: 0x55, flags: 0x0},
- 156: {region: 0x165, script: 0x55, flags: 0x0},
- 157: {region: 0xe7, script: 0x55, flags: 0x0},
- 158: {region: 0x165, script: 0x55, flags: 0x0},
- 159: {region: 0x13e, script: 0xd5, flags: 0x0},
- 160: {region: 0xc3, script: 0x55, flags: 0x0},
- 161: {region: 0x165, script: 0x55, flags: 0x0},
- 162: {region: 0x165, script: 0x55, flags: 0x0},
- 163: {region: 0xc3, script: 0x55, flags: 0x0},
- 164: {region: 0x165, script: 0x55, flags: 0x0},
+ 129: {region: 0x12b, script: 0x31, flags: 0x0},
+ 131: {region: 0x99, script: 0x21, flags: 0x0},
+ 132: {region: 0x165, script: 0x57, flags: 0x0},
+ 133: {region: 0x99, script: 0x21, flags: 0x0},
+ 134: {region: 0xe7, script: 0x57, flags: 0x0},
+ 135: {region: 0x165, script: 0x57, flags: 0x0},
+ 136: {region: 0x99, script: 0x21, flags: 0x0},
+ 137: {region: 0x165, script: 0x57, flags: 0x0},
+ 138: {region: 0x13f, script: 0x57, flags: 0x0},
+ 139: {region: 0x165, script: 0x57, flags: 0x0},
+ 140: {region: 0x165, script: 0x57, flags: 0x0},
+ 141: {region: 0xe7, script: 0x57, flags: 0x0},
+ 142: {region: 0x165, script: 0x57, flags: 0x0},
+ 143: {region: 0xd6, script: 0x57, flags: 0x0},
+ 144: {region: 0x165, script: 0x57, flags: 0x0},
+ 145: {region: 0x165, script: 0x57, flags: 0x0},
+ 146: {region: 0x165, script: 0x57, flags: 0x0},
+ 147: {region: 0x165, script: 0x29, flags: 0x0},
+ 148: {region: 0x99, script: 0x21, flags: 0x0},
+ 149: {region: 0x95, script: 0x57, flags: 0x0},
+ 150: {region: 0x165, script: 0x57, flags: 0x0},
+ 151: {region: 0x165, script: 0x57, flags: 0x0},
+ 152: {region: 0x114, script: 0x57, flags: 0x0},
+ 153: {region: 0x165, script: 0x57, flags: 0x0},
+ 154: {region: 0x165, script: 0x57, flags: 0x0},
+ 155: {region: 0x52, script: 0x57, flags: 0x0},
+ 156: {region: 0x165, script: 0x57, flags: 0x0},
+ 157: {region: 0xe7, script: 0x57, flags: 0x0},
+ 158: {region: 0x165, script: 0x57, flags: 0x0},
+ 159: {region: 0x13e, script: 0xd9, flags: 0x0},
+ 160: {region: 0xc3, script: 0x57, flags: 0x0},
+ 161: {region: 0x165, script: 0x57, flags: 0x0},
+ 162: {region: 0x165, script: 0x57, flags: 0x0},
+ 163: {region: 0xc3, script: 0x57, flags: 0x0},
+ 164: {region: 0x165, script: 0x57, flags: 0x0},
165: {region: 0x35, script: 0xe, flags: 0x0},
- 166: {region: 0x165, script: 0x55, flags: 0x0},
- 167: {region: 0x165, script: 0x55, flags: 0x0},
- 168: {region: 0x165, script: 0x55, flags: 0x0},
- 169: {region: 0x53, script: 0xdc, flags: 0x0},
- 170: {region: 0x165, script: 0x55, flags: 0x0},
- 171: {region: 0x165, script: 0x55, flags: 0x0},
- 172: {region: 0x165, script: 0x55, flags: 0x0},
+ 166: {region: 0x165, script: 0x57, flags: 0x0},
+ 167: {region: 0x165, script: 0x57, flags: 0x0},
+ 168: {region: 0x165, script: 0x57, flags: 0x0},
+ 169: {region: 0x53, script: 0xe0, flags: 0x0},
+ 170: {region: 0x165, script: 0x57, flags: 0x0},
+ 171: {region: 0x165, script: 0x57, flags: 0x0},
+ 172: {region: 0x165, script: 0x57, flags: 0x0},
173: {region: 0x99, script: 0xe, flags: 0x0},
- 174: {region: 0x165, script: 0x55, flags: 0x0},
+ 174: {region: 0x165, script: 0x57, flags: 0x0},
175: {region: 0x9c, script: 0x5, flags: 0x0},
- 176: {region: 0x165, script: 0x55, flags: 0x0},
- 177: {region: 0x4f, script: 0x55, flags: 0x0},
- 178: {region: 0x78, script: 0x55, flags: 0x0},
- 179: {region: 0x99, script: 0x20, flags: 0x0},
+ 176: {region: 0x165, script: 0x57, flags: 0x0},
+ 177: {region: 0x4f, script: 0x57, flags: 0x0},
+ 178: {region: 0x78, script: 0x57, flags: 0x0},
+ 179: {region: 0x99, script: 0x21, flags: 0x0},
180: {region: 0xe8, script: 0x5, flags: 0x0},
- 181: {region: 0x99, script: 0x20, flags: 0x0},
- 182: {region: 0x165, script: 0x55, flags: 0x0},
- 183: {region: 0x33, script: 0x55, flags: 0x0},
- 184: {region: 0x165, script: 0x55, flags: 0x0},
+ 181: {region: 0x99, script: 0x21, flags: 0x0},
+ 182: {region: 0x165, script: 0x57, flags: 0x0},
+ 183: {region: 0x33, script: 0x57, flags: 0x0},
+ 184: {region: 0x165, script: 0x57, flags: 0x0},
185: {region: 0xb4, script: 0xc, flags: 0x0},
- 186: {region: 0x52, script: 0x55, flags: 0x0},
- 187: {region: 0x165, script: 0x28, flags: 0x0},
- 188: {region: 0xe7, script: 0x55, flags: 0x0},
- 189: {region: 0x165, script: 0x55, flags: 0x0},
- 190: {region: 0xe8, script: 0x20, flags: 0x0},
- 191: {region: 0x106, script: 0x1e, flags: 0x0},
- 192: {region: 0x15f, script: 0x55, flags: 0x0},
- 193: {region: 0x165, script: 0x55, flags: 0x0},
- 194: {region: 0x95, script: 0x55, flags: 0x0},
- 195: {region: 0x165, script: 0x55, flags: 0x0},
- 196: {region: 0x52, script: 0x55, flags: 0x0},
- 197: {region: 0x165, script: 0x55, flags: 0x0},
- 198: {region: 0x165, script: 0x55, flags: 0x0},
- 199: {region: 0x165, script: 0x55, flags: 0x0},
- 200: {region: 0x86, script: 0x55, flags: 0x0},
- 201: {region: 0x165, script: 0x55, flags: 0x0},
- 202: {region: 0x165, script: 0x55, flags: 0x0},
- 203: {region: 0x165, script: 0x55, flags: 0x0},
- 204: {region: 0x165, script: 0x55, flags: 0x0},
- 205: {region: 0x6d, script: 0x28, flags: 0x0},
- 206: {region: 0x165, script: 0x55, flags: 0x0},
- 207: {region: 0x165, script: 0x55, flags: 0x0},
- 208: {region: 0x52, script: 0x55, flags: 0x0},
- 209: {region: 0x165, script: 0x55, flags: 0x0},
- 210: {region: 0x165, script: 0x55, flags: 0x0},
- 211: {region: 0xc3, script: 0x55, flags: 0x0},
- 212: {region: 0x165, script: 0x55, flags: 0x0},
- 213: {region: 0x165, script: 0x55, flags: 0x0},
- 214: {region: 0x165, script: 0x55, flags: 0x0},
- 215: {region: 0x6e, script: 0x55, flags: 0x0},
- 216: {region: 0x165, script: 0x55, flags: 0x0},
- 217: {region: 0x165, script: 0x55, flags: 0x0},
- 218: {region: 0xd6, script: 0x55, flags: 0x0},
+ 186: {region: 0x52, script: 0x57, flags: 0x0},
+ 187: {region: 0x165, script: 0x29, flags: 0x0},
+ 188: {region: 0xe7, script: 0x57, flags: 0x0},
+ 189: {region: 0x165, script: 0x57, flags: 0x0},
+ 190: {region: 0xe8, script: 0x21, flags: 0x0},
+ 191: {region: 0x106, script: 0x1f, flags: 0x0},
+ 192: {region: 0x15f, script: 0x57, flags: 0x0},
+ 193: {region: 0x165, script: 0x57, flags: 0x0},
+ 194: {region: 0x95, script: 0x57, flags: 0x0},
+ 195: {region: 0x165, script: 0x57, flags: 0x0},
+ 196: {region: 0x52, script: 0x57, flags: 0x0},
+ 197: {region: 0x165, script: 0x57, flags: 0x0},
+ 198: {region: 0x165, script: 0x57, flags: 0x0},
+ 199: {region: 0x165, script: 0x57, flags: 0x0},
+ 200: {region: 0x86, script: 0x57, flags: 0x0},
+ 201: {region: 0x165, script: 0x57, flags: 0x0},
+ 202: {region: 0x165, script: 0x57, flags: 0x0},
+ 203: {region: 0x165, script: 0x57, flags: 0x0},
+ 204: {region: 0x165, script: 0x57, flags: 0x0},
+ 205: {region: 0x6d, script: 0x29, flags: 0x0},
+ 206: {region: 0x165, script: 0x57, flags: 0x0},
+ 207: {region: 0x165, script: 0x57, flags: 0x0},
+ 208: {region: 0x52, script: 0x57, flags: 0x0},
+ 209: {region: 0x165, script: 0x57, flags: 0x0},
+ 210: {region: 0x165, script: 0x57, flags: 0x0},
+ 211: {region: 0xc3, script: 0x57, flags: 0x0},
+ 212: {region: 0x165, script: 0x57, flags: 0x0},
+ 213: {region: 0x165, script: 0x57, flags: 0x0},
+ 214: {region: 0x165, script: 0x57, flags: 0x0},
+ 215: {region: 0x6e, script: 0x57, flags: 0x0},
+ 216: {region: 0x165, script: 0x57, flags: 0x0},
+ 217: {region: 0x165, script: 0x57, flags: 0x0},
+ 218: {region: 0xd6, script: 0x57, flags: 0x0},
219: {region: 0x35, script: 0x16, flags: 0x0},
- 220: {region: 0x106, script: 0x1e, flags: 0x0},
- 221: {region: 0xe7, script: 0x55, flags: 0x0},
- 222: {region: 0x165, script: 0x55, flags: 0x0},
- 223: {region: 0x131, script: 0x55, flags: 0x0},
- 224: {region: 0x8a, script: 0x55, flags: 0x0},
- 225: {region: 0x75, script: 0x55, flags: 0x0},
- 226: {region: 0x106, script: 0x1e, flags: 0x0},
- 227: {region: 0x135, script: 0x55, flags: 0x0},
- 228: {region: 0x49, script: 0x55, flags: 0x0},
+ 220: {region: 0x106, script: 0x1f, flags: 0x0},
+ 221: {region: 0xe7, script: 0x57, flags: 0x0},
+ 222: {region: 0x165, script: 0x57, flags: 0x0},
+ 223: {region: 0x131, script: 0x57, flags: 0x0},
+ 224: {region: 0x8a, script: 0x57, flags: 0x0},
+ 225: {region: 0x75, script: 0x57, flags: 0x0},
+ 226: {region: 0x106, script: 0x1f, flags: 0x0},
+ 227: {region: 0x135, script: 0x57, flags: 0x0},
+ 228: {region: 0x49, script: 0x57, flags: 0x0},
229: {region: 0x135, script: 0x1a, flags: 0x0},
230: {region: 0xa6, script: 0x5, flags: 0x0},
231: {region: 0x13e, script: 0x19, flags: 0x0},
- 232: {region: 0x165, script: 0x55, flags: 0x0},
+ 232: {region: 0x165, script: 0x57, flags: 0x0},
233: {region: 0x9b, script: 0x5, flags: 0x0},
- 234: {region: 0x165, script: 0x55, flags: 0x0},
- 235: {region: 0x165, script: 0x55, flags: 0x0},
- 236: {region: 0x165, script: 0x55, flags: 0x0},
- 237: {region: 0x165, script: 0x55, flags: 0x0},
- 238: {region: 0x165, script: 0x55, flags: 0x0},
- 239: {region: 0x78, script: 0x55, flags: 0x0},
- 240: {region: 0x6b, script: 0x1c, flags: 0x0},
- 241: {region: 0xe7, script: 0x55, flags: 0x0},
- 242: {region: 0x49, script: 0x17, flags: 0x0},
- 243: {region: 0x130, script: 0x1e, flags: 0x0},
- 244: {region: 0x49, script: 0x17, flags: 0x0},
+ 234: {region: 0x165, script: 0x57, flags: 0x0},
+ 235: {region: 0x165, script: 0x57, flags: 0x0},
+ 236: {region: 0x165, script: 0x57, flags: 0x0},
+ 237: {region: 0x165, script: 0x57, flags: 0x0},
+ 238: {region: 0x165, script: 0x57, flags: 0x0},
+ 239: {region: 0xc5, script: 0xcc, flags: 0x0},
+ 240: {region: 0x78, script: 0x57, flags: 0x0},
+ 241: {region: 0x6b, script: 0x1c, flags: 0x0},
+ 242: {region: 0xe7, script: 0x57, flags: 0x0},
+ 243: {region: 0x49, script: 0x17, flags: 0x0},
+ 244: {region: 0x130, script: 0x1f, flags: 0x0},
245: {region: 0x49, script: 0x17, flags: 0x0},
246: {region: 0x49, script: 0x17, flags: 0x0},
247: {region: 0x49, script: 0x17, flags: 0x0},
- 248: {region: 0x10a, script: 0x55, flags: 0x0},
- 249: {region: 0x5e, script: 0x55, flags: 0x0},
- 250: {region: 0xe9, script: 0x55, flags: 0x0},
- 251: {region: 0x49, script: 0x17, flags: 0x0},
- 252: {region: 0xc4, script: 0x7e, flags: 0x0},
- 253: {region: 0x8, script: 0x2, flags: 0x1},
- 254: {region: 0x106, script: 0x1e, flags: 0x0},
- 255: {region: 0x7b, script: 0x55, flags: 0x0},
- 256: {region: 0x63, script: 0x55, flags: 0x0},
- 257: {region: 0x165, script: 0x55, flags: 0x0},
- 258: {region: 0x165, script: 0x55, flags: 0x0},
- 259: {region: 0x165, script: 0x55, flags: 0x0},
- 260: {region: 0x165, script: 0x55, flags: 0x0},
- 261: {region: 0x135, script: 0x55, flags: 0x0},
- 262: {region: 0x106, script: 0x1e, flags: 0x0},
- 263: {region: 0xa4, script: 0x55, flags: 0x0},
- 264: {region: 0x165, script: 0x55, flags: 0x0},
- 265: {region: 0x165, script: 0x55, flags: 0x0},
- 266: {region: 0x99, script: 0x5, flags: 0x0},
- 267: {region: 0x165, script: 0x55, flags: 0x0},
- 268: {region: 0x60, script: 0x55, flags: 0x0},
- 269: {region: 0x165, script: 0x55, flags: 0x0},
- 270: {region: 0x49, script: 0x55, flags: 0x0},
- 271: {region: 0x165, script: 0x55, flags: 0x0},
- 272: {region: 0x165, script: 0x55, flags: 0x0},
- 273: {region: 0x165, script: 0x55, flags: 0x0},
- 274: {region: 0x165, script: 0x5, flags: 0x0},
- 275: {region: 0x49, script: 0x55, flags: 0x0},
- 276: {region: 0x165, script: 0x55, flags: 0x0},
- 277: {region: 0x165, script: 0x55, flags: 0x0},
- 278: {region: 0xd4, script: 0x55, flags: 0x0},
- 279: {region: 0x4f, script: 0x55, flags: 0x0},
- 280: {region: 0x165, script: 0x55, flags: 0x0},
- 281: {region: 0x99, script: 0x5, flags: 0x0},
- 282: {region: 0x165, script: 0x55, flags: 0x0},
- 283: {region: 0x165, script: 0x55, flags: 0x0},
- 284: {region: 0x165, script: 0x55, flags: 0x0},
- 285: {region: 0x165, script: 0x28, flags: 0x0},
- 286: {region: 0x60, script: 0x55, flags: 0x0},
- 287: {region: 0xc3, script: 0x55, flags: 0x0},
- 288: {region: 0xd0, script: 0x55, flags: 0x0},
- 289: {region: 0x165, script: 0x55, flags: 0x0},
- 290: {region: 0xdb, script: 0x20, flags: 0x0},
- 291: {region: 0x52, script: 0x55, flags: 0x0},
- 292: {region: 0x165, script: 0x55, flags: 0x0},
- 293: {region: 0x165, script: 0x55, flags: 0x0},
- 294: {region: 0x165, script: 0x55, flags: 0x0},
- 295: {region: 0xcd, script: 0xda, flags: 0x0},
- 296: {region: 0x165, script: 0x55, flags: 0x0},
- 297: {region: 0x165, script: 0x55, flags: 0x0},
- 298: {region: 0x114, script: 0x55, flags: 0x0},
- 299: {region: 0x37, script: 0x55, flags: 0x0},
- 300: {region: 0x43, script: 0xdc, flags: 0x0},
- 301: {region: 0x165, script: 0x55, flags: 0x0},
- 302: {region: 0xa4, script: 0x55, flags: 0x0},
- 303: {region: 0x80, script: 0x55, flags: 0x0},
- 304: {region: 0xd6, script: 0x55, flags: 0x0},
- 305: {region: 0x9e, script: 0x55, flags: 0x0},
- 306: {region: 0x6b, script: 0x26, flags: 0x0},
- 307: {region: 0x165, script: 0x55, flags: 0x0},
- 308: {region: 0xc4, script: 0x46, flags: 0x0},
- 309: {region: 0x87, script: 0x30, flags: 0x0},
- 310: {region: 0x165, script: 0x55, flags: 0x0},
- 311: {region: 0x165, script: 0x55, flags: 0x0},
- 312: {region: 0xa, script: 0x2, flags: 0x1},
- 313: {region: 0x165, script: 0x55, flags: 0x0},
- 314: {region: 0x165, script: 0x55, flags: 0x0},
- 315: {region: 0x1, script: 0x55, flags: 0x0},
- 316: {region: 0x165, script: 0x55, flags: 0x0},
- 317: {region: 0x6e, script: 0x55, flags: 0x0},
- 318: {region: 0x135, script: 0x55, flags: 0x0},
- 319: {region: 0x6a, script: 0x55, flags: 0x0},
- 320: {region: 0x165, script: 0x55, flags: 0x0},
- 321: {region: 0x9e, script: 0x41, flags: 0x0},
- 322: {region: 0x165, script: 0x55, flags: 0x0},
- 323: {region: 0x165, script: 0x55, flags: 0x0},
- 324: {region: 0x6e, script: 0x55, flags: 0x0},
- 325: {region: 0x52, script: 0x55, flags: 0x0},
- 326: {region: 0x6e, script: 0x55, flags: 0x0},
- 327: {region: 0x9c, script: 0x5, flags: 0x0},
- 328: {region: 0x165, script: 0x55, flags: 0x0},
- 329: {region: 0x165, script: 0x55, flags: 0x0},
- 330: {region: 0x165, script: 0x55, flags: 0x0},
- 331: {region: 0x165, script: 0x55, flags: 0x0},
- 332: {region: 0x86, script: 0x55, flags: 0x0},
- 333: {region: 0xc, script: 0x2, flags: 0x1},
- 334: {region: 0x165, script: 0x55, flags: 0x0},
- 335: {region: 0xc3, script: 0x55, flags: 0x0},
- 336: {region: 0x72, script: 0x55, flags: 0x0},
- 337: {region: 0x10b, script: 0x5, flags: 0x0},
- 338: {region: 0xe7, script: 0x55, flags: 0x0},
- 339: {region: 0x10c, script: 0x55, flags: 0x0},
- 340: {region: 0x73, script: 0x55, flags: 0x0},
- 341: {region: 0x165, script: 0x55, flags: 0x0},
- 342: {region: 0x165, script: 0x55, flags: 0x0},
- 343: {region: 0x76, script: 0x55, flags: 0x0},
- 344: {region: 0x165, script: 0x55, flags: 0x0},
- 345: {region: 0x3b, script: 0x55, flags: 0x0},
- 346: {region: 0x165, script: 0x55, flags: 0x0},
- 347: {region: 0x165, script: 0x55, flags: 0x0},
- 348: {region: 0x165, script: 0x55, flags: 0x0},
- 349: {region: 0x78, script: 0x55, flags: 0x0},
- 350: {region: 0x135, script: 0x55, flags: 0x0},
- 351: {region: 0x78, script: 0x55, flags: 0x0},
- 352: {region: 0x60, script: 0x55, flags: 0x0},
- 353: {region: 0x60, script: 0x55, flags: 0x0},
- 354: {region: 0x52, script: 0x5, flags: 0x0},
- 355: {region: 0x140, script: 0x55, flags: 0x0},
- 356: {region: 0x165, script: 0x55, flags: 0x0},
- 357: {region: 0x84, script: 0x55, flags: 0x0},
- 358: {region: 0x165, script: 0x55, flags: 0x0},
- 359: {region: 0xd4, script: 0x55, flags: 0x0},
- 360: {region: 0x9e, script: 0x55, flags: 0x0},
- 361: {region: 0xd6, script: 0x55, flags: 0x0},
- 362: {region: 0x165, script: 0x55, flags: 0x0},
- 363: {region: 0x10b, script: 0x55, flags: 0x0},
- 364: {region: 0xd9, script: 0x55, flags: 0x0},
- 365: {region: 0x96, script: 0x55, flags: 0x0},
- 366: {region: 0x80, script: 0x55, flags: 0x0},
- 367: {region: 0x165, script: 0x55, flags: 0x0},
- 368: {region: 0xbc, script: 0x55, flags: 0x0},
- 369: {region: 0x165, script: 0x55, flags: 0x0},
- 370: {region: 0x165, script: 0x55, flags: 0x0},
- 371: {region: 0x165, script: 0x55, flags: 0x0},
- 372: {region: 0x53, script: 0x37, flags: 0x0},
- 373: {region: 0x165, script: 0x55, flags: 0x0},
- 374: {region: 0x95, script: 0x55, flags: 0x0},
- 375: {region: 0x165, script: 0x55, flags: 0x0},
- 376: {region: 0x99, script: 0x20, flags: 0x0},
- 377: {region: 0x165, script: 0x55, flags: 0x0},
- 378: {region: 0x9c, script: 0x5, flags: 0x0},
- 379: {region: 0x7e, script: 0x55, flags: 0x0},
- 380: {region: 0x7b, script: 0x55, flags: 0x0},
- 381: {region: 0x165, script: 0x55, flags: 0x0},
- 382: {region: 0x165, script: 0x55, flags: 0x0},
- 383: {region: 0x165, script: 0x55, flags: 0x0},
- 384: {region: 0x165, script: 0x55, flags: 0x0},
- 385: {region: 0x165, script: 0x55, flags: 0x0},
- 386: {region: 0x165, script: 0x55, flags: 0x0},
- 387: {region: 0x6f, script: 0x28, flags: 0x0},
- 388: {region: 0x165, script: 0x55, flags: 0x0},
- 389: {region: 0xdb, script: 0x20, flags: 0x0},
- 390: {region: 0x165, script: 0x55, flags: 0x0},
- 391: {region: 0xa7, script: 0x55, flags: 0x0},
- 392: {region: 0x165, script: 0x55, flags: 0x0},
- 393: {region: 0xe8, script: 0x5, flags: 0x0},
- 394: {region: 0x165, script: 0x55, flags: 0x0},
+ 248: {region: 0x49, script: 0x17, flags: 0x0},
+ 249: {region: 0x10a, script: 0x57, flags: 0x0},
+ 250: {region: 0x5e, script: 0x57, flags: 0x0},
+ 251: {region: 0xe9, script: 0x57, flags: 0x0},
+ 252: {region: 0x49, script: 0x17, flags: 0x0},
+ 253: {region: 0xc4, script: 0x81, flags: 0x0},
+ 254: {region: 0x8, script: 0x2, flags: 0x1},
+ 255: {region: 0x106, script: 0x1f, flags: 0x0},
+ 256: {region: 0x7b, script: 0x57, flags: 0x0},
+ 257: {region: 0x63, script: 0x57, flags: 0x0},
+ 258: {region: 0x165, script: 0x57, flags: 0x0},
+ 259: {region: 0x165, script: 0x57, flags: 0x0},
+ 260: {region: 0x165, script: 0x57, flags: 0x0},
+ 261: {region: 0x165, script: 0x57, flags: 0x0},
+ 262: {region: 0x135, script: 0x57, flags: 0x0},
+ 263: {region: 0x106, script: 0x1f, flags: 0x0},
+ 264: {region: 0xa4, script: 0x57, flags: 0x0},
+ 265: {region: 0x165, script: 0x57, flags: 0x0},
+ 266: {region: 0x165, script: 0x57, flags: 0x0},
+ 267: {region: 0x99, script: 0x5, flags: 0x0},
+ 268: {region: 0x165, script: 0x57, flags: 0x0},
+ 269: {region: 0x60, script: 0x57, flags: 0x0},
+ 270: {region: 0x165, script: 0x57, flags: 0x0},
+ 271: {region: 0x49, script: 0x57, flags: 0x0},
+ 272: {region: 0x165, script: 0x57, flags: 0x0},
+ 273: {region: 0x165, script: 0x57, flags: 0x0},
+ 274: {region: 0x165, script: 0x57, flags: 0x0},
+ 275: {region: 0x165, script: 0x5, flags: 0x0},
+ 276: {region: 0x49, script: 0x57, flags: 0x0},
+ 277: {region: 0x165, script: 0x57, flags: 0x0},
+ 278: {region: 0x165, script: 0x57, flags: 0x0},
+ 279: {region: 0xd4, script: 0x57, flags: 0x0},
+ 280: {region: 0x4f, script: 0x57, flags: 0x0},
+ 281: {region: 0x165, script: 0x57, flags: 0x0},
+ 282: {region: 0x99, script: 0x5, flags: 0x0},
+ 283: {region: 0x165, script: 0x57, flags: 0x0},
+ 284: {region: 0x165, script: 0x57, flags: 0x0},
+ 285: {region: 0x165, script: 0x57, flags: 0x0},
+ 286: {region: 0x165, script: 0x29, flags: 0x0},
+ 287: {region: 0x60, script: 0x57, flags: 0x0},
+ 288: {region: 0xc3, script: 0x57, flags: 0x0},
+ 289: {region: 0xd0, script: 0x57, flags: 0x0},
+ 290: {region: 0x165, script: 0x57, flags: 0x0},
+ 291: {region: 0xdb, script: 0x21, flags: 0x0},
+ 292: {region: 0x52, script: 0x57, flags: 0x0},
+ 293: {region: 0x165, script: 0x57, flags: 0x0},
+ 294: {region: 0x165, script: 0x57, flags: 0x0},
+ 295: {region: 0x165, script: 0x57, flags: 0x0},
+ 296: {region: 0xcd, script: 0xde, flags: 0x0},
+ 297: {region: 0x165, script: 0x57, flags: 0x0},
+ 298: {region: 0x165, script: 0x57, flags: 0x0},
+ 299: {region: 0x114, script: 0x57, flags: 0x0},
+ 300: {region: 0x37, script: 0x57, flags: 0x0},
+ 301: {region: 0x43, script: 0xe0, flags: 0x0},
+ 302: {region: 0x165, script: 0x57, flags: 0x0},
+ 303: {region: 0xa4, script: 0x57, flags: 0x0},
+ 304: {region: 0x80, script: 0x57, flags: 0x0},
+ 305: {region: 0xd6, script: 0x57, flags: 0x0},
+ 306: {region: 0x9e, script: 0x57, flags: 0x0},
+ 307: {region: 0x6b, script: 0x27, flags: 0x0},
+ 308: {region: 0x165, script: 0x57, flags: 0x0},
+ 309: {region: 0xc4, script: 0x48, flags: 0x0},
+ 310: {region: 0x87, script: 0x31, flags: 0x0},
+ 311: {region: 0x165, script: 0x57, flags: 0x0},
+ 312: {region: 0x165, script: 0x57, flags: 0x0},
+ 313: {region: 0xa, script: 0x2, flags: 0x1},
+ 314: {region: 0x165, script: 0x57, flags: 0x0},
+ 315: {region: 0x165, script: 0x57, flags: 0x0},
+ 316: {region: 0x1, script: 0x57, flags: 0x0},
+ 317: {region: 0x165, script: 0x57, flags: 0x0},
+ 318: {region: 0x6e, script: 0x57, flags: 0x0},
+ 319: {region: 0x135, script: 0x57, flags: 0x0},
+ 320: {region: 0x6a, script: 0x57, flags: 0x0},
+ 321: {region: 0x165, script: 0x57, flags: 0x0},
+ 322: {region: 0x9e, script: 0x43, flags: 0x0},
+ 323: {region: 0x165, script: 0x57, flags: 0x0},
+ 324: {region: 0x165, script: 0x57, flags: 0x0},
+ 325: {region: 0x6e, script: 0x57, flags: 0x0},
+ 326: {region: 0x52, script: 0x57, flags: 0x0},
+ 327: {region: 0x6e, script: 0x57, flags: 0x0},
+ 328: {region: 0x9c, script: 0x5, flags: 0x0},
+ 329: {region: 0x165, script: 0x57, flags: 0x0},
+ 330: {region: 0x165, script: 0x57, flags: 0x0},
+ 331: {region: 0x165, script: 0x57, flags: 0x0},
+ 332: {region: 0x165, script: 0x57, flags: 0x0},
+ 333: {region: 0x86, script: 0x57, flags: 0x0},
+ 334: {region: 0xc, script: 0x2, flags: 0x1},
+ 335: {region: 0x165, script: 0x57, flags: 0x0},
+ 336: {region: 0xc3, script: 0x57, flags: 0x0},
+ 337: {region: 0x72, script: 0x57, flags: 0x0},
+ 338: {region: 0x10b, script: 0x5, flags: 0x0},
+ 339: {region: 0xe7, script: 0x57, flags: 0x0},
+ 340: {region: 0x10c, script: 0x57, flags: 0x0},
+ 341: {region: 0x73, script: 0x57, flags: 0x0},
+ 342: {region: 0x165, script: 0x57, flags: 0x0},
+ 343: {region: 0x165, script: 0x57, flags: 0x0},
+ 344: {region: 0x76, script: 0x57, flags: 0x0},
+ 345: {region: 0x165, script: 0x57, flags: 0x0},
+ 346: {region: 0x3b, script: 0x57, flags: 0x0},
+ 347: {region: 0x165, script: 0x57, flags: 0x0},
+ 348: {region: 0x165, script: 0x57, flags: 0x0},
+ 349: {region: 0x165, script: 0x57, flags: 0x0},
+ 350: {region: 0x78, script: 0x57, flags: 0x0},
+ 351: {region: 0x135, script: 0x57, flags: 0x0},
+ 352: {region: 0x78, script: 0x57, flags: 0x0},
+ 353: {region: 0x60, script: 0x57, flags: 0x0},
+ 354: {region: 0x60, script: 0x57, flags: 0x0},
+ 355: {region: 0x52, script: 0x5, flags: 0x0},
+ 356: {region: 0x140, script: 0x57, flags: 0x0},
+ 357: {region: 0x165, script: 0x57, flags: 0x0},
+ 358: {region: 0x84, script: 0x57, flags: 0x0},
+ 359: {region: 0x165, script: 0x57, flags: 0x0},
+ 360: {region: 0xd4, script: 0x57, flags: 0x0},
+ 361: {region: 0x9e, script: 0x57, flags: 0x0},
+ 362: {region: 0xd6, script: 0x57, flags: 0x0},
+ 363: {region: 0x165, script: 0x57, flags: 0x0},
+ 364: {region: 0x10b, script: 0x57, flags: 0x0},
+ 365: {region: 0xd9, script: 0x57, flags: 0x0},
+ 366: {region: 0x96, script: 0x57, flags: 0x0},
+ 367: {region: 0x80, script: 0x57, flags: 0x0},
+ 368: {region: 0x165, script: 0x57, flags: 0x0},
+ 369: {region: 0xbc, script: 0x57, flags: 0x0},
+ 370: {region: 0x165, script: 0x57, flags: 0x0},
+ 371: {region: 0x165, script: 0x57, flags: 0x0},
+ 372: {region: 0x165, script: 0x57, flags: 0x0},
+ 373: {region: 0x53, script: 0x38, flags: 0x0},
+ 374: {region: 0x165, script: 0x57, flags: 0x0},
+ 375: {region: 0x95, script: 0x57, flags: 0x0},
+ 376: {region: 0x165, script: 0x57, flags: 0x0},
+ 377: {region: 0x165, script: 0x57, flags: 0x0},
+ 378: {region: 0x99, script: 0x21, flags: 0x0},
+ 379: {region: 0x165, script: 0x57, flags: 0x0},
+ 380: {region: 0x9c, script: 0x5, flags: 0x0},
+ 381: {region: 0x7e, script: 0x57, flags: 0x0},
+ 382: {region: 0x7b, script: 0x57, flags: 0x0},
+ 383: {region: 0x165, script: 0x57, flags: 0x0},
+ 384: {region: 0x165, script: 0x57, flags: 0x0},
+ 385: {region: 0x165, script: 0x57, flags: 0x0},
+ 386: {region: 0x165, script: 0x57, flags: 0x0},
+ 387: {region: 0x165, script: 0x57, flags: 0x0},
+ 388: {region: 0x165, script: 0x57, flags: 0x0},
+ 389: {region: 0x6f, script: 0x29, flags: 0x0},
+ 390: {region: 0x165, script: 0x57, flags: 0x0},
+ 391: {region: 0xdb, script: 0x21, flags: 0x0},
+ 392: {region: 0x165, script: 0x57, flags: 0x0},
+ 393: {region: 0xa7, script: 0x57, flags: 0x0},
+ 394: {region: 0x165, script: 0x57, flags: 0x0},
395: {region: 0xe8, script: 0x5, flags: 0x0},
- 396: {region: 0x165, script: 0x55, flags: 0x0},
- 397: {region: 0x165, script: 0x55, flags: 0x0},
- 398: {region: 0x6e, script: 0x55, flags: 0x0},
- 399: {region: 0x9c, script: 0x5, flags: 0x0},
- 400: {region: 0x165, script: 0x55, flags: 0x0},
- 401: {region: 0x165, script: 0x28, flags: 0x0},
- 402: {region: 0xf1, script: 0x55, flags: 0x0},
- 403: {region: 0x165, script: 0x55, flags: 0x0},
- 404: {region: 0x165, script: 0x55, flags: 0x0},
- 405: {region: 0x165, script: 0x55, flags: 0x0},
- 406: {region: 0x165, script: 0x28, flags: 0x0},
- 407: {region: 0x165, script: 0x55, flags: 0x0},
- 408: {region: 0x99, script: 0x20, flags: 0x0},
- 409: {region: 0x99, script: 0xd6, flags: 0x0},
- 410: {region: 0x95, script: 0x55, flags: 0x0},
- 411: {region: 0xd9, script: 0x55, flags: 0x0},
- 412: {region: 0x130, script: 0x2e, flags: 0x0},
- 413: {region: 0x165, script: 0x55, flags: 0x0},
- 414: {region: 0xe, script: 0x2, flags: 0x1},
- 415: {region: 0x99, script: 0xe, flags: 0x0},
- 416: {region: 0x165, script: 0x55, flags: 0x0},
- 417: {region: 0x4e, script: 0x55, flags: 0x0},
- 418: {region: 0x99, script: 0x31, flags: 0x0},
- 419: {region: 0x41, script: 0x55, flags: 0x0},
- 420: {region: 0x54, script: 0x55, flags: 0x0},
- 421: {region: 0x165, script: 0x55, flags: 0x0},
- 422: {region: 0x80, script: 0x55, flags: 0x0},
- 423: {region: 0x165, script: 0x55, flags: 0x0},
- 424: {region: 0x165, script: 0x55, flags: 0x0},
- 425: {region: 0xa4, script: 0x55, flags: 0x0},
- 426: {region: 0x98, script: 0x55, flags: 0x0},
- 427: {region: 0x165, script: 0x55, flags: 0x0},
- 428: {region: 0xdb, script: 0x20, flags: 0x0},
- 429: {region: 0x165, script: 0x55, flags: 0x0},
- 430: {region: 0x165, script: 0x5, flags: 0x0},
- 431: {region: 0x49, script: 0x55, flags: 0x0},
+ 396: {region: 0x165, script: 0x57, flags: 0x0},
+ 397: {region: 0xe8, script: 0x5, flags: 0x0},
+ 398: {region: 0x165, script: 0x57, flags: 0x0},
+ 399: {region: 0x165, script: 0x57, flags: 0x0},
+ 400: {region: 0x6e, script: 0x57, flags: 0x0},
+ 401: {region: 0x9c, script: 0x5, flags: 0x0},
+ 402: {region: 0x165, script: 0x57, flags: 0x0},
+ 403: {region: 0x165, script: 0x29, flags: 0x0},
+ 404: {region: 0xf1, script: 0x57, flags: 0x0},
+ 405: {region: 0x165, script: 0x57, flags: 0x0},
+ 406: {region: 0x165, script: 0x57, flags: 0x0},
+ 407: {region: 0x165, script: 0x57, flags: 0x0},
+ 408: {region: 0x165, script: 0x29, flags: 0x0},
+ 409: {region: 0x165, script: 0x57, flags: 0x0},
+ 410: {region: 0x99, script: 0x21, flags: 0x0},
+ 411: {region: 0x99, script: 0xda, flags: 0x0},
+ 412: {region: 0x95, script: 0x57, flags: 0x0},
+ 413: {region: 0xd9, script: 0x57, flags: 0x0},
+ 414: {region: 0x130, script: 0x2f, flags: 0x0},
+ 415: {region: 0x165, script: 0x57, flags: 0x0},
+ 416: {region: 0xe, script: 0x2, flags: 0x1},
+ 417: {region: 0x99, script: 0xe, flags: 0x0},
+ 418: {region: 0x165, script: 0x57, flags: 0x0},
+ 419: {region: 0x4e, script: 0x57, flags: 0x0},
+ 420: {region: 0x99, script: 0x32, flags: 0x0},
+ 421: {region: 0x41, script: 0x57, flags: 0x0},
+ 422: {region: 0x54, script: 0x57, flags: 0x0},
+ 423: {region: 0x165, script: 0x57, flags: 0x0},
+ 424: {region: 0x80, script: 0x57, flags: 0x0},
+ 425: {region: 0x165, script: 0x57, flags: 0x0},
+ 426: {region: 0x165, script: 0x57, flags: 0x0},
+ 427: {region: 0xa4, script: 0x57, flags: 0x0},
+ 428: {region: 0x98, script: 0x57, flags: 0x0},
+ 429: {region: 0x165, script: 0x57, flags: 0x0},
+ 430: {region: 0xdb, script: 0x21, flags: 0x0},
+ 431: {region: 0x165, script: 0x57, flags: 0x0},
432: {region: 0x165, script: 0x5, flags: 0x0},
- 433: {region: 0x165, script: 0x55, flags: 0x0},
- 434: {region: 0x10, script: 0x3, flags: 0x1},
- 435: {region: 0x165, script: 0x55, flags: 0x0},
- 436: {region: 0x53, script: 0x37, flags: 0x0},
- 437: {region: 0x165, script: 0x55, flags: 0x0},
- 438: {region: 0x135, script: 0x55, flags: 0x0},
- 439: {region: 0x24, script: 0x5, flags: 0x0},
- 440: {region: 0x165, script: 0x55, flags: 0x0},
- 441: {region: 0x165, script: 0x28, flags: 0x0},
- 442: {region: 0x97, script: 0x3a, flags: 0x0},
- 443: {region: 0x165, script: 0x55, flags: 0x0},
- 444: {region: 0x99, script: 0x20, flags: 0x0},
- 445: {region: 0x165, script: 0x55, flags: 0x0},
- 446: {region: 0x73, script: 0x55, flags: 0x0},
- 447: {region: 0x165, script: 0x55, flags: 0x0},
- 448: {region: 0x165, script: 0x55, flags: 0x0},
- 449: {region: 0xe7, script: 0x55, flags: 0x0},
- 450: {region: 0x165, script: 0x55, flags: 0x0},
- 451: {region: 0x12b, script: 0x3c, flags: 0x0},
- 452: {region: 0x53, script: 0x86, flags: 0x0},
- 453: {region: 0x165, script: 0x55, flags: 0x0},
- 454: {region: 0xe8, script: 0x5, flags: 0x0},
- 455: {region: 0x99, script: 0x20, flags: 0x0},
- 456: {region: 0xaf, script: 0x3d, flags: 0x0},
- 457: {region: 0xe7, script: 0x55, flags: 0x0},
- 458: {region: 0xe8, script: 0x5, flags: 0x0},
- 459: {region: 0xe6, script: 0x55, flags: 0x0},
- 460: {region: 0x99, script: 0x20, flags: 0x0},
- 461: {region: 0x99, script: 0x20, flags: 0x0},
- 462: {region: 0x165, script: 0x55, flags: 0x0},
- 463: {region: 0x90, script: 0x55, flags: 0x0},
- 464: {region: 0x60, script: 0x55, flags: 0x0},
- 465: {region: 0x53, script: 0x37, flags: 0x0},
- 466: {region: 0x91, script: 0x55, flags: 0x0},
- 467: {region: 0x92, script: 0x55, flags: 0x0},
- 468: {region: 0x165, script: 0x55, flags: 0x0},
- 469: {region: 0x28, script: 0x8, flags: 0x0},
- 470: {region: 0xd2, script: 0x55, flags: 0x0},
- 471: {region: 0x78, script: 0x55, flags: 0x0},
- 472: {region: 0x165, script: 0x55, flags: 0x0},
- 473: {region: 0x165, script: 0x55, flags: 0x0},
- 474: {region: 0xd0, script: 0x55, flags: 0x0},
- 475: {region: 0xd6, script: 0x55, flags: 0x0},
- 476: {region: 0x165, script: 0x55, flags: 0x0},
- 477: {region: 0x165, script: 0x55, flags: 0x0},
- 478: {region: 0x165, script: 0x55, flags: 0x0},
- 479: {region: 0x95, script: 0x55, flags: 0x0},
- 480: {region: 0x165, script: 0x55, flags: 0x0},
- 481: {region: 0x165, script: 0x55, flags: 0x0},
- 482: {region: 0x165, script: 0x55, flags: 0x0},
- 484: {region: 0x122, script: 0x55, flags: 0x0},
- 485: {region: 0xd6, script: 0x55, flags: 0x0},
- 486: {region: 0x165, script: 0x55, flags: 0x0},
- 487: {region: 0x165, script: 0x55, flags: 0x0},
- 488: {region: 0x53, script: 0xe5, flags: 0x0},
- 489: {region: 0x165, script: 0x55, flags: 0x0},
- 490: {region: 0x135, script: 0x55, flags: 0x0},
- 491: {region: 0x165, script: 0x55, flags: 0x0},
- 492: {region: 0x49, script: 0x55, flags: 0x0},
- 493: {region: 0x165, script: 0x55, flags: 0x0},
- 494: {region: 0x165, script: 0x55, flags: 0x0},
- 495: {region: 0xe7, script: 0x55, flags: 0x0},
- 496: {region: 0x165, script: 0x55, flags: 0x0},
- 497: {region: 0x95, script: 0x55, flags: 0x0},
- 498: {region: 0x106, script: 0x1e, flags: 0x0},
- 500: {region: 0x165, script: 0x55, flags: 0x0},
- 501: {region: 0x165, script: 0x55, flags: 0x0},
- 502: {region: 0x9d, script: 0x55, flags: 0x0},
- 503: {region: 0x9e, script: 0x55, flags: 0x0},
- 504: {region: 0x49, script: 0x17, flags: 0x0},
- 505: {region: 0x97, script: 0x3a, flags: 0x0},
- 506: {region: 0x165, script: 0x55, flags: 0x0},
- 507: {region: 0x165, script: 0x55, flags: 0x0},
- 508: {region: 0x106, script: 0x55, flags: 0x0},
- 509: {region: 0x165, script: 0x55, flags: 0x0},
- 510: {region: 0xa2, script: 0x44, flags: 0x0},
- 511: {region: 0x165, script: 0x55, flags: 0x0},
- 512: {region: 0xa0, script: 0x55, flags: 0x0},
- 514: {region: 0x165, script: 0x55, flags: 0x0},
- 515: {region: 0x165, script: 0x55, flags: 0x0},
- 516: {region: 0x165, script: 0x55, flags: 0x0},
- 517: {region: 0x52, script: 0x55, flags: 0x0},
- 518: {region: 0x130, script: 0x3a, flags: 0x0},
- 519: {region: 0x165, script: 0x55, flags: 0x0},
- 520: {region: 0x12f, script: 0x55, flags: 0x0},
- 521: {region: 0xdb, script: 0x20, flags: 0x0},
- 522: {region: 0x165, script: 0x55, flags: 0x0},
- 523: {region: 0x63, script: 0x55, flags: 0x0},
- 524: {region: 0x95, script: 0x55, flags: 0x0},
- 525: {region: 0x95, script: 0x55, flags: 0x0},
- 526: {region: 0x7d, script: 0x2a, flags: 0x0},
- 527: {region: 0x137, script: 0x1e, flags: 0x0},
- 528: {region: 0x67, script: 0x55, flags: 0x0},
- 529: {region: 0xc4, script: 0x55, flags: 0x0},
- 530: {region: 0x165, script: 0x55, flags: 0x0},
- 531: {region: 0x165, script: 0x55, flags: 0x0},
- 532: {region: 0xd6, script: 0x55, flags: 0x0},
- 533: {region: 0xa4, script: 0x55, flags: 0x0},
- 534: {region: 0xc3, script: 0x55, flags: 0x0},
- 535: {region: 0x106, script: 0x1e, flags: 0x0},
- 536: {region: 0x165, script: 0x55, flags: 0x0},
- 537: {region: 0x165, script: 0x55, flags: 0x0},
- 538: {region: 0x165, script: 0x55, flags: 0x0},
- 539: {region: 0x165, script: 0x55, flags: 0x0},
- 540: {region: 0xd4, script: 0x5, flags: 0x0},
- 541: {region: 0xd6, script: 0x55, flags: 0x0},
- 542: {region: 0x164, script: 0x55, flags: 0x0},
- 543: {region: 0x165, script: 0x55, flags: 0x0},
- 544: {region: 0x165, script: 0x55, flags: 0x0},
- 545: {region: 0x12f, script: 0x55, flags: 0x0},
- 546: {region: 0x122, script: 0x5, flags: 0x0},
- 547: {region: 0x165, script: 0x55, flags: 0x0},
- 548: {region: 0x123, script: 0xdb, flags: 0x0},
- 549: {region: 0x5a, script: 0x55, flags: 0x0},
- 550: {region: 0x52, script: 0x55, flags: 0x0},
- 551: {region: 0x165, script: 0x55, flags: 0x0},
- 552: {region: 0x4f, script: 0x55, flags: 0x0},
- 553: {region: 0x99, script: 0x20, flags: 0x0},
- 554: {region: 0x99, script: 0x20, flags: 0x0},
- 555: {region: 0x4b, script: 0x55, flags: 0x0},
- 556: {region: 0x95, script: 0x55, flags: 0x0},
- 557: {region: 0x165, script: 0x55, flags: 0x0},
- 558: {region: 0x41, script: 0x55, flags: 0x0},
- 559: {region: 0x99, script: 0x55, flags: 0x0},
- 560: {region: 0x53, script: 0xd2, flags: 0x0},
- 561: {region: 0x99, script: 0x20, flags: 0x0},
- 562: {region: 0xc3, script: 0x55, flags: 0x0},
- 563: {region: 0x165, script: 0x55, flags: 0x0},
- 564: {region: 0x99, script: 0x70, flags: 0x0},
- 565: {region: 0xe8, script: 0x5, flags: 0x0},
- 566: {region: 0x165, script: 0x55, flags: 0x0},
- 567: {region: 0xa4, script: 0x55, flags: 0x0},
- 568: {region: 0x165, script: 0x55, flags: 0x0},
- 569: {region: 0x12b, script: 0x55, flags: 0x0},
- 570: {region: 0x165, script: 0x55, flags: 0x0},
- 571: {region: 0xd2, script: 0x55, flags: 0x0},
- 572: {region: 0x165, script: 0x55, flags: 0x0},
- 573: {region: 0xaf, script: 0x52, flags: 0x0},
- 574: {region: 0x165, script: 0x55, flags: 0x0},
- 575: {region: 0x165, script: 0x55, flags: 0x0},
- 576: {region: 0x13, script: 0x6, flags: 0x1},
- 577: {region: 0x165, script: 0x55, flags: 0x0},
- 578: {region: 0x52, script: 0x55, flags: 0x0},
- 579: {region: 0x82, script: 0x55, flags: 0x0},
- 580: {region: 0xa4, script: 0x55, flags: 0x0},
- 581: {region: 0x165, script: 0x55, flags: 0x0},
- 582: {region: 0x165, script: 0x55, flags: 0x0},
- 583: {region: 0x165, script: 0x55, flags: 0x0},
- 584: {region: 0xa6, script: 0x49, flags: 0x0},
- 585: {region: 0x2a, script: 0x55, flags: 0x0},
- 586: {region: 0x165, script: 0x55, flags: 0x0},
- 587: {region: 0x165, script: 0x55, flags: 0x0},
- 588: {region: 0x165, script: 0x55, flags: 0x0},
- 589: {region: 0x165, script: 0x55, flags: 0x0},
- 590: {region: 0x165, script: 0x55, flags: 0x0},
- 591: {region: 0x99, script: 0x4d, flags: 0x0},
- 592: {region: 0x114, script: 0x55, flags: 0x0},
- 593: {region: 0x165, script: 0x55, flags: 0x0},
- 594: {region: 0xab, script: 0x4e, flags: 0x0},
- 595: {region: 0x106, script: 0x1e, flags: 0x0},
- 596: {region: 0x99, script: 0x20, flags: 0x0},
- 597: {region: 0x165, script: 0x55, flags: 0x0},
- 598: {region: 0x75, script: 0x55, flags: 0x0},
- 599: {region: 0x165, script: 0x55, flags: 0x0},
- 600: {region: 0xb4, script: 0x55, flags: 0x0},
- 601: {region: 0x165, script: 0x55, flags: 0x0},
- 602: {region: 0x165, script: 0x55, flags: 0x0},
- 603: {region: 0x165, script: 0x55, flags: 0x0},
- 604: {region: 0x165, script: 0x55, flags: 0x0},
- 605: {region: 0x165, script: 0x55, flags: 0x0},
- 606: {region: 0x165, script: 0x55, flags: 0x0},
- 607: {region: 0x165, script: 0x55, flags: 0x0},
- 608: {region: 0x165, script: 0x28, flags: 0x0},
- 610: {region: 0x106, script: 0x1e, flags: 0x0},
- 611: {region: 0x112, script: 0x55, flags: 0x0},
- 612: {region: 0xe7, script: 0x55, flags: 0x0},
- 613: {region: 0x106, script: 0x55, flags: 0x0},
- 614: {region: 0x165, script: 0x55, flags: 0x0},
- 615: {region: 0x99, script: 0x20, flags: 0x0},
- 616: {region: 0x99, script: 0x5, flags: 0x0},
- 617: {region: 0x12f, script: 0x55, flags: 0x0},
- 618: {region: 0x165, script: 0x55, flags: 0x0},
- 619: {region: 0x52, script: 0x55, flags: 0x0},
- 620: {region: 0x60, script: 0x55, flags: 0x0},
- 621: {region: 0x165, script: 0x55, flags: 0x0},
- 622: {region: 0x165, script: 0x55, flags: 0x0},
- 623: {region: 0x165, script: 0x28, flags: 0x0},
- 624: {region: 0x165, script: 0x55, flags: 0x0},
- 625: {region: 0x165, script: 0x55, flags: 0x0},
- 626: {region: 0x19, script: 0x3, flags: 0x1},
- 627: {region: 0x165, script: 0x55, flags: 0x0},
- 628: {region: 0x165, script: 0x55, flags: 0x0},
- 629: {region: 0x165, script: 0x55, flags: 0x0},
- 630: {region: 0x165, script: 0x55, flags: 0x0},
- 631: {region: 0x106, script: 0x1e, flags: 0x0},
- 632: {region: 0x165, script: 0x55, flags: 0x0},
- 633: {region: 0x165, script: 0x55, flags: 0x0},
- 634: {region: 0x165, script: 0x55, flags: 0x0},
- 635: {region: 0x106, script: 0x1e, flags: 0x0},
- 636: {region: 0x165, script: 0x55, flags: 0x0},
- 637: {region: 0x95, script: 0x55, flags: 0x0},
- 638: {region: 0xe8, script: 0x5, flags: 0x0},
- 639: {region: 0x7b, script: 0x55, flags: 0x0},
- 640: {region: 0x165, script: 0x55, flags: 0x0},
- 641: {region: 0x165, script: 0x55, flags: 0x0},
- 642: {region: 0x165, script: 0x55, flags: 0x0},
- 643: {region: 0x165, script: 0x28, flags: 0x0},
- 644: {region: 0x123, script: 0xdb, flags: 0x0},
- 645: {region: 0xe8, script: 0x5, flags: 0x0},
- 646: {region: 0x165, script: 0x55, flags: 0x0},
- 647: {region: 0x165, script: 0x55, flags: 0x0},
- 648: {region: 0x1c, script: 0x5, flags: 0x1},
- 649: {region: 0x165, script: 0x55, flags: 0x0},
- 650: {region: 0x165, script: 0x55, flags: 0x0},
- 651: {region: 0x165, script: 0x55, flags: 0x0},
- 652: {region: 0x138, script: 0x55, flags: 0x0},
- 653: {region: 0x87, script: 0x59, flags: 0x0},
- 654: {region: 0x97, script: 0x3a, flags: 0x0},
- 655: {region: 0x12f, script: 0x55, flags: 0x0},
- 656: {region: 0xe8, script: 0x5, flags: 0x0},
- 657: {region: 0x131, script: 0x55, flags: 0x0},
- 658: {region: 0x165, script: 0x55, flags: 0x0},
- 659: {region: 0xb7, script: 0x55, flags: 0x0},
- 660: {region: 0x106, script: 0x1e, flags: 0x0},
- 661: {region: 0x165, script: 0x55, flags: 0x0},
- 662: {region: 0x95, script: 0x55, flags: 0x0},
- 663: {region: 0x165, script: 0x55, flags: 0x0},
- 664: {region: 0x53, script: 0xdb, flags: 0x0},
- 665: {region: 0x165, script: 0x55, flags: 0x0},
- 666: {region: 0x165, script: 0x55, flags: 0x0},
- 667: {region: 0x165, script: 0x55, flags: 0x0},
- 668: {region: 0x165, script: 0x55, flags: 0x0},
- 669: {region: 0x99, script: 0x57, flags: 0x0},
- 670: {region: 0x165, script: 0x55, flags: 0x0},
- 671: {region: 0x165, script: 0x55, flags: 0x0},
- 672: {region: 0x106, script: 0x1e, flags: 0x0},
- 673: {region: 0x131, script: 0x55, flags: 0x0},
- 674: {region: 0x165, script: 0x55, flags: 0x0},
- 675: {region: 0xd9, script: 0x55, flags: 0x0},
- 676: {region: 0x165, script: 0x55, flags: 0x0},
- 677: {region: 0x165, script: 0x55, flags: 0x0},
- 678: {region: 0x21, script: 0x2, flags: 0x1},
- 679: {region: 0x165, script: 0x55, flags: 0x0},
- 680: {region: 0x165, script: 0x55, flags: 0x0},
- 681: {region: 0x9e, script: 0x55, flags: 0x0},
- 682: {region: 0x53, script: 0x5b, flags: 0x0},
- 683: {region: 0x95, script: 0x55, flags: 0x0},
- 684: {region: 0x9c, script: 0x5, flags: 0x0},
- 685: {region: 0x135, script: 0x55, flags: 0x0},
- 686: {region: 0x165, script: 0x55, flags: 0x0},
- 687: {region: 0x165, script: 0x55, flags: 0x0},
- 688: {region: 0x99, script: 0xd6, flags: 0x0},
- 689: {region: 0x9e, script: 0x55, flags: 0x0},
- 690: {region: 0x165, script: 0x55, flags: 0x0},
- 691: {region: 0x4b, script: 0x55, flags: 0x0},
- 692: {region: 0x165, script: 0x55, flags: 0x0},
- 693: {region: 0x165, script: 0x55, flags: 0x0},
- 694: {region: 0xaf, script: 0x52, flags: 0x0},
- 695: {region: 0x165, script: 0x55, flags: 0x0},
- 696: {region: 0x165, script: 0x55, flags: 0x0},
- 697: {region: 0x4b, script: 0x55, flags: 0x0},
- 698: {region: 0x165, script: 0x55, flags: 0x0},
- 699: {region: 0x165, script: 0x55, flags: 0x0},
- 700: {region: 0x162, script: 0x55, flags: 0x0},
- 701: {region: 0x9c, script: 0x5, flags: 0x0},
- 702: {region: 0xb6, script: 0x55, flags: 0x0},
- 703: {region: 0xb8, script: 0x55, flags: 0x0},
- 704: {region: 0x4b, script: 0x55, flags: 0x0},
- 705: {region: 0x4b, script: 0x55, flags: 0x0},
- 706: {region: 0xa4, script: 0x55, flags: 0x0},
- 707: {region: 0xa4, script: 0x55, flags: 0x0},
- 708: {region: 0x9c, script: 0x5, flags: 0x0},
- 709: {region: 0xb8, script: 0x55, flags: 0x0},
- 710: {region: 0x123, script: 0xdb, flags: 0x0},
- 711: {region: 0x53, script: 0x37, flags: 0x0},
- 712: {region: 0x12b, script: 0x55, flags: 0x0},
- 713: {region: 0x95, script: 0x55, flags: 0x0},
- 714: {region: 0x52, script: 0x55, flags: 0x0},
- 715: {region: 0x99, script: 0x20, flags: 0x0},
- 716: {region: 0x99, script: 0x20, flags: 0x0},
- 717: {region: 0x95, script: 0x55, flags: 0x0},
- 718: {region: 0x23, script: 0x3, flags: 0x1},
- 719: {region: 0xa4, script: 0x55, flags: 0x0},
- 720: {region: 0x165, script: 0x55, flags: 0x0},
- 721: {region: 0xcf, script: 0x55, flags: 0x0},
- 722: {region: 0x165, script: 0x55, flags: 0x0},
- 723: {region: 0x165, script: 0x55, flags: 0x0},
- 724: {region: 0x165, script: 0x55, flags: 0x0},
- 725: {region: 0x165, script: 0x55, flags: 0x0},
- 726: {region: 0x165, script: 0x55, flags: 0x0},
- 727: {region: 0x165, script: 0x55, flags: 0x0},
- 728: {region: 0x165, script: 0x55, flags: 0x0},
- 729: {region: 0x165, script: 0x55, flags: 0x0},
- 730: {region: 0x165, script: 0x55, flags: 0x0},
- 731: {region: 0x165, script: 0x55, flags: 0x0},
- 732: {region: 0x165, script: 0x55, flags: 0x0},
- 733: {region: 0x165, script: 0x5, flags: 0x0},
- 734: {region: 0x106, script: 0x1e, flags: 0x0},
- 735: {region: 0xe7, script: 0x55, flags: 0x0},
- 736: {region: 0x165, script: 0x55, flags: 0x0},
- 737: {region: 0x95, script: 0x55, flags: 0x0},
- 738: {region: 0x165, script: 0x28, flags: 0x0},
- 739: {region: 0x165, script: 0x55, flags: 0x0},
- 740: {region: 0x165, script: 0x55, flags: 0x0},
- 741: {region: 0x165, script: 0x55, flags: 0x0},
- 742: {region: 0x112, script: 0x55, flags: 0x0},
- 743: {region: 0xa4, script: 0x55, flags: 0x0},
- 744: {region: 0x165, script: 0x55, flags: 0x0},
- 745: {region: 0x165, script: 0x55, flags: 0x0},
- 746: {region: 0x123, script: 0x5, flags: 0x0},
- 747: {region: 0xcc, script: 0x55, flags: 0x0},
- 748: {region: 0x165, script: 0x55, flags: 0x0},
- 749: {region: 0x165, script: 0x55, flags: 0x0},
- 750: {region: 0x165, script: 0x55, flags: 0x0},
- 751: {region: 0xbf, script: 0x55, flags: 0x0},
- 752: {region: 0xd1, script: 0x55, flags: 0x0},
- 753: {region: 0x165, script: 0x55, flags: 0x0},
- 754: {region: 0x52, script: 0x55, flags: 0x0},
- 755: {region: 0xdb, script: 0x20, flags: 0x0},
- 756: {region: 0x12f, script: 0x55, flags: 0x0},
- 757: {region: 0xc0, script: 0x55, flags: 0x0},
- 758: {region: 0x165, script: 0x55, flags: 0x0},
- 759: {region: 0x165, script: 0x55, flags: 0x0},
- 760: {region: 0xe0, script: 0x55, flags: 0x0},
- 761: {region: 0x165, script: 0x55, flags: 0x0},
- 762: {region: 0x95, script: 0x55, flags: 0x0},
- 763: {region: 0x9b, script: 0x39, flags: 0x0},
- 764: {region: 0x165, script: 0x55, flags: 0x0},
- 765: {region: 0xc2, script: 0x1e, flags: 0x0},
- 766: {region: 0x165, script: 0x5, flags: 0x0},
- 767: {region: 0x165, script: 0x55, flags: 0x0},
- 768: {region: 0x165, script: 0x55, flags: 0x0},
- 769: {region: 0x165, script: 0x55, flags: 0x0},
- 770: {region: 0x99, script: 0x69, flags: 0x0},
- 771: {region: 0x165, script: 0x55, flags: 0x0},
- 772: {region: 0x165, script: 0x55, flags: 0x0},
- 773: {region: 0x10b, script: 0x55, flags: 0x0},
- 774: {region: 0x165, script: 0x55, flags: 0x0},
- 775: {region: 0x165, script: 0x55, flags: 0x0},
- 776: {region: 0x165, script: 0x55, flags: 0x0},
- 777: {region: 0x26, script: 0x3, flags: 0x1},
- 778: {region: 0x165, script: 0x55, flags: 0x0},
- 779: {region: 0x165, script: 0x55, flags: 0x0},
- 780: {region: 0x99, script: 0xe, flags: 0x0},
- 781: {region: 0xc4, script: 0x70, flags: 0x0},
- 783: {region: 0x165, script: 0x55, flags: 0x0},
- 784: {region: 0x49, script: 0x55, flags: 0x0},
- 785: {region: 0x49, script: 0x55, flags: 0x0},
- 786: {region: 0x37, script: 0x55, flags: 0x0},
- 787: {region: 0x165, script: 0x55, flags: 0x0},
- 788: {region: 0x165, script: 0x55, flags: 0x0},
- 789: {region: 0x165, script: 0x55, flags: 0x0},
- 790: {region: 0x165, script: 0x55, flags: 0x0},
- 791: {region: 0x165, script: 0x55, flags: 0x0},
- 792: {region: 0x165, script: 0x55, flags: 0x0},
- 793: {region: 0x99, script: 0x20, flags: 0x0},
- 794: {region: 0xdb, script: 0x20, flags: 0x0},
- 795: {region: 0x106, script: 0x1e, flags: 0x0},
- 796: {region: 0x35, script: 0x6d, flags: 0x0},
- 797: {region: 0x29, script: 0x3, flags: 0x1},
- 798: {region: 0xcb, script: 0x55, flags: 0x0},
- 799: {region: 0x165, script: 0x55, flags: 0x0},
- 800: {region: 0x165, script: 0x55, flags: 0x0},
- 801: {region: 0x165, script: 0x55, flags: 0x0},
- 802: {region: 0x99, script: 0x20, flags: 0x0},
- 803: {region: 0x52, script: 0x55, flags: 0x0},
- 805: {region: 0x165, script: 0x55, flags: 0x0},
- 806: {region: 0x135, script: 0x55, flags: 0x0},
- 807: {region: 0x165, script: 0x55, flags: 0x0},
- 808: {region: 0x165, script: 0x55, flags: 0x0},
- 809: {region: 0xe8, script: 0x5, flags: 0x0},
- 810: {region: 0xc3, script: 0x55, flags: 0x0},
- 811: {region: 0x99, script: 0x20, flags: 0x0},
- 812: {region: 0x95, script: 0x55, flags: 0x0},
- 813: {region: 0x164, script: 0x55, flags: 0x0},
- 814: {region: 0x165, script: 0x55, flags: 0x0},
- 815: {region: 0xc4, script: 0x70, flags: 0x0},
- 816: {region: 0x165, script: 0x55, flags: 0x0},
- 817: {region: 0x165, script: 0x28, flags: 0x0},
- 818: {region: 0x106, script: 0x1e, flags: 0x0},
- 819: {region: 0x165, script: 0x55, flags: 0x0},
- 820: {region: 0x131, script: 0x55, flags: 0x0},
- 821: {region: 0x9c, script: 0x61, flags: 0x0},
- 822: {region: 0x165, script: 0x55, flags: 0x0},
- 823: {region: 0x165, script: 0x55, flags: 0x0},
- 824: {region: 0x9c, script: 0x5, flags: 0x0},
- 825: {region: 0x165, script: 0x55, flags: 0x0},
- 826: {region: 0x165, script: 0x55, flags: 0x0},
- 827: {region: 0x165, script: 0x55, flags: 0x0},
- 828: {region: 0xdd, script: 0x55, flags: 0x0},
- 829: {region: 0x165, script: 0x55, flags: 0x0},
- 830: {region: 0x165, script: 0x55, flags: 0x0},
- 832: {region: 0x165, script: 0x55, flags: 0x0},
- 833: {region: 0x53, script: 0x37, flags: 0x0},
- 834: {region: 0x9e, script: 0x55, flags: 0x0},
- 835: {region: 0xd2, script: 0x55, flags: 0x0},
- 836: {region: 0x165, script: 0x55, flags: 0x0},
- 837: {region: 0xda, script: 0x55, flags: 0x0},
- 838: {region: 0x165, script: 0x55, flags: 0x0},
- 839: {region: 0x165, script: 0x55, flags: 0x0},
- 840: {region: 0x165, script: 0x55, flags: 0x0},
- 841: {region: 0xcf, script: 0x55, flags: 0x0},
- 842: {region: 0x165, script: 0x55, flags: 0x0},
- 843: {region: 0x165, script: 0x55, flags: 0x0},
- 844: {region: 0x164, script: 0x55, flags: 0x0},
- 845: {region: 0xd1, script: 0x55, flags: 0x0},
- 846: {region: 0x60, script: 0x55, flags: 0x0},
- 847: {region: 0xdb, script: 0x20, flags: 0x0},
- 848: {region: 0x165, script: 0x55, flags: 0x0},
- 849: {region: 0xdb, script: 0x20, flags: 0x0},
- 850: {region: 0x165, script: 0x55, flags: 0x0},
- 851: {region: 0x165, script: 0x55, flags: 0x0},
- 852: {region: 0xd2, script: 0x55, flags: 0x0},
- 853: {region: 0x165, script: 0x55, flags: 0x0},
- 854: {region: 0x165, script: 0x55, flags: 0x0},
- 855: {region: 0xd1, script: 0x55, flags: 0x0},
- 856: {region: 0x165, script: 0x55, flags: 0x0},
- 857: {region: 0xcf, script: 0x55, flags: 0x0},
- 858: {region: 0xcf, script: 0x55, flags: 0x0},
- 859: {region: 0x165, script: 0x55, flags: 0x0},
- 860: {region: 0x165, script: 0x55, flags: 0x0},
- 861: {region: 0x95, script: 0x55, flags: 0x0},
- 862: {region: 0x165, script: 0x55, flags: 0x0},
- 863: {region: 0xdf, script: 0x55, flags: 0x0},
- 864: {region: 0x165, script: 0x55, flags: 0x0},
- 865: {region: 0x165, script: 0x55, flags: 0x0},
- 866: {region: 0x99, script: 0x55, flags: 0x0},
- 867: {region: 0x165, script: 0x55, flags: 0x0},
- 868: {region: 0x165, script: 0x55, flags: 0x0},
- 869: {region: 0xd9, script: 0x55, flags: 0x0},
- 870: {region: 0x52, script: 0x55, flags: 0x0},
- 871: {region: 0x165, script: 0x55, flags: 0x0},
- 872: {region: 0xda, script: 0x55, flags: 0x0},
- 873: {region: 0x165, script: 0x55, flags: 0x0},
- 874: {region: 0x52, script: 0x55, flags: 0x0},
- 875: {region: 0x165, script: 0x55, flags: 0x0},
- 876: {region: 0x165, script: 0x55, flags: 0x0},
- 877: {region: 0xda, script: 0x55, flags: 0x0},
- 878: {region: 0x123, script: 0x51, flags: 0x0},
- 879: {region: 0x99, script: 0x20, flags: 0x0},
- 880: {region: 0x10c, script: 0xbc, flags: 0x0},
- 881: {region: 0x165, script: 0x55, flags: 0x0},
- 882: {region: 0x165, script: 0x55, flags: 0x0},
- 883: {region: 0x84, script: 0x75, flags: 0x0},
- 884: {region: 0x161, script: 0x55, flags: 0x0},
- 885: {region: 0x165, script: 0x55, flags: 0x0},
- 886: {region: 0x49, script: 0x17, flags: 0x0},
- 887: {region: 0x165, script: 0x55, flags: 0x0},
- 888: {region: 0x161, script: 0x55, flags: 0x0},
- 889: {region: 0x165, script: 0x55, flags: 0x0},
- 890: {region: 0x165, script: 0x55, flags: 0x0},
- 891: {region: 0x165, script: 0x55, flags: 0x0},
- 892: {region: 0x165, script: 0x55, flags: 0x0},
- 893: {region: 0x165, script: 0x55, flags: 0x0},
- 894: {region: 0x117, script: 0x55, flags: 0x0},
- 895: {region: 0x165, script: 0x55, flags: 0x0},
- 896: {region: 0x165, script: 0x55, flags: 0x0},
- 897: {region: 0x135, script: 0x55, flags: 0x0},
- 898: {region: 0x165, script: 0x55, flags: 0x0},
- 899: {region: 0x53, script: 0x55, flags: 0x0},
- 900: {region: 0x165, script: 0x55, flags: 0x0},
- 901: {region: 0xce, script: 0x55, flags: 0x0},
- 902: {region: 0x12f, script: 0x55, flags: 0x0},
- 903: {region: 0x131, script: 0x55, flags: 0x0},
- 904: {region: 0x80, script: 0x55, flags: 0x0},
- 905: {region: 0x78, script: 0x55, flags: 0x0},
- 906: {region: 0x165, script: 0x55, flags: 0x0},
- 908: {region: 0x165, script: 0x55, flags: 0x0},
- 909: {region: 0x165, script: 0x55, flags: 0x0},
- 910: {region: 0x6f, script: 0x55, flags: 0x0},
- 911: {region: 0x165, script: 0x55, flags: 0x0},
- 912: {region: 0x165, script: 0x55, flags: 0x0},
- 913: {region: 0x165, script: 0x55, flags: 0x0},
- 914: {region: 0x165, script: 0x55, flags: 0x0},
- 915: {region: 0x99, script: 0x7a, flags: 0x0},
- 916: {region: 0x165, script: 0x55, flags: 0x0},
- 917: {region: 0x165, script: 0x5, flags: 0x0},
- 918: {region: 0x7d, script: 0x1e, flags: 0x0},
- 919: {region: 0x135, script: 0x7b, flags: 0x0},
- 920: {region: 0x165, script: 0x5, flags: 0x0},
- 921: {region: 0xc5, script: 0x79, flags: 0x0},
- 922: {region: 0x165, script: 0x55, flags: 0x0},
- 923: {region: 0x2c, script: 0x3, flags: 0x1},
- 924: {region: 0xe7, script: 0x55, flags: 0x0},
- 925: {region: 0x2f, script: 0x2, flags: 0x1},
- 926: {region: 0xe7, script: 0x55, flags: 0x0},
- 927: {region: 0x30, script: 0x55, flags: 0x0},
- 928: {region: 0xf0, script: 0x55, flags: 0x0},
- 929: {region: 0x165, script: 0x55, flags: 0x0},
- 930: {region: 0x78, script: 0x55, flags: 0x0},
- 931: {region: 0xd6, script: 0x55, flags: 0x0},
- 932: {region: 0x135, script: 0x55, flags: 0x0},
- 933: {region: 0x49, script: 0x55, flags: 0x0},
- 934: {region: 0x165, script: 0x55, flags: 0x0},
- 935: {region: 0x9c, script: 0xe3, flags: 0x0},
- 936: {region: 0x165, script: 0x55, flags: 0x0},
- 937: {region: 0x60, script: 0x55, flags: 0x0},
- 938: {region: 0x165, script: 0x5, flags: 0x0},
- 939: {region: 0xb0, script: 0x84, flags: 0x0},
- 941: {region: 0x165, script: 0x55, flags: 0x0},
- 942: {region: 0x165, script: 0x55, flags: 0x0},
- 943: {region: 0x99, script: 0x12, flags: 0x0},
- 944: {region: 0xa4, script: 0x55, flags: 0x0},
- 945: {region: 0xe9, script: 0x55, flags: 0x0},
- 946: {region: 0x165, script: 0x55, flags: 0x0},
- 947: {region: 0x9e, script: 0x55, flags: 0x0},
- 948: {region: 0x165, script: 0x55, flags: 0x0},
- 949: {region: 0x165, script: 0x55, flags: 0x0},
- 950: {region: 0x87, script: 0x30, flags: 0x0},
- 951: {region: 0x75, script: 0x55, flags: 0x0},
- 952: {region: 0x165, script: 0x55, flags: 0x0},
- 953: {region: 0xe8, script: 0x48, flags: 0x0},
- 954: {region: 0x9c, script: 0x5, flags: 0x0},
- 955: {region: 0x1, script: 0x55, flags: 0x0},
- 956: {region: 0x24, script: 0x5, flags: 0x0},
- 957: {region: 0x165, script: 0x55, flags: 0x0},
- 958: {region: 0x41, script: 0x55, flags: 0x0},
- 959: {region: 0x165, script: 0x55, flags: 0x0},
- 960: {region: 0x7a, script: 0x55, flags: 0x0},
- 961: {region: 0x165, script: 0x55, flags: 0x0},
- 962: {region: 0xe4, script: 0x55, flags: 0x0},
- 963: {region: 0x89, script: 0x55, flags: 0x0},
- 964: {region: 0x69, script: 0x55, flags: 0x0},
- 965: {region: 0x165, script: 0x55, flags: 0x0},
- 966: {region: 0x99, script: 0x20, flags: 0x0},
- 967: {region: 0x165, script: 0x55, flags: 0x0},
- 968: {region: 0x102, script: 0x55, flags: 0x0},
- 969: {region: 0x95, script: 0x55, flags: 0x0},
- 970: {region: 0x165, script: 0x55, flags: 0x0},
- 971: {region: 0x165, script: 0x55, flags: 0x0},
- 972: {region: 0x9e, script: 0x55, flags: 0x0},
- 973: {region: 0x165, script: 0x5, flags: 0x0},
- 974: {region: 0x99, script: 0x55, flags: 0x0},
- 975: {region: 0x31, script: 0x2, flags: 0x1},
- 976: {region: 0xdb, script: 0x20, flags: 0x0},
- 977: {region: 0x35, script: 0xe, flags: 0x0},
- 978: {region: 0x4e, script: 0x55, flags: 0x0},
- 979: {region: 0x72, script: 0x55, flags: 0x0},
- 980: {region: 0x4e, script: 0x55, flags: 0x0},
- 981: {region: 0x9c, script: 0x5, flags: 0x0},
- 982: {region: 0x10c, script: 0x55, flags: 0x0},
- 983: {region: 0x3a, script: 0x55, flags: 0x0},
- 984: {region: 0x165, script: 0x55, flags: 0x0},
- 985: {region: 0xd1, script: 0x55, flags: 0x0},
- 986: {region: 0x104, script: 0x55, flags: 0x0},
- 987: {region: 0x95, script: 0x55, flags: 0x0},
- 988: {region: 0x12f, script: 0x55, flags: 0x0},
- 989: {region: 0x165, script: 0x55, flags: 0x0},
- 990: {region: 0x165, script: 0x55, flags: 0x0},
- 991: {region: 0x73, script: 0x55, flags: 0x0},
- 992: {region: 0x106, script: 0x1e, flags: 0x0},
- 993: {region: 0x130, script: 0x1e, flags: 0x0},
- 994: {region: 0x109, script: 0x55, flags: 0x0},
- 995: {region: 0x107, script: 0x55, flags: 0x0},
- 996: {region: 0x12f, script: 0x55, flags: 0x0},
- 997: {region: 0x165, script: 0x55, flags: 0x0},
- 998: {region: 0xa2, script: 0x47, flags: 0x0},
- 999: {region: 0x99, script: 0x20, flags: 0x0},
- 1000: {region: 0x80, script: 0x55, flags: 0x0},
- 1001: {region: 0x106, script: 0x1e, flags: 0x0},
- 1002: {region: 0xa4, script: 0x55, flags: 0x0},
- 1003: {region: 0x95, script: 0x55, flags: 0x0},
- 1004: {region: 0x99, script: 0x55, flags: 0x0},
- 1005: {region: 0x114, script: 0x55, flags: 0x0},
- 1006: {region: 0x99, script: 0xc0, flags: 0x0},
- 1007: {region: 0x165, script: 0x55, flags: 0x0},
- 1008: {region: 0x165, script: 0x55, flags: 0x0},
- 1009: {region: 0x12f, script: 0x55, flags: 0x0},
- 1010: {region: 0x9e, script: 0x55, flags: 0x0},
- 1011: {region: 0x99, script: 0x20, flags: 0x0},
- 1012: {region: 0x165, script: 0x5, flags: 0x0},
- 1013: {region: 0x9e, script: 0x55, flags: 0x0},
- 1014: {region: 0x7b, script: 0x55, flags: 0x0},
- 1015: {region: 0x49, script: 0x55, flags: 0x0},
- 1016: {region: 0x33, script: 0x4, flags: 0x1},
- 1017: {region: 0x9e, script: 0x55, flags: 0x0},
- 1018: {region: 0x9c, script: 0x5, flags: 0x0},
- 1019: {region: 0xda, script: 0x55, flags: 0x0},
- 1020: {region: 0x4f, script: 0x55, flags: 0x0},
- 1021: {region: 0xd1, script: 0x55, flags: 0x0},
- 1022: {region: 0xcf, script: 0x55, flags: 0x0},
- 1023: {region: 0xc3, script: 0x55, flags: 0x0},
- 1024: {region: 0x4c, script: 0x55, flags: 0x0},
- 1025: {region: 0x96, script: 0x77, flags: 0x0},
- 1026: {region: 0xb6, script: 0x55, flags: 0x0},
- 1027: {region: 0x165, script: 0x28, flags: 0x0},
- 1028: {region: 0x165, script: 0x55, flags: 0x0},
- 1030: {region: 0xba, script: 0xd8, flags: 0x0},
- 1031: {region: 0x165, script: 0x55, flags: 0x0},
- 1032: {region: 0xc4, script: 0x70, flags: 0x0},
- 1033: {region: 0x165, script: 0x5, flags: 0x0},
- 1034: {region: 0xb3, script: 0xc6, flags: 0x0},
- 1035: {region: 0x6f, script: 0x55, flags: 0x0},
- 1036: {region: 0x165, script: 0x55, flags: 0x0},
- 1037: {region: 0x165, script: 0x55, flags: 0x0},
- 1038: {region: 0x165, script: 0x55, flags: 0x0},
- 1039: {region: 0x165, script: 0x55, flags: 0x0},
- 1040: {region: 0x111, script: 0x55, flags: 0x0},
- 1041: {region: 0x165, script: 0x55, flags: 0x0},
- 1042: {region: 0xe8, script: 0x5, flags: 0x0},
- 1043: {region: 0x165, script: 0x55, flags: 0x0},
- 1044: {region: 0x10f, script: 0x55, flags: 0x0},
- 1045: {region: 0x165, script: 0x55, flags: 0x0},
- 1046: {region: 0xe9, script: 0x55, flags: 0x0},
- 1047: {region: 0x165, script: 0x55, flags: 0x0},
- 1048: {region: 0x95, script: 0x55, flags: 0x0},
- 1049: {region: 0x142, script: 0x55, flags: 0x0},
- 1050: {region: 0x10c, script: 0x55, flags: 0x0},
- 1052: {region: 0x10c, script: 0x55, flags: 0x0},
- 1053: {region: 0x72, script: 0x55, flags: 0x0},
- 1054: {region: 0x97, script: 0xbd, flags: 0x0},
- 1055: {region: 0x165, script: 0x55, flags: 0x0},
- 1056: {region: 0x72, script: 0x55, flags: 0x0},
- 1057: {region: 0x164, script: 0x55, flags: 0x0},
- 1058: {region: 0x165, script: 0x55, flags: 0x0},
- 1059: {region: 0xc3, script: 0x55, flags: 0x0},
- 1060: {region: 0x165, script: 0x55, flags: 0x0},
- 1061: {region: 0x165, script: 0x55, flags: 0x0},
- 1062: {region: 0x165, script: 0x55, flags: 0x0},
- 1063: {region: 0x115, script: 0x55, flags: 0x0},
- 1064: {region: 0x165, script: 0x55, flags: 0x0},
- 1065: {region: 0x165, script: 0x55, flags: 0x0},
- 1066: {region: 0x123, script: 0xdb, flags: 0x0},
- 1067: {region: 0x165, script: 0x55, flags: 0x0},
- 1068: {region: 0x165, script: 0x55, flags: 0x0},
- 1069: {region: 0x165, script: 0x55, flags: 0x0},
- 1070: {region: 0x165, script: 0x55, flags: 0x0},
- 1071: {region: 0x27, script: 0x55, flags: 0x0},
- 1072: {region: 0x37, script: 0x5, flags: 0x1},
- 1073: {region: 0x99, script: 0xc7, flags: 0x0},
- 1074: {region: 0x116, script: 0x55, flags: 0x0},
- 1075: {region: 0x114, script: 0x55, flags: 0x0},
- 1076: {region: 0x99, script: 0x20, flags: 0x0},
- 1077: {region: 0x161, script: 0x55, flags: 0x0},
- 1078: {region: 0x165, script: 0x55, flags: 0x0},
- 1079: {region: 0x165, script: 0x55, flags: 0x0},
- 1080: {region: 0x6d, script: 0x55, flags: 0x0},
- 1081: {region: 0x161, script: 0x55, flags: 0x0},
- 1082: {region: 0x165, script: 0x55, flags: 0x0},
- 1083: {region: 0x60, script: 0x55, flags: 0x0},
- 1084: {region: 0x95, script: 0x55, flags: 0x0},
- 1085: {region: 0x165, script: 0x55, flags: 0x0},
- 1086: {region: 0x165, script: 0x55, flags: 0x0},
- 1087: {region: 0x12f, script: 0x55, flags: 0x0},
- 1088: {region: 0x165, script: 0x55, flags: 0x0},
- 1089: {region: 0x84, script: 0x55, flags: 0x0},
- 1090: {region: 0x10c, script: 0x55, flags: 0x0},
- 1091: {region: 0x12f, script: 0x55, flags: 0x0},
- 1092: {region: 0x15f, script: 0x5, flags: 0x0},
- 1093: {region: 0x4b, script: 0x55, flags: 0x0},
- 1094: {region: 0x60, script: 0x55, flags: 0x0},
- 1095: {region: 0x165, script: 0x55, flags: 0x0},
- 1096: {region: 0x99, script: 0x20, flags: 0x0},
- 1097: {region: 0x95, script: 0x55, flags: 0x0},
- 1098: {region: 0x165, script: 0x55, flags: 0x0},
- 1099: {region: 0x35, script: 0xe, flags: 0x0},
- 1100: {region: 0x9b, script: 0xcb, flags: 0x0},
- 1101: {region: 0xe9, script: 0x55, flags: 0x0},
- 1102: {region: 0x99, script: 0xd3, flags: 0x0},
- 1103: {region: 0xdb, script: 0x20, flags: 0x0},
- 1104: {region: 0x165, script: 0x55, flags: 0x0},
- 1105: {region: 0x165, script: 0x55, flags: 0x0},
- 1106: {region: 0x165, script: 0x55, flags: 0x0},
- 1107: {region: 0x165, script: 0x55, flags: 0x0},
- 1108: {region: 0x165, script: 0x55, flags: 0x0},
- 1109: {region: 0x165, script: 0x55, flags: 0x0},
- 1110: {region: 0x165, script: 0x55, flags: 0x0},
- 1111: {region: 0x165, script: 0x55, flags: 0x0},
- 1112: {region: 0xe7, script: 0x55, flags: 0x0},
- 1113: {region: 0x165, script: 0x55, flags: 0x0},
- 1114: {region: 0x165, script: 0x55, flags: 0x0},
- 1115: {region: 0x99, script: 0x4d, flags: 0x0},
- 1116: {region: 0x53, script: 0xd1, flags: 0x0},
- 1117: {region: 0xdb, script: 0x20, flags: 0x0},
- 1118: {region: 0xdb, script: 0x20, flags: 0x0},
- 1119: {region: 0x99, script: 0xd6, flags: 0x0},
- 1120: {region: 0x165, script: 0x55, flags: 0x0},
- 1121: {region: 0x112, script: 0x55, flags: 0x0},
- 1122: {region: 0x131, script: 0x55, flags: 0x0},
- 1123: {region: 0x126, script: 0x55, flags: 0x0},
- 1124: {region: 0x165, script: 0x55, flags: 0x0},
- 1125: {region: 0x3c, script: 0x3, flags: 0x1},
- 1126: {region: 0x165, script: 0x55, flags: 0x0},
- 1127: {region: 0x165, script: 0x55, flags: 0x0},
- 1128: {region: 0x165, script: 0x55, flags: 0x0},
- 1129: {region: 0x123, script: 0xdb, flags: 0x0},
- 1130: {region: 0xdb, script: 0x20, flags: 0x0},
- 1131: {region: 0xdb, script: 0x20, flags: 0x0},
- 1132: {region: 0xdb, script: 0x20, flags: 0x0},
- 1133: {region: 0x6f, script: 0x28, flags: 0x0},
- 1134: {region: 0x165, script: 0x55, flags: 0x0},
- 1135: {region: 0x6d, script: 0x28, flags: 0x0},
- 1136: {region: 0x165, script: 0x55, flags: 0x0},
- 1137: {region: 0x165, script: 0x55, flags: 0x0},
- 1138: {region: 0x165, script: 0x55, flags: 0x0},
- 1139: {region: 0xd6, script: 0x55, flags: 0x0},
- 1140: {region: 0x127, script: 0x55, flags: 0x0},
- 1141: {region: 0x125, script: 0x55, flags: 0x0},
- 1142: {region: 0x32, script: 0x55, flags: 0x0},
- 1143: {region: 0xdb, script: 0x20, flags: 0x0},
- 1144: {region: 0xe7, script: 0x55, flags: 0x0},
- 1145: {region: 0x165, script: 0x55, flags: 0x0},
- 1146: {region: 0x165, script: 0x55, flags: 0x0},
- 1147: {region: 0x32, script: 0x55, flags: 0x0},
- 1148: {region: 0xd4, script: 0x55, flags: 0x0},
- 1149: {region: 0x165, script: 0x55, flags: 0x0},
- 1150: {region: 0x161, script: 0x55, flags: 0x0},
- 1151: {region: 0x165, script: 0x55, flags: 0x0},
- 1152: {region: 0x129, script: 0x55, flags: 0x0},
- 1153: {region: 0x165, script: 0x55, flags: 0x0},
- 1154: {region: 0xce, script: 0x55, flags: 0x0},
- 1155: {region: 0x165, script: 0x55, flags: 0x0},
- 1156: {region: 0xe6, script: 0x55, flags: 0x0},
- 1157: {region: 0x165, script: 0x55, flags: 0x0},
- 1158: {region: 0x165, script: 0x55, flags: 0x0},
- 1159: {region: 0x165, script: 0x55, flags: 0x0},
- 1160: {region: 0x12b, script: 0x55, flags: 0x0},
- 1161: {region: 0x12b, script: 0x55, flags: 0x0},
- 1162: {region: 0x12e, script: 0x55, flags: 0x0},
- 1163: {region: 0x165, script: 0x5, flags: 0x0},
- 1164: {region: 0x161, script: 0x55, flags: 0x0},
- 1165: {region: 0x87, script: 0x30, flags: 0x0},
- 1166: {region: 0xdb, script: 0x20, flags: 0x0},
- 1167: {region: 0xe7, script: 0x55, flags: 0x0},
- 1168: {region: 0x43, script: 0xdc, flags: 0x0},
- 1169: {region: 0x165, script: 0x55, flags: 0x0},
- 1170: {region: 0x106, script: 0x1e, flags: 0x0},
- 1171: {region: 0x165, script: 0x55, flags: 0x0},
- 1172: {region: 0x165, script: 0x55, flags: 0x0},
- 1173: {region: 0x131, script: 0x55, flags: 0x0},
- 1174: {region: 0x165, script: 0x55, flags: 0x0},
- 1175: {region: 0x123, script: 0xdb, flags: 0x0},
- 1176: {region: 0x32, script: 0x55, flags: 0x0},
- 1177: {region: 0x165, script: 0x55, flags: 0x0},
- 1178: {region: 0x165, script: 0x55, flags: 0x0},
- 1179: {region: 0xce, script: 0x55, flags: 0x0},
- 1180: {region: 0x165, script: 0x55, flags: 0x0},
- 1181: {region: 0x165, script: 0x55, flags: 0x0},
- 1182: {region: 0x12d, script: 0x55, flags: 0x0},
- 1183: {region: 0x165, script: 0x55, flags: 0x0},
- 1185: {region: 0x165, script: 0x55, flags: 0x0},
- 1186: {region: 0xd4, script: 0x55, flags: 0x0},
- 1187: {region: 0x53, script: 0xd4, flags: 0x0},
- 1188: {region: 0xe5, script: 0x55, flags: 0x0},
- 1189: {region: 0x165, script: 0x55, flags: 0x0},
- 1190: {region: 0x106, script: 0x1e, flags: 0x0},
- 1191: {region: 0xba, script: 0x55, flags: 0x0},
- 1192: {region: 0x165, script: 0x55, flags: 0x0},
- 1193: {region: 0x106, script: 0x1e, flags: 0x0},
- 1194: {region: 0x3f, script: 0x4, flags: 0x1},
- 1195: {region: 0x11c, script: 0xde, flags: 0x0},
- 1196: {region: 0x130, script: 0x1e, flags: 0x0},
- 1197: {region: 0x75, script: 0x55, flags: 0x0},
- 1198: {region: 0x2a, script: 0x55, flags: 0x0},
- 1200: {region: 0x43, script: 0x3, flags: 0x1},
- 1201: {region: 0x99, script: 0xe, flags: 0x0},
- 1202: {region: 0xe8, script: 0x5, flags: 0x0},
- 1203: {region: 0x165, script: 0x55, flags: 0x0},
- 1204: {region: 0x165, script: 0x55, flags: 0x0},
- 1205: {region: 0x165, script: 0x55, flags: 0x0},
- 1206: {region: 0x165, script: 0x55, flags: 0x0},
- 1207: {region: 0x165, script: 0x55, flags: 0x0},
- 1208: {region: 0x165, script: 0x55, flags: 0x0},
- 1209: {region: 0x165, script: 0x55, flags: 0x0},
- 1210: {region: 0x46, script: 0x4, flags: 0x1},
- 1211: {region: 0x165, script: 0x55, flags: 0x0},
- 1212: {region: 0xb4, script: 0xdf, flags: 0x0},
- 1213: {region: 0x165, script: 0x55, flags: 0x0},
- 1214: {region: 0x161, script: 0x55, flags: 0x0},
- 1215: {region: 0x9e, script: 0x55, flags: 0x0},
- 1216: {region: 0x106, script: 0x55, flags: 0x0},
- 1217: {region: 0x13e, script: 0x55, flags: 0x0},
- 1218: {region: 0x11b, script: 0x55, flags: 0x0},
- 1219: {region: 0x165, script: 0x55, flags: 0x0},
- 1220: {region: 0x36, script: 0x55, flags: 0x0},
- 1221: {region: 0x60, script: 0x55, flags: 0x0},
- 1222: {region: 0xd1, script: 0x55, flags: 0x0},
- 1223: {region: 0x1, script: 0x55, flags: 0x0},
- 1224: {region: 0x106, script: 0x55, flags: 0x0},
- 1225: {region: 0x6a, script: 0x55, flags: 0x0},
- 1226: {region: 0x12f, script: 0x55, flags: 0x0},
- 1227: {region: 0x165, script: 0x55, flags: 0x0},
- 1228: {region: 0x36, script: 0x55, flags: 0x0},
- 1229: {region: 0x4e, script: 0x55, flags: 0x0},
- 1230: {region: 0x165, script: 0x55, flags: 0x0},
- 1231: {region: 0x6f, script: 0x28, flags: 0x0},
- 1232: {region: 0x165, script: 0x55, flags: 0x0},
- 1233: {region: 0xe7, script: 0x55, flags: 0x0},
- 1234: {region: 0x2f, script: 0x55, flags: 0x0},
- 1235: {region: 0x99, script: 0xd6, flags: 0x0},
- 1236: {region: 0x99, script: 0x20, flags: 0x0},
- 1237: {region: 0x165, script: 0x55, flags: 0x0},
- 1238: {region: 0x165, script: 0x55, flags: 0x0},
- 1239: {region: 0x165, script: 0x55, flags: 0x0},
- 1240: {region: 0x165, script: 0x55, flags: 0x0},
- 1241: {region: 0x165, script: 0x55, flags: 0x0},
- 1242: {region: 0x165, script: 0x55, flags: 0x0},
- 1243: {region: 0x165, script: 0x55, flags: 0x0},
- 1244: {region: 0x165, script: 0x55, flags: 0x0},
- 1245: {region: 0x165, script: 0x55, flags: 0x0},
- 1246: {region: 0x140, script: 0x55, flags: 0x0},
- 1247: {region: 0x165, script: 0x55, flags: 0x0},
- 1248: {region: 0x165, script: 0x55, flags: 0x0},
- 1249: {region: 0xa8, script: 0x5, flags: 0x0},
- 1250: {region: 0x165, script: 0x55, flags: 0x0},
- 1251: {region: 0x114, script: 0x55, flags: 0x0},
- 1252: {region: 0x165, script: 0x55, flags: 0x0},
- 1253: {region: 0x165, script: 0x55, flags: 0x0},
- 1254: {region: 0x165, script: 0x55, flags: 0x0},
- 1255: {region: 0x165, script: 0x55, flags: 0x0},
- 1256: {region: 0x99, script: 0x20, flags: 0x0},
- 1257: {region: 0x53, script: 0x37, flags: 0x0},
- 1258: {region: 0x165, script: 0x55, flags: 0x0},
- 1259: {region: 0x165, script: 0x55, flags: 0x0},
- 1260: {region: 0x41, script: 0x55, flags: 0x0},
- 1261: {region: 0x165, script: 0x55, flags: 0x0},
- 1262: {region: 0x12b, script: 0x18, flags: 0x0},
- 1263: {region: 0x165, script: 0x55, flags: 0x0},
- 1264: {region: 0x161, script: 0x55, flags: 0x0},
- 1265: {region: 0x165, script: 0x55, flags: 0x0},
- 1266: {region: 0x12b, script: 0x5d, flags: 0x0},
- 1267: {region: 0x12b, script: 0x5e, flags: 0x0},
- 1268: {region: 0x7d, script: 0x2a, flags: 0x0},
- 1269: {region: 0x53, script: 0x62, flags: 0x0},
- 1270: {region: 0x10b, script: 0x67, flags: 0x0},
- 1271: {region: 0x108, script: 0x71, flags: 0x0},
- 1272: {region: 0x99, script: 0x20, flags: 0x0},
- 1273: {region: 0x131, script: 0x55, flags: 0x0},
- 1274: {region: 0x165, script: 0x55, flags: 0x0},
- 1275: {region: 0x9c, script: 0x87, flags: 0x0},
- 1276: {region: 0x165, script: 0x55, flags: 0x0},
- 1277: {region: 0x15e, script: 0xbf, flags: 0x0},
- 1278: {region: 0x165, script: 0x55, flags: 0x0},
- 1279: {region: 0x165, script: 0x55, flags: 0x0},
- 1280: {region: 0xdb, script: 0x20, flags: 0x0},
- 1281: {region: 0x165, script: 0x55, flags: 0x0},
- 1282: {region: 0x165, script: 0x55, flags: 0x0},
- 1283: {region: 0xd1, script: 0x55, flags: 0x0},
- 1284: {region: 0x75, script: 0x55, flags: 0x0},
- 1285: {region: 0x165, script: 0x55, flags: 0x0},
- 1286: {region: 0x165, script: 0x55, flags: 0x0},
- 1287: {region: 0x52, script: 0x55, flags: 0x0},
- 1288: {region: 0x165, script: 0x55, flags: 0x0},
- 1289: {region: 0x165, script: 0x55, flags: 0x0},
- 1290: {region: 0x165, script: 0x55, flags: 0x0},
- 1291: {region: 0x52, script: 0x55, flags: 0x0},
- 1292: {region: 0x165, script: 0x55, flags: 0x0},
- 1293: {region: 0x165, script: 0x55, flags: 0x0},
- 1294: {region: 0x165, script: 0x55, flags: 0x0},
- 1295: {region: 0x165, script: 0x55, flags: 0x0},
- 1296: {region: 0x1, script: 0x3a, flags: 0x0},
- 1297: {region: 0x165, script: 0x55, flags: 0x0},
- 1298: {region: 0x165, script: 0x55, flags: 0x0},
- 1299: {region: 0x165, script: 0x55, flags: 0x0},
- 1300: {region: 0x165, script: 0x55, flags: 0x0},
- 1301: {region: 0x165, script: 0x55, flags: 0x0},
- 1302: {region: 0xd6, script: 0x55, flags: 0x0},
- 1303: {region: 0x165, script: 0x55, flags: 0x0},
- 1304: {region: 0x165, script: 0x55, flags: 0x0},
- 1305: {region: 0x165, script: 0x55, flags: 0x0},
- 1306: {region: 0x41, script: 0x55, flags: 0x0},
- 1307: {region: 0x165, script: 0x55, flags: 0x0},
- 1308: {region: 0xcf, script: 0x55, flags: 0x0},
- 1309: {region: 0x4a, script: 0x3, flags: 0x1},
- 1310: {region: 0x165, script: 0x55, flags: 0x0},
- 1311: {region: 0x165, script: 0x55, flags: 0x0},
- 1312: {region: 0x165, script: 0x55, flags: 0x0},
- 1313: {region: 0x53, script: 0x55, flags: 0x0},
- 1314: {region: 0x10b, script: 0x55, flags: 0x0},
- 1316: {region: 0xa8, script: 0x5, flags: 0x0},
- 1317: {region: 0xd9, script: 0x55, flags: 0x0},
- 1318: {region: 0xba, script: 0xd8, flags: 0x0},
- 1319: {region: 0x4d, script: 0x14, flags: 0x1},
- 1320: {region: 0x165, script: 0x55, flags: 0x0},
- 1321: {region: 0x122, script: 0x55, flags: 0x0},
- 1322: {region: 0xd0, script: 0x55, flags: 0x0},
- 1323: {region: 0x165, script: 0x55, flags: 0x0},
- 1324: {region: 0x161, script: 0x55, flags: 0x0},
- 1326: {region: 0x12b, script: 0x55, flags: 0x0},
+ 433: {region: 0x49, script: 0x57, flags: 0x0},
+ 434: {region: 0x165, script: 0x5, flags: 0x0},
+ 435: {region: 0x165, script: 0x57, flags: 0x0},
+ 436: {region: 0x10, script: 0x3, flags: 0x1},
+ 437: {region: 0x165, script: 0x57, flags: 0x0},
+ 438: {region: 0x53, script: 0x38, flags: 0x0},
+ 439: {region: 0x165, script: 0x57, flags: 0x0},
+ 440: {region: 0x135, script: 0x57, flags: 0x0},
+ 441: {region: 0x24, script: 0x5, flags: 0x0},
+ 442: {region: 0x165, script: 0x57, flags: 0x0},
+ 443: {region: 0x165, script: 0x29, flags: 0x0},
+ 444: {region: 0x97, script: 0x3b, flags: 0x0},
+ 445: {region: 0x165, script: 0x57, flags: 0x0},
+ 446: {region: 0x99, script: 0x21, flags: 0x0},
+ 447: {region: 0x165, script: 0x57, flags: 0x0},
+ 448: {region: 0x73, script: 0x57, flags: 0x0},
+ 449: {region: 0x165, script: 0x57, flags: 0x0},
+ 450: {region: 0x165, script: 0x57, flags: 0x0},
+ 451: {region: 0xe7, script: 0x57, flags: 0x0},
+ 452: {region: 0x165, script: 0x57, flags: 0x0},
+ 453: {region: 0x12b, script: 0x3d, flags: 0x0},
+ 454: {region: 0x53, script: 0x89, flags: 0x0},
+ 455: {region: 0x165, script: 0x57, flags: 0x0},
+ 456: {region: 0xe8, script: 0x5, flags: 0x0},
+ 457: {region: 0x99, script: 0x21, flags: 0x0},
+ 458: {region: 0xaf, script: 0x3e, flags: 0x0},
+ 459: {region: 0xe7, script: 0x57, flags: 0x0},
+ 460: {region: 0xe8, script: 0x5, flags: 0x0},
+ 461: {region: 0xe6, script: 0x57, flags: 0x0},
+ 462: {region: 0x99, script: 0x21, flags: 0x0},
+ 463: {region: 0x99, script: 0x21, flags: 0x0},
+ 464: {region: 0x165, script: 0x57, flags: 0x0},
+ 465: {region: 0x90, script: 0x57, flags: 0x0},
+ 466: {region: 0x60, script: 0x57, flags: 0x0},
+ 467: {region: 0x53, script: 0x38, flags: 0x0},
+ 468: {region: 0x91, script: 0x57, flags: 0x0},
+ 469: {region: 0x92, script: 0x57, flags: 0x0},
+ 470: {region: 0x165, script: 0x57, flags: 0x0},
+ 471: {region: 0x28, script: 0x8, flags: 0x0},
+ 472: {region: 0xd2, script: 0x57, flags: 0x0},
+ 473: {region: 0x78, script: 0x57, flags: 0x0},
+ 474: {region: 0x165, script: 0x57, flags: 0x0},
+ 475: {region: 0x165, script: 0x57, flags: 0x0},
+ 476: {region: 0xd0, script: 0x57, flags: 0x0},
+ 477: {region: 0xd6, script: 0x57, flags: 0x0},
+ 478: {region: 0x165, script: 0x57, flags: 0x0},
+ 479: {region: 0x165, script: 0x57, flags: 0x0},
+ 480: {region: 0x165, script: 0x57, flags: 0x0},
+ 481: {region: 0x95, script: 0x57, flags: 0x0},
+ 482: {region: 0x165, script: 0x57, flags: 0x0},
+ 483: {region: 0x165, script: 0x57, flags: 0x0},
+ 484: {region: 0x165, script: 0x57, flags: 0x0},
+ 486: {region: 0x122, script: 0x57, flags: 0x0},
+ 487: {region: 0xd6, script: 0x57, flags: 0x0},
+ 488: {region: 0x165, script: 0x57, flags: 0x0},
+ 489: {region: 0x165, script: 0x57, flags: 0x0},
+ 490: {region: 0x53, script: 0xea, flags: 0x0},
+ 491: {region: 0x165, script: 0x57, flags: 0x0},
+ 492: {region: 0x135, script: 0x57, flags: 0x0},
+ 493: {region: 0x165, script: 0x57, flags: 0x0},
+ 494: {region: 0x49, script: 0x57, flags: 0x0},
+ 495: {region: 0x165, script: 0x57, flags: 0x0},
+ 496: {region: 0x165, script: 0x57, flags: 0x0},
+ 497: {region: 0xe7, script: 0x57, flags: 0x0},
+ 498: {region: 0x165, script: 0x57, flags: 0x0},
+ 499: {region: 0x95, script: 0x57, flags: 0x0},
+ 500: {region: 0x106, script: 0x1f, flags: 0x0},
+ 501: {region: 0x1, script: 0x57, flags: 0x0},
+ 502: {region: 0x165, script: 0x57, flags: 0x0},
+ 503: {region: 0x165, script: 0x57, flags: 0x0},
+ 504: {region: 0x9d, script: 0x57, flags: 0x0},
+ 505: {region: 0x9e, script: 0x57, flags: 0x0},
+ 506: {region: 0x49, script: 0x17, flags: 0x0},
+ 507: {region: 0x97, script: 0x3b, flags: 0x0},
+ 508: {region: 0x165, script: 0x57, flags: 0x0},
+ 509: {region: 0x165, script: 0x57, flags: 0x0},
+ 510: {region: 0x106, script: 0x57, flags: 0x0},
+ 511: {region: 0x165, script: 0x57, flags: 0x0},
+ 512: {region: 0xa2, script: 0x46, flags: 0x0},
+ 513: {region: 0x165, script: 0x57, flags: 0x0},
+ 514: {region: 0xa0, script: 0x57, flags: 0x0},
+ 515: {region: 0x1, script: 0x57, flags: 0x0},
+ 516: {region: 0x165, script: 0x57, flags: 0x0},
+ 517: {region: 0x165, script: 0x57, flags: 0x0},
+ 518: {region: 0x165, script: 0x57, flags: 0x0},
+ 519: {region: 0x52, script: 0x57, flags: 0x0},
+ 520: {region: 0x130, script: 0x3b, flags: 0x0},
+ 521: {region: 0x165, script: 0x57, flags: 0x0},
+ 522: {region: 0x12f, script: 0x57, flags: 0x0},
+ 523: {region: 0xdb, script: 0x21, flags: 0x0},
+ 524: {region: 0x165, script: 0x57, flags: 0x0},
+ 525: {region: 0x63, script: 0x57, flags: 0x0},
+ 526: {region: 0x95, script: 0x57, flags: 0x0},
+ 527: {region: 0x95, script: 0x57, flags: 0x0},
+ 528: {region: 0x7d, script: 0x2b, flags: 0x0},
+ 529: {region: 0x137, script: 0x1f, flags: 0x0},
+ 530: {region: 0x67, script: 0x57, flags: 0x0},
+ 531: {region: 0xc4, script: 0x57, flags: 0x0},
+ 532: {region: 0x165, script: 0x57, flags: 0x0},
+ 533: {region: 0x165, script: 0x57, flags: 0x0},
+ 534: {region: 0xd6, script: 0x57, flags: 0x0},
+ 535: {region: 0xa4, script: 0x57, flags: 0x0},
+ 536: {region: 0xc3, script: 0x57, flags: 0x0},
+ 537: {region: 0x106, script: 0x1f, flags: 0x0},
+ 538: {region: 0x165, script: 0x57, flags: 0x0},
+ 539: {region: 0x165, script: 0x57, flags: 0x0},
+ 540: {region: 0x165, script: 0x57, flags: 0x0},
+ 541: {region: 0x165, script: 0x57, flags: 0x0},
+ 542: {region: 0xd4, script: 0x5, flags: 0x0},
+ 543: {region: 0xd6, script: 0x57, flags: 0x0},
+ 544: {region: 0x164, script: 0x57, flags: 0x0},
+ 545: {region: 0x165, script: 0x57, flags: 0x0},
+ 546: {region: 0x165, script: 0x57, flags: 0x0},
+ 547: {region: 0x12f, script: 0x57, flags: 0x0},
+ 548: {region: 0x122, script: 0x5, flags: 0x0},
+ 549: {region: 0x165, script: 0x57, flags: 0x0},
+ 550: {region: 0x123, script: 0xdf, flags: 0x0},
+ 551: {region: 0x5a, script: 0x57, flags: 0x0},
+ 552: {region: 0x52, script: 0x57, flags: 0x0},
+ 553: {region: 0x165, script: 0x57, flags: 0x0},
+ 554: {region: 0x4f, script: 0x57, flags: 0x0},
+ 555: {region: 0x99, script: 0x21, flags: 0x0},
+ 556: {region: 0x99, script: 0x21, flags: 0x0},
+ 557: {region: 0x4b, script: 0x57, flags: 0x0},
+ 558: {region: 0x95, script: 0x57, flags: 0x0},
+ 559: {region: 0x165, script: 0x57, flags: 0x0},
+ 560: {region: 0x41, script: 0x57, flags: 0x0},
+ 561: {region: 0x99, script: 0x57, flags: 0x0},
+ 562: {region: 0x53, script: 0xd6, flags: 0x0},
+ 563: {region: 0x99, script: 0x21, flags: 0x0},
+ 564: {region: 0xc3, script: 0x57, flags: 0x0},
+ 565: {region: 0x165, script: 0x57, flags: 0x0},
+ 566: {region: 0x99, script: 0x72, flags: 0x0},
+ 567: {region: 0xe8, script: 0x5, flags: 0x0},
+ 568: {region: 0x165, script: 0x57, flags: 0x0},
+ 569: {region: 0xa4, script: 0x57, flags: 0x0},
+ 570: {region: 0x165, script: 0x57, flags: 0x0},
+ 571: {region: 0x12b, script: 0x57, flags: 0x0},
+ 572: {region: 0x165, script: 0x57, flags: 0x0},
+ 573: {region: 0xd2, script: 0x57, flags: 0x0},
+ 574: {region: 0x165, script: 0x57, flags: 0x0},
+ 575: {region: 0xaf, script: 0x54, flags: 0x0},
+ 576: {region: 0x165, script: 0x57, flags: 0x0},
+ 577: {region: 0x165, script: 0x57, flags: 0x0},
+ 578: {region: 0x13, script: 0x6, flags: 0x1},
+ 579: {region: 0x165, script: 0x57, flags: 0x0},
+ 580: {region: 0x52, script: 0x57, flags: 0x0},
+ 581: {region: 0x82, script: 0x57, flags: 0x0},
+ 582: {region: 0xa4, script: 0x57, flags: 0x0},
+ 583: {region: 0x165, script: 0x57, flags: 0x0},
+ 584: {region: 0x165, script: 0x57, flags: 0x0},
+ 585: {region: 0x165, script: 0x57, flags: 0x0},
+ 586: {region: 0xa6, script: 0x4b, flags: 0x0},
+ 587: {region: 0x2a, script: 0x57, flags: 0x0},
+ 588: {region: 0x165, script: 0x57, flags: 0x0},
+ 589: {region: 0x165, script: 0x57, flags: 0x0},
+ 590: {region: 0x165, script: 0x57, flags: 0x0},
+ 591: {region: 0x165, script: 0x57, flags: 0x0},
+ 592: {region: 0x165, script: 0x57, flags: 0x0},
+ 593: {region: 0x99, script: 0x4f, flags: 0x0},
+ 594: {region: 0x8b, script: 0x57, flags: 0x0},
+ 595: {region: 0x165, script: 0x57, flags: 0x0},
+ 596: {region: 0xab, script: 0x50, flags: 0x0},
+ 597: {region: 0x106, script: 0x1f, flags: 0x0},
+ 598: {region: 0x99, script: 0x21, flags: 0x0},
+ 599: {region: 0x165, script: 0x57, flags: 0x0},
+ 600: {region: 0x75, script: 0x57, flags: 0x0},
+ 601: {region: 0x165, script: 0x57, flags: 0x0},
+ 602: {region: 0xb4, script: 0x57, flags: 0x0},
+ 603: {region: 0x165, script: 0x57, flags: 0x0},
+ 604: {region: 0x165, script: 0x57, flags: 0x0},
+ 605: {region: 0x165, script: 0x57, flags: 0x0},
+ 606: {region: 0x165, script: 0x57, flags: 0x0},
+ 607: {region: 0x165, script: 0x57, flags: 0x0},
+ 608: {region: 0x165, script: 0x57, flags: 0x0},
+ 609: {region: 0x165, script: 0x57, flags: 0x0},
+ 610: {region: 0x165, script: 0x29, flags: 0x0},
+ 611: {region: 0x165, script: 0x57, flags: 0x0},
+ 612: {region: 0x106, script: 0x1f, flags: 0x0},
+ 613: {region: 0x112, script: 0x57, flags: 0x0},
+ 614: {region: 0xe7, script: 0x57, flags: 0x0},
+ 615: {region: 0x106, script: 0x57, flags: 0x0},
+ 616: {region: 0x165, script: 0x57, flags: 0x0},
+ 617: {region: 0x99, script: 0x21, flags: 0x0},
+ 618: {region: 0x99, script: 0x5, flags: 0x0},
+ 619: {region: 0x12f, script: 0x57, flags: 0x0},
+ 620: {region: 0x165, script: 0x57, flags: 0x0},
+ 621: {region: 0x52, script: 0x57, flags: 0x0},
+ 622: {region: 0x60, script: 0x57, flags: 0x0},
+ 623: {region: 0x165, script: 0x57, flags: 0x0},
+ 624: {region: 0x165, script: 0x57, flags: 0x0},
+ 625: {region: 0x165, script: 0x29, flags: 0x0},
+ 626: {region: 0x165, script: 0x57, flags: 0x0},
+ 627: {region: 0x165, script: 0x57, flags: 0x0},
+ 628: {region: 0x19, script: 0x3, flags: 0x1},
+ 629: {region: 0x165, script: 0x57, flags: 0x0},
+ 630: {region: 0x165, script: 0x57, flags: 0x0},
+ 631: {region: 0x165, script: 0x57, flags: 0x0},
+ 632: {region: 0x165, script: 0x57, flags: 0x0},
+ 633: {region: 0x106, script: 0x1f, flags: 0x0},
+ 634: {region: 0x165, script: 0x57, flags: 0x0},
+ 635: {region: 0x165, script: 0x57, flags: 0x0},
+ 636: {region: 0x165, script: 0x57, flags: 0x0},
+ 637: {region: 0x106, script: 0x1f, flags: 0x0},
+ 638: {region: 0x165, script: 0x57, flags: 0x0},
+ 639: {region: 0x95, script: 0x57, flags: 0x0},
+ 640: {region: 0xe8, script: 0x5, flags: 0x0},
+ 641: {region: 0x7b, script: 0x57, flags: 0x0},
+ 642: {region: 0x165, script: 0x57, flags: 0x0},
+ 643: {region: 0x165, script: 0x57, flags: 0x0},
+ 644: {region: 0x165, script: 0x57, flags: 0x0},
+ 645: {region: 0x165, script: 0x29, flags: 0x0},
+ 646: {region: 0x123, script: 0xdf, flags: 0x0},
+ 647: {region: 0xe8, script: 0x5, flags: 0x0},
+ 648: {region: 0x165, script: 0x57, flags: 0x0},
+ 649: {region: 0x165, script: 0x57, flags: 0x0},
+ 650: {region: 0x1c, script: 0x5, flags: 0x1},
+ 651: {region: 0x165, script: 0x57, flags: 0x0},
+ 652: {region: 0x165, script: 0x57, flags: 0x0},
+ 653: {region: 0x165, script: 0x57, flags: 0x0},
+ 654: {region: 0x138, script: 0x57, flags: 0x0},
+ 655: {region: 0x87, script: 0x5b, flags: 0x0},
+ 656: {region: 0x97, script: 0x3b, flags: 0x0},
+ 657: {region: 0x12f, script: 0x57, flags: 0x0},
+ 658: {region: 0xe8, script: 0x5, flags: 0x0},
+ 659: {region: 0x131, script: 0x57, flags: 0x0},
+ 660: {region: 0x165, script: 0x57, flags: 0x0},
+ 661: {region: 0xb7, script: 0x57, flags: 0x0},
+ 662: {region: 0x106, script: 0x1f, flags: 0x0},
+ 663: {region: 0x165, script: 0x57, flags: 0x0},
+ 664: {region: 0x95, script: 0x57, flags: 0x0},
+ 665: {region: 0x165, script: 0x57, flags: 0x0},
+ 666: {region: 0x53, script: 0xdf, flags: 0x0},
+ 667: {region: 0x165, script: 0x57, flags: 0x0},
+ 668: {region: 0x165, script: 0x57, flags: 0x0},
+ 669: {region: 0x165, script: 0x57, flags: 0x0},
+ 670: {region: 0x165, script: 0x57, flags: 0x0},
+ 671: {region: 0x99, script: 0x59, flags: 0x0},
+ 672: {region: 0x165, script: 0x57, flags: 0x0},
+ 673: {region: 0x165, script: 0x57, flags: 0x0},
+ 674: {region: 0x106, script: 0x1f, flags: 0x0},
+ 675: {region: 0x131, script: 0x57, flags: 0x0},
+ 676: {region: 0x165, script: 0x57, flags: 0x0},
+ 677: {region: 0xd9, script: 0x57, flags: 0x0},
+ 678: {region: 0x165, script: 0x57, flags: 0x0},
+ 679: {region: 0x165, script: 0x57, flags: 0x0},
+ 680: {region: 0x21, script: 0x2, flags: 0x1},
+ 681: {region: 0x165, script: 0x57, flags: 0x0},
+ 682: {region: 0x165, script: 0x57, flags: 0x0},
+ 683: {region: 0x9e, script: 0x57, flags: 0x0},
+ 684: {region: 0x53, script: 0x5d, flags: 0x0},
+ 685: {region: 0x95, script: 0x57, flags: 0x0},
+ 686: {region: 0x9c, script: 0x5, flags: 0x0},
+ 687: {region: 0x135, script: 0x57, flags: 0x0},
+ 688: {region: 0x165, script: 0x57, flags: 0x0},
+ 689: {region: 0x165, script: 0x57, flags: 0x0},
+ 690: {region: 0x99, script: 0xda, flags: 0x0},
+ 691: {region: 0x9e, script: 0x57, flags: 0x0},
+ 692: {region: 0x165, script: 0x57, flags: 0x0},
+ 693: {region: 0x4b, script: 0x57, flags: 0x0},
+ 694: {region: 0x165, script: 0x57, flags: 0x0},
+ 695: {region: 0x165, script: 0x57, flags: 0x0},
+ 696: {region: 0xaf, script: 0x54, flags: 0x0},
+ 697: {region: 0x165, script: 0x57, flags: 0x0},
+ 698: {region: 0x165, script: 0x57, flags: 0x0},
+ 699: {region: 0x4b, script: 0x57, flags: 0x0},
+ 700: {region: 0x165, script: 0x57, flags: 0x0},
+ 701: {region: 0x165, script: 0x57, flags: 0x0},
+ 702: {region: 0x162, script: 0x57, flags: 0x0},
+ 703: {region: 0x9c, script: 0x5, flags: 0x0},
+ 704: {region: 0xb6, script: 0x57, flags: 0x0},
+ 705: {region: 0xb8, script: 0x57, flags: 0x0},
+ 706: {region: 0x4b, script: 0x57, flags: 0x0},
+ 707: {region: 0x4b, script: 0x57, flags: 0x0},
+ 708: {region: 0xa4, script: 0x57, flags: 0x0},
+ 709: {region: 0xa4, script: 0x57, flags: 0x0},
+ 710: {region: 0x9c, script: 0x5, flags: 0x0},
+ 711: {region: 0xb8, script: 0x57, flags: 0x0},
+ 712: {region: 0x123, script: 0xdf, flags: 0x0},
+ 713: {region: 0x53, script: 0x38, flags: 0x0},
+ 714: {region: 0x12b, script: 0x57, flags: 0x0},
+ 715: {region: 0x95, script: 0x57, flags: 0x0},
+ 716: {region: 0x52, script: 0x57, flags: 0x0},
+ 717: {region: 0x99, script: 0x21, flags: 0x0},
+ 718: {region: 0x99, script: 0x21, flags: 0x0},
+ 719: {region: 0x95, script: 0x57, flags: 0x0},
+ 720: {region: 0x23, script: 0x3, flags: 0x1},
+ 721: {region: 0xa4, script: 0x57, flags: 0x0},
+ 722: {region: 0x165, script: 0x57, flags: 0x0},
+ 723: {region: 0xcf, script: 0x57, flags: 0x0},
+ 724: {region: 0x165, script: 0x57, flags: 0x0},
+ 725: {region: 0x165, script: 0x57, flags: 0x0},
+ 726: {region: 0x165, script: 0x57, flags: 0x0},
+ 727: {region: 0x165, script: 0x57, flags: 0x0},
+ 728: {region: 0x165, script: 0x57, flags: 0x0},
+ 729: {region: 0x165, script: 0x57, flags: 0x0},
+ 730: {region: 0x165, script: 0x57, flags: 0x0},
+ 731: {region: 0x165, script: 0x57, flags: 0x0},
+ 732: {region: 0x165, script: 0x57, flags: 0x0},
+ 733: {region: 0x165, script: 0x57, flags: 0x0},
+ 734: {region: 0x165, script: 0x57, flags: 0x0},
+ 735: {region: 0x165, script: 0x5, flags: 0x0},
+ 736: {region: 0x106, script: 0x1f, flags: 0x0},
+ 737: {region: 0xe7, script: 0x57, flags: 0x0},
+ 738: {region: 0x165, script: 0x57, flags: 0x0},
+ 739: {region: 0x95, script: 0x57, flags: 0x0},
+ 740: {region: 0x165, script: 0x29, flags: 0x0},
+ 741: {region: 0x165, script: 0x57, flags: 0x0},
+ 742: {region: 0x165, script: 0x57, flags: 0x0},
+ 743: {region: 0x165, script: 0x57, flags: 0x0},
+ 744: {region: 0x112, script: 0x57, flags: 0x0},
+ 745: {region: 0xa4, script: 0x57, flags: 0x0},
+ 746: {region: 0x165, script: 0x57, flags: 0x0},
+ 747: {region: 0x165, script: 0x57, flags: 0x0},
+ 748: {region: 0x123, script: 0x5, flags: 0x0},
+ 749: {region: 0xcc, script: 0x57, flags: 0x0},
+ 750: {region: 0x165, script: 0x57, flags: 0x0},
+ 751: {region: 0x165, script: 0x57, flags: 0x0},
+ 752: {region: 0x165, script: 0x57, flags: 0x0},
+ 753: {region: 0xbf, script: 0x57, flags: 0x0},
+ 754: {region: 0xd1, script: 0x57, flags: 0x0},
+ 755: {region: 0x165, script: 0x57, flags: 0x0},
+ 756: {region: 0x52, script: 0x57, flags: 0x0},
+ 757: {region: 0xdb, script: 0x21, flags: 0x0},
+ 758: {region: 0x12f, script: 0x57, flags: 0x0},
+ 759: {region: 0xc0, script: 0x57, flags: 0x0},
+ 760: {region: 0x165, script: 0x57, flags: 0x0},
+ 761: {region: 0x165, script: 0x57, flags: 0x0},
+ 762: {region: 0xe0, script: 0x57, flags: 0x0},
+ 763: {region: 0x165, script: 0x57, flags: 0x0},
+ 764: {region: 0x95, script: 0x57, flags: 0x0},
+ 765: {region: 0x9b, script: 0x3a, flags: 0x0},
+ 766: {region: 0x165, script: 0x57, flags: 0x0},
+ 767: {region: 0xc2, script: 0x1f, flags: 0x0},
+ 768: {region: 0x165, script: 0x5, flags: 0x0},
+ 769: {region: 0x165, script: 0x57, flags: 0x0},
+ 770: {region: 0x165, script: 0x57, flags: 0x0},
+ 771: {region: 0x165, script: 0x57, flags: 0x0},
+ 772: {region: 0x99, script: 0x6b, flags: 0x0},
+ 773: {region: 0x165, script: 0x57, flags: 0x0},
+ 774: {region: 0x165, script: 0x57, flags: 0x0},
+ 775: {region: 0x10b, script: 0x57, flags: 0x0},
+ 776: {region: 0x165, script: 0x57, flags: 0x0},
+ 777: {region: 0x165, script: 0x57, flags: 0x0},
+ 778: {region: 0x165, script: 0x57, flags: 0x0},
+ 779: {region: 0x26, script: 0x3, flags: 0x1},
+ 780: {region: 0x165, script: 0x57, flags: 0x0},
+ 781: {region: 0x165, script: 0x57, flags: 0x0},
+ 782: {region: 0x99, script: 0xe, flags: 0x0},
+ 783: {region: 0xc4, script: 0x72, flags: 0x0},
+ 785: {region: 0x165, script: 0x57, flags: 0x0},
+ 786: {region: 0x49, script: 0x57, flags: 0x0},
+ 787: {region: 0x49, script: 0x57, flags: 0x0},
+ 788: {region: 0x37, script: 0x57, flags: 0x0},
+ 789: {region: 0x165, script: 0x57, flags: 0x0},
+ 790: {region: 0x165, script: 0x57, flags: 0x0},
+ 791: {region: 0x165, script: 0x57, flags: 0x0},
+ 792: {region: 0x165, script: 0x57, flags: 0x0},
+ 793: {region: 0x165, script: 0x57, flags: 0x0},
+ 794: {region: 0x165, script: 0x57, flags: 0x0},
+ 795: {region: 0x99, script: 0x21, flags: 0x0},
+ 796: {region: 0xdb, script: 0x21, flags: 0x0},
+ 797: {region: 0x106, script: 0x1f, flags: 0x0},
+ 798: {region: 0x35, script: 0x6f, flags: 0x0},
+ 799: {region: 0x29, script: 0x3, flags: 0x1},
+ 800: {region: 0xcb, script: 0x57, flags: 0x0},
+ 801: {region: 0x165, script: 0x57, flags: 0x0},
+ 802: {region: 0x165, script: 0x57, flags: 0x0},
+ 803: {region: 0x165, script: 0x57, flags: 0x0},
+ 804: {region: 0x99, script: 0x21, flags: 0x0},
+ 805: {region: 0x52, script: 0x57, flags: 0x0},
+ 807: {region: 0x165, script: 0x57, flags: 0x0},
+ 808: {region: 0x135, script: 0x57, flags: 0x0},
+ 809: {region: 0x165, script: 0x57, flags: 0x0},
+ 810: {region: 0x165, script: 0x57, flags: 0x0},
+ 811: {region: 0xe8, script: 0x5, flags: 0x0},
+ 812: {region: 0xc3, script: 0x57, flags: 0x0},
+ 813: {region: 0x99, script: 0x21, flags: 0x0},
+ 814: {region: 0x95, script: 0x57, flags: 0x0},
+ 815: {region: 0x164, script: 0x57, flags: 0x0},
+ 816: {region: 0x165, script: 0x57, flags: 0x0},
+ 817: {region: 0xc4, script: 0x72, flags: 0x0},
+ 818: {region: 0x165, script: 0x57, flags: 0x0},
+ 819: {region: 0x165, script: 0x29, flags: 0x0},
+ 820: {region: 0x106, script: 0x1f, flags: 0x0},
+ 821: {region: 0x165, script: 0x57, flags: 0x0},
+ 822: {region: 0x131, script: 0x57, flags: 0x0},
+ 823: {region: 0x9c, script: 0x63, flags: 0x0},
+ 824: {region: 0x165, script: 0x57, flags: 0x0},
+ 825: {region: 0x165, script: 0x57, flags: 0x0},
+ 826: {region: 0x9c, script: 0x5, flags: 0x0},
+ 827: {region: 0x165, script: 0x57, flags: 0x0},
+ 828: {region: 0x165, script: 0x57, flags: 0x0},
+ 829: {region: 0x165, script: 0x57, flags: 0x0},
+ 830: {region: 0xdd, script: 0x57, flags: 0x0},
+ 831: {region: 0x165, script: 0x57, flags: 0x0},
+ 832: {region: 0x165, script: 0x57, flags: 0x0},
+ 834: {region: 0x165, script: 0x57, flags: 0x0},
+ 835: {region: 0x53, script: 0x38, flags: 0x0},
+ 836: {region: 0x9e, script: 0x57, flags: 0x0},
+ 837: {region: 0xd2, script: 0x57, flags: 0x0},
+ 838: {region: 0x165, script: 0x57, flags: 0x0},
+ 839: {region: 0xda, script: 0x57, flags: 0x0},
+ 840: {region: 0x165, script: 0x57, flags: 0x0},
+ 841: {region: 0x165, script: 0x57, flags: 0x0},
+ 842: {region: 0x165, script: 0x57, flags: 0x0},
+ 843: {region: 0xcf, script: 0x57, flags: 0x0},
+ 844: {region: 0x165, script: 0x57, flags: 0x0},
+ 845: {region: 0x165, script: 0x57, flags: 0x0},
+ 846: {region: 0x164, script: 0x57, flags: 0x0},
+ 847: {region: 0xd1, script: 0x57, flags: 0x0},
+ 848: {region: 0x60, script: 0x57, flags: 0x0},
+ 849: {region: 0xdb, script: 0x21, flags: 0x0},
+ 850: {region: 0x165, script: 0x57, flags: 0x0},
+ 851: {region: 0xdb, script: 0x21, flags: 0x0},
+ 852: {region: 0x165, script: 0x57, flags: 0x0},
+ 853: {region: 0x165, script: 0x57, flags: 0x0},
+ 854: {region: 0xd2, script: 0x57, flags: 0x0},
+ 855: {region: 0x165, script: 0x57, flags: 0x0},
+ 856: {region: 0x165, script: 0x57, flags: 0x0},
+ 857: {region: 0xd1, script: 0x57, flags: 0x0},
+ 858: {region: 0x165, script: 0x57, flags: 0x0},
+ 859: {region: 0xcf, script: 0x57, flags: 0x0},
+ 860: {region: 0xcf, script: 0x57, flags: 0x0},
+ 861: {region: 0x165, script: 0x57, flags: 0x0},
+ 862: {region: 0x165, script: 0x57, flags: 0x0},
+ 863: {region: 0x95, script: 0x57, flags: 0x0},
+ 864: {region: 0x165, script: 0x57, flags: 0x0},
+ 865: {region: 0xdf, script: 0x57, flags: 0x0},
+ 866: {region: 0x165, script: 0x57, flags: 0x0},
+ 867: {region: 0x165, script: 0x57, flags: 0x0},
+ 868: {region: 0x99, script: 0x57, flags: 0x0},
+ 869: {region: 0x165, script: 0x57, flags: 0x0},
+ 870: {region: 0x165, script: 0x57, flags: 0x0},
+ 871: {region: 0xd9, script: 0x57, flags: 0x0},
+ 872: {region: 0x52, script: 0x57, flags: 0x0},
+ 873: {region: 0x165, script: 0x57, flags: 0x0},
+ 874: {region: 0xda, script: 0x57, flags: 0x0},
+ 875: {region: 0x165, script: 0x57, flags: 0x0},
+ 876: {region: 0x52, script: 0x57, flags: 0x0},
+ 877: {region: 0x165, script: 0x57, flags: 0x0},
+ 878: {region: 0x165, script: 0x57, flags: 0x0},
+ 879: {region: 0xda, script: 0x57, flags: 0x0},
+ 880: {region: 0x123, script: 0x53, flags: 0x0},
+ 881: {region: 0x99, script: 0x21, flags: 0x0},
+ 882: {region: 0x10c, script: 0xbf, flags: 0x0},
+ 883: {region: 0x165, script: 0x57, flags: 0x0},
+ 884: {region: 0x165, script: 0x57, flags: 0x0},
+ 885: {region: 0x84, script: 0x78, flags: 0x0},
+ 886: {region: 0x161, script: 0x57, flags: 0x0},
+ 887: {region: 0x165, script: 0x57, flags: 0x0},
+ 888: {region: 0x49, script: 0x17, flags: 0x0},
+ 889: {region: 0x165, script: 0x57, flags: 0x0},
+ 890: {region: 0x161, script: 0x57, flags: 0x0},
+ 891: {region: 0x165, script: 0x57, flags: 0x0},
+ 892: {region: 0x165, script: 0x57, flags: 0x0},
+ 893: {region: 0x165, script: 0x57, flags: 0x0},
+ 894: {region: 0x165, script: 0x57, flags: 0x0},
+ 895: {region: 0x165, script: 0x57, flags: 0x0},
+ 896: {region: 0x117, script: 0x57, flags: 0x0},
+ 897: {region: 0x165, script: 0x57, flags: 0x0},
+ 898: {region: 0x165, script: 0x57, flags: 0x0},
+ 899: {region: 0x135, script: 0x57, flags: 0x0},
+ 900: {region: 0x165, script: 0x57, flags: 0x0},
+ 901: {region: 0x53, script: 0x57, flags: 0x0},
+ 902: {region: 0x165, script: 0x57, flags: 0x0},
+ 903: {region: 0xce, script: 0x57, flags: 0x0},
+ 904: {region: 0x12f, script: 0x57, flags: 0x0},
+ 905: {region: 0x131, script: 0x57, flags: 0x0},
+ 906: {region: 0x80, script: 0x57, flags: 0x0},
+ 907: {region: 0x78, script: 0x57, flags: 0x0},
+ 908: {region: 0x165, script: 0x57, flags: 0x0},
+ 910: {region: 0x165, script: 0x57, flags: 0x0},
+ 911: {region: 0x165, script: 0x57, flags: 0x0},
+ 912: {region: 0x6f, script: 0x57, flags: 0x0},
+ 913: {region: 0x165, script: 0x57, flags: 0x0},
+ 914: {region: 0x165, script: 0x57, flags: 0x0},
+ 915: {region: 0x165, script: 0x57, flags: 0x0},
+ 916: {region: 0x165, script: 0x57, flags: 0x0},
+ 917: {region: 0x99, script: 0x7d, flags: 0x0},
+ 918: {region: 0x165, script: 0x57, flags: 0x0},
+ 919: {region: 0x165, script: 0x5, flags: 0x0},
+ 920: {region: 0x7d, script: 0x1f, flags: 0x0},
+ 921: {region: 0x135, script: 0x7e, flags: 0x0},
+ 922: {region: 0x165, script: 0x5, flags: 0x0},
+ 923: {region: 0xc5, script: 0x7c, flags: 0x0},
+ 924: {region: 0x165, script: 0x57, flags: 0x0},
+ 925: {region: 0x2c, script: 0x3, flags: 0x1},
+ 926: {region: 0xe7, script: 0x57, flags: 0x0},
+ 927: {region: 0x2f, script: 0x2, flags: 0x1},
+ 928: {region: 0xe7, script: 0x57, flags: 0x0},
+ 929: {region: 0x30, script: 0x57, flags: 0x0},
+ 930: {region: 0xf0, script: 0x57, flags: 0x0},
+ 931: {region: 0x165, script: 0x57, flags: 0x0},
+ 932: {region: 0x78, script: 0x57, flags: 0x0},
+ 933: {region: 0xd6, script: 0x57, flags: 0x0},
+ 934: {region: 0x135, script: 0x57, flags: 0x0},
+ 935: {region: 0x49, script: 0x57, flags: 0x0},
+ 936: {region: 0x165, script: 0x57, flags: 0x0},
+ 937: {region: 0x9c, script: 0xe8, flags: 0x0},
+ 938: {region: 0x165, script: 0x57, flags: 0x0},
+ 939: {region: 0x60, script: 0x57, flags: 0x0},
+ 940: {region: 0x165, script: 0x5, flags: 0x0},
+ 941: {region: 0xb0, script: 0x87, flags: 0x0},
+ 943: {region: 0x165, script: 0x57, flags: 0x0},
+ 944: {region: 0x165, script: 0x57, flags: 0x0},
+ 945: {region: 0x99, script: 0x12, flags: 0x0},
+ 946: {region: 0xa4, script: 0x57, flags: 0x0},
+ 947: {region: 0xe9, script: 0x57, flags: 0x0},
+ 948: {region: 0x165, script: 0x57, flags: 0x0},
+ 949: {region: 0x9e, script: 0x57, flags: 0x0},
+ 950: {region: 0x165, script: 0x57, flags: 0x0},
+ 951: {region: 0x165, script: 0x57, flags: 0x0},
+ 952: {region: 0x87, script: 0x31, flags: 0x0},
+ 953: {region: 0x75, script: 0x57, flags: 0x0},
+ 954: {region: 0x165, script: 0x57, flags: 0x0},
+ 955: {region: 0xe8, script: 0x4a, flags: 0x0},
+ 956: {region: 0x9c, script: 0x5, flags: 0x0},
+ 957: {region: 0x1, script: 0x57, flags: 0x0},
+ 958: {region: 0x24, script: 0x5, flags: 0x0},
+ 959: {region: 0x165, script: 0x57, flags: 0x0},
+ 960: {region: 0x41, script: 0x57, flags: 0x0},
+ 961: {region: 0x165, script: 0x57, flags: 0x0},
+ 962: {region: 0x7a, script: 0x57, flags: 0x0},
+ 963: {region: 0x165, script: 0x57, flags: 0x0},
+ 964: {region: 0xe4, script: 0x57, flags: 0x0},
+ 965: {region: 0x89, script: 0x57, flags: 0x0},
+ 966: {region: 0x69, script: 0x57, flags: 0x0},
+ 967: {region: 0x165, script: 0x57, flags: 0x0},
+ 968: {region: 0x99, script: 0x21, flags: 0x0},
+ 969: {region: 0x165, script: 0x57, flags: 0x0},
+ 970: {region: 0x102, script: 0x57, flags: 0x0},
+ 971: {region: 0x95, script: 0x57, flags: 0x0},
+ 972: {region: 0x165, script: 0x57, flags: 0x0},
+ 973: {region: 0x165, script: 0x57, flags: 0x0},
+ 974: {region: 0x9e, script: 0x57, flags: 0x0},
+ 975: {region: 0x165, script: 0x5, flags: 0x0},
+ 976: {region: 0x99, script: 0x57, flags: 0x0},
+ 977: {region: 0x31, script: 0x2, flags: 0x1},
+ 978: {region: 0xdb, script: 0x21, flags: 0x0},
+ 979: {region: 0x35, script: 0xe, flags: 0x0},
+ 980: {region: 0x4e, script: 0x57, flags: 0x0},
+ 981: {region: 0x72, script: 0x57, flags: 0x0},
+ 982: {region: 0x4e, script: 0x57, flags: 0x0},
+ 983: {region: 0x9c, script: 0x5, flags: 0x0},
+ 984: {region: 0x10c, script: 0x57, flags: 0x0},
+ 985: {region: 0x3a, script: 0x57, flags: 0x0},
+ 986: {region: 0x165, script: 0x57, flags: 0x0},
+ 987: {region: 0xd1, script: 0x57, flags: 0x0},
+ 988: {region: 0x104, script: 0x57, flags: 0x0},
+ 989: {region: 0x95, script: 0x57, flags: 0x0},
+ 990: {region: 0x12f, script: 0x57, flags: 0x0},
+ 991: {region: 0x165, script: 0x57, flags: 0x0},
+ 992: {region: 0x165, script: 0x57, flags: 0x0},
+ 993: {region: 0x73, script: 0x57, flags: 0x0},
+ 994: {region: 0x106, script: 0x1f, flags: 0x0},
+ 995: {region: 0x130, script: 0x1f, flags: 0x0},
+ 996: {region: 0x109, script: 0x57, flags: 0x0},
+ 997: {region: 0x107, script: 0x57, flags: 0x0},
+ 998: {region: 0x12f, script: 0x57, flags: 0x0},
+ 999: {region: 0x165, script: 0x57, flags: 0x0},
+ 1000: {region: 0xa2, script: 0x49, flags: 0x0},
+ 1001: {region: 0x99, script: 0x21, flags: 0x0},
+ 1002: {region: 0x80, script: 0x57, flags: 0x0},
+ 1003: {region: 0x106, script: 0x1f, flags: 0x0},
+ 1004: {region: 0xa4, script: 0x57, flags: 0x0},
+ 1005: {region: 0x95, script: 0x57, flags: 0x0},
+ 1006: {region: 0x99, script: 0x57, flags: 0x0},
+ 1007: {region: 0x114, script: 0x57, flags: 0x0},
+ 1008: {region: 0x99, script: 0xc3, flags: 0x0},
+ 1009: {region: 0x165, script: 0x57, flags: 0x0},
+ 1010: {region: 0x165, script: 0x57, flags: 0x0},
+ 1011: {region: 0x12f, script: 0x57, flags: 0x0},
+ 1012: {region: 0x9e, script: 0x57, flags: 0x0},
+ 1013: {region: 0x99, script: 0x21, flags: 0x0},
+ 1014: {region: 0x165, script: 0x5, flags: 0x0},
+ 1015: {region: 0x9e, script: 0x57, flags: 0x0},
+ 1016: {region: 0x7b, script: 0x57, flags: 0x0},
+ 1017: {region: 0x49, script: 0x57, flags: 0x0},
+ 1018: {region: 0x33, script: 0x4, flags: 0x1},
+ 1019: {region: 0x9e, script: 0x57, flags: 0x0},
+ 1020: {region: 0x9c, script: 0x5, flags: 0x0},
+ 1021: {region: 0xda, script: 0x57, flags: 0x0},
+ 1022: {region: 0x4f, script: 0x57, flags: 0x0},
+ 1023: {region: 0xd1, script: 0x57, flags: 0x0},
+ 1024: {region: 0xcf, script: 0x57, flags: 0x0},
+ 1025: {region: 0xc3, script: 0x57, flags: 0x0},
+ 1026: {region: 0x4c, script: 0x57, flags: 0x0},
+ 1027: {region: 0x96, script: 0x7a, flags: 0x0},
+ 1028: {region: 0xb6, script: 0x57, flags: 0x0},
+ 1029: {region: 0x165, script: 0x29, flags: 0x0},
+ 1030: {region: 0x165, script: 0x57, flags: 0x0},
+ 1032: {region: 0xba, script: 0xdc, flags: 0x0},
+ 1033: {region: 0x165, script: 0x57, flags: 0x0},
+ 1034: {region: 0xc4, script: 0x72, flags: 0x0},
+ 1035: {region: 0x165, script: 0x5, flags: 0x0},
+ 1036: {region: 0xb3, script: 0xca, flags: 0x0},
+ 1037: {region: 0x6f, script: 0x57, flags: 0x0},
+ 1038: {region: 0x165, script: 0x57, flags: 0x0},
+ 1039: {region: 0x165, script: 0x57, flags: 0x0},
+ 1040: {region: 0x165, script: 0x57, flags: 0x0},
+ 1041: {region: 0x165, script: 0x57, flags: 0x0},
+ 1042: {region: 0x111, script: 0x57, flags: 0x0},
+ 1043: {region: 0x165, script: 0x57, flags: 0x0},
+ 1044: {region: 0xe8, script: 0x5, flags: 0x0},
+ 1045: {region: 0x165, script: 0x57, flags: 0x0},
+ 1046: {region: 0x10f, script: 0x57, flags: 0x0},
+ 1047: {region: 0x165, script: 0x57, flags: 0x0},
+ 1048: {region: 0xe9, script: 0x57, flags: 0x0},
+ 1049: {region: 0x165, script: 0x57, flags: 0x0},
+ 1050: {region: 0x95, script: 0x57, flags: 0x0},
+ 1051: {region: 0x142, script: 0x57, flags: 0x0},
+ 1052: {region: 0x10c, script: 0x57, flags: 0x0},
+ 1054: {region: 0x10c, script: 0x57, flags: 0x0},
+ 1055: {region: 0x72, script: 0x57, flags: 0x0},
+ 1056: {region: 0x97, script: 0xc0, flags: 0x0},
+ 1057: {region: 0x165, script: 0x57, flags: 0x0},
+ 1058: {region: 0x72, script: 0x57, flags: 0x0},
+ 1059: {region: 0x164, script: 0x57, flags: 0x0},
+ 1060: {region: 0x165, script: 0x57, flags: 0x0},
+ 1061: {region: 0xc3, script: 0x57, flags: 0x0},
+ 1062: {region: 0x165, script: 0x57, flags: 0x0},
+ 1063: {region: 0x165, script: 0x57, flags: 0x0},
+ 1064: {region: 0x165, script: 0x57, flags: 0x0},
+ 1065: {region: 0x115, script: 0x57, flags: 0x0},
+ 1066: {region: 0x165, script: 0x57, flags: 0x0},
+ 1067: {region: 0x165, script: 0x57, flags: 0x0},
+ 1068: {region: 0x123, script: 0xdf, flags: 0x0},
+ 1069: {region: 0x165, script: 0x57, flags: 0x0},
+ 1070: {region: 0x165, script: 0x57, flags: 0x0},
+ 1071: {region: 0x165, script: 0x57, flags: 0x0},
+ 1072: {region: 0x165, script: 0x57, flags: 0x0},
+ 1073: {region: 0x27, script: 0x57, flags: 0x0},
+ 1074: {region: 0x37, script: 0x5, flags: 0x1},
+ 1075: {region: 0x99, script: 0xcb, flags: 0x0},
+ 1076: {region: 0x116, script: 0x57, flags: 0x0},
+ 1077: {region: 0x114, script: 0x57, flags: 0x0},
+ 1078: {region: 0x99, script: 0x21, flags: 0x0},
+ 1079: {region: 0x161, script: 0x57, flags: 0x0},
+ 1080: {region: 0x165, script: 0x57, flags: 0x0},
+ 1081: {region: 0x165, script: 0x57, flags: 0x0},
+ 1082: {region: 0x6d, script: 0x57, flags: 0x0},
+ 1083: {region: 0x161, script: 0x57, flags: 0x0},
+ 1084: {region: 0x165, script: 0x57, flags: 0x0},
+ 1085: {region: 0x60, script: 0x57, flags: 0x0},
+ 1086: {region: 0x95, script: 0x57, flags: 0x0},
+ 1087: {region: 0x165, script: 0x57, flags: 0x0},
+ 1088: {region: 0x165, script: 0x57, flags: 0x0},
+ 1089: {region: 0x12f, script: 0x57, flags: 0x0},
+ 1090: {region: 0x165, script: 0x57, flags: 0x0},
+ 1091: {region: 0x84, script: 0x57, flags: 0x0},
+ 1092: {region: 0x10c, script: 0x57, flags: 0x0},
+ 1093: {region: 0x12f, script: 0x57, flags: 0x0},
+ 1094: {region: 0x15f, script: 0x5, flags: 0x0},
+ 1095: {region: 0x4b, script: 0x57, flags: 0x0},
+ 1096: {region: 0x60, script: 0x57, flags: 0x0},
+ 1097: {region: 0x165, script: 0x57, flags: 0x0},
+ 1098: {region: 0x99, script: 0x21, flags: 0x0},
+ 1099: {region: 0x95, script: 0x57, flags: 0x0},
+ 1100: {region: 0x165, script: 0x57, flags: 0x0},
+ 1101: {region: 0x35, script: 0xe, flags: 0x0},
+ 1102: {region: 0x9b, script: 0xcf, flags: 0x0},
+ 1103: {region: 0xe9, script: 0x57, flags: 0x0},
+ 1104: {region: 0x99, script: 0xd7, flags: 0x0},
+ 1105: {region: 0xdb, script: 0x21, flags: 0x0},
+ 1106: {region: 0x165, script: 0x57, flags: 0x0},
+ 1107: {region: 0x165, script: 0x57, flags: 0x0},
+ 1108: {region: 0x165, script: 0x57, flags: 0x0},
+ 1109: {region: 0x165, script: 0x57, flags: 0x0},
+ 1110: {region: 0x165, script: 0x57, flags: 0x0},
+ 1111: {region: 0x165, script: 0x57, flags: 0x0},
+ 1112: {region: 0x165, script: 0x57, flags: 0x0},
+ 1113: {region: 0x165, script: 0x57, flags: 0x0},
+ 1114: {region: 0xe7, script: 0x57, flags: 0x0},
+ 1115: {region: 0x165, script: 0x57, flags: 0x0},
+ 1116: {region: 0x165, script: 0x57, flags: 0x0},
+ 1117: {region: 0x99, script: 0x4f, flags: 0x0},
+ 1118: {region: 0x53, script: 0xd5, flags: 0x0},
+ 1119: {region: 0xdb, script: 0x21, flags: 0x0},
+ 1120: {region: 0xdb, script: 0x21, flags: 0x0},
+ 1121: {region: 0x99, script: 0xda, flags: 0x0},
+ 1122: {region: 0x165, script: 0x57, flags: 0x0},
+ 1123: {region: 0x112, script: 0x57, flags: 0x0},
+ 1124: {region: 0x131, script: 0x57, flags: 0x0},
+ 1125: {region: 0x126, script: 0x57, flags: 0x0},
+ 1126: {region: 0x165, script: 0x57, flags: 0x0},
+ 1127: {region: 0x3c, script: 0x3, flags: 0x1},
+ 1128: {region: 0x165, script: 0x57, flags: 0x0},
+ 1129: {region: 0x165, script: 0x57, flags: 0x0},
+ 1130: {region: 0x165, script: 0x57, flags: 0x0},
+ 1131: {region: 0x123, script: 0xdf, flags: 0x0},
+ 1132: {region: 0xdb, script: 0x21, flags: 0x0},
+ 1133: {region: 0xdb, script: 0x21, flags: 0x0},
+ 1134: {region: 0xdb, script: 0x21, flags: 0x0},
+ 1135: {region: 0x6f, script: 0x29, flags: 0x0},
+ 1136: {region: 0x165, script: 0x57, flags: 0x0},
+ 1137: {region: 0x6d, script: 0x29, flags: 0x0},
+ 1138: {region: 0x165, script: 0x57, flags: 0x0},
+ 1139: {region: 0x165, script: 0x57, flags: 0x0},
+ 1140: {region: 0x165, script: 0x57, flags: 0x0},
+ 1141: {region: 0xd6, script: 0x57, flags: 0x0},
+ 1142: {region: 0x127, script: 0x57, flags: 0x0},
+ 1143: {region: 0x125, script: 0x57, flags: 0x0},
+ 1144: {region: 0x32, script: 0x57, flags: 0x0},
+ 1145: {region: 0xdb, script: 0x21, flags: 0x0},
+ 1146: {region: 0xe7, script: 0x57, flags: 0x0},
+ 1147: {region: 0x165, script: 0x57, flags: 0x0},
+ 1148: {region: 0x165, script: 0x57, flags: 0x0},
+ 1149: {region: 0x32, script: 0x57, flags: 0x0},
+ 1150: {region: 0xd4, script: 0x57, flags: 0x0},
+ 1151: {region: 0x165, script: 0x57, flags: 0x0},
+ 1152: {region: 0x161, script: 0x57, flags: 0x0},
+ 1153: {region: 0x165, script: 0x57, flags: 0x0},
+ 1154: {region: 0x129, script: 0x57, flags: 0x0},
+ 1155: {region: 0x165, script: 0x57, flags: 0x0},
+ 1156: {region: 0xce, script: 0x57, flags: 0x0},
+ 1157: {region: 0x165, script: 0x57, flags: 0x0},
+ 1158: {region: 0xe6, script: 0x57, flags: 0x0},
+ 1159: {region: 0x165, script: 0x57, flags: 0x0},
+ 1160: {region: 0x165, script: 0x57, flags: 0x0},
+ 1161: {region: 0x165, script: 0x57, flags: 0x0},
+ 1162: {region: 0x12b, script: 0x57, flags: 0x0},
+ 1163: {region: 0x12b, script: 0x57, flags: 0x0},
+ 1164: {region: 0x12e, script: 0x57, flags: 0x0},
+ 1165: {region: 0x165, script: 0x5, flags: 0x0},
+ 1166: {region: 0x161, script: 0x57, flags: 0x0},
+ 1167: {region: 0x87, script: 0x31, flags: 0x0},
+ 1168: {region: 0xdb, script: 0x21, flags: 0x0},
+ 1169: {region: 0xe7, script: 0x57, flags: 0x0},
+ 1170: {region: 0x43, script: 0xe0, flags: 0x0},
+ 1171: {region: 0x165, script: 0x57, flags: 0x0},
+ 1172: {region: 0x106, script: 0x1f, flags: 0x0},
+ 1173: {region: 0x165, script: 0x57, flags: 0x0},
+ 1174: {region: 0x165, script: 0x57, flags: 0x0},
+ 1175: {region: 0x131, script: 0x57, flags: 0x0},
+ 1176: {region: 0x165, script: 0x57, flags: 0x0},
+ 1177: {region: 0x123, script: 0xdf, flags: 0x0},
+ 1178: {region: 0x32, script: 0x57, flags: 0x0},
+ 1179: {region: 0x165, script: 0x57, flags: 0x0},
+ 1180: {region: 0x165, script: 0x57, flags: 0x0},
+ 1181: {region: 0xce, script: 0x57, flags: 0x0},
+ 1182: {region: 0x165, script: 0x57, flags: 0x0},
+ 1183: {region: 0x165, script: 0x57, flags: 0x0},
+ 1184: {region: 0x12d, script: 0x57, flags: 0x0},
+ 1185: {region: 0x165, script: 0x57, flags: 0x0},
+ 1187: {region: 0x165, script: 0x57, flags: 0x0},
+ 1188: {region: 0xd4, script: 0x57, flags: 0x0},
+ 1189: {region: 0x53, script: 0xd8, flags: 0x0},
+ 1190: {region: 0xe5, script: 0x57, flags: 0x0},
+ 1191: {region: 0x165, script: 0x57, flags: 0x0},
+ 1192: {region: 0x106, script: 0x1f, flags: 0x0},
+ 1193: {region: 0xba, script: 0x57, flags: 0x0},
+ 1194: {region: 0x165, script: 0x57, flags: 0x0},
+ 1195: {region: 0x106, script: 0x1f, flags: 0x0},
+ 1196: {region: 0x3f, script: 0x4, flags: 0x1},
+ 1197: {region: 0x11c, script: 0xe2, flags: 0x0},
+ 1198: {region: 0x130, script: 0x1f, flags: 0x0},
+ 1199: {region: 0x75, script: 0x57, flags: 0x0},
+ 1200: {region: 0x2a, script: 0x57, flags: 0x0},
+ 1202: {region: 0x43, script: 0x3, flags: 0x1},
+ 1203: {region: 0x99, script: 0xe, flags: 0x0},
+ 1204: {region: 0xe8, script: 0x5, flags: 0x0},
+ 1205: {region: 0x165, script: 0x57, flags: 0x0},
+ 1206: {region: 0x165, script: 0x57, flags: 0x0},
+ 1207: {region: 0x165, script: 0x57, flags: 0x0},
+ 1208: {region: 0x165, script: 0x57, flags: 0x0},
+ 1209: {region: 0x165, script: 0x57, flags: 0x0},
+ 1210: {region: 0x165, script: 0x57, flags: 0x0},
+ 1211: {region: 0x165, script: 0x57, flags: 0x0},
+ 1212: {region: 0x46, script: 0x4, flags: 0x1},
+ 1213: {region: 0x165, script: 0x57, flags: 0x0},
+ 1214: {region: 0xb4, script: 0xe3, flags: 0x0},
+ 1215: {region: 0x165, script: 0x57, flags: 0x0},
+ 1216: {region: 0x161, script: 0x57, flags: 0x0},
+ 1217: {region: 0x9e, script: 0x57, flags: 0x0},
+ 1218: {region: 0x106, script: 0x57, flags: 0x0},
+ 1219: {region: 0x13e, script: 0x57, flags: 0x0},
+ 1220: {region: 0x11b, script: 0x57, flags: 0x0},
+ 1221: {region: 0x165, script: 0x57, flags: 0x0},
+ 1222: {region: 0x36, script: 0x57, flags: 0x0},
+ 1223: {region: 0x60, script: 0x57, flags: 0x0},
+ 1224: {region: 0xd1, script: 0x57, flags: 0x0},
+ 1225: {region: 0x1, script: 0x57, flags: 0x0},
+ 1226: {region: 0x106, script: 0x57, flags: 0x0},
+ 1227: {region: 0x6a, script: 0x57, flags: 0x0},
+ 1228: {region: 0x12f, script: 0x57, flags: 0x0},
+ 1229: {region: 0x165, script: 0x57, flags: 0x0},
+ 1230: {region: 0x36, script: 0x57, flags: 0x0},
+ 1231: {region: 0x4e, script: 0x57, flags: 0x0},
+ 1232: {region: 0x165, script: 0x57, flags: 0x0},
+ 1233: {region: 0x6f, script: 0x29, flags: 0x0},
+ 1234: {region: 0x165, script: 0x57, flags: 0x0},
+ 1235: {region: 0xe7, script: 0x57, flags: 0x0},
+ 1236: {region: 0x2f, script: 0x57, flags: 0x0},
+ 1237: {region: 0x99, script: 0xda, flags: 0x0},
+ 1238: {region: 0x99, script: 0x21, flags: 0x0},
+ 1239: {region: 0x165, script: 0x57, flags: 0x0},
+ 1240: {region: 0x165, script: 0x57, flags: 0x0},
+ 1241: {region: 0x165, script: 0x57, flags: 0x0},
+ 1242: {region: 0x165, script: 0x57, flags: 0x0},
+ 1243: {region: 0x165, script: 0x57, flags: 0x0},
+ 1244: {region: 0x165, script: 0x57, flags: 0x0},
+ 1245: {region: 0x165, script: 0x57, flags: 0x0},
+ 1246: {region: 0x165, script: 0x57, flags: 0x0},
+ 1247: {region: 0x165, script: 0x57, flags: 0x0},
+ 1248: {region: 0x140, script: 0x57, flags: 0x0},
+ 1249: {region: 0x165, script: 0x57, flags: 0x0},
+ 1250: {region: 0x165, script: 0x57, flags: 0x0},
+ 1251: {region: 0xa8, script: 0x5, flags: 0x0},
+ 1252: {region: 0x165, script: 0x57, flags: 0x0},
+ 1253: {region: 0x114, script: 0x57, flags: 0x0},
+ 1254: {region: 0x165, script: 0x57, flags: 0x0},
+ 1255: {region: 0x165, script: 0x57, flags: 0x0},
+ 1256: {region: 0x165, script: 0x57, flags: 0x0},
+ 1257: {region: 0x165, script: 0x57, flags: 0x0},
+ 1258: {region: 0x99, script: 0x21, flags: 0x0},
+ 1259: {region: 0x53, script: 0x38, flags: 0x0},
+ 1260: {region: 0x165, script: 0x57, flags: 0x0},
+ 1261: {region: 0x165, script: 0x57, flags: 0x0},
+ 1262: {region: 0x41, script: 0x57, flags: 0x0},
+ 1263: {region: 0x165, script: 0x57, flags: 0x0},
+ 1264: {region: 0x12b, script: 0x18, flags: 0x0},
+ 1265: {region: 0x165, script: 0x57, flags: 0x0},
+ 1266: {region: 0x161, script: 0x57, flags: 0x0},
+ 1267: {region: 0x165, script: 0x57, flags: 0x0},
+ 1268: {region: 0x12b, script: 0x5f, flags: 0x0},
+ 1269: {region: 0x12b, script: 0x60, flags: 0x0},
+ 1270: {region: 0x7d, script: 0x2b, flags: 0x0},
+ 1271: {region: 0x53, script: 0x64, flags: 0x0},
+ 1272: {region: 0x10b, script: 0x69, flags: 0x0},
+ 1273: {region: 0x108, script: 0x73, flags: 0x0},
+ 1274: {region: 0x99, script: 0x21, flags: 0x0},
+ 1275: {region: 0x131, script: 0x57, flags: 0x0},
+ 1276: {region: 0x165, script: 0x57, flags: 0x0},
+ 1277: {region: 0x9c, script: 0x8a, flags: 0x0},
+ 1278: {region: 0x165, script: 0x57, flags: 0x0},
+ 1279: {region: 0x15e, script: 0xc2, flags: 0x0},
+ 1280: {region: 0x165, script: 0x57, flags: 0x0},
+ 1281: {region: 0x165, script: 0x57, flags: 0x0},
+ 1282: {region: 0xdb, script: 0x21, flags: 0x0},
+ 1283: {region: 0x165, script: 0x57, flags: 0x0},
+ 1284: {region: 0x165, script: 0x57, flags: 0x0},
+ 1285: {region: 0xd1, script: 0x57, flags: 0x0},
+ 1286: {region: 0x75, script: 0x57, flags: 0x0},
+ 1287: {region: 0x165, script: 0x57, flags: 0x0},
+ 1288: {region: 0x165, script: 0x57, flags: 0x0},
+ 1289: {region: 0x52, script: 0x57, flags: 0x0},
+ 1290: {region: 0x165, script: 0x57, flags: 0x0},
+ 1291: {region: 0x165, script: 0x57, flags: 0x0},
+ 1292: {region: 0x165, script: 0x57, flags: 0x0},
+ 1293: {region: 0x52, script: 0x57, flags: 0x0},
+ 1294: {region: 0x165, script: 0x57, flags: 0x0},
+ 1295: {region: 0x165, script: 0x57, flags: 0x0},
+ 1296: {region: 0x165, script: 0x57, flags: 0x0},
+ 1297: {region: 0x165, script: 0x57, flags: 0x0},
+ 1298: {region: 0x1, script: 0x3b, flags: 0x0},
+ 1299: {region: 0x165, script: 0x57, flags: 0x0},
+ 1300: {region: 0x165, script: 0x57, flags: 0x0},
+ 1301: {region: 0x165, script: 0x57, flags: 0x0},
+ 1302: {region: 0x165, script: 0x57, flags: 0x0},
+ 1303: {region: 0x165, script: 0x57, flags: 0x0},
+ 1304: {region: 0xd6, script: 0x57, flags: 0x0},
+ 1305: {region: 0x165, script: 0x57, flags: 0x0},
+ 1306: {region: 0x165, script: 0x57, flags: 0x0},
+ 1307: {region: 0x165, script: 0x57, flags: 0x0},
+ 1308: {region: 0x41, script: 0x57, flags: 0x0},
+ 1309: {region: 0x165, script: 0x57, flags: 0x0},
+ 1310: {region: 0xcf, script: 0x57, flags: 0x0},
+ 1311: {region: 0x4a, script: 0x3, flags: 0x1},
+ 1312: {region: 0x165, script: 0x57, flags: 0x0},
+ 1313: {region: 0x165, script: 0x57, flags: 0x0},
+ 1314: {region: 0x165, script: 0x57, flags: 0x0},
+ 1315: {region: 0x53, script: 0x57, flags: 0x0},
+ 1316: {region: 0x10b, script: 0x57, flags: 0x0},
+ 1318: {region: 0xa8, script: 0x5, flags: 0x0},
+ 1319: {region: 0xd9, script: 0x57, flags: 0x0},
+ 1320: {region: 0xba, script: 0xdc, flags: 0x0},
+ 1321: {region: 0x4d, script: 0x14, flags: 0x1},
+ 1322: {region: 0x53, script: 0x79, flags: 0x0},
+ 1323: {region: 0x165, script: 0x57, flags: 0x0},
+ 1324: {region: 0x122, script: 0x57, flags: 0x0},
+ 1325: {region: 0xd0, script: 0x57, flags: 0x0},
+ 1326: {region: 0x165, script: 0x57, flags: 0x0},
+ 1327: {region: 0x161, script: 0x57, flags: 0x0},
+ 1329: {region: 0x12b, script: 0x57, flags: 0x0},
}
// likelyLangList holds lists info associated with likelyLang.
// Size: 388 bytes, 97 elements
var likelyLangList = [97]likelyScriptRegion{
0: {region: 0x9c, script: 0x7, flags: 0x0},
- 1: {region: 0xa1, script: 0x72, flags: 0x2},
- 2: {region: 0x11c, script: 0x7d, flags: 0x2},
- 3: {region: 0x32, script: 0x55, flags: 0x0},
+ 1: {region: 0xa1, script: 0x74, flags: 0x2},
+ 2: {region: 0x11c, script: 0x80, flags: 0x2},
+ 3: {region: 0x32, script: 0x57, flags: 0x0},
4: {region: 0x9b, script: 0x5, flags: 0x4},
5: {region: 0x9c, script: 0x5, flags: 0x4},
- 6: {region: 0x106, script: 0x1e, flags: 0x4},
+ 6: {region: 0x106, script: 0x1f, flags: 0x4},
7: {region: 0x9c, script: 0x5, flags: 0x2},
- 8: {region: 0x106, script: 0x1e, flags: 0x0},
- 9: {region: 0x38, script: 0x2b, flags: 0x2},
- 10: {region: 0x135, script: 0x55, flags: 0x0},
- 11: {region: 0x7b, script: 0xc2, flags: 0x2},
- 12: {region: 0x114, script: 0x55, flags: 0x0},
+ 8: {region: 0x106, script: 0x1f, flags: 0x0},
+ 9: {region: 0x38, script: 0x2c, flags: 0x2},
+ 10: {region: 0x135, script: 0x57, flags: 0x0},
+ 11: {region: 0x7b, script: 0xc5, flags: 0x2},
+ 12: {region: 0x114, script: 0x57, flags: 0x0},
13: {region: 0x84, script: 0x1, flags: 0x2},
- 14: {region: 0x5d, script: 0x1d, flags: 0x0},
- 15: {region: 0x87, script: 0x5a, flags: 0x2},
- 16: {region: 0xd6, script: 0x55, flags: 0x0},
+ 14: {region: 0x5d, script: 0x1e, flags: 0x0},
+ 15: {region: 0x87, script: 0x5c, flags: 0x2},
+ 16: {region: 0xd6, script: 0x57, flags: 0x0},
17: {region: 0x52, script: 0x5, flags: 0x4},
18: {region: 0x10b, script: 0x5, flags: 0x4},
- 19: {region: 0xae, script: 0x1e, flags: 0x0},
+ 19: {region: 0xae, script: 0x1f, flags: 0x0},
20: {region: 0x24, script: 0x5, flags: 0x4},
21: {region: 0x53, script: 0x5, flags: 0x4},
22: {region: 0x9c, script: 0x5, flags: 0x4},
23: {region: 0xc5, script: 0x5, flags: 0x4},
24: {region: 0x53, script: 0x5, flags: 0x2},
- 25: {region: 0x12b, script: 0x55, flags: 0x0},
+ 25: {region: 0x12b, script: 0x57, flags: 0x0},
26: {region: 0xb0, script: 0x5, flags: 0x4},
27: {region: 0x9b, script: 0x5, flags: 0x2},
- 28: {region: 0xa5, script: 0x1e, flags: 0x0},
+ 28: {region: 0xa5, script: 0x1f, flags: 0x0},
29: {region: 0x53, script: 0x5, flags: 0x4},
- 30: {region: 0x12b, script: 0x55, flags: 0x4},
+ 30: {region: 0x12b, script: 0x57, flags: 0x4},
31: {region: 0x53, script: 0x5, flags: 0x2},
- 32: {region: 0x12b, script: 0x55, flags: 0x2},
- 33: {region: 0xdb, script: 0x20, flags: 0x0},
- 34: {region: 0x99, script: 0x58, flags: 0x2},
- 35: {region: 0x83, script: 0x55, flags: 0x0},
- 36: {region: 0x84, script: 0x75, flags: 0x4},
- 37: {region: 0x84, script: 0x75, flags: 0x2},
- 38: {region: 0xc5, script: 0x1e, flags: 0x0},
- 39: {region: 0x53, script: 0x6b, flags: 0x4},
- 40: {region: 0x53, script: 0x6b, flags: 0x2},
- 41: {region: 0xd0, script: 0x55, flags: 0x0},
+ 32: {region: 0x12b, script: 0x57, flags: 0x2},
+ 33: {region: 0xdb, script: 0x21, flags: 0x0},
+ 34: {region: 0x99, script: 0x5a, flags: 0x2},
+ 35: {region: 0x83, script: 0x57, flags: 0x0},
+ 36: {region: 0x84, script: 0x78, flags: 0x4},
+ 37: {region: 0x84, script: 0x78, flags: 0x2},
+ 38: {region: 0xc5, script: 0x1f, flags: 0x0},
+ 39: {region: 0x53, script: 0x6d, flags: 0x4},
+ 40: {region: 0x53, script: 0x6d, flags: 0x2},
+ 41: {region: 0xd0, script: 0x57, flags: 0x0},
42: {region: 0x4a, script: 0x5, flags: 0x4},
43: {region: 0x95, script: 0x5, flags: 0x4},
- 44: {region: 0x99, script: 0x32, flags: 0x0},
+ 44: {region: 0x99, script: 0x33, flags: 0x0},
45: {region: 0xe8, script: 0x5, flags: 0x4},
46: {region: 0xe8, script: 0x5, flags: 0x2},
- 47: {region: 0x9c, script: 0x81, flags: 0x0},
- 48: {region: 0x53, script: 0x82, flags: 0x2},
- 49: {region: 0xba, script: 0xd8, flags: 0x0},
- 50: {region: 0xd9, script: 0x55, flags: 0x4},
+ 47: {region: 0x9c, script: 0x84, flags: 0x0},
+ 48: {region: 0x53, script: 0x85, flags: 0x2},
+ 49: {region: 0xba, script: 0xdc, flags: 0x0},
+ 50: {region: 0xd9, script: 0x57, flags: 0x4},
51: {region: 0xe8, script: 0x5, flags: 0x0},
- 52: {region: 0x99, script: 0x20, flags: 0x2},
- 53: {region: 0x99, script: 0x4a, flags: 0x2},
- 54: {region: 0x99, script: 0xc5, flags: 0x2},
- 55: {region: 0x105, script: 0x1e, flags: 0x0},
- 56: {region: 0xbd, script: 0x55, flags: 0x4},
- 57: {region: 0x104, script: 0x55, flags: 0x4},
- 58: {region: 0x106, script: 0x55, flags: 0x4},
- 59: {region: 0x12b, script: 0x55, flags: 0x4},
- 60: {region: 0x124, script: 0x1e, flags: 0x0},
+ 52: {region: 0x99, script: 0x21, flags: 0x2},
+ 53: {region: 0x99, script: 0x4c, flags: 0x2},
+ 54: {region: 0x99, script: 0xc9, flags: 0x2},
+ 55: {region: 0x105, script: 0x1f, flags: 0x0},
+ 56: {region: 0xbd, script: 0x57, flags: 0x4},
+ 57: {region: 0x104, script: 0x57, flags: 0x4},
+ 58: {region: 0x106, script: 0x57, flags: 0x4},
+ 59: {region: 0x12b, script: 0x57, flags: 0x4},
+ 60: {region: 0x124, script: 0x1f, flags: 0x0},
61: {region: 0xe8, script: 0x5, flags: 0x4},
62: {region: 0xe8, script: 0x5, flags: 0x2},
63: {region: 0x53, script: 0x5, flags: 0x0},
- 64: {region: 0xae, script: 0x1e, flags: 0x4},
- 65: {region: 0xc5, script: 0x1e, flags: 0x4},
- 66: {region: 0xae, script: 0x1e, flags: 0x2},
+ 64: {region: 0xae, script: 0x1f, flags: 0x4},
+ 65: {region: 0xc5, script: 0x1f, flags: 0x4},
+ 66: {region: 0xae, script: 0x1f, flags: 0x2},
67: {region: 0x99, script: 0xe, flags: 0x0},
- 68: {region: 0xdb, script: 0x20, flags: 0x4},
- 69: {region: 0xdb, script: 0x20, flags: 0x2},
- 70: {region: 0x137, script: 0x55, flags: 0x0},
+ 68: {region: 0xdb, script: 0x21, flags: 0x4},
+ 69: {region: 0xdb, script: 0x21, flags: 0x2},
+ 70: {region: 0x137, script: 0x57, flags: 0x0},
71: {region: 0x24, script: 0x5, flags: 0x4},
- 72: {region: 0x53, script: 0x1e, flags: 0x4},
+ 72: {region: 0x53, script: 0x1f, flags: 0x4},
73: {region: 0x24, script: 0x5, flags: 0x2},
- 74: {region: 0x8d, script: 0x38, flags: 0x0},
- 75: {region: 0x53, script: 0x37, flags: 0x4},
- 76: {region: 0x53, script: 0x37, flags: 0x2},
- 77: {region: 0x53, script: 0x37, flags: 0x0},
- 78: {region: 0x2f, script: 0x38, flags: 0x4},
- 79: {region: 0x3e, script: 0x38, flags: 0x4},
- 80: {region: 0x7b, script: 0x38, flags: 0x4},
- 81: {region: 0x7e, script: 0x38, flags: 0x4},
- 82: {region: 0x8d, script: 0x38, flags: 0x4},
- 83: {region: 0x95, script: 0x38, flags: 0x4},
- 84: {region: 0xc6, script: 0x38, flags: 0x4},
- 85: {region: 0xd0, script: 0x38, flags: 0x4},
- 86: {region: 0xe2, script: 0x38, flags: 0x4},
- 87: {region: 0xe5, script: 0x38, flags: 0x4},
- 88: {region: 0xe7, script: 0x38, flags: 0x4},
- 89: {region: 0x116, script: 0x38, flags: 0x4},
- 90: {region: 0x123, script: 0x38, flags: 0x4},
- 91: {region: 0x12e, script: 0x38, flags: 0x4},
- 92: {region: 0x135, script: 0x38, flags: 0x4},
- 93: {region: 0x13e, script: 0x38, flags: 0x4},
+ 74: {region: 0x8d, script: 0x39, flags: 0x0},
+ 75: {region: 0x53, script: 0x38, flags: 0x4},
+ 76: {region: 0x53, script: 0x38, flags: 0x2},
+ 77: {region: 0x53, script: 0x38, flags: 0x0},
+ 78: {region: 0x2f, script: 0x39, flags: 0x4},
+ 79: {region: 0x3e, script: 0x39, flags: 0x4},
+ 80: {region: 0x7b, script: 0x39, flags: 0x4},
+ 81: {region: 0x7e, script: 0x39, flags: 0x4},
+ 82: {region: 0x8d, script: 0x39, flags: 0x4},
+ 83: {region: 0x95, script: 0x39, flags: 0x4},
+ 84: {region: 0xc6, script: 0x39, flags: 0x4},
+ 85: {region: 0xd0, script: 0x39, flags: 0x4},
+ 86: {region: 0xe2, script: 0x39, flags: 0x4},
+ 87: {region: 0xe5, script: 0x39, flags: 0x4},
+ 88: {region: 0xe7, script: 0x39, flags: 0x4},
+ 89: {region: 0x116, script: 0x39, flags: 0x4},
+ 90: {region: 0x123, script: 0x39, flags: 0x4},
+ 91: {region: 0x12e, script: 0x39, flags: 0x4},
+ 92: {region: 0x135, script: 0x39, flags: 0x4},
+ 93: {region: 0x13e, script: 0x39, flags: 0x4},
94: {region: 0x12e, script: 0x11, flags: 0x2},
- 95: {region: 0x12e, script: 0x33, flags: 0x2},
- 96: {region: 0x12e, script: 0x38, flags: 0x2},
+ 95: {region: 0x12e, script: 0x34, flags: 0x2},
+ 96: {region: 0x12e, script: 0x39, flags: 0x2},
}
type likelyLangScript struct {
@@ -2937,306 +2948,305 @@ type likelyLangScript struct {
// TODO: exclude containers and user-definable regions from the list.
// Size: 1432 bytes, 358 elements
var likelyRegion = [358]likelyLangScript{
- 34: {lang: 0xd7, script: 0x55, flags: 0x0},
+ 34: {lang: 0xd7, script: 0x57, flags: 0x0},
35: {lang: 0x3a, script: 0x5, flags: 0x0},
36: {lang: 0x0, script: 0x2, flags: 0x1},
39: {lang: 0x2, script: 0x2, flags: 0x1},
40: {lang: 0x4, script: 0x2, flags: 0x1},
- 42: {lang: 0x3be, script: 0x55, flags: 0x0},
- 43: {lang: 0x0, script: 0x55, flags: 0x0},
- 44: {lang: 0x13d, script: 0x55, flags: 0x0},
- 45: {lang: 0x419, script: 0x55, flags: 0x0},
- 46: {lang: 0x10c, script: 0x55, flags: 0x0},
- 48: {lang: 0x365, script: 0x55, flags: 0x0},
- 49: {lang: 0x442, script: 0x55, flags: 0x0},
- 50: {lang: 0x58, script: 0x55, flags: 0x0},
+ 42: {lang: 0x3c0, script: 0x57, flags: 0x0},
+ 43: {lang: 0x0, script: 0x57, flags: 0x0},
+ 44: {lang: 0x13e, script: 0x57, flags: 0x0},
+ 45: {lang: 0x41b, script: 0x57, flags: 0x0},
+ 46: {lang: 0x10d, script: 0x57, flags: 0x0},
+ 48: {lang: 0x367, script: 0x57, flags: 0x0},
+ 49: {lang: 0x444, script: 0x57, flags: 0x0},
+ 50: {lang: 0x58, script: 0x57, flags: 0x0},
51: {lang: 0x6, script: 0x2, flags: 0x1},
53: {lang: 0xa5, script: 0xe, flags: 0x0},
- 54: {lang: 0x365, script: 0x55, flags: 0x0},
- 55: {lang: 0x15d, script: 0x55, flags: 0x0},
- 56: {lang: 0x7e, script: 0x1e, flags: 0x0},
+ 54: {lang: 0x367, script: 0x57, flags: 0x0},
+ 55: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 56: {lang: 0x7e, script: 0x1f, flags: 0x0},
57: {lang: 0x3a, script: 0x5, flags: 0x0},
- 58: {lang: 0x3d7, script: 0x55, flags: 0x0},
- 59: {lang: 0x15d, script: 0x55, flags: 0x0},
- 60: {lang: 0x15d, script: 0x55, flags: 0x0},
- 62: {lang: 0x31d, script: 0x55, flags: 0x0},
- 63: {lang: 0x13d, script: 0x55, flags: 0x0},
- 64: {lang: 0x39f, script: 0x55, flags: 0x0},
- 65: {lang: 0x3be, script: 0x55, flags: 0x0},
+ 58: {lang: 0x3d9, script: 0x57, flags: 0x0},
+ 59: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 60: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 62: {lang: 0x31f, script: 0x57, flags: 0x0},
+ 63: {lang: 0x13e, script: 0x57, flags: 0x0},
+ 64: {lang: 0x3a1, script: 0x57, flags: 0x0},
+ 65: {lang: 0x3c0, script: 0x57, flags: 0x0},
67: {lang: 0x8, script: 0x2, flags: 0x1},
- 69: {lang: 0x0, script: 0x55, flags: 0x0},
- 71: {lang: 0x71, script: 0x1e, flags: 0x0},
- 73: {lang: 0x510, script: 0x3a, flags: 0x2},
- 74: {lang: 0x31d, script: 0x5, flags: 0x2},
- 75: {lang: 0x443, script: 0x55, flags: 0x0},
- 76: {lang: 0x15d, script: 0x55, flags: 0x0},
- 77: {lang: 0x15d, script: 0x55, flags: 0x0},
- 78: {lang: 0x10c, script: 0x55, flags: 0x0},
- 79: {lang: 0x15d, script: 0x55, flags: 0x0},
- 81: {lang: 0x13d, script: 0x55, flags: 0x0},
- 82: {lang: 0x15d, script: 0x55, flags: 0x0},
- 83: {lang: 0xa, script: 0x5, flags: 0x1},
- 84: {lang: 0x13d, script: 0x55, flags: 0x0},
- 85: {lang: 0x0, script: 0x55, flags: 0x0},
- 86: {lang: 0x13d, script: 0x55, flags: 0x0},
- 89: {lang: 0x13d, script: 0x55, flags: 0x0},
- 90: {lang: 0x3be, script: 0x55, flags: 0x0},
- 91: {lang: 0x39f, script: 0x55, flags: 0x0},
- 93: {lang: 0xf, script: 0x2, flags: 0x1},
- 94: {lang: 0xf9, script: 0x55, flags: 0x0},
- 96: {lang: 0x10c, script: 0x55, flags: 0x0},
- 98: {lang: 0x1, script: 0x55, flags: 0x0},
- 99: {lang: 0x100, script: 0x55, flags: 0x0},
- 101: {lang: 0x13d, script: 0x55, flags: 0x0},
- 103: {lang: 0x11, script: 0x2, flags: 0x1},
- 104: {lang: 0x13d, script: 0x55, flags: 0x0},
- 105: {lang: 0x13d, script: 0x55, flags: 0x0},
- 106: {lang: 0x13f, script: 0x55, flags: 0x0},
+ 69: {lang: 0x0, script: 0x57, flags: 0x0},
+ 71: {lang: 0x71, script: 0x1f, flags: 0x0},
+ 73: {lang: 0x512, script: 0x3b, flags: 0x2},
+ 74: {lang: 0x31f, script: 0x5, flags: 0x2},
+ 75: {lang: 0x445, script: 0x57, flags: 0x0},
+ 76: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 77: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 78: {lang: 0x10d, script: 0x57, flags: 0x0},
+ 79: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 81: {lang: 0x13e, script: 0x57, flags: 0x0},
+ 82: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 83: {lang: 0xa, script: 0x4, flags: 0x1},
+ 84: {lang: 0x13e, script: 0x57, flags: 0x0},
+ 85: {lang: 0x0, script: 0x57, flags: 0x0},
+ 86: {lang: 0x13e, script: 0x57, flags: 0x0},
+ 89: {lang: 0x13e, script: 0x57, flags: 0x0},
+ 90: {lang: 0x3c0, script: 0x57, flags: 0x0},
+ 91: {lang: 0x3a1, script: 0x57, flags: 0x0},
+ 93: {lang: 0xe, script: 0x2, flags: 0x1},
+ 94: {lang: 0xfa, script: 0x57, flags: 0x0},
+ 96: {lang: 0x10d, script: 0x57, flags: 0x0},
+ 98: {lang: 0x1, script: 0x57, flags: 0x0},
+ 99: {lang: 0x101, script: 0x57, flags: 0x0},
+ 101: {lang: 0x13e, script: 0x57, flags: 0x0},
+ 103: {lang: 0x10, script: 0x2, flags: 0x1},
+ 104: {lang: 0x13e, script: 0x57, flags: 0x0},
+ 105: {lang: 0x13e, script: 0x57, flags: 0x0},
+ 106: {lang: 0x140, script: 0x57, flags: 0x0},
107: {lang: 0x3a, script: 0x5, flags: 0x0},
108: {lang: 0x3a, script: 0x5, flags: 0x0},
- 109: {lang: 0x46d, script: 0x28, flags: 0x0},
- 110: {lang: 0x13d, script: 0x55, flags: 0x0},
- 111: {lang: 0x13, script: 0x2, flags: 0x1},
- 113: {lang: 0x10c, script: 0x55, flags: 0x0},
- 114: {lang: 0x150, script: 0x55, flags: 0x0},
- 115: {lang: 0x1be, script: 0x20, flags: 0x2},
- 118: {lang: 0x157, script: 0x55, flags: 0x0},
- 120: {lang: 0x15d, script: 0x55, flags: 0x0},
- 122: {lang: 0x15d, script: 0x55, flags: 0x0},
- 123: {lang: 0x15, script: 0x2, flags: 0x1},
- 125: {lang: 0x17, script: 0x3, flags: 0x1},
- 126: {lang: 0x15d, script: 0x55, flags: 0x0},
- 128: {lang: 0x21, script: 0x55, flags: 0x0},
- 130: {lang: 0x243, script: 0x55, flags: 0x0},
- 132: {lang: 0x15d, script: 0x55, flags: 0x0},
- 133: {lang: 0x15d, script: 0x55, flags: 0x0},
- 134: {lang: 0x13d, script: 0x55, flags: 0x0},
- 135: {lang: 0x1a, script: 0x2, flags: 0x1},
- 136: {lang: 0x0, script: 0x55, flags: 0x0},
- 137: {lang: 0x13d, script: 0x55, flags: 0x0},
- 139: {lang: 0x3be, script: 0x55, flags: 0x0},
- 141: {lang: 0x527, script: 0x38, flags: 0x0},
- 142: {lang: 0x0, script: 0x55, flags: 0x0},
- 143: {lang: 0x13d, script: 0x55, flags: 0x0},
- 144: {lang: 0x1cf, script: 0x55, flags: 0x0},
- 145: {lang: 0x1d2, script: 0x55, flags: 0x0},
- 146: {lang: 0x1d3, script: 0x55, flags: 0x0},
- 148: {lang: 0x13d, script: 0x55, flags: 0x0},
- 149: {lang: 0x1c, script: 0x2, flags: 0x1},
- 151: {lang: 0x1ba, script: 0x3a, flags: 0x0},
- 153: {lang: 0x1e, script: 0x3, flags: 0x1},
+ 109: {lang: 0x46f, script: 0x29, flags: 0x0},
+ 110: {lang: 0x13e, script: 0x57, flags: 0x0},
+ 111: {lang: 0x12, script: 0x2, flags: 0x1},
+ 113: {lang: 0x10d, script: 0x57, flags: 0x0},
+ 114: {lang: 0x151, script: 0x57, flags: 0x0},
+ 115: {lang: 0x1c0, script: 0x21, flags: 0x2},
+ 118: {lang: 0x158, script: 0x57, flags: 0x0},
+ 120: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 122: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 123: {lang: 0x14, script: 0x2, flags: 0x1},
+ 125: {lang: 0x16, script: 0x3, flags: 0x1},
+ 126: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 128: {lang: 0x21, script: 0x57, flags: 0x0},
+ 130: {lang: 0x245, script: 0x57, flags: 0x0},
+ 132: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 133: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 134: {lang: 0x13e, script: 0x57, flags: 0x0},
+ 135: {lang: 0x19, script: 0x2, flags: 0x1},
+ 136: {lang: 0x0, script: 0x57, flags: 0x0},
+ 137: {lang: 0x13e, script: 0x57, flags: 0x0},
+ 139: {lang: 0x3c0, script: 0x57, flags: 0x0},
+ 141: {lang: 0x529, script: 0x39, flags: 0x0},
+ 142: {lang: 0x0, script: 0x57, flags: 0x0},
+ 143: {lang: 0x13e, script: 0x57, flags: 0x0},
+ 144: {lang: 0x1d1, script: 0x57, flags: 0x0},
+ 145: {lang: 0x1d4, script: 0x57, flags: 0x0},
+ 146: {lang: 0x1d5, script: 0x57, flags: 0x0},
+ 148: {lang: 0x13e, script: 0x57, flags: 0x0},
+ 149: {lang: 0x1b, script: 0x2, flags: 0x1},
+ 151: {lang: 0x1bc, script: 0x3b, flags: 0x0},
+ 153: {lang: 0x1d, script: 0x3, flags: 0x1},
155: {lang: 0x3a, script: 0x5, flags: 0x0},
- 156: {lang: 0x21, script: 0x2, flags: 0x1},
- 157: {lang: 0x1f6, script: 0x55, flags: 0x0},
- 158: {lang: 0x1f7, script: 0x55, flags: 0x0},
+ 156: {lang: 0x20, script: 0x2, flags: 0x1},
+ 157: {lang: 0x1f8, script: 0x57, flags: 0x0},
+ 158: {lang: 0x1f9, script: 0x57, flags: 0x0},
161: {lang: 0x3a, script: 0x5, flags: 0x0},
- 162: {lang: 0x1fe, script: 0x44, flags: 0x0},
- 164: {lang: 0x443, script: 0x55, flags: 0x0},
- 165: {lang: 0x288, script: 0x1e, flags: 0x0},
- 166: {lang: 0x23, script: 0x3, flags: 0x1},
- 168: {lang: 0x26, script: 0x2, flags: 0x1},
- 170: {lang: 0x252, script: 0x4e, flags: 0x0},
- 171: {lang: 0x252, script: 0x4e, flags: 0x0},
+ 162: {lang: 0x200, script: 0x46, flags: 0x0},
+ 164: {lang: 0x445, script: 0x57, flags: 0x0},
+ 165: {lang: 0x28a, script: 0x1f, flags: 0x0},
+ 166: {lang: 0x22, script: 0x3, flags: 0x1},
+ 168: {lang: 0x25, script: 0x2, flags: 0x1},
+ 170: {lang: 0x254, script: 0x50, flags: 0x0},
+ 171: {lang: 0x254, script: 0x50, flags: 0x0},
172: {lang: 0x3a, script: 0x5, flags: 0x0},
- 174: {lang: 0x3e0, script: 0x1e, flags: 0x0},
- 175: {lang: 0x28, script: 0x2, flags: 0x1},
+ 174: {lang: 0x3e2, script: 0x1f, flags: 0x0},
+ 175: {lang: 0x27, script: 0x2, flags: 0x1},
176: {lang: 0x3a, script: 0x5, flags: 0x0},
- 178: {lang: 0x10c, script: 0x55, flags: 0x0},
- 179: {lang: 0x40a, script: 0xc6, flags: 0x0},
- 181: {lang: 0x439, script: 0x55, flags: 0x0},
- 182: {lang: 0x2be, script: 0x55, flags: 0x0},
- 183: {lang: 0x15d, script: 0x55, flags: 0x0},
- 184: {lang: 0x2c5, script: 0x55, flags: 0x0},
+ 178: {lang: 0x10d, script: 0x57, flags: 0x0},
+ 179: {lang: 0x40c, script: 0xca, flags: 0x0},
+ 181: {lang: 0x43b, script: 0x57, flags: 0x0},
+ 182: {lang: 0x2c0, script: 0x57, flags: 0x0},
+ 183: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 184: {lang: 0x2c7, script: 0x57, flags: 0x0},
185: {lang: 0x3a, script: 0x5, flags: 0x0},
- 186: {lang: 0x2a, script: 0x2, flags: 0x1},
- 187: {lang: 0x15d, script: 0x55, flags: 0x0},
- 188: {lang: 0x2c, script: 0x2, flags: 0x1},
- 189: {lang: 0x430, script: 0x55, flags: 0x0},
- 190: {lang: 0x15d, script: 0x55, flags: 0x0},
- 191: {lang: 0x2ef, script: 0x55, flags: 0x0},
- 194: {lang: 0x2e, script: 0x2, flags: 0x1},
- 195: {lang: 0xa0, script: 0x55, flags: 0x0},
- 196: {lang: 0x30, script: 0x2, flags: 0x1},
- 197: {lang: 0x32, script: 0x2, flags: 0x1},
- 198: {lang: 0x34, script: 0x2, flags: 0x1},
- 200: {lang: 0x15d, script: 0x55, flags: 0x0},
- 201: {lang: 0x36, script: 0x2, flags: 0x1},
- 203: {lang: 0x31e, script: 0x55, flags: 0x0},
- 204: {lang: 0x38, script: 0x3, flags: 0x1},
- 205: {lang: 0x127, script: 0xda, flags: 0x0},
- 207: {lang: 0x13d, script: 0x55, flags: 0x0},
- 208: {lang: 0x31d, script: 0x55, flags: 0x0},
- 209: {lang: 0x3be, script: 0x55, flags: 0x0},
- 210: {lang: 0x16, script: 0x55, flags: 0x0},
- 211: {lang: 0x15d, script: 0x55, flags: 0x0},
- 212: {lang: 0x1b2, script: 0x55, flags: 0x0},
- 214: {lang: 0x1b2, script: 0x5, flags: 0x2},
- 216: {lang: 0x13d, script: 0x55, flags: 0x0},
- 217: {lang: 0x365, script: 0x55, flags: 0x0},
- 218: {lang: 0x345, script: 0x55, flags: 0x0},
- 219: {lang: 0x34f, script: 0x20, flags: 0x0},
+ 186: {lang: 0x29, script: 0x2, flags: 0x1},
+ 187: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 188: {lang: 0x2b, script: 0x2, flags: 0x1},
+ 189: {lang: 0x432, script: 0x57, flags: 0x0},
+ 190: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 191: {lang: 0x2f1, script: 0x57, flags: 0x0},
+ 194: {lang: 0x2d, script: 0x2, flags: 0x1},
+ 195: {lang: 0xa0, script: 0x57, flags: 0x0},
+ 196: {lang: 0x2f, script: 0x2, flags: 0x1},
+ 197: {lang: 0x31, script: 0x2, flags: 0x1},
+ 198: {lang: 0x33, script: 0x2, flags: 0x1},
+ 200: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 201: {lang: 0x35, script: 0x2, flags: 0x1},
+ 203: {lang: 0x320, script: 0x57, flags: 0x0},
+ 204: {lang: 0x37, script: 0x3, flags: 0x1},
+ 205: {lang: 0x128, script: 0xde, flags: 0x0},
+ 207: {lang: 0x13e, script: 0x57, flags: 0x0},
+ 208: {lang: 0x31f, script: 0x57, flags: 0x0},
+ 209: {lang: 0x3c0, script: 0x57, flags: 0x0},
+ 210: {lang: 0x16, script: 0x57, flags: 0x0},
+ 211: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 212: {lang: 0x1b4, script: 0x57, flags: 0x0},
+ 214: {lang: 0x1b4, script: 0x5, flags: 0x2},
+ 216: {lang: 0x13e, script: 0x57, flags: 0x0},
+ 217: {lang: 0x367, script: 0x57, flags: 0x0},
+ 218: {lang: 0x347, script: 0x57, flags: 0x0},
+ 219: {lang: 0x351, script: 0x21, flags: 0x0},
225: {lang: 0x3a, script: 0x5, flags: 0x0},
- 226: {lang: 0x13d, script: 0x55, flags: 0x0},
- 228: {lang: 0x13d, script: 0x55, flags: 0x0},
- 229: {lang: 0x15d, script: 0x55, flags: 0x0},
- 230: {lang: 0x484, script: 0x55, flags: 0x0},
- 231: {lang: 0x152, script: 0x55, flags: 0x0},
- 232: {lang: 0x3b, script: 0x3, flags: 0x1},
- 233: {lang: 0x3b1, script: 0x55, flags: 0x0},
- 234: {lang: 0x15d, script: 0x55, flags: 0x0},
- 236: {lang: 0x13d, script: 0x55, flags: 0x0},
+ 226: {lang: 0x13e, script: 0x57, flags: 0x0},
+ 228: {lang: 0x13e, script: 0x57, flags: 0x0},
+ 229: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 230: {lang: 0x486, script: 0x57, flags: 0x0},
+ 231: {lang: 0x153, script: 0x57, flags: 0x0},
+ 232: {lang: 0x3a, script: 0x3, flags: 0x1},
+ 233: {lang: 0x3b3, script: 0x57, flags: 0x0},
+ 234: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 236: {lang: 0x13e, script: 0x57, flags: 0x0},
237: {lang: 0x3a, script: 0x5, flags: 0x0},
- 238: {lang: 0x3be, script: 0x55, flags: 0x0},
- 240: {lang: 0x3a0, script: 0x55, flags: 0x0},
- 241: {lang: 0x192, script: 0x55, flags: 0x0},
+ 238: {lang: 0x3c0, script: 0x57, flags: 0x0},
+ 240: {lang: 0x3a2, script: 0x57, flags: 0x0},
+ 241: {lang: 0x194, script: 0x57, flags: 0x0},
243: {lang: 0x3a, script: 0x5, flags: 0x0},
- 258: {lang: 0x15d, script: 0x55, flags: 0x0},
- 260: {lang: 0x3e, script: 0x2, flags: 0x1},
- 261: {lang: 0x430, script: 0x1e, flags: 0x0},
- 262: {lang: 0x40, script: 0x2, flags: 0x1},
- 263: {lang: 0x3e3, script: 0x55, flags: 0x0},
+ 258: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 260: {lang: 0x3d, script: 0x2, flags: 0x1},
+ 261: {lang: 0x432, script: 0x1f, flags: 0x0},
+ 262: {lang: 0x3f, script: 0x2, flags: 0x1},
+ 263: {lang: 0x3e5, script: 0x57, flags: 0x0},
264: {lang: 0x3a, script: 0x5, flags: 0x0},
- 266: {lang: 0x15d, script: 0x55, flags: 0x0},
+ 266: {lang: 0x15e, script: 0x57, flags: 0x0},
267: {lang: 0x3a, script: 0x5, flags: 0x0},
- 268: {lang: 0x42, script: 0x2, flags: 0x1},
- 271: {lang: 0x414, script: 0x55, flags: 0x0},
- 272: {lang: 0x345, script: 0x55, flags: 0x0},
- 273: {lang: 0x44, script: 0x2, flags: 0x1},
- 275: {lang: 0x1f7, script: 0x55, flags: 0x0},
- 276: {lang: 0x15d, script: 0x55, flags: 0x0},
- 277: {lang: 0x427, script: 0x55, flags: 0x0},
- 278: {lang: 0x365, script: 0x55, flags: 0x0},
- 280: {lang: 0x3be, script: 0x55, flags: 0x0},
- 282: {lang: 0x13d, script: 0x55, flags: 0x0},
- 284: {lang: 0x46, script: 0x2, flags: 0x1},
- 288: {lang: 0x15d, script: 0x55, flags: 0x0},
- 289: {lang: 0x15d, script: 0x55, flags: 0x0},
- 290: {lang: 0x48, script: 0x2, flags: 0x1},
- 291: {lang: 0x4a, script: 0x3, flags: 0x1},
- 292: {lang: 0x4d, script: 0x2, flags: 0x1},
- 293: {lang: 0x475, script: 0x55, flags: 0x0},
- 294: {lang: 0x3be, script: 0x55, flags: 0x0},
- 295: {lang: 0x474, script: 0x55, flags: 0x0},
- 296: {lang: 0x4f, script: 0x2, flags: 0x1},
- 297: {lang: 0x480, script: 0x55, flags: 0x0},
- 299: {lang: 0x51, script: 0x4, flags: 0x1},
- 301: {lang: 0x49e, script: 0x55, flags: 0x0},
- 302: {lang: 0x55, script: 0x2, flags: 0x1},
- 303: {lang: 0x443, script: 0x55, flags: 0x0},
- 304: {lang: 0x57, script: 0x3, flags: 0x1},
- 305: {lang: 0x443, script: 0x55, flags: 0x0},
- 309: {lang: 0x510, script: 0x3a, flags: 0x2},
- 310: {lang: 0x13d, script: 0x55, flags: 0x0},
- 311: {lang: 0x4ba, script: 0x55, flags: 0x0},
- 312: {lang: 0x1f7, script: 0x55, flags: 0x0},
- 315: {lang: 0x13d, script: 0x55, flags: 0x0},
- 318: {lang: 0x4c1, script: 0x55, flags: 0x0},
- 319: {lang: 0x8a, script: 0x55, flags: 0x0},
- 320: {lang: 0x15d, script: 0x55, flags: 0x0},
- 322: {lang: 0x419, script: 0x55, flags: 0x0},
- 333: {lang: 0x5a, script: 0x2, flags: 0x1},
+ 268: {lang: 0x41, script: 0x2, flags: 0x1},
+ 271: {lang: 0x416, script: 0x57, flags: 0x0},
+ 272: {lang: 0x347, script: 0x57, flags: 0x0},
+ 273: {lang: 0x43, script: 0x2, flags: 0x1},
+ 275: {lang: 0x1f9, script: 0x57, flags: 0x0},
+ 276: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 277: {lang: 0x429, script: 0x57, flags: 0x0},
+ 278: {lang: 0x367, script: 0x57, flags: 0x0},
+ 280: {lang: 0x3c0, script: 0x57, flags: 0x0},
+ 282: {lang: 0x13e, script: 0x57, flags: 0x0},
+ 284: {lang: 0x45, script: 0x2, flags: 0x1},
+ 288: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 289: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 290: {lang: 0x47, script: 0x2, flags: 0x1},
+ 291: {lang: 0x49, script: 0x3, flags: 0x1},
+ 292: {lang: 0x4c, script: 0x2, flags: 0x1},
+ 293: {lang: 0x477, script: 0x57, flags: 0x0},
+ 294: {lang: 0x3c0, script: 0x57, flags: 0x0},
+ 295: {lang: 0x476, script: 0x57, flags: 0x0},
+ 296: {lang: 0x4e, script: 0x2, flags: 0x1},
+ 297: {lang: 0x482, script: 0x57, flags: 0x0},
+ 299: {lang: 0x50, script: 0x4, flags: 0x1},
+ 301: {lang: 0x4a0, script: 0x57, flags: 0x0},
+ 302: {lang: 0x54, script: 0x2, flags: 0x1},
+ 303: {lang: 0x445, script: 0x57, flags: 0x0},
+ 304: {lang: 0x56, script: 0x3, flags: 0x1},
+ 305: {lang: 0x445, script: 0x57, flags: 0x0},
+ 309: {lang: 0x512, script: 0x3b, flags: 0x2},
+ 310: {lang: 0x13e, script: 0x57, flags: 0x0},
+ 311: {lang: 0x4bc, script: 0x57, flags: 0x0},
+ 312: {lang: 0x1f9, script: 0x57, flags: 0x0},
+ 315: {lang: 0x13e, script: 0x57, flags: 0x0},
+ 318: {lang: 0x4c3, script: 0x57, flags: 0x0},
+ 319: {lang: 0x8a, script: 0x57, flags: 0x0},
+ 320: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 322: {lang: 0x41b, script: 0x57, flags: 0x0},
+ 333: {lang: 0x59, script: 0x2, flags: 0x1},
350: {lang: 0x3a, script: 0x5, flags: 0x0},
- 351: {lang: 0x5c, script: 0x2, flags: 0x1},
- 356: {lang: 0x421, script: 0x55, flags: 0x0},
+ 351: {lang: 0x5b, script: 0x2, flags: 0x1},
+ 356: {lang: 0x423, script: 0x57, flags: 0x0},
}
// likelyRegionList holds lists info associated with likelyRegion.
-// Size: 376 bytes, 94 elements
-var likelyRegionList = [94]likelyLangScript{
- 0: {lang: 0x147, script: 0x5, flags: 0x0},
- 1: {lang: 0x474, script: 0x55, flags: 0x0},
- 2: {lang: 0x42f, script: 0x55, flags: 0x0},
- 3: {lang: 0x2fd, script: 0x1e, flags: 0x0},
- 4: {lang: 0x1d5, script: 0x8, flags: 0x0},
- 5: {lang: 0x272, script: 0x55, flags: 0x0},
- 6: {lang: 0xb7, script: 0x55, flags: 0x0},
- 7: {lang: 0x430, script: 0x1e, flags: 0x0},
- 8: {lang: 0x12c, script: 0xdc, flags: 0x0},
- 9: {lang: 0x34f, script: 0x20, flags: 0x0},
- 10: {lang: 0x527, script: 0x37, flags: 0x0},
- 11: {lang: 0x4aa, script: 0x5, flags: 0x0},
- 12: {lang: 0x51d, script: 0x38, flags: 0x0},
- 13: {lang: 0x521, script: 0x55, flags: 0x0},
- 14: {lang: 0x298, script: 0xdb, flags: 0x0},
- 15: {lang: 0x135, script: 0x30, flags: 0x0},
- 16: {lang: 0x488, script: 0x55, flags: 0x0},
- 17: {lang: 0x3a, script: 0x5, flags: 0x0},
- 18: {lang: 0x15d, script: 0x55, flags: 0x0},
- 19: {lang: 0x27, script: 0x28, flags: 0x0},
- 20: {lang: 0x138, script: 0x55, flags: 0x0},
- 21: {lang: 0x268, script: 0x5, flags: 0x2},
- 22: {lang: 0x510, script: 0x3a, flags: 0x2},
- 23: {lang: 0x20e, script: 0x2a, flags: 0x0},
- 24: {lang: 0x5, script: 0x1e, flags: 0x0},
- 25: {lang: 0x272, script: 0x55, flags: 0x0},
- 26: {lang: 0x135, script: 0x30, flags: 0x0},
- 27: {lang: 0x2fd, script: 0x1e, flags: 0x0},
- 28: {lang: 0x1df, script: 0x55, flags: 0x0},
- 29: {lang: 0x31d, script: 0x5, flags: 0x0},
- 30: {lang: 0x1bc, script: 0x20, flags: 0x0},
- 31: {lang: 0x4b2, script: 0x5, flags: 0x0},
- 32: {lang: 0x234, script: 0x70, flags: 0x0},
- 33: {lang: 0x147, script: 0x5, flags: 0x0},
- 34: {lang: 0x474, script: 0x55, flags: 0x0},
- 35: {lang: 0x248, script: 0x49, flags: 0x0},
- 36: {lang: 0xe6, script: 0x5, flags: 0x0},
- 37: {lang: 0x224, script: 0xdb, flags: 0x0},
- 38: {lang: 0x3a, script: 0x5, flags: 0x0},
- 39: {lang: 0x15d, script: 0x55, flags: 0x0},
- 40: {lang: 0x2b6, script: 0x52, flags: 0x0},
- 41: {lang: 0x224, script: 0xdb, flags: 0x0},
- 42: {lang: 0x3a, script: 0x5, flags: 0x0},
- 43: {lang: 0x15d, script: 0x55, flags: 0x0},
- 44: {lang: 0x3da, script: 0x55, flags: 0x0},
- 45: {lang: 0x4ac, script: 0x1e, flags: 0x0},
- 46: {lang: 0x2fd, script: 0x1e, flags: 0x0},
- 47: {lang: 0x42f, script: 0x55, flags: 0x0},
- 48: {lang: 0x32f, script: 0x70, flags: 0x0},
- 49: {lang: 0x211, script: 0x55, flags: 0x0},
- 50: {lang: 0x309, script: 0x1e, flags: 0x0},
- 51: {lang: 0x240, script: 0x5, flags: 0x0},
- 52: {lang: 0x527, script: 0x38, flags: 0x0},
- 53: {lang: 0x3be, script: 0x55, flags: 0x0},
- 54: {lang: 0x3a, script: 0x5, flags: 0x0},
- 55: {lang: 0x15d, script: 0x55, flags: 0x0},
- 56: {lang: 0x2eb, script: 0x55, flags: 0x0},
- 57: {lang: 0x4b2, script: 0x5, flags: 0x0},
- 58: {lang: 0x88, script: 0x20, flags: 0x0},
- 59: {lang: 0x4b2, script: 0x5, flags: 0x0},
- 60: {lang: 0x4b2, script: 0x5, flags: 0x0},
- 61: {lang: 0xbe, script: 0x20, flags: 0x0},
- 62: {lang: 0x3da, script: 0x55, flags: 0x0},
- 63: {lang: 0x7e, script: 0x1e, flags: 0x0},
- 64: {lang: 0x3e0, script: 0x1e, flags: 0x0},
- 65: {lang: 0x265, script: 0x55, flags: 0x0},
- 66: {lang: 0x442, script: 0x55, flags: 0x0},
- 67: {lang: 0x510, script: 0x3a, flags: 0x0},
- 68: {lang: 0x410, script: 0x55, flags: 0x0},
- 69: {lang: 0x4ac, script: 0x1e, flags: 0x0},
- 70: {lang: 0x3a, script: 0x5, flags: 0x0},
- 71: {lang: 0x15d, script: 0x55, flags: 0x0},
- 72: {lang: 0x15d, script: 0x55, flags: 0x0},
- 73: {lang: 0x35, script: 0x5, flags: 0x0},
- 74: {lang: 0x469, script: 0xdb, flags: 0x0},
- 75: {lang: 0x2ea, script: 0x5, flags: 0x0},
- 76: {lang: 0x30d, script: 0x70, flags: 0x0},
- 77: {lang: 0x465, script: 0x1e, flags: 0x0},
- 78: {lang: 0x147, script: 0x5, flags: 0x0},
- 79: {lang: 0x3a, script: 0x5, flags: 0x0},
- 80: {lang: 0x15d, script: 0x55, flags: 0x0},
- 81: {lang: 0x488, script: 0x55, flags: 0x0},
- 82: {lang: 0x58, script: 0x5, flags: 0x0},
- 83: {lang: 0x217, script: 0x1e, flags: 0x0},
- 84: {lang: 0x81, script: 0x30, flags: 0x0},
- 85: {lang: 0x527, script: 0x38, flags: 0x0},
- 86: {lang: 0x48a, script: 0x55, flags: 0x0},
- 87: {lang: 0x4ac, script: 0x1e, flags: 0x0},
- 88: {lang: 0x510, script: 0x3a, flags: 0x0},
- 89: {lang: 0x3b1, script: 0x55, flags: 0x0},
- 90: {lang: 0x42f, script: 0x55, flags: 0x0},
- 91: {lang: 0x430, script: 0x1e, flags: 0x0},
- 92: {lang: 0x15d, script: 0x55, flags: 0x0},
- 93: {lang: 0x444, script: 0x5, flags: 0x0},
+// Size: 372 bytes, 93 elements
+var likelyRegionList = [93]likelyLangScript{
+ 0: {lang: 0x148, script: 0x5, flags: 0x0},
+ 1: {lang: 0x476, script: 0x57, flags: 0x0},
+ 2: {lang: 0x431, script: 0x57, flags: 0x0},
+ 3: {lang: 0x2ff, script: 0x1f, flags: 0x0},
+ 4: {lang: 0x1d7, script: 0x8, flags: 0x0},
+ 5: {lang: 0x274, script: 0x57, flags: 0x0},
+ 6: {lang: 0xb7, script: 0x57, flags: 0x0},
+ 7: {lang: 0x432, script: 0x1f, flags: 0x0},
+ 8: {lang: 0x12d, script: 0xe0, flags: 0x0},
+ 9: {lang: 0x351, script: 0x21, flags: 0x0},
+ 10: {lang: 0x529, script: 0x38, flags: 0x0},
+ 11: {lang: 0x4ac, script: 0x5, flags: 0x0},
+ 12: {lang: 0x523, script: 0x57, flags: 0x0},
+ 13: {lang: 0x29a, script: 0xdf, flags: 0x0},
+ 14: {lang: 0x136, script: 0x31, flags: 0x0},
+ 15: {lang: 0x48a, script: 0x57, flags: 0x0},
+ 16: {lang: 0x3a, script: 0x5, flags: 0x0},
+ 17: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 18: {lang: 0x27, script: 0x29, flags: 0x0},
+ 19: {lang: 0x139, script: 0x57, flags: 0x0},
+ 20: {lang: 0x26a, script: 0x5, flags: 0x2},
+ 21: {lang: 0x512, script: 0x3b, flags: 0x2},
+ 22: {lang: 0x210, script: 0x2b, flags: 0x0},
+ 23: {lang: 0x5, script: 0x1f, flags: 0x0},
+ 24: {lang: 0x274, script: 0x57, flags: 0x0},
+ 25: {lang: 0x136, script: 0x31, flags: 0x0},
+ 26: {lang: 0x2ff, script: 0x1f, flags: 0x0},
+ 27: {lang: 0x1e1, script: 0x57, flags: 0x0},
+ 28: {lang: 0x31f, script: 0x5, flags: 0x0},
+ 29: {lang: 0x1be, script: 0x21, flags: 0x0},
+ 30: {lang: 0x4b4, script: 0x5, flags: 0x0},
+ 31: {lang: 0x236, script: 0x72, flags: 0x0},
+ 32: {lang: 0x148, script: 0x5, flags: 0x0},
+ 33: {lang: 0x476, script: 0x57, flags: 0x0},
+ 34: {lang: 0x24a, script: 0x4b, flags: 0x0},
+ 35: {lang: 0xe6, script: 0x5, flags: 0x0},
+ 36: {lang: 0x226, script: 0xdf, flags: 0x0},
+ 37: {lang: 0x3a, script: 0x5, flags: 0x0},
+ 38: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 39: {lang: 0x2b8, script: 0x54, flags: 0x0},
+ 40: {lang: 0x226, script: 0xdf, flags: 0x0},
+ 41: {lang: 0x3a, script: 0x5, flags: 0x0},
+ 42: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 43: {lang: 0x3dc, script: 0x57, flags: 0x0},
+ 44: {lang: 0x4ae, script: 0x1f, flags: 0x0},
+ 45: {lang: 0x2ff, script: 0x1f, flags: 0x0},
+ 46: {lang: 0x431, script: 0x57, flags: 0x0},
+ 47: {lang: 0x331, script: 0x72, flags: 0x0},
+ 48: {lang: 0x213, script: 0x57, flags: 0x0},
+ 49: {lang: 0x30b, script: 0x1f, flags: 0x0},
+ 50: {lang: 0x242, script: 0x5, flags: 0x0},
+ 51: {lang: 0x529, script: 0x39, flags: 0x0},
+ 52: {lang: 0x3c0, script: 0x57, flags: 0x0},
+ 53: {lang: 0x3a, script: 0x5, flags: 0x0},
+ 54: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 55: {lang: 0x2ed, script: 0x57, flags: 0x0},
+ 56: {lang: 0x4b4, script: 0x5, flags: 0x0},
+ 57: {lang: 0x88, script: 0x21, flags: 0x0},
+ 58: {lang: 0x4b4, script: 0x5, flags: 0x0},
+ 59: {lang: 0x4b4, script: 0x5, flags: 0x0},
+ 60: {lang: 0xbe, script: 0x21, flags: 0x0},
+ 61: {lang: 0x3dc, script: 0x57, flags: 0x0},
+ 62: {lang: 0x7e, script: 0x1f, flags: 0x0},
+ 63: {lang: 0x3e2, script: 0x1f, flags: 0x0},
+ 64: {lang: 0x267, script: 0x57, flags: 0x0},
+ 65: {lang: 0x444, script: 0x57, flags: 0x0},
+ 66: {lang: 0x512, script: 0x3b, flags: 0x0},
+ 67: {lang: 0x412, script: 0x57, flags: 0x0},
+ 68: {lang: 0x4ae, script: 0x1f, flags: 0x0},
+ 69: {lang: 0x3a, script: 0x5, flags: 0x0},
+ 70: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 71: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 72: {lang: 0x35, script: 0x5, flags: 0x0},
+ 73: {lang: 0x46b, script: 0xdf, flags: 0x0},
+ 74: {lang: 0x2ec, script: 0x5, flags: 0x0},
+ 75: {lang: 0x30f, script: 0x72, flags: 0x0},
+ 76: {lang: 0x467, script: 0x1f, flags: 0x0},
+ 77: {lang: 0x148, script: 0x5, flags: 0x0},
+ 78: {lang: 0x3a, script: 0x5, flags: 0x0},
+ 79: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 80: {lang: 0x48a, script: 0x57, flags: 0x0},
+ 81: {lang: 0x58, script: 0x5, flags: 0x0},
+ 82: {lang: 0x219, script: 0x1f, flags: 0x0},
+ 83: {lang: 0x81, script: 0x31, flags: 0x0},
+ 84: {lang: 0x529, script: 0x39, flags: 0x0},
+ 85: {lang: 0x48c, script: 0x57, flags: 0x0},
+ 86: {lang: 0x4ae, script: 0x1f, flags: 0x0},
+ 87: {lang: 0x512, script: 0x3b, flags: 0x0},
+ 88: {lang: 0x3b3, script: 0x57, flags: 0x0},
+ 89: {lang: 0x431, script: 0x57, flags: 0x0},
+ 90: {lang: 0x432, script: 0x1f, flags: 0x0},
+ 91: {lang: 0x15e, script: 0x57, flags: 0x0},
+ 92: {lang: 0x446, script: 0x5, flags: 0x0},
}
type likelyTag struct {
@@ -3247,37 +3257,38 @@ type likelyTag struct {
// Size: 198 bytes, 33 elements
var likelyRegionGroup = [33]likelyTag{
- 1: {lang: 0x138, region: 0xd6, script: 0x55},
- 2: {lang: 0x138, region: 0x135, script: 0x55},
- 3: {lang: 0x3be, region: 0x41, script: 0x55},
- 4: {lang: 0x138, region: 0x2f, script: 0x55},
- 5: {lang: 0x138, region: 0xd6, script: 0x55},
- 6: {lang: 0x13d, region: 0xcf, script: 0x55},
- 7: {lang: 0x443, region: 0x12f, script: 0x55},
+ 1: {lang: 0x139, region: 0xd6, script: 0x57},
+ 2: {lang: 0x139, region: 0x135, script: 0x57},
+ 3: {lang: 0x3c0, region: 0x41, script: 0x57},
+ 4: {lang: 0x139, region: 0x2f, script: 0x57},
+ 5: {lang: 0x139, region: 0xd6, script: 0x57},
+ 6: {lang: 0x13e, region: 0xcf, script: 0x57},
+ 7: {lang: 0x445, region: 0x12f, script: 0x57},
8: {lang: 0x3a, region: 0x6b, script: 0x5},
- 9: {lang: 0x443, region: 0x4b, script: 0x55},
- 10: {lang: 0x138, region: 0x161, script: 0x55},
- 11: {lang: 0x138, region: 0x135, script: 0x55},
- 12: {lang: 0x138, region: 0x135, script: 0x55},
- 13: {lang: 0x13d, region: 0x59, script: 0x55},
- 14: {lang: 0x527, region: 0x53, script: 0x37},
- 15: {lang: 0x1bc, region: 0x99, script: 0x20},
- 16: {lang: 0x1df, region: 0x95, script: 0x55},
- 17: {lang: 0x1f7, region: 0x9e, script: 0x55},
- 18: {lang: 0x138, region: 0x2f, script: 0x55},
- 19: {lang: 0x138, region: 0xe6, script: 0x55},
- 20: {lang: 0x138, region: 0x8a, script: 0x55},
- 21: {lang: 0x419, region: 0x142, script: 0x55},
- 22: {lang: 0x527, region: 0x53, script: 0x37},
- 23: {lang: 0x4ba, region: 0x137, script: 0x55},
+ 9: {lang: 0x445, region: 0x4b, script: 0x57},
+ 10: {lang: 0x139, region: 0x161, script: 0x57},
+ 11: {lang: 0x139, region: 0x135, script: 0x57},
+ 12: {lang: 0x139, region: 0x135, script: 0x57},
+ 13: {lang: 0x13e, region: 0x59, script: 0x57},
+ 14: {lang: 0x529, region: 0x53, script: 0x38},
+ 15: {lang: 0x1be, region: 0x99, script: 0x21},
+ 16: {lang: 0x1e1, region: 0x95, script: 0x57},
+ 17: {lang: 0x1f9, region: 0x9e, script: 0x57},
+ 18: {lang: 0x139, region: 0x2f, script: 0x57},
+ 19: {lang: 0x139, region: 0xe6, script: 0x57},
+ 20: {lang: 0x139, region: 0x8a, script: 0x57},
+ 21: {lang: 0x41b, region: 0x142, script: 0x57},
+ 22: {lang: 0x529, region: 0x53, script: 0x38},
+ 23: {lang: 0x4bc, region: 0x137, script: 0x57},
24: {lang: 0x3a, region: 0x108, script: 0x5},
- 25: {lang: 0x3e0, region: 0x106, script: 0x1e},
- 26: {lang: 0x3e0, region: 0x106, script: 0x1e},
- 27: {lang: 0x138, region: 0x7b, script: 0x55},
- 28: {lang: 0x10c, region: 0x60, script: 0x55},
- 30: {lang: 0x13d, region: 0x1f, script: 0x55},
- 31: {lang: 0x138, region: 0x9a, script: 0x55},
- 32: {lang: 0x138, region: 0x7b, script: 0x55},
+ 25: {lang: 0x3e2, region: 0x106, script: 0x1f},
+ 26: {lang: 0x3e2, region: 0x106, script: 0x1f},
+ 27: {lang: 0x139, region: 0x7b, script: 0x57},
+ 28: {lang: 0x10d, region: 0x60, script: 0x57},
+ 29: {lang: 0x139, region: 0xd6, script: 0x57},
+ 30: {lang: 0x13e, region: 0x1f, script: 0x57},
+ 31: {lang: 0x139, region: 0x9a, script: 0x57},
+ 32: {lang: 0x139, region: 0x7b, script: 0x57},
}
// Size: 358 bytes, 358 elements
@@ -3337,9 +3348,9 @@ var regionToGroups = [358]uint8{
// Size: 18 bytes, 3 elements
var paradigmLocales = [3][3]uint16{
- 0: [3]uint16{0x138, 0x0, 0x7b},
- 1: [3]uint16{0x13d, 0x0, 0x1f},
- 2: [3]uint16{0x3be, 0x41, 0xee},
+ 0: [3]uint16{0x139, 0x0, 0x7b},
+ 1: [3]uint16{0x13e, 0x0, 0x1f},
+ 2: [3]uint16{0x3c0, 0x41, 0xee},
}
type mutualIntelligibility struct {
@@ -3369,183 +3380,183 @@ type regionIntelligibility struct {
// whether the intelligibility goes one or both ways.
// Size: 678 bytes, 113 elements
var matchLang = [113]mutualIntelligibility{
- 0: {want: 0x1cf, have: 0xb7, distance: 0x4, oneway: false},
- 1: {want: 0x405, have: 0xb7, distance: 0x4, oneway: false},
- 2: {want: 0x405, have: 0x1cf, distance: 0x4, oneway: false},
- 3: {want: 0x405, have: 0x430, distance: 0x4, oneway: false},
- 4: {want: 0x438, have: 0x1, distance: 0x4, oneway: false},
- 5: {want: 0x1a1, have: 0x10c, distance: 0x4, oneway: true},
- 6: {want: 0x293, have: 0x10c, distance: 0x4, oneway: true},
- 7: {want: 0x100, have: 0x36d, distance: 0x8, oneway: false},
- 8: {want: 0x100, have: 0x345, distance: 0x8, oneway: false},
- 9: {want: 0x5, have: 0x3e0, distance: 0xa, oneway: true},
- 10: {want: 0xd, have: 0x138, distance: 0xa, oneway: true},
- 11: {want: 0x16, have: 0x365, distance: 0xa, oneway: true},
- 12: {want: 0x21, have: 0x138, distance: 0xa, oneway: true},
- 13: {want: 0x56, have: 0x13d, distance: 0xa, oneway: true},
- 14: {want: 0x58, have: 0x3e0, distance: 0xa, oneway: true},
- 15: {want: 0x71, have: 0x3e0, distance: 0xa, oneway: true},
- 16: {want: 0x75, have: 0x138, distance: 0xa, oneway: true},
- 17: {want: 0x82, have: 0x1bc, distance: 0xa, oneway: true},
- 18: {want: 0xa5, have: 0x138, distance: 0xa, oneway: true},
- 19: {want: 0xb2, have: 0x15d, distance: 0xa, oneway: true},
- 20: {want: 0xdd, have: 0x152, distance: 0xa, oneway: true},
- 21: {want: 0xe5, have: 0x138, distance: 0xa, oneway: true},
+ 0: {want: 0x1d1, have: 0xb7, distance: 0x4, oneway: false},
+ 1: {want: 0x407, have: 0xb7, distance: 0x4, oneway: false},
+ 2: {want: 0x407, have: 0x1d1, distance: 0x4, oneway: false},
+ 3: {want: 0x407, have: 0x432, distance: 0x4, oneway: false},
+ 4: {want: 0x43a, have: 0x1, distance: 0x4, oneway: false},
+ 5: {want: 0x1a3, have: 0x10d, distance: 0x4, oneway: true},
+ 6: {want: 0x295, have: 0x10d, distance: 0x4, oneway: true},
+ 7: {want: 0x101, have: 0x36f, distance: 0x8, oneway: false},
+ 8: {want: 0x101, have: 0x347, distance: 0x8, oneway: false},
+ 9: {want: 0x5, have: 0x3e2, distance: 0xa, oneway: true},
+ 10: {want: 0xd, have: 0x139, distance: 0xa, oneway: true},
+ 11: {want: 0x16, have: 0x367, distance: 0xa, oneway: true},
+ 12: {want: 0x21, have: 0x139, distance: 0xa, oneway: true},
+ 13: {want: 0x56, have: 0x13e, distance: 0xa, oneway: true},
+ 14: {want: 0x58, have: 0x3e2, distance: 0xa, oneway: true},
+ 15: {want: 0x71, have: 0x3e2, distance: 0xa, oneway: true},
+ 16: {want: 0x75, have: 0x139, distance: 0xa, oneway: true},
+ 17: {want: 0x82, have: 0x1be, distance: 0xa, oneway: true},
+ 18: {want: 0xa5, have: 0x139, distance: 0xa, oneway: true},
+ 19: {want: 0xb2, have: 0x15e, distance: 0xa, oneway: true},
+ 20: {want: 0xdd, have: 0x153, distance: 0xa, oneway: true},
+ 21: {want: 0xe5, have: 0x139, distance: 0xa, oneway: true},
22: {want: 0xe9, have: 0x3a, distance: 0xa, oneway: true},
- 23: {want: 0xef, have: 0x15d, distance: 0xa, oneway: true},
- 24: {want: 0xf8, have: 0x15d, distance: 0xa, oneway: true},
- 25: {want: 0xff, have: 0x138, distance: 0xa, oneway: true},
- 26: {want: 0x12f, have: 0x138, distance: 0xa, oneway: true},
- 27: {want: 0x13b, have: 0x138, distance: 0xa, oneway: true},
- 28: {want: 0x13f, have: 0x150, distance: 0xa, oneway: true},
- 29: {want: 0x144, have: 0x13d, distance: 0xa, oneway: true},
- 30: {want: 0x157, have: 0x100, distance: 0xa, oneway: true},
- 31: {want: 0x16c, have: 0x365, distance: 0xa, oneway: true},
- 32: {want: 0x16d, have: 0x138, distance: 0xa, oneway: true},
- 33: {want: 0x16e, have: 0x138, distance: 0xa, oneway: true},
- 34: {want: 0x17c, have: 0x138, distance: 0xa, oneway: true},
- 35: {want: 0x18e, have: 0x13d, distance: 0xa, oneway: true},
- 36: {want: 0x192, have: 0x13d, distance: 0xa, oneway: true},
- 37: {want: 0x1a2, have: 0x1bc, distance: 0xa, oneway: true},
- 38: {want: 0x1b2, have: 0x138, distance: 0xa, oneway: true},
- 39: {want: 0x1b6, have: 0x138, distance: 0xa, oneway: true},
- 40: {want: 0x1d2, have: 0x15d, distance: 0xa, oneway: true},
- 41: {want: 0x1d5, have: 0x3e0, distance: 0xa, oneway: true},
- 42: {want: 0x1d7, have: 0x138, distance: 0xa, oneway: true},
- 43: {want: 0x1e5, have: 0x138, distance: 0xa, oneway: true},
- 44: {want: 0x1f6, have: 0x138, distance: 0xa, oneway: true},
- 45: {want: 0x20c, have: 0x1df, distance: 0xa, oneway: true},
- 46: {want: 0x20e, have: 0x138, distance: 0xa, oneway: true},
- 47: {want: 0x22b, have: 0x15d, distance: 0xa, oneway: true},
- 48: {want: 0x240, have: 0x3e0, distance: 0xa, oneway: true},
- 49: {want: 0x248, have: 0x138, distance: 0xa, oneway: true},
- 50: {want: 0x24f, have: 0x138, distance: 0xa, oneway: true},
- 51: {want: 0x263, have: 0x138, distance: 0xa, oneway: true},
- 52: {want: 0x272, have: 0x488, distance: 0xa, oneway: true},
- 53: {want: 0x288, have: 0x3e0, distance: 0xa, oneway: true},
- 54: {want: 0x28c, have: 0x1f7, distance: 0xa, oneway: true},
- 55: {want: 0x2a1, have: 0x138, distance: 0xa, oneway: true},
- 56: {want: 0x2b3, have: 0x15d, distance: 0xa, oneway: true},
- 57: {want: 0x2b6, have: 0x138, distance: 0xa, oneway: true},
- 58: {want: 0x2bc, have: 0x138, distance: 0xa, oneway: true},
- 59: {want: 0x2c1, have: 0x15d, distance: 0xa, oneway: true},
- 60: {want: 0x2eb, have: 0x138, distance: 0xa, oneway: true},
- 61: {want: 0x2ef, have: 0x15d, distance: 0xa, oneway: true},
- 62: {want: 0x2f8, have: 0x138, distance: 0xa, oneway: true},
- 63: {want: 0x2fd, have: 0x7e, distance: 0xa, oneway: true},
- 64: {want: 0x302, have: 0x138, distance: 0xa, oneway: true},
- 65: {want: 0x309, have: 0x3e0, distance: 0xa, oneway: true},
- 66: {want: 0x319, have: 0x1bc, distance: 0xa, oneway: true},
- 67: {want: 0x31d, have: 0x1df, distance: 0xa, oneway: true},
- 68: {want: 0x31e, have: 0x138, distance: 0xa, oneway: true},
- 69: {want: 0x32f, have: 0x138, distance: 0xa, oneway: true},
- 70: {want: 0x34f, have: 0x138, distance: 0xa, oneway: true},
- 71: {want: 0x368, have: 0x345, distance: 0xa, oneway: false},
- 72: {want: 0x368, have: 0x36d, distance: 0xa, oneway: true},
- 73: {want: 0x378, have: 0x138, distance: 0xa, oneway: true},
- 74: {want: 0x385, have: 0x138, distance: 0xa, oneway: true},
- 75: {want: 0x387, have: 0x138, distance: 0xa, oneway: true},
- 76: {want: 0x389, have: 0x15d, distance: 0xa, oneway: true},
- 77: {want: 0x38e, have: 0x138, distance: 0xa, oneway: true},
- 78: {want: 0x393, have: 0x138, distance: 0xa, oneway: true},
- 79: {want: 0x39b, have: 0x138, distance: 0xa, oneway: true},
- 80: {want: 0x3a3, have: 0x138, distance: 0xa, oneway: true},
- 81: {want: 0x3bc, have: 0x138, distance: 0xa, oneway: true},
- 82: {want: 0x3c2, have: 0x13d, distance: 0xa, oneway: true},
- 83: {want: 0x3d2, have: 0x10c, distance: 0xa, oneway: true},
- 84: {want: 0x3d7, have: 0x138, distance: 0xa, oneway: true},
- 85: {want: 0x3e3, have: 0x15d, distance: 0xa, oneway: true},
- 86: {want: 0x3e7, have: 0x1bc, distance: 0xa, oneway: true},
- 87: {want: 0x3f8, have: 0x138, distance: 0xa, oneway: true},
- 88: {want: 0x40a, have: 0x138, distance: 0xa, oneway: true},
- 89: {want: 0x421, have: 0x138, distance: 0xa, oneway: true},
- 90: {want: 0x427, have: 0x138, distance: 0xa, oneway: true},
- 91: {want: 0x42f, have: 0x138, distance: 0xa, oneway: true},
- 92: {want: 0x439, have: 0x138, distance: 0xa, oneway: true},
- 93: {want: 0x43c, have: 0x1df, distance: 0xa, oneway: true},
- 94: {want: 0x443, have: 0x138, distance: 0xa, oneway: true},
- 95: {want: 0x44e, have: 0x138, distance: 0xa, oneway: true},
- 96: {want: 0x45f, have: 0x138, distance: 0xa, oneway: true},
- 97: {want: 0x465, have: 0x3e0, distance: 0xa, oneway: true},
- 98: {want: 0x46d, have: 0x138, distance: 0xa, oneway: true},
- 99: {want: 0x474, have: 0x3e0, distance: 0xa, oneway: true},
- 100: {want: 0x3880, have: 0x138, distance: 0xa, oneway: true},
- 101: {want: 0x47e, have: 0x138, distance: 0xa, oneway: true},
- 102: {want: 0x480, have: 0x138, distance: 0xa, oneway: true},
- 103: {want: 0x492, have: 0x3e0, distance: 0xa, oneway: true},
- 104: {want: 0x49b, have: 0x138, distance: 0xa, oneway: true},
- 105: {want: 0x4aa, have: 0x527, distance: 0xa, oneway: true},
- 106: {want: 0x4b2, have: 0x138, distance: 0xa, oneway: true},
- 107: {want: 0x4ba, have: 0x3e0, distance: 0xa, oneway: true},
- 108: {want: 0x4e3, have: 0x15d, distance: 0xa, oneway: true},
- 109: {want: 0x4f0, have: 0x138, distance: 0xa, oneway: true},
- 110: {want: 0x510, have: 0x138, distance: 0xa, oneway: true},
- 111: {want: 0x516, have: 0x138, distance: 0xa, oneway: true},
- 112: {want: 0x52c, have: 0x138, distance: 0xa, oneway: true},
+ 23: {want: 0xf0, have: 0x15e, distance: 0xa, oneway: true},
+ 24: {want: 0xf9, have: 0x15e, distance: 0xa, oneway: true},
+ 25: {want: 0x100, have: 0x139, distance: 0xa, oneway: true},
+ 26: {want: 0x130, have: 0x139, distance: 0xa, oneway: true},
+ 27: {want: 0x13c, have: 0x139, distance: 0xa, oneway: true},
+ 28: {want: 0x140, have: 0x151, distance: 0xa, oneway: true},
+ 29: {want: 0x145, have: 0x13e, distance: 0xa, oneway: true},
+ 30: {want: 0x158, have: 0x101, distance: 0xa, oneway: true},
+ 31: {want: 0x16d, have: 0x367, distance: 0xa, oneway: true},
+ 32: {want: 0x16e, have: 0x139, distance: 0xa, oneway: true},
+ 33: {want: 0x16f, have: 0x139, distance: 0xa, oneway: true},
+ 34: {want: 0x17e, have: 0x139, distance: 0xa, oneway: true},
+ 35: {want: 0x190, have: 0x13e, distance: 0xa, oneway: true},
+ 36: {want: 0x194, have: 0x13e, distance: 0xa, oneway: true},
+ 37: {want: 0x1a4, have: 0x1be, distance: 0xa, oneway: true},
+ 38: {want: 0x1b4, have: 0x139, distance: 0xa, oneway: true},
+ 39: {want: 0x1b8, have: 0x139, distance: 0xa, oneway: true},
+ 40: {want: 0x1d4, have: 0x15e, distance: 0xa, oneway: true},
+ 41: {want: 0x1d7, have: 0x3e2, distance: 0xa, oneway: true},
+ 42: {want: 0x1d9, have: 0x139, distance: 0xa, oneway: true},
+ 43: {want: 0x1e7, have: 0x139, distance: 0xa, oneway: true},
+ 44: {want: 0x1f8, have: 0x139, distance: 0xa, oneway: true},
+ 45: {want: 0x20e, have: 0x1e1, distance: 0xa, oneway: true},
+ 46: {want: 0x210, have: 0x139, distance: 0xa, oneway: true},
+ 47: {want: 0x22d, have: 0x15e, distance: 0xa, oneway: true},
+ 48: {want: 0x242, have: 0x3e2, distance: 0xa, oneway: true},
+ 49: {want: 0x24a, have: 0x139, distance: 0xa, oneway: true},
+ 50: {want: 0x251, have: 0x139, distance: 0xa, oneway: true},
+ 51: {want: 0x265, have: 0x139, distance: 0xa, oneway: true},
+ 52: {want: 0x274, have: 0x48a, distance: 0xa, oneway: true},
+ 53: {want: 0x28a, have: 0x3e2, distance: 0xa, oneway: true},
+ 54: {want: 0x28e, have: 0x1f9, distance: 0xa, oneway: true},
+ 55: {want: 0x2a3, have: 0x139, distance: 0xa, oneway: true},
+ 56: {want: 0x2b5, have: 0x15e, distance: 0xa, oneway: true},
+ 57: {want: 0x2b8, have: 0x139, distance: 0xa, oneway: true},
+ 58: {want: 0x2be, have: 0x139, distance: 0xa, oneway: true},
+ 59: {want: 0x2c3, have: 0x15e, distance: 0xa, oneway: true},
+ 60: {want: 0x2ed, have: 0x139, distance: 0xa, oneway: true},
+ 61: {want: 0x2f1, have: 0x15e, distance: 0xa, oneway: true},
+ 62: {want: 0x2fa, have: 0x139, distance: 0xa, oneway: true},
+ 63: {want: 0x2ff, have: 0x7e, distance: 0xa, oneway: true},
+ 64: {want: 0x304, have: 0x139, distance: 0xa, oneway: true},
+ 65: {want: 0x30b, have: 0x3e2, distance: 0xa, oneway: true},
+ 66: {want: 0x31b, have: 0x1be, distance: 0xa, oneway: true},
+ 67: {want: 0x31f, have: 0x1e1, distance: 0xa, oneway: true},
+ 68: {want: 0x320, have: 0x139, distance: 0xa, oneway: true},
+ 69: {want: 0x331, have: 0x139, distance: 0xa, oneway: true},
+ 70: {want: 0x351, have: 0x139, distance: 0xa, oneway: true},
+ 71: {want: 0x36a, have: 0x347, distance: 0xa, oneway: false},
+ 72: {want: 0x36a, have: 0x36f, distance: 0xa, oneway: true},
+ 73: {want: 0x37a, have: 0x139, distance: 0xa, oneway: true},
+ 74: {want: 0x387, have: 0x139, distance: 0xa, oneway: true},
+ 75: {want: 0x389, have: 0x139, distance: 0xa, oneway: true},
+ 76: {want: 0x38b, have: 0x15e, distance: 0xa, oneway: true},
+ 77: {want: 0x390, have: 0x139, distance: 0xa, oneway: true},
+ 78: {want: 0x395, have: 0x139, distance: 0xa, oneway: true},
+ 79: {want: 0x39d, have: 0x139, distance: 0xa, oneway: true},
+ 80: {want: 0x3a5, have: 0x139, distance: 0xa, oneway: true},
+ 81: {want: 0x3be, have: 0x139, distance: 0xa, oneway: true},
+ 82: {want: 0x3c4, have: 0x13e, distance: 0xa, oneway: true},
+ 83: {want: 0x3d4, have: 0x10d, distance: 0xa, oneway: true},
+ 84: {want: 0x3d9, have: 0x139, distance: 0xa, oneway: true},
+ 85: {want: 0x3e5, have: 0x15e, distance: 0xa, oneway: true},
+ 86: {want: 0x3e9, have: 0x1be, distance: 0xa, oneway: true},
+ 87: {want: 0x3fa, have: 0x139, distance: 0xa, oneway: true},
+ 88: {want: 0x40c, have: 0x139, distance: 0xa, oneway: true},
+ 89: {want: 0x423, have: 0x139, distance: 0xa, oneway: true},
+ 90: {want: 0x429, have: 0x139, distance: 0xa, oneway: true},
+ 91: {want: 0x431, have: 0x139, distance: 0xa, oneway: true},
+ 92: {want: 0x43b, have: 0x139, distance: 0xa, oneway: true},
+ 93: {want: 0x43e, have: 0x1e1, distance: 0xa, oneway: true},
+ 94: {want: 0x445, have: 0x139, distance: 0xa, oneway: true},
+ 95: {want: 0x450, have: 0x139, distance: 0xa, oneway: true},
+ 96: {want: 0x461, have: 0x139, distance: 0xa, oneway: true},
+ 97: {want: 0x467, have: 0x3e2, distance: 0xa, oneway: true},
+ 98: {want: 0x46f, have: 0x139, distance: 0xa, oneway: true},
+ 99: {want: 0x476, have: 0x3e2, distance: 0xa, oneway: true},
+ 100: {want: 0x3883, have: 0x139, distance: 0xa, oneway: true},
+ 101: {want: 0x480, have: 0x139, distance: 0xa, oneway: true},
+ 102: {want: 0x482, have: 0x139, distance: 0xa, oneway: true},
+ 103: {want: 0x494, have: 0x3e2, distance: 0xa, oneway: true},
+ 104: {want: 0x49d, have: 0x139, distance: 0xa, oneway: true},
+ 105: {want: 0x4ac, have: 0x529, distance: 0xa, oneway: true},
+ 106: {want: 0x4b4, have: 0x139, distance: 0xa, oneway: true},
+ 107: {want: 0x4bc, have: 0x3e2, distance: 0xa, oneway: true},
+ 108: {want: 0x4e5, have: 0x15e, distance: 0xa, oneway: true},
+ 109: {want: 0x4f2, have: 0x139, distance: 0xa, oneway: true},
+ 110: {want: 0x512, have: 0x139, distance: 0xa, oneway: true},
+ 111: {want: 0x518, have: 0x139, distance: 0xa, oneway: true},
+ 112: {want: 0x52f, have: 0x139, distance: 0xa, oneway: true},
}
// matchScript holds pairs of scriptIDs where readers of one script
// can typically also read the other. Each is associated with a confidence.
// Size: 208 bytes, 26 elements
var matchScript = [26]scriptIntelligibility{
- 0: {wantLang: 0x430, haveLang: 0x430, wantScript: 0x55, haveScript: 0x1e, distance: 0x5},
- 1: {wantLang: 0x430, haveLang: 0x430, wantScript: 0x1e, haveScript: 0x55, distance: 0x5},
- 2: {wantLang: 0x58, haveLang: 0x3e0, wantScript: 0x55, haveScript: 0x1e, distance: 0xa},
- 3: {wantLang: 0xa5, haveLang: 0x138, wantScript: 0xe, haveScript: 0x55, distance: 0xa},
- 4: {wantLang: 0x1d5, haveLang: 0x3e0, wantScript: 0x8, haveScript: 0x1e, distance: 0xa},
- 5: {wantLang: 0x20e, haveLang: 0x138, wantScript: 0x2a, haveScript: 0x55, distance: 0xa},
- 6: {wantLang: 0x248, haveLang: 0x138, wantScript: 0x49, haveScript: 0x55, distance: 0xa},
- 7: {wantLang: 0x24f, haveLang: 0x138, wantScript: 0x4d, haveScript: 0x55, distance: 0xa},
- 8: {wantLang: 0x2b6, haveLang: 0x138, wantScript: 0x52, haveScript: 0x55, distance: 0xa},
- 9: {wantLang: 0x302, haveLang: 0x138, wantScript: 0x69, haveScript: 0x55, distance: 0xa},
- 10: {wantLang: 0x32f, haveLang: 0x138, wantScript: 0x70, haveScript: 0x55, distance: 0xa},
- 11: {wantLang: 0x34f, haveLang: 0x138, wantScript: 0x20, haveScript: 0x55, distance: 0xa},
- 12: {wantLang: 0x393, haveLang: 0x138, wantScript: 0x7a, haveScript: 0x55, distance: 0xa},
- 13: {wantLang: 0x39b, haveLang: 0x138, wantScript: 0x32, haveScript: 0x55, distance: 0xa},
- 14: {wantLang: 0x3bc, haveLang: 0x138, wantScript: 0x5, haveScript: 0x55, distance: 0xa},
- 15: {wantLang: 0x3f8, haveLang: 0x138, wantScript: 0x5, haveScript: 0x55, distance: 0xa},
- 16: {wantLang: 0x40a, haveLang: 0x138, wantScript: 0xc6, haveScript: 0x55, distance: 0xa},
- 17: {wantLang: 0x44e, haveLang: 0x138, wantScript: 0xd3, haveScript: 0x55, distance: 0xa},
- 18: {wantLang: 0x45f, haveLang: 0x138, wantScript: 0xd6, haveScript: 0x55, distance: 0xa},
- 19: {wantLang: 0x46d, haveLang: 0x138, wantScript: 0x28, haveScript: 0x55, distance: 0xa},
- 20: {wantLang: 0x474, haveLang: 0x3e0, wantScript: 0x55, haveScript: 0x1e, distance: 0xa},
- 21: {wantLang: 0x4b2, haveLang: 0x138, wantScript: 0x5, haveScript: 0x55, distance: 0xa},
- 22: {wantLang: 0x4ba, haveLang: 0x3e0, wantScript: 0x55, haveScript: 0x1e, distance: 0xa},
- 23: {wantLang: 0x510, haveLang: 0x138, wantScript: 0x3a, haveScript: 0x55, distance: 0xa},
- 24: {wantLang: 0x527, haveLang: 0x527, wantScript: 0x37, haveScript: 0x38, distance: 0xf},
- 25: {wantLang: 0x527, haveLang: 0x527, wantScript: 0x38, haveScript: 0x37, distance: 0x13},
+ 0: {wantLang: 0x432, haveLang: 0x432, wantScript: 0x57, haveScript: 0x1f, distance: 0x5},
+ 1: {wantLang: 0x432, haveLang: 0x432, wantScript: 0x1f, haveScript: 0x57, distance: 0x5},
+ 2: {wantLang: 0x58, haveLang: 0x3e2, wantScript: 0x57, haveScript: 0x1f, distance: 0xa},
+ 3: {wantLang: 0xa5, haveLang: 0x139, wantScript: 0xe, haveScript: 0x57, distance: 0xa},
+ 4: {wantLang: 0x1d7, haveLang: 0x3e2, wantScript: 0x8, haveScript: 0x1f, distance: 0xa},
+ 5: {wantLang: 0x210, haveLang: 0x139, wantScript: 0x2b, haveScript: 0x57, distance: 0xa},
+ 6: {wantLang: 0x24a, haveLang: 0x139, wantScript: 0x4b, haveScript: 0x57, distance: 0xa},
+ 7: {wantLang: 0x251, haveLang: 0x139, wantScript: 0x4f, haveScript: 0x57, distance: 0xa},
+ 8: {wantLang: 0x2b8, haveLang: 0x139, wantScript: 0x54, haveScript: 0x57, distance: 0xa},
+ 9: {wantLang: 0x304, haveLang: 0x139, wantScript: 0x6b, haveScript: 0x57, distance: 0xa},
+ 10: {wantLang: 0x331, haveLang: 0x139, wantScript: 0x72, haveScript: 0x57, distance: 0xa},
+ 11: {wantLang: 0x351, haveLang: 0x139, wantScript: 0x21, haveScript: 0x57, distance: 0xa},
+ 12: {wantLang: 0x395, haveLang: 0x139, wantScript: 0x7d, haveScript: 0x57, distance: 0xa},
+ 13: {wantLang: 0x39d, haveLang: 0x139, wantScript: 0x33, haveScript: 0x57, distance: 0xa},
+ 14: {wantLang: 0x3be, haveLang: 0x139, wantScript: 0x5, haveScript: 0x57, distance: 0xa},
+ 15: {wantLang: 0x3fa, haveLang: 0x139, wantScript: 0x5, haveScript: 0x57, distance: 0xa},
+ 16: {wantLang: 0x40c, haveLang: 0x139, wantScript: 0xca, haveScript: 0x57, distance: 0xa},
+ 17: {wantLang: 0x450, haveLang: 0x139, wantScript: 0xd7, haveScript: 0x57, distance: 0xa},
+ 18: {wantLang: 0x461, haveLang: 0x139, wantScript: 0xda, haveScript: 0x57, distance: 0xa},
+ 19: {wantLang: 0x46f, haveLang: 0x139, wantScript: 0x29, haveScript: 0x57, distance: 0xa},
+ 20: {wantLang: 0x476, haveLang: 0x3e2, wantScript: 0x57, haveScript: 0x1f, distance: 0xa},
+ 21: {wantLang: 0x4b4, haveLang: 0x139, wantScript: 0x5, haveScript: 0x57, distance: 0xa},
+ 22: {wantLang: 0x4bc, haveLang: 0x3e2, wantScript: 0x57, haveScript: 0x1f, distance: 0xa},
+ 23: {wantLang: 0x512, haveLang: 0x139, wantScript: 0x3b, haveScript: 0x57, distance: 0xa},
+ 24: {wantLang: 0x529, haveLang: 0x529, wantScript: 0x38, haveScript: 0x39, distance: 0xf},
+ 25: {wantLang: 0x529, haveLang: 0x529, wantScript: 0x39, haveScript: 0x38, distance: 0x13},
}
// Size: 90 bytes, 15 elements
var matchRegion = [15]regionIntelligibility{
0: {lang: 0x3a, script: 0x0, group: 0x4, distance: 0x4},
1: {lang: 0x3a, script: 0x0, group: 0x84, distance: 0x4},
- 2: {lang: 0x138, script: 0x0, group: 0x1, distance: 0x4},
- 3: {lang: 0x138, script: 0x0, group: 0x81, distance: 0x4},
- 4: {lang: 0x13d, script: 0x0, group: 0x3, distance: 0x4},
- 5: {lang: 0x13d, script: 0x0, group: 0x83, distance: 0x4},
- 6: {lang: 0x3be, script: 0x0, group: 0x3, distance: 0x4},
- 7: {lang: 0x3be, script: 0x0, group: 0x83, distance: 0x4},
- 8: {lang: 0x527, script: 0x38, group: 0x2, distance: 0x4},
- 9: {lang: 0x527, script: 0x38, group: 0x82, distance: 0x4},
+ 2: {lang: 0x139, script: 0x0, group: 0x1, distance: 0x4},
+ 3: {lang: 0x139, script: 0x0, group: 0x81, distance: 0x4},
+ 4: {lang: 0x13e, script: 0x0, group: 0x3, distance: 0x4},
+ 5: {lang: 0x13e, script: 0x0, group: 0x83, distance: 0x4},
+ 6: {lang: 0x3c0, script: 0x0, group: 0x3, distance: 0x4},
+ 7: {lang: 0x3c0, script: 0x0, group: 0x83, distance: 0x4},
+ 8: {lang: 0x529, script: 0x39, group: 0x2, distance: 0x4},
+ 9: {lang: 0x529, script: 0x39, group: 0x82, distance: 0x4},
10: {lang: 0x3a, script: 0x0, group: 0x80, distance: 0x5},
- 11: {lang: 0x138, script: 0x0, group: 0x80, distance: 0x5},
- 12: {lang: 0x13d, script: 0x0, group: 0x80, distance: 0x5},
- 13: {lang: 0x3be, script: 0x0, group: 0x80, distance: 0x5},
- 14: {lang: 0x527, script: 0x38, group: 0x80, distance: 0x5},
+ 11: {lang: 0x139, script: 0x0, group: 0x80, distance: 0x5},
+ 12: {lang: 0x13e, script: 0x0, group: 0x80, distance: 0x5},
+ 13: {lang: 0x3c0, script: 0x0, group: 0x80, distance: 0x5},
+ 14: {lang: 0x529, script: 0x39, group: 0x80, distance: 0x5},
}
// Size: 264 bytes, 33 elements
var regionContainment = [33]uint64{
// Entry 0 - 1F
- 0x00000001dfffffff, 0x00000000000007a2, 0x0000000000003044, 0x0000000000000008,
+ 0x00000001ffffffff, 0x00000000200007a2, 0x0000000000003044, 0x0000000000000008,
0x00000000803c0010, 0x0000000000000020, 0x0000000000000040, 0x0000000000000080,
0x0000000000000100, 0x0000000000000200, 0x0000000000000400, 0x000000004000384c,
0x0000000000001000, 0x0000000000002000, 0x0000000000004000, 0x0000000000008000,
0x0000000000010000, 0x0000000000020000, 0x0000000000040000, 0x0000000000080000,
0x0000000000100000, 0x0000000000200000, 0x0000000001c1c000, 0x0000000000800000,
0x0000000001000000, 0x000000001e020000, 0x0000000004000000, 0x0000000008000000,
- 0x0000000010000000, 0x0000000020000000, 0x0000000040002048, 0x0000000080000000,
+ 0x0000000010000000, 0x00000000200006a0, 0x0000000040002048, 0x0000000080000000,
// Entry 20 - 3F
0x0000000100000000,
}
@@ -3614,14 +3625,14 @@ var regionInclusion = [358]uint8{
// Size: 584 bytes, 73 elements
var regionInclusionBits = [73]uint64{
// Entry 0 - 1F
- 0x0000000102400813, 0x00000000000007a3, 0x0000000000003844, 0x0000000040000808,
- 0x00000000803c0011, 0x0000000000000022, 0x0000000040000844, 0x0000000000000082,
- 0x0000000000000102, 0x0000000000000202, 0x0000000000000402, 0x000000004000384d,
+ 0x0000000102400813, 0x00000000200007a3, 0x0000000000003844, 0x0000000040000808,
+ 0x00000000803c0011, 0x0000000020000022, 0x0000000040000844, 0x0000000020000082,
+ 0x0000000000000102, 0x0000000020000202, 0x0000000020000402, 0x000000004000384d,
0x0000000000001804, 0x0000000040002804, 0x0000000000404000, 0x0000000000408000,
0x0000000000410000, 0x0000000002020000, 0x0000000000040010, 0x0000000000080010,
0x0000000000100010, 0x0000000000200010, 0x0000000001c1c001, 0x0000000000c00000,
0x0000000001400000, 0x000000001e020001, 0x0000000006000000, 0x000000000a000000,
- 0x0000000012000000, 0x0000000020000000, 0x0000000040002848, 0x0000000080000010,
+ 0x0000000012000000, 0x00000000200006a2, 0x0000000040002848, 0x0000000080000010,
// Entry 20 - 3F
0x0000000100000001, 0x0000000000000001, 0x0000000080000000, 0x0000000000020000,
0x0000000001000000, 0x0000000000008000, 0x0000000000002000, 0x0000000000000200,
@@ -3630,7 +3641,7 @@ var regionInclusionBits = [73]uint64{
0x0000000000001000, 0x0000000000010000, 0x0000000000000400, 0x0000000004000000,
0x0000000000000040, 0x0000000010000000, 0x0000000000004000, 0x0000000101000000,
0x0000000108000000, 0x0000000000000100, 0x0000000100020000, 0x0000000000080000,
- 0x0000000000100000, 0x0000000000800000, 0x00000001dfffffff, 0x0000000102400fb3,
+ 0x0000000000100000, 0x0000000000800000, 0x00000001ffffffff, 0x0000000122400fb3,
// Entry 40 - 5F
0x00000001827c0813, 0x000000014240385f, 0x0000000103c1c813, 0x000000011e420813,
0x0000000112000001, 0x0000000106000001, 0x0000000101400001, 0x000000010a000001,
@@ -3645,7 +3656,7 @@ var regionInclusionNext = [73]uint8{
0x3e, 0x3f, 0x0b, 0x0b, 0x40, 0x01, 0x0b, 0x01,
0x01, 0x01, 0x01, 0x41, 0x0b, 0x0b, 0x16, 0x16,
0x16, 0x19, 0x04, 0x04, 0x04, 0x04, 0x42, 0x16,
- 0x16, 0x43, 0x19, 0x19, 0x19, 0x1d, 0x0b, 0x04,
+ 0x16, 0x43, 0x19, 0x19, 0x19, 0x01, 0x0b, 0x04,
0x00, 0x00, 0x1f, 0x11, 0x18, 0x0f, 0x0d, 0x09,
0x03, 0x15, 0x44, 0x12, 0x1b, 0x05, 0x45, 0x07,
0x0c, 0x10, 0x0a, 0x1a, 0x06, 0x1c, 0x0e, 0x46,
@@ -3665,11 +3676,11 @@ type parentRel struct {
// Size: 414 bytes, 5 elements
var parents = [5]parentRel{
- 0: {lang: 0x138, script: 0x0, maxScript: 0x55, toRegion: 0x1, fromRegion: []uint16{0x1a, 0x25, 0x26, 0x2f, 0x34, 0x36, 0x3d, 0x42, 0x46, 0x48, 0x49, 0x4a, 0x50, 0x52, 0x5c, 0x5d, 0x61, 0x64, 0x6d, 0x73, 0x74, 0x75, 0x7b, 0x7c, 0x7f, 0x80, 0x81, 0x83, 0x8c, 0x8d, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9f, 0xa0, 0xa4, 0xa7, 0xa9, 0xad, 0xb1, 0xb4, 0xb5, 0xbf, 0xc6, 0xca, 0xcb, 0xcc, 0xce, 0xd0, 0xd2, 0xd5, 0xd6, 0xdd, 0xdf, 0xe0, 0xe6, 0xe7, 0xe8, 0xeb, 0xf0, 0x107, 0x109, 0x10a, 0x10b, 0x10d, 0x10e, 0x112, 0x117, 0x11b, 0x11d, 0x11f, 0x125, 0x129, 0x12c, 0x12d, 0x12f, 0x131, 0x139, 0x13c, 0x13f, 0x142, 0x161, 0x162, 0x164}},
- 1: {lang: 0x138, script: 0x0, maxScript: 0x55, toRegion: 0x1a, fromRegion: []uint16{0x2e, 0x4e, 0x60, 0x63, 0x72, 0xd9, 0x10c, 0x10f}},
- 2: {lang: 0x13d, script: 0x0, maxScript: 0x55, toRegion: 0x1f, fromRegion: []uint16{0x2c, 0x3f, 0x41, 0x48, 0x51, 0x54, 0x56, 0x59, 0x65, 0x69, 0x89, 0x8f, 0xcf, 0xd8, 0xe2, 0xe4, 0xec, 0xf1, 0x11a, 0x135, 0x136, 0x13b}},
- 3: {lang: 0x3be, script: 0x0, maxScript: 0x55, toRegion: 0xee, fromRegion: []uint16{0x2a, 0x4e, 0x5a, 0x86, 0x8b, 0xb7, 0xc6, 0xd1, 0x118, 0x126}},
- 4: {lang: 0x527, script: 0x38, maxScript: 0x38, toRegion: 0x8d, fromRegion: []uint16{0xc6}},
+ 0: {lang: 0x139, script: 0x0, maxScript: 0x57, toRegion: 0x1, fromRegion: []uint16{0x1a, 0x25, 0x26, 0x2f, 0x34, 0x36, 0x3d, 0x42, 0x46, 0x48, 0x49, 0x4a, 0x50, 0x52, 0x5c, 0x5d, 0x61, 0x64, 0x6d, 0x73, 0x74, 0x75, 0x7b, 0x7c, 0x7f, 0x80, 0x81, 0x83, 0x8c, 0x8d, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9f, 0xa0, 0xa4, 0xa7, 0xa9, 0xad, 0xb1, 0xb4, 0xb5, 0xbf, 0xc6, 0xca, 0xcb, 0xcc, 0xce, 0xd0, 0xd2, 0xd5, 0xd6, 0xdd, 0xdf, 0xe0, 0xe6, 0xe7, 0xe8, 0xeb, 0xf0, 0x107, 0x109, 0x10a, 0x10b, 0x10d, 0x10e, 0x112, 0x117, 0x11b, 0x11d, 0x11f, 0x125, 0x129, 0x12c, 0x12d, 0x12f, 0x131, 0x139, 0x13c, 0x13f, 0x142, 0x161, 0x162, 0x164}},
+ 1: {lang: 0x139, script: 0x0, maxScript: 0x57, toRegion: 0x1a, fromRegion: []uint16{0x2e, 0x4e, 0x60, 0x63, 0x72, 0xd9, 0x10c, 0x10f}},
+ 2: {lang: 0x13e, script: 0x0, maxScript: 0x57, toRegion: 0x1f, fromRegion: []uint16{0x2c, 0x3f, 0x41, 0x48, 0x51, 0x54, 0x56, 0x59, 0x65, 0x69, 0x89, 0x8f, 0xcf, 0xd8, 0xe2, 0xe4, 0xec, 0xf1, 0x11a, 0x135, 0x136, 0x13b}},
+ 3: {lang: 0x3c0, script: 0x0, maxScript: 0x57, toRegion: 0xee, fromRegion: []uint16{0x2a, 0x4e, 0x5a, 0x86, 0x8b, 0xb7, 0xc6, 0xd1, 0x118, 0x126}},
+ 4: {lang: 0x529, script: 0x39, maxScript: 0x39, toRegion: 0x8d, fromRegion: []uint16{0xc6}},
}
-// Total table size 27175 bytes (26KiB); checksum: 569649CD
+// Total table size 27238 bytes (26KiB); checksum: C9BBE4D5
diff --git a/vendor/golang.org/x/text/secure/bidirule/bidirule.go b/vendor/golang.org/x/text/secure/bidirule/bidirule.go
index 0e6b858..e2b70f7 100644
--- a/vendor/golang.org/x/text/secure/bidirule/bidirule.go
+++ b/vendor/golang.org/x/text/secure/bidirule/bidirule.go
@@ -203,10 +203,6 @@ func (t *Transformer) isRTL() bool {
return t.seen&isRTL != 0
}
-func (t *Transformer) isFinal() bool {
- return t.state == ruleLTRFinal || t.state == ruleRTLFinal || t.state == ruleInitial
-}
-
// Reset implements transform.Transformer.
func (t *Transformer) Reset() { *t = Transformer{} }
diff --git a/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go b/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go
new file mode 100644
index 0000000..e4c6228
--- /dev/null
+++ b/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go
@@ -0,0 +1,11 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.10
+
+package bidirule
+
+func (t *Transformer) isFinal() bool {
+ return t.state == ruleLTRFinal || t.state == ruleRTLFinal || t.state == ruleInitial
+}
diff --git a/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0_test.go b/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0_test.go
new file mode 100644
index 0000000..06ec5f5
--- /dev/null
+++ b/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0_test.go
@@ -0,0 +1,694 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.10
+
+package bidirule
+
+import (
+ "golang.org/x/text/transform"
+ "golang.org/x/text/unicode/bidi"
+)
+
+var testCases = [][]ruleTest{
+ // Go-specific rules.
+ // Invalid UTF-8 is invalid.
+ 0: []ruleTest{{
+ in: "",
+ dir: bidi.LeftToRight,
+ }, {
+ in: "\x80",
+ dir: bidi.LeftToRight,
+ err: ErrInvalid,
+ n: 0,
+ }, {
+ in: "\xcc",
+ dir: bidi.LeftToRight,
+ err: ErrInvalid,
+ n: 0,
+ }, {
+ in: "abc\x80",
+ dir: bidi.LeftToRight,
+ err: ErrInvalid,
+ n: 3,
+ }, {
+ in: "abc\xcc",
+ dir: bidi.LeftToRight,
+ err: ErrInvalid,
+ n: 3,
+ }, {
+ in: "abc\xccdef",
+ dir: bidi.LeftToRight,
+ err: ErrInvalid,
+ n: 3,
+ }, {
+ in: "\xccdef",
+ dir: bidi.LeftToRight,
+ err: ErrInvalid,
+ n: 0,
+ }, {
+ in: strR + "\x80",
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: len(strR),
+ }, {
+ in: strR + "\xcc",
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: len(strR),
+ }, {
+ in: strAL + "\xcc" + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: len(strAL),
+ }, {
+ in: "\xcc" + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: 0,
+ }},
+
+ // Rule 2.1: The first character must be a character with Bidi property L,
+ // R, or AL. If it has the R or AL property, it is an RTL label; if it has
+ // the L property, it is an LTR label.
+ 1: []ruleTest{{
+ in: strL,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAN,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ }, {
+ in: strEN,
+ dir: bidi.LeftToRight,
+ err: ErrInvalid,
+ n: len(strEN),
+ }, {
+ in: strES,
+ dir: bidi.LeftToRight,
+ err: ErrInvalid,
+ n: len(strES),
+ }, {
+ in: strET,
+ dir: bidi.LeftToRight,
+ err: ErrInvalid,
+ n: len(strET),
+ }, {
+ in: strCS,
+ dir: bidi.LeftToRight,
+ err: ErrInvalid,
+ n: len(strCS),
+ }, {
+ in: strNSM,
+ dir: bidi.LeftToRight,
+ err: ErrInvalid,
+ n: len(strNSM),
+ }, {
+ in: strBN,
+ dir: bidi.LeftToRight,
+ err: ErrInvalid,
+ n: len(strBN),
+ }, {
+ in: strB,
+ dir: bidi.LeftToRight,
+ err: ErrInvalid,
+ n: len(strB),
+ }, {
+ in: strS,
+ dir: bidi.LeftToRight,
+ err: ErrInvalid,
+ n: len(strS),
+ }, {
+ in: strWS,
+ dir: bidi.LeftToRight,
+ err: ErrInvalid,
+ n: len(strWS),
+ }, {
+ in: strON,
+ dir: bidi.LeftToRight,
+ err: ErrInvalid,
+ n: len(strON),
+ }, {
+ in: strEN + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: 3,
+ }, {
+ in: strES + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: 2,
+ }, {
+ in: strET + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: 1,
+ }, {
+ in: strCS + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: 1,
+ }, {
+ in: strNSM + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: 2,
+ }, {
+ in: strBN + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: 3,
+ }, {
+ in: strB + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: 3,
+ }, {
+ in: strS + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: 1,
+ }, {
+ in: strWS + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: 1,
+ }, {
+ in: strON + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: 1,
+ }},
+
+ // Rule 2.2: In an RTL label, only characters with the Bidi properties R,
+ // AL, AN, EN, ES, CS, ET, ON, BN, or NSM are allowed.
+ 2: []ruleTest{{
+ in: strR + strR + strAL,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strAL + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strAN + strAL,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strEN + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strES + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strCS + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strET + strAL,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strON + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strBN + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strNSM + strAL,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strL + strR,
+ dir: bidi.RightToLeft,
+ n: len(strR),
+ err: ErrInvalid,
+ }, {
+ in: strR + strB + strR,
+ dir: bidi.RightToLeft,
+ n: len(strR),
+ err: ErrInvalid,
+ }, {
+ in: strR + strS + strAL,
+ dir: bidi.RightToLeft,
+ n: len(strR),
+ err: ErrInvalid,
+ }, {
+ in: strR + strWS + strAL,
+ dir: bidi.RightToLeft,
+ n: len(strR),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strR + strAL,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strAL + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strAN + strAL,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strEN + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strES + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strCS + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strET + strAL,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strON + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strBN + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strNSM + strAL,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strL + strR,
+ dir: bidi.RightToLeft,
+ n: len(strAL),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strB + strR,
+ dir: bidi.RightToLeft,
+ n: len(strAL),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strS + strAL,
+ dir: bidi.RightToLeft,
+ n: len(strAL),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strWS + strAL,
+ dir: bidi.RightToLeft,
+ n: len(strAL),
+ err: ErrInvalid,
+ }},
+
+ // Rule 2.3: In an RTL label, the end of the label must be a character with
+ // Bidi property R, AL, EN, or AN, followed by zero or more characters with
+ // Bidi property NSM.
+ 3: []ruleTest{{
+ in: strR + strNSM,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strAL + strNSM,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strEN + strNSM + strNSM,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strAN,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strES + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strR + strES + strNSM),
+ err: ErrInvalid,
+ }, {
+ in: strR + strCS + strNSM + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strR + strCS + strNSM + strNSM),
+ err: ErrInvalid,
+ }, {
+ in: strR + strET,
+ dir: bidi.RightToLeft,
+ n: len(strR + strET),
+ err: ErrInvalid,
+ }, {
+ in: strR + strON + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strR + strON + strNSM),
+ err: ErrInvalid,
+ }, {
+ in: strR + strBN + strNSM + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strR + strBN + strNSM + strNSM),
+ err: ErrInvalid,
+ }, {
+ in: strR + strL + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strR),
+ err: ErrInvalid,
+ }, {
+ in: strR + strB + strNSM + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strR),
+ err: ErrInvalid,
+ }, {
+ in: strR + strS,
+ dir: bidi.RightToLeft,
+ n: len(strR),
+ err: ErrInvalid,
+ }, {
+ in: strR + strWS,
+ dir: bidi.RightToLeft,
+ n: len(strR),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strNSM,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strAL + strNSM,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strEN + strNSM + strNSM,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strAN,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strES + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strAL + strES + strNSM),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strCS + strNSM + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strAL + strCS + strNSM + strNSM),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strET,
+ dir: bidi.RightToLeft,
+ n: len(strAL + strET),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strON + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strAL + strON + strNSM),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strBN + strNSM + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strAL + strBN + strNSM + strNSM),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strL + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strAL),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strB + strNSM + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strAL),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strS,
+ dir: bidi.RightToLeft,
+ n: len(strAL),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strWS,
+ dir: bidi.RightToLeft,
+ n: len(strAL),
+ err: ErrInvalid,
+ }},
+
+ // Rule 2.4: In an RTL label, if an EN is present, no AN may be present,
+ // and vice versa.
+ 4: []ruleTest{{
+ in: strR + strEN + strAN,
+ dir: bidi.RightToLeft,
+ n: len(strR + strEN),
+ err: ErrInvalid,
+ }, {
+ in: strR + strAN + strEN + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strR + strAN),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strEN + strAN,
+ dir: bidi.RightToLeft,
+ n: len(strAL + strEN),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strAN + strEN + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strAL + strAN),
+ err: ErrInvalid,
+ }},
+
+ // Rule 2.5: In an LTR label, only characters with the Bidi properties L,
+ // EN, ES, CS, ET, ON, BN, or NSM are allowed.
+ 5: []ruleTest{{
+ in: strL + strL + strL,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strEN + strL,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strES + strL,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strCS + strL,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strET + strL,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strON + strL,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strBN + strL,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strNSM + strL,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strR + strL,
+ dir: bidi.RightToLeft,
+ n: len(strL),
+ err: ErrInvalid,
+ }, {
+ in: strL + strAL + strL,
+ dir: bidi.RightToLeft,
+ n: len(strL),
+ err: ErrInvalid,
+ }, {
+ in: strL + strAN + strL,
+ dir: bidi.RightToLeft,
+ n: len(strL),
+ err: ErrInvalid,
+ }, {
+ in: strL + strB + strL,
+ dir: bidi.LeftToRight,
+ n: len(strL + strB + strL),
+ err: ErrInvalid,
+ }, {
+ in: strL + strB + strL + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL + strB + strL),
+ err: ErrInvalid,
+ }, {
+ in: strL + strS + strL,
+ dir: bidi.LeftToRight,
+ n: len(strL + strS + strL),
+ err: ErrInvalid,
+ }, {
+ in: strL + strS + strL + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL + strS + strL),
+ err: ErrInvalid,
+ }, {
+ in: strL + strWS + strL,
+ dir: bidi.LeftToRight,
+ n: len(strL + strWS + strL),
+ err: ErrInvalid,
+ }, {
+ in: strL + strWS + strL + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL + strWS + strL),
+ err: ErrInvalid,
+ }},
+
+ // Rule 2.6: In an LTR label, the end of the label must be a character with
+ // Bidi property L or EN, followed by zero or more characters with Bidi
+ // property NSM.
+ 6: []ruleTest{{
+ in: strL,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strNSM,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strNSM + strNSM,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strEN,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strEN + strNSM,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strEN + strNSM + strNSM,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strES,
+ dir: bidi.LeftToRight,
+ n: len(strL + strES),
+ err: ErrInvalid,
+ }, {
+ in: strL + strES + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL + strES),
+ err: ErrInvalid,
+ }, {
+ in: strL + strCS,
+ dir: bidi.LeftToRight,
+ n: len(strL + strCS),
+ err: ErrInvalid,
+ }, {
+ in: strL + strCS + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL + strCS),
+ err: ErrInvalid,
+ }, {
+ in: strL + strET,
+ dir: bidi.LeftToRight,
+ n: len(strL + strET),
+ err: ErrInvalid,
+ }, {
+ in: strL + strET + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL + strET),
+ err: ErrInvalid,
+ }, {
+ in: strL + strON,
+ dir: bidi.LeftToRight,
+ n: len(strL + strON),
+ err: ErrInvalid,
+ }, {
+ in: strL + strON + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL + strON),
+ err: ErrInvalid,
+ }, {
+ in: strL + strBN,
+ dir: bidi.LeftToRight,
+ n: len(strL + strBN),
+ err: ErrInvalid,
+ }, {
+ in: strL + strBN + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL + strBN),
+ err: ErrInvalid,
+ }, {
+ in: strL + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL),
+ err: ErrInvalid,
+ }, {
+ in: strL + strAL,
+ dir: bidi.RightToLeft,
+ n: len(strL),
+ err: ErrInvalid,
+ }, {
+ in: strL + strAN,
+ dir: bidi.RightToLeft,
+ n: len(strL),
+ err: ErrInvalid,
+ }, {
+ in: strL + strB,
+ dir: bidi.LeftToRight,
+ n: len(strL + strB),
+ err: ErrInvalid,
+ }, {
+ in: strL + strB + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL + strB),
+ err: ErrInvalid,
+ }, {
+ in: strL + strS,
+ dir: bidi.LeftToRight,
+ n: len(strL + strS),
+ err: ErrInvalid,
+ }, {
+ in: strL + strS + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL + strS),
+ err: ErrInvalid,
+ }, {
+ in: strL + strWS,
+ dir: bidi.LeftToRight,
+ n: len(strL + strWS),
+ err: ErrInvalid,
+ }, {
+ in: strL + strWS + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL + strWS),
+ err: ErrInvalid,
+ }},
+
+ // Incremental processing.
+ 9: []ruleTest{{
+ in: "e\u0301", // é
+ dir: bidi.LeftToRight,
+
+ pSrc: 2,
+ nSrc: 1,
+ err0: transform.ErrShortSrc,
+ }, {
+ in: "e\u1000f", // é
+ dir: bidi.LeftToRight,
+
+ pSrc: 3,
+ nSrc: 1,
+ err0: transform.ErrShortSrc,
+ }, {
+ // Remain invalid once invalid.
+ in: strR + "ab",
+ dir: bidi.RightToLeft,
+ n: len(strR),
+ err: ErrInvalid,
+
+ pSrc: len(strR) + 1,
+ nSrc: len(strR),
+ err0: ErrInvalid,
+ }, {
+ // Short destination
+ in: "abcdefghij",
+ dir: bidi.LeftToRight,
+
+ pSrc: 10,
+ szDst: 5,
+ nSrc: 5,
+ err0: transform.ErrShortDst,
+ }, {
+ in: "\U000102f7",
+ dir: bidi.LeftToRight,
+ n: len("\U000102f7"),
+ err: ErrInvalid,
+ }, {
+ // Short destination splitting input rune
+ in: "e\u0301",
+ dir: bidi.LeftToRight,
+
+ pSrc: 3,
+ szDst: 2,
+ nSrc: 1,
+ err0: transform.ErrShortDst,
+ }, {
+ // Unicode 10.0.0 IDNA test string.
+ in: "FAX\u2a77\U0001d186",
+ dir: bidi.LeftToRight,
+ n: len("FAX\u2a77\U0001d186"),
+ err: ErrInvalid,
+ }, {
+ in: "\x80\u0660",
+ dir: bidi.RightToLeft,
+ n: 0,
+ err: ErrInvalid,
+ }},
+}
diff --git a/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go b/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go
new file mode 100644
index 0000000..02b9e1e
--- /dev/null
+++ b/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go
@@ -0,0 +1,14 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !go1.10
+
+package bidirule
+
+func (t *Transformer) isFinal() bool {
+ if !t.isRTL() {
+ return true
+ }
+ return t.state == ruleLTRFinal || t.state == ruleRTLFinal || t.state == ruleInitial
+}
diff --git a/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0_test.go b/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0_test.go
new file mode 100644
index 0000000..008874e
--- /dev/null
+++ b/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0_test.go
@@ -0,0 +1,668 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !go1.10
+
+package bidirule
+
+import (
+ "golang.org/x/text/transform"
+ "golang.org/x/text/unicode/bidi"
+)
+
+var testCases = [][]ruleTest{
+ // Go-specific rules.
+ // Invalid UTF-8 is invalid.
+ 0: []ruleTest{{
+ in: "",
+ dir: bidi.LeftToRight,
+ }, {
+ in: "\x80",
+ dir: bidi.LeftToRight,
+ err: ErrInvalid,
+ n: 0,
+ }, {
+ in: "\xcc",
+ dir: bidi.LeftToRight,
+ err: ErrInvalid,
+ n: 0,
+ }, {
+ in: "abc\x80",
+ dir: bidi.LeftToRight,
+ err: ErrInvalid,
+ n: 3,
+ }, {
+ in: "abc\xcc",
+ dir: bidi.LeftToRight,
+ err: ErrInvalid,
+ n: 3,
+ }, {
+ in: "abc\xccdef",
+ dir: bidi.LeftToRight,
+ err: ErrInvalid,
+ n: 3,
+ }, {
+ in: "\xccdef",
+ dir: bidi.LeftToRight,
+ err: ErrInvalid,
+ n: 0,
+ }, {
+ in: strR + "\x80",
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: len(strR),
+ }, {
+ in: strR + "\xcc",
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: len(strR),
+ }, {
+ in: strAL + "\xcc" + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: len(strAL),
+ }, {
+ in: "\xcc" + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: 0,
+ }},
+
+ // Rule 2.1: The first character must be a character with Bidi property L,
+ // R, or AL. If it has the R or AL property, it is an RTL label; if it has
+ // the L property, it is an LTR label.
+ 1: []ruleTest{{
+ in: strL,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAN,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ }, {
+ in: strEN,
+ dir: bidi.LeftToRight,
+ err: nil, // not an RTL string
+ }, {
+ in: strES,
+ dir: bidi.LeftToRight,
+ err: nil, // not an RTL string
+ }, {
+ in: strET,
+ dir: bidi.LeftToRight,
+ err: nil, // not an RTL string
+ }, {
+ in: strCS,
+ dir: bidi.LeftToRight,
+ err: nil, // not an RTL string
+ }, {
+ in: strNSM,
+ dir: bidi.LeftToRight,
+ err: nil, // not an RTL string
+ }, {
+ in: strBN,
+ dir: bidi.LeftToRight,
+ err: nil, // not an RTL string
+ }, {
+ in: strB,
+ dir: bidi.LeftToRight,
+ err: nil, // not an RTL string
+ }, {
+ in: strS,
+ dir: bidi.LeftToRight,
+ err: nil, // not an RTL string
+ }, {
+ in: strWS,
+ dir: bidi.LeftToRight,
+ err: nil, // not an RTL string
+ }, {
+ in: strON,
+ dir: bidi.LeftToRight,
+ err: nil, // not an RTL string
+ }, {
+ in: strEN + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: 3,
+ }, {
+ in: strES + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: 2,
+ }, {
+ in: strET + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: 1,
+ }, {
+ in: strCS + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: 1,
+ }, {
+ in: strNSM + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: 2,
+ }, {
+ in: strBN + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: 3,
+ }, {
+ in: strB + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: 3,
+ }, {
+ in: strS + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: 1,
+ }, {
+ in: strWS + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: 1,
+ }, {
+ in: strON + strR,
+ dir: bidi.RightToLeft,
+ err: ErrInvalid,
+ n: 1,
+ }},
+
+ // Rule 2.2: In an RTL label, only characters with the Bidi properties R,
+ // AL, AN, EN, ES, CS, ET, ON, BN, or NSM are allowed.
+ 2: []ruleTest{{
+ in: strR + strR + strAL,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strAL + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strAN + strAL,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strEN + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strES + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strCS + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strET + strAL,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strON + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strBN + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strNSM + strAL,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strL + strR,
+ dir: bidi.RightToLeft,
+ n: len(strR),
+ err: ErrInvalid,
+ }, {
+ in: strR + strB + strR,
+ dir: bidi.RightToLeft,
+ n: len(strR),
+ err: ErrInvalid,
+ }, {
+ in: strR + strS + strAL,
+ dir: bidi.RightToLeft,
+ n: len(strR),
+ err: ErrInvalid,
+ }, {
+ in: strR + strWS + strAL,
+ dir: bidi.RightToLeft,
+ n: len(strR),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strR + strAL,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strAL + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strAN + strAL,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strEN + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strES + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strCS + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strET + strAL,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strON + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strBN + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strNSM + strAL,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strL + strR,
+ dir: bidi.RightToLeft,
+ n: len(strAL),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strB + strR,
+ dir: bidi.RightToLeft,
+ n: len(strAL),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strS + strAL,
+ dir: bidi.RightToLeft,
+ n: len(strAL),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strWS + strAL,
+ dir: bidi.RightToLeft,
+ n: len(strAL),
+ err: ErrInvalid,
+ }},
+
+ // Rule 2.3: In an RTL label, the end of the label must be a character with
+ // Bidi property R, AL, EN, or AN, followed by zero or more characters with
+ // Bidi property NSM.
+ 3: []ruleTest{{
+ in: strR + strNSM,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strAL + strNSM,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strEN + strNSM + strNSM,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strAN,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strR + strES + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strR + strES + strNSM),
+ err: ErrInvalid,
+ }, {
+ in: strR + strCS + strNSM + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strR + strCS + strNSM + strNSM),
+ err: ErrInvalid,
+ }, {
+ in: strR + strET,
+ dir: bidi.RightToLeft,
+ n: len(strR + strET),
+ err: ErrInvalid,
+ }, {
+ in: strR + strON + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strR + strON + strNSM),
+ err: ErrInvalid,
+ }, {
+ in: strR + strBN + strNSM + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strR + strBN + strNSM + strNSM),
+ err: ErrInvalid,
+ }, {
+ in: strR + strL + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strR),
+ err: ErrInvalid,
+ }, {
+ in: strR + strB + strNSM + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strR),
+ err: ErrInvalid,
+ }, {
+ in: strR + strS,
+ dir: bidi.RightToLeft,
+ n: len(strR),
+ err: ErrInvalid,
+ }, {
+ in: strR + strWS,
+ dir: bidi.RightToLeft,
+ n: len(strR),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strNSM,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strR,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strAL + strNSM,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strEN + strNSM + strNSM,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strAN,
+ dir: bidi.RightToLeft,
+ }, {
+ in: strAL + strES + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strAL + strES + strNSM),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strCS + strNSM + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strAL + strCS + strNSM + strNSM),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strET,
+ dir: bidi.RightToLeft,
+ n: len(strAL + strET),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strON + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strAL + strON + strNSM),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strBN + strNSM + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strAL + strBN + strNSM + strNSM),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strL + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strAL),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strB + strNSM + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strAL),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strS,
+ dir: bidi.RightToLeft,
+ n: len(strAL),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strWS,
+ dir: bidi.RightToLeft,
+ n: len(strAL),
+ err: ErrInvalid,
+ }},
+
+ // Rule 2.4: In an RTL label, if an EN is present, no AN may be present,
+ // and vice versa.
+ 4: []ruleTest{{
+ in: strR + strEN + strAN,
+ dir: bidi.RightToLeft,
+ n: len(strR + strEN),
+ err: ErrInvalid,
+ }, {
+ in: strR + strAN + strEN + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strR + strAN),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strEN + strAN,
+ dir: bidi.RightToLeft,
+ n: len(strAL + strEN),
+ err: ErrInvalid,
+ }, {
+ in: strAL + strAN + strEN + strNSM,
+ dir: bidi.RightToLeft,
+ n: len(strAL + strAN),
+ err: ErrInvalid,
+ }},
+
+ // Rule 2.5: In an LTR label, only characters with the Bidi properties L,
+ // EN, ES, CS, ET, ON, BN, or NSM are allowed.
+ 5: []ruleTest{{
+ in: strL + strL + strL,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strEN + strL,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strES + strL,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strCS + strL,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strET + strL,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strON + strL,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strBN + strL,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strNSM + strL,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strR + strL,
+ dir: bidi.RightToLeft,
+ n: len(strL),
+ err: ErrInvalid,
+ }, {
+ in: strL + strAL + strL,
+ dir: bidi.RightToLeft,
+ n: len(strL),
+ err: ErrInvalid,
+ }, {
+ in: strL + strAN + strL,
+ dir: bidi.RightToLeft,
+ n: len(strL),
+ err: ErrInvalid,
+ }, {
+ in: strL + strB + strL,
+ dir: bidi.LeftToRight,
+ n: len(strL + strAN + strL),
+ err: nil,
+ }, {
+ in: strL + strB + strL + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL + strB + strL),
+ err: ErrInvalid,
+ }, {
+ in: strL + strS + strL,
+ dir: bidi.LeftToRight,
+ n: len(strL + strS + strL),
+ err: nil,
+ }, {
+ in: strL + strS + strL + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL + strS + strL),
+ err: ErrInvalid,
+ }, {
+ in: strL + strWS + strL,
+ dir: bidi.LeftToRight,
+ n: len(strL + strWS + strL),
+ err: nil,
+ }, {
+ in: strL + strWS + strL + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL + strWS + strL),
+ err: ErrInvalid,
+ }},
+
+ // Rule 2.6: In an LTR label, the end of the label must be a character with
+ // Bidi property L or EN, followed by zero or more characters with Bidi
+ // property NSM.
+ 6: []ruleTest{{
+ in: strL,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strNSM,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strNSM + strNSM,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strEN,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strEN + strNSM,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strEN + strNSM + strNSM,
+ dir: bidi.LeftToRight,
+ }, {
+ in: strL + strES,
+ dir: bidi.LeftToRight,
+ n: len(strL + strES),
+ err: nil,
+ }, {
+ in: strL + strES + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL + strES),
+ err: ErrInvalid,
+ }, {
+ in: strL + strCS,
+ dir: bidi.LeftToRight,
+ n: len(strL + strCS),
+ err: nil,
+ }, {
+ in: strL + strCS + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL + strCS),
+ err: ErrInvalid,
+ }, {
+ in: strL + strET,
+ dir: bidi.LeftToRight,
+ n: len(strL + strET),
+ err: nil,
+ }, {
+ in: strL + strET + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL + strET),
+ err: ErrInvalid,
+ }, {
+ in: strL + strON,
+ dir: bidi.LeftToRight,
+ n: len(strL + strON),
+ err: nil,
+ }, {
+ in: strL + strON + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL + strON),
+ err: ErrInvalid,
+ }, {
+ in: strL + strBN,
+ dir: bidi.LeftToRight,
+ n: len(strL + strBN),
+ err: nil,
+ }, {
+ in: strL + strBN + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL + strBN),
+ err: ErrInvalid,
+ }, {
+ in: strL + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL),
+ err: ErrInvalid,
+ }, {
+ in: strL + strAL,
+ dir: bidi.RightToLeft,
+ n: len(strL),
+ err: ErrInvalid,
+ }, {
+ in: strL + strAN,
+ dir: bidi.RightToLeft,
+ n: len(strL),
+ err: ErrInvalid,
+ }, {
+ in: strL + strB,
+ dir: bidi.LeftToRight,
+ n: len(strL + strB),
+ err: nil,
+ }, {
+ in: strL + strB + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL + strB),
+ err: ErrInvalid,
+ }, {
+ in: strL + strB,
+ dir: bidi.LeftToRight,
+ n: len(strL + strB),
+ err: nil,
+ }, {
+ in: strL + strB + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL + strB),
+ err: ErrInvalid,
+ }, {
+ in: strL + strB,
+ dir: bidi.LeftToRight,
+ n: len(strL + strB),
+ err: nil,
+ }, {
+ in: strL + strB + strR,
+ dir: bidi.RightToLeft,
+ n: len(strL + strB),
+ err: ErrInvalid,
+ }},
+
+ // Incremental processing.
+ 9: []ruleTest{{
+ in: "e\u0301", // é
+ dir: bidi.LeftToRight,
+
+ pSrc: 2,
+ nSrc: 1,
+ err0: transform.ErrShortSrc,
+ }, {
+ in: "e\u1000f", // é
+ dir: bidi.LeftToRight,
+
+ pSrc: 3,
+ nSrc: 1,
+ err0: transform.ErrShortSrc,
+ }, {
+ // Remain invalid once invalid.
+ in: strR + "ab",
+ dir: bidi.RightToLeft,
+ n: len(strR),
+ err: ErrInvalid,
+
+ pSrc: len(strR) + 1,
+ nSrc: len(strR),
+ err0: ErrInvalid,
+ }, {
+ // Short destination
+ in: "abcdefghij",
+ dir: bidi.LeftToRight,
+
+ pSrc: 10,
+ szDst: 5,
+ nSrc: 5,
+ err0: transform.ErrShortDst,
+ }, {
+ // Short destination splitting input rune
+ in: "e\u0301",
+ dir: bidi.LeftToRight,
+
+ pSrc: 3,
+ szDst: 2,
+ nSrc: 1,
+ err0: transform.ErrShortDst,
+ }},
+}
diff --git a/vendor/golang.org/x/text/secure/bidirule/bidirule_test.go b/vendor/golang.org/x/text/secure/bidirule/bidirule_test.go
index 4b6c612..e8fde33 100644
--- a/vendor/golang.org/x/text/secure/bidirule/bidirule_test.go
+++ b/vendor/golang.org/x/text/secure/bidirule/bidirule_test.go
@@ -9,7 +9,6 @@ import (
"testing"
"golang.org/x/text/internal/testtext"
- "golang.org/x/text/transform"
"golang.org/x/text/unicode/bidi"
)
@@ -43,688 +42,6 @@ type ruleTest struct {
err0 error // error after first run
}
-var testCases = [][]ruleTest{
- // Go-specific rules.
- // Invalid UTF-8 is invalid.
- 0: []ruleTest{{
- in: "",
- dir: bidi.LeftToRight,
- }, {
- in: "\x80",
- dir: bidi.LeftToRight,
- err: ErrInvalid,
- n: 0,
- }, {
- in: "\xcc",
- dir: bidi.LeftToRight,
- err: ErrInvalid,
- n: 0,
- }, {
- in: "abc\x80",
- dir: bidi.LeftToRight,
- err: ErrInvalid,
- n: 3,
- }, {
- in: "abc\xcc",
- dir: bidi.LeftToRight,
- err: ErrInvalid,
- n: 3,
- }, {
- in: "abc\xccdef",
- dir: bidi.LeftToRight,
- err: ErrInvalid,
- n: 3,
- }, {
- in: "\xccdef",
- dir: bidi.LeftToRight,
- err: ErrInvalid,
- n: 0,
- }, {
- in: strR + "\x80",
- dir: bidi.RightToLeft,
- err: ErrInvalid,
- n: len(strR),
- }, {
- in: strR + "\xcc",
- dir: bidi.RightToLeft,
- err: ErrInvalid,
- n: len(strR),
- }, {
- in: strAL + "\xcc" + strR,
- dir: bidi.RightToLeft,
- err: ErrInvalid,
- n: len(strAL),
- }, {
- in: "\xcc" + strR,
- dir: bidi.RightToLeft,
- err: ErrInvalid,
- n: 0,
- }},
-
- // Rule 2.1: The first character must be a character with Bidi property L,
- // R, or AL. If it has the R or AL property, it is an RTL label; if it has
- // the L property, it is an LTR label.
- 1: []ruleTest{{
- in: strL,
- dir: bidi.LeftToRight,
- }, {
- in: strR,
- dir: bidi.RightToLeft,
- }, {
- in: strAL,
- dir: bidi.RightToLeft,
- }, {
- in: strAN,
- dir: bidi.RightToLeft,
- err: ErrInvalid,
- }, {
- in: strEN,
- dir: bidi.LeftToRight,
- err: ErrInvalid,
- n: len(strEN),
- }, {
- in: strES,
- dir: bidi.LeftToRight,
- err: ErrInvalid,
- n: len(strES),
- }, {
- in: strET,
- dir: bidi.LeftToRight,
- err: ErrInvalid,
- n: len(strET),
- }, {
- in: strCS,
- dir: bidi.LeftToRight,
- err: ErrInvalid,
- n: len(strCS),
- }, {
- in: strNSM,
- dir: bidi.LeftToRight,
- err: ErrInvalid,
- n: len(strNSM),
- }, {
- in: strBN,
- dir: bidi.LeftToRight,
- err: ErrInvalid,
- n: len(strBN),
- }, {
- in: strB,
- dir: bidi.LeftToRight,
- err: ErrInvalid,
- n: len(strB),
- }, {
- in: strS,
- dir: bidi.LeftToRight,
- err: ErrInvalid,
- n: len(strS),
- }, {
- in: strWS,
- dir: bidi.LeftToRight,
- err: ErrInvalid,
- n: len(strWS),
- }, {
- in: strON,
- dir: bidi.LeftToRight,
- err: ErrInvalid,
- n: len(strON),
- }, {
- in: strEN + strR,
- dir: bidi.RightToLeft,
- err: ErrInvalid,
- n: 3,
- }, {
- in: strES + strR,
- dir: bidi.RightToLeft,
- err: ErrInvalid,
- n: 2,
- }, {
- in: strET + strR,
- dir: bidi.RightToLeft,
- err: ErrInvalid,
- n: 1,
- }, {
- in: strCS + strR,
- dir: bidi.RightToLeft,
- err: ErrInvalid,
- n: 1,
- }, {
- in: strNSM + strR,
- dir: bidi.RightToLeft,
- err: ErrInvalid,
- n: 2,
- }, {
- in: strBN + strR,
- dir: bidi.RightToLeft,
- err: ErrInvalid,
- n: 3,
- }, {
- in: strB + strR,
- dir: bidi.RightToLeft,
- err: ErrInvalid,
- n: 3,
- }, {
- in: strS + strR,
- dir: bidi.RightToLeft,
- err: ErrInvalid,
- n: 1,
- }, {
- in: strWS + strR,
- dir: bidi.RightToLeft,
- err: ErrInvalid,
- n: 1,
- }, {
- in: strON + strR,
- dir: bidi.RightToLeft,
- err: ErrInvalid,
- n: 1,
- }},
-
- // Rule 2.2: In an RTL label, only characters with the Bidi properties R,
- // AL, AN, EN, ES, CS, ET, ON, BN, or NSM are allowed.
- 2: []ruleTest{{
- in: strR + strR + strAL,
- dir: bidi.RightToLeft,
- }, {
- in: strR + strAL + strR,
- dir: bidi.RightToLeft,
- }, {
- in: strR + strAN + strAL,
- dir: bidi.RightToLeft,
- }, {
- in: strR + strEN + strR,
- dir: bidi.RightToLeft,
- }, {
- in: strR + strES + strR,
- dir: bidi.RightToLeft,
- }, {
- in: strR + strCS + strR,
- dir: bidi.RightToLeft,
- }, {
- in: strR + strET + strAL,
- dir: bidi.RightToLeft,
- }, {
- in: strR + strON + strR,
- dir: bidi.RightToLeft,
- }, {
- in: strR + strBN + strR,
- dir: bidi.RightToLeft,
- }, {
- in: strR + strNSM + strAL,
- dir: bidi.RightToLeft,
- }, {
- in: strR + strL + strR,
- dir: bidi.RightToLeft,
- n: len(strR),
- err: ErrInvalid,
- }, {
- in: strR + strB + strR,
- dir: bidi.RightToLeft,
- n: len(strR),
- err: ErrInvalid,
- }, {
- in: strR + strS + strAL,
- dir: bidi.RightToLeft,
- n: len(strR),
- err: ErrInvalid,
- }, {
- in: strR + strWS + strAL,
- dir: bidi.RightToLeft,
- n: len(strR),
- err: ErrInvalid,
- }, {
- in: strAL + strR + strAL,
- dir: bidi.RightToLeft,
- }, {
- in: strAL + strAL + strR,
- dir: bidi.RightToLeft,
- }, {
- in: strAL + strAN + strAL,
- dir: bidi.RightToLeft,
- }, {
- in: strAL + strEN + strR,
- dir: bidi.RightToLeft,
- }, {
- in: strAL + strES + strR,
- dir: bidi.RightToLeft,
- }, {
- in: strAL + strCS + strR,
- dir: bidi.RightToLeft,
- }, {
- in: strAL + strET + strAL,
- dir: bidi.RightToLeft,
- }, {
- in: strAL + strON + strR,
- dir: bidi.RightToLeft,
- }, {
- in: strAL + strBN + strR,
- dir: bidi.RightToLeft,
- }, {
- in: strAL + strNSM + strAL,
- dir: bidi.RightToLeft,
- }, {
- in: strAL + strL + strR,
- dir: bidi.RightToLeft,
- n: len(strAL),
- err: ErrInvalid,
- }, {
- in: strAL + strB + strR,
- dir: bidi.RightToLeft,
- n: len(strAL),
- err: ErrInvalid,
- }, {
- in: strAL + strS + strAL,
- dir: bidi.RightToLeft,
- n: len(strAL),
- err: ErrInvalid,
- }, {
- in: strAL + strWS + strAL,
- dir: bidi.RightToLeft,
- n: len(strAL),
- err: ErrInvalid,
- }},
-
- // Rule 2.3: In an RTL label, the end of the label must be a character with
- // Bidi property R, AL, EN, or AN, followed by zero or more characters with
- // Bidi property NSM.
- 3: []ruleTest{{
- in: strR + strNSM,
- dir: bidi.RightToLeft,
- }, {
- in: strR + strR,
- dir: bidi.RightToLeft,
- }, {
- in: strR + strAL + strNSM,
- dir: bidi.RightToLeft,
- }, {
- in: strR + strEN + strNSM + strNSM,
- dir: bidi.RightToLeft,
- }, {
- in: strR + strAN,
- dir: bidi.RightToLeft,
- }, {
- in: strR + strES + strNSM,
- dir: bidi.RightToLeft,
- n: len(strR + strES + strNSM),
- err: ErrInvalid,
- }, {
- in: strR + strCS + strNSM + strNSM,
- dir: bidi.RightToLeft,
- n: len(strR + strCS + strNSM + strNSM),
- err: ErrInvalid,
- }, {
- in: strR + strET,
- dir: bidi.RightToLeft,
- n: len(strR + strET),
- err: ErrInvalid,
- }, {
- in: strR + strON + strNSM,
- dir: bidi.RightToLeft,
- n: len(strR + strON + strNSM),
- err: ErrInvalid,
- }, {
- in: strR + strBN + strNSM + strNSM,
- dir: bidi.RightToLeft,
- n: len(strR + strBN + strNSM + strNSM),
- err: ErrInvalid,
- }, {
- in: strR + strL + strNSM,
- dir: bidi.RightToLeft,
- n: len(strR),
- err: ErrInvalid,
- }, {
- in: strR + strB + strNSM + strNSM,
- dir: bidi.RightToLeft,
- n: len(strR),
- err: ErrInvalid,
- }, {
- in: strR + strS,
- dir: bidi.RightToLeft,
- n: len(strR),
- err: ErrInvalid,
- }, {
- in: strR + strWS,
- dir: bidi.RightToLeft,
- n: len(strR),
- err: ErrInvalid,
- }, {
- in: strAL + strNSM,
- dir: bidi.RightToLeft,
- }, {
- in: strAL + strR,
- dir: bidi.RightToLeft,
- }, {
- in: strAL + strAL + strNSM,
- dir: bidi.RightToLeft,
- }, {
- in: strAL + strEN + strNSM + strNSM,
- dir: bidi.RightToLeft,
- }, {
- in: strAL + strAN,
- dir: bidi.RightToLeft,
- }, {
- in: strAL + strES + strNSM,
- dir: bidi.RightToLeft,
- n: len(strAL + strES + strNSM),
- err: ErrInvalid,
- }, {
- in: strAL + strCS + strNSM + strNSM,
- dir: bidi.RightToLeft,
- n: len(strAL + strCS + strNSM + strNSM),
- err: ErrInvalid,
- }, {
- in: strAL + strET,
- dir: bidi.RightToLeft,
- n: len(strAL + strET),
- err: ErrInvalid,
- }, {
- in: strAL + strON + strNSM,
- dir: bidi.RightToLeft,
- n: len(strAL + strON + strNSM),
- err: ErrInvalid,
- }, {
- in: strAL + strBN + strNSM + strNSM,
- dir: bidi.RightToLeft,
- n: len(strAL + strBN + strNSM + strNSM),
- err: ErrInvalid,
- }, {
- in: strAL + strL + strNSM,
- dir: bidi.RightToLeft,
- n: len(strAL),
- err: ErrInvalid,
- }, {
- in: strAL + strB + strNSM + strNSM,
- dir: bidi.RightToLeft,
- n: len(strAL),
- err: ErrInvalid,
- }, {
- in: strAL + strS,
- dir: bidi.RightToLeft,
- n: len(strAL),
- err: ErrInvalid,
- }, {
- in: strAL + strWS,
- dir: bidi.RightToLeft,
- n: len(strAL),
- err: ErrInvalid,
- }},
-
- // Rule 2.4: In an RTL label, if an EN is present, no AN may be present,
- // and vice versa.
- 4: []ruleTest{{
- in: strR + strEN + strAN,
- dir: bidi.RightToLeft,
- n: len(strR + strEN),
- err: ErrInvalid,
- }, {
- in: strR + strAN + strEN + strNSM,
- dir: bidi.RightToLeft,
- n: len(strR + strAN),
- err: ErrInvalid,
- }, {
- in: strAL + strEN + strAN,
- dir: bidi.RightToLeft,
- n: len(strAL + strEN),
- err: ErrInvalid,
- }, {
- in: strAL + strAN + strEN + strNSM,
- dir: bidi.RightToLeft,
- n: len(strAL + strAN),
- err: ErrInvalid,
- }},
-
- // Rule 2.5: In an LTR label, only characters with the Bidi properties L,
- // EN, ES, CS, ET, ON, BN, or NSM are allowed.
- 5: []ruleTest{{
- in: strL + strL + strL,
- dir: bidi.LeftToRight,
- }, {
- in: strL + strEN + strL,
- dir: bidi.LeftToRight,
- }, {
- in: strL + strES + strL,
- dir: bidi.LeftToRight,
- }, {
- in: strL + strCS + strL,
- dir: bidi.LeftToRight,
- }, {
- in: strL + strET + strL,
- dir: bidi.LeftToRight,
- }, {
- in: strL + strON + strL,
- dir: bidi.LeftToRight,
- }, {
- in: strL + strBN + strL,
- dir: bidi.LeftToRight,
- }, {
- in: strL + strNSM + strL,
- dir: bidi.LeftToRight,
- }, {
- in: strL + strR + strL,
- dir: bidi.RightToLeft,
- n: len(strL),
- err: ErrInvalid,
- }, {
- in: strL + strAL + strL,
- dir: bidi.RightToLeft,
- n: len(strL),
- err: ErrInvalid,
- }, {
- in: strL + strAN + strL,
- dir: bidi.RightToLeft,
- n: len(strL),
- err: ErrInvalid,
- }, {
- in: strL + strB + strL,
- dir: bidi.LeftToRight,
- n: len(strL + strB + strL),
- err: ErrInvalid,
- }, {
- in: strL + strB + strL + strR,
- dir: bidi.RightToLeft,
- n: len(strL + strB + strL),
- err: ErrInvalid,
- }, {
- in: strL + strS + strL,
- dir: bidi.LeftToRight,
- n: len(strL + strS + strL),
- err: ErrInvalid,
- }, {
- in: strL + strS + strL + strR,
- dir: bidi.RightToLeft,
- n: len(strL + strS + strL),
- err: ErrInvalid,
- }, {
- in: strL + strWS + strL,
- dir: bidi.LeftToRight,
- n: len(strL + strWS + strL),
- err: ErrInvalid,
- }, {
- in: strL + strWS + strL + strR,
- dir: bidi.RightToLeft,
- n: len(strL + strWS + strL),
- err: ErrInvalid,
- }},
-
- // Rule 2.6: In an LTR label, the end of the label must be a character with
- // Bidi property L or EN, followed by zero or more characters with Bidi
- // property NSM.
- 6: []ruleTest{{
- in: strL,
- dir: bidi.LeftToRight,
- }, {
- in: strL + strNSM,
- dir: bidi.LeftToRight,
- }, {
- in: strL + strNSM + strNSM,
- dir: bidi.LeftToRight,
- }, {
- in: strL + strEN,
- dir: bidi.LeftToRight,
- }, {
- in: strL + strEN + strNSM,
- dir: bidi.LeftToRight,
- }, {
- in: strL + strEN + strNSM + strNSM,
- dir: bidi.LeftToRight,
- }, {
- in: strL + strES,
- dir: bidi.LeftToRight,
- n: len(strL + strES),
- err: ErrInvalid,
- }, {
- in: strL + strES + strR,
- dir: bidi.RightToLeft,
- n: len(strL + strES),
- err: ErrInvalid,
- }, {
- in: strL + strCS,
- dir: bidi.LeftToRight,
- n: len(strL + strCS),
- err: ErrInvalid,
- }, {
- in: strL + strCS + strR,
- dir: bidi.RightToLeft,
- n: len(strL + strCS),
- err: ErrInvalid,
- }, {
- in: strL + strET,
- dir: bidi.LeftToRight,
- n: len(strL + strET),
- err: ErrInvalid,
- }, {
- in: strL + strET + strR,
- dir: bidi.RightToLeft,
- n: len(strL + strET),
- err: ErrInvalid,
- }, {
- in: strL + strON,
- dir: bidi.LeftToRight,
- n: len(strL + strON),
- err: ErrInvalid,
- }, {
- in: strL + strON + strR,
- dir: bidi.RightToLeft,
- n: len(strL + strON),
- err: ErrInvalid,
- }, {
- in: strL + strBN,
- dir: bidi.LeftToRight,
- n: len(strL + strBN),
- err: ErrInvalid,
- }, {
- in: strL + strBN + strR,
- dir: bidi.RightToLeft,
- n: len(strL + strBN),
- err: ErrInvalid,
- }, {
- in: strL + strR,
- dir: bidi.RightToLeft,
- n: len(strL),
- err: ErrInvalid,
- }, {
- in: strL + strAL,
- dir: bidi.RightToLeft,
- n: len(strL),
- err: ErrInvalid,
- }, {
- in: strL + strAN,
- dir: bidi.RightToLeft,
- n: len(strL),
- err: ErrInvalid,
- }, {
- in: strL + strB,
- dir: bidi.LeftToRight,
- n: len(strL + strB),
- err: ErrInvalid,
- }, {
- in: strL + strB + strR,
- dir: bidi.RightToLeft,
- n: len(strL + strB),
- err: ErrInvalid,
- }, {
- in: strL + strS,
- dir: bidi.LeftToRight,
- n: len(strL + strS),
- err: ErrInvalid,
- }, {
- in: strL + strS + strR,
- dir: bidi.RightToLeft,
- n: len(strL + strS),
- err: ErrInvalid,
- }, {
- in: strL + strWS,
- dir: bidi.LeftToRight,
- n: len(strL + strWS),
- err: ErrInvalid,
- }, {
- in: strL + strWS + strR,
- dir: bidi.RightToLeft,
- n: len(strL + strWS),
- err: ErrInvalid,
- }},
-
- // Incremental processing.
- 9: []ruleTest{{
- in: "e\u0301", // é
- dir: bidi.LeftToRight,
-
- pSrc: 2,
- nSrc: 1,
- err0: transform.ErrShortSrc,
- }, {
- in: "e\u1000f", // é
- dir: bidi.LeftToRight,
-
- pSrc: 3,
- nSrc: 1,
- err0: transform.ErrShortSrc,
- }, {
- // Remain invalid once invalid.
- in: strR + "ab",
- dir: bidi.RightToLeft,
- n: len(strR),
- err: ErrInvalid,
-
- pSrc: len(strR) + 1,
- nSrc: len(strR),
- err0: ErrInvalid,
- }, {
- // Short destination
- in: "abcdefghij",
- dir: bidi.LeftToRight,
-
- pSrc: 10,
- szDst: 5,
- nSrc: 5,
- err0: transform.ErrShortDst,
- }, {
- in: "\U000102f7",
- dir: bidi.LeftToRight,
- n: len("\U000102f7"),
- err: ErrInvalid,
- }, {
- // Short destination splitting input rune
- in: "e\u0301",
- dir: bidi.LeftToRight,
-
- pSrc: 3,
- szDst: 2,
- nSrc: 1,
- err0: transform.ErrShortDst,
- }, {
- // Unicode 10.0.0 IDNA test string.
- in: "FAX\u2a77\U0001d186",
- dir: bidi.LeftToRight,
- n: len("FAX\u2a77\U0001d186"),
- err: ErrInvalid,
- }, {
- in: "\x80\u0660",
- dir: bidi.RightToLeft,
- n: 0,
- err: ErrInvalid,
- }},
-}
-
func init() {
for rule, cases := range testCases {
for i, tc := range cases {
diff --git a/vendor/golang.org/x/text/unicode/bidi/gen.go b/vendor/golang.org/x/text/unicode/bidi/gen.go
index 040f301..4e1c7ba 100644
--- a/vendor/golang.org/x/text/unicode/bidi/gen.go
+++ b/vendor/golang.org/x/text/unicode/bidi/gen.go
@@ -59,7 +59,7 @@ func genTables() {
log.Fatalf("Too many Class constants (%#x > 0x0F).", numClass)
}
w := gen.NewCodeWriter()
- defer w.WriteGoFile(*outputFile, "bidi")
+ defer w.WriteVersionedGoFile(*outputFile, "bidi")
gen.WriteUnicodeVersion(w)
diff --git a/vendor/golang.org/x/text/unicode/bidi/tables.go b/vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go
similarity index 99%
rename from vendor/golang.org/x/text/unicode/bidi/tables.go
rename to vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go
index a0b2b17..2e1ff19 100644
--- a/vendor/golang.org/x/text/unicode/bidi/tables.go
+++ b/vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go
@@ -1,5 +1,7 @@
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+// +build go1.10
+
package bidi
// UnicodeVersion is the Unicode version from which the tables in this package are derived.
diff --git a/vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go
new file mode 100644
index 0000000..0ca0193
--- /dev/null
+++ b/vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go
@@ -0,0 +1,1781 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+// +build !go1.10
+
+package bidi
+
+// UnicodeVersion is the Unicode version from which the tables in this package are derived.
+const UnicodeVersion = "9.0.0"
+
+// xorMasks contains masks to be xor-ed with brackets to get the reverse
+// version.
+var xorMasks = []int32{ // 8 elements
+ 0, 1, 6, 7, 3, 15, 29, 63,
+} // Size: 56 bytes
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *bidiTrie) lookup(s []byte) (v uint8, sz int) {
+ c0 := s[0]
+ switch {
+ case c0 < 0x80: // is ASCII
+ return bidiValues[c0], 1
+ case c0 < 0xC2:
+ return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+ case c0 < 0xE0: // 2-byte UTF-8
+ if len(s) < 2 {
+ return 0, 0
+ }
+ i := bidiIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c1), 2
+ case c0 < 0xF0: // 3-byte UTF-8
+ if len(s) < 3 {
+ return 0, 0
+ }
+ i := bidiIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = bidiIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c2), 3
+ case c0 < 0xF8: // 4-byte UTF-8
+ if len(s) < 4 {
+ return 0, 0
+ }
+ i := bidiIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = bidiIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ o = uint32(i)<<6 + uint32(c2)
+ i = bidiIndex[o]
+ c3 := s[3]
+ if c3 < 0x80 || 0xC0 <= c3 {
+ return 0, 3 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c3), 4
+ }
+ // Illegal rune
+ return 0, 1
+}
+
+// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *bidiTrie) lookupUnsafe(s []byte) uint8 {
+ c0 := s[0]
+ if c0 < 0x80 { // is ASCII
+ return bidiValues[c0]
+ }
+ i := bidiIndex[c0]
+ if c0 < 0xE0 { // 2-byte UTF-8
+ return t.lookupValue(uint32(i), s[1])
+ }
+ i = bidiIndex[uint32(i)<<6+uint32(s[1])]
+ if c0 < 0xF0 { // 3-byte UTF-8
+ return t.lookupValue(uint32(i), s[2])
+ }
+ i = bidiIndex[uint32(i)<<6+uint32(s[2])]
+ if c0 < 0xF8 { // 4-byte UTF-8
+ return t.lookupValue(uint32(i), s[3])
+ }
+ return 0
+}
+
+// lookupString returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *bidiTrie) lookupString(s string) (v uint8, sz int) {
+ c0 := s[0]
+ switch {
+ case c0 < 0x80: // is ASCII
+ return bidiValues[c0], 1
+ case c0 < 0xC2:
+ return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+ case c0 < 0xE0: // 2-byte UTF-8
+ if len(s) < 2 {
+ return 0, 0
+ }
+ i := bidiIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c1), 2
+ case c0 < 0xF0: // 3-byte UTF-8
+ if len(s) < 3 {
+ return 0, 0
+ }
+ i := bidiIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = bidiIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c2), 3
+ case c0 < 0xF8: // 4-byte UTF-8
+ if len(s) < 4 {
+ return 0, 0
+ }
+ i := bidiIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = bidiIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ o = uint32(i)<<6 + uint32(c2)
+ i = bidiIndex[o]
+ c3 := s[3]
+ if c3 < 0x80 || 0xC0 <= c3 {
+ return 0, 3 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c3), 4
+ }
+ // Illegal rune
+ return 0, 1
+}
+
+// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *bidiTrie) lookupStringUnsafe(s string) uint8 {
+ c0 := s[0]
+ if c0 < 0x80 { // is ASCII
+ return bidiValues[c0]
+ }
+ i := bidiIndex[c0]
+ if c0 < 0xE0 { // 2-byte UTF-8
+ return t.lookupValue(uint32(i), s[1])
+ }
+ i = bidiIndex[uint32(i)<<6+uint32(s[1])]
+ if c0 < 0xF0 { // 3-byte UTF-8
+ return t.lookupValue(uint32(i), s[2])
+ }
+ i = bidiIndex[uint32(i)<<6+uint32(s[2])]
+ if c0 < 0xF8 { // 4-byte UTF-8
+ return t.lookupValue(uint32(i), s[3])
+ }
+ return 0
+}
+
+// bidiTrie. Total size: 15744 bytes (15.38 KiB). Checksum: b4c3b70954803b86.
+type bidiTrie struct{}
+
+func newBidiTrie(i int) *bidiTrie {
+ return &bidiTrie{}
+}
+
+// lookupValue determines the type of block n and looks up the value for b.
+func (t *bidiTrie) lookupValue(n uint32, b byte) uint8 {
+ switch {
+ default:
+ return uint8(bidiValues[n<<6+uint32(b)])
+ }
+}
+
+// bidiValues: 222 blocks, 14208 entries, 14208 bytes
+// The third block is the zero block.
+var bidiValues = [14208]uint8{
+ // Block 0x0, offset 0x0
+ 0x00: 0x000b, 0x01: 0x000b, 0x02: 0x000b, 0x03: 0x000b, 0x04: 0x000b, 0x05: 0x000b,
+ 0x06: 0x000b, 0x07: 0x000b, 0x08: 0x000b, 0x09: 0x0008, 0x0a: 0x0007, 0x0b: 0x0008,
+ 0x0c: 0x0009, 0x0d: 0x0007, 0x0e: 0x000b, 0x0f: 0x000b, 0x10: 0x000b, 0x11: 0x000b,
+ 0x12: 0x000b, 0x13: 0x000b, 0x14: 0x000b, 0x15: 0x000b, 0x16: 0x000b, 0x17: 0x000b,
+ 0x18: 0x000b, 0x19: 0x000b, 0x1a: 0x000b, 0x1b: 0x000b, 0x1c: 0x0007, 0x1d: 0x0007,
+ 0x1e: 0x0007, 0x1f: 0x0008, 0x20: 0x0009, 0x21: 0x000a, 0x22: 0x000a, 0x23: 0x0004,
+ 0x24: 0x0004, 0x25: 0x0004, 0x26: 0x000a, 0x27: 0x000a, 0x28: 0x003a, 0x29: 0x002a,
+ 0x2a: 0x000a, 0x2b: 0x0003, 0x2c: 0x0006, 0x2d: 0x0003, 0x2e: 0x0006, 0x2f: 0x0006,
+ 0x30: 0x0002, 0x31: 0x0002, 0x32: 0x0002, 0x33: 0x0002, 0x34: 0x0002, 0x35: 0x0002,
+ 0x36: 0x0002, 0x37: 0x0002, 0x38: 0x0002, 0x39: 0x0002, 0x3a: 0x0006, 0x3b: 0x000a,
+ 0x3c: 0x000a, 0x3d: 0x000a, 0x3e: 0x000a, 0x3f: 0x000a,
+ // Block 0x1, offset 0x40
+ 0x40: 0x000a,
+ 0x5b: 0x005a, 0x5c: 0x000a, 0x5d: 0x004a,
+ 0x5e: 0x000a, 0x5f: 0x000a, 0x60: 0x000a,
+ 0x7b: 0x005a,
+ 0x7c: 0x000a, 0x7d: 0x004a, 0x7e: 0x000a, 0x7f: 0x000b,
+ // Block 0x2, offset 0x80
+ // Block 0x3, offset 0xc0
+ 0xc0: 0x000b, 0xc1: 0x000b, 0xc2: 0x000b, 0xc3: 0x000b, 0xc4: 0x000b, 0xc5: 0x0007,
+ 0xc6: 0x000b, 0xc7: 0x000b, 0xc8: 0x000b, 0xc9: 0x000b, 0xca: 0x000b, 0xcb: 0x000b,
+ 0xcc: 0x000b, 0xcd: 0x000b, 0xce: 0x000b, 0xcf: 0x000b, 0xd0: 0x000b, 0xd1: 0x000b,
+ 0xd2: 0x000b, 0xd3: 0x000b, 0xd4: 0x000b, 0xd5: 0x000b, 0xd6: 0x000b, 0xd7: 0x000b,
+ 0xd8: 0x000b, 0xd9: 0x000b, 0xda: 0x000b, 0xdb: 0x000b, 0xdc: 0x000b, 0xdd: 0x000b,
+ 0xde: 0x000b, 0xdf: 0x000b, 0xe0: 0x0006, 0xe1: 0x000a, 0xe2: 0x0004, 0xe3: 0x0004,
+ 0xe4: 0x0004, 0xe5: 0x0004, 0xe6: 0x000a, 0xe7: 0x000a, 0xe8: 0x000a, 0xe9: 0x000a,
+ 0xeb: 0x000a, 0xec: 0x000a, 0xed: 0x000b, 0xee: 0x000a, 0xef: 0x000a,
+ 0xf0: 0x0004, 0xf1: 0x0004, 0xf2: 0x0002, 0xf3: 0x0002, 0xf4: 0x000a,
+ 0xf6: 0x000a, 0xf7: 0x000a, 0xf8: 0x000a, 0xf9: 0x0002, 0xfb: 0x000a,
+ 0xfc: 0x000a, 0xfd: 0x000a, 0xfe: 0x000a, 0xff: 0x000a,
+ // Block 0x4, offset 0x100
+ 0x117: 0x000a,
+ 0x137: 0x000a,
+ // Block 0x5, offset 0x140
+ 0x179: 0x000a, 0x17a: 0x000a,
+ // Block 0x6, offset 0x180
+ 0x182: 0x000a, 0x183: 0x000a, 0x184: 0x000a, 0x185: 0x000a,
+ 0x186: 0x000a, 0x187: 0x000a, 0x188: 0x000a, 0x189: 0x000a, 0x18a: 0x000a, 0x18b: 0x000a,
+ 0x18c: 0x000a, 0x18d: 0x000a, 0x18e: 0x000a, 0x18f: 0x000a,
+ 0x192: 0x000a, 0x193: 0x000a, 0x194: 0x000a, 0x195: 0x000a, 0x196: 0x000a, 0x197: 0x000a,
+ 0x198: 0x000a, 0x199: 0x000a, 0x19a: 0x000a, 0x19b: 0x000a, 0x19c: 0x000a, 0x19d: 0x000a,
+ 0x19e: 0x000a, 0x19f: 0x000a,
+ 0x1a5: 0x000a, 0x1a6: 0x000a, 0x1a7: 0x000a, 0x1a8: 0x000a, 0x1a9: 0x000a,
+ 0x1aa: 0x000a, 0x1ab: 0x000a, 0x1ac: 0x000a, 0x1ad: 0x000a, 0x1af: 0x000a,
+ 0x1b0: 0x000a, 0x1b1: 0x000a, 0x1b2: 0x000a, 0x1b3: 0x000a, 0x1b4: 0x000a, 0x1b5: 0x000a,
+ 0x1b6: 0x000a, 0x1b7: 0x000a, 0x1b8: 0x000a, 0x1b9: 0x000a, 0x1ba: 0x000a, 0x1bb: 0x000a,
+ 0x1bc: 0x000a, 0x1bd: 0x000a, 0x1be: 0x000a, 0x1bf: 0x000a,
+ // Block 0x7, offset 0x1c0
+ 0x1c0: 0x000c, 0x1c1: 0x000c, 0x1c2: 0x000c, 0x1c3: 0x000c, 0x1c4: 0x000c, 0x1c5: 0x000c,
+ 0x1c6: 0x000c, 0x1c7: 0x000c, 0x1c8: 0x000c, 0x1c9: 0x000c, 0x1ca: 0x000c, 0x1cb: 0x000c,
+ 0x1cc: 0x000c, 0x1cd: 0x000c, 0x1ce: 0x000c, 0x1cf: 0x000c, 0x1d0: 0x000c, 0x1d1: 0x000c,
+ 0x1d2: 0x000c, 0x1d3: 0x000c, 0x1d4: 0x000c, 0x1d5: 0x000c, 0x1d6: 0x000c, 0x1d7: 0x000c,
+ 0x1d8: 0x000c, 0x1d9: 0x000c, 0x1da: 0x000c, 0x1db: 0x000c, 0x1dc: 0x000c, 0x1dd: 0x000c,
+ 0x1de: 0x000c, 0x1df: 0x000c, 0x1e0: 0x000c, 0x1e1: 0x000c, 0x1e2: 0x000c, 0x1e3: 0x000c,
+ 0x1e4: 0x000c, 0x1e5: 0x000c, 0x1e6: 0x000c, 0x1e7: 0x000c, 0x1e8: 0x000c, 0x1e9: 0x000c,
+ 0x1ea: 0x000c, 0x1eb: 0x000c, 0x1ec: 0x000c, 0x1ed: 0x000c, 0x1ee: 0x000c, 0x1ef: 0x000c,
+ 0x1f0: 0x000c, 0x1f1: 0x000c, 0x1f2: 0x000c, 0x1f3: 0x000c, 0x1f4: 0x000c, 0x1f5: 0x000c,
+ 0x1f6: 0x000c, 0x1f7: 0x000c, 0x1f8: 0x000c, 0x1f9: 0x000c, 0x1fa: 0x000c, 0x1fb: 0x000c,
+ 0x1fc: 0x000c, 0x1fd: 0x000c, 0x1fe: 0x000c, 0x1ff: 0x000c,
+ // Block 0x8, offset 0x200
+ 0x200: 0x000c, 0x201: 0x000c, 0x202: 0x000c, 0x203: 0x000c, 0x204: 0x000c, 0x205: 0x000c,
+ 0x206: 0x000c, 0x207: 0x000c, 0x208: 0x000c, 0x209: 0x000c, 0x20a: 0x000c, 0x20b: 0x000c,
+ 0x20c: 0x000c, 0x20d: 0x000c, 0x20e: 0x000c, 0x20f: 0x000c, 0x210: 0x000c, 0x211: 0x000c,
+ 0x212: 0x000c, 0x213: 0x000c, 0x214: 0x000c, 0x215: 0x000c, 0x216: 0x000c, 0x217: 0x000c,
+ 0x218: 0x000c, 0x219: 0x000c, 0x21a: 0x000c, 0x21b: 0x000c, 0x21c: 0x000c, 0x21d: 0x000c,
+ 0x21e: 0x000c, 0x21f: 0x000c, 0x220: 0x000c, 0x221: 0x000c, 0x222: 0x000c, 0x223: 0x000c,
+ 0x224: 0x000c, 0x225: 0x000c, 0x226: 0x000c, 0x227: 0x000c, 0x228: 0x000c, 0x229: 0x000c,
+ 0x22a: 0x000c, 0x22b: 0x000c, 0x22c: 0x000c, 0x22d: 0x000c, 0x22e: 0x000c, 0x22f: 0x000c,
+ 0x234: 0x000a, 0x235: 0x000a,
+ 0x23e: 0x000a,
+ // Block 0x9, offset 0x240
+ 0x244: 0x000a, 0x245: 0x000a,
+ 0x247: 0x000a,
+ // Block 0xa, offset 0x280
+ 0x2b6: 0x000a,
+ // Block 0xb, offset 0x2c0
+ 0x2c3: 0x000c, 0x2c4: 0x000c, 0x2c5: 0x000c,
+ 0x2c6: 0x000c, 0x2c7: 0x000c, 0x2c8: 0x000c, 0x2c9: 0x000c,
+ // Block 0xc, offset 0x300
+ 0x30a: 0x000a,
+ 0x30d: 0x000a, 0x30e: 0x000a, 0x30f: 0x0004, 0x310: 0x0001, 0x311: 0x000c,
+ 0x312: 0x000c, 0x313: 0x000c, 0x314: 0x000c, 0x315: 0x000c, 0x316: 0x000c, 0x317: 0x000c,
+ 0x318: 0x000c, 0x319: 0x000c, 0x31a: 0x000c, 0x31b: 0x000c, 0x31c: 0x000c, 0x31d: 0x000c,
+ 0x31e: 0x000c, 0x31f: 0x000c, 0x320: 0x000c, 0x321: 0x000c, 0x322: 0x000c, 0x323: 0x000c,
+ 0x324: 0x000c, 0x325: 0x000c, 0x326: 0x000c, 0x327: 0x000c, 0x328: 0x000c, 0x329: 0x000c,
+ 0x32a: 0x000c, 0x32b: 0x000c, 0x32c: 0x000c, 0x32d: 0x000c, 0x32e: 0x000c, 0x32f: 0x000c,
+ 0x330: 0x000c, 0x331: 0x000c, 0x332: 0x000c, 0x333: 0x000c, 0x334: 0x000c, 0x335: 0x000c,
+ 0x336: 0x000c, 0x337: 0x000c, 0x338: 0x000c, 0x339: 0x000c, 0x33a: 0x000c, 0x33b: 0x000c,
+ 0x33c: 0x000c, 0x33d: 0x000c, 0x33e: 0x0001, 0x33f: 0x000c,
+ // Block 0xd, offset 0x340
+ 0x340: 0x0001, 0x341: 0x000c, 0x342: 0x000c, 0x343: 0x0001, 0x344: 0x000c, 0x345: 0x000c,
+ 0x346: 0x0001, 0x347: 0x000c, 0x348: 0x0001, 0x349: 0x0001, 0x34a: 0x0001, 0x34b: 0x0001,
+ 0x34c: 0x0001, 0x34d: 0x0001, 0x34e: 0x0001, 0x34f: 0x0001, 0x350: 0x0001, 0x351: 0x0001,
+ 0x352: 0x0001, 0x353: 0x0001, 0x354: 0x0001, 0x355: 0x0001, 0x356: 0x0001, 0x357: 0x0001,
+ 0x358: 0x0001, 0x359: 0x0001, 0x35a: 0x0001, 0x35b: 0x0001, 0x35c: 0x0001, 0x35d: 0x0001,
+ 0x35e: 0x0001, 0x35f: 0x0001, 0x360: 0x0001, 0x361: 0x0001, 0x362: 0x0001, 0x363: 0x0001,
+ 0x364: 0x0001, 0x365: 0x0001, 0x366: 0x0001, 0x367: 0x0001, 0x368: 0x0001, 0x369: 0x0001,
+ 0x36a: 0x0001, 0x36b: 0x0001, 0x36c: 0x0001, 0x36d: 0x0001, 0x36e: 0x0001, 0x36f: 0x0001,
+ 0x370: 0x0001, 0x371: 0x0001, 0x372: 0x0001, 0x373: 0x0001, 0x374: 0x0001, 0x375: 0x0001,
+ 0x376: 0x0001, 0x377: 0x0001, 0x378: 0x0001, 0x379: 0x0001, 0x37a: 0x0001, 0x37b: 0x0001,
+ 0x37c: 0x0001, 0x37d: 0x0001, 0x37e: 0x0001, 0x37f: 0x0001,
+ // Block 0xe, offset 0x380
+ 0x380: 0x0005, 0x381: 0x0005, 0x382: 0x0005, 0x383: 0x0005, 0x384: 0x0005, 0x385: 0x0005,
+ 0x386: 0x000a, 0x387: 0x000a, 0x388: 0x000d, 0x389: 0x0004, 0x38a: 0x0004, 0x38b: 0x000d,
+ 0x38c: 0x0006, 0x38d: 0x000d, 0x38e: 0x000a, 0x38f: 0x000a, 0x390: 0x000c, 0x391: 0x000c,
+ 0x392: 0x000c, 0x393: 0x000c, 0x394: 0x000c, 0x395: 0x000c, 0x396: 0x000c, 0x397: 0x000c,
+ 0x398: 0x000c, 0x399: 0x000c, 0x39a: 0x000c, 0x39b: 0x000d, 0x39c: 0x000d, 0x39d: 0x000d,
+ 0x39e: 0x000d, 0x39f: 0x000d, 0x3a0: 0x000d, 0x3a1: 0x000d, 0x3a2: 0x000d, 0x3a3: 0x000d,
+ 0x3a4: 0x000d, 0x3a5: 0x000d, 0x3a6: 0x000d, 0x3a7: 0x000d, 0x3a8: 0x000d, 0x3a9: 0x000d,
+ 0x3aa: 0x000d, 0x3ab: 0x000d, 0x3ac: 0x000d, 0x3ad: 0x000d, 0x3ae: 0x000d, 0x3af: 0x000d,
+ 0x3b0: 0x000d, 0x3b1: 0x000d, 0x3b2: 0x000d, 0x3b3: 0x000d, 0x3b4: 0x000d, 0x3b5: 0x000d,
+ 0x3b6: 0x000d, 0x3b7: 0x000d, 0x3b8: 0x000d, 0x3b9: 0x000d, 0x3ba: 0x000d, 0x3bb: 0x000d,
+ 0x3bc: 0x000d, 0x3bd: 0x000d, 0x3be: 0x000d, 0x3bf: 0x000d,
+ // Block 0xf, offset 0x3c0
+ 0x3c0: 0x000d, 0x3c1: 0x000d, 0x3c2: 0x000d, 0x3c3: 0x000d, 0x3c4: 0x000d, 0x3c5: 0x000d,
+ 0x3c6: 0x000d, 0x3c7: 0x000d, 0x3c8: 0x000d, 0x3c9: 0x000d, 0x3ca: 0x000d, 0x3cb: 0x000c,
+ 0x3cc: 0x000c, 0x3cd: 0x000c, 0x3ce: 0x000c, 0x3cf: 0x000c, 0x3d0: 0x000c, 0x3d1: 0x000c,
+ 0x3d2: 0x000c, 0x3d3: 0x000c, 0x3d4: 0x000c, 0x3d5: 0x000c, 0x3d6: 0x000c, 0x3d7: 0x000c,
+ 0x3d8: 0x000c, 0x3d9: 0x000c, 0x3da: 0x000c, 0x3db: 0x000c, 0x3dc: 0x000c, 0x3dd: 0x000c,
+ 0x3de: 0x000c, 0x3df: 0x000c, 0x3e0: 0x0005, 0x3e1: 0x0005, 0x3e2: 0x0005, 0x3e3: 0x0005,
+ 0x3e4: 0x0005, 0x3e5: 0x0005, 0x3e6: 0x0005, 0x3e7: 0x0005, 0x3e8: 0x0005, 0x3e9: 0x0005,
+ 0x3ea: 0x0004, 0x3eb: 0x0005, 0x3ec: 0x0005, 0x3ed: 0x000d, 0x3ee: 0x000d, 0x3ef: 0x000d,
+ 0x3f0: 0x000c, 0x3f1: 0x000d, 0x3f2: 0x000d, 0x3f3: 0x000d, 0x3f4: 0x000d, 0x3f5: 0x000d,
+ 0x3f6: 0x000d, 0x3f7: 0x000d, 0x3f8: 0x000d, 0x3f9: 0x000d, 0x3fa: 0x000d, 0x3fb: 0x000d,
+ 0x3fc: 0x000d, 0x3fd: 0x000d, 0x3fe: 0x000d, 0x3ff: 0x000d,
+ // Block 0x10, offset 0x400
+ 0x400: 0x000d, 0x401: 0x000d, 0x402: 0x000d, 0x403: 0x000d, 0x404: 0x000d, 0x405: 0x000d,
+ 0x406: 0x000d, 0x407: 0x000d, 0x408: 0x000d, 0x409: 0x000d, 0x40a: 0x000d, 0x40b: 0x000d,
+ 0x40c: 0x000d, 0x40d: 0x000d, 0x40e: 0x000d, 0x40f: 0x000d, 0x410: 0x000d, 0x411: 0x000d,
+ 0x412: 0x000d, 0x413: 0x000d, 0x414: 0x000d, 0x415: 0x000d, 0x416: 0x000d, 0x417: 0x000d,
+ 0x418: 0x000d, 0x419: 0x000d, 0x41a: 0x000d, 0x41b: 0x000d, 0x41c: 0x000d, 0x41d: 0x000d,
+ 0x41e: 0x000d, 0x41f: 0x000d, 0x420: 0x000d, 0x421: 0x000d, 0x422: 0x000d, 0x423: 0x000d,
+ 0x424: 0x000d, 0x425: 0x000d, 0x426: 0x000d, 0x427: 0x000d, 0x428: 0x000d, 0x429: 0x000d,
+ 0x42a: 0x000d, 0x42b: 0x000d, 0x42c: 0x000d, 0x42d: 0x000d, 0x42e: 0x000d, 0x42f: 0x000d,
+ 0x430: 0x000d, 0x431: 0x000d, 0x432: 0x000d, 0x433: 0x000d, 0x434: 0x000d, 0x435: 0x000d,
+ 0x436: 0x000d, 0x437: 0x000d, 0x438: 0x000d, 0x439: 0x000d, 0x43a: 0x000d, 0x43b: 0x000d,
+ 0x43c: 0x000d, 0x43d: 0x000d, 0x43e: 0x000d, 0x43f: 0x000d,
+ // Block 0x11, offset 0x440
+ 0x440: 0x000d, 0x441: 0x000d, 0x442: 0x000d, 0x443: 0x000d, 0x444: 0x000d, 0x445: 0x000d,
+ 0x446: 0x000d, 0x447: 0x000d, 0x448: 0x000d, 0x449: 0x000d, 0x44a: 0x000d, 0x44b: 0x000d,
+ 0x44c: 0x000d, 0x44d: 0x000d, 0x44e: 0x000d, 0x44f: 0x000d, 0x450: 0x000d, 0x451: 0x000d,
+ 0x452: 0x000d, 0x453: 0x000d, 0x454: 0x000d, 0x455: 0x000d, 0x456: 0x000c, 0x457: 0x000c,
+ 0x458: 0x000c, 0x459: 0x000c, 0x45a: 0x000c, 0x45b: 0x000c, 0x45c: 0x000c, 0x45d: 0x0005,
+ 0x45e: 0x000a, 0x45f: 0x000c, 0x460: 0x000c, 0x461: 0x000c, 0x462: 0x000c, 0x463: 0x000c,
+ 0x464: 0x000c, 0x465: 0x000d, 0x466: 0x000d, 0x467: 0x000c, 0x468: 0x000c, 0x469: 0x000a,
+ 0x46a: 0x000c, 0x46b: 0x000c, 0x46c: 0x000c, 0x46d: 0x000c, 0x46e: 0x000d, 0x46f: 0x000d,
+ 0x470: 0x0002, 0x471: 0x0002, 0x472: 0x0002, 0x473: 0x0002, 0x474: 0x0002, 0x475: 0x0002,
+ 0x476: 0x0002, 0x477: 0x0002, 0x478: 0x0002, 0x479: 0x0002, 0x47a: 0x000d, 0x47b: 0x000d,
+ 0x47c: 0x000d, 0x47d: 0x000d, 0x47e: 0x000d, 0x47f: 0x000d,
+ // Block 0x12, offset 0x480
+ 0x480: 0x000d, 0x481: 0x000d, 0x482: 0x000d, 0x483: 0x000d, 0x484: 0x000d, 0x485: 0x000d,
+ 0x486: 0x000d, 0x487: 0x000d, 0x488: 0x000d, 0x489: 0x000d, 0x48a: 0x000d, 0x48b: 0x000d,
+ 0x48c: 0x000d, 0x48d: 0x000d, 0x48e: 0x000d, 0x48f: 0x000d, 0x490: 0x000d, 0x491: 0x000c,
+ 0x492: 0x000d, 0x493: 0x000d, 0x494: 0x000d, 0x495: 0x000d, 0x496: 0x000d, 0x497: 0x000d,
+ 0x498: 0x000d, 0x499: 0x000d, 0x49a: 0x000d, 0x49b: 0x000d, 0x49c: 0x000d, 0x49d: 0x000d,
+ 0x49e: 0x000d, 0x49f: 0x000d, 0x4a0: 0x000d, 0x4a1: 0x000d, 0x4a2: 0x000d, 0x4a3: 0x000d,
+ 0x4a4: 0x000d, 0x4a5: 0x000d, 0x4a6: 0x000d, 0x4a7: 0x000d, 0x4a8: 0x000d, 0x4a9: 0x000d,
+ 0x4aa: 0x000d, 0x4ab: 0x000d, 0x4ac: 0x000d, 0x4ad: 0x000d, 0x4ae: 0x000d, 0x4af: 0x000d,
+ 0x4b0: 0x000c, 0x4b1: 0x000c, 0x4b2: 0x000c, 0x4b3: 0x000c, 0x4b4: 0x000c, 0x4b5: 0x000c,
+ 0x4b6: 0x000c, 0x4b7: 0x000c, 0x4b8: 0x000c, 0x4b9: 0x000c, 0x4ba: 0x000c, 0x4bb: 0x000c,
+ 0x4bc: 0x000c, 0x4bd: 0x000c, 0x4be: 0x000c, 0x4bf: 0x000c,
+ // Block 0x13, offset 0x4c0
+ 0x4c0: 0x000c, 0x4c1: 0x000c, 0x4c2: 0x000c, 0x4c3: 0x000c, 0x4c4: 0x000c, 0x4c5: 0x000c,
+ 0x4c6: 0x000c, 0x4c7: 0x000c, 0x4c8: 0x000c, 0x4c9: 0x000c, 0x4ca: 0x000c, 0x4cb: 0x000d,
+ 0x4cc: 0x000d, 0x4cd: 0x000d, 0x4ce: 0x000d, 0x4cf: 0x000d, 0x4d0: 0x000d, 0x4d1: 0x000d,
+ 0x4d2: 0x000d, 0x4d3: 0x000d, 0x4d4: 0x000d, 0x4d5: 0x000d, 0x4d6: 0x000d, 0x4d7: 0x000d,
+ 0x4d8: 0x000d, 0x4d9: 0x000d, 0x4da: 0x000d, 0x4db: 0x000d, 0x4dc: 0x000d, 0x4dd: 0x000d,
+ 0x4de: 0x000d, 0x4df: 0x000d, 0x4e0: 0x000d, 0x4e1: 0x000d, 0x4e2: 0x000d, 0x4e3: 0x000d,
+ 0x4e4: 0x000d, 0x4e5: 0x000d, 0x4e6: 0x000d, 0x4e7: 0x000d, 0x4e8: 0x000d, 0x4e9: 0x000d,
+ 0x4ea: 0x000d, 0x4eb: 0x000d, 0x4ec: 0x000d, 0x4ed: 0x000d, 0x4ee: 0x000d, 0x4ef: 0x000d,
+ 0x4f0: 0x000d, 0x4f1: 0x000d, 0x4f2: 0x000d, 0x4f3: 0x000d, 0x4f4: 0x000d, 0x4f5: 0x000d,
+ 0x4f6: 0x000d, 0x4f7: 0x000d, 0x4f8: 0x000d, 0x4f9: 0x000d, 0x4fa: 0x000d, 0x4fb: 0x000d,
+ 0x4fc: 0x000d, 0x4fd: 0x000d, 0x4fe: 0x000d, 0x4ff: 0x000d,
+ // Block 0x14, offset 0x500
+ 0x500: 0x000d, 0x501: 0x000d, 0x502: 0x000d, 0x503: 0x000d, 0x504: 0x000d, 0x505: 0x000d,
+ 0x506: 0x000d, 0x507: 0x000d, 0x508: 0x000d, 0x509: 0x000d, 0x50a: 0x000d, 0x50b: 0x000d,
+ 0x50c: 0x000d, 0x50d: 0x000d, 0x50e: 0x000d, 0x50f: 0x000d, 0x510: 0x000d, 0x511: 0x000d,
+ 0x512: 0x000d, 0x513: 0x000d, 0x514: 0x000d, 0x515: 0x000d, 0x516: 0x000d, 0x517: 0x000d,
+ 0x518: 0x000d, 0x519: 0x000d, 0x51a: 0x000d, 0x51b: 0x000d, 0x51c: 0x000d, 0x51d: 0x000d,
+ 0x51e: 0x000d, 0x51f: 0x000d, 0x520: 0x000d, 0x521: 0x000d, 0x522: 0x000d, 0x523: 0x000d,
+ 0x524: 0x000d, 0x525: 0x000d, 0x526: 0x000c, 0x527: 0x000c, 0x528: 0x000c, 0x529: 0x000c,
+ 0x52a: 0x000c, 0x52b: 0x000c, 0x52c: 0x000c, 0x52d: 0x000c, 0x52e: 0x000c, 0x52f: 0x000c,
+ 0x530: 0x000c, 0x531: 0x000d, 0x532: 0x000d, 0x533: 0x000d, 0x534: 0x000d, 0x535: 0x000d,
+ 0x536: 0x000d, 0x537: 0x000d, 0x538: 0x000d, 0x539: 0x000d, 0x53a: 0x000d, 0x53b: 0x000d,
+ 0x53c: 0x000d, 0x53d: 0x000d, 0x53e: 0x000d, 0x53f: 0x000d,
+ // Block 0x15, offset 0x540
+ 0x540: 0x0001, 0x541: 0x0001, 0x542: 0x0001, 0x543: 0x0001, 0x544: 0x0001, 0x545: 0x0001,
+ 0x546: 0x0001, 0x547: 0x0001, 0x548: 0x0001, 0x549: 0x0001, 0x54a: 0x0001, 0x54b: 0x0001,
+ 0x54c: 0x0001, 0x54d: 0x0001, 0x54e: 0x0001, 0x54f: 0x0001, 0x550: 0x0001, 0x551: 0x0001,
+ 0x552: 0x0001, 0x553: 0x0001, 0x554: 0x0001, 0x555: 0x0001, 0x556: 0x0001, 0x557: 0x0001,
+ 0x558: 0x0001, 0x559: 0x0001, 0x55a: 0x0001, 0x55b: 0x0001, 0x55c: 0x0001, 0x55d: 0x0001,
+ 0x55e: 0x0001, 0x55f: 0x0001, 0x560: 0x0001, 0x561: 0x0001, 0x562: 0x0001, 0x563: 0x0001,
+ 0x564: 0x0001, 0x565: 0x0001, 0x566: 0x0001, 0x567: 0x0001, 0x568: 0x0001, 0x569: 0x0001,
+ 0x56a: 0x0001, 0x56b: 0x000c, 0x56c: 0x000c, 0x56d: 0x000c, 0x56e: 0x000c, 0x56f: 0x000c,
+ 0x570: 0x000c, 0x571: 0x000c, 0x572: 0x000c, 0x573: 0x000c, 0x574: 0x0001, 0x575: 0x0001,
+ 0x576: 0x000a, 0x577: 0x000a, 0x578: 0x000a, 0x579: 0x000a, 0x57a: 0x0001, 0x57b: 0x0001,
+ 0x57c: 0x0001, 0x57d: 0x0001, 0x57e: 0x0001, 0x57f: 0x0001,
+ // Block 0x16, offset 0x580
+ 0x580: 0x0001, 0x581: 0x0001, 0x582: 0x0001, 0x583: 0x0001, 0x584: 0x0001, 0x585: 0x0001,
+ 0x586: 0x0001, 0x587: 0x0001, 0x588: 0x0001, 0x589: 0x0001, 0x58a: 0x0001, 0x58b: 0x0001,
+ 0x58c: 0x0001, 0x58d: 0x0001, 0x58e: 0x0001, 0x58f: 0x0001, 0x590: 0x0001, 0x591: 0x0001,
+ 0x592: 0x0001, 0x593: 0x0001, 0x594: 0x0001, 0x595: 0x0001, 0x596: 0x000c, 0x597: 0x000c,
+ 0x598: 0x000c, 0x599: 0x000c, 0x59a: 0x0001, 0x59b: 0x000c, 0x59c: 0x000c, 0x59d: 0x000c,
+ 0x59e: 0x000c, 0x59f: 0x000c, 0x5a0: 0x000c, 0x5a1: 0x000c, 0x5a2: 0x000c, 0x5a3: 0x000c,
+ 0x5a4: 0x0001, 0x5a5: 0x000c, 0x5a6: 0x000c, 0x5a7: 0x000c, 0x5a8: 0x0001, 0x5a9: 0x000c,
+ 0x5aa: 0x000c, 0x5ab: 0x000c, 0x5ac: 0x000c, 0x5ad: 0x000c, 0x5ae: 0x0001, 0x5af: 0x0001,
+ 0x5b0: 0x0001, 0x5b1: 0x0001, 0x5b2: 0x0001, 0x5b3: 0x0001, 0x5b4: 0x0001, 0x5b5: 0x0001,
+ 0x5b6: 0x0001, 0x5b7: 0x0001, 0x5b8: 0x0001, 0x5b9: 0x0001, 0x5ba: 0x0001, 0x5bb: 0x0001,
+ 0x5bc: 0x0001, 0x5bd: 0x0001, 0x5be: 0x0001, 0x5bf: 0x0001,
+ // Block 0x17, offset 0x5c0
+ 0x5c0: 0x0001, 0x5c1: 0x0001, 0x5c2: 0x0001, 0x5c3: 0x0001, 0x5c4: 0x0001, 0x5c5: 0x0001,
+ 0x5c6: 0x0001, 0x5c7: 0x0001, 0x5c8: 0x0001, 0x5c9: 0x0001, 0x5ca: 0x0001, 0x5cb: 0x0001,
+ 0x5cc: 0x0001, 0x5cd: 0x0001, 0x5ce: 0x0001, 0x5cf: 0x0001, 0x5d0: 0x0001, 0x5d1: 0x0001,
+ 0x5d2: 0x0001, 0x5d3: 0x0001, 0x5d4: 0x0001, 0x5d5: 0x0001, 0x5d6: 0x0001, 0x5d7: 0x0001,
+ 0x5d8: 0x0001, 0x5d9: 0x000c, 0x5da: 0x000c, 0x5db: 0x000c, 0x5dc: 0x0001, 0x5dd: 0x0001,
+ 0x5de: 0x0001, 0x5df: 0x0001, 0x5e0: 0x0001, 0x5e1: 0x0001, 0x5e2: 0x0001, 0x5e3: 0x0001,
+ 0x5e4: 0x0001, 0x5e5: 0x0001, 0x5e6: 0x0001, 0x5e7: 0x0001, 0x5e8: 0x0001, 0x5e9: 0x0001,
+ 0x5ea: 0x0001, 0x5eb: 0x0001, 0x5ec: 0x0001, 0x5ed: 0x0001, 0x5ee: 0x0001, 0x5ef: 0x0001,
+ 0x5f0: 0x0001, 0x5f1: 0x0001, 0x5f2: 0x0001, 0x5f3: 0x0001, 0x5f4: 0x0001, 0x5f5: 0x0001,
+ 0x5f6: 0x0001, 0x5f7: 0x0001, 0x5f8: 0x0001, 0x5f9: 0x0001, 0x5fa: 0x0001, 0x5fb: 0x0001,
+ 0x5fc: 0x0001, 0x5fd: 0x0001, 0x5fe: 0x0001, 0x5ff: 0x0001,
+ // Block 0x18, offset 0x600
+ 0x600: 0x0001, 0x601: 0x0001, 0x602: 0x0001, 0x603: 0x0001, 0x604: 0x0001, 0x605: 0x0001,
+ 0x606: 0x0001, 0x607: 0x0001, 0x608: 0x0001, 0x609: 0x0001, 0x60a: 0x0001, 0x60b: 0x0001,
+ 0x60c: 0x0001, 0x60d: 0x0001, 0x60e: 0x0001, 0x60f: 0x0001, 0x610: 0x0001, 0x611: 0x0001,
+ 0x612: 0x0001, 0x613: 0x0001, 0x614: 0x0001, 0x615: 0x0001, 0x616: 0x0001, 0x617: 0x0001,
+ 0x618: 0x0001, 0x619: 0x0001, 0x61a: 0x0001, 0x61b: 0x0001, 0x61c: 0x0001, 0x61d: 0x0001,
+ 0x61e: 0x0001, 0x61f: 0x0001, 0x620: 0x000d, 0x621: 0x000d, 0x622: 0x000d, 0x623: 0x000d,
+ 0x624: 0x000d, 0x625: 0x000d, 0x626: 0x000d, 0x627: 0x000d, 0x628: 0x000d, 0x629: 0x000d,
+ 0x62a: 0x000d, 0x62b: 0x000d, 0x62c: 0x000d, 0x62d: 0x000d, 0x62e: 0x000d, 0x62f: 0x000d,
+ 0x630: 0x000d, 0x631: 0x000d, 0x632: 0x000d, 0x633: 0x000d, 0x634: 0x000d, 0x635: 0x000d,
+ 0x636: 0x000d, 0x637: 0x000d, 0x638: 0x000d, 0x639: 0x000d, 0x63a: 0x000d, 0x63b: 0x000d,
+ 0x63c: 0x000d, 0x63d: 0x000d, 0x63e: 0x000d, 0x63f: 0x000d,
+ // Block 0x19, offset 0x640
+ 0x640: 0x000d, 0x641: 0x000d, 0x642: 0x000d, 0x643: 0x000d, 0x644: 0x000d, 0x645: 0x000d,
+ 0x646: 0x000d, 0x647: 0x000d, 0x648: 0x000d, 0x649: 0x000d, 0x64a: 0x000d, 0x64b: 0x000d,
+ 0x64c: 0x000d, 0x64d: 0x000d, 0x64e: 0x000d, 0x64f: 0x000d, 0x650: 0x000d, 0x651: 0x000d,
+ 0x652: 0x000d, 0x653: 0x000d, 0x654: 0x000c, 0x655: 0x000c, 0x656: 0x000c, 0x657: 0x000c,
+ 0x658: 0x000c, 0x659: 0x000c, 0x65a: 0x000c, 0x65b: 0x000c, 0x65c: 0x000c, 0x65d: 0x000c,
+ 0x65e: 0x000c, 0x65f: 0x000c, 0x660: 0x000c, 0x661: 0x000c, 0x662: 0x0005, 0x663: 0x000c,
+ 0x664: 0x000c, 0x665: 0x000c, 0x666: 0x000c, 0x667: 0x000c, 0x668: 0x000c, 0x669: 0x000c,
+ 0x66a: 0x000c, 0x66b: 0x000c, 0x66c: 0x000c, 0x66d: 0x000c, 0x66e: 0x000c, 0x66f: 0x000c,
+ 0x670: 0x000c, 0x671: 0x000c, 0x672: 0x000c, 0x673: 0x000c, 0x674: 0x000c, 0x675: 0x000c,
+ 0x676: 0x000c, 0x677: 0x000c, 0x678: 0x000c, 0x679: 0x000c, 0x67a: 0x000c, 0x67b: 0x000c,
+ 0x67c: 0x000c, 0x67d: 0x000c, 0x67e: 0x000c, 0x67f: 0x000c,
+ // Block 0x1a, offset 0x680
+ 0x680: 0x000c, 0x681: 0x000c, 0x682: 0x000c,
+ 0x6ba: 0x000c,
+ 0x6bc: 0x000c,
+ // Block 0x1b, offset 0x6c0
+ 0x6c1: 0x000c, 0x6c2: 0x000c, 0x6c3: 0x000c, 0x6c4: 0x000c, 0x6c5: 0x000c,
+ 0x6c6: 0x000c, 0x6c7: 0x000c, 0x6c8: 0x000c,
+ 0x6cd: 0x000c, 0x6d1: 0x000c,
+ 0x6d2: 0x000c, 0x6d3: 0x000c, 0x6d4: 0x000c, 0x6d5: 0x000c, 0x6d6: 0x000c, 0x6d7: 0x000c,
+ 0x6e2: 0x000c, 0x6e3: 0x000c,
+ // Block 0x1c, offset 0x700
+ 0x701: 0x000c,
+ 0x73c: 0x000c,
+ // Block 0x1d, offset 0x740
+ 0x741: 0x000c, 0x742: 0x000c, 0x743: 0x000c, 0x744: 0x000c,
+ 0x74d: 0x000c,
+ 0x762: 0x000c, 0x763: 0x000c,
+ 0x772: 0x0004, 0x773: 0x0004,
+ 0x77b: 0x0004,
+ // Block 0x1e, offset 0x780
+ 0x781: 0x000c, 0x782: 0x000c,
+ 0x7bc: 0x000c,
+ // Block 0x1f, offset 0x7c0
+ 0x7c1: 0x000c, 0x7c2: 0x000c,
+ 0x7c7: 0x000c, 0x7c8: 0x000c, 0x7cb: 0x000c,
+ 0x7cc: 0x000c, 0x7cd: 0x000c, 0x7d1: 0x000c,
+ 0x7f0: 0x000c, 0x7f1: 0x000c, 0x7f5: 0x000c,
+ // Block 0x20, offset 0x800
+ 0x801: 0x000c, 0x802: 0x000c, 0x803: 0x000c, 0x804: 0x000c, 0x805: 0x000c,
+ 0x807: 0x000c, 0x808: 0x000c,
+ 0x80d: 0x000c,
+ 0x822: 0x000c, 0x823: 0x000c,
+ 0x831: 0x0004,
+ // Block 0x21, offset 0x840
+ 0x841: 0x000c,
+ 0x87c: 0x000c, 0x87f: 0x000c,
+ // Block 0x22, offset 0x880
+ 0x881: 0x000c, 0x882: 0x000c, 0x883: 0x000c, 0x884: 0x000c,
+ 0x88d: 0x000c,
+ 0x896: 0x000c,
+ 0x8a2: 0x000c, 0x8a3: 0x000c,
+ // Block 0x23, offset 0x8c0
+ 0x8c2: 0x000c,
+ // Block 0x24, offset 0x900
+ 0x900: 0x000c,
+ 0x90d: 0x000c,
+ 0x933: 0x000a, 0x934: 0x000a, 0x935: 0x000a,
+ 0x936: 0x000a, 0x937: 0x000a, 0x938: 0x000a, 0x939: 0x0004, 0x93a: 0x000a,
+ // Block 0x25, offset 0x940
+ 0x940: 0x000c,
+ 0x97e: 0x000c, 0x97f: 0x000c,
+ // Block 0x26, offset 0x980
+ 0x980: 0x000c,
+ 0x986: 0x000c, 0x987: 0x000c, 0x988: 0x000c, 0x98a: 0x000c, 0x98b: 0x000c,
+ 0x98c: 0x000c, 0x98d: 0x000c,
+ 0x995: 0x000c, 0x996: 0x000c,
+ 0x9a2: 0x000c, 0x9a3: 0x000c,
+ 0x9b8: 0x000a, 0x9b9: 0x000a, 0x9ba: 0x000a, 0x9bb: 0x000a,
+ 0x9bc: 0x000a, 0x9bd: 0x000a, 0x9be: 0x000a,
+ // Block 0x27, offset 0x9c0
+ 0x9cc: 0x000c, 0x9cd: 0x000c,
+ 0x9e2: 0x000c, 0x9e3: 0x000c,
+ // Block 0x28, offset 0xa00
+ 0xa01: 0x000c,
+ // Block 0x29, offset 0xa40
+ 0xa41: 0x000c, 0xa42: 0x000c, 0xa43: 0x000c, 0xa44: 0x000c,
+ 0xa4d: 0x000c,
+ 0xa62: 0x000c, 0xa63: 0x000c,
+ // Block 0x2a, offset 0xa80
+ 0xa8a: 0x000c,
+ 0xa92: 0x000c, 0xa93: 0x000c, 0xa94: 0x000c, 0xa96: 0x000c,
+ // Block 0x2b, offset 0xac0
+ 0xaf1: 0x000c, 0xaf4: 0x000c, 0xaf5: 0x000c,
+ 0xaf6: 0x000c, 0xaf7: 0x000c, 0xaf8: 0x000c, 0xaf9: 0x000c, 0xafa: 0x000c,
+ 0xaff: 0x0004,
+ // Block 0x2c, offset 0xb00
+ 0xb07: 0x000c, 0xb08: 0x000c, 0xb09: 0x000c, 0xb0a: 0x000c, 0xb0b: 0x000c,
+ 0xb0c: 0x000c, 0xb0d: 0x000c, 0xb0e: 0x000c,
+ // Block 0x2d, offset 0xb40
+ 0xb71: 0x000c, 0xb74: 0x000c, 0xb75: 0x000c,
+ 0xb76: 0x000c, 0xb77: 0x000c, 0xb78: 0x000c, 0xb79: 0x000c, 0xb7b: 0x000c,
+ 0xb7c: 0x000c,
+ // Block 0x2e, offset 0xb80
+ 0xb88: 0x000c, 0xb89: 0x000c, 0xb8a: 0x000c, 0xb8b: 0x000c,
+ 0xb8c: 0x000c, 0xb8d: 0x000c,
+ // Block 0x2f, offset 0xbc0
+ 0xbd8: 0x000c, 0xbd9: 0x000c,
+ 0xbf5: 0x000c,
+ 0xbf7: 0x000c, 0xbf9: 0x000c, 0xbfa: 0x003a, 0xbfb: 0x002a,
+ 0xbfc: 0x003a, 0xbfd: 0x002a,
+ // Block 0x30, offset 0xc00
+ 0xc31: 0x000c, 0xc32: 0x000c, 0xc33: 0x000c, 0xc34: 0x000c, 0xc35: 0x000c,
+ 0xc36: 0x000c, 0xc37: 0x000c, 0xc38: 0x000c, 0xc39: 0x000c, 0xc3a: 0x000c, 0xc3b: 0x000c,
+ 0xc3c: 0x000c, 0xc3d: 0x000c, 0xc3e: 0x000c,
+ // Block 0x31, offset 0xc40
+ 0xc40: 0x000c, 0xc41: 0x000c, 0xc42: 0x000c, 0xc43: 0x000c, 0xc44: 0x000c,
+ 0xc46: 0x000c, 0xc47: 0x000c,
+ 0xc4d: 0x000c, 0xc4e: 0x000c, 0xc4f: 0x000c, 0xc50: 0x000c, 0xc51: 0x000c,
+ 0xc52: 0x000c, 0xc53: 0x000c, 0xc54: 0x000c, 0xc55: 0x000c, 0xc56: 0x000c, 0xc57: 0x000c,
+ 0xc59: 0x000c, 0xc5a: 0x000c, 0xc5b: 0x000c, 0xc5c: 0x000c, 0xc5d: 0x000c,
+ 0xc5e: 0x000c, 0xc5f: 0x000c, 0xc60: 0x000c, 0xc61: 0x000c, 0xc62: 0x000c, 0xc63: 0x000c,
+ 0xc64: 0x000c, 0xc65: 0x000c, 0xc66: 0x000c, 0xc67: 0x000c, 0xc68: 0x000c, 0xc69: 0x000c,
+ 0xc6a: 0x000c, 0xc6b: 0x000c, 0xc6c: 0x000c, 0xc6d: 0x000c, 0xc6e: 0x000c, 0xc6f: 0x000c,
+ 0xc70: 0x000c, 0xc71: 0x000c, 0xc72: 0x000c, 0xc73: 0x000c, 0xc74: 0x000c, 0xc75: 0x000c,
+ 0xc76: 0x000c, 0xc77: 0x000c, 0xc78: 0x000c, 0xc79: 0x000c, 0xc7a: 0x000c, 0xc7b: 0x000c,
+ 0xc7c: 0x000c,
+ // Block 0x32, offset 0xc80
+ 0xc86: 0x000c,
+ // Block 0x33, offset 0xcc0
+ 0xced: 0x000c, 0xcee: 0x000c, 0xcef: 0x000c,
+ 0xcf0: 0x000c, 0xcf2: 0x000c, 0xcf3: 0x000c, 0xcf4: 0x000c, 0xcf5: 0x000c,
+ 0xcf6: 0x000c, 0xcf7: 0x000c, 0xcf9: 0x000c, 0xcfa: 0x000c,
+ 0xcfd: 0x000c, 0xcfe: 0x000c,
+ // Block 0x34, offset 0xd00
+ 0xd18: 0x000c, 0xd19: 0x000c,
+ 0xd1e: 0x000c, 0xd1f: 0x000c, 0xd20: 0x000c,
+ 0xd31: 0x000c, 0xd32: 0x000c, 0xd33: 0x000c, 0xd34: 0x000c,
+ // Block 0x35, offset 0xd40
+ 0xd42: 0x000c, 0xd45: 0x000c,
+ 0xd46: 0x000c,
+ 0xd4d: 0x000c,
+ 0xd5d: 0x000c,
+ // Block 0x36, offset 0xd80
+ 0xd9d: 0x000c,
+ 0xd9e: 0x000c, 0xd9f: 0x000c,
+ // Block 0x37, offset 0xdc0
+ 0xdd0: 0x000a, 0xdd1: 0x000a,
+ 0xdd2: 0x000a, 0xdd3: 0x000a, 0xdd4: 0x000a, 0xdd5: 0x000a, 0xdd6: 0x000a, 0xdd7: 0x000a,
+ 0xdd8: 0x000a, 0xdd9: 0x000a,
+ // Block 0x38, offset 0xe00
+ 0xe00: 0x000a,
+ // Block 0x39, offset 0xe40
+ 0xe40: 0x0009,
+ 0xe5b: 0x007a, 0xe5c: 0x006a,
+ // Block 0x3a, offset 0xe80
+ 0xe92: 0x000c, 0xe93: 0x000c, 0xe94: 0x000c,
+ 0xeb2: 0x000c, 0xeb3: 0x000c, 0xeb4: 0x000c,
+ // Block 0x3b, offset 0xec0
+ 0xed2: 0x000c, 0xed3: 0x000c,
+ 0xef2: 0x000c, 0xef3: 0x000c,
+ // Block 0x3c, offset 0xf00
+ 0xf34: 0x000c, 0xf35: 0x000c,
+ 0xf37: 0x000c, 0xf38: 0x000c, 0xf39: 0x000c, 0xf3a: 0x000c, 0xf3b: 0x000c,
+ 0xf3c: 0x000c, 0xf3d: 0x000c,
+ // Block 0x3d, offset 0xf40
+ 0xf46: 0x000c, 0xf49: 0x000c, 0xf4a: 0x000c, 0xf4b: 0x000c,
+ 0xf4c: 0x000c, 0xf4d: 0x000c, 0xf4e: 0x000c, 0xf4f: 0x000c, 0xf50: 0x000c, 0xf51: 0x000c,
+ 0xf52: 0x000c, 0xf53: 0x000c,
+ 0xf5b: 0x0004, 0xf5d: 0x000c,
+ 0xf70: 0x000a, 0xf71: 0x000a, 0xf72: 0x000a, 0xf73: 0x000a, 0xf74: 0x000a, 0xf75: 0x000a,
+ 0xf76: 0x000a, 0xf77: 0x000a, 0xf78: 0x000a, 0xf79: 0x000a,
+ // Block 0x3e, offset 0xf80
+ 0xf80: 0x000a, 0xf81: 0x000a, 0xf82: 0x000a, 0xf83: 0x000a, 0xf84: 0x000a, 0xf85: 0x000a,
+ 0xf86: 0x000a, 0xf87: 0x000a, 0xf88: 0x000a, 0xf89: 0x000a, 0xf8a: 0x000a, 0xf8b: 0x000c,
+ 0xf8c: 0x000c, 0xf8d: 0x000c, 0xf8e: 0x000b,
+ // Block 0x3f, offset 0xfc0
+ 0xfc5: 0x000c,
+ 0xfc6: 0x000c,
+ 0xfe9: 0x000c,
+ // Block 0x40, offset 0x1000
+ 0x1020: 0x000c, 0x1021: 0x000c, 0x1022: 0x000c,
+ 0x1027: 0x000c, 0x1028: 0x000c,
+ 0x1032: 0x000c,
+ 0x1039: 0x000c, 0x103a: 0x000c, 0x103b: 0x000c,
+ // Block 0x41, offset 0x1040
+ 0x1040: 0x000a, 0x1044: 0x000a, 0x1045: 0x000a,
+ // Block 0x42, offset 0x1080
+ 0x109e: 0x000a, 0x109f: 0x000a, 0x10a0: 0x000a, 0x10a1: 0x000a, 0x10a2: 0x000a, 0x10a3: 0x000a,
+ 0x10a4: 0x000a, 0x10a5: 0x000a, 0x10a6: 0x000a, 0x10a7: 0x000a, 0x10a8: 0x000a, 0x10a9: 0x000a,
+ 0x10aa: 0x000a, 0x10ab: 0x000a, 0x10ac: 0x000a, 0x10ad: 0x000a, 0x10ae: 0x000a, 0x10af: 0x000a,
+ 0x10b0: 0x000a, 0x10b1: 0x000a, 0x10b2: 0x000a, 0x10b3: 0x000a, 0x10b4: 0x000a, 0x10b5: 0x000a,
+ 0x10b6: 0x000a, 0x10b7: 0x000a, 0x10b8: 0x000a, 0x10b9: 0x000a, 0x10ba: 0x000a, 0x10bb: 0x000a,
+ 0x10bc: 0x000a, 0x10bd: 0x000a, 0x10be: 0x000a, 0x10bf: 0x000a,
+ // Block 0x43, offset 0x10c0
+ 0x10d7: 0x000c,
+ 0x10d8: 0x000c, 0x10db: 0x000c,
+ // Block 0x44, offset 0x1100
+ 0x1116: 0x000c,
+ 0x1118: 0x000c, 0x1119: 0x000c, 0x111a: 0x000c, 0x111b: 0x000c, 0x111c: 0x000c, 0x111d: 0x000c,
+ 0x111e: 0x000c, 0x1120: 0x000c, 0x1122: 0x000c,
+ 0x1125: 0x000c, 0x1126: 0x000c, 0x1127: 0x000c, 0x1128: 0x000c, 0x1129: 0x000c,
+ 0x112a: 0x000c, 0x112b: 0x000c, 0x112c: 0x000c,
+ 0x1133: 0x000c, 0x1134: 0x000c, 0x1135: 0x000c,
+ 0x1136: 0x000c, 0x1137: 0x000c, 0x1138: 0x000c, 0x1139: 0x000c, 0x113a: 0x000c, 0x113b: 0x000c,
+ 0x113c: 0x000c, 0x113f: 0x000c,
+ // Block 0x45, offset 0x1140
+ 0x1170: 0x000c, 0x1171: 0x000c, 0x1172: 0x000c, 0x1173: 0x000c, 0x1174: 0x000c, 0x1175: 0x000c,
+ 0x1176: 0x000c, 0x1177: 0x000c, 0x1178: 0x000c, 0x1179: 0x000c, 0x117a: 0x000c, 0x117b: 0x000c,
+ 0x117c: 0x000c, 0x117d: 0x000c, 0x117e: 0x000c,
+ // Block 0x46, offset 0x1180
+ 0x1180: 0x000c, 0x1181: 0x000c, 0x1182: 0x000c, 0x1183: 0x000c,
+ 0x11b4: 0x000c,
+ 0x11b6: 0x000c, 0x11b7: 0x000c, 0x11b8: 0x000c, 0x11b9: 0x000c, 0x11ba: 0x000c,
+ 0x11bc: 0x000c,
+ // Block 0x47, offset 0x11c0
+ 0x11c2: 0x000c,
+ 0x11eb: 0x000c, 0x11ec: 0x000c, 0x11ed: 0x000c, 0x11ee: 0x000c, 0x11ef: 0x000c,
+ 0x11f0: 0x000c, 0x11f1: 0x000c, 0x11f2: 0x000c, 0x11f3: 0x000c,
+ // Block 0x48, offset 0x1200
+ 0x1200: 0x000c, 0x1201: 0x000c,
+ 0x1222: 0x000c, 0x1223: 0x000c,
+ 0x1224: 0x000c, 0x1225: 0x000c, 0x1228: 0x000c, 0x1229: 0x000c,
+ 0x122b: 0x000c, 0x122c: 0x000c, 0x122d: 0x000c,
+ // Block 0x49, offset 0x1240
+ 0x1266: 0x000c, 0x1268: 0x000c, 0x1269: 0x000c,
+ 0x126d: 0x000c, 0x126f: 0x000c,
+ 0x1270: 0x000c, 0x1271: 0x000c,
+ // Block 0x4a, offset 0x1280
+ 0x12ac: 0x000c, 0x12ad: 0x000c, 0x12ae: 0x000c, 0x12af: 0x000c,
+ 0x12b0: 0x000c, 0x12b1: 0x000c, 0x12b2: 0x000c, 0x12b3: 0x000c,
+ 0x12b6: 0x000c, 0x12b7: 0x000c,
+ // Block 0x4b, offset 0x12c0
+ 0x12d0: 0x000c, 0x12d1: 0x000c,
+ 0x12d2: 0x000c, 0x12d4: 0x000c, 0x12d5: 0x000c, 0x12d6: 0x000c, 0x12d7: 0x000c,
+ 0x12d8: 0x000c, 0x12d9: 0x000c, 0x12da: 0x000c, 0x12db: 0x000c, 0x12dc: 0x000c, 0x12dd: 0x000c,
+ 0x12de: 0x000c, 0x12df: 0x000c, 0x12e0: 0x000c, 0x12e2: 0x000c, 0x12e3: 0x000c,
+ 0x12e4: 0x000c, 0x12e5: 0x000c, 0x12e6: 0x000c, 0x12e7: 0x000c, 0x12e8: 0x000c,
+ 0x12ed: 0x000c,
+ 0x12f4: 0x000c,
+ 0x12f8: 0x000c, 0x12f9: 0x000c,
+ // Block 0x4c, offset 0x1300
+ 0x1300: 0x000c, 0x1301: 0x000c, 0x1302: 0x000c, 0x1303: 0x000c, 0x1304: 0x000c, 0x1305: 0x000c,
+ 0x1306: 0x000c, 0x1307: 0x000c, 0x1308: 0x000c, 0x1309: 0x000c, 0x130a: 0x000c, 0x130b: 0x000c,
+ 0x130c: 0x000c, 0x130d: 0x000c, 0x130e: 0x000c, 0x130f: 0x000c, 0x1310: 0x000c, 0x1311: 0x000c,
+ 0x1312: 0x000c, 0x1313: 0x000c, 0x1314: 0x000c, 0x1315: 0x000c, 0x1316: 0x000c, 0x1317: 0x000c,
+ 0x1318: 0x000c, 0x1319: 0x000c, 0x131a: 0x000c, 0x131b: 0x000c, 0x131c: 0x000c, 0x131d: 0x000c,
+ 0x131e: 0x000c, 0x131f: 0x000c, 0x1320: 0x000c, 0x1321: 0x000c, 0x1322: 0x000c, 0x1323: 0x000c,
+ 0x1324: 0x000c, 0x1325: 0x000c, 0x1326: 0x000c, 0x1327: 0x000c, 0x1328: 0x000c, 0x1329: 0x000c,
+ 0x132a: 0x000c, 0x132b: 0x000c, 0x132c: 0x000c, 0x132d: 0x000c, 0x132e: 0x000c, 0x132f: 0x000c,
+ 0x1330: 0x000c, 0x1331: 0x000c, 0x1332: 0x000c, 0x1333: 0x000c, 0x1334: 0x000c, 0x1335: 0x000c,
+ 0x133b: 0x000c,
+ 0x133c: 0x000c, 0x133d: 0x000c, 0x133e: 0x000c, 0x133f: 0x000c,
+ // Block 0x4d, offset 0x1340
+ 0x137d: 0x000a, 0x137f: 0x000a,
+ // Block 0x4e, offset 0x1380
+ 0x1380: 0x000a, 0x1381: 0x000a,
+ 0x138d: 0x000a, 0x138e: 0x000a, 0x138f: 0x000a,
+ 0x139d: 0x000a,
+ 0x139e: 0x000a, 0x139f: 0x000a,
+ 0x13ad: 0x000a, 0x13ae: 0x000a, 0x13af: 0x000a,
+ 0x13bd: 0x000a, 0x13be: 0x000a,
+ // Block 0x4f, offset 0x13c0
+ 0x13c0: 0x0009, 0x13c1: 0x0009, 0x13c2: 0x0009, 0x13c3: 0x0009, 0x13c4: 0x0009, 0x13c5: 0x0009,
+ 0x13c6: 0x0009, 0x13c7: 0x0009, 0x13c8: 0x0009, 0x13c9: 0x0009, 0x13ca: 0x0009, 0x13cb: 0x000b,
+ 0x13cc: 0x000b, 0x13cd: 0x000b, 0x13cf: 0x0001, 0x13d0: 0x000a, 0x13d1: 0x000a,
+ 0x13d2: 0x000a, 0x13d3: 0x000a, 0x13d4: 0x000a, 0x13d5: 0x000a, 0x13d6: 0x000a, 0x13d7: 0x000a,
+ 0x13d8: 0x000a, 0x13d9: 0x000a, 0x13da: 0x000a, 0x13db: 0x000a, 0x13dc: 0x000a, 0x13dd: 0x000a,
+ 0x13de: 0x000a, 0x13df: 0x000a, 0x13e0: 0x000a, 0x13e1: 0x000a, 0x13e2: 0x000a, 0x13e3: 0x000a,
+ 0x13e4: 0x000a, 0x13e5: 0x000a, 0x13e6: 0x000a, 0x13e7: 0x000a, 0x13e8: 0x0009, 0x13e9: 0x0007,
+ 0x13ea: 0x000e, 0x13eb: 0x000e, 0x13ec: 0x000e, 0x13ed: 0x000e, 0x13ee: 0x000e, 0x13ef: 0x0006,
+ 0x13f0: 0x0004, 0x13f1: 0x0004, 0x13f2: 0x0004, 0x13f3: 0x0004, 0x13f4: 0x0004, 0x13f5: 0x000a,
+ 0x13f6: 0x000a, 0x13f7: 0x000a, 0x13f8: 0x000a, 0x13f9: 0x000a, 0x13fa: 0x000a, 0x13fb: 0x000a,
+ 0x13fc: 0x000a, 0x13fd: 0x000a, 0x13fe: 0x000a, 0x13ff: 0x000a,
+ // Block 0x50, offset 0x1400
+ 0x1400: 0x000a, 0x1401: 0x000a, 0x1402: 0x000a, 0x1403: 0x000a, 0x1404: 0x0006, 0x1405: 0x009a,
+ 0x1406: 0x008a, 0x1407: 0x000a, 0x1408: 0x000a, 0x1409: 0x000a, 0x140a: 0x000a, 0x140b: 0x000a,
+ 0x140c: 0x000a, 0x140d: 0x000a, 0x140e: 0x000a, 0x140f: 0x000a, 0x1410: 0x000a, 0x1411: 0x000a,
+ 0x1412: 0x000a, 0x1413: 0x000a, 0x1414: 0x000a, 0x1415: 0x000a, 0x1416: 0x000a, 0x1417: 0x000a,
+ 0x1418: 0x000a, 0x1419: 0x000a, 0x141a: 0x000a, 0x141b: 0x000a, 0x141c: 0x000a, 0x141d: 0x000a,
+ 0x141e: 0x000a, 0x141f: 0x0009, 0x1420: 0x000b, 0x1421: 0x000b, 0x1422: 0x000b, 0x1423: 0x000b,
+ 0x1424: 0x000b, 0x1425: 0x000b, 0x1426: 0x000e, 0x1427: 0x000e, 0x1428: 0x000e, 0x1429: 0x000e,
+ 0x142a: 0x000b, 0x142b: 0x000b, 0x142c: 0x000b, 0x142d: 0x000b, 0x142e: 0x000b, 0x142f: 0x000b,
+ 0x1430: 0x0002, 0x1434: 0x0002, 0x1435: 0x0002,
+ 0x1436: 0x0002, 0x1437: 0x0002, 0x1438: 0x0002, 0x1439: 0x0002, 0x143a: 0x0003, 0x143b: 0x0003,
+ 0x143c: 0x000a, 0x143d: 0x009a, 0x143e: 0x008a,
+ // Block 0x51, offset 0x1440
+ 0x1440: 0x0002, 0x1441: 0x0002, 0x1442: 0x0002, 0x1443: 0x0002, 0x1444: 0x0002, 0x1445: 0x0002,
+ 0x1446: 0x0002, 0x1447: 0x0002, 0x1448: 0x0002, 0x1449: 0x0002, 0x144a: 0x0003, 0x144b: 0x0003,
+ 0x144c: 0x000a, 0x144d: 0x009a, 0x144e: 0x008a,
+ 0x1460: 0x0004, 0x1461: 0x0004, 0x1462: 0x0004, 0x1463: 0x0004,
+ 0x1464: 0x0004, 0x1465: 0x0004, 0x1466: 0x0004, 0x1467: 0x0004, 0x1468: 0x0004, 0x1469: 0x0004,
+ 0x146a: 0x0004, 0x146b: 0x0004, 0x146c: 0x0004, 0x146d: 0x0004, 0x146e: 0x0004, 0x146f: 0x0004,
+ 0x1470: 0x0004, 0x1471: 0x0004, 0x1472: 0x0004, 0x1473: 0x0004, 0x1474: 0x0004, 0x1475: 0x0004,
+ 0x1476: 0x0004, 0x1477: 0x0004, 0x1478: 0x0004, 0x1479: 0x0004, 0x147a: 0x0004, 0x147b: 0x0004,
+ 0x147c: 0x0004, 0x147d: 0x0004, 0x147e: 0x0004, 0x147f: 0x0004,
+ // Block 0x52, offset 0x1480
+ 0x1480: 0x0004, 0x1481: 0x0004, 0x1482: 0x0004, 0x1483: 0x0004, 0x1484: 0x0004, 0x1485: 0x0004,
+ 0x1486: 0x0004, 0x1487: 0x0004, 0x1488: 0x0004, 0x1489: 0x0004, 0x148a: 0x0004, 0x148b: 0x0004,
+ 0x148c: 0x0004, 0x148d: 0x0004, 0x148e: 0x0004, 0x148f: 0x0004, 0x1490: 0x000c, 0x1491: 0x000c,
+ 0x1492: 0x000c, 0x1493: 0x000c, 0x1494: 0x000c, 0x1495: 0x000c, 0x1496: 0x000c, 0x1497: 0x000c,
+ 0x1498: 0x000c, 0x1499: 0x000c, 0x149a: 0x000c, 0x149b: 0x000c, 0x149c: 0x000c, 0x149d: 0x000c,
+ 0x149e: 0x000c, 0x149f: 0x000c, 0x14a0: 0x000c, 0x14a1: 0x000c, 0x14a2: 0x000c, 0x14a3: 0x000c,
+ 0x14a4: 0x000c, 0x14a5: 0x000c, 0x14a6: 0x000c, 0x14a7: 0x000c, 0x14a8: 0x000c, 0x14a9: 0x000c,
+ 0x14aa: 0x000c, 0x14ab: 0x000c, 0x14ac: 0x000c, 0x14ad: 0x000c, 0x14ae: 0x000c, 0x14af: 0x000c,
+ 0x14b0: 0x000c,
+ // Block 0x53, offset 0x14c0
+ 0x14c0: 0x000a, 0x14c1: 0x000a, 0x14c3: 0x000a, 0x14c4: 0x000a, 0x14c5: 0x000a,
+ 0x14c6: 0x000a, 0x14c8: 0x000a, 0x14c9: 0x000a,
+ 0x14d4: 0x000a, 0x14d6: 0x000a, 0x14d7: 0x000a,
+ 0x14d8: 0x000a,
+ 0x14de: 0x000a, 0x14df: 0x000a, 0x14e0: 0x000a, 0x14e1: 0x000a, 0x14e2: 0x000a, 0x14e3: 0x000a,
+ 0x14e5: 0x000a, 0x14e7: 0x000a, 0x14e9: 0x000a,
+ 0x14ee: 0x0004,
+ 0x14fa: 0x000a, 0x14fb: 0x000a,
+ // Block 0x54, offset 0x1500
+ 0x1500: 0x000a, 0x1501: 0x000a, 0x1502: 0x000a, 0x1503: 0x000a, 0x1504: 0x000a,
+ 0x150a: 0x000a, 0x150b: 0x000a,
+ 0x150c: 0x000a, 0x150d: 0x000a, 0x1510: 0x000a, 0x1511: 0x000a,
+ 0x1512: 0x000a, 0x1513: 0x000a, 0x1514: 0x000a, 0x1515: 0x000a, 0x1516: 0x000a, 0x1517: 0x000a,
+ 0x1518: 0x000a, 0x1519: 0x000a, 0x151a: 0x000a, 0x151b: 0x000a, 0x151c: 0x000a, 0x151d: 0x000a,
+ 0x151e: 0x000a, 0x151f: 0x000a,
+ // Block 0x55, offset 0x1540
+ 0x1549: 0x000a, 0x154a: 0x000a, 0x154b: 0x000a,
+ 0x1550: 0x000a, 0x1551: 0x000a,
+ 0x1552: 0x000a, 0x1553: 0x000a, 0x1554: 0x000a, 0x1555: 0x000a, 0x1556: 0x000a, 0x1557: 0x000a,
+ 0x1558: 0x000a, 0x1559: 0x000a, 0x155a: 0x000a, 0x155b: 0x000a, 0x155c: 0x000a, 0x155d: 0x000a,
+ 0x155e: 0x000a, 0x155f: 0x000a, 0x1560: 0x000a, 0x1561: 0x000a, 0x1562: 0x000a, 0x1563: 0x000a,
+ 0x1564: 0x000a, 0x1565: 0x000a, 0x1566: 0x000a, 0x1567: 0x000a, 0x1568: 0x000a, 0x1569: 0x000a,
+ 0x156a: 0x000a, 0x156b: 0x000a, 0x156c: 0x000a, 0x156d: 0x000a, 0x156e: 0x000a, 0x156f: 0x000a,
+ 0x1570: 0x000a, 0x1571: 0x000a, 0x1572: 0x000a, 0x1573: 0x000a, 0x1574: 0x000a, 0x1575: 0x000a,
+ 0x1576: 0x000a, 0x1577: 0x000a, 0x1578: 0x000a, 0x1579: 0x000a, 0x157a: 0x000a, 0x157b: 0x000a,
+ 0x157c: 0x000a, 0x157d: 0x000a, 0x157e: 0x000a, 0x157f: 0x000a,
+ // Block 0x56, offset 0x1580
+ 0x1580: 0x000a, 0x1581: 0x000a, 0x1582: 0x000a, 0x1583: 0x000a, 0x1584: 0x000a, 0x1585: 0x000a,
+ 0x1586: 0x000a, 0x1587: 0x000a, 0x1588: 0x000a, 0x1589: 0x000a, 0x158a: 0x000a, 0x158b: 0x000a,
+ 0x158c: 0x000a, 0x158d: 0x000a, 0x158e: 0x000a, 0x158f: 0x000a, 0x1590: 0x000a, 0x1591: 0x000a,
+ 0x1592: 0x000a, 0x1593: 0x000a, 0x1594: 0x000a, 0x1595: 0x000a, 0x1596: 0x000a, 0x1597: 0x000a,
+ 0x1598: 0x000a, 0x1599: 0x000a, 0x159a: 0x000a, 0x159b: 0x000a, 0x159c: 0x000a, 0x159d: 0x000a,
+ 0x159e: 0x000a, 0x159f: 0x000a, 0x15a0: 0x000a, 0x15a1: 0x000a, 0x15a2: 0x000a, 0x15a3: 0x000a,
+ 0x15a4: 0x000a, 0x15a5: 0x000a, 0x15a6: 0x000a, 0x15a7: 0x000a, 0x15a8: 0x000a, 0x15a9: 0x000a,
+ 0x15aa: 0x000a, 0x15ab: 0x000a, 0x15ac: 0x000a, 0x15ad: 0x000a, 0x15ae: 0x000a, 0x15af: 0x000a,
+ 0x15b0: 0x000a, 0x15b1: 0x000a, 0x15b2: 0x000a, 0x15b3: 0x000a, 0x15b4: 0x000a, 0x15b5: 0x000a,
+ 0x15b6: 0x000a, 0x15b7: 0x000a, 0x15b8: 0x000a, 0x15b9: 0x000a, 0x15ba: 0x000a, 0x15bb: 0x000a,
+ 0x15bc: 0x000a, 0x15bd: 0x000a, 0x15be: 0x000a, 0x15bf: 0x000a,
+ // Block 0x57, offset 0x15c0
+ 0x15c0: 0x000a, 0x15c1: 0x000a, 0x15c2: 0x000a, 0x15c3: 0x000a, 0x15c4: 0x000a, 0x15c5: 0x000a,
+ 0x15c6: 0x000a, 0x15c7: 0x000a, 0x15c8: 0x000a, 0x15c9: 0x000a, 0x15ca: 0x000a, 0x15cb: 0x000a,
+ 0x15cc: 0x000a, 0x15cd: 0x000a, 0x15ce: 0x000a, 0x15cf: 0x000a, 0x15d0: 0x000a, 0x15d1: 0x000a,
+ 0x15d2: 0x0003, 0x15d3: 0x0004, 0x15d4: 0x000a, 0x15d5: 0x000a, 0x15d6: 0x000a, 0x15d7: 0x000a,
+ 0x15d8: 0x000a, 0x15d9: 0x000a, 0x15da: 0x000a, 0x15db: 0x000a, 0x15dc: 0x000a, 0x15dd: 0x000a,
+ 0x15de: 0x000a, 0x15df: 0x000a, 0x15e0: 0x000a, 0x15e1: 0x000a, 0x15e2: 0x000a, 0x15e3: 0x000a,
+ 0x15e4: 0x000a, 0x15e5: 0x000a, 0x15e6: 0x000a, 0x15e7: 0x000a, 0x15e8: 0x000a, 0x15e9: 0x000a,
+ 0x15ea: 0x000a, 0x15eb: 0x000a, 0x15ec: 0x000a, 0x15ed: 0x000a, 0x15ee: 0x000a, 0x15ef: 0x000a,
+ 0x15f0: 0x000a, 0x15f1: 0x000a, 0x15f2: 0x000a, 0x15f3: 0x000a, 0x15f4: 0x000a, 0x15f5: 0x000a,
+ 0x15f6: 0x000a, 0x15f7: 0x000a, 0x15f8: 0x000a, 0x15f9: 0x000a, 0x15fa: 0x000a, 0x15fb: 0x000a,
+ 0x15fc: 0x000a, 0x15fd: 0x000a, 0x15fe: 0x000a, 0x15ff: 0x000a,
+ // Block 0x58, offset 0x1600
+ 0x1600: 0x000a, 0x1601: 0x000a, 0x1602: 0x000a, 0x1603: 0x000a, 0x1604: 0x000a, 0x1605: 0x000a,
+ 0x1606: 0x000a, 0x1607: 0x000a, 0x1608: 0x003a, 0x1609: 0x002a, 0x160a: 0x003a, 0x160b: 0x002a,
+ 0x160c: 0x000a, 0x160d: 0x000a, 0x160e: 0x000a, 0x160f: 0x000a, 0x1610: 0x000a, 0x1611: 0x000a,
+ 0x1612: 0x000a, 0x1613: 0x000a, 0x1614: 0x000a, 0x1615: 0x000a, 0x1616: 0x000a, 0x1617: 0x000a,
+ 0x1618: 0x000a, 0x1619: 0x000a, 0x161a: 0x000a, 0x161b: 0x000a, 0x161c: 0x000a, 0x161d: 0x000a,
+ 0x161e: 0x000a, 0x161f: 0x000a, 0x1620: 0x000a, 0x1621: 0x000a, 0x1622: 0x000a, 0x1623: 0x000a,
+ 0x1624: 0x000a, 0x1625: 0x000a, 0x1626: 0x000a, 0x1627: 0x000a, 0x1628: 0x000a, 0x1629: 0x009a,
+ 0x162a: 0x008a, 0x162b: 0x000a, 0x162c: 0x000a, 0x162d: 0x000a, 0x162e: 0x000a, 0x162f: 0x000a,
+ 0x1630: 0x000a, 0x1631: 0x000a, 0x1632: 0x000a, 0x1633: 0x000a, 0x1634: 0x000a, 0x1635: 0x000a,
+ // Block 0x59, offset 0x1640
+ 0x167b: 0x000a,
+ 0x167c: 0x000a, 0x167d: 0x000a, 0x167e: 0x000a, 0x167f: 0x000a,
+ // Block 0x5a, offset 0x1680
+ 0x1680: 0x000a, 0x1681: 0x000a, 0x1682: 0x000a, 0x1683: 0x000a, 0x1684: 0x000a, 0x1685: 0x000a,
+ 0x1686: 0x000a, 0x1687: 0x000a, 0x1688: 0x000a, 0x1689: 0x000a, 0x168a: 0x000a, 0x168b: 0x000a,
+ 0x168c: 0x000a, 0x168d: 0x000a, 0x168e: 0x000a, 0x168f: 0x000a, 0x1690: 0x000a, 0x1691: 0x000a,
+ 0x1692: 0x000a, 0x1693: 0x000a, 0x1694: 0x000a, 0x1696: 0x000a, 0x1697: 0x000a,
+ 0x1698: 0x000a, 0x1699: 0x000a, 0x169a: 0x000a, 0x169b: 0x000a, 0x169c: 0x000a, 0x169d: 0x000a,
+ 0x169e: 0x000a, 0x169f: 0x000a, 0x16a0: 0x000a, 0x16a1: 0x000a, 0x16a2: 0x000a, 0x16a3: 0x000a,
+ 0x16a4: 0x000a, 0x16a5: 0x000a, 0x16a6: 0x000a, 0x16a7: 0x000a, 0x16a8: 0x000a, 0x16a9: 0x000a,
+ 0x16aa: 0x000a, 0x16ab: 0x000a, 0x16ac: 0x000a, 0x16ad: 0x000a, 0x16ae: 0x000a, 0x16af: 0x000a,
+ 0x16b0: 0x000a, 0x16b1: 0x000a, 0x16b2: 0x000a, 0x16b3: 0x000a, 0x16b4: 0x000a, 0x16b5: 0x000a,
+ 0x16b6: 0x000a, 0x16b7: 0x000a, 0x16b8: 0x000a, 0x16b9: 0x000a, 0x16ba: 0x000a, 0x16bb: 0x000a,
+ 0x16bc: 0x000a, 0x16bd: 0x000a, 0x16be: 0x000a, 0x16bf: 0x000a,
+ // Block 0x5b, offset 0x16c0
+ 0x16c0: 0x000a, 0x16c1: 0x000a, 0x16c2: 0x000a, 0x16c3: 0x000a, 0x16c4: 0x000a, 0x16c5: 0x000a,
+ 0x16c6: 0x000a, 0x16c7: 0x000a, 0x16c8: 0x000a, 0x16c9: 0x000a, 0x16ca: 0x000a, 0x16cb: 0x000a,
+ 0x16cc: 0x000a, 0x16cd: 0x000a, 0x16ce: 0x000a, 0x16cf: 0x000a, 0x16d0: 0x000a, 0x16d1: 0x000a,
+ 0x16d2: 0x000a, 0x16d3: 0x000a, 0x16d4: 0x000a, 0x16d5: 0x000a, 0x16d6: 0x000a, 0x16d7: 0x000a,
+ 0x16d8: 0x000a, 0x16d9: 0x000a, 0x16da: 0x000a, 0x16db: 0x000a, 0x16dc: 0x000a, 0x16dd: 0x000a,
+ 0x16de: 0x000a, 0x16df: 0x000a, 0x16e0: 0x000a, 0x16e1: 0x000a, 0x16e2: 0x000a, 0x16e3: 0x000a,
+ 0x16e4: 0x000a, 0x16e5: 0x000a, 0x16e6: 0x000a, 0x16e7: 0x000a, 0x16e8: 0x000a, 0x16e9: 0x000a,
+ 0x16ea: 0x000a, 0x16eb: 0x000a, 0x16ec: 0x000a, 0x16ed: 0x000a, 0x16ee: 0x000a, 0x16ef: 0x000a,
+ 0x16f0: 0x000a, 0x16f1: 0x000a, 0x16f2: 0x000a, 0x16f3: 0x000a, 0x16f4: 0x000a, 0x16f5: 0x000a,
+ 0x16f6: 0x000a, 0x16f7: 0x000a, 0x16f8: 0x000a, 0x16f9: 0x000a, 0x16fa: 0x000a, 0x16fb: 0x000a,
+ 0x16fc: 0x000a, 0x16fd: 0x000a, 0x16fe: 0x000a,
+ // Block 0x5c, offset 0x1700
+ 0x1700: 0x000a, 0x1701: 0x000a, 0x1702: 0x000a, 0x1703: 0x000a, 0x1704: 0x000a, 0x1705: 0x000a,
+ 0x1706: 0x000a, 0x1707: 0x000a, 0x1708: 0x000a, 0x1709: 0x000a, 0x170a: 0x000a, 0x170b: 0x000a,
+ 0x170c: 0x000a, 0x170d: 0x000a, 0x170e: 0x000a, 0x170f: 0x000a, 0x1710: 0x000a, 0x1711: 0x000a,
+ 0x1712: 0x000a, 0x1713: 0x000a, 0x1714: 0x000a, 0x1715: 0x000a, 0x1716: 0x000a, 0x1717: 0x000a,
+ 0x1718: 0x000a, 0x1719: 0x000a, 0x171a: 0x000a, 0x171b: 0x000a, 0x171c: 0x000a, 0x171d: 0x000a,
+ 0x171e: 0x000a, 0x171f: 0x000a, 0x1720: 0x000a, 0x1721: 0x000a, 0x1722: 0x000a, 0x1723: 0x000a,
+ 0x1724: 0x000a, 0x1725: 0x000a, 0x1726: 0x000a,
+ // Block 0x5d, offset 0x1740
+ 0x1740: 0x000a, 0x1741: 0x000a, 0x1742: 0x000a, 0x1743: 0x000a, 0x1744: 0x000a, 0x1745: 0x000a,
+ 0x1746: 0x000a, 0x1747: 0x000a, 0x1748: 0x000a, 0x1749: 0x000a, 0x174a: 0x000a,
+ 0x1760: 0x000a, 0x1761: 0x000a, 0x1762: 0x000a, 0x1763: 0x000a,
+ 0x1764: 0x000a, 0x1765: 0x000a, 0x1766: 0x000a, 0x1767: 0x000a, 0x1768: 0x000a, 0x1769: 0x000a,
+ 0x176a: 0x000a, 0x176b: 0x000a, 0x176c: 0x000a, 0x176d: 0x000a, 0x176e: 0x000a, 0x176f: 0x000a,
+ 0x1770: 0x000a, 0x1771: 0x000a, 0x1772: 0x000a, 0x1773: 0x000a, 0x1774: 0x000a, 0x1775: 0x000a,
+ 0x1776: 0x000a, 0x1777: 0x000a, 0x1778: 0x000a, 0x1779: 0x000a, 0x177a: 0x000a, 0x177b: 0x000a,
+ 0x177c: 0x000a, 0x177d: 0x000a, 0x177e: 0x000a, 0x177f: 0x000a,
+ // Block 0x5e, offset 0x1780
+ 0x1780: 0x000a, 0x1781: 0x000a, 0x1782: 0x000a, 0x1783: 0x000a, 0x1784: 0x000a, 0x1785: 0x000a,
+ 0x1786: 0x000a, 0x1787: 0x000a, 0x1788: 0x0002, 0x1789: 0x0002, 0x178a: 0x0002, 0x178b: 0x0002,
+ 0x178c: 0x0002, 0x178d: 0x0002, 0x178e: 0x0002, 0x178f: 0x0002, 0x1790: 0x0002, 0x1791: 0x0002,
+ 0x1792: 0x0002, 0x1793: 0x0002, 0x1794: 0x0002, 0x1795: 0x0002, 0x1796: 0x0002, 0x1797: 0x0002,
+ 0x1798: 0x0002, 0x1799: 0x0002, 0x179a: 0x0002, 0x179b: 0x0002,
+ // Block 0x5f, offset 0x17c0
+ 0x17ea: 0x000a, 0x17eb: 0x000a, 0x17ec: 0x000a, 0x17ed: 0x000a, 0x17ee: 0x000a, 0x17ef: 0x000a,
+ 0x17f0: 0x000a, 0x17f1: 0x000a, 0x17f2: 0x000a, 0x17f3: 0x000a, 0x17f4: 0x000a, 0x17f5: 0x000a,
+ 0x17f6: 0x000a, 0x17f7: 0x000a, 0x17f8: 0x000a, 0x17f9: 0x000a, 0x17fa: 0x000a, 0x17fb: 0x000a,
+ 0x17fc: 0x000a, 0x17fd: 0x000a, 0x17fe: 0x000a, 0x17ff: 0x000a,
+ // Block 0x60, offset 0x1800
+ 0x1800: 0x000a, 0x1801: 0x000a, 0x1802: 0x000a, 0x1803: 0x000a, 0x1804: 0x000a, 0x1805: 0x000a,
+ 0x1806: 0x000a, 0x1807: 0x000a, 0x1808: 0x000a, 0x1809: 0x000a, 0x180a: 0x000a, 0x180b: 0x000a,
+ 0x180c: 0x000a, 0x180d: 0x000a, 0x180e: 0x000a, 0x180f: 0x000a, 0x1810: 0x000a, 0x1811: 0x000a,
+ 0x1812: 0x000a, 0x1813: 0x000a, 0x1814: 0x000a, 0x1815: 0x000a, 0x1816: 0x000a, 0x1817: 0x000a,
+ 0x1818: 0x000a, 0x1819: 0x000a, 0x181a: 0x000a, 0x181b: 0x000a, 0x181c: 0x000a, 0x181d: 0x000a,
+ 0x181e: 0x000a, 0x181f: 0x000a, 0x1820: 0x000a, 0x1821: 0x000a, 0x1822: 0x000a, 0x1823: 0x000a,
+ 0x1824: 0x000a, 0x1825: 0x000a, 0x1826: 0x000a, 0x1827: 0x000a, 0x1828: 0x000a, 0x1829: 0x000a,
+ 0x182a: 0x000a, 0x182b: 0x000a, 0x182d: 0x000a, 0x182e: 0x000a, 0x182f: 0x000a,
+ 0x1830: 0x000a, 0x1831: 0x000a, 0x1832: 0x000a, 0x1833: 0x000a, 0x1834: 0x000a, 0x1835: 0x000a,
+ 0x1836: 0x000a, 0x1837: 0x000a, 0x1838: 0x000a, 0x1839: 0x000a, 0x183a: 0x000a, 0x183b: 0x000a,
+ 0x183c: 0x000a, 0x183d: 0x000a, 0x183e: 0x000a, 0x183f: 0x000a,
+ // Block 0x61, offset 0x1840
+ 0x1840: 0x000a, 0x1841: 0x000a, 0x1842: 0x000a, 0x1843: 0x000a, 0x1844: 0x000a, 0x1845: 0x000a,
+ 0x1846: 0x000a, 0x1847: 0x000a, 0x1848: 0x000a, 0x1849: 0x000a, 0x184a: 0x000a, 0x184b: 0x000a,
+ 0x184c: 0x000a, 0x184d: 0x000a, 0x184e: 0x000a, 0x184f: 0x000a, 0x1850: 0x000a, 0x1851: 0x000a,
+ 0x1852: 0x000a, 0x1853: 0x000a, 0x1854: 0x000a, 0x1855: 0x000a, 0x1856: 0x000a, 0x1857: 0x000a,
+ 0x1858: 0x000a, 0x1859: 0x000a, 0x185a: 0x000a, 0x185b: 0x000a, 0x185c: 0x000a, 0x185d: 0x000a,
+ 0x185e: 0x000a, 0x185f: 0x000a, 0x1860: 0x000a, 0x1861: 0x000a, 0x1862: 0x000a, 0x1863: 0x000a,
+ 0x1864: 0x000a, 0x1865: 0x000a, 0x1866: 0x000a, 0x1867: 0x000a, 0x1868: 0x003a, 0x1869: 0x002a,
+ 0x186a: 0x003a, 0x186b: 0x002a, 0x186c: 0x003a, 0x186d: 0x002a, 0x186e: 0x003a, 0x186f: 0x002a,
+ 0x1870: 0x003a, 0x1871: 0x002a, 0x1872: 0x003a, 0x1873: 0x002a, 0x1874: 0x003a, 0x1875: 0x002a,
+ 0x1876: 0x000a, 0x1877: 0x000a, 0x1878: 0x000a, 0x1879: 0x000a, 0x187a: 0x000a, 0x187b: 0x000a,
+ 0x187c: 0x000a, 0x187d: 0x000a, 0x187e: 0x000a, 0x187f: 0x000a,
+ // Block 0x62, offset 0x1880
+ 0x1880: 0x000a, 0x1881: 0x000a, 0x1882: 0x000a, 0x1883: 0x000a, 0x1884: 0x000a, 0x1885: 0x009a,
+ 0x1886: 0x008a, 0x1887: 0x000a, 0x1888: 0x000a, 0x1889: 0x000a, 0x188a: 0x000a, 0x188b: 0x000a,
+ 0x188c: 0x000a, 0x188d: 0x000a, 0x188e: 0x000a, 0x188f: 0x000a, 0x1890: 0x000a, 0x1891: 0x000a,
+ 0x1892: 0x000a, 0x1893: 0x000a, 0x1894: 0x000a, 0x1895: 0x000a, 0x1896: 0x000a, 0x1897: 0x000a,
+ 0x1898: 0x000a, 0x1899: 0x000a, 0x189a: 0x000a, 0x189b: 0x000a, 0x189c: 0x000a, 0x189d: 0x000a,
+ 0x189e: 0x000a, 0x189f: 0x000a, 0x18a0: 0x000a, 0x18a1: 0x000a, 0x18a2: 0x000a, 0x18a3: 0x000a,
+ 0x18a4: 0x000a, 0x18a5: 0x000a, 0x18a6: 0x003a, 0x18a7: 0x002a, 0x18a8: 0x003a, 0x18a9: 0x002a,
+ 0x18aa: 0x003a, 0x18ab: 0x002a, 0x18ac: 0x003a, 0x18ad: 0x002a, 0x18ae: 0x003a, 0x18af: 0x002a,
+ 0x18b0: 0x000a, 0x18b1: 0x000a, 0x18b2: 0x000a, 0x18b3: 0x000a, 0x18b4: 0x000a, 0x18b5: 0x000a,
+ 0x18b6: 0x000a, 0x18b7: 0x000a, 0x18b8: 0x000a, 0x18b9: 0x000a, 0x18ba: 0x000a, 0x18bb: 0x000a,
+ 0x18bc: 0x000a, 0x18bd: 0x000a, 0x18be: 0x000a, 0x18bf: 0x000a,
+ // Block 0x63, offset 0x18c0
+ 0x18c0: 0x000a, 0x18c1: 0x000a, 0x18c2: 0x000a, 0x18c3: 0x007a, 0x18c4: 0x006a, 0x18c5: 0x009a,
+ 0x18c6: 0x008a, 0x18c7: 0x00ba, 0x18c8: 0x00aa, 0x18c9: 0x009a, 0x18ca: 0x008a, 0x18cb: 0x007a,
+ 0x18cc: 0x006a, 0x18cd: 0x00da, 0x18ce: 0x002a, 0x18cf: 0x003a, 0x18d0: 0x00ca, 0x18d1: 0x009a,
+ 0x18d2: 0x008a, 0x18d3: 0x007a, 0x18d4: 0x006a, 0x18d5: 0x009a, 0x18d6: 0x008a, 0x18d7: 0x00ba,
+ 0x18d8: 0x00aa, 0x18d9: 0x000a, 0x18da: 0x000a, 0x18db: 0x000a, 0x18dc: 0x000a, 0x18dd: 0x000a,
+ 0x18de: 0x000a, 0x18df: 0x000a, 0x18e0: 0x000a, 0x18e1: 0x000a, 0x18e2: 0x000a, 0x18e3: 0x000a,
+ 0x18e4: 0x000a, 0x18e5: 0x000a, 0x18e6: 0x000a, 0x18e7: 0x000a, 0x18e8: 0x000a, 0x18e9: 0x000a,
+ 0x18ea: 0x000a, 0x18eb: 0x000a, 0x18ec: 0x000a, 0x18ed: 0x000a, 0x18ee: 0x000a, 0x18ef: 0x000a,
+ 0x18f0: 0x000a, 0x18f1: 0x000a, 0x18f2: 0x000a, 0x18f3: 0x000a, 0x18f4: 0x000a, 0x18f5: 0x000a,
+ 0x18f6: 0x000a, 0x18f7: 0x000a, 0x18f8: 0x000a, 0x18f9: 0x000a, 0x18fa: 0x000a, 0x18fb: 0x000a,
+ 0x18fc: 0x000a, 0x18fd: 0x000a, 0x18fe: 0x000a, 0x18ff: 0x000a,
+ // Block 0x64, offset 0x1900
+ 0x1900: 0x000a, 0x1901: 0x000a, 0x1902: 0x000a, 0x1903: 0x000a, 0x1904: 0x000a, 0x1905: 0x000a,
+ 0x1906: 0x000a, 0x1907: 0x000a, 0x1908: 0x000a, 0x1909: 0x000a, 0x190a: 0x000a, 0x190b: 0x000a,
+ 0x190c: 0x000a, 0x190d: 0x000a, 0x190e: 0x000a, 0x190f: 0x000a, 0x1910: 0x000a, 0x1911: 0x000a,
+ 0x1912: 0x000a, 0x1913: 0x000a, 0x1914: 0x000a, 0x1915: 0x000a, 0x1916: 0x000a, 0x1917: 0x000a,
+ 0x1918: 0x003a, 0x1919: 0x002a, 0x191a: 0x003a, 0x191b: 0x002a, 0x191c: 0x000a, 0x191d: 0x000a,
+ 0x191e: 0x000a, 0x191f: 0x000a, 0x1920: 0x000a, 0x1921: 0x000a, 0x1922: 0x000a, 0x1923: 0x000a,
+ 0x1924: 0x000a, 0x1925: 0x000a, 0x1926: 0x000a, 0x1927: 0x000a, 0x1928: 0x000a, 0x1929: 0x000a,
+ 0x192a: 0x000a, 0x192b: 0x000a, 0x192c: 0x000a, 0x192d: 0x000a, 0x192e: 0x000a, 0x192f: 0x000a,
+ 0x1930: 0x000a, 0x1931: 0x000a, 0x1932: 0x000a, 0x1933: 0x000a, 0x1934: 0x000a, 0x1935: 0x000a,
+ 0x1936: 0x000a, 0x1937: 0x000a, 0x1938: 0x000a, 0x1939: 0x000a, 0x193a: 0x000a, 0x193b: 0x000a,
+ 0x193c: 0x003a, 0x193d: 0x002a, 0x193e: 0x000a, 0x193f: 0x000a,
+ // Block 0x65, offset 0x1940
+ 0x1940: 0x000a, 0x1941: 0x000a, 0x1942: 0x000a, 0x1943: 0x000a, 0x1944: 0x000a, 0x1945: 0x000a,
+ 0x1946: 0x000a, 0x1947: 0x000a, 0x1948: 0x000a, 0x1949: 0x000a, 0x194a: 0x000a, 0x194b: 0x000a,
+ 0x194c: 0x000a, 0x194d: 0x000a, 0x194e: 0x000a, 0x194f: 0x000a, 0x1950: 0x000a, 0x1951: 0x000a,
+ 0x1952: 0x000a, 0x1953: 0x000a, 0x1954: 0x000a, 0x1955: 0x000a, 0x1956: 0x000a, 0x1957: 0x000a,
+ 0x1958: 0x000a, 0x1959: 0x000a, 0x195a: 0x000a, 0x195b: 0x000a, 0x195c: 0x000a, 0x195d: 0x000a,
+ 0x195e: 0x000a, 0x195f: 0x000a, 0x1960: 0x000a, 0x1961: 0x000a, 0x1962: 0x000a, 0x1963: 0x000a,
+ 0x1964: 0x000a, 0x1965: 0x000a, 0x1966: 0x000a, 0x1967: 0x000a, 0x1968: 0x000a, 0x1969: 0x000a,
+ 0x196a: 0x000a, 0x196b: 0x000a, 0x196c: 0x000a, 0x196d: 0x000a, 0x196e: 0x000a, 0x196f: 0x000a,
+ 0x1970: 0x000a, 0x1971: 0x000a, 0x1972: 0x000a, 0x1973: 0x000a,
+ 0x1976: 0x000a, 0x1977: 0x000a, 0x1978: 0x000a, 0x1979: 0x000a, 0x197a: 0x000a, 0x197b: 0x000a,
+ 0x197c: 0x000a, 0x197d: 0x000a, 0x197e: 0x000a, 0x197f: 0x000a,
+ // Block 0x66, offset 0x1980
+ 0x1980: 0x000a, 0x1981: 0x000a, 0x1982: 0x000a, 0x1983: 0x000a, 0x1984: 0x000a, 0x1985: 0x000a,
+ 0x1986: 0x000a, 0x1987: 0x000a, 0x1988: 0x000a, 0x1989: 0x000a, 0x198a: 0x000a, 0x198b: 0x000a,
+ 0x198c: 0x000a, 0x198d: 0x000a, 0x198e: 0x000a, 0x198f: 0x000a, 0x1990: 0x000a, 0x1991: 0x000a,
+ 0x1992: 0x000a, 0x1993: 0x000a, 0x1994: 0x000a, 0x1995: 0x000a,
+ 0x1998: 0x000a, 0x1999: 0x000a, 0x199a: 0x000a, 0x199b: 0x000a, 0x199c: 0x000a, 0x199d: 0x000a,
+ 0x199e: 0x000a, 0x199f: 0x000a, 0x19a0: 0x000a, 0x19a1: 0x000a, 0x19a2: 0x000a, 0x19a3: 0x000a,
+ 0x19a4: 0x000a, 0x19a5: 0x000a, 0x19a6: 0x000a, 0x19a7: 0x000a, 0x19a8: 0x000a, 0x19a9: 0x000a,
+ 0x19aa: 0x000a, 0x19ab: 0x000a, 0x19ac: 0x000a, 0x19ad: 0x000a, 0x19ae: 0x000a, 0x19af: 0x000a,
+ 0x19b0: 0x000a, 0x19b1: 0x000a, 0x19b2: 0x000a, 0x19b3: 0x000a, 0x19b4: 0x000a, 0x19b5: 0x000a,
+ 0x19b6: 0x000a, 0x19b7: 0x000a, 0x19b8: 0x000a, 0x19b9: 0x000a,
+ 0x19bd: 0x000a, 0x19be: 0x000a, 0x19bf: 0x000a,
+ // Block 0x67, offset 0x19c0
+ 0x19c0: 0x000a, 0x19c1: 0x000a, 0x19c2: 0x000a, 0x19c3: 0x000a, 0x19c4: 0x000a, 0x19c5: 0x000a,
+ 0x19c6: 0x000a, 0x19c7: 0x000a, 0x19c8: 0x000a, 0x19ca: 0x000a, 0x19cb: 0x000a,
+ 0x19cc: 0x000a, 0x19cd: 0x000a, 0x19ce: 0x000a, 0x19cf: 0x000a, 0x19d0: 0x000a, 0x19d1: 0x000a,
+ 0x19ec: 0x000a, 0x19ed: 0x000a, 0x19ee: 0x000a, 0x19ef: 0x000a,
+ // Block 0x68, offset 0x1a00
+ 0x1a25: 0x000a, 0x1a26: 0x000a, 0x1a27: 0x000a, 0x1a28: 0x000a, 0x1a29: 0x000a,
+ 0x1a2a: 0x000a, 0x1a2f: 0x000c,
+ 0x1a30: 0x000c, 0x1a31: 0x000c,
+ 0x1a39: 0x000a, 0x1a3a: 0x000a, 0x1a3b: 0x000a,
+ 0x1a3c: 0x000a, 0x1a3d: 0x000a, 0x1a3e: 0x000a, 0x1a3f: 0x000a,
+ // Block 0x69, offset 0x1a40
+ 0x1a7f: 0x000c,
+ // Block 0x6a, offset 0x1a80
+ 0x1aa0: 0x000c, 0x1aa1: 0x000c, 0x1aa2: 0x000c, 0x1aa3: 0x000c,
+ 0x1aa4: 0x000c, 0x1aa5: 0x000c, 0x1aa6: 0x000c, 0x1aa7: 0x000c, 0x1aa8: 0x000c, 0x1aa9: 0x000c,
+ 0x1aaa: 0x000c, 0x1aab: 0x000c, 0x1aac: 0x000c, 0x1aad: 0x000c, 0x1aae: 0x000c, 0x1aaf: 0x000c,
+ 0x1ab0: 0x000c, 0x1ab1: 0x000c, 0x1ab2: 0x000c, 0x1ab3: 0x000c, 0x1ab4: 0x000c, 0x1ab5: 0x000c,
+ 0x1ab6: 0x000c, 0x1ab7: 0x000c, 0x1ab8: 0x000c, 0x1ab9: 0x000c, 0x1aba: 0x000c, 0x1abb: 0x000c,
+ 0x1abc: 0x000c, 0x1abd: 0x000c, 0x1abe: 0x000c, 0x1abf: 0x000c,
+ // Block 0x6b, offset 0x1ac0
+ 0x1ac0: 0x000a, 0x1ac1: 0x000a, 0x1ac2: 0x000a, 0x1ac3: 0x000a, 0x1ac4: 0x000a, 0x1ac5: 0x000a,
+ 0x1ac6: 0x000a, 0x1ac7: 0x000a, 0x1ac8: 0x000a, 0x1ac9: 0x000a, 0x1aca: 0x000a, 0x1acb: 0x000a,
+ 0x1acc: 0x000a, 0x1acd: 0x000a, 0x1ace: 0x000a, 0x1acf: 0x000a, 0x1ad0: 0x000a, 0x1ad1: 0x000a,
+ 0x1ad2: 0x000a, 0x1ad3: 0x000a, 0x1ad4: 0x000a, 0x1ad5: 0x000a, 0x1ad6: 0x000a, 0x1ad7: 0x000a,
+ 0x1ad8: 0x000a, 0x1ad9: 0x000a, 0x1ada: 0x000a, 0x1adb: 0x000a, 0x1adc: 0x000a, 0x1add: 0x000a,
+ 0x1ade: 0x000a, 0x1adf: 0x000a, 0x1ae0: 0x000a, 0x1ae1: 0x000a, 0x1ae2: 0x003a, 0x1ae3: 0x002a,
+ 0x1ae4: 0x003a, 0x1ae5: 0x002a, 0x1ae6: 0x003a, 0x1ae7: 0x002a, 0x1ae8: 0x003a, 0x1ae9: 0x002a,
+ 0x1aea: 0x000a, 0x1aeb: 0x000a, 0x1aec: 0x000a, 0x1aed: 0x000a, 0x1aee: 0x000a, 0x1aef: 0x000a,
+ 0x1af0: 0x000a, 0x1af1: 0x000a, 0x1af2: 0x000a, 0x1af3: 0x000a, 0x1af4: 0x000a, 0x1af5: 0x000a,
+ 0x1af6: 0x000a, 0x1af7: 0x000a, 0x1af8: 0x000a, 0x1af9: 0x000a, 0x1afa: 0x000a, 0x1afb: 0x000a,
+ 0x1afc: 0x000a, 0x1afd: 0x000a, 0x1afe: 0x000a, 0x1aff: 0x000a,
+ // Block 0x6c, offset 0x1b00
+ 0x1b00: 0x000a, 0x1b01: 0x000a, 0x1b02: 0x000a, 0x1b03: 0x000a, 0x1b04: 0x000a,
+ // Block 0x6d, offset 0x1b40
+ 0x1b40: 0x000a, 0x1b41: 0x000a, 0x1b42: 0x000a, 0x1b43: 0x000a, 0x1b44: 0x000a, 0x1b45: 0x000a,
+ 0x1b46: 0x000a, 0x1b47: 0x000a, 0x1b48: 0x000a, 0x1b49: 0x000a, 0x1b4a: 0x000a, 0x1b4b: 0x000a,
+ 0x1b4c: 0x000a, 0x1b4d: 0x000a, 0x1b4e: 0x000a, 0x1b4f: 0x000a, 0x1b50: 0x000a, 0x1b51: 0x000a,
+ 0x1b52: 0x000a, 0x1b53: 0x000a, 0x1b54: 0x000a, 0x1b55: 0x000a, 0x1b56: 0x000a, 0x1b57: 0x000a,
+ 0x1b58: 0x000a, 0x1b59: 0x000a, 0x1b5b: 0x000a, 0x1b5c: 0x000a, 0x1b5d: 0x000a,
+ 0x1b5e: 0x000a, 0x1b5f: 0x000a, 0x1b60: 0x000a, 0x1b61: 0x000a, 0x1b62: 0x000a, 0x1b63: 0x000a,
+ 0x1b64: 0x000a, 0x1b65: 0x000a, 0x1b66: 0x000a, 0x1b67: 0x000a, 0x1b68: 0x000a, 0x1b69: 0x000a,
+ 0x1b6a: 0x000a, 0x1b6b: 0x000a, 0x1b6c: 0x000a, 0x1b6d: 0x000a, 0x1b6e: 0x000a, 0x1b6f: 0x000a,
+ 0x1b70: 0x000a, 0x1b71: 0x000a, 0x1b72: 0x000a, 0x1b73: 0x000a, 0x1b74: 0x000a, 0x1b75: 0x000a,
+ 0x1b76: 0x000a, 0x1b77: 0x000a, 0x1b78: 0x000a, 0x1b79: 0x000a, 0x1b7a: 0x000a, 0x1b7b: 0x000a,
+ 0x1b7c: 0x000a, 0x1b7d: 0x000a, 0x1b7e: 0x000a, 0x1b7f: 0x000a,
+ // Block 0x6e, offset 0x1b80
+ 0x1b80: 0x000a, 0x1b81: 0x000a, 0x1b82: 0x000a, 0x1b83: 0x000a, 0x1b84: 0x000a, 0x1b85: 0x000a,
+ 0x1b86: 0x000a, 0x1b87: 0x000a, 0x1b88: 0x000a, 0x1b89: 0x000a, 0x1b8a: 0x000a, 0x1b8b: 0x000a,
+ 0x1b8c: 0x000a, 0x1b8d: 0x000a, 0x1b8e: 0x000a, 0x1b8f: 0x000a, 0x1b90: 0x000a, 0x1b91: 0x000a,
+ 0x1b92: 0x000a, 0x1b93: 0x000a, 0x1b94: 0x000a, 0x1b95: 0x000a, 0x1b96: 0x000a, 0x1b97: 0x000a,
+ 0x1b98: 0x000a, 0x1b99: 0x000a, 0x1b9a: 0x000a, 0x1b9b: 0x000a, 0x1b9c: 0x000a, 0x1b9d: 0x000a,
+ 0x1b9e: 0x000a, 0x1b9f: 0x000a, 0x1ba0: 0x000a, 0x1ba1: 0x000a, 0x1ba2: 0x000a, 0x1ba3: 0x000a,
+ 0x1ba4: 0x000a, 0x1ba5: 0x000a, 0x1ba6: 0x000a, 0x1ba7: 0x000a, 0x1ba8: 0x000a, 0x1ba9: 0x000a,
+ 0x1baa: 0x000a, 0x1bab: 0x000a, 0x1bac: 0x000a, 0x1bad: 0x000a, 0x1bae: 0x000a, 0x1baf: 0x000a,
+ 0x1bb0: 0x000a, 0x1bb1: 0x000a, 0x1bb2: 0x000a, 0x1bb3: 0x000a,
+ // Block 0x6f, offset 0x1bc0
+ 0x1bc0: 0x000a, 0x1bc1: 0x000a, 0x1bc2: 0x000a, 0x1bc3: 0x000a, 0x1bc4: 0x000a, 0x1bc5: 0x000a,
+ 0x1bc6: 0x000a, 0x1bc7: 0x000a, 0x1bc8: 0x000a, 0x1bc9: 0x000a, 0x1bca: 0x000a, 0x1bcb: 0x000a,
+ 0x1bcc: 0x000a, 0x1bcd: 0x000a, 0x1bce: 0x000a, 0x1bcf: 0x000a, 0x1bd0: 0x000a, 0x1bd1: 0x000a,
+ 0x1bd2: 0x000a, 0x1bd3: 0x000a, 0x1bd4: 0x000a, 0x1bd5: 0x000a,
+ 0x1bf0: 0x000a, 0x1bf1: 0x000a, 0x1bf2: 0x000a, 0x1bf3: 0x000a, 0x1bf4: 0x000a, 0x1bf5: 0x000a,
+ 0x1bf6: 0x000a, 0x1bf7: 0x000a, 0x1bf8: 0x000a, 0x1bf9: 0x000a, 0x1bfa: 0x000a, 0x1bfb: 0x000a,
+ // Block 0x70, offset 0x1c00
+ 0x1c00: 0x0009, 0x1c01: 0x000a, 0x1c02: 0x000a, 0x1c03: 0x000a, 0x1c04: 0x000a,
+ 0x1c08: 0x003a, 0x1c09: 0x002a, 0x1c0a: 0x003a, 0x1c0b: 0x002a,
+ 0x1c0c: 0x003a, 0x1c0d: 0x002a, 0x1c0e: 0x003a, 0x1c0f: 0x002a, 0x1c10: 0x003a, 0x1c11: 0x002a,
+ 0x1c12: 0x000a, 0x1c13: 0x000a, 0x1c14: 0x003a, 0x1c15: 0x002a, 0x1c16: 0x003a, 0x1c17: 0x002a,
+ 0x1c18: 0x003a, 0x1c19: 0x002a, 0x1c1a: 0x003a, 0x1c1b: 0x002a, 0x1c1c: 0x000a, 0x1c1d: 0x000a,
+ 0x1c1e: 0x000a, 0x1c1f: 0x000a, 0x1c20: 0x000a,
+ 0x1c2a: 0x000c, 0x1c2b: 0x000c, 0x1c2c: 0x000c, 0x1c2d: 0x000c,
+ 0x1c30: 0x000a,
+ 0x1c36: 0x000a, 0x1c37: 0x000a,
+ 0x1c3d: 0x000a, 0x1c3e: 0x000a, 0x1c3f: 0x000a,
+ // Block 0x71, offset 0x1c40
+ 0x1c59: 0x000c, 0x1c5a: 0x000c, 0x1c5b: 0x000a, 0x1c5c: 0x000a,
+ 0x1c60: 0x000a,
+ // Block 0x72, offset 0x1c80
+ 0x1cbb: 0x000a,
+ // Block 0x73, offset 0x1cc0
+ 0x1cc0: 0x000a, 0x1cc1: 0x000a, 0x1cc2: 0x000a, 0x1cc3: 0x000a, 0x1cc4: 0x000a, 0x1cc5: 0x000a,
+ 0x1cc6: 0x000a, 0x1cc7: 0x000a, 0x1cc8: 0x000a, 0x1cc9: 0x000a, 0x1cca: 0x000a, 0x1ccb: 0x000a,
+ 0x1ccc: 0x000a, 0x1ccd: 0x000a, 0x1cce: 0x000a, 0x1ccf: 0x000a, 0x1cd0: 0x000a, 0x1cd1: 0x000a,
+ 0x1cd2: 0x000a, 0x1cd3: 0x000a, 0x1cd4: 0x000a, 0x1cd5: 0x000a, 0x1cd6: 0x000a, 0x1cd7: 0x000a,
+ 0x1cd8: 0x000a, 0x1cd9: 0x000a, 0x1cda: 0x000a, 0x1cdb: 0x000a, 0x1cdc: 0x000a, 0x1cdd: 0x000a,
+ 0x1cde: 0x000a, 0x1cdf: 0x000a, 0x1ce0: 0x000a, 0x1ce1: 0x000a, 0x1ce2: 0x000a, 0x1ce3: 0x000a,
+ // Block 0x74, offset 0x1d00
+ 0x1d1d: 0x000a,
+ 0x1d1e: 0x000a,
+ // Block 0x75, offset 0x1d40
+ 0x1d50: 0x000a, 0x1d51: 0x000a,
+ 0x1d52: 0x000a, 0x1d53: 0x000a, 0x1d54: 0x000a, 0x1d55: 0x000a, 0x1d56: 0x000a, 0x1d57: 0x000a,
+ 0x1d58: 0x000a, 0x1d59: 0x000a, 0x1d5a: 0x000a, 0x1d5b: 0x000a, 0x1d5c: 0x000a, 0x1d5d: 0x000a,
+ 0x1d5e: 0x000a, 0x1d5f: 0x000a,
+ 0x1d7c: 0x000a, 0x1d7d: 0x000a, 0x1d7e: 0x000a,
+ // Block 0x76, offset 0x1d80
+ 0x1db1: 0x000a, 0x1db2: 0x000a, 0x1db3: 0x000a, 0x1db4: 0x000a, 0x1db5: 0x000a,
+ 0x1db6: 0x000a, 0x1db7: 0x000a, 0x1db8: 0x000a, 0x1db9: 0x000a, 0x1dba: 0x000a, 0x1dbb: 0x000a,
+ 0x1dbc: 0x000a, 0x1dbd: 0x000a, 0x1dbe: 0x000a, 0x1dbf: 0x000a,
+ // Block 0x77, offset 0x1dc0
+ 0x1dcc: 0x000a, 0x1dcd: 0x000a, 0x1dce: 0x000a, 0x1dcf: 0x000a,
+ // Block 0x78, offset 0x1e00
+ 0x1e37: 0x000a, 0x1e38: 0x000a, 0x1e39: 0x000a, 0x1e3a: 0x000a,
+ // Block 0x79, offset 0x1e40
+ 0x1e5e: 0x000a, 0x1e5f: 0x000a,
+ 0x1e7f: 0x000a,
+ // Block 0x7a, offset 0x1e80
+ 0x1e90: 0x000a, 0x1e91: 0x000a,
+ 0x1e92: 0x000a, 0x1e93: 0x000a, 0x1e94: 0x000a, 0x1e95: 0x000a, 0x1e96: 0x000a, 0x1e97: 0x000a,
+ 0x1e98: 0x000a, 0x1e99: 0x000a, 0x1e9a: 0x000a, 0x1e9b: 0x000a, 0x1e9c: 0x000a, 0x1e9d: 0x000a,
+ 0x1e9e: 0x000a, 0x1e9f: 0x000a, 0x1ea0: 0x000a, 0x1ea1: 0x000a, 0x1ea2: 0x000a, 0x1ea3: 0x000a,
+ 0x1ea4: 0x000a, 0x1ea5: 0x000a, 0x1ea6: 0x000a, 0x1ea7: 0x000a, 0x1ea8: 0x000a, 0x1ea9: 0x000a,
+ 0x1eaa: 0x000a, 0x1eab: 0x000a, 0x1eac: 0x000a, 0x1ead: 0x000a, 0x1eae: 0x000a, 0x1eaf: 0x000a,
+ 0x1eb0: 0x000a, 0x1eb1: 0x000a, 0x1eb2: 0x000a, 0x1eb3: 0x000a, 0x1eb4: 0x000a, 0x1eb5: 0x000a,
+ 0x1eb6: 0x000a, 0x1eb7: 0x000a, 0x1eb8: 0x000a, 0x1eb9: 0x000a, 0x1eba: 0x000a, 0x1ebb: 0x000a,
+ 0x1ebc: 0x000a, 0x1ebd: 0x000a, 0x1ebe: 0x000a, 0x1ebf: 0x000a,
+ // Block 0x7b, offset 0x1ec0
+ 0x1ec0: 0x000a, 0x1ec1: 0x000a, 0x1ec2: 0x000a, 0x1ec3: 0x000a, 0x1ec4: 0x000a, 0x1ec5: 0x000a,
+ 0x1ec6: 0x000a,
+ // Block 0x7c, offset 0x1f00
+ 0x1f0d: 0x000a, 0x1f0e: 0x000a, 0x1f0f: 0x000a,
+ // Block 0x7d, offset 0x1f40
+ 0x1f6f: 0x000c,
+ 0x1f70: 0x000c, 0x1f71: 0x000c, 0x1f72: 0x000c, 0x1f73: 0x000a, 0x1f74: 0x000c, 0x1f75: 0x000c,
+ 0x1f76: 0x000c, 0x1f77: 0x000c, 0x1f78: 0x000c, 0x1f79: 0x000c, 0x1f7a: 0x000c, 0x1f7b: 0x000c,
+ 0x1f7c: 0x000c, 0x1f7d: 0x000c, 0x1f7e: 0x000a, 0x1f7f: 0x000a,
+ // Block 0x7e, offset 0x1f80
+ 0x1f9e: 0x000c, 0x1f9f: 0x000c,
+ // Block 0x7f, offset 0x1fc0
+ 0x1ff0: 0x000c, 0x1ff1: 0x000c,
+ // Block 0x80, offset 0x2000
+ 0x2000: 0x000a, 0x2001: 0x000a, 0x2002: 0x000a, 0x2003: 0x000a, 0x2004: 0x000a, 0x2005: 0x000a,
+ 0x2006: 0x000a, 0x2007: 0x000a, 0x2008: 0x000a, 0x2009: 0x000a, 0x200a: 0x000a, 0x200b: 0x000a,
+ 0x200c: 0x000a, 0x200d: 0x000a, 0x200e: 0x000a, 0x200f: 0x000a, 0x2010: 0x000a, 0x2011: 0x000a,
+ 0x2012: 0x000a, 0x2013: 0x000a, 0x2014: 0x000a, 0x2015: 0x000a, 0x2016: 0x000a, 0x2017: 0x000a,
+ 0x2018: 0x000a, 0x2019: 0x000a, 0x201a: 0x000a, 0x201b: 0x000a, 0x201c: 0x000a, 0x201d: 0x000a,
+ 0x201e: 0x000a, 0x201f: 0x000a, 0x2020: 0x000a, 0x2021: 0x000a,
+ // Block 0x81, offset 0x2040
+ 0x2048: 0x000a,
+ // Block 0x82, offset 0x2080
+ 0x2082: 0x000c,
+ 0x2086: 0x000c, 0x208b: 0x000c,
+ 0x20a5: 0x000c, 0x20a6: 0x000c, 0x20a8: 0x000a, 0x20a9: 0x000a,
+ 0x20aa: 0x000a, 0x20ab: 0x000a,
+ 0x20b8: 0x0004, 0x20b9: 0x0004,
+ // Block 0x83, offset 0x20c0
+ 0x20f4: 0x000a, 0x20f5: 0x000a,
+ 0x20f6: 0x000a, 0x20f7: 0x000a,
+ // Block 0x84, offset 0x2100
+ 0x2104: 0x000c, 0x2105: 0x000c,
+ 0x2120: 0x000c, 0x2121: 0x000c, 0x2122: 0x000c, 0x2123: 0x000c,
+ 0x2124: 0x000c, 0x2125: 0x000c, 0x2126: 0x000c, 0x2127: 0x000c, 0x2128: 0x000c, 0x2129: 0x000c,
+ 0x212a: 0x000c, 0x212b: 0x000c, 0x212c: 0x000c, 0x212d: 0x000c, 0x212e: 0x000c, 0x212f: 0x000c,
+ 0x2130: 0x000c, 0x2131: 0x000c,
+ // Block 0x85, offset 0x2140
+ 0x2166: 0x000c, 0x2167: 0x000c, 0x2168: 0x000c, 0x2169: 0x000c,
+ 0x216a: 0x000c, 0x216b: 0x000c, 0x216c: 0x000c, 0x216d: 0x000c,
+ // Block 0x86, offset 0x2180
+ 0x2187: 0x000c, 0x2188: 0x000c, 0x2189: 0x000c, 0x218a: 0x000c, 0x218b: 0x000c,
+ 0x218c: 0x000c, 0x218d: 0x000c, 0x218e: 0x000c, 0x218f: 0x000c, 0x2190: 0x000c, 0x2191: 0x000c,
+ // Block 0x87, offset 0x21c0
+ 0x21c0: 0x000c, 0x21c1: 0x000c, 0x21c2: 0x000c,
+ 0x21f3: 0x000c,
+ 0x21f6: 0x000c, 0x21f7: 0x000c, 0x21f8: 0x000c, 0x21f9: 0x000c,
+ 0x21fc: 0x000c,
+ // Block 0x88, offset 0x2200
+ 0x2225: 0x000c,
+ // Block 0x89, offset 0x2240
+ 0x2269: 0x000c,
+ 0x226a: 0x000c, 0x226b: 0x000c, 0x226c: 0x000c, 0x226d: 0x000c, 0x226e: 0x000c,
+ 0x2271: 0x000c, 0x2272: 0x000c, 0x2275: 0x000c,
+ 0x2276: 0x000c,
+ // Block 0x8a, offset 0x2280
+ 0x2283: 0x000c,
+ 0x228c: 0x000c,
+ 0x22bc: 0x000c,
+ // Block 0x8b, offset 0x22c0
+ 0x22f0: 0x000c, 0x22f2: 0x000c, 0x22f3: 0x000c, 0x22f4: 0x000c,
+ 0x22f7: 0x000c, 0x22f8: 0x000c,
+ 0x22fe: 0x000c, 0x22ff: 0x000c,
+ // Block 0x8c, offset 0x2300
+ 0x2301: 0x000c,
+ 0x232c: 0x000c, 0x232d: 0x000c,
+ 0x2336: 0x000c,
+ // Block 0x8d, offset 0x2340
+ 0x2365: 0x000c, 0x2368: 0x000c,
+ 0x236d: 0x000c,
+ // Block 0x8e, offset 0x2380
+ 0x239d: 0x0001,
+ 0x239e: 0x000c, 0x239f: 0x0001, 0x23a0: 0x0001, 0x23a1: 0x0001, 0x23a2: 0x0001, 0x23a3: 0x0001,
+ 0x23a4: 0x0001, 0x23a5: 0x0001, 0x23a6: 0x0001, 0x23a7: 0x0001, 0x23a8: 0x0001, 0x23a9: 0x0003,
+ 0x23aa: 0x0001, 0x23ab: 0x0001, 0x23ac: 0x0001, 0x23ad: 0x0001, 0x23ae: 0x0001, 0x23af: 0x0001,
+ 0x23b0: 0x0001, 0x23b1: 0x0001, 0x23b2: 0x0001, 0x23b3: 0x0001, 0x23b4: 0x0001, 0x23b5: 0x0001,
+ 0x23b6: 0x0001, 0x23b7: 0x0001, 0x23b8: 0x0001, 0x23b9: 0x0001, 0x23ba: 0x0001, 0x23bb: 0x0001,
+ 0x23bc: 0x0001, 0x23bd: 0x0001, 0x23be: 0x0001, 0x23bf: 0x0001,
+ // Block 0x8f, offset 0x23c0
+ 0x23c0: 0x0001, 0x23c1: 0x0001, 0x23c2: 0x0001, 0x23c3: 0x0001, 0x23c4: 0x0001, 0x23c5: 0x0001,
+ 0x23c6: 0x0001, 0x23c7: 0x0001, 0x23c8: 0x0001, 0x23c9: 0x0001, 0x23ca: 0x0001, 0x23cb: 0x0001,
+ 0x23cc: 0x0001, 0x23cd: 0x0001, 0x23ce: 0x0001, 0x23cf: 0x0001, 0x23d0: 0x000d, 0x23d1: 0x000d,
+ 0x23d2: 0x000d, 0x23d3: 0x000d, 0x23d4: 0x000d, 0x23d5: 0x000d, 0x23d6: 0x000d, 0x23d7: 0x000d,
+ 0x23d8: 0x000d, 0x23d9: 0x000d, 0x23da: 0x000d, 0x23db: 0x000d, 0x23dc: 0x000d, 0x23dd: 0x000d,
+ 0x23de: 0x000d, 0x23df: 0x000d, 0x23e0: 0x000d, 0x23e1: 0x000d, 0x23e2: 0x000d, 0x23e3: 0x000d,
+ 0x23e4: 0x000d, 0x23e5: 0x000d, 0x23e6: 0x000d, 0x23e7: 0x000d, 0x23e8: 0x000d, 0x23e9: 0x000d,
+ 0x23ea: 0x000d, 0x23eb: 0x000d, 0x23ec: 0x000d, 0x23ed: 0x000d, 0x23ee: 0x000d, 0x23ef: 0x000d,
+ 0x23f0: 0x000d, 0x23f1: 0x000d, 0x23f2: 0x000d, 0x23f3: 0x000d, 0x23f4: 0x000d, 0x23f5: 0x000d,
+ 0x23f6: 0x000d, 0x23f7: 0x000d, 0x23f8: 0x000d, 0x23f9: 0x000d, 0x23fa: 0x000d, 0x23fb: 0x000d,
+ 0x23fc: 0x000d, 0x23fd: 0x000d, 0x23fe: 0x000d, 0x23ff: 0x000d,
+ // Block 0x90, offset 0x2400
+ 0x2400: 0x000d, 0x2401: 0x000d, 0x2402: 0x000d, 0x2403: 0x000d, 0x2404: 0x000d, 0x2405: 0x000d,
+ 0x2406: 0x000d, 0x2407: 0x000d, 0x2408: 0x000d, 0x2409: 0x000d, 0x240a: 0x000d, 0x240b: 0x000d,
+ 0x240c: 0x000d, 0x240d: 0x000d, 0x240e: 0x000d, 0x240f: 0x000d, 0x2410: 0x000d, 0x2411: 0x000d,
+ 0x2412: 0x000d, 0x2413: 0x000d, 0x2414: 0x000d, 0x2415: 0x000d, 0x2416: 0x000d, 0x2417: 0x000d,
+ 0x2418: 0x000d, 0x2419: 0x000d, 0x241a: 0x000d, 0x241b: 0x000d, 0x241c: 0x000d, 0x241d: 0x000d,
+ 0x241e: 0x000d, 0x241f: 0x000d, 0x2420: 0x000d, 0x2421: 0x000d, 0x2422: 0x000d, 0x2423: 0x000d,
+ 0x2424: 0x000d, 0x2425: 0x000d, 0x2426: 0x000d, 0x2427: 0x000d, 0x2428: 0x000d, 0x2429: 0x000d,
+ 0x242a: 0x000d, 0x242b: 0x000d, 0x242c: 0x000d, 0x242d: 0x000d, 0x242e: 0x000d, 0x242f: 0x000d,
+ 0x2430: 0x000d, 0x2431: 0x000d, 0x2432: 0x000d, 0x2433: 0x000d, 0x2434: 0x000d, 0x2435: 0x000d,
+ 0x2436: 0x000d, 0x2437: 0x000d, 0x2438: 0x000d, 0x2439: 0x000d, 0x243a: 0x000d, 0x243b: 0x000d,
+ 0x243c: 0x000d, 0x243d: 0x000d, 0x243e: 0x000a, 0x243f: 0x000a,
+ // Block 0x91, offset 0x2440
+ 0x2440: 0x000d, 0x2441: 0x000d, 0x2442: 0x000d, 0x2443: 0x000d, 0x2444: 0x000d, 0x2445: 0x000d,
+ 0x2446: 0x000d, 0x2447: 0x000d, 0x2448: 0x000d, 0x2449: 0x000d, 0x244a: 0x000d, 0x244b: 0x000d,
+ 0x244c: 0x000d, 0x244d: 0x000d, 0x244e: 0x000d, 0x244f: 0x000d, 0x2450: 0x000b, 0x2451: 0x000b,
+ 0x2452: 0x000b, 0x2453: 0x000b, 0x2454: 0x000b, 0x2455: 0x000b, 0x2456: 0x000b, 0x2457: 0x000b,
+ 0x2458: 0x000b, 0x2459: 0x000b, 0x245a: 0x000b, 0x245b: 0x000b, 0x245c: 0x000b, 0x245d: 0x000b,
+ 0x245e: 0x000b, 0x245f: 0x000b, 0x2460: 0x000b, 0x2461: 0x000b, 0x2462: 0x000b, 0x2463: 0x000b,
+ 0x2464: 0x000b, 0x2465: 0x000b, 0x2466: 0x000b, 0x2467: 0x000b, 0x2468: 0x000b, 0x2469: 0x000b,
+ 0x246a: 0x000b, 0x246b: 0x000b, 0x246c: 0x000b, 0x246d: 0x000b, 0x246e: 0x000b, 0x246f: 0x000b,
+ 0x2470: 0x000d, 0x2471: 0x000d, 0x2472: 0x000d, 0x2473: 0x000d, 0x2474: 0x000d, 0x2475: 0x000d,
+ 0x2476: 0x000d, 0x2477: 0x000d, 0x2478: 0x000d, 0x2479: 0x000d, 0x247a: 0x000d, 0x247b: 0x000d,
+ 0x247c: 0x000d, 0x247d: 0x000a, 0x247e: 0x000d, 0x247f: 0x000d,
+ // Block 0x92, offset 0x2480
+ 0x2480: 0x000c, 0x2481: 0x000c, 0x2482: 0x000c, 0x2483: 0x000c, 0x2484: 0x000c, 0x2485: 0x000c,
+ 0x2486: 0x000c, 0x2487: 0x000c, 0x2488: 0x000c, 0x2489: 0x000c, 0x248a: 0x000c, 0x248b: 0x000c,
+ 0x248c: 0x000c, 0x248d: 0x000c, 0x248e: 0x000c, 0x248f: 0x000c, 0x2490: 0x000a, 0x2491: 0x000a,
+ 0x2492: 0x000a, 0x2493: 0x000a, 0x2494: 0x000a, 0x2495: 0x000a, 0x2496: 0x000a, 0x2497: 0x000a,
+ 0x2498: 0x000a, 0x2499: 0x000a,
+ 0x24a0: 0x000c, 0x24a1: 0x000c, 0x24a2: 0x000c, 0x24a3: 0x000c,
+ 0x24a4: 0x000c, 0x24a5: 0x000c, 0x24a6: 0x000c, 0x24a7: 0x000c, 0x24a8: 0x000c, 0x24a9: 0x000c,
+ 0x24aa: 0x000c, 0x24ab: 0x000c, 0x24ac: 0x000c, 0x24ad: 0x000c, 0x24ae: 0x000c, 0x24af: 0x000c,
+ 0x24b0: 0x000a, 0x24b1: 0x000a, 0x24b2: 0x000a, 0x24b3: 0x000a, 0x24b4: 0x000a, 0x24b5: 0x000a,
+ 0x24b6: 0x000a, 0x24b7: 0x000a, 0x24b8: 0x000a, 0x24b9: 0x000a, 0x24ba: 0x000a, 0x24bb: 0x000a,
+ 0x24bc: 0x000a, 0x24bd: 0x000a, 0x24be: 0x000a, 0x24bf: 0x000a,
+ // Block 0x93, offset 0x24c0
+ 0x24c0: 0x000a, 0x24c1: 0x000a, 0x24c2: 0x000a, 0x24c3: 0x000a, 0x24c4: 0x000a, 0x24c5: 0x000a,
+ 0x24c6: 0x000a, 0x24c7: 0x000a, 0x24c8: 0x000a, 0x24c9: 0x000a, 0x24ca: 0x000a, 0x24cb: 0x000a,
+ 0x24cc: 0x000a, 0x24cd: 0x000a, 0x24ce: 0x000a, 0x24cf: 0x000a, 0x24d0: 0x0006, 0x24d1: 0x000a,
+ 0x24d2: 0x0006, 0x24d4: 0x000a, 0x24d5: 0x0006, 0x24d6: 0x000a, 0x24d7: 0x000a,
+ 0x24d8: 0x000a, 0x24d9: 0x009a, 0x24da: 0x008a, 0x24db: 0x007a, 0x24dc: 0x006a, 0x24dd: 0x009a,
+ 0x24de: 0x008a, 0x24df: 0x0004, 0x24e0: 0x000a, 0x24e1: 0x000a, 0x24e2: 0x0003, 0x24e3: 0x0003,
+ 0x24e4: 0x000a, 0x24e5: 0x000a, 0x24e6: 0x000a, 0x24e8: 0x000a, 0x24e9: 0x0004,
+ 0x24ea: 0x0004, 0x24eb: 0x000a,
+ 0x24f0: 0x000d, 0x24f1: 0x000d, 0x24f2: 0x000d, 0x24f3: 0x000d, 0x24f4: 0x000d, 0x24f5: 0x000d,
+ 0x24f6: 0x000d, 0x24f7: 0x000d, 0x24f8: 0x000d, 0x24f9: 0x000d, 0x24fa: 0x000d, 0x24fb: 0x000d,
+ 0x24fc: 0x000d, 0x24fd: 0x000d, 0x24fe: 0x000d, 0x24ff: 0x000d,
+ // Block 0x94, offset 0x2500
+ 0x2500: 0x000d, 0x2501: 0x000d, 0x2502: 0x000d, 0x2503: 0x000d, 0x2504: 0x000d, 0x2505: 0x000d,
+ 0x2506: 0x000d, 0x2507: 0x000d, 0x2508: 0x000d, 0x2509: 0x000d, 0x250a: 0x000d, 0x250b: 0x000d,
+ 0x250c: 0x000d, 0x250d: 0x000d, 0x250e: 0x000d, 0x250f: 0x000d, 0x2510: 0x000d, 0x2511: 0x000d,
+ 0x2512: 0x000d, 0x2513: 0x000d, 0x2514: 0x000d, 0x2515: 0x000d, 0x2516: 0x000d, 0x2517: 0x000d,
+ 0x2518: 0x000d, 0x2519: 0x000d, 0x251a: 0x000d, 0x251b: 0x000d, 0x251c: 0x000d, 0x251d: 0x000d,
+ 0x251e: 0x000d, 0x251f: 0x000d, 0x2520: 0x000d, 0x2521: 0x000d, 0x2522: 0x000d, 0x2523: 0x000d,
+ 0x2524: 0x000d, 0x2525: 0x000d, 0x2526: 0x000d, 0x2527: 0x000d, 0x2528: 0x000d, 0x2529: 0x000d,
+ 0x252a: 0x000d, 0x252b: 0x000d, 0x252c: 0x000d, 0x252d: 0x000d, 0x252e: 0x000d, 0x252f: 0x000d,
+ 0x2530: 0x000d, 0x2531: 0x000d, 0x2532: 0x000d, 0x2533: 0x000d, 0x2534: 0x000d, 0x2535: 0x000d,
+ 0x2536: 0x000d, 0x2537: 0x000d, 0x2538: 0x000d, 0x2539: 0x000d, 0x253a: 0x000d, 0x253b: 0x000d,
+ 0x253c: 0x000d, 0x253d: 0x000d, 0x253e: 0x000d, 0x253f: 0x000b,
+ // Block 0x95, offset 0x2540
+ 0x2541: 0x000a, 0x2542: 0x000a, 0x2543: 0x0004, 0x2544: 0x0004, 0x2545: 0x0004,
+ 0x2546: 0x000a, 0x2547: 0x000a, 0x2548: 0x003a, 0x2549: 0x002a, 0x254a: 0x000a, 0x254b: 0x0003,
+ 0x254c: 0x0006, 0x254d: 0x0003, 0x254e: 0x0006, 0x254f: 0x0006, 0x2550: 0x0002, 0x2551: 0x0002,
+ 0x2552: 0x0002, 0x2553: 0x0002, 0x2554: 0x0002, 0x2555: 0x0002, 0x2556: 0x0002, 0x2557: 0x0002,
+ 0x2558: 0x0002, 0x2559: 0x0002, 0x255a: 0x0006, 0x255b: 0x000a, 0x255c: 0x000a, 0x255d: 0x000a,
+ 0x255e: 0x000a, 0x255f: 0x000a, 0x2560: 0x000a,
+ 0x257b: 0x005a,
+ 0x257c: 0x000a, 0x257d: 0x004a, 0x257e: 0x000a, 0x257f: 0x000a,
+ // Block 0x96, offset 0x2580
+ 0x2580: 0x000a,
+ 0x259b: 0x005a, 0x259c: 0x000a, 0x259d: 0x004a,
+ 0x259e: 0x000a, 0x259f: 0x00fa, 0x25a0: 0x00ea, 0x25a1: 0x000a, 0x25a2: 0x003a, 0x25a3: 0x002a,
+ 0x25a4: 0x000a, 0x25a5: 0x000a,
+ // Block 0x97, offset 0x25c0
+ 0x25e0: 0x0004, 0x25e1: 0x0004, 0x25e2: 0x000a, 0x25e3: 0x000a,
+ 0x25e4: 0x000a, 0x25e5: 0x0004, 0x25e6: 0x0004, 0x25e8: 0x000a, 0x25e9: 0x000a,
+ 0x25ea: 0x000a, 0x25eb: 0x000a, 0x25ec: 0x000a, 0x25ed: 0x000a, 0x25ee: 0x000a,
+ 0x25f0: 0x000b, 0x25f1: 0x000b, 0x25f2: 0x000b, 0x25f3: 0x000b, 0x25f4: 0x000b, 0x25f5: 0x000b,
+ 0x25f6: 0x000b, 0x25f7: 0x000b, 0x25f8: 0x000b, 0x25f9: 0x000a, 0x25fa: 0x000a, 0x25fb: 0x000a,
+ 0x25fc: 0x000a, 0x25fd: 0x000a, 0x25fe: 0x000b, 0x25ff: 0x000b,
+ // Block 0x98, offset 0x2600
+ 0x2601: 0x000a,
+ // Block 0x99, offset 0x2640
+ 0x2640: 0x000a, 0x2641: 0x000a, 0x2642: 0x000a, 0x2643: 0x000a, 0x2644: 0x000a, 0x2645: 0x000a,
+ 0x2646: 0x000a, 0x2647: 0x000a, 0x2648: 0x000a, 0x2649: 0x000a, 0x264a: 0x000a, 0x264b: 0x000a,
+ 0x264c: 0x000a, 0x2650: 0x000a, 0x2651: 0x000a,
+ 0x2652: 0x000a, 0x2653: 0x000a, 0x2654: 0x000a, 0x2655: 0x000a, 0x2656: 0x000a, 0x2657: 0x000a,
+ 0x2658: 0x000a, 0x2659: 0x000a, 0x265a: 0x000a, 0x265b: 0x000a,
+ 0x2660: 0x000a,
+ // Block 0x9a, offset 0x2680
+ 0x26bd: 0x000c,
+ // Block 0x9b, offset 0x26c0
+ 0x26e0: 0x000c, 0x26e1: 0x0002, 0x26e2: 0x0002, 0x26e3: 0x0002,
+ 0x26e4: 0x0002, 0x26e5: 0x0002, 0x26e6: 0x0002, 0x26e7: 0x0002, 0x26e8: 0x0002, 0x26e9: 0x0002,
+ 0x26ea: 0x0002, 0x26eb: 0x0002, 0x26ec: 0x0002, 0x26ed: 0x0002, 0x26ee: 0x0002, 0x26ef: 0x0002,
+ 0x26f0: 0x0002, 0x26f1: 0x0002, 0x26f2: 0x0002, 0x26f3: 0x0002, 0x26f4: 0x0002, 0x26f5: 0x0002,
+ 0x26f6: 0x0002, 0x26f7: 0x0002, 0x26f8: 0x0002, 0x26f9: 0x0002, 0x26fa: 0x0002, 0x26fb: 0x0002,
+ // Block 0x9c, offset 0x2700
+ 0x2736: 0x000c, 0x2737: 0x000c, 0x2738: 0x000c, 0x2739: 0x000c, 0x273a: 0x000c,
+ // Block 0x9d, offset 0x2740
+ 0x2740: 0x0001, 0x2741: 0x0001, 0x2742: 0x0001, 0x2743: 0x0001, 0x2744: 0x0001, 0x2745: 0x0001,
+ 0x2746: 0x0001, 0x2747: 0x0001, 0x2748: 0x0001, 0x2749: 0x0001, 0x274a: 0x0001, 0x274b: 0x0001,
+ 0x274c: 0x0001, 0x274d: 0x0001, 0x274e: 0x0001, 0x274f: 0x0001, 0x2750: 0x0001, 0x2751: 0x0001,
+ 0x2752: 0x0001, 0x2753: 0x0001, 0x2754: 0x0001, 0x2755: 0x0001, 0x2756: 0x0001, 0x2757: 0x0001,
+ 0x2758: 0x0001, 0x2759: 0x0001, 0x275a: 0x0001, 0x275b: 0x0001, 0x275c: 0x0001, 0x275d: 0x0001,
+ 0x275e: 0x0001, 0x275f: 0x0001, 0x2760: 0x0001, 0x2761: 0x0001, 0x2762: 0x0001, 0x2763: 0x0001,
+ 0x2764: 0x0001, 0x2765: 0x0001, 0x2766: 0x0001, 0x2767: 0x0001, 0x2768: 0x0001, 0x2769: 0x0001,
+ 0x276a: 0x0001, 0x276b: 0x0001, 0x276c: 0x0001, 0x276d: 0x0001, 0x276e: 0x0001, 0x276f: 0x0001,
+ 0x2770: 0x0001, 0x2771: 0x0001, 0x2772: 0x0001, 0x2773: 0x0001, 0x2774: 0x0001, 0x2775: 0x0001,
+ 0x2776: 0x0001, 0x2777: 0x0001, 0x2778: 0x0001, 0x2779: 0x0001, 0x277a: 0x0001, 0x277b: 0x0001,
+ 0x277c: 0x0001, 0x277d: 0x0001, 0x277e: 0x0001, 0x277f: 0x0001,
+ // Block 0x9e, offset 0x2780
+ 0x2780: 0x0001, 0x2781: 0x0001, 0x2782: 0x0001, 0x2783: 0x0001, 0x2784: 0x0001, 0x2785: 0x0001,
+ 0x2786: 0x0001, 0x2787: 0x0001, 0x2788: 0x0001, 0x2789: 0x0001, 0x278a: 0x0001, 0x278b: 0x0001,
+ 0x278c: 0x0001, 0x278d: 0x0001, 0x278e: 0x0001, 0x278f: 0x0001, 0x2790: 0x0001, 0x2791: 0x0001,
+ 0x2792: 0x0001, 0x2793: 0x0001, 0x2794: 0x0001, 0x2795: 0x0001, 0x2796: 0x0001, 0x2797: 0x0001,
+ 0x2798: 0x0001, 0x2799: 0x0001, 0x279a: 0x0001, 0x279b: 0x0001, 0x279c: 0x0001, 0x279d: 0x0001,
+ 0x279e: 0x0001, 0x279f: 0x000a, 0x27a0: 0x0001, 0x27a1: 0x0001, 0x27a2: 0x0001, 0x27a3: 0x0001,
+ 0x27a4: 0x0001, 0x27a5: 0x0001, 0x27a6: 0x0001, 0x27a7: 0x0001, 0x27a8: 0x0001, 0x27a9: 0x0001,
+ 0x27aa: 0x0001, 0x27ab: 0x0001, 0x27ac: 0x0001, 0x27ad: 0x0001, 0x27ae: 0x0001, 0x27af: 0x0001,
+ 0x27b0: 0x0001, 0x27b1: 0x0001, 0x27b2: 0x0001, 0x27b3: 0x0001, 0x27b4: 0x0001, 0x27b5: 0x0001,
+ 0x27b6: 0x0001, 0x27b7: 0x0001, 0x27b8: 0x0001, 0x27b9: 0x0001, 0x27ba: 0x0001, 0x27bb: 0x0001,
+ 0x27bc: 0x0001, 0x27bd: 0x0001, 0x27be: 0x0001, 0x27bf: 0x0001,
+ // Block 0x9f, offset 0x27c0
+ 0x27c0: 0x0001, 0x27c1: 0x000c, 0x27c2: 0x000c, 0x27c3: 0x000c, 0x27c4: 0x0001, 0x27c5: 0x000c,
+ 0x27c6: 0x000c, 0x27c7: 0x0001, 0x27c8: 0x0001, 0x27c9: 0x0001, 0x27ca: 0x0001, 0x27cb: 0x0001,
+ 0x27cc: 0x000c, 0x27cd: 0x000c, 0x27ce: 0x000c, 0x27cf: 0x000c, 0x27d0: 0x0001, 0x27d1: 0x0001,
+ 0x27d2: 0x0001, 0x27d3: 0x0001, 0x27d4: 0x0001, 0x27d5: 0x0001, 0x27d6: 0x0001, 0x27d7: 0x0001,
+ 0x27d8: 0x0001, 0x27d9: 0x0001, 0x27da: 0x0001, 0x27db: 0x0001, 0x27dc: 0x0001, 0x27dd: 0x0001,
+ 0x27de: 0x0001, 0x27df: 0x0001, 0x27e0: 0x0001, 0x27e1: 0x0001, 0x27e2: 0x0001, 0x27e3: 0x0001,
+ 0x27e4: 0x0001, 0x27e5: 0x0001, 0x27e6: 0x0001, 0x27e7: 0x0001, 0x27e8: 0x0001, 0x27e9: 0x0001,
+ 0x27ea: 0x0001, 0x27eb: 0x0001, 0x27ec: 0x0001, 0x27ed: 0x0001, 0x27ee: 0x0001, 0x27ef: 0x0001,
+ 0x27f0: 0x0001, 0x27f1: 0x0001, 0x27f2: 0x0001, 0x27f3: 0x0001, 0x27f4: 0x0001, 0x27f5: 0x0001,
+ 0x27f6: 0x0001, 0x27f7: 0x0001, 0x27f8: 0x000c, 0x27f9: 0x000c, 0x27fa: 0x000c, 0x27fb: 0x0001,
+ 0x27fc: 0x0001, 0x27fd: 0x0001, 0x27fe: 0x0001, 0x27ff: 0x000c,
+ // Block 0xa0, offset 0x2800
+ 0x2800: 0x0001, 0x2801: 0x0001, 0x2802: 0x0001, 0x2803: 0x0001, 0x2804: 0x0001, 0x2805: 0x0001,
+ 0x2806: 0x0001, 0x2807: 0x0001, 0x2808: 0x0001, 0x2809: 0x0001, 0x280a: 0x0001, 0x280b: 0x0001,
+ 0x280c: 0x0001, 0x280d: 0x0001, 0x280e: 0x0001, 0x280f: 0x0001, 0x2810: 0x0001, 0x2811: 0x0001,
+ 0x2812: 0x0001, 0x2813: 0x0001, 0x2814: 0x0001, 0x2815: 0x0001, 0x2816: 0x0001, 0x2817: 0x0001,
+ 0x2818: 0x0001, 0x2819: 0x0001, 0x281a: 0x0001, 0x281b: 0x0001, 0x281c: 0x0001, 0x281d: 0x0001,
+ 0x281e: 0x0001, 0x281f: 0x0001, 0x2820: 0x0001, 0x2821: 0x0001, 0x2822: 0x0001, 0x2823: 0x0001,
+ 0x2824: 0x0001, 0x2825: 0x000c, 0x2826: 0x000c, 0x2827: 0x0001, 0x2828: 0x0001, 0x2829: 0x0001,
+ 0x282a: 0x0001, 0x282b: 0x0001, 0x282c: 0x0001, 0x282d: 0x0001, 0x282e: 0x0001, 0x282f: 0x0001,
+ 0x2830: 0x0001, 0x2831: 0x0001, 0x2832: 0x0001, 0x2833: 0x0001, 0x2834: 0x0001, 0x2835: 0x0001,
+ 0x2836: 0x0001, 0x2837: 0x0001, 0x2838: 0x0001, 0x2839: 0x0001, 0x283a: 0x0001, 0x283b: 0x0001,
+ 0x283c: 0x0001, 0x283d: 0x0001, 0x283e: 0x0001, 0x283f: 0x0001,
+ // Block 0xa1, offset 0x2840
+ 0x2840: 0x0001, 0x2841: 0x0001, 0x2842: 0x0001, 0x2843: 0x0001, 0x2844: 0x0001, 0x2845: 0x0001,
+ 0x2846: 0x0001, 0x2847: 0x0001, 0x2848: 0x0001, 0x2849: 0x0001, 0x284a: 0x0001, 0x284b: 0x0001,
+ 0x284c: 0x0001, 0x284d: 0x0001, 0x284e: 0x0001, 0x284f: 0x0001, 0x2850: 0x0001, 0x2851: 0x0001,
+ 0x2852: 0x0001, 0x2853: 0x0001, 0x2854: 0x0001, 0x2855: 0x0001, 0x2856: 0x0001, 0x2857: 0x0001,
+ 0x2858: 0x0001, 0x2859: 0x0001, 0x285a: 0x0001, 0x285b: 0x0001, 0x285c: 0x0001, 0x285d: 0x0001,
+ 0x285e: 0x0001, 0x285f: 0x0001, 0x2860: 0x0001, 0x2861: 0x0001, 0x2862: 0x0001, 0x2863: 0x0001,
+ 0x2864: 0x0001, 0x2865: 0x0001, 0x2866: 0x0001, 0x2867: 0x0001, 0x2868: 0x0001, 0x2869: 0x0001,
+ 0x286a: 0x0001, 0x286b: 0x0001, 0x286c: 0x0001, 0x286d: 0x0001, 0x286e: 0x0001, 0x286f: 0x0001,
+ 0x2870: 0x0001, 0x2871: 0x0001, 0x2872: 0x0001, 0x2873: 0x0001, 0x2874: 0x0001, 0x2875: 0x0001,
+ 0x2876: 0x0001, 0x2877: 0x0001, 0x2878: 0x0001, 0x2879: 0x000a, 0x287a: 0x000a, 0x287b: 0x000a,
+ 0x287c: 0x000a, 0x287d: 0x000a, 0x287e: 0x000a, 0x287f: 0x000a,
+ // Block 0xa2, offset 0x2880
+ 0x2880: 0x0001, 0x2881: 0x0001, 0x2882: 0x0001, 0x2883: 0x0001, 0x2884: 0x0001, 0x2885: 0x0001,
+ 0x2886: 0x0001, 0x2887: 0x0001, 0x2888: 0x0001, 0x2889: 0x0001, 0x288a: 0x0001, 0x288b: 0x0001,
+ 0x288c: 0x0001, 0x288d: 0x0001, 0x288e: 0x0001, 0x288f: 0x0001, 0x2890: 0x0001, 0x2891: 0x0001,
+ 0x2892: 0x0001, 0x2893: 0x0001, 0x2894: 0x0001, 0x2895: 0x0001, 0x2896: 0x0001, 0x2897: 0x0001,
+ 0x2898: 0x0001, 0x2899: 0x0001, 0x289a: 0x0001, 0x289b: 0x0001, 0x289c: 0x0001, 0x289d: 0x0001,
+ 0x289e: 0x0001, 0x289f: 0x0001, 0x28a0: 0x0005, 0x28a1: 0x0005, 0x28a2: 0x0005, 0x28a3: 0x0005,
+ 0x28a4: 0x0005, 0x28a5: 0x0005, 0x28a6: 0x0005, 0x28a7: 0x0005, 0x28a8: 0x0005, 0x28a9: 0x0005,
+ 0x28aa: 0x0005, 0x28ab: 0x0005, 0x28ac: 0x0005, 0x28ad: 0x0005, 0x28ae: 0x0005, 0x28af: 0x0005,
+ 0x28b0: 0x0005, 0x28b1: 0x0005, 0x28b2: 0x0005, 0x28b3: 0x0005, 0x28b4: 0x0005, 0x28b5: 0x0005,
+ 0x28b6: 0x0005, 0x28b7: 0x0005, 0x28b8: 0x0005, 0x28b9: 0x0005, 0x28ba: 0x0005, 0x28bb: 0x0005,
+ 0x28bc: 0x0005, 0x28bd: 0x0005, 0x28be: 0x0005, 0x28bf: 0x0001,
+ // Block 0xa3, offset 0x28c0
+ 0x28c1: 0x000c,
+ 0x28f8: 0x000c, 0x28f9: 0x000c, 0x28fa: 0x000c, 0x28fb: 0x000c,
+ 0x28fc: 0x000c, 0x28fd: 0x000c, 0x28fe: 0x000c, 0x28ff: 0x000c,
+ // Block 0xa4, offset 0x2900
+ 0x2900: 0x000c, 0x2901: 0x000c, 0x2902: 0x000c, 0x2903: 0x000c, 0x2904: 0x000c, 0x2905: 0x000c,
+ 0x2906: 0x000c,
+ 0x2912: 0x000a, 0x2913: 0x000a, 0x2914: 0x000a, 0x2915: 0x000a, 0x2916: 0x000a, 0x2917: 0x000a,
+ 0x2918: 0x000a, 0x2919: 0x000a, 0x291a: 0x000a, 0x291b: 0x000a, 0x291c: 0x000a, 0x291d: 0x000a,
+ 0x291e: 0x000a, 0x291f: 0x000a, 0x2920: 0x000a, 0x2921: 0x000a, 0x2922: 0x000a, 0x2923: 0x000a,
+ 0x2924: 0x000a, 0x2925: 0x000a,
+ 0x293f: 0x000c,
+ // Block 0xa5, offset 0x2940
+ 0x2940: 0x000c, 0x2941: 0x000c,
+ 0x2973: 0x000c, 0x2974: 0x000c, 0x2975: 0x000c,
+ 0x2976: 0x000c, 0x2979: 0x000c, 0x297a: 0x000c,
+ // Block 0xa6, offset 0x2980
+ 0x2980: 0x000c, 0x2981: 0x000c, 0x2982: 0x000c,
+ 0x29a7: 0x000c, 0x29a8: 0x000c, 0x29a9: 0x000c,
+ 0x29aa: 0x000c, 0x29ab: 0x000c, 0x29ad: 0x000c, 0x29ae: 0x000c, 0x29af: 0x000c,
+ 0x29b0: 0x000c, 0x29b1: 0x000c, 0x29b2: 0x000c, 0x29b3: 0x000c, 0x29b4: 0x000c,
+ // Block 0xa7, offset 0x29c0
+ 0x29f3: 0x000c,
+ // Block 0xa8, offset 0x2a00
+ 0x2a00: 0x000c, 0x2a01: 0x000c,
+ 0x2a36: 0x000c, 0x2a37: 0x000c, 0x2a38: 0x000c, 0x2a39: 0x000c, 0x2a3a: 0x000c, 0x2a3b: 0x000c,
+ 0x2a3c: 0x000c, 0x2a3d: 0x000c, 0x2a3e: 0x000c,
+ // Block 0xa9, offset 0x2a40
+ 0x2a4a: 0x000c, 0x2a4b: 0x000c,
+ 0x2a4c: 0x000c,
+ // Block 0xaa, offset 0x2a80
+ 0x2aaf: 0x000c,
+ 0x2ab0: 0x000c, 0x2ab1: 0x000c, 0x2ab4: 0x000c,
+ 0x2ab6: 0x000c, 0x2ab7: 0x000c,
+ 0x2abe: 0x000c,
+ // Block 0xab, offset 0x2ac0
+ 0x2adf: 0x000c, 0x2ae3: 0x000c,
+ 0x2ae4: 0x000c, 0x2ae5: 0x000c, 0x2ae6: 0x000c, 0x2ae7: 0x000c, 0x2ae8: 0x000c, 0x2ae9: 0x000c,
+ 0x2aea: 0x000c,
+ // Block 0xac, offset 0x2b00
+ 0x2b00: 0x000c, 0x2b01: 0x000c,
+ 0x2b3c: 0x000c,
+ // Block 0xad, offset 0x2b40
+ 0x2b40: 0x000c,
+ 0x2b66: 0x000c, 0x2b67: 0x000c, 0x2b68: 0x000c, 0x2b69: 0x000c,
+ 0x2b6a: 0x000c, 0x2b6b: 0x000c, 0x2b6c: 0x000c,
+ 0x2b70: 0x000c, 0x2b71: 0x000c, 0x2b72: 0x000c, 0x2b73: 0x000c, 0x2b74: 0x000c,
+ // Block 0xae, offset 0x2b80
+ 0x2bb8: 0x000c, 0x2bb9: 0x000c, 0x2bba: 0x000c, 0x2bbb: 0x000c,
+ 0x2bbc: 0x000c, 0x2bbd: 0x000c, 0x2bbe: 0x000c, 0x2bbf: 0x000c,
+ // Block 0xaf, offset 0x2bc0
+ 0x2bc2: 0x000c, 0x2bc3: 0x000c, 0x2bc4: 0x000c,
+ 0x2bc6: 0x000c,
+ // Block 0xb0, offset 0x2c00
+ 0x2c33: 0x000c, 0x2c34: 0x000c, 0x2c35: 0x000c,
+ 0x2c36: 0x000c, 0x2c37: 0x000c, 0x2c38: 0x000c, 0x2c3a: 0x000c,
+ 0x2c3f: 0x000c,
+ // Block 0xb1, offset 0x2c40
+ 0x2c40: 0x000c, 0x2c42: 0x000c, 0x2c43: 0x000c,
+ // Block 0xb2, offset 0x2c80
+ 0x2cb2: 0x000c, 0x2cb3: 0x000c, 0x2cb4: 0x000c, 0x2cb5: 0x000c,
+ 0x2cbc: 0x000c, 0x2cbd: 0x000c, 0x2cbf: 0x000c,
+ // Block 0xb3, offset 0x2cc0
+ 0x2cc0: 0x000c,
+ 0x2cdc: 0x000c, 0x2cdd: 0x000c,
+ // Block 0xb4, offset 0x2d00
+ 0x2d33: 0x000c, 0x2d34: 0x000c, 0x2d35: 0x000c,
+ 0x2d36: 0x000c, 0x2d37: 0x000c, 0x2d38: 0x000c, 0x2d39: 0x000c, 0x2d3a: 0x000c,
+ 0x2d3d: 0x000c, 0x2d3f: 0x000c,
+ // Block 0xb5, offset 0x2d40
+ 0x2d40: 0x000c,
+ 0x2d60: 0x000a, 0x2d61: 0x000a, 0x2d62: 0x000a, 0x2d63: 0x000a,
+ 0x2d64: 0x000a, 0x2d65: 0x000a, 0x2d66: 0x000a, 0x2d67: 0x000a, 0x2d68: 0x000a, 0x2d69: 0x000a,
+ 0x2d6a: 0x000a, 0x2d6b: 0x000a, 0x2d6c: 0x000a,
+ // Block 0xb6, offset 0x2d80
+ 0x2dab: 0x000c, 0x2dad: 0x000c,
+ 0x2db0: 0x000c, 0x2db1: 0x000c, 0x2db2: 0x000c, 0x2db3: 0x000c, 0x2db4: 0x000c, 0x2db5: 0x000c,
+ 0x2db7: 0x000c,
+ // Block 0xb7, offset 0x2dc0
+ 0x2ddd: 0x000c,
+ 0x2dde: 0x000c, 0x2ddf: 0x000c, 0x2de2: 0x000c, 0x2de3: 0x000c,
+ 0x2de4: 0x000c, 0x2de5: 0x000c, 0x2de7: 0x000c, 0x2de8: 0x000c, 0x2de9: 0x000c,
+ 0x2dea: 0x000c, 0x2deb: 0x000c,
+ // Block 0xb8, offset 0x2e00
+ 0x2e30: 0x000c, 0x2e31: 0x000c, 0x2e32: 0x000c, 0x2e33: 0x000c, 0x2e34: 0x000c, 0x2e35: 0x000c,
+ 0x2e36: 0x000c, 0x2e38: 0x000c, 0x2e39: 0x000c, 0x2e3a: 0x000c, 0x2e3b: 0x000c,
+ 0x2e3c: 0x000c, 0x2e3d: 0x000c,
+ // Block 0xb9, offset 0x2e40
+ 0x2e52: 0x000c, 0x2e53: 0x000c, 0x2e54: 0x000c, 0x2e55: 0x000c, 0x2e56: 0x000c, 0x2e57: 0x000c,
+ 0x2e58: 0x000c, 0x2e59: 0x000c, 0x2e5a: 0x000c, 0x2e5b: 0x000c, 0x2e5c: 0x000c, 0x2e5d: 0x000c,
+ 0x2e5e: 0x000c, 0x2e5f: 0x000c, 0x2e60: 0x000c, 0x2e61: 0x000c, 0x2e62: 0x000c, 0x2e63: 0x000c,
+ 0x2e64: 0x000c, 0x2e65: 0x000c, 0x2e66: 0x000c, 0x2e67: 0x000c,
+ 0x2e6a: 0x000c, 0x2e6b: 0x000c, 0x2e6c: 0x000c, 0x2e6d: 0x000c, 0x2e6e: 0x000c, 0x2e6f: 0x000c,
+ 0x2e70: 0x000c, 0x2e72: 0x000c, 0x2e73: 0x000c, 0x2e75: 0x000c,
+ 0x2e76: 0x000c,
+ // Block 0xba, offset 0x2e80
+ 0x2eb0: 0x000c, 0x2eb1: 0x000c, 0x2eb2: 0x000c, 0x2eb3: 0x000c, 0x2eb4: 0x000c,
+ // Block 0xbb, offset 0x2ec0
+ 0x2ef0: 0x000c, 0x2ef1: 0x000c, 0x2ef2: 0x000c, 0x2ef3: 0x000c, 0x2ef4: 0x000c, 0x2ef5: 0x000c,
+ 0x2ef6: 0x000c,
+ // Block 0xbc, offset 0x2f00
+ 0x2f0f: 0x000c, 0x2f10: 0x000c, 0x2f11: 0x000c,
+ 0x2f12: 0x000c,
+ // Block 0xbd, offset 0x2f40
+ 0x2f5d: 0x000c,
+ 0x2f5e: 0x000c, 0x2f60: 0x000b, 0x2f61: 0x000b, 0x2f62: 0x000b, 0x2f63: 0x000b,
+ // Block 0xbe, offset 0x2f80
+ 0x2fa7: 0x000c, 0x2fa8: 0x000c, 0x2fa9: 0x000c,
+ 0x2fb3: 0x000b, 0x2fb4: 0x000b, 0x2fb5: 0x000b,
+ 0x2fb6: 0x000b, 0x2fb7: 0x000b, 0x2fb8: 0x000b, 0x2fb9: 0x000b, 0x2fba: 0x000b, 0x2fbb: 0x000c,
+ 0x2fbc: 0x000c, 0x2fbd: 0x000c, 0x2fbe: 0x000c, 0x2fbf: 0x000c,
+ // Block 0xbf, offset 0x2fc0
+ 0x2fc0: 0x000c, 0x2fc1: 0x000c, 0x2fc2: 0x000c, 0x2fc5: 0x000c,
+ 0x2fc6: 0x000c, 0x2fc7: 0x000c, 0x2fc8: 0x000c, 0x2fc9: 0x000c, 0x2fca: 0x000c, 0x2fcb: 0x000c,
+ 0x2fea: 0x000c, 0x2feb: 0x000c, 0x2fec: 0x000c, 0x2fed: 0x000c,
+ // Block 0xc0, offset 0x3000
+ 0x3000: 0x000a, 0x3001: 0x000a, 0x3002: 0x000c, 0x3003: 0x000c, 0x3004: 0x000c, 0x3005: 0x000a,
+ // Block 0xc1, offset 0x3040
+ 0x3040: 0x000a, 0x3041: 0x000a, 0x3042: 0x000a, 0x3043: 0x000a, 0x3044: 0x000a, 0x3045: 0x000a,
+ 0x3046: 0x000a, 0x3047: 0x000a, 0x3048: 0x000a, 0x3049: 0x000a, 0x304a: 0x000a, 0x304b: 0x000a,
+ 0x304c: 0x000a, 0x304d: 0x000a, 0x304e: 0x000a, 0x304f: 0x000a, 0x3050: 0x000a, 0x3051: 0x000a,
+ 0x3052: 0x000a, 0x3053: 0x000a, 0x3054: 0x000a, 0x3055: 0x000a, 0x3056: 0x000a,
+ // Block 0xc2, offset 0x3080
+ 0x309b: 0x000a,
+ // Block 0xc3, offset 0x30c0
+ 0x30d5: 0x000a,
+ // Block 0xc4, offset 0x3100
+ 0x310f: 0x000a,
+ // Block 0xc5, offset 0x3140
+ 0x3149: 0x000a,
+ // Block 0xc6, offset 0x3180
+ 0x3183: 0x000a,
+ 0x318e: 0x0002, 0x318f: 0x0002, 0x3190: 0x0002, 0x3191: 0x0002,
+ 0x3192: 0x0002, 0x3193: 0x0002, 0x3194: 0x0002, 0x3195: 0x0002, 0x3196: 0x0002, 0x3197: 0x0002,
+ 0x3198: 0x0002, 0x3199: 0x0002, 0x319a: 0x0002, 0x319b: 0x0002, 0x319c: 0x0002, 0x319d: 0x0002,
+ 0x319e: 0x0002, 0x319f: 0x0002, 0x31a0: 0x0002, 0x31a1: 0x0002, 0x31a2: 0x0002, 0x31a3: 0x0002,
+ 0x31a4: 0x0002, 0x31a5: 0x0002, 0x31a6: 0x0002, 0x31a7: 0x0002, 0x31a8: 0x0002, 0x31a9: 0x0002,
+ 0x31aa: 0x0002, 0x31ab: 0x0002, 0x31ac: 0x0002, 0x31ad: 0x0002, 0x31ae: 0x0002, 0x31af: 0x0002,
+ 0x31b0: 0x0002, 0x31b1: 0x0002, 0x31b2: 0x0002, 0x31b3: 0x0002, 0x31b4: 0x0002, 0x31b5: 0x0002,
+ 0x31b6: 0x0002, 0x31b7: 0x0002, 0x31b8: 0x0002, 0x31b9: 0x0002, 0x31ba: 0x0002, 0x31bb: 0x0002,
+ 0x31bc: 0x0002, 0x31bd: 0x0002, 0x31be: 0x0002, 0x31bf: 0x0002,
+ // Block 0xc7, offset 0x31c0
+ 0x31c0: 0x000c, 0x31c1: 0x000c, 0x31c2: 0x000c, 0x31c3: 0x000c, 0x31c4: 0x000c, 0x31c5: 0x000c,
+ 0x31c6: 0x000c, 0x31c7: 0x000c, 0x31c8: 0x000c, 0x31c9: 0x000c, 0x31ca: 0x000c, 0x31cb: 0x000c,
+ 0x31cc: 0x000c, 0x31cd: 0x000c, 0x31ce: 0x000c, 0x31cf: 0x000c, 0x31d0: 0x000c, 0x31d1: 0x000c,
+ 0x31d2: 0x000c, 0x31d3: 0x000c, 0x31d4: 0x000c, 0x31d5: 0x000c, 0x31d6: 0x000c, 0x31d7: 0x000c,
+ 0x31d8: 0x000c, 0x31d9: 0x000c, 0x31da: 0x000c, 0x31db: 0x000c, 0x31dc: 0x000c, 0x31dd: 0x000c,
+ 0x31de: 0x000c, 0x31df: 0x000c, 0x31e0: 0x000c, 0x31e1: 0x000c, 0x31e2: 0x000c, 0x31e3: 0x000c,
+ 0x31e4: 0x000c, 0x31e5: 0x000c, 0x31e6: 0x000c, 0x31e7: 0x000c, 0x31e8: 0x000c, 0x31e9: 0x000c,
+ 0x31ea: 0x000c, 0x31eb: 0x000c, 0x31ec: 0x000c, 0x31ed: 0x000c, 0x31ee: 0x000c, 0x31ef: 0x000c,
+ 0x31f0: 0x000c, 0x31f1: 0x000c, 0x31f2: 0x000c, 0x31f3: 0x000c, 0x31f4: 0x000c, 0x31f5: 0x000c,
+ 0x31f6: 0x000c, 0x31fb: 0x000c,
+ 0x31fc: 0x000c, 0x31fd: 0x000c, 0x31fe: 0x000c, 0x31ff: 0x000c,
+ // Block 0xc8, offset 0x3200
+ 0x3200: 0x000c, 0x3201: 0x000c, 0x3202: 0x000c, 0x3203: 0x000c, 0x3204: 0x000c, 0x3205: 0x000c,
+ 0x3206: 0x000c, 0x3207: 0x000c, 0x3208: 0x000c, 0x3209: 0x000c, 0x320a: 0x000c, 0x320b: 0x000c,
+ 0x320c: 0x000c, 0x320d: 0x000c, 0x320e: 0x000c, 0x320f: 0x000c, 0x3210: 0x000c, 0x3211: 0x000c,
+ 0x3212: 0x000c, 0x3213: 0x000c, 0x3214: 0x000c, 0x3215: 0x000c, 0x3216: 0x000c, 0x3217: 0x000c,
+ 0x3218: 0x000c, 0x3219: 0x000c, 0x321a: 0x000c, 0x321b: 0x000c, 0x321c: 0x000c, 0x321d: 0x000c,
+ 0x321e: 0x000c, 0x321f: 0x000c, 0x3220: 0x000c, 0x3221: 0x000c, 0x3222: 0x000c, 0x3223: 0x000c,
+ 0x3224: 0x000c, 0x3225: 0x000c, 0x3226: 0x000c, 0x3227: 0x000c, 0x3228: 0x000c, 0x3229: 0x000c,
+ 0x322a: 0x000c, 0x322b: 0x000c, 0x322c: 0x000c,
+ 0x3235: 0x000c,
+ // Block 0xc9, offset 0x3240
+ 0x3244: 0x000c,
+ 0x325b: 0x000c, 0x325c: 0x000c, 0x325d: 0x000c,
+ 0x325e: 0x000c, 0x325f: 0x000c, 0x3261: 0x000c, 0x3262: 0x000c, 0x3263: 0x000c,
+ 0x3264: 0x000c, 0x3265: 0x000c, 0x3266: 0x000c, 0x3267: 0x000c, 0x3268: 0x000c, 0x3269: 0x000c,
+ 0x326a: 0x000c, 0x326b: 0x000c, 0x326c: 0x000c, 0x326d: 0x000c, 0x326e: 0x000c, 0x326f: 0x000c,
+ // Block 0xca, offset 0x3280
+ 0x3280: 0x000c, 0x3281: 0x000c, 0x3282: 0x000c, 0x3283: 0x000c, 0x3284: 0x000c, 0x3285: 0x000c,
+ 0x3286: 0x000c, 0x3288: 0x000c, 0x3289: 0x000c, 0x328a: 0x000c, 0x328b: 0x000c,
+ 0x328c: 0x000c, 0x328d: 0x000c, 0x328e: 0x000c, 0x328f: 0x000c, 0x3290: 0x000c, 0x3291: 0x000c,
+ 0x3292: 0x000c, 0x3293: 0x000c, 0x3294: 0x000c, 0x3295: 0x000c, 0x3296: 0x000c, 0x3297: 0x000c,
+ 0x3298: 0x000c, 0x329b: 0x000c, 0x329c: 0x000c, 0x329d: 0x000c,
+ 0x329e: 0x000c, 0x329f: 0x000c, 0x32a0: 0x000c, 0x32a1: 0x000c, 0x32a3: 0x000c,
+ 0x32a4: 0x000c, 0x32a6: 0x000c, 0x32a7: 0x000c, 0x32a8: 0x000c, 0x32a9: 0x000c,
+ 0x32aa: 0x000c,
+ // Block 0xcb, offset 0x32c0
+ 0x32c0: 0x0001, 0x32c1: 0x0001, 0x32c2: 0x0001, 0x32c3: 0x0001, 0x32c4: 0x0001, 0x32c5: 0x0001,
+ 0x32c6: 0x0001, 0x32c7: 0x0001, 0x32c8: 0x0001, 0x32c9: 0x0001, 0x32ca: 0x0001, 0x32cb: 0x0001,
+ 0x32cc: 0x0001, 0x32cd: 0x0001, 0x32ce: 0x0001, 0x32cf: 0x0001, 0x32d0: 0x000c, 0x32d1: 0x000c,
+ 0x32d2: 0x000c, 0x32d3: 0x000c, 0x32d4: 0x000c, 0x32d5: 0x000c, 0x32d6: 0x000c, 0x32d7: 0x0001,
+ 0x32d8: 0x0001, 0x32d9: 0x0001, 0x32da: 0x0001, 0x32db: 0x0001, 0x32dc: 0x0001, 0x32dd: 0x0001,
+ 0x32de: 0x0001, 0x32df: 0x0001, 0x32e0: 0x0001, 0x32e1: 0x0001, 0x32e2: 0x0001, 0x32e3: 0x0001,
+ 0x32e4: 0x0001, 0x32e5: 0x0001, 0x32e6: 0x0001, 0x32e7: 0x0001, 0x32e8: 0x0001, 0x32e9: 0x0001,
+ 0x32ea: 0x0001, 0x32eb: 0x0001, 0x32ec: 0x0001, 0x32ed: 0x0001, 0x32ee: 0x0001, 0x32ef: 0x0001,
+ 0x32f0: 0x0001, 0x32f1: 0x0001, 0x32f2: 0x0001, 0x32f3: 0x0001, 0x32f4: 0x0001, 0x32f5: 0x0001,
+ 0x32f6: 0x0001, 0x32f7: 0x0001, 0x32f8: 0x0001, 0x32f9: 0x0001, 0x32fa: 0x0001, 0x32fb: 0x0001,
+ 0x32fc: 0x0001, 0x32fd: 0x0001, 0x32fe: 0x0001, 0x32ff: 0x0001,
+ // Block 0xcc, offset 0x3300
+ 0x3300: 0x0001, 0x3301: 0x0001, 0x3302: 0x0001, 0x3303: 0x0001, 0x3304: 0x000c, 0x3305: 0x000c,
+ 0x3306: 0x000c, 0x3307: 0x000c, 0x3308: 0x000c, 0x3309: 0x000c, 0x330a: 0x000c, 0x330b: 0x0001,
+ 0x330c: 0x0001, 0x330d: 0x0001, 0x330e: 0x0001, 0x330f: 0x0001, 0x3310: 0x0001, 0x3311: 0x0001,
+ 0x3312: 0x0001, 0x3313: 0x0001, 0x3314: 0x0001, 0x3315: 0x0001, 0x3316: 0x0001, 0x3317: 0x0001,
+ 0x3318: 0x0001, 0x3319: 0x0001, 0x331a: 0x0001, 0x331b: 0x0001, 0x331c: 0x0001, 0x331d: 0x0001,
+ 0x331e: 0x0001, 0x331f: 0x0001, 0x3320: 0x0001, 0x3321: 0x0001, 0x3322: 0x0001, 0x3323: 0x0001,
+ 0x3324: 0x0001, 0x3325: 0x0001, 0x3326: 0x0001, 0x3327: 0x0001, 0x3328: 0x0001, 0x3329: 0x0001,
+ 0x332a: 0x0001, 0x332b: 0x0001, 0x332c: 0x0001, 0x332d: 0x0001, 0x332e: 0x0001, 0x332f: 0x0001,
+ 0x3330: 0x0001, 0x3331: 0x0001, 0x3332: 0x0001, 0x3333: 0x0001, 0x3334: 0x0001, 0x3335: 0x0001,
+ 0x3336: 0x0001, 0x3337: 0x0001, 0x3338: 0x0001, 0x3339: 0x0001, 0x333a: 0x0001, 0x333b: 0x0001,
+ 0x333c: 0x0001, 0x333d: 0x0001, 0x333e: 0x0001, 0x333f: 0x0001,
+ // Block 0xcd, offset 0x3340
+ 0x3340: 0x000d, 0x3341: 0x000d, 0x3342: 0x000d, 0x3343: 0x000d, 0x3344: 0x000d, 0x3345: 0x000d,
+ 0x3346: 0x000d, 0x3347: 0x000d, 0x3348: 0x000d, 0x3349: 0x000d, 0x334a: 0x000d, 0x334b: 0x000d,
+ 0x334c: 0x000d, 0x334d: 0x000d, 0x334e: 0x000d, 0x334f: 0x000d, 0x3350: 0x000d, 0x3351: 0x000d,
+ 0x3352: 0x000d, 0x3353: 0x000d, 0x3354: 0x000d, 0x3355: 0x000d, 0x3356: 0x000d, 0x3357: 0x000d,
+ 0x3358: 0x000d, 0x3359: 0x000d, 0x335a: 0x000d, 0x335b: 0x000d, 0x335c: 0x000d, 0x335d: 0x000d,
+ 0x335e: 0x000d, 0x335f: 0x000d, 0x3360: 0x000d, 0x3361: 0x000d, 0x3362: 0x000d, 0x3363: 0x000d,
+ 0x3364: 0x000d, 0x3365: 0x000d, 0x3366: 0x000d, 0x3367: 0x000d, 0x3368: 0x000d, 0x3369: 0x000d,
+ 0x336a: 0x000d, 0x336b: 0x000d, 0x336c: 0x000d, 0x336d: 0x000d, 0x336e: 0x000d, 0x336f: 0x000d,
+ 0x3370: 0x000a, 0x3371: 0x000a, 0x3372: 0x000d, 0x3373: 0x000d, 0x3374: 0x000d, 0x3375: 0x000d,
+ 0x3376: 0x000d, 0x3377: 0x000d, 0x3378: 0x000d, 0x3379: 0x000d, 0x337a: 0x000d, 0x337b: 0x000d,
+ 0x337c: 0x000d, 0x337d: 0x000d, 0x337e: 0x000d, 0x337f: 0x000d,
+ // Block 0xce, offset 0x3380
+ 0x3380: 0x000a, 0x3381: 0x000a, 0x3382: 0x000a, 0x3383: 0x000a, 0x3384: 0x000a, 0x3385: 0x000a,
+ 0x3386: 0x000a, 0x3387: 0x000a, 0x3388: 0x000a, 0x3389: 0x000a, 0x338a: 0x000a, 0x338b: 0x000a,
+ 0x338c: 0x000a, 0x338d: 0x000a, 0x338e: 0x000a, 0x338f: 0x000a, 0x3390: 0x000a, 0x3391: 0x000a,
+ 0x3392: 0x000a, 0x3393: 0x000a, 0x3394: 0x000a, 0x3395: 0x000a, 0x3396: 0x000a, 0x3397: 0x000a,
+ 0x3398: 0x000a, 0x3399: 0x000a, 0x339a: 0x000a, 0x339b: 0x000a, 0x339c: 0x000a, 0x339d: 0x000a,
+ 0x339e: 0x000a, 0x339f: 0x000a, 0x33a0: 0x000a, 0x33a1: 0x000a, 0x33a2: 0x000a, 0x33a3: 0x000a,
+ 0x33a4: 0x000a, 0x33a5: 0x000a, 0x33a6: 0x000a, 0x33a7: 0x000a, 0x33a8: 0x000a, 0x33a9: 0x000a,
+ 0x33aa: 0x000a, 0x33ab: 0x000a,
+ 0x33b0: 0x000a, 0x33b1: 0x000a, 0x33b2: 0x000a, 0x33b3: 0x000a, 0x33b4: 0x000a, 0x33b5: 0x000a,
+ 0x33b6: 0x000a, 0x33b7: 0x000a, 0x33b8: 0x000a, 0x33b9: 0x000a, 0x33ba: 0x000a, 0x33bb: 0x000a,
+ 0x33bc: 0x000a, 0x33bd: 0x000a, 0x33be: 0x000a, 0x33bf: 0x000a,
+ // Block 0xcf, offset 0x33c0
+ 0x33c0: 0x000a, 0x33c1: 0x000a, 0x33c2: 0x000a, 0x33c3: 0x000a, 0x33c4: 0x000a, 0x33c5: 0x000a,
+ 0x33c6: 0x000a, 0x33c7: 0x000a, 0x33c8: 0x000a, 0x33c9: 0x000a, 0x33ca: 0x000a, 0x33cb: 0x000a,
+ 0x33cc: 0x000a, 0x33cd: 0x000a, 0x33ce: 0x000a, 0x33cf: 0x000a, 0x33d0: 0x000a, 0x33d1: 0x000a,
+ 0x33d2: 0x000a, 0x33d3: 0x000a,
+ 0x33e0: 0x000a, 0x33e1: 0x000a, 0x33e2: 0x000a, 0x33e3: 0x000a,
+ 0x33e4: 0x000a, 0x33e5: 0x000a, 0x33e6: 0x000a, 0x33e7: 0x000a, 0x33e8: 0x000a, 0x33e9: 0x000a,
+ 0x33ea: 0x000a, 0x33eb: 0x000a, 0x33ec: 0x000a, 0x33ed: 0x000a, 0x33ee: 0x000a,
+ 0x33f1: 0x000a, 0x33f2: 0x000a, 0x33f3: 0x000a, 0x33f4: 0x000a, 0x33f5: 0x000a,
+ 0x33f6: 0x000a, 0x33f7: 0x000a, 0x33f8: 0x000a, 0x33f9: 0x000a, 0x33fa: 0x000a, 0x33fb: 0x000a,
+ 0x33fc: 0x000a, 0x33fd: 0x000a, 0x33fe: 0x000a, 0x33ff: 0x000a,
+ // Block 0xd0, offset 0x3400
+ 0x3401: 0x000a, 0x3402: 0x000a, 0x3403: 0x000a, 0x3404: 0x000a, 0x3405: 0x000a,
+ 0x3406: 0x000a, 0x3407: 0x000a, 0x3408: 0x000a, 0x3409: 0x000a, 0x340a: 0x000a, 0x340b: 0x000a,
+ 0x340c: 0x000a, 0x340d: 0x000a, 0x340e: 0x000a, 0x340f: 0x000a, 0x3411: 0x000a,
+ 0x3412: 0x000a, 0x3413: 0x000a, 0x3414: 0x000a, 0x3415: 0x000a, 0x3416: 0x000a, 0x3417: 0x000a,
+ 0x3418: 0x000a, 0x3419: 0x000a, 0x341a: 0x000a, 0x341b: 0x000a, 0x341c: 0x000a, 0x341d: 0x000a,
+ 0x341e: 0x000a, 0x341f: 0x000a, 0x3420: 0x000a, 0x3421: 0x000a, 0x3422: 0x000a, 0x3423: 0x000a,
+ 0x3424: 0x000a, 0x3425: 0x000a, 0x3426: 0x000a, 0x3427: 0x000a, 0x3428: 0x000a, 0x3429: 0x000a,
+ 0x342a: 0x000a, 0x342b: 0x000a, 0x342c: 0x000a, 0x342d: 0x000a, 0x342e: 0x000a, 0x342f: 0x000a,
+ 0x3430: 0x000a, 0x3431: 0x000a, 0x3432: 0x000a, 0x3433: 0x000a, 0x3434: 0x000a, 0x3435: 0x000a,
+ // Block 0xd1, offset 0x3440
+ 0x3440: 0x0002, 0x3441: 0x0002, 0x3442: 0x0002, 0x3443: 0x0002, 0x3444: 0x0002, 0x3445: 0x0002,
+ 0x3446: 0x0002, 0x3447: 0x0002, 0x3448: 0x0002, 0x3449: 0x0002, 0x344a: 0x0002, 0x344b: 0x000a,
+ 0x344c: 0x000a,
+ // Block 0xd2, offset 0x3480
+ 0x34aa: 0x000a, 0x34ab: 0x000a,
+ // Block 0xd3, offset 0x34c0
+ 0x34c0: 0x000a, 0x34c1: 0x000a, 0x34c2: 0x000a, 0x34c3: 0x000a, 0x34c4: 0x000a, 0x34c5: 0x000a,
+ 0x34c6: 0x000a, 0x34c7: 0x000a, 0x34c8: 0x000a, 0x34c9: 0x000a, 0x34ca: 0x000a, 0x34cb: 0x000a,
+ 0x34cc: 0x000a, 0x34cd: 0x000a, 0x34ce: 0x000a, 0x34cf: 0x000a, 0x34d0: 0x000a, 0x34d1: 0x000a,
+ 0x34d2: 0x000a,
+ 0x34e0: 0x000a, 0x34e1: 0x000a, 0x34e2: 0x000a, 0x34e3: 0x000a,
+ 0x34e4: 0x000a, 0x34e5: 0x000a, 0x34e6: 0x000a, 0x34e7: 0x000a, 0x34e8: 0x000a, 0x34e9: 0x000a,
+ 0x34ea: 0x000a, 0x34eb: 0x000a, 0x34ec: 0x000a,
+ 0x34f0: 0x000a, 0x34f1: 0x000a, 0x34f2: 0x000a, 0x34f3: 0x000a, 0x34f4: 0x000a, 0x34f5: 0x000a,
+ 0x34f6: 0x000a,
+ // Block 0xd4, offset 0x3500
+ 0x3500: 0x000a, 0x3501: 0x000a, 0x3502: 0x000a, 0x3503: 0x000a, 0x3504: 0x000a, 0x3505: 0x000a,
+ 0x3506: 0x000a, 0x3507: 0x000a, 0x3508: 0x000a, 0x3509: 0x000a, 0x350a: 0x000a, 0x350b: 0x000a,
+ 0x350c: 0x000a, 0x350d: 0x000a, 0x350e: 0x000a, 0x350f: 0x000a, 0x3510: 0x000a, 0x3511: 0x000a,
+ 0x3512: 0x000a, 0x3513: 0x000a, 0x3514: 0x000a,
+ // Block 0xd5, offset 0x3540
+ 0x3540: 0x000a, 0x3541: 0x000a, 0x3542: 0x000a, 0x3543: 0x000a, 0x3544: 0x000a, 0x3545: 0x000a,
+ 0x3546: 0x000a, 0x3547: 0x000a, 0x3548: 0x000a, 0x3549: 0x000a, 0x354a: 0x000a, 0x354b: 0x000a,
+ 0x3550: 0x000a, 0x3551: 0x000a,
+ 0x3552: 0x000a, 0x3553: 0x000a, 0x3554: 0x000a, 0x3555: 0x000a, 0x3556: 0x000a, 0x3557: 0x000a,
+ 0x3558: 0x000a, 0x3559: 0x000a, 0x355a: 0x000a, 0x355b: 0x000a, 0x355c: 0x000a, 0x355d: 0x000a,
+ 0x355e: 0x000a, 0x355f: 0x000a, 0x3560: 0x000a, 0x3561: 0x000a, 0x3562: 0x000a, 0x3563: 0x000a,
+ 0x3564: 0x000a, 0x3565: 0x000a, 0x3566: 0x000a, 0x3567: 0x000a, 0x3568: 0x000a, 0x3569: 0x000a,
+ 0x356a: 0x000a, 0x356b: 0x000a, 0x356c: 0x000a, 0x356d: 0x000a, 0x356e: 0x000a, 0x356f: 0x000a,
+ 0x3570: 0x000a, 0x3571: 0x000a, 0x3572: 0x000a, 0x3573: 0x000a, 0x3574: 0x000a, 0x3575: 0x000a,
+ 0x3576: 0x000a, 0x3577: 0x000a, 0x3578: 0x000a, 0x3579: 0x000a, 0x357a: 0x000a, 0x357b: 0x000a,
+ 0x357c: 0x000a, 0x357d: 0x000a, 0x357e: 0x000a, 0x357f: 0x000a,
+ // Block 0xd6, offset 0x3580
+ 0x3580: 0x000a, 0x3581: 0x000a, 0x3582: 0x000a, 0x3583: 0x000a, 0x3584: 0x000a, 0x3585: 0x000a,
+ 0x3586: 0x000a, 0x3587: 0x000a,
+ 0x3590: 0x000a, 0x3591: 0x000a,
+ 0x3592: 0x000a, 0x3593: 0x000a, 0x3594: 0x000a, 0x3595: 0x000a, 0x3596: 0x000a, 0x3597: 0x000a,
+ 0x3598: 0x000a, 0x3599: 0x000a,
+ 0x35a0: 0x000a, 0x35a1: 0x000a, 0x35a2: 0x000a, 0x35a3: 0x000a,
+ 0x35a4: 0x000a, 0x35a5: 0x000a, 0x35a6: 0x000a, 0x35a7: 0x000a, 0x35a8: 0x000a, 0x35a9: 0x000a,
+ 0x35aa: 0x000a, 0x35ab: 0x000a, 0x35ac: 0x000a, 0x35ad: 0x000a, 0x35ae: 0x000a, 0x35af: 0x000a,
+ 0x35b0: 0x000a, 0x35b1: 0x000a, 0x35b2: 0x000a, 0x35b3: 0x000a, 0x35b4: 0x000a, 0x35b5: 0x000a,
+ 0x35b6: 0x000a, 0x35b7: 0x000a, 0x35b8: 0x000a, 0x35b9: 0x000a, 0x35ba: 0x000a, 0x35bb: 0x000a,
+ 0x35bc: 0x000a, 0x35bd: 0x000a, 0x35be: 0x000a, 0x35bf: 0x000a,
+ // Block 0xd7, offset 0x35c0
+ 0x35c0: 0x000a, 0x35c1: 0x000a, 0x35c2: 0x000a, 0x35c3: 0x000a, 0x35c4: 0x000a, 0x35c5: 0x000a,
+ 0x35c6: 0x000a, 0x35c7: 0x000a,
+ 0x35d0: 0x000a, 0x35d1: 0x000a,
+ 0x35d2: 0x000a, 0x35d3: 0x000a, 0x35d4: 0x000a, 0x35d5: 0x000a, 0x35d6: 0x000a, 0x35d7: 0x000a,
+ 0x35d8: 0x000a, 0x35d9: 0x000a, 0x35da: 0x000a, 0x35db: 0x000a, 0x35dc: 0x000a, 0x35dd: 0x000a,
+ 0x35de: 0x000a, 0x35df: 0x000a, 0x35e0: 0x000a, 0x35e1: 0x000a, 0x35e2: 0x000a, 0x35e3: 0x000a,
+ 0x35e4: 0x000a, 0x35e5: 0x000a, 0x35e6: 0x000a, 0x35e7: 0x000a, 0x35e8: 0x000a, 0x35e9: 0x000a,
+ 0x35ea: 0x000a, 0x35eb: 0x000a, 0x35ec: 0x000a, 0x35ed: 0x000a,
+ // Block 0xd8, offset 0x3600
+ 0x3610: 0x000a, 0x3611: 0x000a,
+ 0x3612: 0x000a, 0x3613: 0x000a, 0x3614: 0x000a, 0x3615: 0x000a, 0x3616: 0x000a, 0x3617: 0x000a,
+ 0x3618: 0x000a, 0x3619: 0x000a, 0x361a: 0x000a, 0x361b: 0x000a, 0x361c: 0x000a, 0x361d: 0x000a,
+ 0x361e: 0x000a, 0x3620: 0x000a, 0x3621: 0x000a, 0x3622: 0x000a, 0x3623: 0x000a,
+ 0x3624: 0x000a, 0x3625: 0x000a, 0x3626: 0x000a, 0x3627: 0x000a,
+ 0x3630: 0x000a, 0x3633: 0x000a, 0x3634: 0x000a, 0x3635: 0x000a,
+ 0x3636: 0x000a, 0x3637: 0x000a, 0x3638: 0x000a, 0x3639: 0x000a, 0x363a: 0x000a, 0x363b: 0x000a,
+ 0x363c: 0x000a, 0x363d: 0x000a, 0x363e: 0x000a,
+ // Block 0xd9, offset 0x3640
+ 0x3640: 0x000a, 0x3641: 0x000a, 0x3642: 0x000a, 0x3643: 0x000a, 0x3644: 0x000a, 0x3645: 0x000a,
+ 0x3646: 0x000a, 0x3647: 0x000a, 0x3648: 0x000a, 0x3649: 0x000a, 0x364a: 0x000a, 0x364b: 0x000a,
+ 0x3650: 0x000a, 0x3651: 0x000a,
+ 0x3652: 0x000a, 0x3653: 0x000a, 0x3654: 0x000a, 0x3655: 0x000a, 0x3656: 0x000a, 0x3657: 0x000a,
+ 0x3658: 0x000a, 0x3659: 0x000a, 0x365a: 0x000a, 0x365b: 0x000a, 0x365c: 0x000a, 0x365d: 0x000a,
+ 0x365e: 0x000a,
+ // Block 0xda, offset 0x3680
+ 0x3680: 0x000a, 0x3681: 0x000a, 0x3682: 0x000a, 0x3683: 0x000a, 0x3684: 0x000a, 0x3685: 0x000a,
+ 0x3686: 0x000a, 0x3687: 0x000a, 0x3688: 0x000a, 0x3689: 0x000a, 0x368a: 0x000a, 0x368b: 0x000a,
+ 0x368c: 0x000a, 0x368d: 0x000a, 0x368e: 0x000a, 0x368f: 0x000a, 0x3690: 0x000a, 0x3691: 0x000a,
+ // Block 0xdb, offset 0x36c0
+ 0x36fe: 0x000b, 0x36ff: 0x000b,
+ // Block 0xdc, offset 0x3700
+ 0x3700: 0x000b, 0x3701: 0x000b, 0x3702: 0x000b, 0x3703: 0x000b, 0x3704: 0x000b, 0x3705: 0x000b,
+ 0x3706: 0x000b, 0x3707: 0x000b, 0x3708: 0x000b, 0x3709: 0x000b, 0x370a: 0x000b, 0x370b: 0x000b,
+ 0x370c: 0x000b, 0x370d: 0x000b, 0x370e: 0x000b, 0x370f: 0x000b, 0x3710: 0x000b, 0x3711: 0x000b,
+ 0x3712: 0x000b, 0x3713: 0x000b, 0x3714: 0x000b, 0x3715: 0x000b, 0x3716: 0x000b, 0x3717: 0x000b,
+ 0x3718: 0x000b, 0x3719: 0x000b, 0x371a: 0x000b, 0x371b: 0x000b, 0x371c: 0x000b, 0x371d: 0x000b,
+ 0x371e: 0x000b, 0x371f: 0x000b, 0x3720: 0x000b, 0x3721: 0x000b, 0x3722: 0x000b, 0x3723: 0x000b,
+ 0x3724: 0x000b, 0x3725: 0x000b, 0x3726: 0x000b, 0x3727: 0x000b, 0x3728: 0x000b, 0x3729: 0x000b,
+ 0x372a: 0x000b, 0x372b: 0x000b, 0x372c: 0x000b, 0x372d: 0x000b, 0x372e: 0x000b, 0x372f: 0x000b,
+ 0x3730: 0x000b, 0x3731: 0x000b, 0x3732: 0x000b, 0x3733: 0x000b, 0x3734: 0x000b, 0x3735: 0x000b,
+ 0x3736: 0x000b, 0x3737: 0x000b, 0x3738: 0x000b, 0x3739: 0x000b, 0x373a: 0x000b, 0x373b: 0x000b,
+ 0x373c: 0x000b, 0x373d: 0x000b, 0x373e: 0x000b, 0x373f: 0x000b,
+ // Block 0xdd, offset 0x3740
+ 0x3740: 0x000c, 0x3741: 0x000c, 0x3742: 0x000c, 0x3743: 0x000c, 0x3744: 0x000c, 0x3745: 0x000c,
+ 0x3746: 0x000c, 0x3747: 0x000c, 0x3748: 0x000c, 0x3749: 0x000c, 0x374a: 0x000c, 0x374b: 0x000c,
+ 0x374c: 0x000c, 0x374d: 0x000c, 0x374e: 0x000c, 0x374f: 0x000c, 0x3750: 0x000c, 0x3751: 0x000c,
+ 0x3752: 0x000c, 0x3753: 0x000c, 0x3754: 0x000c, 0x3755: 0x000c, 0x3756: 0x000c, 0x3757: 0x000c,
+ 0x3758: 0x000c, 0x3759: 0x000c, 0x375a: 0x000c, 0x375b: 0x000c, 0x375c: 0x000c, 0x375d: 0x000c,
+ 0x375e: 0x000c, 0x375f: 0x000c, 0x3760: 0x000c, 0x3761: 0x000c, 0x3762: 0x000c, 0x3763: 0x000c,
+ 0x3764: 0x000c, 0x3765: 0x000c, 0x3766: 0x000c, 0x3767: 0x000c, 0x3768: 0x000c, 0x3769: 0x000c,
+ 0x376a: 0x000c, 0x376b: 0x000c, 0x376c: 0x000c, 0x376d: 0x000c, 0x376e: 0x000c, 0x376f: 0x000c,
+ 0x3770: 0x000b, 0x3771: 0x000b, 0x3772: 0x000b, 0x3773: 0x000b, 0x3774: 0x000b, 0x3775: 0x000b,
+ 0x3776: 0x000b, 0x3777: 0x000b, 0x3778: 0x000b, 0x3779: 0x000b, 0x377a: 0x000b, 0x377b: 0x000b,
+ 0x377c: 0x000b, 0x377d: 0x000b, 0x377e: 0x000b, 0x377f: 0x000b,
+}
+
+// bidiIndex: 24 blocks, 1536 entries, 1536 bytes
+// Block 0 is the zero block.
+var bidiIndex = [1536]uint8{
+ // Block 0x0, offset 0x0
+ // Block 0x1, offset 0x40
+ // Block 0x2, offset 0x80
+ // Block 0x3, offset 0xc0
+ 0xc2: 0x01, 0xc3: 0x02,
+ 0xca: 0x03, 0xcb: 0x04, 0xcc: 0x05, 0xcd: 0x06, 0xce: 0x07, 0xcf: 0x08,
+ 0xd2: 0x09, 0xd6: 0x0a, 0xd7: 0x0b,
+ 0xd8: 0x0c, 0xd9: 0x0d, 0xda: 0x0e, 0xdb: 0x0f, 0xdc: 0x10, 0xdd: 0x11, 0xde: 0x12, 0xdf: 0x13,
+ 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06,
+ 0xea: 0x07, 0xef: 0x08,
+ 0xf0: 0x11, 0xf1: 0x12, 0xf2: 0x12, 0xf3: 0x14, 0xf4: 0x15,
+ // Block 0x4, offset 0x100
+ 0x120: 0x14, 0x121: 0x15, 0x122: 0x16, 0x123: 0x17, 0x124: 0x18, 0x125: 0x19, 0x126: 0x1a, 0x127: 0x1b,
+ 0x128: 0x1c, 0x129: 0x1d, 0x12a: 0x1c, 0x12b: 0x1e, 0x12c: 0x1f, 0x12d: 0x20, 0x12e: 0x21, 0x12f: 0x22,
+ 0x130: 0x23, 0x131: 0x24, 0x132: 0x1a, 0x133: 0x25, 0x134: 0x26, 0x135: 0x27, 0x137: 0x28,
+ 0x138: 0x29, 0x139: 0x2a, 0x13a: 0x2b, 0x13b: 0x2c, 0x13c: 0x2d, 0x13d: 0x2e, 0x13e: 0x2f, 0x13f: 0x30,
+ // Block 0x5, offset 0x140
+ 0x140: 0x31, 0x141: 0x32, 0x142: 0x33,
+ 0x14d: 0x34, 0x14e: 0x35,
+ 0x150: 0x36,
+ 0x15a: 0x37, 0x15c: 0x38, 0x15d: 0x39, 0x15e: 0x3a, 0x15f: 0x3b,
+ 0x160: 0x3c, 0x162: 0x3d, 0x164: 0x3e, 0x165: 0x3f, 0x167: 0x40,
+ 0x168: 0x41, 0x169: 0x42, 0x16a: 0x43, 0x16c: 0x44, 0x16d: 0x45, 0x16e: 0x46, 0x16f: 0x47,
+ 0x170: 0x48, 0x173: 0x49, 0x177: 0x4a,
+ 0x17e: 0x4b, 0x17f: 0x4c,
+ // Block 0x6, offset 0x180
+ 0x180: 0x4d, 0x181: 0x4e, 0x182: 0x4f, 0x183: 0x50, 0x184: 0x51, 0x185: 0x52, 0x186: 0x53, 0x187: 0x54,
+ 0x188: 0x55, 0x189: 0x54, 0x18a: 0x54, 0x18b: 0x54, 0x18c: 0x56, 0x18d: 0x57, 0x18e: 0x58, 0x18f: 0x59,
+ 0x190: 0x5a, 0x191: 0x5b, 0x192: 0x5c, 0x193: 0x5d, 0x194: 0x54, 0x195: 0x54, 0x196: 0x54, 0x197: 0x54,
+ 0x198: 0x54, 0x199: 0x54, 0x19a: 0x5e, 0x19b: 0x54, 0x19c: 0x54, 0x19d: 0x5f, 0x19e: 0x54, 0x19f: 0x60,
+ 0x1a4: 0x54, 0x1a5: 0x54, 0x1a6: 0x61, 0x1a7: 0x62,
+ 0x1a8: 0x54, 0x1a9: 0x54, 0x1aa: 0x54, 0x1ab: 0x54, 0x1ac: 0x54, 0x1ad: 0x63, 0x1ae: 0x64, 0x1af: 0x65,
+ 0x1b3: 0x66, 0x1b5: 0x67, 0x1b7: 0x68,
+ 0x1b8: 0x69, 0x1b9: 0x6a, 0x1ba: 0x6b, 0x1bb: 0x6c, 0x1bc: 0x54, 0x1bd: 0x54, 0x1be: 0x54, 0x1bf: 0x6d,
+ // Block 0x7, offset 0x1c0
+ 0x1c0: 0x6e, 0x1c2: 0x6f, 0x1c3: 0x70, 0x1c7: 0x71,
+ 0x1c8: 0x72, 0x1c9: 0x73, 0x1ca: 0x74, 0x1cb: 0x75, 0x1cd: 0x76, 0x1cf: 0x77,
+ // Block 0x8, offset 0x200
+ 0x237: 0x54,
+ // Block 0x9, offset 0x240
+ 0x252: 0x78, 0x253: 0x79,
+ 0x258: 0x7a, 0x259: 0x7b, 0x25a: 0x7c, 0x25b: 0x7d, 0x25c: 0x7e, 0x25e: 0x7f,
+ 0x260: 0x80, 0x261: 0x81, 0x263: 0x82, 0x264: 0x83, 0x265: 0x84, 0x266: 0x85, 0x267: 0x86,
+ 0x268: 0x87, 0x269: 0x88, 0x26a: 0x89, 0x26b: 0x8a, 0x26f: 0x8b,
+ // Block 0xa, offset 0x280
+ 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x0e, 0x2af: 0x0e,
+ 0x2b0: 0x0e, 0x2b1: 0x0e, 0x2b2: 0x0e, 0x2b3: 0x0e, 0x2b4: 0x8e, 0x2b5: 0x0e, 0x2b6: 0x0e, 0x2b7: 0x8f,
+ 0x2b8: 0x90, 0x2b9: 0x91, 0x2ba: 0x0e, 0x2bb: 0x92, 0x2bc: 0x93, 0x2bd: 0x94, 0x2bf: 0x95,
+ // Block 0xb, offset 0x2c0
+ 0x2c4: 0x96, 0x2c5: 0x54, 0x2c6: 0x97, 0x2c7: 0x98,
+ 0x2cb: 0x99, 0x2cd: 0x9a,
+ 0x2e0: 0x9b, 0x2e1: 0x9b, 0x2e2: 0x9b, 0x2e3: 0x9b, 0x2e4: 0x9c, 0x2e5: 0x9b, 0x2e6: 0x9b, 0x2e7: 0x9b,
+ 0x2e8: 0x9d, 0x2e9: 0x9b, 0x2ea: 0x9b, 0x2eb: 0x9e, 0x2ec: 0x9f, 0x2ed: 0x9b, 0x2ee: 0x9b, 0x2ef: 0x9b,
+ 0x2f0: 0x9b, 0x2f1: 0x9b, 0x2f2: 0x9b, 0x2f3: 0x9b, 0x2f4: 0x9b, 0x2f5: 0x9b, 0x2f6: 0x9b, 0x2f7: 0x9b,
+ 0x2f8: 0x9b, 0x2f9: 0xa0, 0x2fa: 0x9b, 0x2fb: 0x9b, 0x2fc: 0x9b, 0x2fd: 0x9b, 0x2fe: 0x9b, 0x2ff: 0x9b,
+ // Block 0xc, offset 0x300
+ 0x300: 0xa1, 0x301: 0xa2, 0x302: 0xa3, 0x304: 0xa4, 0x305: 0xa5, 0x306: 0xa6, 0x307: 0xa7,
+ 0x308: 0xa8, 0x30b: 0xa9, 0x30c: 0xaa, 0x30d: 0xab,
+ 0x310: 0xac, 0x311: 0xad, 0x312: 0xae, 0x313: 0xaf, 0x316: 0xb0, 0x317: 0xb1,
+ 0x318: 0xb2, 0x319: 0xb3, 0x31a: 0xb4, 0x31c: 0xb5,
+ 0x330: 0xb6, 0x332: 0xb7,
+ // Block 0xd, offset 0x340
+ 0x36b: 0xb8, 0x36c: 0xb9,
+ 0x37e: 0xba,
+ // Block 0xe, offset 0x380
+ 0x3b2: 0xbb,
+ // Block 0xf, offset 0x3c0
+ 0x3c5: 0xbc, 0x3c6: 0xbd,
+ 0x3c8: 0x54, 0x3c9: 0xbe, 0x3cc: 0x54, 0x3cd: 0xbf,
+ 0x3db: 0xc0, 0x3dc: 0xc1, 0x3dd: 0xc2, 0x3de: 0xc3, 0x3df: 0xc4,
+ 0x3e8: 0xc5, 0x3e9: 0xc6, 0x3ea: 0xc7,
+ // Block 0x10, offset 0x400
+ 0x400: 0xc8,
+ 0x420: 0x9b, 0x421: 0x9b, 0x422: 0x9b, 0x423: 0xc9, 0x424: 0x9b, 0x425: 0xca, 0x426: 0x9b, 0x427: 0x9b,
+ 0x428: 0x9b, 0x429: 0x9b, 0x42a: 0x9b, 0x42b: 0x9b, 0x42c: 0x9b, 0x42d: 0x9b, 0x42e: 0x9b, 0x42f: 0x9b,
+ 0x430: 0x9b, 0x431: 0x9b, 0x432: 0x9b, 0x433: 0x9b, 0x434: 0x9b, 0x435: 0x9b, 0x436: 0x9b, 0x437: 0x9b,
+ 0x438: 0x0e, 0x439: 0x0e, 0x43a: 0x0e, 0x43b: 0xcb, 0x43c: 0x9b, 0x43d: 0x9b, 0x43e: 0x9b, 0x43f: 0x9b,
+ // Block 0x11, offset 0x440
+ 0x440: 0xcc, 0x441: 0x54, 0x442: 0xcd, 0x443: 0xce, 0x444: 0xcf, 0x445: 0xd0,
+ 0x44c: 0x54, 0x44d: 0x54, 0x44e: 0x54, 0x44f: 0x54,
+ 0x450: 0x54, 0x451: 0x54, 0x452: 0x54, 0x453: 0x54, 0x454: 0x54, 0x455: 0x54, 0x456: 0x54, 0x457: 0x54,
+ 0x458: 0x54, 0x459: 0x54, 0x45a: 0x54, 0x45b: 0xd1, 0x45c: 0x54, 0x45d: 0x6c, 0x45e: 0x54, 0x45f: 0xd2,
+ 0x460: 0xd3, 0x461: 0xd4, 0x462: 0xd5, 0x464: 0xd6, 0x465: 0xd7, 0x466: 0xd8, 0x467: 0x36,
+ 0x47f: 0xd9,
+ // Block 0x12, offset 0x480
+ 0x4bf: 0xd9,
+ // Block 0x13, offset 0x4c0
+ 0x4d0: 0x09, 0x4d1: 0x0a, 0x4d6: 0x0b,
+ 0x4db: 0x0c, 0x4dd: 0x0d, 0x4de: 0x0e, 0x4df: 0x0f,
+ 0x4ef: 0x10,
+ 0x4ff: 0x10,
+ // Block 0x14, offset 0x500
+ 0x50f: 0x10,
+ 0x51f: 0x10,
+ 0x52f: 0x10,
+ 0x53f: 0x10,
+ // Block 0x15, offset 0x540
+ 0x540: 0xda, 0x541: 0xda, 0x542: 0xda, 0x543: 0xda, 0x544: 0x05, 0x545: 0x05, 0x546: 0x05, 0x547: 0xdb,
+ 0x548: 0xda, 0x549: 0xda, 0x54a: 0xda, 0x54b: 0xda, 0x54c: 0xda, 0x54d: 0xda, 0x54e: 0xda, 0x54f: 0xda,
+ 0x550: 0xda, 0x551: 0xda, 0x552: 0xda, 0x553: 0xda, 0x554: 0xda, 0x555: 0xda, 0x556: 0xda, 0x557: 0xda,
+ 0x558: 0xda, 0x559: 0xda, 0x55a: 0xda, 0x55b: 0xda, 0x55c: 0xda, 0x55d: 0xda, 0x55e: 0xda, 0x55f: 0xda,
+ 0x560: 0xda, 0x561: 0xda, 0x562: 0xda, 0x563: 0xda, 0x564: 0xda, 0x565: 0xda, 0x566: 0xda, 0x567: 0xda,
+ 0x568: 0xda, 0x569: 0xda, 0x56a: 0xda, 0x56b: 0xda, 0x56c: 0xda, 0x56d: 0xda, 0x56e: 0xda, 0x56f: 0xda,
+ 0x570: 0xda, 0x571: 0xda, 0x572: 0xda, 0x573: 0xda, 0x574: 0xda, 0x575: 0xda, 0x576: 0xda, 0x577: 0xda,
+ 0x578: 0xda, 0x579: 0xda, 0x57a: 0xda, 0x57b: 0xda, 0x57c: 0xda, 0x57d: 0xda, 0x57e: 0xda, 0x57f: 0xda,
+ // Block 0x16, offset 0x580
+ 0x58f: 0x10,
+ 0x59f: 0x10,
+ 0x5a0: 0x13,
+ 0x5af: 0x10,
+ 0x5bf: 0x10,
+ // Block 0x17, offset 0x5c0
+ 0x5cf: 0x10,
+}
+
+// Total table size 15800 bytes (15KiB); checksum: F50EF68C
diff --git a/vendor/golang.org/x/text/unicode/cldr/base.go b/vendor/golang.org/x/text/unicode/cldr/base.go
index 2382f4d..63cdc16 100644
--- a/vendor/golang.org/x/text/unicode/cldr/base.go
+++ b/vendor/golang.org/x/text/unicode/cldr/base.go
@@ -62,6 +62,11 @@ func (e *Common) Default() string {
return ""
}
+// Element returns the XML element name.
+func (e *Common) Element() string {
+ return e.name
+}
+
// GetCommon returns e. It is provided such that Common implements Elem.
func (e *Common) GetCommon() *Common {
return e
diff --git a/vendor/golang.org/x/text/unicode/cldr/decode.go b/vendor/golang.org/x/text/unicode/cldr/decode.go
index e5ee4ae..094d431 100644
--- a/vendor/golang.org/x/text/unicode/cldr/decode.go
+++ b/vendor/golang.org/x/text/unicode/cldr/decode.go
@@ -47,7 +47,7 @@ type Loader interface {
Reader(i int) (io.ReadCloser, error)
}
-var fileRe = regexp.MustCompile(".*/(.*)/(.*)\\.xml")
+var fileRe = regexp.MustCompile(`.*[/\\](.*)[/\\](.*)\.xml`)
// Decode loads and decodes the files represented by l.
func (d *Decoder) Decode(l Loader) (cldr *CLDR, err error) {
diff --git a/vendor/golang.org/x/text/unicode/cldr/xml.go b/vendor/golang.org/x/text/unicode/cldr/xml.go
index ce32038..f847663 100644
--- a/vendor/golang.org/x/text/unicode/cldr/xml.go
+++ b/vendor/golang.org/x/text/unicode/cldr/xml.go
@@ -636,6 +636,13 @@ type SupplementalData struct {
Path string `xml:"path,attr"`
} `xml:"rgPath"`
} `xml:"rgScope"`
+ LanguageGroups *struct {
+ Common
+ LanguageGroup []*struct {
+ Common
+ Parent string `xml:"parent,attr"`
+ } `xml:"languageGroup"`
+ } `xml:"languageGroups"`
}
// LDML is the top-level type for locale-specific data.
@@ -1484,4 +1491,4 @@ type Numbers struct {
}
// Version is the version of CLDR from which the XML definitions are generated.
-const Version = "31"
+const Version = "32"
diff --git a/vendor/golang.org/x/text/unicode/norm/data10.0.0_test.go b/vendor/golang.org/x/text/unicode/norm/data10.0.0_test.go
new file mode 100644
index 0000000..1d0f73d
--- /dev/null
+++ b/vendor/golang.org/x/text/unicode/norm/data10.0.0_test.go
@@ -0,0 +1,7424 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+// +build go1.10
+
+package norm
+
+const (
+ Yes = iota
+ No
+ Maybe
+)
+
+type formData struct {
+ qc uint8
+ combinesForward bool
+ decomposition string
+}
+
+type runeData struct {
+ r rune
+ ccc uint8
+ nLead uint8
+ nTrail uint8
+ f [2]formData // 0: canonical; 1: compatibility
+}
+
+func f(qc uint8, cf bool, dec string) [2]formData {
+ return [2]formData{{qc, cf, dec}, {qc, cf, dec}}
+}
+
+func g(qc, qck uint8, cf, cfk bool, d, dk string) [2]formData {
+ return [2]formData{{qc, cf, d}, {qck, cfk, dk}}
+}
+
+var testData = []runeData{
+ {0x0, 0, 0, 0, f(Yes, false, "")},
+ {0x3c, 0, 0, 0, f(Yes, true, "")},
+ {0x3f, 0, 0, 0, f(Yes, false, "")},
+ {0x41, 0, 0, 0, f(Yes, true, "")},
+ {0x51, 0, 0, 0, f(Yes, false, "")},
+ {0x52, 0, 0, 0, f(Yes, true, "")},
+ {0x5b, 0, 0, 0, f(Yes, false, "")},
+ {0x61, 0, 0, 0, f(Yes, true, "")},
+ {0x71, 0, 0, 0, f(Yes, false, "")},
+ {0x72, 0, 0, 0, f(Yes, true, "")},
+ {0x7b, 0, 0, 0, f(Yes, false, "")},
+ {0xa0, 0, 0, 0, g(Yes, No, false, false, "", " ")},
+ {0xa1, 0, 0, 0, f(Yes, false, "")},
+ {0xa8, 0, 0, 1, g(Yes, No, true, false, "", " ̈")},
+ {0xa9, 0, 0, 0, f(Yes, false, "")},
+ {0xaa, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0xab, 0, 0, 0, f(Yes, false, "")},
+ {0xaf, 0, 0, 1, g(Yes, No, false, false, "", " ̄")},
+ {0xb0, 0, 0, 0, f(Yes, false, "")},
+ {0xb2, 0, 0, 0, g(Yes, No, false, false, "", "2")},
+ {0xb3, 0, 0, 0, g(Yes, No, false, false, "", "3")},
+ {0xb4, 0, 0, 1, g(Yes, No, false, false, "", " ́")},
+ {0xb5, 0, 0, 0, g(Yes, No, false, false, "", "μ")},
+ {0xb6, 0, 0, 0, f(Yes, false, "")},
+ {0xb8, 0, 0, 1, g(Yes, No, false, false, "", " ̧")},
+ {0xb9, 0, 0, 0, g(Yes, No, false, false, "", "1")},
+ {0xba, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0xbb, 0, 0, 0, f(Yes, false, "")},
+ {0xbc, 0, 0, 0, g(Yes, No, false, false, "", "1⁄4")},
+ {0xbd, 0, 0, 0, g(Yes, No, false, false, "", "1⁄2")},
+ {0xbe, 0, 0, 0, g(Yes, No, false, false, "", "3⁄4")},
+ {0xbf, 0, 0, 0, f(Yes, false, "")},
+ {0xc0, 0, 0, 1, f(Yes, false, "À")},
+ {0xc1, 0, 0, 1, f(Yes, false, "Á")},
+ {0xc2, 0, 0, 1, f(Yes, true, "Â")},
+ {0xc3, 0, 0, 1, f(Yes, false, "Ã")},
+ {0xc4, 0, 0, 1, f(Yes, true, "Ä")},
+ {0xc5, 0, 0, 1, f(Yes, true, "Å")},
+ {0xc6, 0, 0, 0, f(Yes, true, "")},
+ {0xc7, 0, 0, 1, f(Yes, true, "Ç")},
+ {0xc8, 0, 0, 1, f(Yes, false, "È")},
+ {0xc9, 0, 0, 1, f(Yes, false, "É")},
+ {0xca, 0, 0, 1, f(Yes, true, "Ê")},
+ {0xcb, 0, 0, 1, f(Yes, false, "Ë")},
+ {0xcc, 0, 0, 1, f(Yes, false, "Ì")},
+ {0xcd, 0, 0, 1, f(Yes, false, "Í")},
+ {0xce, 0, 0, 1, f(Yes, false, "Î")},
+ {0xcf, 0, 0, 1, f(Yes, true, "Ï")},
+ {0xd0, 0, 0, 0, f(Yes, false, "")},
+ {0xd1, 0, 0, 1, f(Yes, false, "Ñ")},
+ {0xd2, 0, 0, 1, f(Yes, false, "Ò")},
+ {0xd3, 0, 0, 1, f(Yes, false, "Ó")},
+ {0xd4, 0, 0, 1, f(Yes, true, "Ô")},
+ {0xd5, 0, 0, 1, f(Yes, true, "Õ")},
+ {0xd6, 0, 0, 1, f(Yes, true, "Ö")},
+ {0xd7, 0, 0, 0, f(Yes, false, "")},
+ {0xd8, 0, 0, 0, f(Yes, true, "")},
+ {0xd9, 0, 0, 1, f(Yes, false, "Ù")},
+ {0xda, 0, 0, 1, f(Yes, false, "Ú")},
+ {0xdb, 0, 0, 1, f(Yes, false, "Û")},
+ {0xdc, 0, 0, 1, f(Yes, true, "Ü")},
+ {0xdd, 0, 0, 1, f(Yes, false, "Ý")},
+ {0xde, 0, 0, 0, f(Yes, false, "")},
+ {0xe0, 0, 0, 1, f(Yes, false, "à")},
+ {0xe1, 0, 0, 1, f(Yes, false, "á")},
+ {0xe2, 0, 0, 1, f(Yes, true, "â")},
+ {0xe3, 0, 0, 1, f(Yes, false, "ã")},
+ {0xe4, 0, 0, 1, f(Yes, true, "ä")},
+ {0xe5, 0, 0, 1, f(Yes, true, "å")},
+ {0xe6, 0, 0, 0, f(Yes, true, "")},
+ {0xe7, 0, 0, 1, f(Yes, true, "ç")},
+ {0xe8, 0, 0, 1, f(Yes, false, "è")},
+ {0xe9, 0, 0, 1, f(Yes, false, "é")},
+ {0xea, 0, 0, 1, f(Yes, true, "ê")},
+ {0xeb, 0, 0, 1, f(Yes, false, "ë")},
+ {0xec, 0, 0, 1, f(Yes, false, "ì")},
+ {0xed, 0, 0, 1, f(Yes, false, "í")},
+ {0xee, 0, 0, 1, f(Yes, false, "î")},
+ {0xef, 0, 0, 1, f(Yes, true, "ï")},
+ {0xf0, 0, 0, 0, f(Yes, false, "")},
+ {0xf1, 0, 0, 1, f(Yes, false, "ñ")},
+ {0xf2, 0, 0, 1, f(Yes, false, "ò")},
+ {0xf3, 0, 0, 1, f(Yes, false, "ó")},
+ {0xf4, 0, 0, 1, f(Yes, true, "ô")},
+ {0xf5, 0, 0, 1, f(Yes, true, "õ")},
+ {0xf6, 0, 0, 1, f(Yes, true, "ö")},
+ {0xf7, 0, 0, 0, f(Yes, false, "")},
+ {0xf8, 0, 0, 0, f(Yes, true, "")},
+ {0xf9, 0, 0, 1, f(Yes, false, "ù")},
+ {0xfa, 0, 0, 1, f(Yes, false, "ú")},
+ {0xfb, 0, 0, 1, f(Yes, false, "û")},
+ {0xfc, 0, 0, 1, f(Yes, true, "ü")},
+ {0xfd, 0, 0, 1, f(Yes, false, "ý")},
+ {0xfe, 0, 0, 0, f(Yes, false, "")},
+ {0xff, 0, 0, 1, f(Yes, false, "ÿ")},
+ {0x100, 0, 0, 1, f(Yes, false, "Ā")},
+ {0x101, 0, 0, 1, f(Yes, false, "ā")},
+ {0x102, 0, 0, 1, f(Yes, true, "Ă")},
+ {0x103, 0, 0, 1, f(Yes, true, "ă")},
+ {0x104, 0, 0, 1, f(Yes, false, "Ą")},
+ {0x105, 0, 0, 1, f(Yes, false, "ą")},
+ {0x106, 0, 0, 1, f(Yes, false, "Ć")},
+ {0x107, 0, 0, 1, f(Yes, false, "ć")},
+ {0x108, 0, 0, 1, f(Yes, false, "Ĉ")},
+ {0x109, 0, 0, 1, f(Yes, false, "ĉ")},
+ {0x10a, 0, 0, 1, f(Yes, false, "Ċ")},
+ {0x10b, 0, 0, 1, f(Yes, false, "ċ")},
+ {0x10c, 0, 0, 1, f(Yes, false, "Č")},
+ {0x10d, 0, 0, 1, f(Yes, false, "č")},
+ {0x10e, 0, 0, 1, f(Yes, false, "Ď")},
+ {0x10f, 0, 0, 1, f(Yes, false, "ď")},
+ {0x110, 0, 0, 0, f(Yes, false, "")},
+ {0x112, 0, 0, 1, f(Yes, true, "Ē")},
+ {0x113, 0, 0, 1, f(Yes, true, "ē")},
+ {0x114, 0, 0, 1, f(Yes, false, "Ĕ")},
+ {0x115, 0, 0, 1, f(Yes, false, "ĕ")},
+ {0x116, 0, 0, 1, f(Yes, false, "Ė")},
+ {0x117, 0, 0, 1, f(Yes, false, "ė")},
+ {0x118, 0, 0, 1, f(Yes, false, "Ę")},
+ {0x119, 0, 0, 1, f(Yes, false, "ę")},
+ {0x11a, 0, 0, 1, f(Yes, false, "Ě")},
+ {0x11b, 0, 0, 1, f(Yes, false, "ě")},
+ {0x11c, 0, 0, 1, f(Yes, false, "Ĝ")},
+ {0x11d, 0, 0, 1, f(Yes, false, "ĝ")},
+ {0x11e, 0, 0, 1, f(Yes, false, "Ğ")},
+ {0x11f, 0, 0, 1, f(Yes, false, "ğ")},
+ {0x120, 0, 0, 1, f(Yes, false, "Ġ")},
+ {0x121, 0, 0, 1, f(Yes, false, "ġ")},
+ {0x122, 0, 0, 1, f(Yes, false, "Ģ")},
+ {0x123, 0, 0, 1, f(Yes, false, "ģ")},
+ {0x124, 0, 0, 1, f(Yes, false, "Ĥ")},
+ {0x125, 0, 0, 1, f(Yes, false, "ĥ")},
+ {0x126, 0, 0, 0, f(Yes, false, "")},
+ {0x128, 0, 0, 1, f(Yes, false, "Ĩ")},
+ {0x129, 0, 0, 1, f(Yes, false, "ĩ")},
+ {0x12a, 0, 0, 1, f(Yes, false, "Ī")},
+ {0x12b, 0, 0, 1, f(Yes, false, "ī")},
+ {0x12c, 0, 0, 1, f(Yes, false, "Ĭ")},
+ {0x12d, 0, 0, 1, f(Yes, false, "ĭ")},
+ {0x12e, 0, 0, 1, f(Yes, false, "Į")},
+ {0x12f, 0, 0, 1, f(Yes, false, "į")},
+ {0x130, 0, 0, 1, f(Yes, false, "İ")},
+ {0x131, 0, 0, 0, f(Yes, false, "")},
+ {0x132, 0, 0, 0, g(Yes, No, false, false, "", "IJ")},
+ {0x133, 0, 0, 0, g(Yes, No, false, false, "", "ij")},
+ {0x134, 0, 0, 1, f(Yes, false, "Ĵ")},
+ {0x135, 0, 0, 1, f(Yes, false, "ĵ")},
+ {0x136, 0, 0, 1, f(Yes, false, "Ķ")},
+ {0x137, 0, 0, 1, f(Yes, false, "ķ")},
+ {0x138, 0, 0, 0, f(Yes, false, "")},
+ {0x139, 0, 0, 1, f(Yes, false, "Ĺ")},
+ {0x13a, 0, 0, 1, f(Yes, false, "ĺ")},
+ {0x13b, 0, 0, 1, f(Yes, false, "Ļ")},
+ {0x13c, 0, 0, 1, f(Yes, false, "ļ")},
+ {0x13d, 0, 0, 1, f(Yes, false, "Ľ")},
+ {0x13e, 0, 0, 1, f(Yes, false, "ľ")},
+ {0x13f, 0, 0, 0, g(Yes, No, false, false, "", "L·")},
+ {0x140, 0, 0, 0, g(Yes, No, false, false, "", "l·")},
+ {0x141, 0, 0, 0, f(Yes, false, "")},
+ {0x143, 0, 0, 1, f(Yes, false, "Ń")},
+ {0x144, 0, 0, 1, f(Yes, false, "ń")},
+ {0x145, 0, 0, 1, f(Yes, false, "Ņ")},
+ {0x146, 0, 0, 1, f(Yes, false, "ņ")},
+ {0x147, 0, 0, 1, f(Yes, false, "Ň")},
+ {0x148, 0, 0, 1, f(Yes, false, "ň")},
+ {0x149, 0, 0, 0, g(Yes, No, false, false, "", "ʼn")},
+ {0x14a, 0, 0, 0, f(Yes, false, "")},
+ {0x14c, 0, 0, 1, f(Yes, true, "Ō")},
+ {0x14d, 0, 0, 1, f(Yes, true, "ō")},
+ {0x14e, 0, 0, 1, f(Yes, false, "Ŏ")},
+ {0x14f, 0, 0, 1, f(Yes, false, "ŏ")},
+ {0x150, 0, 0, 1, f(Yes, false, "Ő")},
+ {0x151, 0, 0, 1, f(Yes, false, "ő")},
+ {0x152, 0, 0, 0, f(Yes, false, "")},
+ {0x154, 0, 0, 1, f(Yes, false, "Ŕ")},
+ {0x155, 0, 0, 1, f(Yes, false, "ŕ")},
+ {0x156, 0, 0, 1, f(Yes, false, "Ŗ")},
+ {0x157, 0, 0, 1, f(Yes, false, "ŗ")},
+ {0x158, 0, 0, 1, f(Yes, false, "Ř")},
+ {0x159, 0, 0, 1, f(Yes, false, "ř")},
+ {0x15a, 0, 0, 1, f(Yes, true, "Ś")},
+ {0x15b, 0, 0, 1, f(Yes, true, "ś")},
+ {0x15c, 0, 0, 1, f(Yes, false, "Ŝ")},
+ {0x15d, 0, 0, 1, f(Yes, false, "ŝ")},
+ {0x15e, 0, 0, 1, f(Yes, false, "Ş")},
+ {0x15f, 0, 0, 1, f(Yes, false, "ş")},
+ {0x160, 0, 0, 1, f(Yes, true, "Š")},
+ {0x161, 0, 0, 1, f(Yes, true, "š")},
+ {0x162, 0, 0, 1, f(Yes, false, "Ţ")},
+ {0x163, 0, 0, 1, f(Yes, false, "ţ")},
+ {0x164, 0, 0, 1, f(Yes, false, "Ť")},
+ {0x165, 0, 0, 1, f(Yes, false, "ť")},
+ {0x166, 0, 0, 0, f(Yes, false, "")},
+ {0x168, 0, 0, 1, f(Yes, true, "Ũ")},
+ {0x169, 0, 0, 1, f(Yes, true, "ũ")},
+ {0x16a, 0, 0, 1, f(Yes, true, "Ū")},
+ {0x16b, 0, 0, 1, f(Yes, true, "ū")},
+ {0x16c, 0, 0, 1, f(Yes, false, "Ŭ")},
+ {0x16d, 0, 0, 1, f(Yes, false, "ŭ")},
+ {0x16e, 0, 0, 1, f(Yes, false, "Ů")},
+ {0x16f, 0, 0, 1, f(Yes, false, "ů")},
+ {0x170, 0, 0, 1, f(Yes, false, "Ű")},
+ {0x171, 0, 0, 1, f(Yes, false, "ű")},
+ {0x172, 0, 0, 1, f(Yes, false, "Ų")},
+ {0x173, 0, 0, 1, f(Yes, false, "ų")},
+ {0x174, 0, 0, 1, f(Yes, false, "Ŵ")},
+ {0x175, 0, 0, 1, f(Yes, false, "ŵ")},
+ {0x176, 0, 0, 1, f(Yes, false, "Ŷ")},
+ {0x177, 0, 0, 1, f(Yes, false, "ŷ")},
+ {0x178, 0, 0, 1, f(Yes, false, "Ÿ")},
+ {0x179, 0, 0, 1, f(Yes, false, "Ź")},
+ {0x17a, 0, 0, 1, f(Yes, false, "ź")},
+ {0x17b, 0, 0, 1, f(Yes, false, "Ż")},
+ {0x17c, 0, 0, 1, f(Yes, false, "ż")},
+ {0x17d, 0, 0, 1, f(Yes, false, "Ž")},
+ {0x17e, 0, 0, 1, f(Yes, false, "ž")},
+ {0x17f, 0, 0, 0, g(Yes, No, true, false, "", "s")},
+ {0x180, 0, 0, 0, f(Yes, false, "")},
+ {0x1a0, 0, 0, 1, f(Yes, true, "Ơ")},
+ {0x1a1, 0, 0, 1, f(Yes, true, "ơ")},
+ {0x1a2, 0, 0, 0, f(Yes, false, "")},
+ {0x1af, 0, 0, 1, f(Yes, true, "Ư")},
+ {0x1b0, 0, 0, 1, f(Yes, true, "ư")},
+ {0x1b1, 0, 0, 0, f(Yes, false, "")},
+ {0x1b7, 0, 0, 0, f(Yes, true, "")},
+ {0x1b8, 0, 0, 0, f(Yes, false, "")},
+ {0x1c4, 0, 0, 1, g(Yes, No, false, false, "", "DŽ")},
+ {0x1c5, 0, 0, 1, g(Yes, No, false, false, "", "Dž")},
+ {0x1c6, 0, 0, 1, g(Yes, No, false, false, "", "dž")},
+ {0x1c7, 0, 0, 0, g(Yes, No, false, false, "", "LJ")},
+ {0x1c8, 0, 0, 0, g(Yes, No, false, false, "", "Lj")},
+ {0x1c9, 0, 0, 0, g(Yes, No, false, false, "", "lj")},
+ {0x1ca, 0, 0, 0, g(Yes, No, false, false, "", "NJ")},
+ {0x1cb, 0, 0, 0, g(Yes, No, false, false, "", "Nj")},
+ {0x1cc, 0, 0, 0, g(Yes, No, false, false, "", "nj")},
+ {0x1cd, 0, 0, 1, f(Yes, false, "Ǎ")},
+ {0x1ce, 0, 0, 1, f(Yes, false, "ǎ")},
+ {0x1cf, 0, 0, 1, f(Yes, false, "Ǐ")},
+ {0x1d0, 0, 0, 1, f(Yes, false, "ǐ")},
+ {0x1d1, 0, 0, 1, f(Yes, false, "Ǒ")},
+ {0x1d2, 0, 0, 1, f(Yes, false, "ǒ")},
+ {0x1d3, 0, 0, 1, f(Yes, false, "Ǔ")},
+ {0x1d4, 0, 0, 1, f(Yes, false, "ǔ")},
+ {0x1d5, 0, 0, 2, f(Yes, false, "Ǖ")},
+ {0x1d6, 0, 0, 2, f(Yes, false, "ǖ")},
+ {0x1d7, 0, 0, 2, f(Yes, false, "Ǘ")},
+ {0x1d8, 0, 0, 2, f(Yes, false, "ǘ")},
+ {0x1d9, 0, 0, 2, f(Yes, false, "Ǚ")},
+ {0x1da, 0, 0, 2, f(Yes, false, "ǚ")},
+ {0x1db, 0, 0, 2, f(Yes, false, "Ǜ")},
+ {0x1dc, 0, 0, 2, f(Yes, false, "ǜ")},
+ {0x1dd, 0, 0, 0, f(Yes, false, "")},
+ {0x1de, 0, 0, 2, f(Yes, false, "Ǟ")},
+ {0x1df, 0, 0, 2, f(Yes, false, "ǟ")},
+ {0x1e0, 0, 0, 2, f(Yes, false, "Ǡ")},
+ {0x1e1, 0, 0, 2, f(Yes, false, "ǡ")},
+ {0x1e2, 0, 0, 1, f(Yes, false, "Ǣ")},
+ {0x1e3, 0, 0, 1, f(Yes, false, "ǣ")},
+ {0x1e4, 0, 0, 0, f(Yes, false, "")},
+ {0x1e6, 0, 0, 1, f(Yes, false, "Ǧ")},
+ {0x1e7, 0, 0, 1, f(Yes, false, "ǧ")},
+ {0x1e8, 0, 0, 1, f(Yes, false, "Ǩ")},
+ {0x1e9, 0, 0, 1, f(Yes, false, "ǩ")},
+ {0x1ea, 0, 0, 1, f(Yes, true, "Ǫ")},
+ {0x1eb, 0, 0, 1, f(Yes, true, "ǫ")},
+ {0x1ec, 0, 0, 2, f(Yes, false, "Ǭ")},
+ {0x1ed, 0, 0, 2, f(Yes, false, "ǭ")},
+ {0x1ee, 0, 0, 1, f(Yes, false, "Ǯ")},
+ {0x1ef, 0, 0, 1, f(Yes, false, "ǯ")},
+ {0x1f0, 0, 0, 1, f(Yes, false, "ǰ")},
+ {0x1f1, 0, 0, 0, g(Yes, No, false, false, "", "DZ")},
+ {0x1f2, 0, 0, 0, g(Yes, No, false, false, "", "Dz")},
+ {0x1f3, 0, 0, 0, g(Yes, No, false, false, "", "dz")},
+ {0x1f4, 0, 0, 1, f(Yes, false, "Ǵ")},
+ {0x1f5, 0, 0, 1, f(Yes, false, "ǵ")},
+ {0x1f6, 0, 0, 0, f(Yes, false, "")},
+ {0x1f8, 0, 0, 1, f(Yes, false, "Ǹ")},
+ {0x1f9, 0, 0, 1, f(Yes, false, "ǹ")},
+ {0x1fa, 0, 0, 2, f(Yes, false, "Ǻ")},
+ {0x1fb, 0, 0, 2, f(Yes, false, "ǻ")},
+ {0x1fc, 0, 0, 1, f(Yes, false, "Ǽ")},
+ {0x1fd, 0, 0, 1, f(Yes, false, "ǽ")},
+ {0x1fe, 0, 0, 1, f(Yes, false, "Ǿ")},
+ {0x1ff, 0, 0, 1, f(Yes, false, "ǿ")},
+ {0x200, 0, 0, 1, f(Yes, false, "Ȁ")},
+ {0x201, 0, 0, 1, f(Yes, false, "ȁ")},
+ {0x202, 0, 0, 1, f(Yes, false, "Ȃ")},
+ {0x203, 0, 0, 1, f(Yes, false, "ȃ")},
+ {0x204, 0, 0, 1, f(Yes, false, "Ȅ")},
+ {0x205, 0, 0, 1, f(Yes, false, "ȅ")},
+ {0x206, 0, 0, 1, f(Yes, false, "Ȇ")},
+ {0x207, 0, 0, 1, f(Yes, false, "ȇ")},
+ {0x208, 0, 0, 1, f(Yes, false, "Ȉ")},
+ {0x209, 0, 0, 1, f(Yes, false, "ȉ")},
+ {0x20a, 0, 0, 1, f(Yes, false, "Ȋ")},
+ {0x20b, 0, 0, 1, f(Yes, false, "ȋ")},
+ {0x20c, 0, 0, 1, f(Yes, false, "Ȍ")},
+ {0x20d, 0, 0, 1, f(Yes, false, "ȍ")},
+ {0x20e, 0, 0, 1, f(Yes, false, "Ȏ")},
+ {0x20f, 0, 0, 1, f(Yes, false, "ȏ")},
+ {0x210, 0, 0, 1, f(Yes, false, "Ȑ")},
+ {0x211, 0, 0, 1, f(Yes, false, "ȑ")},
+ {0x212, 0, 0, 1, f(Yes, false, "Ȓ")},
+ {0x213, 0, 0, 1, f(Yes, false, "ȓ")},
+ {0x214, 0, 0, 1, f(Yes, false, "Ȕ")},
+ {0x215, 0, 0, 1, f(Yes, false, "ȕ")},
+ {0x216, 0, 0, 1, f(Yes, false, "Ȗ")},
+ {0x217, 0, 0, 1, f(Yes, false, "ȗ")},
+ {0x218, 0, 0, 1, f(Yes, false, "Ș")},
+ {0x219, 0, 0, 1, f(Yes, false, "ș")},
+ {0x21a, 0, 0, 1, f(Yes, false, "Ț")},
+ {0x21b, 0, 0, 1, f(Yes, false, "ț")},
+ {0x21c, 0, 0, 0, f(Yes, false, "")},
+ {0x21e, 0, 0, 1, f(Yes, false, "Ȟ")},
+ {0x21f, 0, 0, 1, f(Yes, false, "ȟ")},
+ {0x220, 0, 0, 0, f(Yes, false, "")},
+ {0x226, 0, 0, 1, f(Yes, true, "Ȧ")},
+ {0x227, 0, 0, 1, f(Yes, true, "ȧ")},
+ {0x228, 0, 0, 1, f(Yes, true, "Ȩ")},
+ {0x229, 0, 0, 1, f(Yes, true, "ȩ")},
+ {0x22a, 0, 0, 2, f(Yes, false, "Ȫ")},
+ {0x22b, 0, 0, 2, f(Yes, false, "ȫ")},
+ {0x22c, 0, 0, 2, f(Yes, false, "Ȭ")},
+ {0x22d, 0, 0, 2, f(Yes, false, "ȭ")},
+ {0x22e, 0, 0, 1, f(Yes, true, "Ȯ")},
+ {0x22f, 0, 0, 1, f(Yes, true, "ȯ")},
+ {0x230, 0, 0, 2, f(Yes, false, "Ȱ")},
+ {0x231, 0, 0, 2, f(Yes, false, "ȱ")},
+ {0x232, 0, 0, 1, f(Yes, false, "Ȳ")},
+ {0x233, 0, 0, 1, f(Yes, false, "ȳ")},
+ {0x234, 0, 0, 0, f(Yes, false, "")},
+ {0x292, 0, 0, 0, f(Yes, true, "")},
+ {0x293, 0, 0, 0, f(Yes, false, "")},
+ {0x2b0, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x2b1, 0, 0, 0, g(Yes, No, false, false, "", "ɦ")},
+ {0x2b2, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x2b3, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x2b4, 0, 0, 0, g(Yes, No, false, false, "", "ɹ")},
+ {0x2b5, 0, 0, 0, g(Yes, No, false, false, "", "ɻ")},
+ {0x2b6, 0, 0, 0, g(Yes, No, false, false, "", "ʁ")},
+ {0x2b7, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x2b8, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x2b9, 0, 0, 0, f(Yes, false, "")},
+ {0x2d8, 0, 0, 1, g(Yes, No, false, false, "", " ̆")},
+ {0x2d9, 0, 0, 1, g(Yes, No, false, false, "", " ̇")},
+ {0x2da, 0, 0, 1, g(Yes, No, false, false, "", " ̊")},
+ {0x2db, 0, 0, 1, g(Yes, No, false, false, "", " ̨")},
+ {0x2dc, 0, 0, 1, g(Yes, No, false, false, "", " ̃")},
+ {0x2dd, 0, 0, 1, g(Yes, No, false, false, "", " ̋")},
+ {0x2de, 0, 0, 0, f(Yes, false, "")},
+ {0x2e0, 0, 0, 0, g(Yes, No, false, false, "", "ɣ")},
+ {0x2e1, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x2e2, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x2e3, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x2e4, 0, 0, 0, g(Yes, No, false, false, "", "ʕ")},
+ {0x2e5, 0, 0, 0, f(Yes, false, "")},
+ {0x300, 230, 1, 1, f(Maybe, false, "")},
+ {0x305, 230, 1, 1, f(Yes, false, "")},
+ {0x306, 230, 1, 1, f(Maybe, false, "")},
+ {0x30d, 230, 1, 1, f(Yes, false, "")},
+ {0x30f, 230, 1, 1, f(Maybe, false, "")},
+ {0x310, 230, 1, 1, f(Yes, false, "")},
+ {0x311, 230, 1, 1, f(Maybe, false, "")},
+ {0x312, 230, 1, 1, f(Yes, false, "")},
+ {0x313, 230, 1, 1, f(Maybe, false, "")},
+ {0x315, 232, 1, 1, f(Yes, false, "")},
+ {0x316, 220, 1, 1, f(Yes, false, "")},
+ {0x31a, 232, 1, 1, f(Yes, false, "")},
+ {0x31b, 216, 1, 1, f(Maybe, false, "")},
+ {0x31c, 220, 1, 1, f(Yes, false, "")},
+ {0x321, 202, 1, 1, f(Yes, false, "")},
+ {0x323, 220, 1, 1, f(Maybe, false, "")},
+ {0x327, 202, 1, 1, f(Maybe, false, "")},
+ {0x329, 220, 1, 1, f(Yes, false, "")},
+ {0x32d, 220, 1, 1, f(Maybe, false, "")},
+ {0x32f, 220, 1, 1, f(Yes, false, "")},
+ {0x330, 220, 1, 1, f(Maybe, false, "")},
+ {0x332, 220, 1, 1, f(Yes, false, "")},
+ {0x334, 1, 1, 1, f(Yes, false, "")},
+ {0x338, 1, 1, 1, f(Maybe, false, "")},
+ {0x339, 220, 1, 1, f(Yes, false, "")},
+ {0x33d, 230, 1, 1, f(Yes, false, "")},
+ {0x340, 230, 1, 1, f(No, false, "̀")},
+ {0x341, 230, 1, 1, f(No, false, "́")},
+ {0x342, 230, 1, 1, f(Maybe, false, "")},
+ {0x343, 230, 1, 1, f(No, false, "̓")},
+ {0x344, 230, 2, 2, f(No, false, "̈́")},
+ {0x345, 240, 1, 1, f(Maybe, false, "")},
+ {0x346, 230, 1, 1, f(Yes, false, "")},
+ {0x347, 220, 1, 1, f(Yes, false, "")},
+ {0x34a, 230, 1, 1, f(Yes, false, "")},
+ {0x34d, 220, 1, 1, f(Yes, false, "")},
+ {0x34f, 0, 0, 0, f(Yes, false, "")},
+ {0x350, 230, 1, 1, f(Yes, false, "")},
+ {0x353, 220, 1, 1, f(Yes, false, "")},
+ {0x357, 230, 1, 1, f(Yes, false, "")},
+ {0x358, 232, 1, 1, f(Yes, false, "")},
+ {0x359, 220, 1, 1, f(Yes, false, "")},
+ {0x35b, 230, 1, 1, f(Yes, false, "")},
+ {0x35c, 233, 1, 1, f(Yes, false, "")},
+ {0x35d, 234, 1, 1, f(Yes, false, "")},
+ {0x35f, 233, 1, 1, f(Yes, false, "")},
+ {0x360, 234, 1, 1, f(Yes, false, "")},
+ {0x362, 233, 1, 1, f(Yes, false, "")},
+ {0x363, 230, 1, 1, f(Yes, false, "")},
+ {0x370, 0, 0, 0, f(Yes, false, "")},
+ {0x374, 0, 0, 0, f(No, false, "ʹ")},
+ {0x375, 0, 0, 0, f(Yes, false, "")},
+ {0x37a, 0, 0, 1, g(Yes, No, false, false, "", " ͅ")},
+ {0x37b, 0, 0, 0, f(Yes, false, "")},
+ {0x37e, 0, 0, 0, f(No, false, ";")},
+ {0x37f, 0, 0, 0, f(Yes, false, "")},
+ {0x384, 0, 0, 1, g(Yes, No, false, false, "", " ́")},
+ {0x385, 0, 0, 2, g(Yes, No, false, false, "΅", " ̈́")},
+ {0x386, 0, 0, 1, f(Yes, false, "Ά")},
+ {0x387, 0, 0, 0, f(No, false, "·")},
+ {0x388, 0, 0, 1, f(Yes, false, "Έ")},
+ {0x389, 0, 0, 1, f(Yes, false, "Ή")},
+ {0x38a, 0, 0, 1, f(Yes, false, "Ί")},
+ {0x38b, 0, 0, 0, f(Yes, false, "")},
+ {0x38c, 0, 0, 1, f(Yes, false, "Ό")},
+ {0x38d, 0, 0, 0, f(Yes, false, "")},
+ {0x38e, 0, 0, 1, f(Yes, false, "Ύ")},
+ {0x38f, 0, 0, 1, f(Yes, false, "Ώ")},
+ {0x390, 0, 0, 2, f(Yes, false, "ΐ")},
+ {0x391, 0, 0, 0, f(Yes, true, "")},
+ {0x392, 0, 0, 0, f(Yes, false, "")},
+ {0x395, 0, 0, 0, f(Yes, true, "")},
+ {0x396, 0, 0, 0, f(Yes, false, "")},
+ {0x397, 0, 0, 0, f(Yes, true, "")},
+ {0x398, 0, 0, 0, f(Yes, false, "")},
+ {0x399, 0, 0, 0, f(Yes, true, "")},
+ {0x39a, 0, 0, 0, f(Yes, false, "")},
+ {0x39f, 0, 0, 0, f(Yes, true, "")},
+ {0x3a0, 0, 0, 0, f(Yes, false, "")},
+ {0x3a1, 0, 0, 0, f(Yes, true, "")},
+ {0x3a2, 0, 0, 0, f(Yes, false, "")},
+ {0x3a5, 0, 0, 0, f(Yes, true, "")},
+ {0x3a6, 0, 0, 0, f(Yes, false, "")},
+ {0x3a9, 0, 0, 0, f(Yes, true, "")},
+ {0x3aa, 0, 0, 1, f(Yes, false, "Ϊ")},
+ {0x3ab, 0, 0, 1, f(Yes, false, "Ϋ")},
+ {0x3ac, 0, 0, 1, f(Yes, true, "ά")},
+ {0x3ad, 0, 0, 1, f(Yes, false, "έ")},
+ {0x3ae, 0, 0, 1, f(Yes, true, "ή")},
+ {0x3af, 0, 0, 1, f(Yes, false, "ί")},
+ {0x3b0, 0, 0, 2, f(Yes, false, "ΰ")},
+ {0x3b1, 0, 0, 0, f(Yes, true, "")},
+ {0x3b2, 0, 0, 0, f(Yes, false, "")},
+ {0x3b5, 0, 0, 0, f(Yes, true, "")},
+ {0x3b6, 0, 0, 0, f(Yes, false, "")},
+ {0x3b7, 0, 0, 0, f(Yes, true, "")},
+ {0x3b8, 0, 0, 0, f(Yes, false, "")},
+ {0x3b9, 0, 0, 0, f(Yes, true, "")},
+ {0x3ba, 0, 0, 0, f(Yes, false, "")},
+ {0x3bf, 0, 0, 0, f(Yes, true, "")},
+ {0x3c0, 0, 0, 0, f(Yes, false, "")},
+ {0x3c1, 0, 0, 0, f(Yes, true, "")},
+ {0x3c2, 0, 0, 0, f(Yes, false, "")},
+ {0x3c5, 0, 0, 0, f(Yes, true, "")},
+ {0x3c6, 0, 0, 0, f(Yes, false, "")},
+ {0x3c9, 0, 0, 0, f(Yes, true, "")},
+ {0x3ca, 0, 0, 1, f(Yes, true, "ϊ")},
+ {0x3cb, 0, 0, 1, f(Yes, true, "ϋ")},
+ {0x3cc, 0, 0, 1, f(Yes, false, "ό")},
+ {0x3cd, 0, 0, 1, f(Yes, false, "ύ")},
+ {0x3ce, 0, 0, 1, f(Yes, true, "ώ")},
+ {0x3cf, 0, 0, 0, f(Yes, false, "")},
+ {0x3d0, 0, 0, 0, g(Yes, No, false, false, "", "β")},
+ {0x3d1, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x3d2, 0, 0, 0, g(Yes, No, true, false, "", "Υ")},
+ {0x3d3, 0, 0, 1, g(Yes, No, false, false, "ϓ", "Ύ")},
+ {0x3d4, 0, 0, 1, g(Yes, No, false, false, "ϔ", "Ϋ")},
+ {0x3d5, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x3d6, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x3d7, 0, 0, 0, f(Yes, false, "")},
+ {0x3f0, 0, 0, 0, g(Yes, No, false, false, "", "κ")},
+ {0x3f1, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x3f2, 0, 0, 0, g(Yes, No, false, false, "", "ς")},
+ {0x3f3, 0, 0, 0, f(Yes, false, "")},
+ {0x3f4, 0, 0, 0, g(Yes, No, false, false, "", "Θ")},
+ {0x3f5, 0, 0, 0, g(Yes, No, false, false, "", "ε")},
+ {0x3f6, 0, 0, 0, f(Yes, false, "")},
+ {0x3f9, 0, 0, 0, g(Yes, No, false, false, "", "Σ")},
+ {0x3fa, 0, 0, 0, f(Yes, false, "")},
+ {0x400, 0, 0, 1, f(Yes, false, "Ѐ")},
+ {0x401, 0, 0, 1, f(Yes, false, "Ё")},
+ {0x402, 0, 0, 0, f(Yes, false, "")},
+ {0x403, 0, 0, 1, f(Yes, false, "Ѓ")},
+ {0x404, 0, 0, 0, f(Yes, false, "")},
+ {0x406, 0, 0, 0, f(Yes, true, "")},
+ {0x407, 0, 0, 1, f(Yes, false, "Ї")},
+ {0x408, 0, 0, 0, f(Yes, false, "")},
+ {0x40c, 0, 0, 1, f(Yes, false, "Ќ")},
+ {0x40d, 0, 0, 1, f(Yes, false, "Ѝ")},
+ {0x40e, 0, 0, 1, f(Yes, false, "Ў")},
+ {0x40f, 0, 0, 0, f(Yes, false, "")},
+ {0x410, 0, 0, 0, f(Yes, true, "")},
+ {0x411, 0, 0, 0, f(Yes, false, "")},
+ {0x413, 0, 0, 0, f(Yes, true, "")},
+ {0x414, 0, 0, 0, f(Yes, false, "")},
+ {0x415, 0, 0, 0, f(Yes, true, "")},
+ {0x419, 0, 0, 1, f(Yes, false, "Й")},
+ {0x41a, 0, 0, 0, f(Yes, true, "")},
+ {0x41b, 0, 0, 0, f(Yes, false, "")},
+ {0x41e, 0, 0, 0, f(Yes, true, "")},
+ {0x41f, 0, 0, 0, f(Yes, false, "")},
+ {0x423, 0, 0, 0, f(Yes, true, "")},
+ {0x424, 0, 0, 0, f(Yes, false, "")},
+ {0x427, 0, 0, 0, f(Yes, true, "")},
+ {0x428, 0, 0, 0, f(Yes, false, "")},
+ {0x42b, 0, 0, 0, f(Yes, true, "")},
+ {0x42c, 0, 0, 0, f(Yes, false, "")},
+ {0x42d, 0, 0, 0, f(Yes, true, "")},
+ {0x42e, 0, 0, 0, f(Yes, false, "")},
+ {0x430, 0, 0, 0, f(Yes, true, "")},
+ {0x431, 0, 0, 0, f(Yes, false, "")},
+ {0x433, 0, 0, 0, f(Yes, true, "")},
+ {0x434, 0, 0, 0, f(Yes, false, "")},
+ {0x435, 0, 0, 0, f(Yes, true, "")},
+ {0x439, 0, 0, 1, f(Yes, false, "й")},
+ {0x43a, 0, 0, 0, f(Yes, true, "")},
+ {0x43b, 0, 0, 0, f(Yes, false, "")},
+ {0x43e, 0, 0, 0, f(Yes, true, "")},
+ {0x43f, 0, 0, 0, f(Yes, false, "")},
+ {0x443, 0, 0, 0, f(Yes, true, "")},
+ {0x444, 0, 0, 0, f(Yes, false, "")},
+ {0x447, 0, 0, 0, f(Yes, true, "")},
+ {0x448, 0, 0, 0, f(Yes, false, "")},
+ {0x44b, 0, 0, 0, f(Yes, true, "")},
+ {0x44c, 0, 0, 0, f(Yes, false, "")},
+ {0x44d, 0, 0, 0, f(Yes, true, "")},
+ {0x44e, 0, 0, 0, f(Yes, false, "")},
+ {0x450, 0, 0, 1, f(Yes, false, "ѐ")},
+ {0x451, 0, 0, 1, f(Yes, false, "ё")},
+ {0x452, 0, 0, 0, f(Yes, false, "")},
+ {0x453, 0, 0, 1, f(Yes, false, "ѓ")},
+ {0x454, 0, 0, 0, f(Yes, false, "")},
+ {0x456, 0, 0, 0, f(Yes, true, "")},
+ {0x457, 0, 0, 1, f(Yes, false, "ї")},
+ {0x458, 0, 0, 0, f(Yes, false, "")},
+ {0x45c, 0, 0, 1, f(Yes, false, "ќ")},
+ {0x45d, 0, 0, 1, f(Yes, false, "ѝ")},
+ {0x45e, 0, 0, 1, f(Yes, false, "ў")},
+ {0x45f, 0, 0, 0, f(Yes, false, "")},
+ {0x474, 0, 0, 0, f(Yes, true, "")},
+ {0x476, 0, 0, 1, f(Yes, false, "Ѷ")},
+ {0x477, 0, 0, 1, f(Yes, false, "ѷ")},
+ {0x478, 0, 0, 0, f(Yes, false, "")},
+ {0x483, 230, 1, 1, f(Yes, false, "")},
+ {0x488, 0, 0, 0, f(Yes, false, "")},
+ {0x4c1, 0, 0, 1, f(Yes, false, "Ӂ")},
+ {0x4c2, 0, 0, 1, f(Yes, false, "ӂ")},
+ {0x4c3, 0, 0, 0, f(Yes, false, "")},
+ {0x4d0, 0, 0, 1, f(Yes, false, "Ӑ")},
+ {0x4d1, 0, 0, 1, f(Yes, false, "ӑ")},
+ {0x4d2, 0, 0, 1, f(Yes, false, "Ӓ")},
+ {0x4d3, 0, 0, 1, f(Yes, false, "ӓ")},
+ {0x4d4, 0, 0, 0, f(Yes, false, "")},
+ {0x4d6, 0, 0, 1, f(Yes, false, "Ӗ")},
+ {0x4d7, 0, 0, 1, f(Yes, false, "ӗ")},
+ {0x4d8, 0, 0, 0, f(Yes, true, "")},
+ {0x4da, 0, 0, 1, f(Yes, false, "Ӛ")},
+ {0x4db, 0, 0, 1, f(Yes, false, "ӛ")},
+ {0x4dc, 0, 0, 1, f(Yes, false, "Ӝ")},
+ {0x4dd, 0, 0, 1, f(Yes, false, "ӝ")},
+ {0x4de, 0, 0, 1, f(Yes, false, "Ӟ")},
+ {0x4df, 0, 0, 1, f(Yes, false, "ӟ")},
+ {0x4e0, 0, 0, 0, f(Yes, false, "")},
+ {0x4e2, 0, 0, 1, f(Yes, false, "Ӣ")},
+ {0x4e3, 0, 0, 1, f(Yes, false, "ӣ")},
+ {0x4e4, 0, 0, 1, f(Yes, false, "Ӥ")},
+ {0x4e5, 0, 0, 1, f(Yes, false, "ӥ")},
+ {0x4e6, 0, 0, 1, f(Yes, false, "Ӧ")},
+ {0x4e7, 0, 0, 1, f(Yes, false, "ӧ")},
+ {0x4e8, 0, 0, 0, f(Yes, true, "")},
+ {0x4ea, 0, 0, 1, f(Yes, false, "Ӫ")},
+ {0x4eb, 0, 0, 1, f(Yes, false, "ӫ")},
+ {0x4ec, 0, 0, 1, f(Yes, false, "Ӭ")},
+ {0x4ed, 0, 0, 1, f(Yes, false, "ӭ")},
+ {0x4ee, 0, 0, 1, f(Yes, false, "Ӯ")},
+ {0x4ef, 0, 0, 1, f(Yes, false, "ӯ")},
+ {0x4f0, 0, 0, 1, f(Yes, false, "Ӱ")},
+ {0x4f1, 0, 0, 1, f(Yes, false, "ӱ")},
+ {0x4f2, 0, 0, 1, f(Yes, false, "Ӳ")},
+ {0x4f3, 0, 0, 1, f(Yes, false, "ӳ")},
+ {0x4f4, 0, 0, 1, f(Yes, false, "Ӵ")},
+ {0x4f5, 0, 0, 1, f(Yes, false, "ӵ")},
+ {0x4f6, 0, 0, 0, f(Yes, false, "")},
+ {0x4f8, 0, 0, 1, f(Yes, false, "Ӹ")},
+ {0x4f9, 0, 0, 1, f(Yes, false, "ӹ")},
+ {0x4fa, 0, 0, 0, f(Yes, false, "")},
+ {0x587, 0, 0, 0, g(Yes, No, false, false, "", "եւ")},
+ {0x588, 0, 0, 0, f(Yes, false, "")},
+ {0x591, 220, 1, 1, f(Yes, false, "")},
+ {0x592, 230, 1, 1, f(Yes, false, "")},
+ {0x596, 220, 1, 1, f(Yes, false, "")},
+ {0x597, 230, 1, 1, f(Yes, false, "")},
+ {0x59a, 222, 1, 1, f(Yes, false, "")},
+ {0x59b, 220, 1, 1, f(Yes, false, "")},
+ {0x59c, 230, 1, 1, f(Yes, false, "")},
+ {0x5a2, 220, 1, 1, f(Yes, false, "")},
+ {0x5a8, 230, 1, 1, f(Yes, false, "")},
+ {0x5aa, 220, 1, 1, f(Yes, false, "")},
+ {0x5ab, 230, 1, 1, f(Yes, false, "")},
+ {0x5ad, 222, 1, 1, f(Yes, false, "")},
+ {0x5ae, 228, 1, 1, f(Yes, false, "")},
+ {0x5af, 230, 1, 1, f(Yes, false, "")},
+ {0x5b0, 10, 1, 1, f(Yes, false, "")},
+ {0x5b1, 11, 1, 1, f(Yes, false, "")},
+ {0x5b2, 12, 1, 1, f(Yes, false, "")},
+ {0x5b3, 13, 1, 1, f(Yes, false, "")},
+ {0x5b4, 14, 1, 1, f(Yes, false, "")},
+ {0x5b5, 15, 1, 1, f(Yes, false, "")},
+ {0x5b6, 16, 1, 1, f(Yes, false, "")},
+ {0x5b7, 17, 1, 1, f(Yes, false, "")},
+ {0x5b8, 18, 1, 1, f(Yes, false, "")},
+ {0x5b9, 19, 1, 1, f(Yes, false, "")},
+ {0x5bb, 20, 1, 1, f(Yes, false, "")},
+ {0x5bc, 21, 1, 1, f(Yes, false, "")},
+ {0x5bd, 22, 1, 1, f(Yes, false, "")},
+ {0x5be, 0, 0, 0, f(Yes, false, "")},
+ {0x5bf, 23, 1, 1, f(Yes, false, "")},
+ {0x5c0, 0, 0, 0, f(Yes, false, "")},
+ {0x5c1, 24, 1, 1, f(Yes, false, "")},
+ {0x5c2, 25, 1, 1, f(Yes, false, "")},
+ {0x5c3, 0, 0, 0, f(Yes, false, "")},
+ {0x5c4, 230, 1, 1, f(Yes, false, "")},
+ {0x5c5, 220, 1, 1, f(Yes, false, "")},
+ {0x5c6, 0, 0, 0, f(Yes, false, "")},
+ {0x5c7, 18, 1, 1, f(Yes, false, "")},
+ {0x5c8, 0, 0, 0, f(Yes, false, "")},
+ {0x610, 230, 1, 1, f(Yes, false, "")},
+ {0x618, 30, 1, 1, f(Yes, false, "")},
+ {0x619, 31, 1, 1, f(Yes, false, "")},
+ {0x61a, 32, 1, 1, f(Yes, false, "")},
+ {0x61b, 0, 0, 0, f(Yes, false, "")},
+ {0x622, 0, 0, 1, f(Yes, false, "آ")},
+ {0x623, 0, 0, 1, f(Yes, false, "أ")},
+ {0x624, 0, 0, 1, f(Yes, false, "ؤ")},
+ {0x625, 0, 0, 1, f(Yes, false, "إ")},
+ {0x626, 0, 0, 1, f(Yes, false, "ئ")},
+ {0x627, 0, 0, 0, f(Yes, true, "")},
+ {0x628, 0, 0, 0, f(Yes, false, "")},
+ {0x648, 0, 0, 0, f(Yes, true, "")},
+ {0x649, 0, 0, 0, f(Yes, false, "")},
+ {0x64a, 0, 0, 0, f(Yes, true, "")},
+ {0x64b, 27, 1, 1, f(Yes, false, "")},
+ {0x64c, 28, 1, 1, f(Yes, false, "")},
+ {0x64d, 29, 1, 1, f(Yes, false, "")},
+ {0x64e, 30, 1, 1, f(Yes, false, "")},
+ {0x64f, 31, 1, 1, f(Yes, false, "")},
+ {0x650, 32, 1, 1, f(Yes, false, "")},
+ {0x651, 33, 1, 1, f(Yes, false, "")},
+ {0x652, 34, 1, 1, f(Yes, false, "")},
+ {0x653, 230, 1, 1, f(Maybe, false, "")},
+ {0x655, 220, 1, 1, f(Maybe, false, "")},
+ {0x656, 220, 1, 1, f(Yes, false, "")},
+ {0x657, 230, 1, 1, f(Yes, false, "")},
+ {0x65c, 220, 1, 1, f(Yes, false, "")},
+ {0x65d, 230, 1, 1, f(Yes, false, "")},
+ {0x65f, 220, 1, 1, f(Yes, false, "")},
+ {0x660, 0, 0, 0, f(Yes, false, "")},
+ {0x670, 35, 1, 1, f(Yes, false, "")},
+ {0x671, 0, 0, 0, f(Yes, false, "")},
+ {0x675, 0, 0, 0, g(Yes, No, false, false, "", "اٴ")},
+ {0x676, 0, 0, 0, g(Yes, No, false, false, "", "وٴ")},
+ {0x677, 0, 0, 0, g(Yes, No, false, false, "", "ۇٴ")},
+ {0x678, 0, 0, 0, g(Yes, No, false, false, "", "يٴ")},
+ {0x679, 0, 0, 0, f(Yes, false, "")},
+ {0x6c0, 0, 0, 1, f(Yes, false, "ۀ")},
+ {0x6c1, 0, 0, 0, f(Yes, true, "")},
+ {0x6c2, 0, 0, 1, f(Yes, false, "ۂ")},
+ {0x6c3, 0, 0, 0, f(Yes, false, "")},
+ {0x6d2, 0, 0, 0, f(Yes, true, "")},
+ {0x6d3, 0, 0, 1, f(Yes, false, "ۓ")},
+ {0x6d4, 0, 0, 0, f(Yes, false, "")},
+ {0x6d5, 0, 0, 0, f(Yes, true, "")},
+ {0x6d6, 230, 1, 1, f(Yes, false, "")},
+ {0x6dd, 0, 0, 0, f(Yes, false, "")},
+ {0x6df, 230, 1, 1, f(Yes, false, "")},
+ {0x6e3, 220, 1, 1, f(Yes, false, "")},
+ {0x6e4, 230, 1, 1, f(Yes, false, "")},
+ {0x6e5, 0, 0, 0, f(Yes, false, "")},
+ {0x6e7, 230, 1, 1, f(Yes, false, "")},
+ {0x6e9, 0, 0, 0, f(Yes, false, "")},
+ {0x6ea, 220, 1, 1, f(Yes, false, "")},
+ {0x6eb, 230, 1, 1, f(Yes, false, "")},
+ {0x6ed, 220, 1, 1, f(Yes, false, "")},
+ {0x6ee, 0, 0, 0, f(Yes, false, "")},
+ {0x711, 36, 1, 1, f(Yes, false, "")},
+ {0x712, 0, 0, 0, f(Yes, false, "")},
+ {0x730, 230, 1, 1, f(Yes, false, "")},
+ {0x731, 220, 1, 1, f(Yes, false, "")},
+ {0x732, 230, 1, 1, f(Yes, false, "")},
+ {0x734, 220, 1, 1, f(Yes, false, "")},
+ {0x735, 230, 1, 1, f(Yes, false, "")},
+ {0x737, 220, 1, 1, f(Yes, false, "")},
+ {0x73a, 230, 1, 1, f(Yes, false, "")},
+ {0x73b, 220, 1, 1, f(Yes, false, "")},
+ {0x73d, 230, 1, 1, f(Yes, false, "")},
+ {0x73e, 220, 1, 1, f(Yes, false, "")},
+ {0x73f, 230, 1, 1, f(Yes, false, "")},
+ {0x742, 220, 1, 1, f(Yes, false, "")},
+ {0x743, 230, 1, 1, f(Yes, false, "")},
+ {0x744, 220, 1, 1, f(Yes, false, "")},
+ {0x745, 230, 1, 1, f(Yes, false, "")},
+ {0x746, 220, 1, 1, f(Yes, false, "")},
+ {0x747, 230, 1, 1, f(Yes, false, "")},
+ {0x748, 220, 1, 1, f(Yes, false, "")},
+ {0x749, 230, 1, 1, f(Yes, false, "")},
+ {0x74b, 0, 0, 0, f(Yes, false, "")},
+ {0x7eb, 230, 1, 1, f(Yes, false, "")},
+ {0x7f2, 220, 1, 1, f(Yes, false, "")},
+ {0x7f3, 230, 1, 1, f(Yes, false, "")},
+ {0x7f4, 0, 0, 0, f(Yes, false, "")},
+ {0x816, 230, 1, 1, f(Yes, false, "")},
+ {0x81a, 0, 0, 0, f(Yes, false, "")},
+ {0x81b, 230, 1, 1, f(Yes, false, "")},
+ {0x824, 0, 0, 0, f(Yes, false, "")},
+ {0x825, 230, 1, 1, f(Yes, false, "")},
+ {0x828, 0, 0, 0, f(Yes, false, "")},
+ {0x829, 230, 1, 1, f(Yes, false, "")},
+ {0x82e, 0, 0, 0, f(Yes, false, "")},
+ {0x859, 220, 1, 1, f(Yes, false, "")},
+ {0x85c, 0, 0, 0, f(Yes, false, "")},
+ {0x8d4, 230, 1, 1, f(Yes, false, "")},
+ {0x8e2, 0, 0, 0, f(Yes, false, "")},
+ {0x8e3, 220, 1, 1, f(Yes, false, "")},
+ {0x8e4, 230, 1, 1, f(Yes, false, "")},
+ {0x8e6, 220, 1, 1, f(Yes, false, "")},
+ {0x8e7, 230, 1, 1, f(Yes, false, "")},
+ {0x8e9, 220, 1, 1, f(Yes, false, "")},
+ {0x8ea, 230, 1, 1, f(Yes, false, "")},
+ {0x8ed, 220, 1, 1, f(Yes, false, "")},
+ {0x8f0, 27, 1, 1, f(Yes, false, "")},
+ {0x8f1, 28, 1, 1, f(Yes, false, "")},
+ {0x8f2, 29, 1, 1, f(Yes, false, "")},
+ {0x8f3, 230, 1, 1, f(Yes, false, "")},
+ {0x8f6, 220, 1, 1, f(Yes, false, "")},
+ {0x8f7, 230, 1, 1, f(Yes, false, "")},
+ {0x8f9, 220, 1, 1, f(Yes, false, "")},
+ {0x8fb, 230, 1, 1, f(Yes, false, "")},
+ {0x900, 0, 0, 0, f(Yes, false, "")},
+ {0x928, 0, 0, 0, f(Yes, true, "")},
+ {0x929, 0, 0, 1, f(Yes, false, "ऩ")},
+ {0x92a, 0, 0, 0, f(Yes, false, "")},
+ {0x930, 0, 0, 0, f(Yes, true, "")},
+ {0x931, 0, 0, 1, f(Yes, false, "ऱ")},
+ {0x932, 0, 0, 0, f(Yes, false, "")},
+ {0x933, 0, 0, 0, f(Yes, true, "")},
+ {0x934, 0, 0, 1, f(Yes, false, "ऴ")},
+ {0x935, 0, 0, 0, f(Yes, false, "")},
+ {0x93c, 7, 1, 1, f(Maybe, false, "")},
+ {0x93d, 0, 0, 0, f(Yes, false, "")},
+ {0x94d, 9, 1, 1, f(Yes, false, "")},
+ {0x94e, 0, 0, 0, f(Yes, false, "")},
+ {0x951, 230, 1, 1, f(Yes, false, "")},
+ {0x952, 220, 1, 1, f(Yes, false, "")},
+ {0x953, 230, 1, 1, f(Yes, false, "")},
+ {0x955, 0, 0, 0, f(Yes, false, "")},
+ {0x958, 0, 0, 1, f(No, false, "क़")},
+ {0x959, 0, 0, 1, f(No, false, "ख़")},
+ {0x95a, 0, 0, 1, f(No, false, "ग़")},
+ {0x95b, 0, 0, 1, f(No, false, "ज़")},
+ {0x95c, 0, 0, 1, f(No, false, "ड़")},
+ {0x95d, 0, 0, 1, f(No, false, "ढ़")},
+ {0x95e, 0, 0, 1, f(No, false, "फ़")},
+ {0x95f, 0, 0, 1, f(No, false, "य़")},
+ {0x960, 0, 0, 0, f(Yes, false, "")},
+ {0x9bc, 7, 1, 1, f(Yes, false, "")},
+ {0x9bd, 0, 0, 0, f(Yes, false, "")},
+ {0x9be, 0, 1, 1, f(Maybe, false, "")},
+ {0x9bf, 0, 0, 0, f(Yes, false, "")},
+ {0x9c7, 0, 0, 0, f(Yes, true, "")},
+ {0x9c8, 0, 0, 0, f(Yes, false, "")},
+ {0x9cb, 0, 0, 1, f(Yes, false, "ো")},
+ {0x9cc, 0, 0, 1, f(Yes, false, "ৌ")},
+ {0x9cd, 9, 1, 1, f(Yes, false, "")},
+ {0x9ce, 0, 0, 0, f(Yes, false, "")},
+ {0x9d7, 0, 1, 1, f(Maybe, false, "")},
+ {0x9d8, 0, 0, 0, f(Yes, false, "")},
+ {0x9dc, 0, 0, 1, f(No, false, "ড়")},
+ {0x9dd, 0, 0, 1, f(No, false, "ঢ়")},
+ {0x9de, 0, 0, 0, f(Yes, false, "")},
+ {0x9df, 0, 0, 1, f(No, false, "য়")},
+ {0x9e0, 0, 0, 0, f(Yes, false, "")},
+ {0xa33, 0, 0, 1, f(No, false, "ਲ਼")},
+ {0xa34, 0, 0, 0, f(Yes, false, "")},
+ {0xa36, 0, 0, 1, f(No, false, "ਸ਼")},
+ {0xa37, 0, 0, 0, f(Yes, false, "")},
+ {0xa3c, 7, 1, 1, f(Yes, false, "")},
+ {0xa3d, 0, 0, 0, f(Yes, false, "")},
+ {0xa4d, 9, 1, 1, f(Yes, false, "")},
+ {0xa4e, 0, 0, 0, f(Yes, false, "")},
+ {0xa59, 0, 0, 1, f(No, false, "ਖ਼")},
+ {0xa5a, 0, 0, 1, f(No, false, "ਗ਼")},
+ {0xa5b, 0, 0, 1, f(No, false, "ਜ਼")},
+ {0xa5c, 0, 0, 0, f(Yes, false, "")},
+ {0xa5e, 0, 0, 1, f(No, false, "ਫ਼")},
+ {0xa5f, 0, 0, 0, f(Yes, false, "")},
+ {0xabc, 7, 1, 1, f(Yes, false, "")},
+ {0xabd, 0, 0, 0, f(Yes, false, "")},
+ {0xacd, 9, 1, 1, f(Yes, false, "")},
+ {0xace, 0, 0, 0, f(Yes, false, "")},
+ {0xb3c, 7, 1, 1, f(Yes, false, "")},
+ {0xb3d, 0, 0, 0, f(Yes, false, "")},
+ {0xb3e, 0, 1, 1, f(Maybe, false, "")},
+ {0xb3f, 0, 0, 0, f(Yes, false, "")},
+ {0xb47, 0, 0, 0, f(Yes, true, "")},
+ {0xb48, 0, 0, 1, f(Yes, false, "ୈ")},
+ {0xb49, 0, 0, 0, f(Yes, false, "")},
+ {0xb4b, 0, 0, 1, f(Yes, false, "ୋ")},
+ {0xb4c, 0, 0, 1, f(Yes, false, "ୌ")},
+ {0xb4d, 9, 1, 1, f(Yes, false, "")},
+ {0xb4e, 0, 0, 0, f(Yes, false, "")},
+ {0xb56, 0, 1, 1, f(Maybe, false, "")},
+ {0xb58, 0, 0, 0, f(Yes, false, "")},
+ {0xb5c, 0, 0, 1, f(No, false, "ଡ଼")},
+ {0xb5d, 0, 0, 1, f(No, false, "ଢ଼")},
+ {0xb5e, 0, 0, 0, f(Yes, false, "")},
+ {0xb92, 0, 0, 0, f(Yes, true, "")},
+ {0xb93, 0, 0, 0, f(Yes, false, "")},
+ {0xb94, 0, 0, 1, f(Yes, false, "ஔ")},
+ {0xb95, 0, 0, 0, f(Yes, false, "")},
+ {0xbbe, 0, 1, 1, f(Maybe, false, "")},
+ {0xbbf, 0, 0, 0, f(Yes, false, "")},
+ {0xbc6, 0, 0, 0, f(Yes, true, "")},
+ {0xbc8, 0, 0, 0, f(Yes, false, "")},
+ {0xbca, 0, 0, 1, f(Yes, false, "ொ")},
+ {0xbcb, 0, 0, 1, f(Yes, false, "ோ")},
+ {0xbcc, 0, 0, 1, f(Yes, false, "ௌ")},
+ {0xbcd, 9, 1, 1, f(Yes, false, "")},
+ {0xbce, 0, 0, 0, f(Yes, false, "")},
+ {0xbd7, 0, 1, 1, f(Maybe, false, "")},
+ {0xbd8, 0, 0, 0, f(Yes, false, "")},
+ {0xc46, 0, 0, 0, f(Yes, true, "")},
+ {0xc47, 0, 0, 0, f(Yes, false, "")},
+ {0xc48, 0, 0, 1, f(Yes, false, "ై")},
+ {0xc49, 0, 0, 0, f(Yes, false, "")},
+ {0xc4d, 9, 1, 1, f(Yes, false, "")},
+ {0xc4e, 0, 0, 0, f(Yes, false, "")},
+ {0xc55, 84, 1, 1, f(Yes, false, "")},
+ {0xc56, 91, 1, 1, f(Maybe, false, "")},
+ {0xc57, 0, 0, 0, f(Yes, false, "")},
+ {0xcbc, 7, 1, 1, f(Yes, false, "")},
+ {0xcbd, 0, 0, 0, f(Yes, false, "")},
+ {0xcbf, 0, 0, 0, f(Yes, true, "")},
+ {0xcc0, 0, 0, 1, f(Yes, false, "ೀ")},
+ {0xcc1, 0, 0, 0, f(Yes, false, "")},
+ {0xcc2, 0, 1, 1, f(Maybe, false, "")},
+ {0xcc3, 0, 0, 0, f(Yes, false, "")},
+ {0xcc6, 0, 0, 0, f(Yes, true, "")},
+ {0xcc7, 0, 0, 1, f(Yes, false, "ೇ")},
+ {0xcc8, 0, 0, 1, f(Yes, false, "ೈ")},
+ {0xcc9, 0, 0, 0, f(Yes, false, "")},
+ {0xcca, 0, 0, 1, f(Yes, true, "ೊ")},
+ {0xccb, 0, 0, 2, f(Yes, false, "ೋ")},
+ {0xccc, 0, 0, 0, f(Yes, false, "")},
+ {0xccd, 9, 1, 1, f(Yes, false, "")},
+ {0xcce, 0, 0, 0, f(Yes, false, "")},
+ {0xcd5, 0, 1, 1, f(Maybe, false, "")},
+ {0xcd7, 0, 0, 0, f(Yes, false, "")},
+ {0xd3b, 9, 1, 1, f(Yes, false, "")},
+ {0xd3d, 0, 0, 0, f(Yes, false, "")},
+ {0xd3e, 0, 1, 1, f(Maybe, false, "")},
+ {0xd3f, 0, 0, 0, f(Yes, false, "")},
+ {0xd46, 0, 0, 0, f(Yes, true, "")},
+ {0xd48, 0, 0, 0, f(Yes, false, "")},
+ {0xd4a, 0, 0, 1, f(Yes, false, "ൊ")},
+ {0xd4b, 0, 0, 1, f(Yes, false, "ോ")},
+ {0xd4c, 0, 0, 1, f(Yes, false, "ൌ")},
+ {0xd4d, 9, 1, 1, f(Yes, false, "")},
+ {0xd4e, 0, 0, 0, f(Yes, false, "")},
+ {0xd57, 0, 1, 1, f(Maybe, false, "")},
+ {0xd58, 0, 0, 0, f(Yes, false, "")},
+ {0xdca, 9, 1, 1, f(Maybe, false, "")},
+ {0xdcb, 0, 0, 0, f(Yes, false, "")},
+ {0xdcf, 0, 1, 1, f(Maybe, false, "")},
+ {0xdd0, 0, 0, 0, f(Yes, false, "")},
+ {0xdd9, 0, 0, 0, f(Yes, true, "")},
+ {0xdda, 0, 0, 1, f(Yes, false, "ේ")},
+ {0xddb, 0, 0, 0, f(Yes, false, "")},
+ {0xddc, 0, 0, 1, f(Yes, true, "ො")},
+ {0xddd, 0, 0, 2, f(Yes, false, "ෝ")},
+ {0xdde, 0, 0, 1, f(Yes, false, "ෞ")},
+ {0xddf, 0, 1, 1, f(Maybe, false, "")},
+ {0xde0, 0, 0, 0, f(Yes, false, "")},
+ {0xe33, 0, 0, 0, g(Yes, No, false, false, "", "ํา")},
+ {0xe34, 0, 0, 0, f(Yes, false, "")},
+ {0xe38, 103, 1, 1, f(Yes, false, "")},
+ {0xe3a, 9, 1, 1, f(Yes, false, "")},
+ {0xe3b, 0, 0, 0, f(Yes, false, "")},
+ {0xe48, 107, 1, 1, f(Yes, false, "")},
+ {0xe4c, 0, 0, 0, f(Yes, false, "")},
+ {0xeb3, 0, 0, 0, g(Yes, No, false, false, "", "ໍາ")},
+ {0xeb4, 0, 0, 0, f(Yes, false, "")},
+ {0xeb8, 118, 1, 1, f(Yes, false, "")},
+ {0xeba, 0, 0, 0, f(Yes, false, "")},
+ {0xec8, 122, 1, 1, f(Yes, false, "")},
+ {0xecc, 0, 0, 0, f(Yes, false, "")},
+ {0xedc, 0, 0, 0, g(Yes, No, false, false, "", "ຫນ")},
+ {0xedd, 0, 0, 0, g(Yes, No, false, false, "", "ຫມ")},
+ {0xede, 0, 0, 0, f(Yes, false, "")},
+ {0xf0c, 0, 0, 0, g(Yes, No, false, false, "", "་")},
+ {0xf0d, 0, 0, 0, f(Yes, false, "")},
+ {0xf18, 220, 1, 1, f(Yes, false, "")},
+ {0xf1a, 0, 0, 0, f(Yes, false, "")},
+ {0xf35, 220, 1, 1, f(Yes, false, "")},
+ {0xf36, 0, 0, 0, f(Yes, false, "")},
+ {0xf37, 220, 1, 1, f(Yes, false, "")},
+ {0xf38, 0, 0, 0, f(Yes, false, "")},
+ {0xf39, 216, 1, 1, f(Yes, false, "")},
+ {0xf3a, 0, 0, 0, f(Yes, false, "")},
+ {0xf43, 0, 0, 0, f(No, false, "གྷ")},
+ {0xf44, 0, 0, 0, f(Yes, false, "")},
+ {0xf4d, 0, 0, 0, f(No, false, "ཌྷ")},
+ {0xf4e, 0, 0, 0, f(Yes, false, "")},
+ {0xf52, 0, 0, 0, f(No, false, "དྷ")},
+ {0xf53, 0, 0, 0, f(Yes, false, "")},
+ {0xf57, 0, 0, 0, f(No, false, "བྷ")},
+ {0xf58, 0, 0, 0, f(Yes, false, "")},
+ {0xf5c, 0, 0, 0, f(No, false, "ཛྷ")},
+ {0xf5d, 0, 0, 0, f(Yes, false, "")},
+ {0xf69, 0, 0, 0, f(No, false, "ཀྵ")},
+ {0xf6a, 0, 0, 0, f(Yes, false, "")},
+ {0xf71, 129, 1, 1, f(Yes, false, "")},
+ {0xf72, 130, 1, 1, f(Yes, false, "")},
+ {0xf73, 0, 2, 2, f(No, false, "ཱི")},
+ {0xf74, 132, 1, 1, f(Yes, false, "")},
+ {0xf75, 0, 2, 2, f(No, false, "ཱུ")},
+ {0xf76, 0, 0, 1, f(No, false, "ྲྀ")},
+ {0xf77, 0, 0, 2, g(Yes, No, false, false, "", "ྲཱྀ")},
+ {0xf78, 0, 0, 1, f(No, false, "ླྀ")},
+ {0xf79, 0, 0, 2, g(Yes, No, false, false, "", "ླཱྀ")},
+ {0xf7a, 130, 1, 1, f(Yes, false, "")},
+ {0xf7e, 0, 0, 0, f(Yes, false, "")},
+ {0xf80, 130, 1, 1, f(Yes, false, "")},
+ {0xf81, 0, 2, 2, f(No, false, "ཱྀ")},
+ {0xf82, 230, 1, 1, f(Yes, false, "")},
+ {0xf84, 9, 1, 1, f(Yes, false, "")},
+ {0xf85, 0, 0, 0, f(Yes, false, "")},
+ {0xf86, 230, 1, 1, f(Yes, false, "")},
+ {0xf88, 0, 0, 0, f(Yes, false, "")},
+ {0xf93, 0, 0, 0, f(No, false, "ྒྷ")},
+ {0xf94, 0, 0, 0, f(Yes, false, "")},
+ {0xf9d, 0, 0, 0, f(No, false, "ྜྷ")},
+ {0xf9e, 0, 0, 0, f(Yes, false, "")},
+ {0xfa2, 0, 0, 0, f(No, false, "ྡྷ")},
+ {0xfa3, 0, 0, 0, f(Yes, false, "")},
+ {0xfa7, 0, 0, 0, f(No, false, "ྦྷ")},
+ {0xfa8, 0, 0, 0, f(Yes, false, "")},
+ {0xfac, 0, 0, 0, f(No, false, "ྫྷ")},
+ {0xfad, 0, 0, 0, f(Yes, false, "")},
+ {0xfb9, 0, 0, 0, f(No, false, "ྐྵ")},
+ {0xfba, 0, 0, 0, f(Yes, false, "")},
+ {0xfc6, 220, 1, 1, f(Yes, false, "")},
+ {0xfc7, 0, 0, 0, f(Yes, false, "")},
+ {0x1025, 0, 0, 0, f(Yes, true, "")},
+ {0x1026, 0, 0, 1, f(Yes, false, "ဦ")},
+ {0x1027, 0, 0, 0, f(Yes, false, "")},
+ {0x102e, 0, 1, 1, f(Maybe, false, "")},
+ {0x102f, 0, 0, 0, f(Yes, false, "")},
+ {0x1037, 7, 1, 1, f(Yes, false, "")},
+ {0x1038, 0, 0, 0, f(Yes, false, "")},
+ {0x1039, 9, 1, 1, f(Yes, false, "")},
+ {0x103b, 0, 0, 0, f(Yes, false, "")},
+ {0x108d, 220, 1, 1, f(Yes, false, "")},
+ {0x108e, 0, 0, 0, f(Yes, false, "")},
+ {0x10fc, 0, 0, 0, g(Yes, No, false, false, "", "ნ")},
+ {0x10fd, 0, 0, 0, f(Yes, false, "")},
+ {0x1100, 0, 0, 0, f(Yes, true, "")},
+ {0x1113, 0, 0, 0, f(Yes, false, "")},
+ {0x1161, 0, 1, 1, f(Maybe, true, "")},
+ {0x1176, 0, 0, 0, f(Yes, false, "")},
+ {0x11a8, 0, 1, 1, f(Maybe, false, "")},
+ {0x11c3, 0, 0, 0, f(Yes, false, "")},
+ {0x135d, 230, 1, 1, f(Yes, false, "")},
+ {0x1360, 0, 0, 0, f(Yes, false, "")},
+ {0x1714, 9, 1, 1, f(Yes, false, "")},
+ {0x1715, 0, 0, 0, f(Yes, false, "")},
+ {0x1734, 9, 1, 1, f(Yes, false, "")},
+ {0x1735, 0, 0, 0, f(Yes, false, "")},
+ {0x17d2, 9, 1, 1, f(Yes, false, "")},
+ {0x17d3, 0, 0, 0, f(Yes, false, "")},
+ {0x17dd, 230, 1, 1, f(Yes, false, "")},
+ {0x17de, 0, 0, 0, f(Yes, false, "")},
+ {0x18a9, 228, 1, 1, f(Yes, false, "")},
+ {0x18aa, 0, 0, 0, f(Yes, false, "")},
+ {0x1939, 222, 1, 1, f(Yes, false, "")},
+ {0x193a, 230, 1, 1, f(Yes, false, "")},
+ {0x193b, 220, 1, 1, f(Yes, false, "")},
+ {0x193c, 0, 0, 0, f(Yes, false, "")},
+ {0x1a17, 230, 1, 1, f(Yes, false, "")},
+ {0x1a18, 220, 1, 1, f(Yes, false, "")},
+ {0x1a19, 0, 0, 0, f(Yes, false, "")},
+ {0x1a60, 9, 1, 1, f(Yes, false, "")},
+ {0x1a61, 0, 0, 0, f(Yes, false, "")},
+ {0x1a75, 230, 1, 1, f(Yes, false, "")},
+ {0x1a7d, 0, 0, 0, f(Yes, false, "")},
+ {0x1a7f, 220, 1, 1, f(Yes, false, "")},
+ {0x1a80, 0, 0, 0, f(Yes, false, "")},
+ {0x1ab0, 230, 1, 1, f(Yes, false, "")},
+ {0x1ab5, 220, 1, 1, f(Yes, false, "")},
+ {0x1abb, 230, 1, 1, f(Yes, false, "")},
+ {0x1abd, 220, 1, 1, f(Yes, false, "")},
+ {0x1abe, 0, 0, 0, f(Yes, false, "")},
+ {0x1b05, 0, 0, 0, f(Yes, true, "")},
+ {0x1b06, 0, 0, 1, f(Yes, false, "ᬆ")},
+ {0x1b07, 0, 0, 0, f(Yes, true, "")},
+ {0x1b08, 0, 0, 1, f(Yes, false, "ᬈ")},
+ {0x1b09, 0, 0, 0, f(Yes, true, "")},
+ {0x1b0a, 0, 0, 1, f(Yes, false, "ᬊ")},
+ {0x1b0b, 0, 0, 0, f(Yes, true, "")},
+ {0x1b0c, 0, 0, 1, f(Yes, false, "ᬌ")},
+ {0x1b0d, 0, 0, 0, f(Yes, true, "")},
+ {0x1b0e, 0, 0, 1, f(Yes, false, "ᬎ")},
+ {0x1b0f, 0, 0, 0, f(Yes, false, "")},
+ {0x1b11, 0, 0, 0, f(Yes, true, "")},
+ {0x1b12, 0, 0, 1, f(Yes, false, "ᬒ")},
+ {0x1b13, 0, 0, 0, f(Yes, false, "")},
+ {0x1b34, 7, 1, 1, f(Yes, false, "")},
+ {0x1b35, 0, 1, 1, f(Maybe, false, "")},
+ {0x1b36, 0, 0, 0, f(Yes, false, "")},
+ {0x1b3a, 0, 0, 0, f(Yes, true, "")},
+ {0x1b3b, 0, 0, 1, f(Yes, false, "ᬻ")},
+ {0x1b3c, 0, 0, 0, f(Yes, true, "")},
+ {0x1b3d, 0, 0, 1, f(Yes, false, "ᬽ")},
+ {0x1b3e, 0, 0, 0, f(Yes, true, "")},
+ {0x1b40, 0, 0, 1, f(Yes, false, "ᭀ")},
+ {0x1b41, 0, 0, 1, f(Yes, false, "ᭁ")},
+ {0x1b42, 0, 0, 0, f(Yes, true, "")},
+ {0x1b43, 0, 0, 1, f(Yes, false, "ᭃ")},
+ {0x1b44, 9, 1, 1, f(Yes, false, "")},
+ {0x1b45, 0, 0, 0, f(Yes, false, "")},
+ {0x1b6b, 230, 1, 1, f(Yes, false, "")},
+ {0x1b6c, 220, 1, 1, f(Yes, false, "")},
+ {0x1b6d, 230, 1, 1, f(Yes, false, "")},
+ {0x1b74, 0, 0, 0, f(Yes, false, "")},
+ {0x1baa, 9, 1, 1, f(Yes, false, "")},
+ {0x1bac, 0, 0, 0, f(Yes, false, "")},
+ {0x1be6, 7, 1, 1, f(Yes, false, "")},
+ {0x1be7, 0, 0, 0, f(Yes, false, "")},
+ {0x1bf2, 9, 1, 1, f(Yes, false, "")},
+ {0x1bf4, 0, 0, 0, f(Yes, false, "")},
+ {0x1c37, 7, 1, 1, f(Yes, false, "")},
+ {0x1c38, 0, 0, 0, f(Yes, false, "")},
+ {0x1cd0, 230, 1, 1, f(Yes, false, "")},
+ {0x1cd3, 0, 0, 0, f(Yes, false, "")},
+ {0x1cd4, 1, 1, 1, f(Yes, false, "")},
+ {0x1cd5, 220, 1, 1, f(Yes, false, "")},
+ {0x1cda, 230, 1, 1, f(Yes, false, "")},
+ {0x1cdc, 220, 1, 1, f(Yes, false, "")},
+ {0x1ce0, 230, 1, 1, f(Yes, false, "")},
+ {0x1ce1, 0, 0, 0, f(Yes, false, "")},
+ {0x1ce2, 1, 1, 1, f(Yes, false, "")},
+ {0x1ce9, 0, 0, 0, f(Yes, false, "")},
+ {0x1ced, 220, 1, 1, f(Yes, false, "")},
+ {0x1cee, 0, 0, 0, f(Yes, false, "")},
+ {0x1cf4, 230, 1, 1, f(Yes, false, "")},
+ {0x1cf5, 0, 0, 0, f(Yes, false, "")},
+ {0x1cf8, 230, 1, 1, f(Yes, false, "")},
+ {0x1cfa, 0, 0, 0, f(Yes, false, "")},
+ {0x1d2c, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d2d, 0, 0, 0, g(Yes, No, false, false, "", "Æ")},
+ {0x1d2e, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d2f, 0, 0, 0, f(Yes, false, "")},
+ {0x1d30, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d31, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d32, 0, 0, 0, g(Yes, No, false, false, "", "Ǝ")},
+ {0x1d33, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d34, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1d35, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d36, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d37, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d38, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d39, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d3a, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d3b, 0, 0, 0, f(Yes, false, "")},
+ {0x1d3c, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d3d, 0, 0, 0, g(Yes, No, false, false, "", "Ȣ")},
+ {0x1d3e, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d3f, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1d40, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d41, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d42, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d43, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d44, 0, 0, 0, g(Yes, No, false, false, "", "ɐ")},
+ {0x1d45, 0, 0, 0, g(Yes, No, false, false, "", "ɑ")},
+ {0x1d46, 0, 0, 0, g(Yes, No, false, false, "", "ᴂ")},
+ {0x1d47, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d48, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d49, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d4a, 0, 0, 0, g(Yes, No, false, false, "", "ə")},
+ {0x1d4b, 0, 0, 0, g(Yes, No, false, false, "", "ɛ")},
+ {0x1d4c, 0, 0, 0, g(Yes, No, false, false, "", "ɜ")},
+ {0x1d4d, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d4e, 0, 0, 0, f(Yes, false, "")},
+ {0x1d4f, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d50, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d51, 0, 0, 0, g(Yes, No, false, false, "", "ŋ")},
+ {0x1d52, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d53, 0, 0, 0, g(Yes, No, false, false, "", "ɔ")},
+ {0x1d54, 0, 0, 0, g(Yes, No, false, false, "", "ᴖ")},
+ {0x1d55, 0, 0, 0, g(Yes, No, false, false, "", "ᴗ")},
+ {0x1d56, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d57, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d58, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d59, 0, 0, 0, g(Yes, No, false, false, "", "ᴝ")},
+ {0x1d5a, 0, 0, 0, g(Yes, No, false, false, "", "ɯ")},
+ {0x1d5b, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d5c, 0, 0, 0, g(Yes, No, false, false, "", "ᴥ")},
+ {0x1d5d, 0, 0, 0, g(Yes, No, false, false, "", "β")},
+ {0x1d5e, 0, 0, 0, g(Yes, No, false, false, "", "γ")},
+ {0x1d5f, 0, 0, 0, g(Yes, No, false, false, "", "δ")},
+ {0x1d60, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d61, 0, 0, 0, g(Yes, No, false, false, "", "χ")},
+ {0x1d62, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d63, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d64, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d65, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d66, 0, 0, 0, g(Yes, No, false, false, "", "β")},
+ {0x1d67, 0, 0, 0, g(Yes, No, false, false, "", "γ")},
+ {0x1d68, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x1d69, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d6a, 0, 0, 0, g(Yes, No, false, false, "", "χ")},
+ {0x1d6b, 0, 0, 0, f(Yes, false, "")},
+ {0x1d78, 0, 0, 0, g(Yes, No, false, false, "", "н")},
+ {0x1d79, 0, 0, 0, f(Yes, false, "")},
+ {0x1d9b, 0, 0, 0, g(Yes, No, false, false, "", "ɒ")},
+ {0x1d9c, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d9d, 0, 0, 0, g(Yes, No, false, false, "", "ɕ")},
+ {0x1d9e, 0, 0, 0, g(Yes, No, false, false, "", "ð")},
+ {0x1d9f, 0, 0, 0, g(Yes, No, false, false, "", "ɜ")},
+ {0x1da0, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1da1, 0, 0, 0, g(Yes, No, false, false, "", "ɟ")},
+ {0x1da2, 0, 0, 0, g(Yes, No, false, false, "", "ɡ")},
+ {0x1da3, 0, 0, 0, g(Yes, No, false, false, "", "ɥ")},
+ {0x1da4, 0, 0, 0, g(Yes, No, false, false, "", "ɨ")},
+ {0x1da5, 0, 0, 0, g(Yes, No, false, false, "", "ɩ")},
+ {0x1da6, 0, 0, 0, g(Yes, No, false, false, "", "ɪ")},
+ {0x1da7, 0, 0, 0, g(Yes, No, false, false, "", "ᵻ")},
+ {0x1da8, 0, 0, 0, g(Yes, No, false, false, "", "ʝ")},
+ {0x1da9, 0, 0, 0, g(Yes, No, false, false, "", "ɭ")},
+ {0x1daa, 0, 0, 0, g(Yes, No, false, false, "", "ᶅ")},
+ {0x1dab, 0, 0, 0, g(Yes, No, false, false, "", "ʟ")},
+ {0x1dac, 0, 0, 0, g(Yes, No, false, false, "", "ɱ")},
+ {0x1dad, 0, 0, 0, g(Yes, No, false, false, "", "ɰ")},
+ {0x1dae, 0, 0, 0, g(Yes, No, false, false, "", "ɲ")},
+ {0x1daf, 0, 0, 0, g(Yes, No, false, false, "", "ɳ")},
+ {0x1db0, 0, 0, 0, g(Yes, No, false, false, "", "ɴ")},
+ {0x1db1, 0, 0, 0, g(Yes, No, false, false, "", "ɵ")},
+ {0x1db2, 0, 0, 0, g(Yes, No, false, false, "", "ɸ")},
+ {0x1db3, 0, 0, 0, g(Yes, No, false, false, "", "ʂ")},
+ {0x1db4, 0, 0, 0, g(Yes, No, false, false, "", "ʃ")},
+ {0x1db5, 0, 0, 0, g(Yes, No, false, false, "", "ƫ")},
+ {0x1db6, 0, 0, 0, g(Yes, No, false, false, "", "ʉ")},
+ {0x1db7, 0, 0, 0, g(Yes, No, false, false, "", "ʊ")},
+ {0x1db8, 0, 0, 0, g(Yes, No, false, false, "", "ᴜ")},
+ {0x1db9, 0, 0, 0, g(Yes, No, false, false, "", "ʋ")},
+ {0x1dba, 0, 0, 0, g(Yes, No, false, false, "", "ʌ")},
+ {0x1dbb, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1dbc, 0, 0, 0, g(Yes, No, false, false, "", "ʐ")},
+ {0x1dbd, 0, 0, 0, g(Yes, No, false, false, "", "ʑ")},
+ {0x1dbe, 0, 0, 0, g(Yes, No, false, false, "", "ʒ")},
+ {0x1dbf, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x1dc0, 230, 1, 1, f(Yes, false, "")},
+ {0x1dc2, 220, 1, 1, f(Yes, false, "")},
+ {0x1dc3, 230, 1, 1, f(Yes, false, "")},
+ {0x1dca, 220, 1, 1, f(Yes, false, "")},
+ {0x1dcb, 230, 1, 1, f(Yes, false, "")},
+ {0x1dcd, 234, 1, 1, f(Yes, false, "")},
+ {0x1dce, 214, 1, 1, f(Yes, false, "")},
+ {0x1dcf, 220, 1, 1, f(Yes, false, "")},
+ {0x1dd0, 202, 1, 1, f(Yes, false, "")},
+ {0x1dd1, 230, 1, 1, f(Yes, false, "")},
+ {0x1df6, 232, 1, 1, f(Yes, false, "")},
+ {0x1df7, 228, 1, 1, f(Yes, false, "")},
+ {0x1df9, 220, 1, 1, f(Yes, false, "")},
+ {0x1dfa, 0, 0, 0, f(Yes, false, "")},
+ {0x1dfb, 230, 1, 1, f(Yes, false, "")},
+ {0x1dfc, 233, 1, 1, f(Yes, false, "")},
+ {0x1dfd, 220, 1, 1, f(Yes, false, "")},
+ {0x1dfe, 230, 1, 1, f(Yes, false, "")},
+ {0x1dff, 220, 1, 1, f(Yes, false, "")},
+ {0x1e00, 0, 0, 1, f(Yes, false, "Ḁ")},
+ {0x1e01, 0, 0, 1, f(Yes, false, "ḁ")},
+ {0x1e02, 0, 0, 1, f(Yes, false, "Ḃ")},
+ {0x1e03, 0, 0, 1, f(Yes, false, "ḃ")},
+ {0x1e04, 0, 0, 1, f(Yes, false, "Ḅ")},
+ {0x1e05, 0, 0, 1, f(Yes, false, "ḅ")},
+ {0x1e06, 0, 0, 1, f(Yes, false, "Ḇ")},
+ {0x1e07, 0, 0, 1, f(Yes, false, "ḇ")},
+ {0x1e08, 0, 0, 2, f(Yes, false, "Ḉ")},
+ {0x1e09, 0, 0, 2, f(Yes, false, "ḉ")},
+ {0x1e0a, 0, 0, 1, f(Yes, false, "Ḋ")},
+ {0x1e0b, 0, 0, 1, f(Yes, false, "ḋ")},
+ {0x1e0c, 0, 0, 1, f(Yes, false, "Ḍ")},
+ {0x1e0d, 0, 0, 1, f(Yes, false, "ḍ")},
+ {0x1e0e, 0, 0, 1, f(Yes, false, "Ḏ")},
+ {0x1e0f, 0, 0, 1, f(Yes, false, "ḏ")},
+ {0x1e10, 0, 0, 1, f(Yes, false, "Ḑ")},
+ {0x1e11, 0, 0, 1, f(Yes, false, "ḑ")},
+ {0x1e12, 0, 0, 1, f(Yes, false, "Ḓ")},
+ {0x1e13, 0, 0, 1, f(Yes, false, "ḓ")},
+ {0x1e14, 0, 0, 2, f(Yes, false, "Ḕ")},
+ {0x1e15, 0, 0, 2, f(Yes, false, "ḕ")},
+ {0x1e16, 0, 0, 2, f(Yes, false, "Ḗ")},
+ {0x1e17, 0, 0, 2, f(Yes, false, "ḗ")},
+ {0x1e18, 0, 0, 1, f(Yes, false, "Ḙ")},
+ {0x1e19, 0, 0, 1, f(Yes, false, "ḙ")},
+ {0x1e1a, 0, 0, 1, f(Yes, false, "Ḛ")},
+ {0x1e1b, 0, 0, 1, f(Yes, false, "ḛ")},
+ {0x1e1c, 0, 0, 2, f(Yes, false, "Ḝ")},
+ {0x1e1d, 0, 0, 2, f(Yes, false, "ḝ")},
+ {0x1e1e, 0, 0, 1, f(Yes, false, "Ḟ")},
+ {0x1e1f, 0, 0, 1, f(Yes, false, "ḟ")},
+ {0x1e20, 0, 0, 1, f(Yes, false, "Ḡ")},
+ {0x1e21, 0, 0, 1, f(Yes, false, "ḡ")},
+ {0x1e22, 0, 0, 1, f(Yes, false, "Ḣ")},
+ {0x1e23, 0, 0, 1, f(Yes, false, "ḣ")},
+ {0x1e24, 0, 0, 1, f(Yes, false, "Ḥ")},
+ {0x1e25, 0, 0, 1, f(Yes, false, "ḥ")},
+ {0x1e26, 0, 0, 1, f(Yes, false, "Ḧ")},
+ {0x1e27, 0, 0, 1, f(Yes, false, "ḧ")},
+ {0x1e28, 0, 0, 1, f(Yes, false, "Ḩ")},
+ {0x1e29, 0, 0, 1, f(Yes, false, "ḩ")},
+ {0x1e2a, 0, 0, 1, f(Yes, false, "Ḫ")},
+ {0x1e2b, 0, 0, 1, f(Yes, false, "ḫ")},
+ {0x1e2c, 0, 0, 1, f(Yes, false, "Ḭ")},
+ {0x1e2d, 0, 0, 1, f(Yes, false, "ḭ")},
+ {0x1e2e, 0, 0, 2, f(Yes, false, "Ḯ")},
+ {0x1e2f, 0, 0, 2, f(Yes, false, "ḯ")},
+ {0x1e30, 0, 0, 1, f(Yes, false, "Ḱ")},
+ {0x1e31, 0, 0, 1, f(Yes, false, "ḱ")},
+ {0x1e32, 0, 0, 1, f(Yes, false, "Ḳ")},
+ {0x1e33, 0, 0, 1, f(Yes, false, "ḳ")},
+ {0x1e34, 0, 0, 1, f(Yes, false, "Ḵ")},
+ {0x1e35, 0, 0, 1, f(Yes, false, "ḵ")},
+ {0x1e36, 0, 0, 1, f(Yes, true, "Ḷ")},
+ {0x1e37, 0, 0, 1, f(Yes, true, "ḷ")},
+ {0x1e38, 0, 0, 2, f(Yes, false, "Ḹ")},
+ {0x1e39, 0, 0, 2, f(Yes, false, "ḹ")},
+ {0x1e3a, 0, 0, 1, f(Yes, false, "Ḻ")},
+ {0x1e3b, 0, 0, 1, f(Yes, false, "ḻ")},
+ {0x1e3c, 0, 0, 1, f(Yes, false, "Ḽ")},
+ {0x1e3d, 0, 0, 1, f(Yes, false, "ḽ")},
+ {0x1e3e, 0, 0, 1, f(Yes, false, "Ḿ")},
+ {0x1e3f, 0, 0, 1, f(Yes, false, "ḿ")},
+ {0x1e40, 0, 0, 1, f(Yes, false, "Ṁ")},
+ {0x1e41, 0, 0, 1, f(Yes, false, "ṁ")},
+ {0x1e42, 0, 0, 1, f(Yes, false, "Ṃ")},
+ {0x1e43, 0, 0, 1, f(Yes, false, "ṃ")},
+ {0x1e44, 0, 0, 1, f(Yes, false, "Ṅ")},
+ {0x1e45, 0, 0, 1, f(Yes, false, "ṅ")},
+ {0x1e46, 0, 0, 1, f(Yes, false, "Ṇ")},
+ {0x1e47, 0, 0, 1, f(Yes, false, "ṇ")},
+ {0x1e48, 0, 0, 1, f(Yes, false, "Ṉ")},
+ {0x1e49, 0, 0, 1, f(Yes, false, "ṉ")},
+ {0x1e4a, 0, 0, 1, f(Yes, false, "Ṋ")},
+ {0x1e4b, 0, 0, 1, f(Yes, false, "ṋ")},
+ {0x1e4c, 0, 0, 2, f(Yes, false, "Ṍ")},
+ {0x1e4d, 0, 0, 2, f(Yes, false, "ṍ")},
+ {0x1e4e, 0, 0, 2, f(Yes, false, "Ṏ")},
+ {0x1e4f, 0, 0, 2, f(Yes, false, "ṏ")},
+ {0x1e50, 0, 0, 2, f(Yes, false, "Ṑ")},
+ {0x1e51, 0, 0, 2, f(Yes, false, "ṑ")},
+ {0x1e52, 0, 0, 2, f(Yes, false, "Ṓ")},
+ {0x1e53, 0, 0, 2, f(Yes, false, "ṓ")},
+ {0x1e54, 0, 0, 1, f(Yes, false, "Ṕ")},
+ {0x1e55, 0, 0, 1, f(Yes, false, "ṕ")},
+ {0x1e56, 0, 0, 1, f(Yes, false, "Ṗ")},
+ {0x1e57, 0, 0, 1, f(Yes, false, "ṗ")},
+ {0x1e58, 0, 0, 1, f(Yes, false, "Ṙ")},
+ {0x1e59, 0, 0, 1, f(Yes, false, "ṙ")},
+ {0x1e5a, 0, 0, 1, f(Yes, true, "Ṛ")},
+ {0x1e5b, 0, 0, 1, f(Yes, true, "ṛ")},
+ {0x1e5c, 0, 0, 2, f(Yes, false, "Ṝ")},
+ {0x1e5d, 0, 0, 2, f(Yes, false, "ṝ")},
+ {0x1e5e, 0, 0, 1, f(Yes, false, "Ṟ")},
+ {0x1e5f, 0, 0, 1, f(Yes, false, "ṟ")},
+ {0x1e60, 0, 0, 1, f(Yes, false, "Ṡ")},
+ {0x1e61, 0, 0, 1, f(Yes, false, "ṡ")},
+ {0x1e62, 0, 0, 1, f(Yes, true, "Ṣ")},
+ {0x1e63, 0, 0, 1, f(Yes, true, "ṣ")},
+ {0x1e64, 0, 0, 2, f(Yes, false, "Ṥ")},
+ {0x1e65, 0, 0, 2, f(Yes, false, "ṥ")},
+ {0x1e66, 0, 0, 2, f(Yes, false, "Ṧ")},
+ {0x1e67, 0, 0, 2, f(Yes, false, "ṧ")},
+ {0x1e68, 0, 0, 2, f(Yes, false, "Ṩ")},
+ {0x1e69, 0, 0, 2, f(Yes, false, "ṩ")},
+ {0x1e6a, 0, 0, 1, f(Yes, false, "Ṫ")},
+ {0x1e6b, 0, 0, 1, f(Yes, false, "ṫ")},
+ {0x1e6c, 0, 0, 1, f(Yes, false, "Ṭ")},
+ {0x1e6d, 0, 0, 1, f(Yes, false, "ṭ")},
+ {0x1e6e, 0, 0, 1, f(Yes, false, "Ṯ")},
+ {0x1e6f, 0, 0, 1, f(Yes, false, "ṯ")},
+ {0x1e70, 0, 0, 1, f(Yes, false, "Ṱ")},
+ {0x1e71, 0, 0, 1, f(Yes, false, "ṱ")},
+ {0x1e72, 0, 0, 1, f(Yes, false, "Ṳ")},
+ {0x1e73, 0, 0, 1, f(Yes, false, "ṳ")},
+ {0x1e74, 0, 0, 1, f(Yes, false, "Ṵ")},
+ {0x1e75, 0, 0, 1, f(Yes, false, "ṵ")},
+ {0x1e76, 0, 0, 1, f(Yes, false, "Ṷ")},
+ {0x1e77, 0, 0, 1, f(Yes, false, "ṷ")},
+ {0x1e78, 0, 0, 2, f(Yes, false, "Ṹ")},
+ {0x1e79, 0, 0, 2, f(Yes, false, "ṹ")},
+ {0x1e7a, 0, 0, 2, f(Yes, false, "Ṻ")},
+ {0x1e7b, 0, 0, 2, f(Yes, false, "ṻ")},
+ {0x1e7c, 0, 0, 1, f(Yes, false, "Ṽ")},
+ {0x1e7d, 0, 0, 1, f(Yes, false, "ṽ")},
+ {0x1e7e, 0, 0, 1, f(Yes, false, "Ṿ")},
+ {0x1e7f, 0, 0, 1, f(Yes, false, "ṿ")},
+ {0x1e80, 0, 0, 1, f(Yes, false, "Ẁ")},
+ {0x1e81, 0, 0, 1, f(Yes, false, "ẁ")},
+ {0x1e82, 0, 0, 1, f(Yes, false, "Ẃ")},
+ {0x1e83, 0, 0, 1, f(Yes, false, "ẃ")},
+ {0x1e84, 0, 0, 1, f(Yes, false, "Ẅ")},
+ {0x1e85, 0, 0, 1, f(Yes, false, "ẅ")},
+ {0x1e86, 0, 0, 1, f(Yes, false, "Ẇ")},
+ {0x1e87, 0, 0, 1, f(Yes, false, "ẇ")},
+ {0x1e88, 0, 0, 1, f(Yes, false, "Ẉ")},
+ {0x1e89, 0, 0, 1, f(Yes, false, "ẉ")},
+ {0x1e8a, 0, 0, 1, f(Yes, false, "Ẋ")},
+ {0x1e8b, 0, 0, 1, f(Yes, false, "ẋ")},
+ {0x1e8c, 0, 0, 1, f(Yes, false, "Ẍ")},
+ {0x1e8d, 0, 0, 1, f(Yes, false, "ẍ")},
+ {0x1e8e, 0, 0, 1, f(Yes, false, "Ẏ")},
+ {0x1e8f, 0, 0, 1, f(Yes, false, "ẏ")},
+ {0x1e90, 0, 0, 1, f(Yes, false, "Ẑ")},
+ {0x1e91, 0, 0, 1, f(Yes, false, "ẑ")},
+ {0x1e92, 0, 0, 1, f(Yes, false, "Ẓ")},
+ {0x1e93, 0, 0, 1, f(Yes, false, "ẓ")},
+ {0x1e94, 0, 0, 1, f(Yes, false, "Ẕ")},
+ {0x1e95, 0, 0, 1, f(Yes, false, "ẕ")},
+ {0x1e96, 0, 0, 1, f(Yes, false, "ẖ")},
+ {0x1e97, 0, 0, 1, f(Yes, false, "ẗ")},
+ {0x1e98, 0, 0, 1, f(Yes, false, "ẘ")},
+ {0x1e99, 0, 0, 1, f(Yes, false, "ẙ")},
+ {0x1e9a, 0, 0, 0, g(Yes, No, false, false, "", "aʾ")},
+ {0x1e9b, 0, 0, 1, g(Yes, No, false, false, "ẛ", "ṡ")},
+ {0x1e9c, 0, 0, 0, f(Yes, false, "")},
+ {0x1ea0, 0, 0, 1, f(Yes, true, "Ạ")},
+ {0x1ea1, 0, 0, 1, f(Yes, true, "ạ")},
+ {0x1ea2, 0, 0, 1, f(Yes, false, "Ả")},
+ {0x1ea3, 0, 0, 1, f(Yes, false, "ả")},
+ {0x1ea4, 0, 0, 2, f(Yes, false, "Ấ")},
+ {0x1ea5, 0, 0, 2, f(Yes, false, "ấ")},
+ {0x1ea6, 0, 0, 2, f(Yes, false, "Ầ")},
+ {0x1ea7, 0, 0, 2, f(Yes, false, "ầ")},
+ {0x1ea8, 0, 0, 2, f(Yes, false, "Ẩ")},
+ {0x1ea9, 0, 0, 2, f(Yes, false, "ẩ")},
+ {0x1eaa, 0, 0, 2, f(Yes, false, "Ẫ")},
+ {0x1eab, 0, 0, 2, f(Yes, false, "ẫ")},
+ {0x1eac, 0, 0, 2, f(Yes, false, "Ậ")},
+ {0x1ead, 0, 0, 2, f(Yes, false, "ậ")},
+ {0x1eae, 0, 0, 2, f(Yes, false, "Ắ")},
+ {0x1eaf, 0, 0, 2, f(Yes, false, "ắ")},
+ {0x1eb0, 0, 0, 2, f(Yes, false, "Ằ")},
+ {0x1eb1, 0, 0, 2, f(Yes, false, "ằ")},
+ {0x1eb2, 0, 0, 2, f(Yes, false, "Ẳ")},
+ {0x1eb3, 0, 0, 2, f(Yes, false, "ẳ")},
+ {0x1eb4, 0, 0, 2, f(Yes, false, "Ẵ")},
+ {0x1eb5, 0, 0, 2, f(Yes, false, "ẵ")},
+ {0x1eb6, 0, 0, 2, f(Yes, false, "Ặ")},
+ {0x1eb7, 0, 0, 2, f(Yes, false, "ặ")},
+ {0x1eb8, 0, 0, 1, f(Yes, true, "Ẹ")},
+ {0x1eb9, 0, 0, 1, f(Yes, true, "ẹ")},
+ {0x1eba, 0, 0, 1, f(Yes, false, "Ẻ")},
+ {0x1ebb, 0, 0, 1, f(Yes, false, "ẻ")},
+ {0x1ebc, 0, 0, 1, f(Yes, false, "Ẽ")},
+ {0x1ebd, 0, 0, 1, f(Yes, false, "ẽ")},
+ {0x1ebe, 0, 0, 2, f(Yes, false, "Ế")},
+ {0x1ebf, 0, 0, 2, f(Yes, false, "ế")},
+ {0x1ec0, 0, 0, 2, f(Yes, false, "Ề")},
+ {0x1ec1, 0, 0, 2, f(Yes, false, "ề")},
+ {0x1ec2, 0, 0, 2, f(Yes, false, "Ể")},
+ {0x1ec3, 0, 0, 2, f(Yes, false, "ể")},
+ {0x1ec4, 0, 0, 2, f(Yes, false, "Ễ")},
+ {0x1ec5, 0, 0, 2, f(Yes, false, "ễ")},
+ {0x1ec6, 0, 0, 2, f(Yes, false, "Ệ")},
+ {0x1ec7, 0, 0, 2, f(Yes, false, "ệ")},
+ {0x1ec8, 0, 0, 1, f(Yes, false, "Ỉ")},
+ {0x1ec9, 0, 0, 1, f(Yes, false, "ỉ")},
+ {0x1eca, 0, 0, 1, f(Yes, false, "Ị")},
+ {0x1ecb, 0, 0, 1, f(Yes, false, "ị")},
+ {0x1ecc, 0, 0, 1, f(Yes, true, "Ọ")},
+ {0x1ecd, 0, 0, 1, f(Yes, true, "ọ")},
+ {0x1ece, 0, 0, 1, f(Yes, false, "Ỏ")},
+ {0x1ecf, 0, 0, 1, f(Yes, false, "ỏ")},
+ {0x1ed0, 0, 0, 2, f(Yes, false, "Ố")},
+ {0x1ed1, 0, 0, 2, f(Yes, false, "ố")},
+ {0x1ed2, 0, 0, 2, f(Yes, false, "Ồ")},
+ {0x1ed3, 0, 0, 2, f(Yes, false, "ồ")},
+ {0x1ed4, 0, 0, 2, f(Yes, false, "Ổ")},
+ {0x1ed5, 0, 0, 2, f(Yes, false, "ổ")},
+ {0x1ed6, 0, 0, 2, f(Yes, false, "Ỗ")},
+ {0x1ed7, 0, 0, 2, f(Yes, false, "ỗ")},
+ {0x1ed8, 0, 0, 2, f(Yes, false, "Ộ")},
+ {0x1ed9, 0, 0, 2, f(Yes, false, "ộ")},
+ {0x1eda, 0, 0, 2, f(Yes, false, "Ớ")},
+ {0x1edb, 0, 0, 2, f(Yes, false, "ớ")},
+ {0x1edc, 0, 0, 2, f(Yes, false, "Ờ")},
+ {0x1edd, 0, 0, 2, f(Yes, false, "ờ")},
+ {0x1ede, 0, 0, 2, f(Yes, false, "Ở")},
+ {0x1edf, 0, 0, 2, f(Yes, false, "ở")},
+ {0x1ee0, 0, 0, 2, f(Yes, false, "Ỡ")},
+ {0x1ee1, 0, 0, 2, f(Yes, false, "ỡ")},
+ {0x1ee2, 0, 0, 2, f(Yes, false, "Ợ")},
+ {0x1ee3, 0, 0, 2, f(Yes, false, "ợ")},
+ {0x1ee4, 0, 0, 1, f(Yes, false, "Ụ")},
+ {0x1ee5, 0, 0, 1, f(Yes, false, "ụ")},
+ {0x1ee6, 0, 0, 1, f(Yes, false, "Ủ")},
+ {0x1ee7, 0, 0, 1, f(Yes, false, "ủ")},
+ {0x1ee8, 0, 0, 2, f(Yes, false, "Ứ")},
+ {0x1ee9, 0, 0, 2, f(Yes, false, "ứ")},
+ {0x1eea, 0, 0, 2, f(Yes, false, "Ừ")},
+ {0x1eeb, 0, 0, 2, f(Yes, false, "ừ")},
+ {0x1eec, 0, 0, 2, f(Yes, false, "Ử")},
+ {0x1eed, 0, 0, 2, f(Yes, false, "ử")},
+ {0x1eee, 0, 0, 2, f(Yes, false, "Ữ")},
+ {0x1eef, 0, 0, 2, f(Yes, false, "ữ")},
+ {0x1ef0, 0, 0, 2, f(Yes, false, "Ự")},
+ {0x1ef1, 0, 0, 2, f(Yes, false, "ự")},
+ {0x1ef2, 0, 0, 1, f(Yes, false, "Ỳ")},
+ {0x1ef3, 0, 0, 1, f(Yes, false, "ỳ")},
+ {0x1ef4, 0, 0, 1, f(Yes, false, "Ỵ")},
+ {0x1ef5, 0, 0, 1, f(Yes, false, "ỵ")},
+ {0x1ef6, 0, 0, 1, f(Yes, false, "Ỷ")},
+ {0x1ef7, 0, 0, 1, f(Yes, false, "ỷ")},
+ {0x1ef8, 0, 0, 1, f(Yes, false, "Ỹ")},
+ {0x1ef9, 0, 0, 1, f(Yes, false, "ỹ")},
+ {0x1efa, 0, 0, 0, f(Yes, false, "")},
+ {0x1f00, 0, 0, 1, f(Yes, true, "ἀ")},
+ {0x1f01, 0, 0, 1, f(Yes, true, "ἁ")},
+ {0x1f02, 0, 0, 2, f(Yes, true, "ἂ")},
+ {0x1f03, 0, 0, 2, f(Yes, true, "ἃ")},
+ {0x1f04, 0, 0, 2, f(Yes, true, "ἄ")},
+ {0x1f05, 0, 0, 2, f(Yes, true, "ἅ")},
+ {0x1f06, 0, 0, 2, f(Yes, true, "ἆ")},
+ {0x1f07, 0, 0, 2, f(Yes, true, "ἇ")},
+ {0x1f08, 0, 0, 1, f(Yes, true, "Ἀ")},
+ {0x1f09, 0, 0, 1, f(Yes, true, "Ἁ")},
+ {0x1f0a, 0, 0, 2, f(Yes, true, "Ἂ")},
+ {0x1f0b, 0, 0, 2, f(Yes, true, "Ἃ")},
+ {0x1f0c, 0, 0, 2, f(Yes, true, "Ἄ")},
+ {0x1f0d, 0, 0, 2, f(Yes, true, "Ἅ")},
+ {0x1f0e, 0, 0, 2, f(Yes, true, "Ἆ")},
+ {0x1f0f, 0, 0, 2, f(Yes, true, "Ἇ")},
+ {0x1f10, 0, 0, 1, f(Yes, true, "ἐ")},
+ {0x1f11, 0, 0, 1, f(Yes, true, "ἑ")},
+ {0x1f12, 0, 0, 2, f(Yes, false, "ἒ")},
+ {0x1f13, 0, 0, 2, f(Yes, false, "ἓ")},
+ {0x1f14, 0, 0, 2, f(Yes, false, "ἔ")},
+ {0x1f15, 0, 0, 2, f(Yes, false, "ἕ")},
+ {0x1f16, 0, 0, 0, f(Yes, false, "")},
+ {0x1f18, 0, 0, 1, f(Yes, true, "Ἐ")},
+ {0x1f19, 0, 0, 1, f(Yes, true, "Ἑ")},
+ {0x1f1a, 0, 0, 2, f(Yes, false, "Ἒ")},
+ {0x1f1b, 0, 0, 2, f(Yes, false, "Ἓ")},
+ {0x1f1c, 0, 0, 2, f(Yes, false, "Ἔ")},
+ {0x1f1d, 0, 0, 2, f(Yes, false, "Ἕ")},
+ {0x1f1e, 0, 0, 0, f(Yes, false, "")},
+ {0x1f20, 0, 0, 1, f(Yes, true, "ἠ")},
+ {0x1f21, 0, 0, 1, f(Yes, true, "ἡ")},
+ {0x1f22, 0, 0, 2, f(Yes, true, "ἢ")},
+ {0x1f23, 0, 0, 2, f(Yes, true, "ἣ")},
+ {0x1f24, 0, 0, 2, f(Yes, true, "ἤ")},
+ {0x1f25, 0, 0, 2, f(Yes, true, "ἥ")},
+ {0x1f26, 0, 0, 2, f(Yes, true, "ἦ")},
+ {0x1f27, 0, 0, 2, f(Yes, true, "ἧ")},
+ {0x1f28, 0, 0, 1, f(Yes, true, "Ἠ")},
+ {0x1f29, 0, 0, 1, f(Yes, true, "Ἡ")},
+ {0x1f2a, 0, 0, 2, f(Yes, true, "Ἢ")},
+ {0x1f2b, 0, 0, 2, f(Yes, true, "Ἣ")},
+ {0x1f2c, 0, 0, 2, f(Yes, true, "Ἤ")},
+ {0x1f2d, 0, 0, 2, f(Yes, true, "Ἥ")},
+ {0x1f2e, 0, 0, 2, f(Yes, true, "Ἦ")},
+ {0x1f2f, 0, 0, 2, f(Yes, true, "Ἧ")},
+ {0x1f30, 0, 0, 1, f(Yes, true, "ἰ")},
+ {0x1f31, 0, 0, 1, f(Yes, true, "ἱ")},
+ {0x1f32, 0, 0, 2, f(Yes, false, "ἲ")},
+ {0x1f33, 0, 0, 2, f(Yes, false, "ἳ")},
+ {0x1f34, 0, 0, 2, f(Yes, false, "ἴ")},
+ {0x1f35, 0, 0, 2, f(Yes, false, "ἵ")},
+ {0x1f36, 0, 0, 2, f(Yes, false, "ἶ")},
+ {0x1f37, 0, 0, 2, f(Yes, false, "ἷ")},
+ {0x1f38, 0, 0, 1, f(Yes, true, "Ἰ")},
+ {0x1f39, 0, 0, 1, f(Yes, true, "Ἱ")},
+ {0x1f3a, 0, 0, 2, f(Yes, false, "Ἲ")},
+ {0x1f3b, 0, 0, 2, f(Yes, false, "Ἳ")},
+ {0x1f3c, 0, 0, 2, f(Yes, false, "Ἴ")},
+ {0x1f3d, 0, 0, 2, f(Yes, false, "Ἵ")},
+ {0x1f3e, 0, 0, 2, f(Yes, false, "Ἶ")},
+ {0x1f3f, 0, 0, 2, f(Yes, false, "Ἷ")},
+ {0x1f40, 0, 0, 1, f(Yes, true, "ὀ")},
+ {0x1f41, 0, 0, 1, f(Yes, true, "ὁ")},
+ {0x1f42, 0, 0, 2, f(Yes, false, "ὂ")},
+ {0x1f43, 0, 0, 2, f(Yes, false, "ὃ")},
+ {0x1f44, 0, 0, 2, f(Yes, false, "ὄ")},
+ {0x1f45, 0, 0, 2, f(Yes, false, "ὅ")},
+ {0x1f46, 0, 0, 0, f(Yes, false, "")},
+ {0x1f48, 0, 0, 1, f(Yes, true, "Ὀ")},
+ {0x1f49, 0, 0, 1, f(Yes, true, "Ὁ")},
+ {0x1f4a, 0, 0, 2, f(Yes, false, "Ὂ")},
+ {0x1f4b, 0, 0, 2, f(Yes, false, "Ὃ")},
+ {0x1f4c, 0, 0, 2, f(Yes, false, "Ὄ")},
+ {0x1f4d, 0, 0, 2, f(Yes, false, "Ὅ")},
+ {0x1f4e, 0, 0, 0, f(Yes, false, "")},
+ {0x1f50, 0, 0, 1, f(Yes, true, "ὐ")},
+ {0x1f51, 0, 0, 1, f(Yes, true, "ὑ")},
+ {0x1f52, 0, 0, 2, f(Yes, false, "ὒ")},
+ {0x1f53, 0, 0, 2, f(Yes, false, "ὓ")},
+ {0x1f54, 0, 0, 2, f(Yes, false, "ὔ")},
+ {0x1f55, 0, 0, 2, f(Yes, false, "ὕ")},
+ {0x1f56, 0, 0, 2, f(Yes, false, "ὖ")},
+ {0x1f57, 0, 0, 2, f(Yes, false, "ὗ")},
+ {0x1f58, 0, 0, 0, f(Yes, false, "")},
+ {0x1f59, 0, 0, 1, f(Yes, true, "Ὑ")},
+ {0x1f5a, 0, 0, 0, f(Yes, false, "")},
+ {0x1f5b, 0, 0, 2, f(Yes, false, "Ὓ")},
+ {0x1f5c, 0, 0, 0, f(Yes, false, "")},
+ {0x1f5d, 0, 0, 2, f(Yes, false, "Ὕ")},
+ {0x1f5e, 0, 0, 0, f(Yes, false, "")},
+ {0x1f5f, 0, 0, 2, f(Yes, false, "Ὗ")},
+ {0x1f60, 0, 0, 1, f(Yes, true, "ὠ")},
+ {0x1f61, 0, 0, 1, f(Yes, true, "ὡ")},
+ {0x1f62, 0, 0, 2, f(Yes, true, "ὢ")},
+ {0x1f63, 0, 0, 2, f(Yes, true, "ὣ")},
+ {0x1f64, 0, 0, 2, f(Yes, true, "ὤ")},
+ {0x1f65, 0, 0, 2, f(Yes, true, "ὥ")},
+ {0x1f66, 0, 0, 2, f(Yes, true, "ὦ")},
+ {0x1f67, 0, 0, 2, f(Yes, true, "ὧ")},
+ {0x1f68, 0, 0, 1, f(Yes, true, "Ὠ")},
+ {0x1f69, 0, 0, 1, f(Yes, true, "Ὡ")},
+ {0x1f6a, 0, 0, 2, f(Yes, true, "Ὢ")},
+ {0x1f6b, 0, 0, 2, f(Yes, true, "Ὣ")},
+ {0x1f6c, 0, 0, 2, f(Yes, true, "Ὤ")},
+ {0x1f6d, 0, 0, 2, f(Yes, true, "Ὥ")},
+ {0x1f6e, 0, 0, 2, f(Yes, true, "Ὦ")},
+ {0x1f6f, 0, 0, 2, f(Yes, true, "Ὧ")},
+ {0x1f70, 0, 0, 1, f(Yes, true, "ὰ")},
+ {0x1f71, 0, 0, 1, f(No, false, "ά")},
+ {0x1f72, 0, 0, 1, f(Yes, false, "ὲ")},
+ {0x1f73, 0, 0, 1, f(No, false, "έ")},
+ {0x1f74, 0, 0, 1, f(Yes, true, "ὴ")},
+ {0x1f75, 0, 0, 1, f(No, false, "ή")},
+ {0x1f76, 0, 0, 1, f(Yes, false, "ὶ")},
+ {0x1f77, 0, 0, 1, f(No, false, "ί")},
+ {0x1f78, 0, 0, 1, f(Yes, false, "ὸ")},
+ {0x1f79, 0, 0, 1, f(No, false, "ό")},
+ {0x1f7a, 0, 0, 1, f(Yes, false, "ὺ")},
+ {0x1f7b, 0, 0, 1, f(No, false, "ύ")},
+ {0x1f7c, 0, 0, 1, f(Yes, true, "ὼ")},
+ {0x1f7d, 0, 0, 1, f(No, false, "ώ")},
+ {0x1f7e, 0, 0, 0, f(Yes, false, "")},
+ {0x1f80, 0, 0, 2, f(Yes, false, "ᾀ")},
+ {0x1f81, 0, 0, 2, f(Yes, false, "ᾁ")},
+ {0x1f82, 0, 0, 3, f(Yes, false, "ᾂ")},
+ {0x1f83, 0, 0, 3, f(Yes, false, "ᾃ")},
+ {0x1f84, 0, 0, 3, f(Yes, false, "ᾄ")},
+ {0x1f85, 0, 0, 3, f(Yes, false, "ᾅ")},
+ {0x1f86, 0, 0, 3, f(Yes, false, "ᾆ")},
+ {0x1f87, 0, 0, 3, f(Yes, false, "ᾇ")},
+ {0x1f88, 0, 0, 2, f(Yes, false, "ᾈ")},
+ {0x1f89, 0, 0, 2, f(Yes, false, "ᾉ")},
+ {0x1f8a, 0, 0, 3, f(Yes, false, "ᾊ")},
+ {0x1f8b, 0, 0, 3, f(Yes, false, "ᾋ")},
+ {0x1f8c, 0, 0, 3, f(Yes, false, "ᾌ")},
+ {0x1f8d, 0, 0, 3, f(Yes, false, "ᾍ")},
+ {0x1f8e, 0, 0, 3, f(Yes, false, "ᾎ")},
+ {0x1f8f, 0, 0, 3, f(Yes, false, "ᾏ")},
+ {0x1f90, 0, 0, 2, f(Yes, false, "ᾐ")},
+ {0x1f91, 0, 0, 2, f(Yes, false, "ᾑ")},
+ {0x1f92, 0, 0, 3, f(Yes, false, "ᾒ")},
+ {0x1f93, 0, 0, 3, f(Yes, false, "ᾓ")},
+ {0x1f94, 0, 0, 3, f(Yes, false, "ᾔ")},
+ {0x1f95, 0, 0, 3, f(Yes, false, "ᾕ")},
+ {0x1f96, 0, 0, 3, f(Yes, false, "ᾖ")},
+ {0x1f97, 0, 0, 3, f(Yes, false, "ᾗ")},
+ {0x1f98, 0, 0, 2, f(Yes, false, "ᾘ")},
+ {0x1f99, 0, 0, 2, f(Yes, false, "ᾙ")},
+ {0x1f9a, 0, 0, 3, f(Yes, false, "ᾚ")},
+ {0x1f9b, 0, 0, 3, f(Yes, false, "ᾛ")},
+ {0x1f9c, 0, 0, 3, f(Yes, false, "ᾜ")},
+ {0x1f9d, 0, 0, 3, f(Yes, false, "ᾝ")},
+ {0x1f9e, 0, 0, 3, f(Yes, false, "ᾞ")},
+ {0x1f9f, 0, 0, 3, f(Yes, false, "ᾟ")},
+ {0x1fa0, 0, 0, 2, f(Yes, false, "ᾠ")},
+ {0x1fa1, 0, 0, 2, f(Yes, false, "ᾡ")},
+ {0x1fa2, 0, 0, 3, f(Yes, false, "ᾢ")},
+ {0x1fa3, 0, 0, 3, f(Yes, false, "ᾣ")},
+ {0x1fa4, 0, 0, 3, f(Yes, false, "ᾤ")},
+ {0x1fa5, 0, 0, 3, f(Yes, false, "ᾥ")},
+ {0x1fa6, 0, 0, 3, f(Yes, false, "ᾦ")},
+ {0x1fa7, 0, 0, 3, f(Yes, false, "ᾧ")},
+ {0x1fa8, 0, 0, 2, f(Yes, false, "ᾨ")},
+ {0x1fa9, 0, 0, 2, f(Yes, false, "ᾩ")},
+ {0x1faa, 0, 0, 3, f(Yes, false, "ᾪ")},
+ {0x1fab, 0, 0, 3, f(Yes, false, "ᾫ")},
+ {0x1fac, 0, 0, 3, f(Yes, false, "ᾬ")},
+ {0x1fad, 0, 0, 3, f(Yes, false, "ᾭ")},
+ {0x1fae, 0, 0, 3, f(Yes, false, "ᾮ")},
+ {0x1faf, 0, 0, 3, f(Yes, false, "ᾯ")},
+ {0x1fb0, 0, 0, 1, f(Yes, false, "ᾰ")},
+ {0x1fb1, 0, 0, 1, f(Yes, false, "ᾱ")},
+ {0x1fb2, 0, 0, 2, f(Yes, false, "ᾲ")},
+ {0x1fb3, 0, 0, 1, f(Yes, false, "ᾳ")},
+ {0x1fb4, 0, 0, 2, f(Yes, false, "ᾴ")},
+ {0x1fb5, 0, 0, 0, f(Yes, false, "")},
+ {0x1fb6, 0, 0, 1, f(Yes, true, "ᾶ")},
+ {0x1fb7, 0, 0, 2, f(Yes, false, "ᾷ")},
+ {0x1fb8, 0, 0, 1, f(Yes, false, "Ᾰ")},
+ {0x1fb9, 0, 0, 1, f(Yes, false, "Ᾱ")},
+ {0x1fba, 0, 0, 1, f(Yes, false, "Ὰ")},
+ {0x1fbb, 0, 0, 1, f(No, false, "Ά")},
+ {0x1fbc, 0, 0, 1, f(Yes, false, "ᾼ")},
+ {0x1fbd, 0, 0, 1, g(Yes, No, false, false, "", " ̓")},
+ {0x1fbe, 0, 0, 0, f(No, false, "ι")},
+ {0x1fbf, 0, 0, 1, g(Yes, No, true, false, "", " ̓")},
+ {0x1fc0, 0, 0, 1, g(Yes, No, false, false, "", " ͂")},
+ {0x1fc1, 0, 0, 2, g(Yes, No, false, false, "῁", " ̈͂")},
+ {0x1fc2, 0, 0, 2, f(Yes, false, "ῂ")},
+ {0x1fc3, 0, 0, 1, f(Yes, false, "ῃ")},
+ {0x1fc4, 0, 0, 2, f(Yes, false, "ῄ")},
+ {0x1fc5, 0, 0, 0, f(Yes, false, "")},
+ {0x1fc6, 0, 0, 1, f(Yes, true, "ῆ")},
+ {0x1fc7, 0, 0, 2, f(Yes, false, "ῇ")},
+ {0x1fc8, 0, 0, 1, f(Yes, false, "Ὲ")},
+ {0x1fc9, 0, 0, 1, f(No, false, "Έ")},
+ {0x1fca, 0, 0, 1, f(Yes, false, "Ὴ")},
+ {0x1fcb, 0, 0, 1, f(No, false, "Ή")},
+ {0x1fcc, 0, 0, 1, f(Yes, false, "ῌ")},
+ {0x1fcd, 0, 0, 2, g(Yes, No, false, false, "῍", " ̓̀")},
+ {0x1fce, 0, 0, 2, g(Yes, No, false, false, "῎", " ̓́")},
+ {0x1fcf, 0, 0, 2, g(Yes, No, false, false, "῏", " ̓͂")},
+ {0x1fd0, 0, 0, 1, f(Yes, false, "ῐ")},
+ {0x1fd1, 0, 0, 1, f(Yes, false, "ῑ")},
+ {0x1fd2, 0, 0, 2, f(Yes, false, "ῒ")},
+ {0x1fd3, 0, 0, 2, f(No, false, "ΐ")},
+ {0x1fd4, 0, 0, 0, f(Yes, false, "")},
+ {0x1fd6, 0, 0, 1, f(Yes, false, "ῖ")},
+ {0x1fd7, 0, 0, 2, f(Yes, false, "ῗ")},
+ {0x1fd8, 0, 0, 1, f(Yes, false, "Ῐ")},
+ {0x1fd9, 0, 0, 1, f(Yes, false, "Ῑ")},
+ {0x1fda, 0, 0, 1, f(Yes, false, "Ὶ")},
+ {0x1fdb, 0, 0, 1, f(No, false, "Ί")},
+ {0x1fdc, 0, 0, 0, f(Yes, false, "")},
+ {0x1fdd, 0, 0, 2, g(Yes, No, false, false, "῝", " ̔̀")},
+ {0x1fde, 0, 0, 2, g(Yes, No, false, false, "῞", " ̔́")},
+ {0x1fdf, 0, 0, 2, g(Yes, No, false, false, "῟", " ̔͂")},
+ {0x1fe0, 0, 0, 1, f(Yes, false, "ῠ")},
+ {0x1fe1, 0, 0, 1, f(Yes, false, "ῡ")},
+ {0x1fe2, 0, 0, 2, f(Yes, false, "ῢ")},
+ {0x1fe3, 0, 0, 2, f(No, false, "ΰ")},
+ {0x1fe4, 0, 0, 1, f(Yes, false, "ῤ")},
+ {0x1fe5, 0, 0, 1, f(Yes, false, "ῥ")},
+ {0x1fe6, 0, 0, 1, f(Yes, false, "ῦ")},
+ {0x1fe7, 0, 0, 2, f(Yes, false, "ῧ")},
+ {0x1fe8, 0, 0, 1, f(Yes, false, "Ῠ")},
+ {0x1fe9, 0, 0, 1, f(Yes, false, "Ῡ")},
+ {0x1fea, 0, 0, 1, f(Yes, false, "Ὺ")},
+ {0x1feb, 0, 0, 1, f(No, false, "Ύ")},
+ {0x1fec, 0, 0, 1, f(Yes, false, "Ῥ")},
+ {0x1fed, 0, 0, 2, g(Yes, No, false, false, "῭", " ̈̀")},
+ {0x1fee, 0, 0, 2, g(No, No, false, false, "΅", " ̈́")},
+ {0x1fef, 0, 0, 0, f(No, false, "`")},
+ {0x1ff0, 0, 0, 0, f(Yes, false, "")},
+ {0x1ff2, 0, 0, 2, f(Yes, false, "ῲ")},
+ {0x1ff3, 0, 0, 1, f(Yes, false, "ῳ")},
+ {0x1ff4, 0, 0, 2, f(Yes, false, "ῴ")},
+ {0x1ff5, 0, 0, 0, f(Yes, false, "")},
+ {0x1ff6, 0, 0, 1, f(Yes, true, "ῶ")},
+ {0x1ff7, 0, 0, 2, f(Yes, false, "ῷ")},
+ {0x1ff8, 0, 0, 1, f(Yes, false, "Ὸ")},
+ {0x1ff9, 0, 0, 1, f(No, false, "Ό")},
+ {0x1ffa, 0, 0, 1, f(Yes, false, "Ὼ")},
+ {0x1ffb, 0, 0, 1, f(No, false, "Ώ")},
+ {0x1ffc, 0, 0, 1, f(Yes, false, "ῼ")},
+ {0x1ffd, 0, 0, 1, g(No, No, false, false, "´", " ́")},
+ {0x1ffe, 0, 0, 1, g(Yes, No, true, false, "", " ̔")},
+ {0x1fff, 0, 0, 0, f(Yes, false, "")},
+ {0x2000, 0, 0, 0, g(No, No, false, false, "\u2002", " ")},
+ {0x2001, 0, 0, 0, g(No, No, false, false, "\u2003", " ")},
+ {0x2002, 0, 0, 0, g(Yes, No, false, false, "", " ")},
+ {0x200b, 0, 0, 0, f(Yes, false, "")},
+ {0x2011, 0, 0, 0, g(Yes, No, false, false, "", "‐")},
+ {0x2012, 0, 0, 0, f(Yes, false, "")},
+ {0x2017, 0, 0, 1, g(Yes, No, false, false, "", " ̳")},
+ {0x2018, 0, 0, 0, f(Yes, false, "")},
+ {0x2024, 0, 0, 0, g(Yes, No, false, false, "", ".")},
+ {0x2025, 0, 0, 0, g(Yes, No, false, false, "", "..")},
+ {0x2026, 0, 0, 0, g(Yes, No, false, false, "", "...")},
+ {0x2027, 0, 0, 0, f(Yes, false, "")},
+ {0x202f, 0, 0, 0, g(Yes, No, false, false, "", " ")},
+ {0x2030, 0, 0, 0, f(Yes, false, "")},
+ {0x2033, 0, 0, 0, g(Yes, No, false, false, "", "′′")},
+ {0x2034, 0, 0, 0, g(Yes, No, false, false, "", "′′′")},
+ {0x2035, 0, 0, 0, f(Yes, false, "")},
+ {0x2036, 0, 0, 0, g(Yes, No, false, false, "", "‵‵")},
+ {0x2037, 0, 0, 0, g(Yes, No, false, false, "", "‵‵‵")},
+ {0x2038, 0, 0, 0, f(Yes, false, "")},
+ {0x203c, 0, 0, 0, g(Yes, No, false, false, "", "!!")},
+ {0x203d, 0, 0, 0, f(Yes, false, "")},
+ {0x203e, 0, 0, 1, g(Yes, No, false, false, "", " ̅")},
+ {0x203f, 0, 0, 0, f(Yes, false, "")},
+ {0x2047, 0, 0, 0, g(Yes, No, false, false, "", "??")},
+ {0x2048, 0, 0, 0, g(Yes, No, false, false, "", "?!")},
+ {0x2049, 0, 0, 0, g(Yes, No, false, false, "", "!?")},
+ {0x204a, 0, 0, 0, f(Yes, false, "")},
+ {0x2057, 0, 0, 0, g(Yes, No, false, false, "", "′′′′")},
+ {0x2058, 0, 0, 0, f(Yes, false, "")},
+ {0x205f, 0, 0, 0, g(Yes, No, false, false, "", " ")},
+ {0x2060, 0, 0, 0, f(Yes, false, "")},
+ {0x2070, 0, 0, 0, g(Yes, No, false, false, "", "0")},
+ {0x2071, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x2072, 0, 0, 0, f(Yes, false, "")},
+ {0x2074, 0, 0, 0, g(Yes, No, false, false, "", "4")},
+ {0x2075, 0, 0, 0, g(Yes, No, false, false, "", "5")},
+ {0x2076, 0, 0, 0, g(Yes, No, false, false, "", "6")},
+ {0x2077, 0, 0, 0, g(Yes, No, false, false, "", "7")},
+ {0x2078, 0, 0, 0, g(Yes, No, false, false, "", "8")},
+ {0x2079, 0, 0, 0, g(Yes, No, false, false, "", "9")},
+ {0x207a, 0, 0, 0, g(Yes, No, false, false, "", "+")},
+ {0x207b, 0, 0, 0, g(Yes, No, false, false, "", "−")},
+ {0x207c, 0, 0, 0, g(Yes, No, false, false, "", "=")},
+ {0x207d, 0, 0, 0, g(Yes, No, false, false, "", "(")},
+ {0x207e, 0, 0, 0, g(Yes, No, false, false, "", ")")},
+ {0x207f, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x2080, 0, 0, 0, g(Yes, No, false, false, "", "0")},
+ {0x2081, 0, 0, 0, g(Yes, No, false, false, "", "1")},
+ {0x2082, 0, 0, 0, g(Yes, No, false, false, "", "2")},
+ {0x2083, 0, 0, 0, g(Yes, No, false, false, "", "3")},
+ {0x2084, 0, 0, 0, g(Yes, No, false, false, "", "4")},
+ {0x2085, 0, 0, 0, g(Yes, No, false, false, "", "5")},
+ {0x2086, 0, 0, 0, g(Yes, No, false, false, "", "6")},
+ {0x2087, 0, 0, 0, g(Yes, No, false, false, "", "7")},
+ {0x2088, 0, 0, 0, g(Yes, No, false, false, "", "8")},
+ {0x2089, 0, 0, 0, g(Yes, No, false, false, "", "9")},
+ {0x208a, 0, 0, 0, g(Yes, No, false, false, "", "+")},
+ {0x208b, 0, 0, 0, g(Yes, No, false, false, "", "−")},
+ {0x208c, 0, 0, 0, g(Yes, No, false, false, "", "=")},
+ {0x208d, 0, 0, 0, g(Yes, No, false, false, "", "(")},
+ {0x208e, 0, 0, 0, g(Yes, No, false, false, "", ")")},
+ {0x208f, 0, 0, 0, f(Yes, false, "")},
+ {0x2090, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x2091, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x2092, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x2093, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x2094, 0, 0, 0, g(Yes, No, false, false, "", "ə")},
+ {0x2095, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x2096, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x2097, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x2098, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x2099, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x209a, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x209b, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x209c, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x209d, 0, 0, 0, f(Yes, false, "")},
+ {0x20a8, 0, 0, 0, g(Yes, No, false, false, "", "Rs")},
+ {0x20a9, 0, 0, 0, f(Yes, false, "")},
+ {0x20d0, 230, 1, 1, f(Yes, false, "")},
+ {0x20d2, 1, 1, 1, f(Yes, false, "")},
+ {0x20d4, 230, 1, 1, f(Yes, false, "")},
+ {0x20d8, 1, 1, 1, f(Yes, false, "")},
+ {0x20db, 230, 1, 1, f(Yes, false, "")},
+ {0x20dd, 0, 0, 0, f(Yes, false, "")},
+ {0x20e1, 230, 1, 1, f(Yes, false, "")},
+ {0x20e2, 0, 0, 0, f(Yes, false, "")},
+ {0x20e5, 1, 1, 1, f(Yes, false, "")},
+ {0x20e7, 230, 1, 1, f(Yes, false, "")},
+ {0x20e8, 220, 1, 1, f(Yes, false, "")},
+ {0x20e9, 230, 1, 1, f(Yes, false, "")},
+ {0x20ea, 1, 1, 1, f(Yes, false, "")},
+ {0x20ec, 220, 1, 1, f(Yes, false, "")},
+ {0x20f0, 230, 1, 1, f(Yes, false, "")},
+ {0x20f1, 0, 0, 0, f(Yes, false, "")},
+ {0x2100, 0, 0, 0, g(Yes, No, false, false, "", "a/c")},
+ {0x2101, 0, 0, 0, g(Yes, No, false, false, "", "a/s")},
+ {0x2102, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x2103, 0, 0, 0, g(Yes, No, false, false, "", "°C")},
+ {0x2104, 0, 0, 0, f(Yes, false, "")},
+ {0x2105, 0, 0, 0, g(Yes, No, false, false, "", "c/o")},
+ {0x2106, 0, 0, 0, g(Yes, No, false, false, "", "c/u")},
+ {0x2107, 0, 0, 0, g(Yes, No, false, false, "", "Ɛ")},
+ {0x2108, 0, 0, 0, f(Yes, false, "")},
+ {0x2109, 0, 0, 0, g(Yes, No, false, false, "", "°F")},
+ {0x210a, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x210b, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x210e, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x210f, 0, 0, 0, g(Yes, No, false, false, "", "ħ")},
+ {0x2110, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x2112, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x2113, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x2114, 0, 0, 0, f(Yes, false, "")},
+ {0x2115, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x2116, 0, 0, 0, g(Yes, No, false, false, "", "No")},
+ {0x2117, 0, 0, 0, f(Yes, false, "")},
+ {0x2119, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x211a, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x211b, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x211e, 0, 0, 0, f(Yes, false, "")},
+ {0x2120, 0, 0, 0, g(Yes, No, false, false, "", "SM")},
+ {0x2121, 0, 0, 0, g(Yes, No, false, false, "", "TEL")},
+ {0x2122, 0, 0, 0, g(Yes, No, false, false, "", "TM")},
+ {0x2123, 0, 0, 0, f(Yes, false, "")},
+ {0x2124, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x2125, 0, 0, 0, f(Yes, false, "")},
+ {0x2126, 0, 0, 0, f(No, false, "Ω")},
+ {0x2127, 0, 0, 0, f(Yes, false, "")},
+ {0x2128, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x2129, 0, 0, 0, f(Yes, false, "")},
+ {0x212a, 0, 0, 0, f(No, false, "K")},
+ {0x212b, 0, 0, 1, f(No, false, "Å")},
+ {0x212c, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x212d, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x212e, 0, 0, 0, f(Yes, false, "")},
+ {0x212f, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x2130, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x2131, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x2132, 0, 0, 0, f(Yes, false, "")},
+ {0x2133, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x2134, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x2135, 0, 0, 0, g(Yes, No, false, false, "", "א")},
+ {0x2136, 0, 0, 0, g(Yes, No, false, false, "", "ב")},
+ {0x2137, 0, 0, 0, g(Yes, No, false, false, "", "ג")},
+ {0x2138, 0, 0, 0, g(Yes, No, false, false, "", "ד")},
+ {0x2139, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x213a, 0, 0, 0, f(Yes, false, "")},
+ {0x213b, 0, 0, 0, g(Yes, No, false, false, "", "FAX")},
+ {0x213c, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x213d, 0, 0, 0, g(Yes, No, false, false, "", "γ")},
+ {0x213e, 0, 0, 0, g(Yes, No, false, false, "", "Γ")},
+ {0x213f, 0, 0, 0, g(Yes, No, false, false, "", "Π")},
+ {0x2140, 0, 0, 0, g(Yes, No, false, false, "", "∑")},
+ {0x2141, 0, 0, 0, f(Yes, false, "")},
+ {0x2145, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x2146, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x2147, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x2148, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x2149, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x214a, 0, 0, 0, f(Yes, false, "")},
+ {0x2150, 0, 0, 0, g(Yes, No, false, false, "", "1⁄7")},
+ {0x2151, 0, 0, 0, g(Yes, No, false, false, "", "1⁄9")},
+ {0x2152, 0, 0, 0, g(Yes, No, false, false, "", "1⁄10")},
+ {0x2153, 0, 0, 0, g(Yes, No, false, false, "", "1⁄3")},
+ {0x2154, 0, 0, 0, g(Yes, No, false, false, "", "2⁄3")},
+ {0x2155, 0, 0, 0, g(Yes, No, false, false, "", "1⁄5")},
+ {0x2156, 0, 0, 0, g(Yes, No, false, false, "", "2⁄5")},
+ {0x2157, 0, 0, 0, g(Yes, No, false, false, "", "3⁄5")},
+ {0x2158, 0, 0, 0, g(Yes, No, false, false, "", "4⁄5")},
+ {0x2159, 0, 0, 0, g(Yes, No, false, false, "", "1⁄6")},
+ {0x215a, 0, 0, 0, g(Yes, No, false, false, "", "5⁄6")},
+ {0x215b, 0, 0, 0, g(Yes, No, false, false, "", "1⁄8")},
+ {0x215c, 0, 0, 0, g(Yes, No, false, false, "", "3⁄8")},
+ {0x215d, 0, 0, 0, g(Yes, No, false, false, "", "5⁄8")},
+ {0x215e, 0, 0, 0, g(Yes, No, false, false, "", "7⁄8")},
+ {0x215f, 0, 0, 0, g(Yes, No, false, false, "", "1⁄")},
+ {0x2160, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x2161, 0, 0, 0, g(Yes, No, false, false, "", "II")},
+ {0x2162, 0, 0, 0, g(Yes, No, false, false, "", "III")},
+ {0x2163, 0, 0, 0, g(Yes, No, false, false, "", "IV")},
+ {0x2164, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x2165, 0, 0, 0, g(Yes, No, false, false, "", "VI")},
+ {0x2166, 0, 0, 0, g(Yes, No, false, false, "", "VII")},
+ {0x2167, 0, 0, 0, g(Yes, No, false, false, "", "VIII")},
+ {0x2168, 0, 0, 0, g(Yes, No, false, false, "", "IX")},
+ {0x2169, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x216a, 0, 0, 0, g(Yes, No, false, false, "", "XI")},
+ {0x216b, 0, 0, 0, g(Yes, No, false, false, "", "XII")},
+ {0x216c, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x216d, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x216e, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x216f, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x2170, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x2171, 0, 0, 0, g(Yes, No, false, false, "", "ii")},
+ {0x2172, 0, 0, 0, g(Yes, No, false, false, "", "iii")},
+ {0x2173, 0, 0, 0, g(Yes, No, false, false, "", "iv")},
+ {0x2174, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x2175, 0, 0, 0, g(Yes, No, false, false, "", "vi")},
+ {0x2176, 0, 0, 0, g(Yes, No, false, false, "", "vii")},
+ {0x2177, 0, 0, 0, g(Yes, No, false, false, "", "viii")},
+ {0x2178, 0, 0, 0, g(Yes, No, false, false, "", "ix")},
+ {0x2179, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x217a, 0, 0, 0, g(Yes, No, false, false, "", "xi")},
+ {0x217b, 0, 0, 0, g(Yes, No, false, false, "", "xii")},
+ {0x217c, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x217d, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x217e, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x217f, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x2180, 0, 0, 0, f(Yes, false, "")},
+ {0x2189, 0, 0, 0, g(Yes, No, false, false, "", "0⁄3")},
+ {0x218a, 0, 0, 0, f(Yes, false, "")},
+ {0x2190, 0, 0, 0, f(Yes, true, "")},
+ {0x2191, 0, 0, 0, f(Yes, false, "")},
+ {0x2192, 0, 0, 0, f(Yes, true, "")},
+ {0x2193, 0, 0, 0, f(Yes, false, "")},
+ {0x2194, 0, 0, 0, f(Yes, true, "")},
+ {0x2195, 0, 0, 0, f(Yes, false, "")},
+ {0x219a, 0, 0, 1, f(Yes, false, "↚")},
+ {0x219b, 0, 0, 1, f(Yes, false, "↛")},
+ {0x219c, 0, 0, 0, f(Yes, false, "")},
+ {0x21ae, 0, 0, 1, f(Yes, false, "↮")},
+ {0x21af, 0, 0, 0, f(Yes, false, "")},
+ {0x21cd, 0, 0, 1, f(Yes, false, "⇍")},
+ {0x21ce, 0, 0, 1, f(Yes, false, "⇎")},
+ {0x21cf, 0, 0, 1, f(Yes, false, "⇏")},
+ {0x21d0, 0, 0, 0, f(Yes, true, "")},
+ {0x21d1, 0, 0, 0, f(Yes, false, "")},
+ {0x21d2, 0, 0, 0, f(Yes, true, "")},
+ {0x21d3, 0, 0, 0, f(Yes, false, "")},
+ {0x21d4, 0, 0, 0, f(Yes, true, "")},
+ {0x21d5, 0, 0, 0, f(Yes, false, "")},
+ {0x2203, 0, 0, 0, f(Yes, true, "")},
+ {0x2204, 0, 0, 1, f(Yes, false, "∄")},
+ {0x2205, 0, 0, 0, f(Yes, false, "")},
+ {0x2208, 0, 0, 0, f(Yes, true, "")},
+ {0x2209, 0, 0, 1, f(Yes, false, "∉")},
+ {0x220a, 0, 0, 0, f(Yes, false, "")},
+ {0x220b, 0, 0, 0, f(Yes, true, "")},
+ {0x220c, 0, 0, 1, f(Yes, false, "∌")},
+ {0x220d, 0, 0, 0, f(Yes, false, "")},
+ {0x2223, 0, 0, 0, f(Yes, true, "")},
+ {0x2224, 0, 0, 1, f(Yes, false, "∤")},
+ {0x2225, 0, 0, 0, f(Yes, true, "")},
+ {0x2226, 0, 0, 1, f(Yes, false, "∦")},
+ {0x2227, 0, 0, 0, f(Yes, false, "")},
+ {0x222c, 0, 0, 0, g(Yes, No, false, false, "", "∫∫")},
+ {0x222d, 0, 0, 0, g(Yes, No, false, false, "", "∫∫∫")},
+ {0x222e, 0, 0, 0, f(Yes, false, "")},
+ {0x222f, 0, 0, 0, g(Yes, No, false, false, "", "∮∮")},
+ {0x2230, 0, 0, 0, g(Yes, No, false, false, "", "∮∮∮")},
+ {0x2231, 0, 0, 0, f(Yes, false, "")},
+ {0x223c, 0, 0, 0, f(Yes, true, "")},
+ {0x223d, 0, 0, 0, f(Yes, false, "")},
+ {0x2241, 0, 0, 1, f(Yes, false, "≁")},
+ {0x2242, 0, 0, 0, f(Yes, false, "")},
+ {0x2243, 0, 0, 0, f(Yes, true, "")},
+ {0x2244, 0, 0, 1, f(Yes, false, "≄")},
+ {0x2245, 0, 0, 0, f(Yes, true, "")},
+ {0x2246, 0, 0, 0, f(Yes, false, "")},
+ {0x2247, 0, 0, 1, f(Yes, false, "≇")},
+ {0x2248, 0, 0, 0, f(Yes, true, "")},
+ {0x2249, 0, 0, 1, f(Yes, false, "≉")},
+ {0x224a, 0, 0, 0, f(Yes, false, "")},
+ {0x224d, 0, 0, 0, f(Yes, true, "")},
+ {0x224e, 0, 0, 0, f(Yes, false, "")},
+ {0x2260, 0, 0, 1, f(Yes, false, "≠")},
+ {0x2261, 0, 0, 0, f(Yes, true, "")},
+ {0x2262, 0, 0, 1, f(Yes, false, "≢")},
+ {0x2263, 0, 0, 0, f(Yes, false, "")},
+ {0x2264, 0, 0, 0, f(Yes, true, "")},
+ {0x2266, 0, 0, 0, f(Yes, false, "")},
+ {0x226d, 0, 0, 1, f(Yes, false, "≭")},
+ {0x226e, 0, 0, 1, f(Yes, false, "≮")},
+ {0x226f, 0, 0, 1, f(Yes, false, "≯")},
+ {0x2270, 0, 0, 1, f(Yes, false, "≰")},
+ {0x2271, 0, 0, 1, f(Yes, false, "≱")},
+ {0x2272, 0, 0, 0, f(Yes, true, "")},
+ {0x2274, 0, 0, 1, f(Yes, false, "≴")},
+ {0x2275, 0, 0, 1, f(Yes, false, "≵")},
+ {0x2276, 0, 0, 0, f(Yes, true, "")},
+ {0x2278, 0, 0, 1, f(Yes, false, "≸")},
+ {0x2279, 0, 0, 1, f(Yes, false, "≹")},
+ {0x227a, 0, 0, 0, f(Yes, true, "")},
+ {0x227e, 0, 0, 0, f(Yes, false, "")},
+ {0x2280, 0, 0, 1, f(Yes, false, "⊀")},
+ {0x2281, 0, 0, 1, f(Yes, false, "⊁")},
+ {0x2282, 0, 0, 0, f(Yes, true, "")},
+ {0x2284, 0, 0, 1, f(Yes, false, "⊄")},
+ {0x2285, 0, 0, 1, f(Yes, false, "⊅")},
+ {0x2286, 0, 0, 0, f(Yes, true, "")},
+ {0x2288, 0, 0, 1, f(Yes, false, "⊈")},
+ {0x2289, 0, 0, 1, f(Yes, false, "⊉")},
+ {0x228a, 0, 0, 0, f(Yes, false, "")},
+ {0x2291, 0, 0, 0, f(Yes, true, "")},
+ {0x2293, 0, 0, 0, f(Yes, false, "")},
+ {0x22a2, 0, 0, 0, f(Yes, true, "")},
+ {0x22a3, 0, 0, 0, f(Yes, false, "")},
+ {0x22a8, 0, 0, 0, f(Yes, true, "")},
+ {0x22aa, 0, 0, 0, f(Yes, false, "")},
+ {0x22ab, 0, 0, 0, f(Yes, true, "")},
+ {0x22ac, 0, 0, 1, f(Yes, false, "⊬")},
+ {0x22ad, 0, 0, 1, f(Yes, false, "⊭")},
+ {0x22ae, 0, 0, 1, f(Yes, false, "⊮")},
+ {0x22af, 0, 0, 1, f(Yes, false, "⊯")},
+ {0x22b0, 0, 0, 0, f(Yes, false, "")},
+ {0x22b2, 0, 0, 0, f(Yes, true, "")},
+ {0x22b6, 0, 0, 0, f(Yes, false, "")},
+ {0x22e0, 0, 0, 1, f(Yes, false, "⋠")},
+ {0x22e1, 0, 0, 1, f(Yes, false, "⋡")},
+ {0x22e2, 0, 0, 1, f(Yes, false, "⋢")},
+ {0x22e3, 0, 0, 1, f(Yes, false, "⋣")},
+ {0x22e4, 0, 0, 0, f(Yes, false, "")},
+ {0x22ea, 0, 0, 1, f(Yes, false, "⋪")},
+ {0x22eb, 0, 0, 1, f(Yes, false, "⋫")},
+ {0x22ec, 0, 0, 1, f(Yes, false, "⋬")},
+ {0x22ed, 0, 0, 1, f(Yes, false, "⋭")},
+ {0x22ee, 0, 0, 0, f(Yes, false, "")},
+ {0x2329, 0, 0, 0, f(No, false, "〈")},
+ {0x232a, 0, 0, 0, f(No, false, "〉")},
+ {0x232b, 0, 0, 0, f(Yes, false, "")},
+ {0x2460, 0, 0, 0, g(Yes, No, false, false, "", "1")},
+ {0x2461, 0, 0, 0, g(Yes, No, false, false, "", "2")},
+ {0x2462, 0, 0, 0, g(Yes, No, false, false, "", "3")},
+ {0x2463, 0, 0, 0, g(Yes, No, false, false, "", "4")},
+ {0x2464, 0, 0, 0, g(Yes, No, false, false, "", "5")},
+ {0x2465, 0, 0, 0, g(Yes, No, false, false, "", "6")},
+ {0x2466, 0, 0, 0, g(Yes, No, false, false, "", "7")},
+ {0x2467, 0, 0, 0, g(Yes, No, false, false, "", "8")},
+ {0x2468, 0, 0, 0, g(Yes, No, false, false, "", "9")},
+ {0x2469, 0, 0, 0, g(Yes, No, false, false, "", "10")},
+ {0x246a, 0, 0, 0, g(Yes, No, false, false, "", "11")},
+ {0x246b, 0, 0, 0, g(Yes, No, false, false, "", "12")},
+ {0x246c, 0, 0, 0, g(Yes, No, false, false, "", "13")},
+ {0x246d, 0, 0, 0, g(Yes, No, false, false, "", "14")},
+ {0x246e, 0, 0, 0, g(Yes, No, false, false, "", "15")},
+ {0x246f, 0, 0, 0, g(Yes, No, false, false, "", "16")},
+ {0x2470, 0, 0, 0, g(Yes, No, false, false, "", "17")},
+ {0x2471, 0, 0, 0, g(Yes, No, false, false, "", "18")},
+ {0x2472, 0, 0, 0, g(Yes, No, false, false, "", "19")},
+ {0x2473, 0, 0, 0, g(Yes, No, false, false, "", "20")},
+ {0x2474, 0, 0, 0, g(Yes, No, false, false, "", "(1)")},
+ {0x2475, 0, 0, 0, g(Yes, No, false, false, "", "(2)")},
+ {0x2476, 0, 0, 0, g(Yes, No, false, false, "", "(3)")},
+ {0x2477, 0, 0, 0, g(Yes, No, false, false, "", "(4)")},
+ {0x2478, 0, 0, 0, g(Yes, No, false, false, "", "(5)")},
+ {0x2479, 0, 0, 0, g(Yes, No, false, false, "", "(6)")},
+ {0x247a, 0, 0, 0, g(Yes, No, false, false, "", "(7)")},
+ {0x247b, 0, 0, 0, g(Yes, No, false, false, "", "(8)")},
+ {0x247c, 0, 0, 0, g(Yes, No, false, false, "", "(9)")},
+ {0x247d, 0, 0, 0, g(Yes, No, false, false, "", "(10)")},
+ {0x247e, 0, 0, 0, g(Yes, No, false, false, "", "(11)")},
+ {0x247f, 0, 0, 0, g(Yes, No, false, false, "", "(12)")},
+ {0x2480, 0, 0, 0, g(Yes, No, false, false, "", "(13)")},
+ {0x2481, 0, 0, 0, g(Yes, No, false, false, "", "(14)")},
+ {0x2482, 0, 0, 0, g(Yes, No, false, false, "", "(15)")},
+ {0x2483, 0, 0, 0, g(Yes, No, false, false, "", "(16)")},
+ {0x2484, 0, 0, 0, g(Yes, No, false, false, "", "(17)")},
+ {0x2485, 0, 0, 0, g(Yes, No, false, false, "", "(18)")},
+ {0x2486, 0, 0, 0, g(Yes, No, false, false, "", "(19)")},
+ {0x2487, 0, 0, 0, g(Yes, No, false, false, "", "(20)")},
+ {0x2488, 0, 0, 0, g(Yes, No, false, false, "", "1.")},
+ {0x2489, 0, 0, 0, g(Yes, No, false, false, "", "2.")},
+ {0x248a, 0, 0, 0, g(Yes, No, false, false, "", "3.")},
+ {0x248b, 0, 0, 0, g(Yes, No, false, false, "", "4.")},
+ {0x248c, 0, 0, 0, g(Yes, No, false, false, "", "5.")},
+ {0x248d, 0, 0, 0, g(Yes, No, false, false, "", "6.")},
+ {0x248e, 0, 0, 0, g(Yes, No, false, false, "", "7.")},
+ {0x248f, 0, 0, 0, g(Yes, No, false, false, "", "8.")},
+ {0x2490, 0, 0, 0, g(Yes, No, false, false, "", "9.")},
+ {0x2491, 0, 0, 0, g(Yes, No, false, false, "", "10.")},
+ {0x2492, 0, 0, 0, g(Yes, No, false, false, "", "11.")},
+ {0x2493, 0, 0, 0, g(Yes, No, false, false, "", "12.")},
+ {0x2494, 0, 0, 0, g(Yes, No, false, false, "", "13.")},
+ {0x2495, 0, 0, 0, g(Yes, No, false, false, "", "14.")},
+ {0x2496, 0, 0, 0, g(Yes, No, false, false, "", "15.")},
+ {0x2497, 0, 0, 0, g(Yes, No, false, false, "", "16.")},
+ {0x2498, 0, 0, 0, g(Yes, No, false, false, "", "17.")},
+ {0x2499, 0, 0, 0, g(Yes, No, false, false, "", "18.")},
+ {0x249a, 0, 0, 0, g(Yes, No, false, false, "", "19.")},
+ {0x249b, 0, 0, 0, g(Yes, No, false, false, "", "20.")},
+ {0x249c, 0, 0, 0, g(Yes, No, false, false, "", "(a)")},
+ {0x249d, 0, 0, 0, g(Yes, No, false, false, "", "(b)")},
+ {0x249e, 0, 0, 0, g(Yes, No, false, false, "", "(c)")},
+ {0x249f, 0, 0, 0, g(Yes, No, false, false, "", "(d)")},
+ {0x24a0, 0, 0, 0, g(Yes, No, false, false, "", "(e)")},
+ {0x24a1, 0, 0, 0, g(Yes, No, false, false, "", "(f)")},
+ {0x24a2, 0, 0, 0, g(Yes, No, false, false, "", "(g)")},
+ {0x24a3, 0, 0, 0, g(Yes, No, false, false, "", "(h)")},
+ {0x24a4, 0, 0, 0, g(Yes, No, false, false, "", "(i)")},
+ {0x24a5, 0, 0, 0, g(Yes, No, false, false, "", "(j)")},
+ {0x24a6, 0, 0, 0, g(Yes, No, false, false, "", "(k)")},
+ {0x24a7, 0, 0, 0, g(Yes, No, false, false, "", "(l)")},
+ {0x24a8, 0, 0, 0, g(Yes, No, false, false, "", "(m)")},
+ {0x24a9, 0, 0, 0, g(Yes, No, false, false, "", "(n)")},
+ {0x24aa, 0, 0, 0, g(Yes, No, false, false, "", "(o)")},
+ {0x24ab, 0, 0, 0, g(Yes, No, false, false, "", "(p)")},
+ {0x24ac, 0, 0, 0, g(Yes, No, false, false, "", "(q)")},
+ {0x24ad, 0, 0, 0, g(Yes, No, false, false, "", "(r)")},
+ {0x24ae, 0, 0, 0, g(Yes, No, false, false, "", "(s)")},
+ {0x24af, 0, 0, 0, g(Yes, No, false, false, "", "(t)")},
+ {0x24b0, 0, 0, 0, g(Yes, No, false, false, "", "(u)")},
+ {0x24b1, 0, 0, 0, g(Yes, No, false, false, "", "(v)")},
+ {0x24b2, 0, 0, 0, g(Yes, No, false, false, "", "(w)")},
+ {0x24b3, 0, 0, 0, g(Yes, No, false, false, "", "(x)")},
+ {0x24b4, 0, 0, 0, g(Yes, No, false, false, "", "(y)")},
+ {0x24b5, 0, 0, 0, g(Yes, No, false, false, "", "(z)")},
+ {0x24b6, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x24b7, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x24b8, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x24b9, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x24ba, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x24bb, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x24bc, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x24bd, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x24be, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x24bf, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x24c0, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x24c1, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x24c2, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x24c3, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x24c4, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x24c5, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x24c6, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x24c7, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x24c8, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x24c9, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x24ca, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x24cb, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x24cc, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x24cd, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x24ce, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x24cf, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x24d0, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x24d1, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x24d2, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x24d3, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x24d4, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x24d5, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x24d6, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x24d7, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x24d8, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x24d9, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x24da, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x24db, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x24dc, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x24dd, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x24de, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x24df, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x24e0, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x24e1, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x24e2, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x24e3, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x24e4, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x24e5, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x24e6, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x24e7, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x24e8, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x24e9, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x24ea, 0, 0, 0, g(Yes, No, false, false, "", "0")},
+ {0x24eb, 0, 0, 0, f(Yes, false, "")},
+ {0x2a0c, 0, 0, 0, g(Yes, No, false, false, "", "∫∫∫∫")},
+ {0x2a0d, 0, 0, 0, f(Yes, false, "")},
+ {0x2a74, 0, 0, 0, g(Yes, No, false, false, "", "::=")},
+ {0x2a75, 0, 0, 0, g(Yes, No, false, false, "", "==")},
+ {0x2a76, 0, 0, 0, g(Yes, No, false, false, "", "===")},
+ {0x2a77, 0, 0, 0, f(Yes, false, "")},
+ {0x2adc, 0, 0, 1, f(No, false, "⫝̸")},
+ {0x2add, 0, 0, 0, f(Yes, false, "")},
+ {0x2c7c, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x2c7d, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x2c7e, 0, 0, 0, f(Yes, false, "")},
+ {0x2cef, 230, 1, 1, f(Yes, false, "")},
+ {0x2cf2, 0, 0, 0, f(Yes, false, "")},
+ {0x2d6f, 0, 0, 0, g(Yes, No, false, false, "", "ⵡ")},
+ {0x2d70, 0, 0, 0, f(Yes, false, "")},
+ {0x2d7f, 9, 1, 1, f(Yes, false, "")},
+ {0x2d80, 0, 0, 0, f(Yes, false, "")},
+ {0x2de0, 230, 1, 1, f(Yes, false, "")},
+ {0x2e00, 0, 0, 0, f(Yes, false, "")},
+ {0x2e9f, 0, 0, 0, g(Yes, No, false, false, "", "母")},
+ {0x2ea0, 0, 0, 0, f(Yes, false, "")},
+ {0x2ef3, 0, 0, 0, g(Yes, No, false, false, "", "龟")},
+ {0x2ef4, 0, 0, 0, f(Yes, false, "")},
+ {0x2f00, 0, 0, 0, g(Yes, No, false, false, "", "一")},
+ {0x2f01, 0, 0, 0, g(Yes, No, false, false, "", "丨")},
+ {0x2f02, 0, 0, 0, g(Yes, No, false, false, "", "丶")},
+ {0x2f03, 0, 0, 0, g(Yes, No, false, false, "", "丿")},
+ {0x2f04, 0, 0, 0, g(Yes, No, false, false, "", "乙")},
+ {0x2f05, 0, 0, 0, g(Yes, No, false, false, "", "亅")},
+ {0x2f06, 0, 0, 0, g(Yes, No, false, false, "", "二")},
+ {0x2f07, 0, 0, 0, g(Yes, No, false, false, "", "亠")},
+ {0x2f08, 0, 0, 0, g(Yes, No, false, false, "", "人")},
+ {0x2f09, 0, 0, 0, g(Yes, No, false, false, "", "儿")},
+ {0x2f0a, 0, 0, 0, g(Yes, No, false, false, "", "入")},
+ {0x2f0b, 0, 0, 0, g(Yes, No, false, false, "", "八")},
+ {0x2f0c, 0, 0, 0, g(Yes, No, false, false, "", "冂")},
+ {0x2f0d, 0, 0, 0, g(Yes, No, false, false, "", "冖")},
+ {0x2f0e, 0, 0, 0, g(Yes, No, false, false, "", "冫")},
+ {0x2f0f, 0, 0, 0, g(Yes, No, false, false, "", "几")},
+ {0x2f10, 0, 0, 0, g(Yes, No, false, false, "", "凵")},
+ {0x2f11, 0, 0, 0, g(Yes, No, false, false, "", "刀")},
+ {0x2f12, 0, 0, 0, g(Yes, No, false, false, "", "力")},
+ {0x2f13, 0, 0, 0, g(Yes, No, false, false, "", "勹")},
+ {0x2f14, 0, 0, 0, g(Yes, No, false, false, "", "匕")},
+ {0x2f15, 0, 0, 0, g(Yes, No, false, false, "", "匚")},
+ {0x2f16, 0, 0, 0, g(Yes, No, false, false, "", "匸")},
+ {0x2f17, 0, 0, 0, g(Yes, No, false, false, "", "十")},
+ {0x2f18, 0, 0, 0, g(Yes, No, false, false, "", "卜")},
+ {0x2f19, 0, 0, 0, g(Yes, No, false, false, "", "卩")},
+ {0x2f1a, 0, 0, 0, g(Yes, No, false, false, "", "厂")},
+ {0x2f1b, 0, 0, 0, g(Yes, No, false, false, "", "厶")},
+ {0x2f1c, 0, 0, 0, g(Yes, No, false, false, "", "又")},
+ {0x2f1d, 0, 0, 0, g(Yes, No, false, false, "", "口")},
+ {0x2f1e, 0, 0, 0, g(Yes, No, false, false, "", "囗")},
+ {0x2f1f, 0, 0, 0, g(Yes, No, false, false, "", "土")},
+ {0x2f20, 0, 0, 0, g(Yes, No, false, false, "", "士")},
+ {0x2f21, 0, 0, 0, g(Yes, No, false, false, "", "夂")},
+ {0x2f22, 0, 0, 0, g(Yes, No, false, false, "", "夊")},
+ {0x2f23, 0, 0, 0, g(Yes, No, false, false, "", "夕")},
+ {0x2f24, 0, 0, 0, g(Yes, No, false, false, "", "大")},
+ {0x2f25, 0, 0, 0, g(Yes, No, false, false, "", "女")},
+ {0x2f26, 0, 0, 0, g(Yes, No, false, false, "", "子")},
+ {0x2f27, 0, 0, 0, g(Yes, No, false, false, "", "宀")},
+ {0x2f28, 0, 0, 0, g(Yes, No, false, false, "", "寸")},
+ {0x2f29, 0, 0, 0, g(Yes, No, false, false, "", "小")},
+ {0x2f2a, 0, 0, 0, g(Yes, No, false, false, "", "尢")},
+ {0x2f2b, 0, 0, 0, g(Yes, No, false, false, "", "尸")},
+ {0x2f2c, 0, 0, 0, g(Yes, No, false, false, "", "屮")},
+ {0x2f2d, 0, 0, 0, g(Yes, No, false, false, "", "山")},
+ {0x2f2e, 0, 0, 0, g(Yes, No, false, false, "", "巛")},
+ {0x2f2f, 0, 0, 0, g(Yes, No, false, false, "", "工")},
+ {0x2f30, 0, 0, 0, g(Yes, No, false, false, "", "己")},
+ {0x2f31, 0, 0, 0, g(Yes, No, false, false, "", "巾")},
+ {0x2f32, 0, 0, 0, g(Yes, No, false, false, "", "干")},
+ {0x2f33, 0, 0, 0, g(Yes, No, false, false, "", "幺")},
+ {0x2f34, 0, 0, 0, g(Yes, No, false, false, "", "广")},
+ {0x2f35, 0, 0, 0, g(Yes, No, false, false, "", "廴")},
+ {0x2f36, 0, 0, 0, g(Yes, No, false, false, "", "廾")},
+ {0x2f37, 0, 0, 0, g(Yes, No, false, false, "", "弋")},
+ {0x2f38, 0, 0, 0, g(Yes, No, false, false, "", "弓")},
+ {0x2f39, 0, 0, 0, g(Yes, No, false, false, "", "彐")},
+ {0x2f3a, 0, 0, 0, g(Yes, No, false, false, "", "彡")},
+ {0x2f3b, 0, 0, 0, g(Yes, No, false, false, "", "彳")},
+ {0x2f3c, 0, 0, 0, g(Yes, No, false, false, "", "心")},
+ {0x2f3d, 0, 0, 0, g(Yes, No, false, false, "", "戈")},
+ {0x2f3e, 0, 0, 0, g(Yes, No, false, false, "", "戶")},
+ {0x2f3f, 0, 0, 0, g(Yes, No, false, false, "", "手")},
+ {0x2f40, 0, 0, 0, g(Yes, No, false, false, "", "支")},
+ {0x2f41, 0, 0, 0, g(Yes, No, false, false, "", "攴")},
+ {0x2f42, 0, 0, 0, g(Yes, No, false, false, "", "文")},
+ {0x2f43, 0, 0, 0, g(Yes, No, false, false, "", "斗")},
+ {0x2f44, 0, 0, 0, g(Yes, No, false, false, "", "斤")},
+ {0x2f45, 0, 0, 0, g(Yes, No, false, false, "", "方")},
+ {0x2f46, 0, 0, 0, g(Yes, No, false, false, "", "无")},
+ {0x2f47, 0, 0, 0, g(Yes, No, false, false, "", "日")},
+ {0x2f48, 0, 0, 0, g(Yes, No, false, false, "", "曰")},
+ {0x2f49, 0, 0, 0, g(Yes, No, false, false, "", "月")},
+ {0x2f4a, 0, 0, 0, g(Yes, No, false, false, "", "木")},
+ {0x2f4b, 0, 0, 0, g(Yes, No, false, false, "", "欠")},
+ {0x2f4c, 0, 0, 0, g(Yes, No, false, false, "", "止")},
+ {0x2f4d, 0, 0, 0, g(Yes, No, false, false, "", "歹")},
+ {0x2f4e, 0, 0, 0, g(Yes, No, false, false, "", "殳")},
+ {0x2f4f, 0, 0, 0, g(Yes, No, false, false, "", "毋")},
+ {0x2f50, 0, 0, 0, g(Yes, No, false, false, "", "比")},
+ {0x2f51, 0, 0, 0, g(Yes, No, false, false, "", "毛")},
+ {0x2f52, 0, 0, 0, g(Yes, No, false, false, "", "氏")},
+ {0x2f53, 0, 0, 0, g(Yes, No, false, false, "", "气")},
+ {0x2f54, 0, 0, 0, g(Yes, No, false, false, "", "水")},
+ {0x2f55, 0, 0, 0, g(Yes, No, false, false, "", "火")},
+ {0x2f56, 0, 0, 0, g(Yes, No, false, false, "", "爪")},
+ {0x2f57, 0, 0, 0, g(Yes, No, false, false, "", "父")},
+ {0x2f58, 0, 0, 0, g(Yes, No, false, false, "", "爻")},
+ {0x2f59, 0, 0, 0, g(Yes, No, false, false, "", "爿")},
+ {0x2f5a, 0, 0, 0, g(Yes, No, false, false, "", "片")},
+ {0x2f5b, 0, 0, 0, g(Yes, No, false, false, "", "牙")},
+ {0x2f5c, 0, 0, 0, g(Yes, No, false, false, "", "牛")},
+ {0x2f5d, 0, 0, 0, g(Yes, No, false, false, "", "犬")},
+ {0x2f5e, 0, 0, 0, g(Yes, No, false, false, "", "玄")},
+ {0x2f5f, 0, 0, 0, g(Yes, No, false, false, "", "玉")},
+ {0x2f60, 0, 0, 0, g(Yes, No, false, false, "", "瓜")},
+ {0x2f61, 0, 0, 0, g(Yes, No, false, false, "", "瓦")},
+ {0x2f62, 0, 0, 0, g(Yes, No, false, false, "", "甘")},
+ {0x2f63, 0, 0, 0, g(Yes, No, false, false, "", "生")},
+ {0x2f64, 0, 0, 0, g(Yes, No, false, false, "", "用")},
+ {0x2f65, 0, 0, 0, g(Yes, No, false, false, "", "田")},
+ {0x2f66, 0, 0, 0, g(Yes, No, false, false, "", "疋")},
+ {0x2f67, 0, 0, 0, g(Yes, No, false, false, "", "疒")},
+ {0x2f68, 0, 0, 0, g(Yes, No, false, false, "", "癶")},
+ {0x2f69, 0, 0, 0, g(Yes, No, false, false, "", "白")},
+ {0x2f6a, 0, 0, 0, g(Yes, No, false, false, "", "皮")},
+ {0x2f6b, 0, 0, 0, g(Yes, No, false, false, "", "皿")},
+ {0x2f6c, 0, 0, 0, g(Yes, No, false, false, "", "目")},
+ {0x2f6d, 0, 0, 0, g(Yes, No, false, false, "", "矛")},
+ {0x2f6e, 0, 0, 0, g(Yes, No, false, false, "", "矢")},
+ {0x2f6f, 0, 0, 0, g(Yes, No, false, false, "", "石")},
+ {0x2f70, 0, 0, 0, g(Yes, No, false, false, "", "示")},
+ {0x2f71, 0, 0, 0, g(Yes, No, false, false, "", "禸")},
+ {0x2f72, 0, 0, 0, g(Yes, No, false, false, "", "禾")},
+ {0x2f73, 0, 0, 0, g(Yes, No, false, false, "", "穴")},
+ {0x2f74, 0, 0, 0, g(Yes, No, false, false, "", "立")},
+ {0x2f75, 0, 0, 0, g(Yes, No, false, false, "", "竹")},
+ {0x2f76, 0, 0, 0, g(Yes, No, false, false, "", "米")},
+ {0x2f77, 0, 0, 0, g(Yes, No, false, false, "", "糸")},
+ {0x2f78, 0, 0, 0, g(Yes, No, false, false, "", "缶")},
+ {0x2f79, 0, 0, 0, g(Yes, No, false, false, "", "网")},
+ {0x2f7a, 0, 0, 0, g(Yes, No, false, false, "", "羊")},
+ {0x2f7b, 0, 0, 0, g(Yes, No, false, false, "", "羽")},
+ {0x2f7c, 0, 0, 0, g(Yes, No, false, false, "", "老")},
+ {0x2f7d, 0, 0, 0, g(Yes, No, false, false, "", "而")},
+ {0x2f7e, 0, 0, 0, g(Yes, No, false, false, "", "耒")},
+ {0x2f7f, 0, 0, 0, g(Yes, No, false, false, "", "耳")},
+ {0x2f80, 0, 0, 0, g(Yes, No, false, false, "", "聿")},
+ {0x2f81, 0, 0, 0, g(Yes, No, false, false, "", "肉")},
+ {0x2f82, 0, 0, 0, g(Yes, No, false, false, "", "臣")},
+ {0x2f83, 0, 0, 0, g(Yes, No, false, false, "", "自")},
+ {0x2f84, 0, 0, 0, g(Yes, No, false, false, "", "至")},
+ {0x2f85, 0, 0, 0, g(Yes, No, false, false, "", "臼")},
+ {0x2f86, 0, 0, 0, g(Yes, No, false, false, "", "舌")},
+ {0x2f87, 0, 0, 0, g(Yes, No, false, false, "", "舛")},
+ {0x2f88, 0, 0, 0, g(Yes, No, false, false, "", "舟")},
+ {0x2f89, 0, 0, 0, g(Yes, No, false, false, "", "艮")},
+ {0x2f8a, 0, 0, 0, g(Yes, No, false, false, "", "色")},
+ {0x2f8b, 0, 0, 0, g(Yes, No, false, false, "", "艸")},
+ {0x2f8c, 0, 0, 0, g(Yes, No, false, false, "", "虍")},
+ {0x2f8d, 0, 0, 0, g(Yes, No, false, false, "", "虫")},
+ {0x2f8e, 0, 0, 0, g(Yes, No, false, false, "", "血")},
+ {0x2f8f, 0, 0, 0, g(Yes, No, false, false, "", "行")},
+ {0x2f90, 0, 0, 0, g(Yes, No, false, false, "", "衣")},
+ {0x2f91, 0, 0, 0, g(Yes, No, false, false, "", "襾")},
+ {0x2f92, 0, 0, 0, g(Yes, No, false, false, "", "見")},
+ {0x2f93, 0, 0, 0, g(Yes, No, false, false, "", "角")},
+ {0x2f94, 0, 0, 0, g(Yes, No, false, false, "", "言")},
+ {0x2f95, 0, 0, 0, g(Yes, No, false, false, "", "谷")},
+ {0x2f96, 0, 0, 0, g(Yes, No, false, false, "", "豆")},
+ {0x2f97, 0, 0, 0, g(Yes, No, false, false, "", "豕")},
+ {0x2f98, 0, 0, 0, g(Yes, No, false, false, "", "豸")},
+ {0x2f99, 0, 0, 0, g(Yes, No, false, false, "", "貝")},
+ {0x2f9a, 0, 0, 0, g(Yes, No, false, false, "", "赤")},
+ {0x2f9b, 0, 0, 0, g(Yes, No, false, false, "", "走")},
+ {0x2f9c, 0, 0, 0, g(Yes, No, false, false, "", "足")},
+ {0x2f9d, 0, 0, 0, g(Yes, No, false, false, "", "身")},
+ {0x2f9e, 0, 0, 0, g(Yes, No, false, false, "", "車")},
+ {0x2f9f, 0, 0, 0, g(Yes, No, false, false, "", "辛")},
+ {0x2fa0, 0, 0, 0, g(Yes, No, false, false, "", "辰")},
+ {0x2fa1, 0, 0, 0, g(Yes, No, false, false, "", "辵")},
+ {0x2fa2, 0, 0, 0, g(Yes, No, false, false, "", "邑")},
+ {0x2fa3, 0, 0, 0, g(Yes, No, false, false, "", "酉")},
+ {0x2fa4, 0, 0, 0, g(Yes, No, false, false, "", "釆")},
+ {0x2fa5, 0, 0, 0, g(Yes, No, false, false, "", "里")},
+ {0x2fa6, 0, 0, 0, g(Yes, No, false, false, "", "金")},
+ {0x2fa7, 0, 0, 0, g(Yes, No, false, false, "", "長")},
+ {0x2fa8, 0, 0, 0, g(Yes, No, false, false, "", "門")},
+ {0x2fa9, 0, 0, 0, g(Yes, No, false, false, "", "阜")},
+ {0x2faa, 0, 0, 0, g(Yes, No, false, false, "", "隶")},
+ {0x2fab, 0, 0, 0, g(Yes, No, false, false, "", "隹")},
+ {0x2fac, 0, 0, 0, g(Yes, No, false, false, "", "雨")},
+ {0x2fad, 0, 0, 0, g(Yes, No, false, false, "", "靑")},
+ {0x2fae, 0, 0, 0, g(Yes, No, false, false, "", "非")},
+ {0x2faf, 0, 0, 0, g(Yes, No, false, false, "", "面")},
+ {0x2fb0, 0, 0, 0, g(Yes, No, false, false, "", "革")},
+ {0x2fb1, 0, 0, 0, g(Yes, No, false, false, "", "韋")},
+ {0x2fb2, 0, 0, 0, g(Yes, No, false, false, "", "韭")},
+ {0x2fb3, 0, 0, 0, g(Yes, No, false, false, "", "音")},
+ {0x2fb4, 0, 0, 0, g(Yes, No, false, false, "", "頁")},
+ {0x2fb5, 0, 0, 0, g(Yes, No, false, false, "", "風")},
+ {0x2fb6, 0, 0, 0, g(Yes, No, false, false, "", "飛")},
+ {0x2fb7, 0, 0, 0, g(Yes, No, false, false, "", "食")},
+ {0x2fb8, 0, 0, 0, g(Yes, No, false, false, "", "首")},
+ {0x2fb9, 0, 0, 0, g(Yes, No, false, false, "", "香")},
+ {0x2fba, 0, 0, 0, g(Yes, No, false, false, "", "馬")},
+ {0x2fbb, 0, 0, 0, g(Yes, No, false, false, "", "骨")},
+ {0x2fbc, 0, 0, 0, g(Yes, No, false, false, "", "高")},
+ {0x2fbd, 0, 0, 0, g(Yes, No, false, false, "", "髟")},
+ {0x2fbe, 0, 0, 0, g(Yes, No, false, false, "", "鬥")},
+ {0x2fbf, 0, 0, 0, g(Yes, No, false, false, "", "鬯")},
+ {0x2fc0, 0, 0, 0, g(Yes, No, false, false, "", "鬲")},
+ {0x2fc1, 0, 0, 0, g(Yes, No, false, false, "", "鬼")},
+ {0x2fc2, 0, 0, 0, g(Yes, No, false, false, "", "魚")},
+ {0x2fc3, 0, 0, 0, g(Yes, No, false, false, "", "鳥")},
+ {0x2fc4, 0, 0, 0, g(Yes, No, false, false, "", "鹵")},
+ {0x2fc5, 0, 0, 0, g(Yes, No, false, false, "", "鹿")},
+ {0x2fc6, 0, 0, 0, g(Yes, No, false, false, "", "麥")},
+ {0x2fc7, 0, 0, 0, g(Yes, No, false, false, "", "麻")},
+ {0x2fc8, 0, 0, 0, g(Yes, No, false, false, "", "黃")},
+ {0x2fc9, 0, 0, 0, g(Yes, No, false, false, "", "黍")},
+ {0x2fca, 0, 0, 0, g(Yes, No, false, false, "", "黑")},
+ {0x2fcb, 0, 0, 0, g(Yes, No, false, false, "", "黹")},
+ {0x2fcc, 0, 0, 0, g(Yes, No, false, false, "", "黽")},
+ {0x2fcd, 0, 0, 0, g(Yes, No, false, false, "", "鼎")},
+ {0x2fce, 0, 0, 0, g(Yes, No, false, false, "", "鼓")},
+ {0x2fcf, 0, 0, 0, g(Yes, No, false, false, "", "鼠")},
+ {0x2fd0, 0, 0, 0, g(Yes, No, false, false, "", "鼻")},
+ {0x2fd1, 0, 0, 0, g(Yes, No, false, false, "", "齊")},
+ {0x2fd2, 0, 0, 0, g(Yes, No, false, false, "", "齒")},
+ {0x2fd3, 0, 0, 0, g(Yes, No, false, false, "", "龍")},
+ {0x2fd4, 0, 0, 0, g(Yes, No, false, false, "", "龜")},
+ {0x2fd5, 0, 0, 0, g(Yes, No, false, false, "", "龠")},
+ {0x2fd6, 0, 0, 0, f(Yes, false, "")},
+ {0x3000, 0, 0, 0, g(Yes, No, false, false, "", " ")},
+ {0x3001, 0, 0, 0, f(Yes, false, "")},
+ {0x302a, 218, 1, 1, f(Yes, false, "")},
+ {0x302b, 228, 1, 1, f(Yes, false, "")},
+ {0x302c, 232, 1, 1, f(Yes, false, "")},
+ {0x302d, 222, 1, 1, f(Yes, false, "")},
+ {0x302e, 224, 1, 1, f(Yes, false, "")},
+ {0x3030, 0, 0, 0, f(Yes, false, "")},
+ {0x3036, 0, 0, 0, g(Yes, No, false, false, "", "〒")},
+ {0x3037, 0, 0, 0, f(Yes, false, "")},
+ {0x3038, 0, 0, 0, g(Yes, No, false, false, "", "十")},
+ {0x3039, 0, 0, 0, g(Yes, No, false, false, "", "卄")},
+ {0x303a, 0, 0, 0, g(Yes, No, false, false, "", "卅")},
+ {0x303b, 0, 0, 0, f(Yes, false, "")},
+ {0x3046, 0, 0, 0, f(Yes, true, "")},
+ {0x3047, 0, 0, 0, f(Yes, false, "")},
+ {0x304b, 0, 0, 0, f(Yes, true, "")},
+ {0x304c, 0, 0, 1, f(Yes, false, "が")},
+ {0x304d, 0, 0, 0, f(Yes, true, "")},
+ {0x304e, 0, 0, 1, f(Yes, false, "ぎ")},
+ {0x304f, 0, 0, 0, f(Yes, true, "")},
+ {0x3050, 0, 0, 1, f(Yes, false, "ぐ")},
+ {0x3051, 0, 0, 0, f(Yes, true, "")},
+ {0x3052, 0, 0, 1, f(Yes, false, "げ")},
+ {0x3053, 0, 0, 0, f(Yes, true, "")},
+ {0x3054, 0, 0, 1, f(Yes, false, "ご")},
+ {0x3055, 0, 0, 0, f(Yes, true, "")},
+ {0x3056, 0, 0, 1, f(Yes, false, "ざ")},
+ {0x3057, 0, 0, 0, f(Yes, true, "")},
+ {0x3058, 0, 0, 1, f(Yes, false, "じ")},
+ {0x3059, 0, 0, 0, f(Yes, true, "")},
+ {0x305a, 0, 0, 1, f(Yes, false, "ず")},
+ {0x305b, 0, 0, 0, f(Yes, true, "")},
+ {0x305c, 0, 0, 1, f(Yes, false, "ぜ")},
+ {0x305d, 0, 0, 0, f(Yes, true, "")},
+ {0x305e, 0, 0, 1, f(Yes, false, "ぞ")},
+ {0x305f, 0, 0, 0, f(Yes, true, "")},
+ {0x3060, 0, 0, 1, f(Yes, false, "だ")},
+ {0x3061, 0, 0, 0, f(Yes, true, "")},
+ {0x3062, 0, 0, 1, f(Yes, false, "ぢ")},
+ {0x3063, 0, 0, 0, f(Yes, false, "")},
+ {0x3064, 0, 0, 0, f(Yes, true, "")},
+ {0x3065, 0, 0, 1, f(Yes, false, "づ")},
+ {0x3066, 0, 0, 0, f(Yes, true, "")},
+ {0x3067, 0, 0, 1, f(Yes, false, "で")},
+ {0x3068, 0, 0, 0, f(Yes, true, "")},
+ {0x3069, 0, 0, 1, f(Yes, false, "ど")},
+ {0x306a, 0, 0, 0, f(Yes, false, "")},
+ {0x306f, 0, 0, 0, f(Yes, true, "")},
+ {0x3070, 0, 0, 1, f(Yes, false, "ば")},
+ {0x3071, 0, 0, 1, f(Yes, false, "ぱ")},
+ {0x3072, 0, 0, 0, f(Yes, true, "")},
+ {0x3073, 0, 0, 1, f(Yes, false, "び")},
+ {0x3074, 0, 0, 1, f(Yes, false, "ぴ")},
+ {0x3075, 0, 0, 0, f(Yes, true, "")},
+ {0x3076, 0, 0, 1, f(Yes, false, "ぶ")},
+ {0x3077, 0, 0, 1, f(Yes, false, "ぷ")},
+ {0x3078, 0, 0, 0, f(Yes, true, "")},
+ {0x3079, 0, 0, 1, f(Yes, false, "べ")},
+ {0x307a, 0, 0, 1, f(Yes, false, "ぺ")},
+ {0x307b, 0, 0, 0, f(Yes, true, "")},
+ {0x307c, 0, 0, 1, f(Yes, false, "ぼ")},
+ {0x307d, 0, 0, 1, f(Yes, false, "ぽ")},
+ {0x307e, 0, 0, 0, f(Yes, false, "")},
+ {0x3094, 0, 0, 1, f(Yes, false, "ゔ")},
+ {0x3095, 0, 0, 0, f(Yes, false, "")},
+ {0x3099, 8, 1, 1, f(Maybe, false, "")},
+ {0x309b, 0, 0, 1, g(Yes, No, false, false, "", " ゙")},
+ {0x309c, 0, 0, 1, g(Yes, No, false, false, "", " ゚")},
+ {0x309d, 0, 0, 0, f(Yes, true, "")},
+ {0x309e, 0, 0, 1, f(Yes, false, "ゞ")},
+ {0x309f, 0, 0, 0, g(Yes, No, false, false, "", "より")},
+ {0x30a0, 0, 0, 0, f(Yes, false, "")},
+ {0x30a6, 0, 0, 0, f(Yes, true, "")},
+ {0x30a7, 0, 0, 0, f(Yes, false, "")},
+ {0x30ab, 0, 0, 0, f(Yes, true, "")},
+ {0x30ac, 0, 0, 1, f(Yes, false, "ガ")},
+ {0x30ad, 0, 0, 0, f(Yes, true, "")},
+ {0x30ae, 0, 0, 1, f(Yes, false, "ギ")},
+ {0x30af, 0, 0, 0, f(Yes, true, "")},
+ {0x30b0, 0, 0, 1, f(Yes, false, "グ")},
+ {0x30b1, 0, 0, 0, f(Yes, true, "")},
+ {0x30b2, 0, 0, 1, f(Yes, false, "ゲ")},
+ {0x30b3, 0, 0, 0, f(Yes, true, "")},
+ {0x30b4, 0, 0, 1, f(Yes, false, "ゴ")},
+ {0x30b5, 0, 0, 0, f(Yes, true, "")},
+ {0x30b6, 0, 0, 1, f(Yes, false, "ザ")},
+ {0x30b7, 0, 0, 0, f(Yes, true, "")},
+ {0x30b8, 0, 0, 1, f(Yes, false, "ジ")},
+ {0x30b9, 0, 0, 0, f(Yes, true, "")},
+ {0x30ba, 0, 0, 1, f(Yes, false, "ズ")},
+ {0x30bb, 0, 0, 0, f(Yes, true, "")},
+ {0x30bc, 0, 0, 1, f(Yes, false, "ゼ")},
+ {0x30bd, 0, 0, 0, f(Yes, true, "")},
+ {0x30be, 0, 0, 1, f(Yes, false, "ゾ")},
+ {0x30bf, 0, 0, 0, f(Yes, true, "")},
+ {0x30c0, 0, 0, 1, f(Yes, false, "ダ")},
+ {0x30c1, 0, 0, 0, f(Yes, true, "")},
+ {0x30c2, 0, 0, 1, f(Yes, false, "ヂ")},
+ {0x30c3, 0, 0, 0, f(Yes, false, "")},
+ {0x30c4, 0, 0, 0, f(Yes, true, "")},
+ {0x30c5, 0, 0, 1, f(Yes, false, "ヅ")},
+ {0x30c6, 0, 0, 0, f(Yes, true, "")},
+ {0x30c7, 0, 0, 1, f(Yes, false, "デ")},
+ {0x30c8, 0, 0, 0, f(Yes, true, "")},
+ {0x30c9, 0, 0, 1, f(Yes, false, "ド")},
+ {0x30ca, 0, 0, 0, f(Yes, false, "")},
+ {0x30cf, 0, 0, 0, f(Yes, true, "")},
+ {0x30d0, 0, 0, 1, f(Yes, false, "バ")},
+ {0x30d1, 0, 0, 1, f(Yes, false, "パ")},
+ {0x30d2, 0, 0, 0, f(Yes, true, "")},
+ {0x30d3, 0, 0, 1, f(Yes, false, "ビ")},
+ {0x30d4, 0, 0, 1, f(Yes, false, "ピ")},
+ {0x30d5, 0, 0, 0, f(Yes, true, "")},
+ {0x30d6, 0, 0, 1, f(Yes, false, "ブ")},
+ {0x30d7, 0, 0, 1, f(Yes, false, "プ")},
+ {0x30d8, 0, 0, 0, f(Yes, true, "")},
+ {0x30d9, 0, 0, 1, f(Yes, false, "ベ")},
+ {0x30da, 0, 0, 1, f(Yes, false, "ペ")},
+ {0x30db, 0, 0, 0, f(Yes, true, "")},
+ {0x30dc, 0, 0, 1, f(Yes, false, "ボ")},
+ {0x30dd, 0, 0, 1, f(Yes, false, "ポ")},
+ {0x30de, 0, 0, 0, f(Yes, false, "")},
+ {0x30ef, 0, 0, 0, f(Yes, true, "")},
+ {0x30f3, 0, 0, 0, f(Yes, false, "")},
+ {0x30f4, 0, 0, 1, f(Yes, false, "ヴ")},
+ {0x30f5, 0, 0, 0, f(Yes, false, "")},
+ {0x30f7, 0, 0, 1, f(Yes, false, "ヷ")},
+ {0x30f8, 0, 0, 1, f(Yes, false, "ヸ")},
+ {0x30f9, 0, 0, 1, f(Yes, false, "ヹ")},
+ {0x30fa, 0, 0, 1, f(Yes, false, "ヺ")},
+ {0x30fb, 0, 0, 0, f(Yes, false, "")},
+ {0x30fd, 0, 0, 0, f(Yes, true, "")},
+ {0x30fe, 0, 0, 1, f(Yes, false, "ヾ")},
+ {0x30ff, 0, 0, 0, g(Yes, No, false, false, "", "コト")},
+ {0x3100, 0, 0, 0, f(Yes, false, "")},
+ {0x3131, 0, 0, 0, g(Yes, No, false, false, "", "ᄀ")},
+ {0x3132, 0, 0, 0, g(Yes, No, false, false, "", "ᄁ")},
+ {0x3133, 0, 1, 1, g(Yes, No, false, false, "", "ᆪ")},
+ {0x3134, 0, 0, 0, g(Yes, No, false, false, "", "ᄂ")},
+ {0x3135, 0, 1, 1, g(Yes, No, false, false, "", "ᆬ")},
+ {0x3136, 0, 1, 1, g(Yes, No, false, false, "", "ᆭ")},
+ {0x3137, 0, 0, 0, g(Yes, No, false, false, "", "ᄃ")},
+ {0x3138, 0, 0, 0, g(Yes, No, false, false, "", "ᄄ")},
+ {0x3139, 0, 0, 0, g(Yes, No, false, false, "", "ᄅ")},
+ {0x313a, 0, 1, 1, g(Yes, No, false, false, "", "ᆰ")},
+ {0x313b, 0, 1, 1, g(Yes, No, false, false, "", "ᆱ")},
+ {0x313c, 0, 1, 1, g(Yes, No, false, false, "", "ᆲ")},
+ {0x313d, 0, 1, 1, g(Yes, No, false, false, "", "ᆳ")},
+ {0x313e, 0, 1, 1, g(Yes, No, false, false, "", "ᆴ")},
+ {0x313f, 0, 1, 1, g(Yes, No, false, false, "", "ᆵ")},
+ {0x3140, 0, 0, 0, g(Yes, No, false, false, "", "ᄚ")},
+ {0x3141, 0, 0, 0, g(Yes, No, false, false, "", "ᄆ")},
+ {0x3142, 0, 0, 0, g(Yes, No, false, false, "", "ᄇ")},
+ {0x3143, 0, 0, 0, g(Yes, No, false, false, "", "ᄈ")},
+ {0x3144, 0, 0, 0, g(Yes, No, false, false, "", "ᄡ")},
+ {0x3145, 0, 0, 0, g(Yes, No, false, false, "", "ᄉ")},
+ {0x3146, 0, 0, 0, g(Yes, No, false, false, "", "ᄊ")},
+ {0x3147, 0, 0, 0, g(Yes, No, false, false, "", "ᄋ")},
+ {0x3148, 0, 0, 0, g(Yes, No, false, false, "", "ᄌ")},
+ {0x3149, 0, 0, 0, g(Yes, No, false, false, "", "ᄍ")},
+ {0x314a, 0, 0, 0, g(Yes, No, false, false, "", "ᄎ")},
+ {0x314b, 0, 0, 0, g(Yes, No, false, false, "", "ᄏ")},
+ {0x314c, 0, 0, 0, g(Yes, No, false, false, "", "ᄐ")},
+ {0x314d, 0, 0, 0, g(Yes, No, false, false, "", "ᄑ")},
+ {0x314e, 0, 0, 0, g(Yes, No, false, false, "", "ᄒ")},
+ {0x314f, 0, 1, 1, g(Yes, No, false, false, "", "ᅡ")},
+ {0x3150, 0, 1, 1, g(Yes, No, false, false, "", "ᅢ")},
+ {0x3151, 0, 1, 1, g(Yes, No, false, false, "", "ᅣ")},
+ {0x3152, 0, 1, 1, g(Yes, No, false, false, "", "ᅤ")},
+ {0x3153, 0, 1, 1, g(Yes, No, false, false, "", "ᅥ")},
+ {0x3154, 0, 1, 1, g(Yes, No, false, false, "", "ᅦ")},
+ {0x3155, 0, 1, 1, g(Yes, No, false, false, "", "ᅧ")},
+ {0x3156, 0, 1, 1, g(Yes, No, false, false, "", "ᅨ")},
+ {0x3157, 0, 1, 1, g(Yes, No, false, false, "", "ᅩ")},
+ {0x3158, 0, 1, 1, g(Yes, No, false, false, "", "ᅪ")},
+ {0x3159, 0, 1, 1, g(Yes, No, false, false, "", "ᅫ")},
+ {0x315a, 0, 1, 1, g(Yes, No, false, false, "", "ᅬ")},
+ {0x315b, 0, 1, 1, g(Yes, No, false, false, "", "ᅭ")},
+ {0x315c, 0, 1, 1, g(Yes, No, false, false, "", "ᅮ")},
+ {0x315d, 0, 1, 1, g(Yes, No, false, false, "", "ᅯ")},
+ {0x315e, 0, 1, 1, g(Yes, No, false, false, "", "ᅰ")},
+ {0x315f, 0, 1, 1, g(Yes, No, false, false, "", "ᅱ")},
+ {0x3160, 0, 1, 1, g(Yes, No, false, false, "", "ᅲ")},
+ {0x3161, 0, 1, 1, g(Yes, No, false, false, "", "ᅳ")},
+ {0x3162, 0, 1, 1, g(Yes, No, false, false, "", "ᅴ")},
+ {0x3163, 0, 1, 1, g(Yes, No, false, false, "", "ᅵ")},
+ {0x3164, 0, 0, 0, g(Yes, No, false, false, "", "ᅠ")},
+ {0x3165, 0, 0, 0, g(Yes, No, false, false, "", "ᄔ")},
+ {0x3166, 0, 0, 0, g(Yes, No, false, false, "", "ᄕ")},
+ {0x3167, 0, 0, 0, g(Yes, No, false, false, "", "ᇇ")},
+ {0x3168, 0, 0, 0, g(Yes, No, false, false, "", "ᇈ")},
+ {0x3169, 0, 0, 0, g(Yes, No, false, false, "", "ᇌ")},
+ {0x316a, 0, 0, 0, g(Yes, No, false, false, "", "ᇎ")},
+ {0x316b, 0, 0, 0, g(Yes, No, false, false, "", "ᇓ")},
+ {0x316c, 0, 0, 0, g(Yes, No, false, false, "", "ᇗ")},
+ {0x316d, 0, 0, 0, g(Yes, No, false, false, "", "ᇙ")},
+ {0x316e, 0, 0, 0, g(Yes, No, false, false, "", "ᄜ")},
+ {0x316f, 0, 0, 0, g(Yes, No, false, false, "", "ᇝ")},
+ {0x3170, 0, 0, 0, g(Yes, No, false, false, "", "ᇟ")},
+ {0x3171, 0, 0, 0, g(Yes, No, false, false, "", "ᄝ")},
+ {0x3172, 0, 0, 0, g(Yes, No, false, false, "", "ᄞ")},
+ {0x3173, 0, 0, 0, g(Yes, No, false, false, "", "ᄠ")},
+ {0x3174, 0, 0, 0, g(Yes, No, false, false, "", "ᄢ")},
+ {0x3175, 0, 0, 0, g(Yes, No, false, false, "", "ᄣ")},
+ {0x3176, 0, 0, 0, g(Yes, No, false, false, "", "ᄧ")},
+ {0x3177, 0, 0, 0, g(Yes, No, false, false, "", "ᄩ")},
+ {0x3178, 0, 0, 0, g(Yes, No, false, false, "", "ᄫ")},
+ {0x3179, 0, 0, 0, g(Yes, No, false, false, "", "ᄬ")},
+ {0x317a, 0, 0, 0, g(Yes, No, false, false, "", "ᄭ")},
+ {0x317b, 0, 0, 0, g(Yes, No, false, false, "", "ᄮ")},
+ {0x317c, 0, 0, 0, g(Yes, No, false, false, "", "ᄯ")},
+ {0x317d, 0, 0, 0, g(Yes, No, false, false, "", "ᄲ")},
+ {0x317e, 0, 0, 0, g(Yes, No, false, false, "", "ᄶ")},
+ {0x317f, 0, 0, 0, g(Yes, No, false, false, "", "ᅀ")},
+ {0x3180, 0, 0, 0, g(Yes, No, false, false, "", "ᅇ")},
+ {0x3181, 0, 0, 0, g(Yes, No, false, false, "", "ᅌ")},
+ {0x3182, 0, 0, 0, g(Yes, No, false, false, "", "ᇱ")},
+ {0x3183, 0, 0, 0, g(Yes, No, false, false, "", "ᇲ")},
+ {0x3184, 0, 0, 0, g(Yes, No, false, false, "", "ᅗ")},
+ {0x3185, 0, 0, 0, g(Yes, No, false, false, "", "ᅘ")},
+ {0x3186, 0, 0, 0, g(Yes, No, false, false, "", "ᅙ")},
+ {0x3187, 0, 0, 0, g(Yes, No, false, false, "", "ᆄ")},
+ {0x3188, 0, 0, 0, g(Yes, No, false, false, "", "ᆅ")},
+ {0x3189, 0, 0, 0, g(Yes, No, false, false, "", "ᆈ")},
+ {0x318a, 0, 0, 0, g(Yes, No, false, false, "", "ᆑ")},
+ {0x318b, 0, 0, 0, g(Yes, No, false, false, "", "ᆒ")},
+ {0x318c, 0, 0, 0, g(Yes, No, false, false, "", "ᆔ")},
+ {0x318d, 0, 0, 0, g(Yes, No, false, false, "", "ᆞ")},
+ {0x318e, 0, 0, 0, g(Yes, No, false, false, "", "ᆡ")},
+ {0x318f, 0, 0, 0, f(Yes, false, "")},
+ {0x3192, 0, 0, 0, g(Yes, No, false, false, "", "一")},
+ {0x3193, 0, 0, 0, g(Yes, No, false, false, "", "二")},
+ {0x3194, 0, 0, 0, g(Yes, No, false, false, "", "三")},
+ {0x3195, 0, 0, 0, g(Yes, No, false, false, "", "四")},
+ {0x3196, 0, 0, 0, g(Yes, No, false, false, "", "上")},
+ {0x3197, 0, 0, 0, g(Yes, No, false, false, "", "中")},
+ {0x3198, 0, 0, 0, g(Yes, No, false, false, "", "下")},
+ {0x3199, 0, 0, 0, g(Yes, No, false, false, "", "甲")},
+ {0x319a, 0, 0, 0, g(Yes, No, false, false, "", "乙")},
+ {0x319b, 0, 0, 0, g(Yes, No, false, false, "", "丙")},
+ {0x319c, 0, 0, 0, g(Yes, No, false, false, "", "丁")},
+ {0x319d, 0, 0, 0, g(Yes, No, false, false, "", "天")},
+ {0x319e, 0, 0, 0, g(Yes, No, false, false, "", "地")},
+ {0x319f, 0, 0, 0, g(Yes, No, false, false, "", "人")},
+ {0x31a0, 0, 0, 0, f(Yes, false, "")},
+ {0x3200, 0, 0, 0, g(Yes, No, false, false, "", "(ᄀ)")},
+ {0x3201, 0, 0, 0, g(Yes, No, false, false, "", "(ᄂ)")},
+ {0x3202, 0, 0, 0, g(Yes, No, false, false, "", "(ᄃ)")},
+ {0x3203, 0, 0, 0, g(Yes, No, false, false, "", "(ᄅ)")},
+ {0x3204, 0, 0, 0, g(Yes, No, false, false, "", "(ᄆ)")},
+ {0x3205, 0, 0, 0, g(Yes, No, false, false, "", "(ᄇ)")},
+ {0x3206, 0, 0, 0, g(Yes, No, false, false, "", "(ᄉ)")},
+ {0x3207, 0, 0, 0, g(Yes, No, false, false, "", "(ᄋ)")},
+ {0x3208, 0, 0, 0, g(Yes, No, false, false, "", "(ᄌ)")},
+ {0x3209, 0, 0, 0, g(Yes, No, false, false, "", "(ᄎ)")},
+ {0x320a, 0, 0, 0, g(Yes, No, false, false, "", "(ᄏ)")},
+ {0x320b, 0, 0, 0, g(Yes, No, false, false, "", "(ᄐ)")},
+ {0x320c, 0, 0, 0, g(Yes, No, false, false, "", "(ᄑ)")},
+ {0x320d, 0, 0, 0, g(Yes, No, false, false, "", "(ᄒ)")},
+ {0x320e, 0, 0, 0, g(Yes, No, false, false, "", "(가)")},
+ {0x320f, 0, 0, 0, g(Yes, No, false, false, "", "(나)")},
+ {0x3210, 0, 0, 0, g(Yes, No, false, false, "", "(다)")},
+ {0x3211, 0, 0, 0, g(Yes, No, false, false, "", "(라)")},
+ {0x3212, 0, 0, 0, g(Yes, No, false, false, "", "(마)")},
+ {0x3213, 0, 0, 0, g(Yes, No, false, false, "", "(바)")},
+ {0x3214, 0, 0, 0, g(Yes, No, false, false, "", "(사)")},
+ {0x3215, 0, 0, 0, g(Yes, No, false, false, "", "(아)")},
+ {0x3216, 0, 0, 0, g(Yes, No, false, false, "", "(자)")},
+ {0x3217, 0, 0, 0, g(Yes, No, false, false, "", "(차)")},
+ {0x3218, 0, 0, 0, g(Yes, No, false, false, "", "(카)")},
+ {0x3219, 0, 0, 0, g(Yes, No, false, false, "", "(타)")},
+ {0x321a, 0, 0, 0, g(Yes, No, false, false, "", "(파)")},
+ {0x321b, 0, 0, 0, g(Yes, No, false, false, "", "(하)")},
+ {0x321c, 0, 0, 0, g(Yes, No, false, false, "", "(주)")},
+ {0x321d, 0, 0, 0, g(Yes, No, false, false, "", "(오전)")},
+ {0x321e, 0, 0, 0, g(Yes, No, false, false, "", "(오후)")},
+ {0x321f, 0, 0, 0, f(Yes, false, "")},
+ {0x3220, 0, 0, 0, g(Yes, No, false, false, "", "(一)")},
+ {0x3221, 0, 0, 0, g(Yes, No, false, false, "", "(二)")},
+ {0x3222, 0, 0, 0, g(Yes, No, false, false, "", "(三)")},
+ {0x3223, 0, 0, 0, g(Yes, No, false, false, "", "(四)")},
+ {0x3224, 0, 0, 0, g(Yes, No, false, false, "", "(五)")},
+ {0x3225, 0, 0, 0, g(Yes, No, false, false, "", "(六)")},
+ {0x3226, 0, 0, 0, g(Yes, No, false, false, "", "(七)")},
+ {0x3227, 0, 0, 0, g(Yes, No, false, false, "", "(八)")},
+ {0x3228, 0, 0, 0, g(Yes, No, false, false, "", "(九)")},
+ {0x3229, 0, 0, 0, g(Yes, No, false, false, "", "(十)")},
+ {0x322a, 0, 0, 0, g(Yes, No, false, false, "", "(月)")},
+ {0x322b, 0, 0, 0, g(Yes, No, false, false, "", "(火)")},
+ {0x322c, 0, 0, 0, g(Yes, No, false, false, "", "(水)")},
+ {0x322d, 0, 0, 0, g(Yes, No, false, false, "", "(木)")},
+ {0x322e, 0, 0, 0, g(Yes, No, false, false, "", "(金)")},
+ {0x322f, 0, 0, 0, g(Yes, No, false, false, "", "(土)")},
+ {0x3230, 0, 0, 0, g(Yes, No, false, false, "", "(日)")},
+ {0x3231, 0, 0, 0, g(Yes, No, false, false, "", "(株)")},
+ {0x3232, 0, 0, 0, g(Yes, No, false, false, "", "(有)")},
+ {0x3233, 0, 0, 0, g(Yes, No, false, false, "", "(社)")},
+ {0x3234, 0, 0, 0, g(Yes, No, false, false, "", "(名)")},
+ {0x3235, 0, 0, 0, g(Yes, No, false, false, "", "(特)")},
+ {0x3236, 0, 0, 0, g(Yes, No, false, false, "", "(財)")},
+ {0x3237, 0, 0, 0, g(Yes, No, false, false, "", "(祝)")},
+ {0x3238, 0, 0, 0, g(Yes, No, false, false, "", "(労)")},
+ {0x3239, 0, 0, 0, g(Yes, No, false, false, "", "(代)")},
+ {0x323a, 0, 0, 0, g(Yes, No, false, false, "", "(呼)")},
+ {0x323b, 0, 0, 0, g(Yes, No, false, false, "", "(学)")},
+ {0x323c, 0, 0, 0, g(Yes, No, false, false, "", "(監)")},
+ {0x323d, 0, 0, 0, g(Yes, No, false, false, "", "(企)")},
+ {0x323e, 0, 0, 0, g(Yes, No, false, false, "", "(資)")},
+ {0x323f, 0, 0, 0, g(Yes, No, false, false, "", "(協)")},
+ {0x3240, 0, 0, 0, g(Yes, No, false, false, "", "(祭)")},
+ {0x3241, 0, 0, 0, g(Yes, No, false, false, "", "(休)")},
+ {0x3242, 0, 0, 0, g(Yes, No, false, false, "", "(自)")},
+ {0x3243, 0, 0, 0, g(Yes, No, false, false, "", "(至)")},
+ {0x3244, 0, 0, 0, g(Yes, No, false, false, "", "問")},
+ {0x3245, 0, 0, 0, g(Yes, No, false, false, "", "幼")},
+ {0x3246, 0, 0, 0, g(Yes, No, false, false, "", "文")},
+ {0x3247, 0, 0, 0, g(Yes, No, false, false, "", "箏")},
+ {0x3248, 0, 0, 0, f(Yes, false, "")},
+ {0x3250, 0, 0, 0, g(Yes, No, false, false, "", "PTE")},
+ {0x3251, 0, 0, 0, g(Yes, No, false, false, "", "21")},
+ {0x3252, 0, 0, 0, g(Yes, No, false, false, "", "22")},
+ {0x3253, 0, 0, 0, g(Yes, No, false, false, "", "23")},
+ {0x3254, 0, 0, 0, g(Yes, No, false, false, "", "24")},
+ {0x3255, 0, 0, 0, g(Yes, No, false, false, "", "25")},
+ {0x3256, 0, 0, 0, g(Yes, No, false, false, "", "26")},
+ {0x3257, 0, 0, 0, g(Yes, No, false, false, "", "27")},
+ {0x3258, 0, 0, 0, g(Yes, No, false, false, "", "28")},
+ {0x3259, 0, 0, 0, g(Yes, No, false, false, "", "29")},
+ {0x325a, 0, 0, 0, g(Yes, No, false, false, "", "30")},
+ {0x325b, 0, 0, 0, g(Yes, No, false, false, "", "31")},
+ {0x325c, 0, 0, 0, g(Yes, No, false, false, "", "32")},
+ {0x325d, 0, 0, 0, g(Yes, No, false, false, "", "33")},
+ {0x325e, 0, 0, 0, g(Yes, No, false, false, "", "34")},
+ {0x325f, 0, 0, 0, g(Yes, No, false, false, "", "35")},
+ {0x3260, 0, 0, 0, g(Yes, No, false, false, "", "ᄀ")},
+ {0x3261, 0, 0, 0, g(Yes, No, false, false, "", "ᄂ")},
+ {0x3262, 0, 0, 0, g(Yes, No, false, false, "", "ᄃ")},
+ {0x3263, 0, 0, 0, g(Yes, No, false, false, "", "ᄅ")},
+ {0x3264, 0, 0, 0, g(Yes, No, false, false, "", "ᄆ")},
+ {0x3265, 0, 0, 0, g(Yes, No, false, false, "", "ᄇ")},
+ {0x3266, 0, 0, 0, g(Yes, No, false, false, "", "ᄉ")},
+ {0x3267, 0, 0, 0, g(Yes, No, false, false, "", "ᄋ")},
+ {0x3268, 0, 0, 0, g(Yes, No, false, false, "", "ᄌ")},
+ {0x3269, 0, 0, 0, g(Yes, No, false, false, "", "ᄎ")},
+ {0x326a, 0, 0, 0, g(Yes, No, false, false, "", "ᄏ")},
+ {0x326b, 0, 0, 0, g(Yes, No, false, false, "", "ᄐ")},
+ {0x326c, 0, 0, 0, g(Yes, No, false, false, "", "ᄑ")},
+ {0x326d, 0, 0, 0, g(Yes, No, false, false, "", "ᄒ")},
+ {0x326e, 0, 0, 1, g(Yes, No, false, false, "", "가")},
+ {0x326f, 0, 0, 1, g(Yes, No, false, false, "", "나")},
+ {0x3270, 0, 0, 1, g(Yes, No, false, false, "", "다")},
+ {0x3271, 0, 0, 1, g(Yes, No, false, false, "", "라")},
+ {0x3272, 0, 0, 1, g(Yes, No, false, false, "", "마")},
+ {0x3273, 0, 0, 1, g(Yes, No, false, false, "", "바")},
+ {0x3274, 0, 0, 1, g(Yes, No, false, false, "", "사")},
+ {0x3275, 0, 0, 1, g(Yes, No, false, false, "", "아")},
+ {0x3276, 0, 0, 1, g(Yes, No, false, false, "", "자")},
+ {0x3277, 0, 0, 1, g(Yes, No, false, false, "", "차")},
+ {0x3278, 0, 0, 1, g(Yes, No, false, false, "", "카")},
+ {0x3279, 0, 0, 1, g(Yes, No, false, false, "", "타")},
+ {0x327a, 0, 0, 1, g(Yes, No, false, false, "", "파")},
+ {0x327b, 0, 0, 1, g(Yes, No, false, false, "", "하")},
+ {0x327c, 0, 0, 1, g(Yes, No, false, false, "", "참고")},
+ {0x327d, 0, 0, 1, g(Yes, No, false, false, "", "주의")},
+ {0x327e, 0, 0, 1, g(Yes, No, false, false, "", "우")},
+ {0x327f, 0, 0, 0, f(Yes, false, "")},
+ {0x3280, 0, 0, 0, g(Yes, No, false, false, "", "一")},
+ {0x3281, 0, 0, 0, g(Yes, No, false, false, "", "二")},
+ {0x3282, 0, 0, 0, g(Yes, No, false, false, "", "三")},
+ {0x3283, 0, 0, 0, g(Yes, No, false, false, "", "四")},
+ {0x3284, 0, 0, 0, g(Yes, No, false, false, "", "五")},
+ {0x3285, 0, 0, 0, g(Yes, No, false, false, "", "六")},
+ {0x3286, 0, 0, 0, g(Yes, No, false, false, "", "七")},
+ {0x3287, 0, 0, 0, g(Yes, No, false, false, "", "八")},
+ {0x3288, 0, 0, 0, g(Yes, No, false, false, "", "九")},
+ {0x3289, 0, 0, 0, g(Yes, No, false, false, "", "十")},
+ {0x328a, 0, 0, 0, g(Yes, No, false, false, "", "月")},
+ {0x328b, 0, 0, 0, g(Yes, No, false, false, "", "火")},
+ {0x328c, 0, 0, 0, g(Yes, No, false, false, "", "水")},
+ {0x328d, 0, 0, 0, g(Yes, No, false, false, "", "木")},
+ {0x328e, 0, 0, 0, g(Yes, No, false, false, "", "金")},
+ {0x328f, 0, 0, 0, g(Yes, No, false, false, "", "土")},
+ {0x3290, 0, 0, 0, g(Yes, No, false, false, "", "日")},
+ {0x3291, 0, 0, 0, g(Yes, No, false, false, "", "株")},
+ {0x3292, 0, 0, 0, g(Yes, No, false, false, "", "有")},
+ {0x3293, 0, 0, 0, g(Yes, No, false, false, "", "社")},
+ {0x3294, 0, 0, 0, g(Yes, No, false, false, "", "名")},
+ {0x3295, 0, 0, 0, g(Yes, No, false, false, "", "特")},
+ {0x3296, 0, 0, 0, g(Yes, No, false, false, "", "財")},
+ {0x3297, 0, 0, 0, g(Yes, No, false, false, "", "祝")},
+ {0x3298, 0, 0, 0, g(Yes, No, false, false, "", "労")},
+ {0x3299, 0, 0, 0, g(Yes, No, false, false, "", "秘")},
+ {0x329a, 0, 0, 0, g(Yes, No, false, false, "", "男")},
+ {0x329b, 0, 0, 0, g(Yes, No, false, false, "", "女")},
+ {0x329c, 0, 0, 0, g(Yes, No, false, false, "", "適")},
+ {0x329d, 0, 0, 0, g(Yes, No, false, false, "", "優")},
+ {0x329e, 0, 0, 0, g(Yes, No, false, false, "", "印")},
+ {0x329f, 0, 0, 0, g(Yes, No, false, false, "", "注")},
+ {0x32a0, 0, 0, 0, g(Yes, No, false, false, "", "項")},
+ {0x32a1, 0, 0, 0, g(Yes, No, false, false, "", "休")},
+ {0x32a2, 0, 0, 0, g(Yes, No, false, false, "", "写")},
+ {0x32a3, 0, 0, 0, g(Yes, No, false, false, "", "正")},
+ {0x32a4, 0, 0, 0, g(Yes, No, false, false, "", "上")},
+ {0x32a5, 0, 0, 0, g(Yes, No, false, false, "", "中")},
+ {0x32a6, 0, 0, 0, g(Yes, No, false, false, "", "下")},
+ {0x32a7, 0, 0, 0, g(Yes, No, false, false, "", "左")},
+ {0x32a8, 0, 0, 0, g(Yes, No, false, false, "", "右")},
+ {0x32a9, 0, 0, 0, g(Yes, No, false, false, "", "医")},
+ {0x32aa, 0, 0, 0, g(Yes, No, false, false, "", "宗")},
+ {0x32ab, 0, 0, 0, g(Yes, No, false, false, "", "学")},
+ {0x32ac, 0, 0, 0, g(Yes, No, false, false, "", "監")},
+ {0x32ad, 0, 0, 0, g(Yes, No, false, false, "", "企")},
+ {0x32ae, 0, 0, 0, g(Yes, No, false, false, "", "資")},
+ {0x32af, 0, 0, 0, g(Yes, No, false, false, "", "協")},
+ {0x32b0, 0, 0, 0, g(Yes, No, false, false, "", "夜")},
+ {0x32b1, 0, 0, 0, g(Yes, No, false, false, "", "36")},
+ {0x32b2, 0, 0, 0, g(Yes, No, false, false, "", "37")},
+ {0x32b3, 0, 0, 0, g(Yes, No, false, false, "", "38")},
+ {0x32b4, 0, 0, 0, g(Yes, No, false, false, "", "39")},
+ {0x32b5, 0, 0, 0, g(Yes, No, false, false, "", "40")},
+ {0x32b6, 0, 0, 0, g(Yes, No, false, false, "", "41")},
+ {0x32b7, 0, 0, 0, g(Yes, No, false, false, "", "42")},
+ {0x32b8, 0, 0, 0, g(Yes, No, false, false, "", "43")},
+ {0x32b9, 0, 0, 0, g(Yes, No, false, false, "", "44")},
+ {0x32ba, 0, 0, 0, g(Yes, No, false, false, "", "45")},
+ {0x32bb, 0, 0, 0, g(Yes, No, false, false, "", "46")},
+ {0x32bc, 0, 0, 0, g(Yes, No, false, false, "", "47")},
+ {0x32bd, 0, 0, 0, g(Yes, No, false, false, "", "48")},
+ {0x32be, 0, 0, 0, g(Yes, No, false, false, "", "49")},
+ {0x32bf, 0, 0, 0, g(Yes, No, false, false, "", "50")},
+ {0x32c0, 0, 0, 0, g(Yes, No, false, false, "", "1月")},
+ {0x32c1, 0, 0, 0, g(Yes, No, false, false, "", "2月")},
+ {0x32c2, 0, 0, 0, g(Yes, No, false, false, "", "3月")},
+ {0x32c3, 0, 0, 0, g(Yes, No, false, false, "", "4月")},
+ {0x32c4, 0, 0, 0, g(Yes, No, false, false, "", "5月")},
+ {0x32c5, 0, 0, 0, g(Yes, No, false, false, "", "6月")},
+ {0x32c6, 0, 0, 0, g(Yes, No, false, false, "", "7月")},
+ {0x32c7, 0, 0, 0, g(Yes, No, false, false, "", "8月")},
+ {0x32c8, 0, 0, 0, g(Yes, No, false, false, "", "9月")},
+ {0x32c9, 0, 0, 0, g(Yes, No, false, false, "", "10月")},
+ {0x32ca, 0, 0, 0, g(Yes, No, false, false, "", "11月")},
+ {0x32cb, 0, 0, 0, g(Yes, No, false, false, "", "12月")},
+ {0x32cc, 0, 0, 0, g(Yes, No, false, false, "", "Hg")},
+ {0x32cd, 0, 0, 0, g(Yes, No, false, false, "", "erg")},
+ {0x32ce, 0, 0, 0, g(Yes, No, false, false, "", "eV")},
+ {0x32cf, 0, 0, 0, g(Yes, No, false, false, "", "LTD")},
+ {0x32d0, 0, 0, 0, g(Yes, No, false, false, "", "ア")},
+ {0x32d1, 0, 0, 0, g(Yes, No, false, false, "", "イ")},
+ {0x32d2, 0, 0, 0, g(Yes, No, false, false, "", "ウ")},
+ {0x32d3, 0, 0, 0, g(Yes, No, false, false, "", "エ")},
+ {0x32d4, 0, 0, 0, g(Yes, No, false, false, "", "オ")},
+ {0x32d5, 0, 0, 0, g(Yes, No, false, false, "", "カ")},
+ {0x32d6, 0, 0, 0, g(Yes, No, false, false, "", "キ")},
+ {0x32d7, 0, 0, 0, g(Yes, No, false, false, "", "ク")},
+ {0x32d8, 0, 0, 0, g(Yes, No, false, false, "", "ケ")},
+ {0x32d9, 0, 0, 0, g(Yes, No, false, false, "", "コ")},
+ {0x32da, 0, 0, 0, g(Yes, No, false, false, "", "サ")},
+ {0x32db, 0, 0, 0, g(Yes, No, false, false, "", "シ")},
+ {0x32dc, 0, 0, 0, g(Yes, No, false, false, "", "ス")},
+ {0x32dd, 0, 0, 0, g(Yes, No, false, false, "", "セ")},
+ {0x32de, 0, 0, 0, g(Yes, No, false, false, "", "ソ")},
+ {0x32df, 0, 0, 0, g(Yes, No, false, false, "", "タ")},
+ {0x32e0, 0, 0, 0, g(Yes, No, false, false, "", "チ")},
+ {0x32e1, 0, 0, 0, g(Yes, No, false, false, "", "ツ")},
+ {0x32e2, 0, 0, 0, g(Yes, No, false, false, "", "テ")},
+ {0x32e3, 0, 0, 0, g(Yes, No, false, false, "", "ト")},
+ {0x32e4, 0, 0, 0, g(Yes, No, false, false, "", "ナ")},
+ {0x32e5, 0, 0, 0, g(Yes, No, false, false, "", "ニ")},
+ {0x32e6, 0, 0, 0, g(Yes, No, false, false, "", "ヌ")},
+ {0x32e7, 0, 0, 0, g(Yes, No, false, false, "", "ネ")},
+ {0x32e8, 0, 0, 0, g(Yes, No, false, false, "", "ノ")},
+ {0x32e9, 0, 0, 0, g(Yes, No, false, false, "", "ハ")},
+ {0x32ea, 0, 0, 0, g(Yes, No, false, false, "", "ヒ")},
+ {0x32eb, 0, 0, 0, g(Yes, No, false, false, "", "フ")},
+ {0x32ec, 0, 0, 0, g(Yes, No, false, false, "", "ヘ")},
+ {0x32ed, 0, 0, 0, g(Yes, No, false, false, "", "ホ")},
+ {0x32ee, 0, 0, 0, g(Yes, No, false, false, "", "マ")},
+ {0x32ef, 0, 0, 0, g(Yes, No, false, false, "", "ミ")},
+ {0x32f0, 0, 0, 0, g(Yes, No, false, false, "", "ム")},
+ {0x32f1, 0, 0, 0, g(Yes, No, false, false, "", "メ")},
+ {0x32f2, 0, 0, 0, g(Yes, No, false, false, "", "モ")},
+ {0x32f3, 0, 0, 0, g(Yes, No, false, false, "", "ヤ")},
+ {0x32f4, 0, 0, 0, g(Yes, No, false, false, "", "ユ")},
+ {0x32f5, 0, 0, 0, g(Yes, No, false, false, "", "ヨ")},
+ {0x32f6, 0, 0, 0, g(Yes, No, false, false, "", "ラ")},
+ {0x32f7, 0, 0, 0, g(Yes, No, false, false, "", "リ")},
+ {0x32f8, 0, 0, 0, g(Yes, No, false, false, "", "ル")},
+ {0x32f9, 0, 0, 0, g(Yes, No, false, false, "", "レ")},
+ {0x32fa, 0, 0, 0, g(Yes, No, false, false, "", "ロ")},
+ {0x32fb, 0, 0, 0, g(Yes, No, false, false, "", "ワ")},
+ {0x32fc, 0, 0, 0, g(Yes, No, false, false, "", "ヰ")},
+ {0x32fd, 0, 0, 0, g(Yes, No, false, false, "", "ヱ")},
+ {0x32fe, 0, 0, 0, g(Yes, No, false, false, "", "ヲ")},
+ {0x32ff, 0, 0, 0, f(Yes, false, "")},
+ {0x3300, 0, 0, 0, g(Yes, No, false, false, "", "アパート")},
+ {0x3301, 0, 0, 0, g(Yes, No, false, false, "", "アルファ")},
+ {0x3302, 0, 0, 0, g(Yes, No, false, false, "", "アンペア")},
+ {0x3303, 0, 0, 0, g(Yes, No, false, false, "", "アール")},
+ {0x3304, 0, 0, 1, g(Yes, No, false, false, "", "イニング")},
+ {0x3305, 0, 0, 0, g(Yes, No, false, false, "", "インチ")},
+ {0x3306, 0, 0, 0, g(Yes, No, false, false, "", "ウォン")},
+ {0x3307, 0, 0, 1, g(Yes, No, false, false, "", "エスクード")},
+ {0x3308, 0, 0, 0, g(Yes, No, false, false, "", "エーカー")},
+ {0x3309, 0, 0, 0, g(Yes, No, false, false, "", "オンス")},
+ {0x330a, 0, 0, 0, g(Yes, No, false, false, "", "オーム")},
+ {0x330b, 0, 0, 0, g(Yes, No, false, false, "", "カイリ")},
+ {0x330c, 0, 0, 0, g(Yes, No, false, false, "", "カラット")},
+ {0x330d, 0, 0, 0, g(Yes, No, false, false, "", "カロリー")},
+ {0x330e, 0, 0, 0, g(Yes, No, false, false, "", "ガロン")},
+ {0x330f, 0, 0, 0, g(Yes, No, false, false, "", "ガンマ")},
+ {0x3310, 0, 0, 1, g(Yes, No, false, false, "", "ギガ")},
+ {0x3311, 0, 0, 0, g(Yes, No, false, false, "", "ギニー")},
+ {0x3312, 0, 0, 0, g(Yes, No, false, false, "", "キュリー")},
+ {0x3313, 0, 0, 0, g(Yes, No, false, false, "", "ギルダー")},
+ {0x3314, 0, 0, 0, g(Yes, No, false, false, "", "キロ")},
+ {0x3315, 0, 0, 0, g(Yes, No, false, false, "", "キログラム")},
+ {0x3316, 0, 0, 0, g(Yes, No, false, false, "", "キロメートル")},
+ {0x3317, 0, 0, 0, g(Yes, No, false, false, "", "キロワット")},
+ {0x3318, 0, 0, 0, g(Yes, No, false, false, "", "グラム")},
+ {0x3319, 0, 0, 0, g(Yes, No, false, false, "", "グラムトン")},
+ {0x331a, 0, 0, 0, g(Yes, No, false, false, "", "クルゼイロ")},
+ {0x331b, 0, 0, 0, g(Yes, No, false, false, "", "クローネ")},
+ {0x331c, 0, 0, 0, g(Yes, No, false, false, "", "ケース")},
+ {0x331d, 0, 0, 0, g(Yes, No, false, false, "", "コルナ")},
+ {0x331e, 0, 0, 1, g(Yes, No, false, false, "", "コーポ")},
+ {0x331f, 0, 0, 0, g(Yes, No, false, false, "", "サイクル")},
+ {0x3320, 0, 0, 0, g(Yes, No, false, false, "", "サンチーム")},
+ {0x3321, 0, 0, 1, g(Yes, No, false, false, "", "シリング")},
+ {0x3322, 0, 0, 0, g(Yes, No, false, false, "", "センチ")},
+ {0x3323, 0, 0, 0, g(Yes, No, false, false, "", "セント")},
+ {0x3324, 0, 0, 0, g(Yes, No, false, false, "", "ダース")},
+ {0x3325, 0, 0, 0, g(Yes, No, false, false, "", "デシ")},
+ {0x3326, 0, 0, 0, g(Yes, No, false, false, "", "ドル")},
+ {0x3327, 0, 0, 0, g(Yes, No, false, false, "", "トン")},
+ {0x3328, 0, 0, 0, g(Yes, No, false, false, "", "ナノ")},
+ {0x3329, 0, 0, 0, g(Yes, No, false, false, "", "ノット")},
+ {0x332a, 0, 0, 0, g(Yes, No, false, false, "", "ハイツ")},
+ {0x332b, 0, 0, 0, g(Yes, No, false, false, "", "パーセント")},
+ {0x332c, 0, 0, 0, g(Yes, No, false, false, "", "パーツ")},
+ {0x332d, 0, 0, 0, g(Yes, No, false, false, "", "バーレル")},
+ {0x332e, 0, 0, 0, g(Yes, No, false, false, "", "ピアストル")},
+ {0x332f, 0, 0, 0, g(Yes, No, false, false, "", "ピクル")},
+ {0x3330, 0, 0, 0, g(Yes, No, false, false, "", "ピコ")},
+ {0x3331, 0, 0, 0, g(Yes, No, false, false, "", "ビル")},
+ {0x3332, 0, 0, 1, g(Yes, No, false, false, "", "ファラッド")},
+ {0x3333, 0, 0, 0, g(Yes, No, false, false, "", "フィート")},
+ {0x3334, 0, 0, 0, g(Yes, No, false, false, "", "ブッシェル")},
+ {0x3335, 0, 0, 0, g(Yes, No, false, false, "", "フラン")},
+ {0x3336, 0, 0, 0, g(Yes, No, false, false, "", "ヘクタール")},
+ {0x3337, 0, 0, 0, g(Yes, No, false, false, "", "ペソ")},
+ {0x3338, 0, 0, 0, g(Yes, No, false, false, "", "ペニヒ")},
+ {0x3339, 0, 0, 0, g(Yes, No, false, false, "", "ヘルツ")},
+ {0x333a, 0, 0, 0, g(Yes, No, false, false, "", "ペンス")},
+ {0x333b, 0, 0, 1, g(Yes, No, false, false, "", "ページ")},
+ {0x333c, 0, 0, 0, g(Yes, No, false, false, "", "ベータ")},
+ {0x333d, 0, 0, 0, g(Yes, No, false, false, "", "ポイント")},
+ {0x333e, 0, 0, 0, g(Yes, No, false, false, "", "ボルト")},
+ {0x333f, 0, 0, 0, g(Yes, No, false, false, "", "ホン")},
+ {0x3340, 0, 0, 1, g(Yes, No, false, false, "", "ポンド")},
+ {0x3341, 0, 0, 0, g(Yes, No, false, false, "", "ホール")},
+ {0x3342, 0, 0, 0, g(Yes, No, false, false, "", "ホーン")},
+ {0x3343, 0, 0, 0, g(Yes, No, false, false, "", "マイクロ")},
+ {0x3344, 0, 0, 0, g(Yes, No, false, false, "", "マイル")},
+ {0x3345, 0, 0, 0, g(Yes, No, false, false, "", "マッハ")},
+ {0x3346, 0, 0, 0, g(Yes, No, false, false, "", "マルク")},
+ {0x3347, 0, 0, 0, g(Yes, No, false, false, "", "マンション")},
+ {0x3348, 0, 0, 0, g(Yes, No, false, false, "", "ミクロン")},
+ {0x3349, 0, 0, 0, g(Yes, No, false, false, "", "ミリ")},
+ {0x334a, 0, 0, 0, g(Yes, No, false, false, "", "ミリバール")},
+ {0x334b, 0, 0, 1, g(Yes, No, false, false, "", "メガ")},
+ {0x334c, 0, 0, 0, g(Yes, No, false, false, "", "メガトン")},
+ {0x334d, 0, 0, 0, g(Yes, No, false, false, "", "メートル")},
+ {0x334e, 0, 0, 1, g(Yes, No, false, false, "", "ヤード")},
+ {0x334f, 0, 0, 0, g(Yes, No, false, false, "", "ヤール")},
+ {0x3350, 0, 0, 0, g(Yes, No, false, false, "", "ユアン")},
+ {0x3351, 0, 0, 0, g(Yes, No, false, false, "", "リットル")},
+ {0x3352, 0, 0, 0, g(Yes, No, false, false, "", "リラ")},
+ {0x3353, 0, 0, 0, g(Yes, No, false, false, "", "ルピー")},
+ {0x3354, 0, 0, 0, g(Yes, No, false, false, "", "ルーブル")},
+ {0x3355, 0, 0, 0, g(Yes, No, false, false, "", "レム")},
+ {0x3356, 0, 0, 0, g(Yes, No, false, false, "", "レントゲン")},
+ {0x3357, 0, 0, 0, g(Yes, No, false, false, "", "ワット")},
+ {0x3358, 0, 0, 0, g(Yes, No, false, false, "", "0点")},
+ {0x3359, 0, 0, 0, g(Yes, No, false, false, "", "1点")},
+ {0x335a, 0, 0, 0, g(Yes, No, false, false, "", "2点")},
+ {0x335b, 0, 0, 0, g(Yes, No, false, false, "", "3点")},
+ {0x335c, 0, 0, 0, g(Yes, No, false, false, "", "4点")},
+ {0x335d, 0, 0, 0, g(Yes, No, false, false, "", "5点")},
+ {0x335e, 0, 0, 0, g(Yes, No, false, false, "", "6点")},
+ {0x335f, 0, 0, 0, g(Yes, No, false, false, "", "7点")},
+ {0x3360, 0, 0, 0, g(Yes, No, false, false, "", "8点")},
+ {0x3361, 0, 0, 0, g(Yes, No, false, false, "", "9点")},
+ {0x3362, 0, 0, 0, g(Yes, No, false, false, "", "10点")},
+ {0x3363, 0, 0, 0, g(Yes, No, false, false, "", "11点")},
+ {0x3364, 0, 0, 0, g(Yes, No, false, false, "", "12点")},
+ {0x3365, 0, 0, 0, g(Yes, No, false, false, "", "13点")},
+ {0x3366, 0, 0, 0, g(Yes, No, false, false, "", "14点")},
+ {0x3367, 0, 0, 0, g(Yes, No, false, false, "", "15点")},
+ {0x3368, 0, 0, 0, g(Yes, No, false, false, "", "16点")},
+ {0x3369, 0, 0, 0, g(Yes, No, false, false, "", "17点")},
+ {0x336a, 0, 0, 0, g(Yes, No, false, false, "", "18点")},
+ {0x336b, 0, 0, 0, g(Yes, No, false, false, "", "19点")},
+ {0x336c, 0, 0, 0, g(Yes, No, false, false, "", "20点")},
+ {0x336d, 0, 0, 0, g(Yes, No, false, false, "", "21点")},
+ {0x336e, 0, 0, 0, g(Yes, No, false, false, "", "22点")},
+ {0x336f, 0, 0, 0, g(Yes, No, false, false, "", "23点")},
+ {0x3370, 0, 0, 0, g(Yes, No, false, false, "", "24点")},
+ {0x3371, 0, 0, 0, g(Yes, No, false, false, "", "hPa")},
+ {0x3372, 0, 0, 0, g(Yes, No, false, false, "", "da")},
+ {0x3373, 0, 0, 0, g(Yes, No, false, false, "", "AU")},
+ {0x3374, 0, 0, 0, g(Yes, No, false, false, "", "bar")},
+ {0x3375, 0, 0, 0, g(Yes, No, false, false, "", "oV")},
+ {0x3376, 0, 0, 0, g(Yes, No, false, false, "", "pc")},
+ {0x3377, 0, 0, 0, g(Yes, No, false, false, "", "dm")},
+ {0x3378, 0, 0, 0, g(Yes, No, false, false, "", "dm2")},
+ {0x3379, 0, 0, 0, g(Yes, No, false, false, "", "dm3")},
+ {0x337a, 0, 0, 0, g(Yes, No, false, false, "", "IU")},
+ {0x337b, 0, 0, 0, g(Yes, No, false, false, "", "平成")},
+ {0x337c, 0, 0, 0, g(Yes, No, false, false, "", "昭和")},
+ {0x337d, 0, 0, 0, g(Yes, No, false, false, "", "大正")},
+ {0x337e, 0, 0, 0, g(Yes, No, false, false, "", "明治")},
+ {0x337f, 0, 0, 0, g(Yes, No, false, false, "", "株式会社")},
+ {0x3380, 0, 0, 0, g(Yes, No, false, false, "", "pA")},
+ {0x3381, 0, 0, 0, g(Yes, No, false, false, "", "nA")},
+ {0x3382, 0, 0, 0, g(Yes, No, false, false, "", "μA")},
+ {0x3383, 0, 0, 0, g(Yes, No, false, false, "", "mA")},
+ {0x3384, 0, 0, 0, g(Yes, No, false, false, "", "kA")},
+ {0x3385, 0, 0, 0, g(Yes, No, false, false, "", "KB")},
+ {0x3386, 0, 0, 0, g(Yes, No, false, false, "", "MB")},
+ {0x3387, 0, 0, 0, g(Yes, No, false, false, "", "GB")},
+ {0x3388, 0, 0, 0, g(Yes, No, false, false, "", "cal")},
+ {0x3389, 0, 0, 0, g(Yes, No, false, false, "", "kcal")},
+ {0x338a, 0, 0, 0, g(Yes, No, false, false, "", "pF")},
+ {0x338b, 0, 0, 0, g(Yes, No, false, false, "", "nF")},
+ {0x338c, 0, 0, 0, g(Yes, No, false, false, "", "μF")},
+ {0x338d, 0, 0, 0, g(Yes, No, false, false, "", "μg")},
+ {0x338e, 0, 0, 0, g(Yes, No, false, false, "", "mg")},
+ {0x338f, 0, 0, 0, g(Yes, No, false, false, "", "kg")},
+ {0x3390, 0, 0, 0, g(Yes, No, false, false, "", "Hz")},
+ {0x3391, 0, 0, 0, g(Yes, No, false, false, "", "kHz")},
+ {0x3392, 0, 0, 0, g(Yes, No, false, false, "", "MHz")},
+ {0x3393, 0, 0, 0, g(Yes, No, false, false, "", "GHz")},
+ {0x3394, 0, 0, 0, g(Yes, No, false, false, "", "THz")},
+ {0x3395, 0, 0, 0, g(Yes, No, false, false, "", "μl")},
+ {0x3396, 0, 0, 0, g(Yes, No, false, false, "", "ml")},
+ {0x3397, 0, 0, 0, g(Yes, No, false, false, "", "dl")},
+ {0x3398, 0, 0, 0, g(Yes, No, false, false, "", "kl")},
+ {0x3399, 0, 0, 0, g(Yes, No, false, false, "", "fm")},
+ {0x339a, 0, 0, 0, g(Yes, No, false, false, "", "nm")},
+ {0x339b, 0, 0, 0, g(Yes, No, false, false, "", "μm")},
+ {0x339c, 0, 0, 0, g(Yes, No, false, false, "", "mm")},
+ {0x339d, 0, 0, 0, g(Yes, No, false, false, "", "cm")},
+ {0x339e, 0, 0, 0, g(Yes, No, false, false, "", "km")},
+ {0x339f, 0, 0, 0, g(Yes, No, false, false, "", "mm2")},
+ {0x33a0, 0, 0, 0, g(Yes, No, false, false, "", "cm2")},
+ {0x33a1, 0, 0, 0, g(Yes, No, false, false, "", "m2")},
+ {0x33a2, 0, 0, 0, g(Yes, No, false, false, "", "km2")},
+ {0x33a3, 0, 0, 0, g(Yes, No, false, false, "", "mm3")},
+ {0x33a4, 0, 0, 0, g(Yes, No, false, false, "", "cm3")},
+ {0x33a5, 0, 0, 0, g(Yes, No, false, false, "", "m3")},
+ {0x33a6, 0, 0, 0, g(Yes, No, false, false, "", "km3")},
+ {0x33a7, 0, 0, 0, g(Yes, No, false, false, "", "m∕s")},
+ {0x33a8, 0, 0, 0, g(Yes, No, false, false, "", "m∕s2")},
+ {0x33a9, 0, 0, 0, g(Yes, No, false, false, "", "Pa")},
+ {0x33aa, 0, 0, 0, g(Yes, No, false, false, "", "kPa")},
+ {0x33ab, 0, 0, 0, g(Yes, No, false, false, "", "MPa")},
+ {0x33ac, 0, 0, 0, g(Yes, No, false, false, "", "GPa")},
+ {0x33ad, 0, 0, 0, g(Yes, No, false, false, "", "rad")},
+ {0x33ae, 0, 0, 0, g(Yes, No, false, false, "", "rad∕s")},
+ {0x33af, 0, 0, 0, g(Yes, No, false, false, "", "rad∕s2")},
+ {0x33b0, 0, 0, 0, g(Yes, No, false, false, "", "ps")},
+ {0x33b1, 0, 0, 0, g(Yes, No, false, false, "", "ns")},
+ {0x33b2, 0, 0, 0, g(Yes, No, false, false, "", "μs")},
+ {0x33b3, 0, 0, 0, g(Yes, No, false, false, "", "ms")},
+ {0x33b4, 0, 0, 0, g(Yes, No, false, false, "", "pV")},
+ {0x33b5, 0, 0, 0, g(Yes, No, false, false, "", "nV")},
+ {0x33b6, 0, 0, 0, g(Yes, No, false, false, "", "μV")},
+ {0x33b7, 0, 0, 0, g(Yes, No, false, false, "", "mV")},
+ {0x33b8, 0, 0, 0, g(Yes, No, false, false, "", "kV")},
+ {0x33b9, 0, 0, 0, g(Yes, No, false, false, "", "MV")},
+ {0x33ba, 0, 0, 0, g(Yes, No, false, false, "", "pW")},
+ {0x33bb, 0, 0, 0, g(Yes, No, false, false, "", "nW")},
+ {0x33bc, 0, 0, 0, g(Yes, No, false, false, "", "μW")},
+ {0x33bd, 0, 0, 0, g(Yes, No, false, false, "", "mW")},
+ {0x33be, 0, 0, 0, g(Yes, No, false, false, "", "kW")},
+ {0x33bf, 0, 0, 0, g(Yes, No, false, false, "", "MW")},
+ {0x33c0, 0, 0, 0, g(Yes, No, false, false, "", "kΩ")},
+ {0x33c1, 0, 0, 0, g(Yes, No, false, false, "", "MΩ")},
+ {0x33c2, 0, 0, 0, g(Yes, No, false, false, "", "a.m.")},
+ {0x33c3, 0, 0, 0, g(Yes, No, false, false, "", "Bq")},
+ {0x33c4, 0, 0, 0, g(Yes, No, false, false, "", "cc")},
+ {0x33c5, 0, 0, 0, g(Yes, No, false, false, "", "cd")},
+ {0x33c6, 0, 0, 0, g(Yes, No, false, false, "", "C∕kg")},
+ {0x33c7, 0, 0, 0, g(Yes, No, false, false, "", "Co.")},
+ {0x33c8, 0, 0, 0, g(Yes, No, false, false, "", "dB")},
+ {0x33c9, 0, 0, 0, g(Yes, No, false, false, "", "Gy")},
+ {0x33ca, 0, 0, 0, g(Yes, No, false, false, "", "ha")},
+ {0x33cb, 0, 0, 0, g(Yes, No, false, false, "", "HP")},
+ {0x33cc, 0, 0, 0, g(Yes, No, false, false, "", "in")},
+ {0x33cd, 0, 0, 0, g(Yes, No, false, false, "", "KK")},
+ {0x33ce, 0, 0, 0, g(Yes, No, false, false, "", "KM")},
+ {0x33cf, 0, 0, 0, g(Yes, No, false, false, "", "kt")},
+ {0x33d0, 0, 0, 0, g(Yes, No, false, false, "", "lm")},
+ {0x33d1, 0, 0, 0, g(Yes, No, false, false, "", "ln")},
+ {0x33d2, 0, 0, 0, g(Yes, No, false, false, "", "log")},
+ {0x33d3, 0, 0, 0, g(Yes, No, false, false, "", "lx")},
+ {0x33d4, 0, 0, 0, g(Yes, No, false, false, "", "mb")},
+ {0x33d5, 0, 0, 0, g(Yes, No, false, false, "", "mil")},
+ {0x33d6, 0, 0, 0, g(Yes, No, false, false, "", "mol")},
+ {0x33d7, 0, 0, 0, g(Yes, No, false, false, "", "PH")},
+ {0x33d8, 0, 0, 0, g(Yes, No, false, false, "", "p.m.")},
+ {0x33d9, 0, 0, 0, g(Yes, No, false, false, "", "PPM")},
+ {0x33da, 0, 0, 0, g(Yes, No, false, false, "", "PR")},
+ {0x33db, 0, 0, 0, g(Yes, No, false, false, "", "sr")},
+ {0x33dc, 0, 0, 0, g(Yes, No, false, false, "", "Sv")},
+ {0x33dd, 0, 0, 0, g(Yes, No, false, false, "", "Wb")},
+ {0x33de, 0, 0, 0, g(Yes, No, false, false, "", "V∕m")},
+ {0x33df, 0, 0, 0, g(Yes, No, false, false, "", "A∕m")},
+ {0x33e0, 0, 0, 0, g(Yes, No, false, false, "", "1日")},
+ {0x33e1, 0, 0, 0, g(Yes, No, false, false, "", "2日")},
+ {0x33e2, 0, 0, 0, g(Yes, No, false, false, "", "3日")},
+ {0x33e3, 0, 0, 0, g(Yes, No, false, false, "", "4日")},
+ {0x33e4, 0, 0, 0, g(Yes, No, false, false, "", "5日")},
+ {0x33e5, 0, 0, 0, g(Yes, No, false, false, "", "6日")},
+ {0x33e6, 0, 0, 0, g(Yes, No, false, false, "", "7日")},
+ {0x33e7, 0, 0, 0, g(Yes, No, false, false, "", "8日")},
+ {0x33e8, 0, 0, 0, g(Yes, No, false, false, "", "9日")},
+ {0x33e9, 0, 0, 0, g(Yes, No, false, false, "", "10日")},
+ {0x33ea, 0, 0, 0, g(Yes, No, false, false, "", "11日")},
+ {0x33eb, 0, 0, 0, g(Yes, No, false, false, "", "12日")},
+ {0x33ec, 0, 0, 0, g(Yes, No, false, false, "", "13日")},
+ {0x33ed, 0, 0, 0, g(Yes, No, false, false, "", "14日")},
+ {0x33ee, 0, 0, 0, g(Yes, No, false, false, "", "15日")},
+ {0x33ef, 0, 0, 0, g(Yes, No, false, false, "", "16日")},
+ {0x33f0, 0, 0, 0, g(Yes, No, false, false, "", "17日")},
+ {0x33f1, 0, 0, 0, g(Yes, No, false, false, "", "18日")},
+ {0x33f2, 0, 0, 0, g(Yes, No, false, false, "", "19日")},
+ {0x33f3, 0, 0, 0, g(Yes, No, false, false, "", "20日")},
+ {0x33f4, 0, 0, 0, g(Yes, No, false, false, "", "21日")},
+ {0x33f5, 0, 0, 0, g(Yes, No, false, false, "", "22日")},
+ {0x33f6, 0, 0, 0, g(Yes, No, false, false, "", "23日")},
+ {0x33f7, 0, 0, 0, g(Yes, No, false, false, "", "24日")},
+ {0x33f8, 0, 0, 0, g(Yes, No, false, false, "", "25日")},
+ {0x33f9, 0, 0, 0, g(Yes, No, false, false, "", "26日")},
+ {0x33fa, 0, 0, 0, g(Yes, No, false, false, "", "27日")},
+ {0x33fb, 0, 0, 0, g(Yes, No, false, false, "", "28日")},
+ {0x33fc, 0, 0, 0, g(Yes, No, false, false, "", "29日")},
+ {0x33fd, 0, 0, 0, g(Yes, No, false, false, "", "30日")},
+ {0x33fe, 0, 0, 0, g(Yes, No, false, false, "", "31日")},
+ {0x33ff, 0, 0, 0, g(Yes, No, false, false, "", "gal")},
+ {0x3400, 0, 0, 0, f(Yes, false, "")},
+ {0xa66f, 230, 1, 1, f(Yes, false, "")},
+ {0xa670, 0, 0, 0, f(Yes, false, "")},
+ {0xa674, 230, 1, 1, f(Yes, false, "")},
+ {0xa67e, 0, 0, 0, f(Yes, false, "")},
+ {0xa69c, 0, 0, 0, g(Yes, No, false, false, "", "ъ")},
+ {0xa69d, 0, 0, 0, g(Yes, No, false, false, "", "ь")},
+ {0xa69e, 230, 1, 1, f(Yes, false, "")},
+ {0xa6a0, 0, 0, 0, f(Yes, false, "")},
+ {0xa6f0, 230, 1, 1, f(Yes, false, "")},
+ {0xa6f2, 0, 0, 0, f(Yes, false, "")},
+ {0xa770, 0, 0, 0, g(Yes, No, false, false, "", "ꝯ")},
+ {0xa771, 0, 0, 0, f(Yes, false, "")},
+ {0xa7f8, 0, 0, 0, g(Yes, No, false, false, "", "Ħ")},
+ {0xa7f9, 0, 0, 0, g(Yes, No, false, false, "", "œ")},
+ {0xa7fa, 0, 0, 0, f(Yes, false, "")},
+ {0xa806, 9, 1, 1, f(Yes, false, "")},
+ {0xa807, 0, 0, 0, f(Yes, false, "")},
+ {0xa8c4, 9, 1, 1, f(Yes, false, "")},
+ {0xa8c5, 0, 0, 0, f(Yes, false, "")},
+ {0xa8e0, 230, 1, 1, f(Yes, false, "")},
+ {0xa8f2, 0, 0, 0, f(Yes, false, "")},
+ {0xa92b, 220, 1, 1, f(Yes, false, "")},
+ {0xa92e, 0, 0, 0, f(Yes, false, "")},
+ {0xa953, 9, 1, 1, f(Yes, false, "")},
+ {0xa954, 0, 0, 0, f(Yes, false, "")},
+ {0xa9b3, 7, 1, 1, f(Yes, false, "")},
+ {0xa9b4, 0, 0, 0, f(Yes, false, "")},
+ {0xa9c0, 9, 1, 1, f(Yes, false, "")},
+ {0xa9c1, 0, 0, 0, f(Yes, false, "")},
+ {0xaab0, 230, 1, 1, f(Yes, false, "")},
+ {0xaab1, 0, 0, 0, f(Yes, false, "")},
+ {0xaab2, 230, 1, 1, f(Yes, false, "")},
+ {0xaab4, 220, 1, 1, f(Yes, false, "")},
+ {0xaab5, 0, 0, 0, f(Yes, false, "")},
+ {0xaab7, 230, 1, 1, f(Yes, false, "")},
+ {0xaab9, 0, 0, 0, f(Yes, false, "")},
+ {0xaabe, 230, 1, 1, f(Yes, false, "")},
+ {0xaac0, 0, 0, 0, f(Yes, false, "")},
+ {0xaac1, 230, 1, 1, f(Yes, false, "")},
+ {0xaac2, 0, 0, 0, f(Yes, false, "")},
+ {0xaaf6, 9, 1, 1, f(Yes, false, "")},
+ {0xaaf7, 0, 0, 0, f(Yes, false, "")},
+ {0xab5c, 0, 0, 0, g(Yes, No, false, false, "", "ꜧ")},
+ {0xab5d, 0, 0, 0, g(Yes, No, false, false, "", "ꬷ")},
+ {0xab5e, 0, 0, 0, g(Yes, No, false, false, "", "ɫ")},
+ {0xab5f, 0, 0, 0, g(Yes, No, false, false, "", "ꭒ")},
+ {0xab60, 0, 0, 0, f(Yes, false, "")},
+ {0xabed, 9, 1, 1, f(Yes, false, "")},
+ {0xabee, 0, 0, 0, f(Yes, false, "")},
+ {0xac00, 0, 0, 1, f(Yes, true, "")},
+ {0xac01, 0, 0, 2, f(Yes, false, "")},
+ {0xac1c, 0, 0, 1, f(Yes, true, "")},
+ {0xac1d, 0, 0, 2, f(Yes, false, "")},
+ {0xac38, 0, 0, 1, f(Yes, true, "")},
+ {0xac39, 0, 0, 2, f(Yes, false, "")},
+ {0xac54, 0, 0, 1, f(Yes, true, "")},
+ {0xac55, 0, 0, 2, f(Yes, false, "")},
+ {0xac70, 0, 0, 1, f(Yes, true, "")},
+ {0xac71, 0, 0, 2, f(Yes, false, "")},
+ {0xac8c, 0, 0, 1, f(Yes, true, "")},
+ {0xac8d, 0, 0, 2, f(Yes, false, "")},
+ {0xaca8, 0, 0, 1, f(Yes, true, "")},
+ {0xaca9, 0, 0, 2, f(Yes, false, "")},
+ {0xacc4, 0, 0, 1, f(Yes, true, "")},
+ {0xacc5, 0, 0, 2, f(Yes, false, "")},
+ {0xace0, 0, 0, 1, f(Yes, true, "")},
+ {0xace1, 0, 0, 2, f(Yes, false, "")},
+ {0xacfc, 0, 0, 1, f(Yes, true, "")},
+ {0xacfd, 0, 0, 2, f(Yes, false, "")},
+ {0xad18, 0, 0, 1, f(Yes, true, "")},
+ {0xad19, 0, 0, 2, f(Yes, false, "")},
+ {0xad34, 0, 0, 1, f(Yes, true, "")},
+ {0xad35, 0, 0, 2, f(Yes, false, "")},
+ {0xad50, 0, 0, 1, f(Yes, true, "")},
+ {0xad51, 0, 0, 2, f(Yes, false, "")},
+ {0xad6c, 0, 0, 1, f(Yes, true, "")},
+ {0xad6d, 0, 0, 2, f(Yes, false, "")},
+ {0xad88, 0, 0, 1, f(Yes, true, "")},
+ {0xad89, 0, 0, 2, f(Yes, false, "")},
+ {0xada4, 0, 0, 1, f(Yes, true, "")},
+ {0xada5, 0, 0, 2, f(Yes, false, "")},
+ {0xadc0, 0, 0, 1, f(Yes, true, "")},
+ {0xadc1, 0, 0, 2, f(Yes, false, "")},
+ {0xaddc, 0, 0, 1, f(Yes, true, "")},
+ {0xaddd, 0, 0, 2, f(Yes, false, "")},
+ {0xadf8, 0, 0, 1, f(Yes, true, "")},
+ {0xadf9, 0, 0, 2, f(Yes, false, "")},
+ {0xae14, 0, 0, 1, f(Yes, true, "")},
+ {0xae15, 0, 0, 2, f(Yes, false, "")},
+ {0xae30, 0, 0, 1, f(Yes, true, "")},
+ {0xae31, 0, 0, 2, f(Yes, false, "")},
+ {0xae4c, 0, 0, 1, f(Yes, true, "")},
+ {0xae4d, 0, 0, 2, f(Yes, false, "")},
+ {0xae68, 0, 0, 1, f(Yes, true, "")},
+ {0xae69, 0, 0, 2, f(Yes, false, "")},
+ {0xae84, 0, 0, 1, f(Yes, true, "")},
+ {0xae85, 0, 0, 2, f(Yes, false, "")},
+ {0xaea0, 0, 0, 1, f(Yes, true, "")},
+ {0xaea1, 0, 0, 2, f(Yes, false, "")},
+ {0xaebc, 0, 0, 1, f(Yes, true, "")},
+ {0xaebd, 0, 0, 2, f(Yes, false, "")},
+ {0xaed8, 0, 0, 1, f(Yes, true, "")},
+ {0xaed9, 0, 0, 2, f(Yes, false, "")},
+ {0xaef4, 0, 0, 1, f(Yes, true, "")},
+ {0xaef5, 0, 0, 2, f(Yes, false, "")},
+ {0xaf10, 0, 0, 1, f(Yes, true, "")},
+ {0xaf11, 0, 0, 2, f(Yes, false, "")},
+ {0xaf2c, 0, 0, 1, f(Yes, true, "")},
+ {0xaf2d, 0, 0, 2, f(Yes, false, "")},
+ {0xaf48, 0, 0, 1, f(Yes, true, "")},
+ {0xaf49, 0, 0, 2, f(Yes, false, "")},
+ {0xaf64, 0, 0, 1, f(Yes, true, "")},
+ {0xaf65, 0, 0, 2, f(Yes, false, "")},
+ {0xaf80, 0, 0, 1, f(Yes, true, "")},
+ {0xaf81, 0, 0, 2, f(Yes, false, "")},
+ {0xaf9c, 0, 0, 1, f(Yes, true, "")},
+ {0xaf9d, 0, 0, 2, f(Yes, false, "")},
+ {0xafb8, 0, 0, 1, f(Yes, true, "")},
+ {0xafb9, 0, 0, 2, f(Yes, false, "")},
+ {0xafd4, 0, 0, 1, f(Yes, true, "")},
+ {0xafd5, 0, 0, 2, f(Yes, false, "")},
+ {0xaff0, 0, 0, 1, f(Yes, true, "")},
+ {0xaff1, 0, 0, 2, f(Yes, false, "")},
+ {0xb00c, 0, 0, 1, f(Yes, true, "")},
+ {0xb00d, 0, 0, 2, f(Yes, false, "")},
+ {0xb028, 0, 0, 1, f(Yes, true, "")},
+ {0xb029, 0, 0, 2, f(Yes, false, "")},
+ {0xb044, 0, 0, 1, f(Yes, true, "")},
+ {0xb045, 0, 0, 2, f(Yes, false, "")},
+ {0xb060, 0, 0, 1, f(Yes, true, "")},
+ {0xb061, 0, 0, 2, f(Yes, false, "")},
+ {0xb07c, 0, 0, 1, f(Yes, true, "")},
+ {0xb07d, 0, 0, 2, f(Yes, false, "")},
+ {0xb098, 0, 0, 1, f(Yes, true, "")},
+ {0xb099, 0, 0, 2, f(Yes, false, "")},
+ {0xb0b4, 0, 0, 1, f(Yes, true, "")},
+ {0xb0b5, 0, 0, 2, f(Yes, false, "")},
+ {0xb0d0, 0, 0, 1, f(Yes, true, "")},
+ {0xb0d1, 0, 0, 2, f(Yes, false, "")},
+ {0xb0ec, 0, 0, 1, f(Yes, true, "")},
+ {0xb0ed, 0, 0, 2, f(Yes, false, "")},
+ {0xb108, 0, 0, 1, f(Yes, true, "")},
+ {0xb109, 0, 0, 2, f(Yes, false, "")},
+ {0xb124, 0, 0, 1, f(Yes, true, "")},
+ {0xb125, 0, 0, 2, f(Yes, false, "")},
+ {0xb140, 0, 0, 1, f(Yes, true, "")},
+ {0xb141, 0, 0, 2, f(Yes, false, "")},
+ {0xb15c, 0, 0, 1, f(Yes, true, "")},
+ {0xb15d, 0, 0, 2, f(Yes, false, "")},
+ {0xb178, 0, 0, 1, f(Yes, true, "")},
+ {0xb179, 0, 0, 2, f(Yes, false, "")},
+ {0xb194, 0, 0, 1, f(Yes, true, "")},
+ {0xb195, 0, 0, 2, f(Yes, false, "")},
+ {0xb1b0, 0, 0, 1, f(Yes, true, "")},
+ {0xb1b1, 0, 0, 2, f(Yes, false, "")},
+ {0xb1cc, 0, 0, 1, f(Yes, true, "")},
+ {0xb1cd, 0, 0, 2, f(Yes, false, "")},
+ {0xb1e8, 0, 0, 1, f(Yes, true, "")},
+ {0xb1e9, 0, 0, 2, f(Yes, false, "")},
+ {0xb204, 0, 0, 1, f(Yes, true, "")},
+ {0xb205, 0, 0, 2, f(Yes, false, "")},
+ {0xb220, 0, 0, 1, f(Yes, true, "")},
+ {0xb221, 0, 0, 2, f(Yes, false, "")},
+ {0xb23c, 0, 0, 1, f(Yes, true, "")},
+ {0xb23d, 0, 0, 2, f(Yes, false, "")},
+ {0xb258, 0, 0, 1, f(Yes, true, "")},
+ {0xb259, 0, 0, 2, f(Yes, false, "")},
+ {0xb274, 0, 0, 1, f(Yes, true, "")},
+ {0xb275, 0, 0, 2, f(Yes, false, "")},
+ {0xb290, 0, 0, 1, f(Yes, true, "")},
+ {0xb291, 0, 0, 2, f(Yes, false, "")},
+ {0xb2ac, 0, 0, 1, f(Yes, true, "")},
+ {0xb2ad, 0, 0, 2, f(Yes, false, "")},
+ {0xb2c8, 0, 0, 1, f(Yes, true, "")},
+ {0xb2c9, 0, 0, 2, f(Yes, false, "")},
+ {0xb2e4, 0, 0, 1, f(Yes, true, "")},
+ {0xb2e5, 0, 0, 2, f(Yes, false, "")},
+ {0xb300, 0, 0, 1, f(Yes, true, "")},
+ {0xb301, 0, 0, 2, f(Yes, false, "")},
+ {0xb31c, 0, 0, 1, f(Yes, true, "")},
+ {0xb31d, 0, 0, 2, f(Yes, false, "")},
+ {0xb338, 0, 0, 1, f(Yes, true, "")},
+ {0xb339, 0, 0, 2, f(Yes, false, "")},
+ {0xb354, 0, 0, 1, f(Yes, true, "")},
+ {0xb355, 0, 0, 2, f(Yes, false, "")},
+ {0xb370, 0, 0, 1, f(Yes, true, "")},
+ {0xb371, 0, 0, 2, f(Yes, false, "")},
+ {0xb38c, 0, 0, 1, f(Yes, true, "")},
+ {0xb38d, 0, 0, 2, f(Yes, false, "")},
+ {0xb3a8, 0, 0, 1, f(Yes, true, "")},
+ {0xb3a9, 0, 0, 2, f(Yes, false, "")},
+ {0xb3c4, 0, 0, 1, f(Yes, true, "")},
+ {0xb3c5, 0, 0, 2, f(Yes, false, "")},
+ {0xb3e0, 0, 0, 1, f(Yes, true, "")},
+ {0xb3e1, 0, 0, 2, f(Yes, false, "")},
+ {0xb3fc, 0, 0, 1, f(Yes, true, "")},
+ {0xb3fd, 0, 0, 2, f(Yes, false, "")},
+ {0xb418, 0, 0, 1, f(Yes, true, "")},
+ {0xb419, 0, 0, 2, f(Yes, false, "")},
+ {0xb434, 0, 0, 1, f(Yes, true, "")},
+ {0xb435, 0, 0, 2, f(Yes, false, "")},
+ {0xb450, 0, 0, 1, f(Yes, true, "")},
+ {0xb451, 0, 0, 2, f(Yes, false, "")},
+ {0xb46c, 0, 0, 1, f(Yes, true, "")},
+ {0xb46d, 0, 0, 2, f(Yes, false, "")},
+ {0xb488, 0, 0, 1, f(Yes, true, "")},
+ {0xb489, 0, 0, 2, f(Yes, false, "")},
+ {0xb4a4, 0, 0, 1, f(Yes, true, "")},
+ {0xb4a5, 0, 0, 2, f(Yes, false, "")},
+ {0xb4c0, 0, 0, 1, f(Yes, true, "")},
+ {0xb4c1, 0, 0, 2, f(Yes, false, "")},
+ {0xb4dc, 0, 0, 1, f(Yes, true, "")},
+ {0xb4dd, 0, 0, 2, f(Yes, false, "")},
+ {0xb4f8, 0, 0, 1, f(Yes, true, "")},
+ {0xb4f9, 0, 0, 2, f(Yes, false, "")},
+ {0xb514, 0, 0, 1, f(Yes, true, "")},
+ {0xb515, 0, 0, 2, f(Yes, false, "")},
+ {0xb530, 0, 0, 1, f(Yes, true, "")},
+ {0xb531, 0, 0, 2, f(Yes, false, "")},
+ {0xb54c, 0, 0, 1, f(Yes, true, "")},
+ {0xb54d, 0, 0, 2, f(Yes, false, "")},
+ {0xb568, 0, 0, 1, f(Yes, true, "")},
+ {0xb569, 0, 0, 2, f(Yes, false, "")},
+ {0xb584, 0, 0, 1, f(Yes, true, "")},
+ {0xb585, 0, 0, 2, f(Yes, false, "")},
+ {0xb5a0, 0, 0, 1, f(Yes, true, "")},
+ {0xb5a1, 0, 0, 2, f(Yes, false, "")},
+ {0xb5bc, 0, 0, 1, f(Yes, true, "")},
+ {0xb5bd, 0, 0, 2, f(Yes, false, "")},
+ {0xb5d8, 0, 0, 1, f(Yes, true, "")},
+ {0xb5d9, 0, 0, 2, f(Yes, false, "")},
+ {0xb5f4, 0, 0, 1, f(Yes, true, "")},
+ {0xb5f5, 0, 0, 2, f(Yes, false, "")},
+ {0xb610, 0, 0, 1, f(Yes, true, "")},
+ {0xb611, 0, 0, 2, f(Yes, false, "")},
+ {0xb62c, 0, 0, 1, f(Yes, true, "")},
+ {0xb62d, 0, 0, 2, f(Yes, false, "")},
+ {0xb648, 0, 0, 1, f(Yes, true, "")},
+ {0xb649, 0, 0, 2, f(Yes, false, "")},
+ {0xb664, 0, 0, 1, f(Yes, true, "")},
+ {0xb665, 0, 0, 2, f(Yes, false, "")},
+ {0xb680, 0, 0, 1, f(Yes, true, "")},
+ {0xb681, 0, 0, 2, f(Yes, false, "")},
+ {0xb69c, 0, 0, 1, f(Yes, true, "")},
+ {0xb69d, 0, 0, 2, f(Yes, false, "")},
+ {0xb6b8, 0, 0, 1, f(Yes, true, "")},
+ {0xb6b9, 0, 0, 2, f(Yes, false, "")},
+ {0xb6d4, 0, 0, 1, f(Yes, true, "")},
+ {0xb6d5, 0, 0, 2, f(Yes, false, "")},
+ {0xb6f0, 0, 0, 1, f(Yes, true, "")},
+ {0xb6f1, 0, 0, 2, f(Yes, false, "")},
+ {0xb70c, 0, 0, 1, f(Yes, true, "")},
+ {0xb70d, 0, 0, 2, f(Yes, false, "")},
+ {0xb728, 0, 0, 1, f(Yes, true, "")},
+ {0xb729, 0, 0, 2, f(Yes, false, "")},
+ {0xb744, 0, 0, 1, f(Yes, true, "")},
+ {0xb745, 0, 0, 2, f(Yes, false, "")},
+ {0xb760, 0, 0, 1, f(Yes, true, "")},
+ {0xb761, 0, 0, 2, f(Yes, false, "")},
+ {0xb77c, 0, 0, 1, f(Yes, true, "")},
+ {0xb77d, 0, 0, 2, f(Yes, false, "")},
+ {0xb798, 0, 0, 1, f(Yes, true, "")},
+ {0xb799, 0, 0, 2, f(Yes, false, "")},
+ {0xb7b4, 0, 0, 1, f(Yes, true, "")},
+ {0xb7b5, 0, 0, 2, f(Yes, false, "")},
+ {0xb7d0, 0, 0, 1, f(Yes, true, "")},
+ {0xb7d1, 0, 0, 2, f(Yes, false, "")},
+ {0xb7ec, 0, 0, 1, f(Yes, true, "")},
+ {0xb7ed, 0, 0, 2, f(Yes, false, "")},
+ {0xb808, 0, 0, 1, f(Yes, true, "")},
+ {0xb809, 0, 0, 2, f(Yes, false, "")},
+ {0xb824, 0, 0, 1, f(Yes, true, "")},
+ {0xb825, 0, 0, 2, f(Yes, false, "")},
+ {0xb840, 0, 0, 1, f(Yes, true, "")},
+ {0xb841, 0, 0, 2, f(Yes, false, "")},
+ {0xb85c, 0, 0, 1, f(Yes, true, "")},
+ {0xb85d, 0, 0, 2, f(Yes, false, "")},
+ {0xb878, 0, 0, 1, f(Yes, true, "")},
+ {0xb879, 0, 0, 2, f(Yes, false, "")},
+ {0xb894, 0, 0, 1, f(Yes, true, "")},
+ {0xb895, 0, 0, 2, f(Yes, false, "")},
+ {0xb8b0, 0, 0, 1, f(Yes, true, "")},
+ {0xb8b1, 0, 0, 2, f(Yes, false, "")},
+ {0xb8cc, 0, 0, 1, f(Yes, true, "")},
+ {0xb8cd, 0, 0, 2, f(Yes, false, "")},
+ {0xb8e8, 0, 0, 1, f(Yes, true, "")},
+ {0xb8e9, 0, 0, 2, f(Yes, false, "")},
+ {0xb904, 0, 0, 1, f(Yes, true, "")},
+ {0xb905, 0, 0, 2, f(Yes, false, "")},
+ {0xb920, 0, 0, 1, f(Yes, true, "")},
+ {0xb921, 0, 0, 2, f(Yes, false, "")},
+ {0xb93c, 0, 0, 1, f(Yes, true, "")},
+ {0xb93d, 0, 0, 2, f(Yes, false, "")},
+ {0xb958, 0, 0, 1, f(Yes, true, "")},
+ {0xb959, 0, 0, 2, f(Yes, false, "")},
+ {0xb974, 0, 0, 1, f(Yes, true, "")},
+ {0xb975, 0, 0, 2, f(Yes, false, "")},
+ {0xb990, 0, 0, 1, f(Yes, true, "")},
+ {0xb991, 0, 0, 2, f(Yes, false, "")},
+ {0xb9ac, 0, 0, 1, f(Yes, true, "")},
+ {0xb9ad, 0, 0, 2, f(Yes, false, "")},
+ {0xb9c8, 0, 0, 1, f(Yes, true, "")},
+ {0xb9c9, 0, 0, 2, f(Yes, false, "")},
+ {0xb9e4, 0, 0, 1, f(Yes, true, "")},
+ {0xb9e5, 0, 0, 2, f(Yes, false, "")},
+ {0xba00, 0, 0, 1, f(Yes, true, "")},
+ {0xba01, 0, 0, 2, f(Yes, false, "")},
+ {0xba1c, 0, 0, 1, f(Yes, true, "")},
+ {0xba1d, 0, 0, 2, f(Yes, false, "")},
+ {0xba38, 0, 0, 1, f(Yes, true, "")},
+ {0xba39, 0, 0, 2, f(Yes, false, "")},
+ {0xba54, 0, 0, 1, f(Yes, true, "")},
+ {0xba55, 0, 0, 2, f(Yes, false, "")},
+ {0xba70, 0, 0, 1, f(Yes, true, "")},
+ {0xba71, 0, 0, 2, f(Yes, false, "")},
+ {0xba8c, 0, 0, 1, f(Yes, true, "")},
+ {0xba8d, 0, 0, 2, f(Yes, false, "")},
+ {0xbaa8, 0, 0, 1, f(Yes, true, "")},
+ {0xbaa9, 0, 0, 2, f(Yes, false, "")},
+ {0xbac4, 0, 0, 1, f(Yes, true, "")},
+ {0xbac5, 0, 0, 2, f(Yes, false, "")},
+ {0xbae0, 0, 0, 1, f(Yes, true, "")},
+ {0xbae1, 0, 0, 2, f(Yes, false, "")},
+ {0xbafc, 0, 0, 1, f(Yes, true, "")},
+ {0xbafd, 0, 0, 2, f(Yes, false, "")},
+ {0xbb18, 0, 0, 1, f(Yes, true, "")},
+ {0xbb19, 0, 0, 2, f(Yes, false, "")},
+ {0xbb34, 0, 0, 1, f(Yes, true, "")},
+ {0xbb35, 0, 0, 2, f(Yes, false, "")},
+ {0xbb50, 0, 0, 1, f(Yes, true, "")},
+ {0xbb51, 0, 0, 2, f(Yes, false, "")},
+ {0xbb6c, 0, 0, 1, f(Yes, true, "")},
+ {0xbb6d, 0, 0, 2, f(Yes, false, "")},
+ {0xbb88, 0, 0, 1, f(Yes, true, "")},
+ {0xbb89, 0, 0, 2, f(Yes, false, "")},
+ {0xbba4, 0, 0, 1, f(Yes, true, "")},
+ {0xbba5, 0, 0, 2, f(Yes, false, "")},
+ {0xbbc0, 0, 0, 1, f(Yes, true, "")},
+ {0xbbc1, 0, 0, 2, f(Yes, false, "")},
+ {0xbbdc, 0, 0, 1, f(Yes, true, "")},
+ {0xbbdd, 0, 0, 2, f(Yes, false, "")},
+ {0xbbf8, 0, 0, 1, f(Yes, true, "")},
+ {0xbbf9, 0, 0, 2, f(Yes, false, "")},
+ {0xbc14, 0, 0, 1, f(Yes, true, "")},
+ {0xbc15, 0, 0, 2, f(Yes, false, "")},
+ {0xbc30, 0, 0, 1, f(Yes, true, "")},
+ {0xbc31, 0, 0, 2, f(Yes, false, "")},
+ {0xbc4c, 0, 0, 1, f(Yes, true, "")},
+ {0xbc4d, 0, 0, 2, f(Yes, false, "")},
+ {0xbc68, 0, 0, 1, f(Yes, true, "")},
+ {0xbc69, 0, 0, 2, f(Yes, false, "")},
+ {0xbc84, 0, 0, 1, f(Yes, true, "")},
+ {0xbc85, 0, 0, 2, f(Yes, false, "")},
+ {0xbca0, 0, 0, 1, f(Yes, true, "")},
+ {0xbca1, 0, 0, 2, f(Yes, false, "")},
+ {0xbcbc, 0, 0, 1, f(Yes, true, "")},
+ {0xbcbd, 0, 0, 2, f(Yes, false, "")},
+ {0xbcd8, 0, 0, 1, f(Yes, true, "")},
+ {0xbcd9, 0, 0, 2, f(Yes, false, "")},
+ {0xbcf4, 0, 0, 1, f(Yes, true, "")},
+ {0xbcf5, 0, 0, 2, f(Yes, false, "")},
+ {0xbd10, 0, 0, 1, f(Yes, true, "")},
+ {0xbd11, 0, 0, 2, f(Yes, false, "")},
+ {0xbd2c, 0, 0, 1, f(Yes, true, "")},
+ {0xbd2d, 0, 0, 2, f(Yes, false, "")},
+ {0xbd48, 0, 0, 1, f(Yes, true, "")},
+ {0xbd49, 0, 0, 2, f(Yes, false, "")},
+ {0xbd64, 0, 0, 1, f(Yes, true, "")},
+ {0xbd65, 0, 0, 2, f(Yes, false, "")},
+ {0xbd80, 0, 0, 1, f(Yes, true, "")},
+ {0xbd81, 0, 0, 2, f(Yes, false, "")},
+ {0xbd9c, 0, 0, 1, f(Yes, true, "")},
+ {0xbd9d, 0, 0, 2, f(Yes, false, "")},
+ {0xbdb8, 0, 0, 1, f(Yes, true, "")},
+ {0xbdb9, 0, 0, 2, f(Yes, false, "")},
+ {0xbdd4, 0, 0, 1, f(Yes, true, "")},
+ {0xbdd5, 0, 0, 2, f(Yes, false, "")},
+ {0xbdf0, 0, 0, 1, f(Yes, true, "")},
+ {0xbdf1, 0, 0, 2, f(Yes, false, "")},
+ {0xbe0c, 0, 0, 1, f(Yes, true, "")},
+ {0xbe0d, 0, 0, 2, f(Yes, false, "")},
+ {0xbe28, 0, 0, 1, f(Yes, true, "")},
+ {0xbe29, 0, 0, 2, f(Yes, false, "")},
+ {0xbe44, 0, 0, 1, f(Yes, true, "")},
+ {0xbe45, 0, 0, 2, f(Yes, false, "")},
+ {0xbe60, 0, 0, 1, f(Yes, true, "")},
+ {0xbe61, 0, 0, 2, f(Yes, false, "")},
+ {0xbe7c, 0, 0, 1, f(Yes, true, "")},
+ {0xbe7d, 0, 0, 2, f(Yes, false, "")},
+ {0xbe98, 0, 0, 1, f(Yes, true, "")},
+ {0xbe99, 0, 0, 2, f(Yes, false, "")},
+ {0xbeb4, 0, 0, 1, f(Yes, true, "")},
+ {0xbeb5, 0, 0, 2, f(Yes, false, "")},
+ {0xbed0, 0, 0, 1, f(Yes, true, "")},
+ {0xbed1, 0, 0, 2, f(Yes, false, "")},
+ {0xbeec, 0, 0, 1, f(Yes, true, "")},
+ {0xbeed, 0, 0, 2, f(Yes, false, "")},
+ {0xbf08, 0, 0, 1, f(Yes, true, "")},
+ {0xbf09, 0, 0, 2, f(Yes, false, "")},
+ {0xbf24, 0, 0, 1, f(Yes, true, "")},
+ {0xbf25, 0, 0, 2, f(Yes, false, "")},
+ {0xbf40, 0, 0, 1, f(Yes, true, "")},
+ {0xbf41, 0, 0, 2, f(Yes, false, "")},
+ {0xbf5c, 0, 0, 1, f(Yes, true, "")},
+ {0xbf5d, 0, 0, 2, f(Yes, false, "")},
+ {0xbf78, 0, 0, 1, f(Yes, true, "")},
+ {0xbf79, 0, 0, 2, f(Yes, false, "")},
+ {0xbf94, 0, 0, 1, f(Yes, true, "")},
+ {0xbf95, 0, 0, 2, f(Yes, false, "")},
+ {0xbfb0, 0, 0, 1, f(Yes, true, "")},
+ {0xbfb1, 0, 0, 2, f(Yes, false, "")},
+ {0xbfcc, 0, 0, 1, f(Yes, true, "")},
+ {0xbfcd, 0, 0, 2, f(Yes, false, "")},
+ {0xbfe8, 0, 0, 1, f(Yes, true, "")},
+ {0xbfe9, 0, 0, 2, f(Yes, false, "")},
+ {0xc004, 0, 0, 1, f(Yes, true, "")},
+ {0xc005, 0, 0, 2, f(Yes, false, "")},
+ {0xc020, 0, 0, 1, f(Yes, true, "")},
+ {0xc021, 0, 0, 2, f(Yes, false, "")},
+ {0xc03c, 0, 0, 1, f(Yes, true, "")},
+ {0xc03d, 0, 0, 2, f(Yes, false, "")},
+ {0xc058, 0, 0, 1, f(Yes, true, "")},
+ {0xc059, 0, 0, 2, f(Yes, false, "")},
+ {0xc074, 0, 0, 1, f(Yes, true, "")},
+ {0xc075, 0, 0, 2, f(Yes, false, "")},
+ {0xc090, 0, 0, 1, f(Yes, true, "")},
+ {0xc091, 0, 0, 2, f(Yes, false, "")},
+ {0xc0ac, 0, 0, 1, f(Yes, true, "")},
+ {0xc0ad, 0, 0, 2, f(Yes, false, "")},
+ {0xc0c8, 0, 0, 1, f(Yes, true, "")},
+ {0xc0c9, 0, 0, 2, f(Yes, false, "")},
+ {0xc0e4, 0, 0, 1, f(Yes, true, "")},
+ {0xc0e5, 0, 0, 2, f(Yes, false, "")},
+ {0xc100, 0, 0, 1, f(Yes, true, "")},
+ {0xc101, 0, 0, 2, f(Yes, false, "")},
+ {0xc11c, 0, 0, 1, f(Yes, true, "")},
+ {0xc11d, 0, 0, 2, f(Yes, false, "")},
+ {0xc138, 0, 0, 1, f(Yes, true, "")},
+ {0xc139, 0, 0, 2, f(Yes, false, "")},
+ {0xc154, 0, 0, 1, f(Yes, true, "")},
+ {0xc155, 0, 0, 2, f(Yes, false, "")},
+ {0xc170, 0, 0, 1, f(Yes, true, "")},
+ {0xc171, 0, 0, 2, f(Yes, false, "")},
+ {0xc18c, 0, 0, 1, f(Yes, true, "")},
+ {0xc18d, 0, 0, 2, f(Yes, false, "")},
+ {0xc1a8, 0, 0, 1, f(Yes, true, "")},
+ {0xc1a9, 0, 0, 2, f(Yes, false, "")},
+ {0xc1c4, 0, 0, 1, f(Yes, true, "")},
+ {0xc1c5, 0, 0, 2, f(Yes, false, "")},
+ {0xc1e0, 0, 0, 1, f(Yes, true, "")},
+ {0xc1e1, 0, 0, 2, f(Yes, false, "")},
+ {0xc1fc, 0, 0, 1, f(Yes, true, "")},
+ {0xc1fd, 0, 0, 2, f(Yes, false, "")},
+ {0xc218, 0, 0, 1, f(Yes, true, "")},
+ {0xc219, 0, 0, 2, f(Yes, false, "")},
+ {0xc234, 0, 0, 1, f(Yes, true, "")},
+ {0xc235, 0, 0, 2, f(Yes, false, "")},
+ {0xc250, 0, 0, 1, f(Yes, true, "")},
+ {0xc251, 0, 0, 2, f(Yes, false, "")},
+ {0xc26c, 0, 0, 1, f(Yes, true, "")},
+ {0xc26d, 0, 0, 2, f(Yes, false, "")},
+ {0xc288, 0, 0, 1, f(Yes, true, "")},
+ {0xc289, 0, 0, 2, f(Yes, false, "")},
+ {0xc2a4, 0, 0, 1, f(Yes, true, "")},
+ {0xc2a5, 0, 0, 2, f(Yes, false, "")},
+ {0xc2c0, 0, 0, 1, f(Yes, true, "")},
+ {0xc2c1, 0, 0, 2, f(Yes, false, "")},
+ {0xc2dc, 0, 0, 1, f(Yes, true, "")},
+ {0xc2dd, 0, 0, 2, f(Yes, false, "")},
+ {0xc2f8, 0, 0, 1, f(Yes, true, "")},
+ {0xc2f9, 0, 0, 2, f(Yes, false, "")},
+ {0xc314, 0, 0, 1, f(Yes, true, "")},
+ {0xc315, 0, 0, 2, f(Yes, false, "")},
+ {0xc330, 0, 0, 1, f(Yes, true, "")},
+ {0xc331, 0, 0, 2, f(Yes, false, "")},
+ {0xc34c, 0, 0, 1, f(Yes, true, "")},
+ {0xc34d, 0, 0, 2, f(Yes, false, "")},
+ {0xc368, 0, 0, 1, f(Yes, true, "")},
+ {0xc369, 0, 0, 2, f(Yes, false, "")},
+ {0xc384, 0, 0, 1, f(Yes, true, "")},
+ {0xc385, 0, 0, 2, f(Yes, false, "")},
+ {0xc3a0, 0, 0, 1, f(Yes, true, "")},
+ {0xc3a1, 0, 0, 2, f(Yes, false, "")},
+ {0xc3bc, 0, 0, 1, f(Yes, true, "")},
+ {0xc3bd, 0, 0, 2, f(Yes, false, "")},
+ {0xc3d8, 0, 0, 1, f(Yes, true, "")},
+ {0xc3d9, 0, 0, 2, f(Yes, false, "")},
+ {0xc3f4, 0, 0, 1, f(Yes, true, "")},
+ {0xc3f5, 0, 0, 2, f(Yes, false, "")},
+ {0xc410, 0, 0, 1, f(Yes, true, "")},
+ {0xc411, 0, 0, 2, f(Yes, false, "")},
+ {0xc42c, 0, 0, 1, f(Yes, true, "")},
+ {0xc42d, 0, 0, 2, f(Yes, false, "")},
+ {0xc448, 0, 0, 1, f(Yes, true, "")},
+ {0xc449, 0, 0, 2, f(Yes, false, "")},
+ {0xc464, 0, 0, 1, f(Yes, true, "")},
+ {0xc465, 0, 0, 2, f(Yes, false, "")},
+ {0xc480, 0, 0, 1, f(Yes, true, "")},
+ {0xc481, 0, 0, 2, f(Yes, false, "")},
+ {0xc49c, 0, 0, 1, f(Yes, true, "")},
+ {0xc49d, 0, 0, 2, f(Yes, false, "")},
+ {0xc4b8, 0, 0, 1, f(Yes, true, "")},
+ {0xc4b9, 0, 0, 2, f(Yes, false, "")},
+ {0xc4d4, 0, 0, 1, f(Yes, true, "")},
+ {0xc4d5, 0, 0, 2, f(Yes, false, "")},
+ {0xc4f0, 0, 0, 1, f(Yes, true, "")},
+ {0xc4f1, 0, 0, 2, f(Yes, false, "")},
+ {0xc50c, 0, 0, 1, f(Yes, true, "")},
+ {0xc50d, 0, 0, 2, f(Yes, false, "")},
+ {0xc528, 0, 0, 1, f(Yes, true, "")},
+ {0xc529, 0, 0, 2, f(Yes, false, "")},
+ {0xc544, 0, 0, 1, f(Yes, true, "")},
+ {0xc545, 0, 0, 2, f(Yes, false, "")},
+ {0xc560, 0, 0, 1, f(Yes, true, "")},
+ {0xc561, 0, 0, 2, f(Yes, false, "")},
+ {0xc57c, 0, 0, 1, f(Yes, true, "")},
+ {0xc57d, 0, 0, 2, f(Yes, false, "")},
+ {0xc598, 0, 0, 1, f(Yes, true, "")},
+ {0xc599, 0, 0, 2, f(Yes, false, "")},
+ {0xc5b4, 0, 0, 1, f(Yes, true, "")},
+ {0xc5b5, 0, 0, 2, f(Yes, false, "")},
+ {0xc5d0, 0, 0, 1, f(Yes, true, "")},
+ {0xc5d1, 0, 0, 2, f(Yes, false, "")},
+ {0xc5ec, 0, 0, 1, f(Yes, true, "")},
+ {0xc5ed, 0, 0, 2, f(Yes, false, "")},
+ {0xc608, 0, 0, 1, f(Yes, true, "")},
+ {0xc609, 0, 0, 2, f(Yes, false, "")},
+ {0xc624, 0, 0, 1, f(Yes, true, "")},
+ {0xc625, 0, 0, 2, f(Yes, false, "")},
+ {0xc640, 0, 0, 1, f(Yes, true, "")},
+ {0xc641, 0, 0, 2, f(Yes, false, "")},
+ {0xc65c, 0, 0, 1, f(Yes, true, "")},
+ {0xc65d, 0, 0, 2, f(Yes, false, "")},
+ {0xc678, 0, 0, 1, f(Yes, true, "")},
+ {0xc679, 0, 0, 2, f(Yes, false, "")},
+ {0xc694, 0, 0, 1, f(Yes, true, "")},
+ {0xc695, 0, 0, 2, f(Yes, false, "")},
+ {0xc6b0, 0, 0, 1, f(Yes, true, "")},
+ {0xc6b1, 0, 0, 2, f(Yes, false, "")},
+ {0xc6cc, 0, 0, 1, f(Yes, true, "")},
+ {0xc6cd, 0, 0, 2, f(Yes, false, "")},
+ {0xc6e8, 0, 0, 1, f(Yes, true, "")},
+ {0xc6e9, 0, 0, 2, f(Yes, false, "")},
+ {0xc704, 0, 0, 1, f(Yes, true, "")},
+ {0xc705, 0, 0, 2, f(Yes, false, "")},
+ {0xc720, 0, 0, 1, f(Yes, true, "")},
+ {0xc721, 0, 0, 2, f(Yes, false, "")},
+ {0xc73c, 0, 0, 1, f(Yes, true, "")},
+ {0xc73d, 0, 0, 2, f(Yes, false, "")},
+ {0xc758, 0, 0, 1, f(Yes, true, "")},
+ {0xc759, 0, 0, 2, f(Yes, false, "")},
+ {0xc774, 0, 0, 1, f(Yes, true, "")},
+ {0xc775, 0, 0, 2, f(Yes, false, "")},
+ {0xc790, 0, 0, 1, f(Yes, true, "")},
+ {0xc791, 0, 0, 2, f(Yes, false, "")},
+ {0xc7ac, 0, 0, 1, f(Yes, true, "")},
+ {0xc7ad, 0, 0, 2, f(Yes, false, "")},
+ {0xc7c8, 0, 0, 1, f(Yes, true, "")},
+ {0xc7c9, 0, 0, 2, f(Yes, false, "")},
+ {0xc7e4, 0, 0, 1, f(Yes, true, "")},
+ {0xc7e5, 0, 0, 2, f(Yes, false, "")},
+ {0xc800, 0, 0, 1, f(Yes, true, "")},
+ {0xc801, 0, 0, 2, f(Yes, false, "")},
+ {0xc81c, 0, 0, 1, f(Yes, true, "")},
+ {0xc81d, 0, 0, 2, f(Yes, false, "")},
+ {0xc838, 0, 0, 1, f(Yes, true, "")},
+ {0xc839, 0, 0, 2, f(Yes, false, "")},
+ {0xc854, 0, 0, 1, f(Yes, true, "")},
+ {0xc855, 0, 0, 2, f(Yes, false, "")},
+ {0xc870, 0, 0, 1, f(Yes, true, "")},
+ {0xc871, 0, 0, 2, f(Yes, false, "")},
+ {0xc88c, 0, 0, 1, f(Yes, true, "")},
+ {0xc88d, 0, 0, 2, f(Yes, false, "")},
+ {0xc8a8, 0, 0, 1, f(Yes, true, "")},
+ {0xc8a9, 0, 0, 2, f(Yes, false, "")},
+ {0xc8c4, 0, 0, 1, f(Yes, true, "")},
+ {0xc8c5, 0, 0, 2, f(Yes, false, "")},
+ {0xc8e0, 0, 0, 1, f(Yes, true, "")},
+ {0xc8e1, 0, 0, 2, f(Yes, false, "")},
+ {0xc8fc, 0, 0, 1, f(Yes, true, "")},
+ {0xc8fd, 0, 0, 2, f(Yes, false, "")},
+ {0xc918, 0, 0, 1, f(Yes, true, "")},
+ {0xc919, 0, 0, 2, f(Yes, false, "")},
+ {0xc934, 0, 0, 1, f(Yes, true, "")},
+ {0xc935, 0, 0, 2, f(Yes, false, "")},
+ {0xc950, 0, 0, 1, f(Yes, true, "")},
+ {0xc951, 0, 0, 2, f(Yes, false, "")},
+ {0xc96c, 0, 0, 1, f(Yes, true, "")},
+ {0xc96d, 0, 0, 2, f(Yes, false, "")},
+ {0xc988, 0, 0, 1, f(Yes, true, "")},
+ {0xc989, 0, 0, 2, f(Yes, false, "")},
+ {0xc9a4, 0, 0, 1, f(Yes, true, "")},
+ {0xc9a5, 0, 0, 2, f(Yes, false, "")},
+ {0xc9c0, 0, 0, 1, f(Yes, true, "")},
+ {0xc9c1, 0, 0, 2, f(Yes, false, "")},
+ {0xc9dc, 0, 0, 1, f(Yes, true, "")},
+ {0xc9dd, 0, 0, 2, f(Yes, false, "")},
+ {0xc9f8, 0, 0, 1, f(Yes, true, "")},
+ {0xc9f9, 0, 0, 2, f(Yes, false, "")},
+ {0xca14, 0, 0, 1, f(Yes, true, "")},
+ {0xca15, 0, 0, 2, f(Yes, false, "")},
+ {0xca30, 0, 0, 1, f(Yes, true, "")},
+ {0xca31, 0, 0, 2, f(Yes, false, "")},
+ {0xca4c, 0, 0, 1, f(Yes, true, "")},
+ {0xca4d, 0, 0, 2, f(Yes, false, "")},
+ {0xca68, 0, 0, 1, f(Yes, true, "")},
+ {0xca69, 0, 0, 2, f(Yes, false, "")},
+ {0xca84, 0, 0, 1, f(Yes, true, "")},
+ {0xca85, 0, 0, 2, f(Yes, false, "")},
+ {0xcaa0, 0, 0, 1, f(Yes, true, "")},
+ {0xcaa1, 0, 0, 2, f(Yes, false, "")},
+ {0xcabc, 0, 0, 1, f(Yes, true, "")},
+ {0xcabd, 0, 0, 2, f(Yes, false, "")},
+ {0xcad8, 0, 0, 1, f(Yes, true, "")},
+ {0xcad9, 0, 0, 2, f(Yes, false, "")},
+ {0xcaf4, 0, 0, 1, f(Yes, true, "")},
+ {0xcaf5, 0, 0, 2, f(Yes, false, "")},
+ {0xcb10, 0, 0, 1, f(Yes, true, "")},
+ {0xcb11, 0, 0, 2, f(Yes, false, "")},
+ {0xcb2c, 0, 0, 1, f(Yes, true, "")},
+ {0xcb2d, 0, 0, 2, f(Yes, false, "")},
+ {0xcb48, 0, 0, 1, f(Yes, true, "")},
+ {0xcb49, 0, 0, 2, f(Yes, false, "")},
+ {0xcb64, 0, 0, 1, f(Yes, true, "")},
+ {0xcb65, 0, 0, 2, f(Yes, false, "")},
+ {0xcb80, 0, 0, 1, f(Yes, true, "")},
+ {0xcb81, 0, 0, 2, f(Yes, false, "")},
+ {0xcb9c, 0, 0, 1, f(Yes, true, "")},
+ {0xcb9d, 0, 0, 2, f(Yes, false, "")},
+ {0xcbb8, 0, 0, 1, f(Yes, true, "")},
+ {0xcbb9, 0, 0, 2, f(Yes, false, "")},
+ {0xcbd4, 0, 0, 1, f(Yes, true, "")},
+ {0xcbd5, 0, 0, 2, f(Yes, false, "")},
+ {0xcbf0, 0, 0, 1, f(Yes, true, "")},
+ {0xcbf1, 0, 0, 2, f(Yes, false, "")},
+ {0xcc0c, 0, 0, 1, f(Yes, true, "")},
+ {0xcc0d, 0, 0, 2, f(Yes, false, "")},
+ {0xcc28, 0, 0, 1, f(Yes, true, "")},
+ {0xcc29, 0, 0, 2, f(Yes, false, "")},
+ {0xcc44, 0, 0, 1, f(Yes, true, "")},
+ {0xcc45, 0, 0, 2, f(Yes, false, "")},
+ {0xcc60, 0, 0, 1, f(Yes, true, "")},
+ {0xcc61, 0, 0, 2, f(Yes, false, "")},
+ {0xcc7c, 0, 0, 1, f(Yes, true, "")},
+ {0xcc7d, 0, 0, 2, f(Yes, false, "")},
+ {0xcc98, 0, 0, 1, f(Yes, true, "")},
+ {0xcc99, 0, 0, 2, f(Yes, false, "")},
+ {0xccb4, 0, 0, 1, f(Yes, true, "")},
+ {0xccb5, 0, 0, 2, f(Yes, false, "")},
+ {0xccd0, 0, 0, 1, f(Yes, true, "")},
+ {0xccd1, 0, 0, 2, f(Yes, false, "")},
+ {0xccec, 0, 0, 1, f(Yes, true, "")},
+ {0xcced, 0, 0, 2, f(Yes, false, "")},
+ {0xcd08, 0, 0, 1, f(Yes, true, "")},
+ {0xcd09, 0, 0, 2, f(Yes, false, "")},
+ {0xcd24, 0, 0, 1, f(Yes, true, "")},
+ {0xcd25, 0, 0, 2, f(Yes, false, "")},
+ {0xcd40, 0, 0, 1, f(Yes, true, "")},
+ {0xcd41, 0, 0, 2, f(Yes, false, "")},
+ {0xcd5c, 0, 0, 1, f(Yes, true, "")},
+ {0xcd5d, 0, 0, 2, f(Yes, false, "")},
+ {0xcd78, 0, 0, 1, f(Yes, true, "")},
+ {0xcd79, 0, 0, 2, f(Yes, false, "")},
+ {0xcd94, 0, 0, 1, f(Yes, true, "")},
+ {0xcd95, 0, 0, 2, f(Yes, false, "")},
+ {0xcdb0, 0, 0, 1, f(Yes, true, "")},
+ {0xcdb1, 0, 0, 2, f(Yes, false, "")},
+ {0xcdcc, 0, 0, 1, f(Yes, true, "")},
+ {0xcdcd, 0, 0, 2, f(Yes, false, "")},
+ {0xcde8, 0, 0, 1, f(Yes, true, "")},
+ {0xcde9, 0, 0, 2, f(Yes, false, "")},
+ {0xce04, 0, 0, 1, f(Yes, true, "")},
+ {0xce05, 0, 0, 2, f(Yes, false, "")},
+ {0xce20, 0, 0, 1, f(Yes, true, "")},
+ {0xce21, 0, 0, 2, f(Yes, false, "")},
+ {0xce3c, 0, 0, 1, f(Yes, true, "")},
+ {0xce3d, 0, 0, 2, f(Yes, false, "")},
+ {0xce58, 0, 0, 1, f(Yes, true, "")},
+ {0xce59, 0, 0, 2, f(Yes, false, "")},
+ {0xce74, 0, 0, 1, f(Yes, true, "")},
+ {0xce75, 0, 0, 2, f(Yes, false, "")},
+ {0xce90, 0, 0, 1, f(Yes, true, "")},
+ {0xce91, 0, 0, 2, f(Yes, false, "")},
+ {0xceac, 0, 0, 1, f(Yes, true, "")},
+ {0xcead, 0, 0, 2, f(Yes, false, "")},
+ {0xcec8, 0, 0, 1, f(Yes, true, "")},
+ {0xcec9, 0, 0, 2, f(Yes, false, "")},
+ {0xcee4, 0, 0, 1, f(Yes, true, "")},
+ {0xcee5, 0, 0, 2, f(Yes, false, "")},
+ {0xcf00, 0, 0, 1, f(Yes, true, "")},
+ {0xcf01, 0, 0, 2, f(Yes, false, "")},
+ {0xcf1c, 0, 0, 1, f(Yes, true, "")},
+ {0xcf1d, 0, 0, 2, f(Yes, false, "")},
+ {0xcf38, 0, 0, 1, f(Yes, true, "")},
+ {0xcf39, 0, 0, 2, f(Yes, false, "")},
+ {0xcf54, 0, 0, 1, f(Yes, true, "")},
+ {0xcf55, 0, 0, 2, f(Yes, false, "")},
+ {0xcf70, 0, 0, 1, f(Yes, true, "")},
+ {0xcf71, 0, 0, 2, f(Yes, false, "")},
+ {0xcf8c, 0, 0, 1, f(Yes, true, "")},
+ {0xcf8d, 0, 0, 2, f(Yes, false, "")},
+ {0xcfa8, 0, 0, 1, f(Yes, true, "")},
+ {0xcfa9, 0, 0, 2, f(Yes, false, "")},
+ {0xcfc4, 0, 0, 1, f(Yes, true, "")},
+ {0xcfc5, 0, 0, 2, f(Yes, false, "")},
+ {0xcfe0, 0, 0, 1, f(Yes, true, "")},
+ {0xcfe1, 0, 0, 2, f(Yes, false, "")},
+ {0xcffc, 0, 0, 1, f(Yes, true, "")},
+ {0xcffd, 0, 0, 2, f(Yes, false, "")},
+ {0xd018, 0, 0, 1, f(Yes, true, "")},
+ {0xd019, 0, 0, 2, f(Yes, false, "")},
+ {0xd034, 0, 0, 1, f(Yes, true, "")},
+ {0xd035, 0, 0, 2, f(Yes, false, "")},
+ {0xd050, 0, 0, 1, f(Yes, true, "")},
+ {0xd051, 0, 0, 2, f(Yes, false, "")},
+ {0xd06c, 0, 0, 1, f(Yes, true, "")},
+ {0xd06d, 0, 0, 2, f(Yes, false, "")},
+ {0xd088, 0, 0, 1, f(Yes, true, "")},
+ {0xd089, 0, 0, 2, f(Yes, false, "")},
+ {0xd0a4, 0, 0, 1, f(Yes, true, "")},
+ {0xd0a5, 0, 0, 2, f(Yes, false, "")},
+ {0xd0c0, 0, 0, 1, f(Yes, true, "")},
+ {0xd0c1, 0, 0, 2, f(Yes, false, "")},
+ {0xd0dc, 0, 0, 1, f(Yes, true, "")},
+ {0xd0dd, 0, 0, 2, f(Yes, false, "")},
+ {0xd0f8, 0, 0, 1, f(Yes, true, "")},
+ {0xd0f9, 0, 0, 2, f(Yes, false, "")},
+ {0xd114, 0, 0, 1, f(Yes, true, "")},
+ {0xd115, 0, 0, 2, f(Yes, false, "")},
+ {0xd130, 0, 0, 1, f(Yes, true, "")},
+ {0xd131, 0, 0, 2, f(Yes, false, "")},
+ {0xd14c, 0, 0, 1, f(Yes, true, "")},
+ {0xd14d, 0, 0, 2, f(Yes, false, "")},
+ {0xd168, 0, 0, 1, f(Yes, true, "")},
+ {0xd169, 0, 0, 2, f(Yes, false, "")},
+ {0xd184, 0, 0, 1, f(Yes, true, "")},
+ {0xd185, 0, 0, 2, f(Yes, false, "")},
+ {0xd1a0, 0, 0, 1, f(Yes, true, "")},
+ {0xd1a1, 0, 0, 2, f(Yes, false, "")},
+ {0xd1bc, 0, 0, 1, f(Yes, true, "")},
+ {0xd1bd, 0, 0, 2, f(Yes, false, "")},
+ {0xd1d8, 0, 0, 1, f(Yes, true, "")},
+ {0xd1d9, 0, 0, 2, f(Yes, false, "")},
+ {0xd1f4, 0, 0, 1, f(Yes, true, "")},
+ {0xd1f5, 0, 0, 2, f(Yes, false, "")},
+ {0xd210, 0, 0, 1, f(Yes, true, "")},
+ {0xd211, 0, 0, 2, f(Yes, false, "")},
+ {0xd22c, 0, 0, 1, f(Yes, true, "")},
+ {0xd22d, 0, 0, 2, f(Yes, false, "")},
+ {0xd248, 0, 0, 1, f(Yes, true, "")},
+ {0xd249, 0, 0, 2, f(Yes, false, "")},
+ {0xd264, 0, 0, 1, f(Yes, true, "")},
+ {0xd265, 0, 0, 2, f(Yes, false, "")},
+ {0xd280, 0, 0, 1, f(Yes, true, "")},
+ {0xd281, 0, 0, 2, f(Yes, false, "")},
+ {0xd29c, 0, 0, 1, f(Yes, true, "")},
+ {0xd29d, 0, 0, 2, f(Yes, false, "")},
+ {0xd2b8, 0, 0, 1, f(Yes, true, "")},
+ {0xd2b9, 0, 0, 2, f(Yes, false, "")},
+ {0xd2d4, 0, 0, 1, f(Yes, true, "")},
+ {0xd2d5, 0, 0, 2, f(Yes, false, "")},
+ {0xd2f0, 0, 0, 1, f(Yes, true, "")},
+ {0xd2f1, 0, 0, 2, f(Yes, false, "")},
+ {0xd30c, 0, 0, 1, f(Yes, true, "")},
+ {0xd30d, 0, 0, 2, f(Yes, false, "")},
+ {0xd328, 0, 0, 1, f(Yes, true, "")},
+ {0xd329, 0, 0, 2, f(Yes, false, "")},
+ {0xd344, 0, 0, 1, f(Yes, true, "")},
+ {0xd345, 0, 0, 2, f(Yes, false, "")},
+ {0xd360, 0, 0, 1, f(Yes, true, "")},
+ {0xd361, 0, 0, 2, f(Yes, false, "")},
+ {0xd37c, 0, 0, 1, f(Yes, true, "")},
+ {0xd37d, 0, 0, 2, f(Yes, false, "")},
+ {0xd398, 0, 0, 1, f(Yes, true, "")},
+ {0xd399, 0, 0, 2, f(Yes, false, "")},
+ {0xd3b4, 0, 0, 1, f(Yes, true, "")},
+ {0xd3b5, 0, 0, 2, f(Yes, false, "")},
+ {0xd3d0, 0, 0, 1, f(Yes, true, "")},
+ {0xd3d1, 0, 0, 2, f(Yes, false, "")},
+ {0xd3ec, 0, 0, 1, f(Yes, true, "")},
+ {0xd3ed, 0, 0, 2, f(Yes, false, "")},
+ {0xd408, 0, 0, 1, f(Yes, true, "")},
+ {0xd409, 0, 0, 2, f(Yes, false, "")},
+ {0xd424, 0, 0, 1, f(Yes, true, "")},
+ {0xd425, 0, 0, 2, f(Yes, false, "")},
+ {0xd440, 0, 0, 1, f(Yes, true, "")},
+ {0xd441, 0, 0, 2, f(Yes, false, "")},
+ {0xd45c, 0, 0, 1, f(Yes, true, "")},
+ {0xd45d, 0, 0, 2, f(Yes, false, "")},
+ {0xd478, 0, 0, 1, f(Yes, true, "")},
+ {0xd479, 0, 0, 2, f(Yes, false, "")},
+ {0xd494, 0, 0, 1, f(Yes, true, "")},
+ {0xd495, 0, 0, 2, f(Yes, false, "")},
+ {0xd4b0, 0, 0, 1, f(Yes, true, "")},
+ {0xd4b1, 0, 0, 2, f(Yes, false, "")},
+ {0xd4cc, 0, 0, 1, f(Yes, true, "")},
+ {0xd4cd, 0, 0, 2, f(Yes, false, "")},
+ {0xd4e8, 0, 0, 1, f(Yes, true, "")},
+ {0xd4e9, 0, 0, 2, f(Yes, false, "")},
+ {0xd504, 0, 0, 1, f(Yes, true, "")},
+ {0xd505, 0, 0, 2, f(Yes, false, "")},
+ {0xd520, 0, 0, 1, f(Yes, true, "")},
+ {0xd521, 0, 0, 2, f(Yes, false, "")},
+ {0xd53c, 0, 0, 1, f(Yes, true, "")},
+ {0xd53d, 0, 0, 2, f(Yes, false, "")},
+ {0xd558, 0, 0, 1, f(Yes, true, "")},
+ {0xd559, 0, 0, 2, f(Yes, false, "")},
+ {0xd574, 0, 0, 1, f(Yes, true, "")},
+ {0xd575, 0, 0, 2, f(Yes, false, "")},
+ {0xd590, 0, 0, 1, f(Yes, true, "")},
+ {0xd591, 0, 0, 2, f(Yes, false, "")},
+ {0xd5ac, 0, 0, 1, f(Yes, true, "")},
+ {0xd5ad, 0, 0, 2, f(Yes, false, "")},
+ {0xd5c8, 0, 0, 1, f(Yes, true, "")},
+ {0xd5c9, 0, 0, 2, f(Yes, false, "")},
+ {0xd5e4, 0, 0, 1, f(Yes, true, "")},
+ {0xd5e5, 0, 0, 2, f(Yes, false, "")},
+ {0xd600, 0, 0, 1, f(Yes, true, "")},
+ {0xd601, 0, 0, 2, f(Yes, false, "")},
+ {0xd61c, 0, 0, 1, f(Yes, true, "")},
+ {0xd61d, 0, 0, 2, f(Yes, false, "")},
+ {0xd638, 0, 0, 1, f(Yes, true, "")},
+ {0xd639, 0, 0, 2, f(Yes, false, "")},
+ {0xd654, 0, 0, 1, f(Yes, true, "")},
+ {0xd655, 0, 0, 2, f(Yes, false, "")},
+ {0xd670, 0, 0, 1, f(Yes, true, "")},
+ {0xd671, 0, 0, 2, f(Yes, false, "")},
+ {0xd68c, 0, 0, 1, f(Yes, true, "")},
+ {0xd68d, 0, 0, 2, f(Yes, false, "")},
+ {0xd6a8, 0, 0, 1, f(Yes, true, "")},
+ {0xd6a9, 0, 0, 2, f(Yes, false, "")},
+ {0xd6c4, 0, 0, 1, f(Yes, true, "")},
+ {0xd6c5, 0, 0, 2, f(Yes, false, "")},
+ {0xd6e0, 0, 0, 1, f(Yes, true, "")},
+ {0xd6e1, 0, 0, 2, f(Yes, false, "")},
+ {0xd6fc, 0, 0, 1, f(Yes, true, "")},
+ {0xd6fd, 0, 0, 2, f(Yes, false, "")},
+ {0xd718, 0, 0, 1, f(Yes, true, "")},
+ {0xd719, 0, 0, 2, f(Yes, false, "")},
+ {0xd734, 0, 0, 1, f(Yes, true, "")},
+ {0xd735, 0, 0, 2, f(Yes, false, "")},
+ {0xd750, 0, 0, 1, f(Yes, true, "")},
+ {0xd751, 0, 0, 2, f(Yes, false, "")},
+ {0xd76c, 0, 0, 1, f(Yes, true, "")},
+ {0xd76d, 0, 0, 2, f(Yes, false, "")},
+ {0xd788, 0, 0, 1, f(Yes, true, "")},
+ {0xd789, 0, 0, 2, f(Yes, false, "")},
+ {0xd7a4, 0, 0, 0, f(Yes, false, "")},
+ {0xf900, 0, 0, 0, f(No, false, "豈")},
+ {0xf901, 0, 0, 0, f(No, false, "更")},
+ {0xf902, 0, 0, 0, f(No, false, "車")},
+ {0xf903, 0, 0, 0, f(No, false, "賈")},
+ {0xf904, 0, 0, 0, f(No, false, "滑")},
+ {0xf905, 0, 0, 0, f(No, false, "串")},
+ {0xf906, 0, 0, 0, f(No, false, "句")},
+ {0xf907, 0, 0, 0, f(No, false, "龜")},
+ {0xf909, 0, 0, 0, f(No, false, "契")},
+ {0xf90a, 0, 0, 0, f(No, false, "金")},
+ {0xf90b, 0, 0, 0, f(No, false, "喇")},
+ {0xf90c, 0, 0, 0, f(No, false, "奈")},
+ {0xf90d, 0, 0, 0, f(No, false, "懶")},
+ {0xf90e, 0, 0, 0, f(No, false, "癩")},
+ {0xf90f, 0, 0, 0, f(No, false, "羅")},
+ {0xf910, 0, 0, 0, f(No, false, "蘿")},
+ {0xf911, 0, 0, 0, f(No, false, "螺")},
+ {0xf912, 0, 0, 0, f(No, false, "裸")},
+ {0xf913, 0, 0, 0, f(No, false, "邏")},
+ {0xf914, 0, 0, 0, f(No, false, "樂")},
+ {0xf915, 0, 0, 0, f(No, false, "洛")},
+ {0xf916, 0, 0, 0, f(No, false, "烙")},
+ {0xf917, 0, 0, 0, f(No, false, "珞")},
+ {0xf918, 0, 0, 0, f(No, false, "落")},
+ {0xf919, 0, 0, 0, f(No, false, "酪")},
+ {0xf91a, 0, 0, 0, f(No, false, "駱")},
+ {0xf91b, 0, 0, 0, f(No, false, "亂")},
+ {0xf91c, 0, 0, 0, f(No, false, "卵")},
+ {0xf91d, 0, 0, 0, f(No, false, "欄")},
+ {0xf91e, 0, 0, 0, f(No, false, "爛")},
+ {0xf91f, 0, 0, 0, f(No, false, "蘭")},
+ {0xf920, 0, 0, 0, f(No, false, "鸞")},
+ {0xf921, 0, 0, 0, f(No, false, "嵐")},
+ {0xf922, 0, 0, 0, f(No, false, "濫")},
+ {0xf923, 0, 0, 0, f(No, false, "藍")},
+ {0xf924, 0, 0, 0, f(No, false, "襤")},
+ {0xf925, 0, 0, 0, f(No, false, "拉")},
+ {0xf926, 0, 0, 0, f(No, false, "臘")},
+ {0xf927, 0, 0, 0, f(No, false, "蠟")},
+ {0xf928, 0, 0, 0, f(No, false, "廊")},
+ {0xf929, 0, 0, 0, f(No, false, "朗")},
+ {0xf92a, 0, 0, 0, f(No, false, "浪")},
+ {0xf92b, 0, 0, 0, f(No, false, "狼")},
+ {0xf92c, 0, 0, 0, f(No, false, "郎")},
+ {0xf92d, 0, 0, 0, f(No, false, "來")},
+ {0xf92e, 0, 0, 0, f(No, false, "冷")},
+ {0xf92f, 0, 0, 0, f(No, false, "勞")},
+ {0xf930, 0, 0, 0, f(No, false, "擄")},
+ {0xf931, 0, 0, 0, f(No, false, "櫓")},
+ {0xf932, 0, 0, 0, f(No, false, "爐")},
+ {0xf933, 0, 0, 0, f(No, false, "盧")},
+ {0xf934, 0, 0, 0, f(No, false, "老")},
+ {0xf935, 0, 0, 0, f(No, false, "蘆")},
+ {0xf936, 0, 0, 0, f(No, false, "虜")},
+ {0xf937, 0, 0, 0, f(No, false, "路")},
+ {0xf938, 0, 0, 0, f(No, false, "露")},
+ {0xf939, 0, 0, 0, f(No, false, "魯")},
+ {0xf93a, 0, 0, 0, f(No, false, "鷺")},
+ {0xf93b, 0, 0, 0, f(No, false, "碌")},
+ {0xf93c, 0, 0, 0, f(No, false, "祿")},
+ {0xf93d, 0, 0, 0, f(No, false, "綠")},
+ {0xf93e, 0, 0, 0, f(No, false, "菉")},
+ {0xf93f, 0, 0, 0, f(No, false, "錄")},
+ {0xf940, 0, 0, 0, f(No, false, "鹿")},
+ {0xf941, 0, 0, 0, f(No, false, "論")},
+ {0xf942, 0, 0, 0, f(No, false, "壟")},
+ {0xf943, 0, 0, 0, f(No, false, "弄")},
+ {0xf944, 0, 0, 0, f(No, false, "籠")},
+ {0xf945, 0, 0, 0, f(No, false, "聾")},
+ {0xf946, 0, 0, 0, f(No, false, "牢")},
+ {0xf947, 0, 0, 0, f(No, false, "磊")},
+ {0xf948, 0, 0, 0, f(No, false, "賂")},
+ {0xf949, 0, 0, 0, f(No, false, "雷")},
+ {0xf94a, 0, 0, 0, f(No, false, "壘")},
+ {0xf94b, 0, 0, 0, f(No, false, "屢")},
+ {0xf94c, 0, 0, 0, f(No, false, "樓")},
+ {0xf94d, 0, 0, 0, f(No, false, "淚")},
+ {0xf94e, 0, 0, 0, f(No, false, "漏")},
+ {0xf94f, 0, 0, 0, f(No, false, "累")},
+ {0xf950, 0, 0, 0, f(No, false, "縷")},
+ {0xf951, 0, 0, 0, f(No, false, "陋")},
+ {0xf952, 0, 0, 0, f(No, false, "勒")},
+ {0xf953, 0, 0, 0, f(No, false, "肋")},
+ {0xf954, 0, 0, 0, f(No, false, "凜")},
+ {0xf955, 0, 0, 0, f(No, false, "凌")},
+ {0xf956, 0, 0, 0, f(No, false, "稜")},
+ {0xf957, 0, 0, 0, f(No, false, "綾")},
+ {0xf958, 0, 0, 0, f(No, false, "菱")},
+ {0xf959, 0, 0, 0, f(No, false, "陵")},
+ {0xf95a, 0, 0, 0, f(No, false, "讀")},
+ {0xf95b, 0, 0, 0, f(No, false, "拏")},
+ {0xf95c, 0, 0, 0, f(No, false, "樂")},
+ {0xf95d, 0, 0, 0, f(No, false, "諾")},
+ {0xf95e, 0, 0, 0, f(No, false, "丹")},
+ {0xf95f, 0, 0, 0, f(No, false, "寧")},
+ {0xf960, 0, 0, 0, f(No, false, "怒")},
+ {0xf961, 0, 0, 0, f(No, false, "率")},
+ {0xf962, 0, 0, 0, f(No, false, "異")},
+ {0xf963, 0, 0, 0, f(No, false, "北")},
+ {0xf964, 0, 0, 0, f(No, false, "磻")},
+ {0xf965, 0, 0, 0, f(No, false, "便")},
+ {0xf966, 0, 0, 0, f(No, false, "復")},
+ {0xf967, 0, 0, 0, f(No, false, "不")},
+ {0xf968, 0, 0, 0, f(No, false, "泌")},
+ {0xf969, 0, 0, 0, f(No, false, "數")},
+ {0xf96a, 0, 0, 0, f(No, false, "索")},
+ {0xf96b, 0, 0, 0, f(No, false, "參")},
+ {0xf96c, 0, 0, 0, f(No, false, "塞")},
+ {0xf96d, 0, 0, 0, f(No, false, "省")},
+ {0xf96e, 0, 0, 0, f(No, false, "葉")},
+ {0xf96f, 0, 0, 0, f(No, false, "說")},
+ {0xf970, 0, 0, 0, f(No, false, "殺")},
+ {0xf971, 0, 0, 0, f(No, false, "辰")},
+ {0xf972, 0, 0, 0, f(No, false, "沈")},
+ {0xf973, 0, 0, 0, f(No, false, "拾")},
+ {0xf974, 0, 0, 0, f(No, false, "若")},
+ {0xf975, 0, 0, 0, f(No, false, "掠")},
+ {0xf976, 0, 0, 0, f(No, false, "略")},
+ {0xf977, 0, 0, 0, f(No, false, "亮")},
+ {0xf978, 0, 0, 0, f(No, false, "兩")},
+ {0xf979, 0, 0, 0, f(No, false, "凉")},
+ {0xf97a, 0, 0, 0, f(No, false, "梁")},
+ {0xf97b, 0, 0, 0, f(No, false, "糧")},
+ {0xf97c, 0, 0, 0, f(No, false, "良")},
+ {0xf97d, 0, 0, 0, f(No, false, "諒")},
+ {0xf97e, 0, 0, 0, f(No, false, "量")},
+ {0xf97f, 0, 0, 0, f(No, false, "勵")},
+ {0xf980, 0, 0, 0, f(No, false, "呂")},
+ {0xf981, 0, 0, 0, f(No, false, "女")},
+ {0xf982, 0, 0, 0, f(No, false, "廬")},
+ {0xf983, 0, 0, 0, f(No, false, "旅")},
+ {0xf984, 0, 0, 0, f(No, false, "濾")},
+ {0xf985, 0, 0, 0, f(No, false, "礪")},
+ {0xf986, 0, 0, 0, f(No, false, "閭")},
+ {0xf987, 0, 0, 0, f(No, false, "驪")},
+ {0xf988, 0, 0, 0, f(No, false, "麗")},
+ {0xf989, 0, 0, 0, f(No, false, "黎")},
+ {0xf98a, 0, 0, 0, f(No, false, "力")},
+ {0xf98b, 0, 0, 0, f(No, false, "曆")},
+ {0xf98c, 0, 0, 0, f(No, false, "歷")},
+ {0xf98d, 0, 0, 0, f(No, false, "轢")},
+ {0xf98e, 0, 0, 0, f(No, false, "年")},
+ {0xf98f, 0, 0, 0, f(No, false, "憐")},
+ {0xf990, 0, 0, 0, f(No, false, "戀")},
+ {0xf991, 0, 0, 0, f(No, false, "撚")},
+ {0xf992, 0, 0, 0, f(No, false, "漣")},
+ {0xf993, 0, 0, 0, f(No, false, "煉")},
+ {0xf994, 0, 0, 0, f(No, false, "璉")},
+ {0xf995, 0, 0, 0, f(No, false, "秊")},
+ {0xf996, 0, 0, 0, f(No, false, "練")},
+ {0xf997, 0, 0, 0, f(No, false, "聯")},
+ {0xf998, 0, 0, 0, f(No, false, "輦")},
+ {0xf999, 0, 0, 0, f(No, false, "蓮")},
+ {0xf99a, 0, 0, 0, f(No, false, "連")},
+ {0xf99b, 0, 0, 0, f(No, false, "鍊")},
+ {0xf99c, 0, 0, 0, f(No, false, "列")},
+ {0xf99d, 0, 0, 0, f(No, false, "劣")},
+ {0xf99e, 0, 0, 0, f(No, false, "咽")},
+ {0xf99f, 0, 0, 0, f(No, false, "烈")},
+ {0xf9a0, 0, 0, 0, f(No, false, "裂")},
+ {0xf9a1, 0, 0, 0, f(No, false, "說")},
+ {0xf9a2, 0, 0, 0, f(No, false, "廉")},
+ {0xf9a3, 0, 0, 0, f(No, false, "念")},
+ {0xf9a4, 0, 0, 0, f(No, false, "捻")},
+ {0xf9a5, 0, 0, 0, f(No, false, "殮")},
+ {0xf9a6, 0, 0, 0, f(No, false, "簾")},
+ {0xf9a7, 0, 0, 0, f(No, false, "獵")},
+ {0xf9a8, 0, 0, 0, f(No, false, "令")},
+ {0xf9a9, 0, 0, 0, f(No, false, "囹")},
+ {0xf9aa, 0, 0, 0, f(No, false, "寧")},
+ {0xf9ab, 0, 0, 0, f(No, false, "嶺")},
+ {0xf9ac, 0, 0, 0, f(No, false, "怜")},
+ {0xf9ad, 0, 0, 0, f(No, false, "玲")},
+ {0xf9ae, 0, 0, 0, f(No, false, "瑩")},
+ {0xf9af, 0, 0, 0, f(No, false, "羚")},
+ {0xf9b0, 0, 0, 0, f(No, false, "聆")},
+ {0xf9b1, 0, 0, 0, f(No, false, "鈴")},
+ {0xf9b2, 0, 0, 0, f(No, false, "零")},
+ {0xf9b3, 0, 0, 0, f(No, false, "靈")},
+ {0xf9b4, 0, 0, 0, f(No, false, "領")},
+ {0xf9b5, 0, 0, 0, f(No, false, "例")},
+ {0xf9b6, 0, 0, 0, f(No, false, "禮")},
+ {0xf9b7, 0, 0, 0, f(No, false, "醴")},
+ {0xf9b8, 0, 0, 0, f(No, false, "隸")},
+ {0xf9b9, 0, 0, 0, f(No, false, "惡")},
+ {0xf9ba, 0, 0, 0, f(No, false, "了")},
+ {0xf9bb, 0, 0, 0, f(No, false, "僚")},
+ {0xf9bc, 0, 0, 0, f(No, false, "寮")},
+ {0xf9bd, 0, 0, 0, f(No, false, "尿")},
+ {0xf9be, 0, 0, 0, f(No, false, "料")},
+ {0xf9bf, 0, 0, 0, f(No, false, "樂")},
+ {0xf9c0, 0, 0, 0, f(No, false, "燎")},
+ {0xf9c1, 0, 0, 0, f(No, false, "療")},
+ {0xf9c2, 0, 0, 0, f(No, false, "蓼")},
+ {0xf9c3, 0, 0, 0, f(No, false, "遼")},
+ {0xf9c4, 0, 0, 0, f(No, false, "龍")},
+ {0xf9c5, 0, 0, 0, f(No, false, "暈")},
+ {0xf9c6, 0, 0, 0, f(No, false, "阮")},
+ {0xf9c7, 0, 0, 0, f(No, false, "劉")},
+ {0xf9c8, 0, 0, 0, f(No, false, "杻")},
+ {0xf9c9, 0, 0, 0, f(No, false, "柳")},
+ {0xf9ca, 0, 0, 0, f(No, false, "流")},
+ {0xf9cb, 0, 0, 0, f(No, false, "溜")},
+ {0xf9cc, 0, 0, 0, f(No, false, "琉")},
+ {0xf9cd, 0, 0, 0, f(No, false, "留")},
+ {0xf9ce, 0, 0, 0, f(No, false, "硫")},
+ {0xf9cf, 0, 0, 0, f(No, false, "紐")},
+ {0xf9d0, 0, 0, 0, f(No, false, "類")},
+ {0xf9d1, 0, 0, 0, f(No, false, "六")},
+ {0xf9d2, 0, 0, 0, f(No, false, "戮")},
+ {0xf9d3, 0, 0, 0, f(No, false, "陸")},
+ {0xf9d4, 0, 0, 0, f(No, false, "倫")},
+ {0xf9d5, 0, 0, 0, f(No, false, "崙")},
+ {0xf9d6, 0, 0, 0, f(No, false, "淪")},
+ {0xf9d7, 0, 0, 0, f(No, false, "輪")},
+ {0xf9d8, 0, 0, 0, f(No, false, "律")},
+ {0xf9d9, 0, 0, 0, f(No, false, "慄")},
+ {0xf9da, 0, 0, 0, f(No, false, "栗")},
+ {0xf9db, 0, 0, 0, f(No, false, "率")},
+ {0xf9dc, 0, 0, 0, f(No, false, "隆")},
+ {0xf9dd, 0, 0, 0, f(No, false, "利")},
+ {0xf9de, 0, 0, 0, f(No, false, "吏")},
+ {0xf9df, 0, 0, 0, f(No, false, "履")},
+ {0xf9e0, 0, 0, 0, f(No, false, "易")},
+ {0xf9e1, 0, 0, 0, f(No, false, "李")},
+ {0xf9e2, 0, 0, 0, f(No, false, "梨")},
+ {0xf9e3, 0, 0, 0, f(No, false, "泥")},
+ {0xf9e4, 0, 0, 0, f(No, false, "理")},
+ {0xf9e5, 0, 0, 0, f(No, false, "痢")},
+ {0xf9e6, 0, 0, 0, f(No, false, "罹")},
+ {0xf9e7, 0, 0, 0, f(No, false, "裏")},
+ {0xf9e8, 0, 0, 0, f(No, false, "裡")},
+ {0xf9e9, 0, 0, 0, f(No, false, "里")},
+ {0xf9ea, 0, 0, 0, f(No, false, "離")},
+ {0xf9eb, 0, 0, 0, f(No, false, "匿")},
+ {0xf9ec, 0, 0, 0, f(No, false, "溺")},
+ {0xf9ed, 0, 0, 0, f(No, false, "吝")},
+ {0xf9ee, 0, 0, 0, f(No, false, "燐")},
+ {0xf9ef, 0, 0, 0, f(No, false, "璘")},
+ {0xf9f0, 0, 0, 0, f(No, false, "藺")},
+ {0xf9f1, 0, 0, 0, f(No, false, "隣")},
+ {0xf9f2, 0, 0, 0, f(No, false, "鱗")},
+ {0xf9f3, 0, 0, 0, f(No, false, "麟")},
+ {0xf9f4, 0, 0, 0, f(No, false, "林")},
+ {0xf9f5, 0, 0, 0, f(No, false, "淋")},
+ {0xf9f6, 0, 0, 0, f(No, false, "臨")},
+ {0xf9f7, 0, 0, 0, f(No, false, "立")},
+ {0xf9f8, 0, 0, 0, f(No, false, "笠")},
+ {0xf9f9, 0, 0, 0, f(No, false, "粒")},
+ {0xf9fa, 0, 0, 0, f(No, false, "狀")},
+ {0xf9fb, 0, 0, 0, f(No, false, "炙")},
+ {0xf9fc, 0, 0, 0, f(No, false, "識")},
+ {0xf9fd, 0, 0, 0, f(No, false, "什")},
+ {0xf9fe, 0, 0, 0, f(No, false, "茶")},
+ {0xf9ff, 0, 0, 0, f(No, false, "刺")},
+ {0xfa00, 0, 0, 0, f(No, false, "切")},
+ {0xfa01, 0, 0, 0, f(No, false, "度")},
+ {0xfa02, 0, 0, 0, f(No, false, "拓")},
+ {0xfa03, 0, 0, 0, f(No, false, "糖")},
+ {0xfa04, 0, 0, 0, f(No, false, "宅")},
+ {0xfa05, 0, 0, 0, f(No, false, "洞")},
+ {0xfa06, 0, 0, 0, f(No, false, "暴")},
+ {0xfa07, 0, 0, 0, f(No, false, "輻")},
+ {0xfa08, 0, 0, 0, f(No, false, "行")},
+ {0xfa09, 0, 0, 0, f(No, false, "降")},
+ {0xfa0a, 0, 0, 0, f(No, false, "見")},
+ {0xfa0b, 0, 0, 0, f(No, false, "廓")},
+ {0xfa0c, 0, 0, 0, f(No, false, "兀")},
+ {0xfa0d, 0, 0, 0, f(No, false, "嗀")},
+ {0xfa0e, 0, 0, 0, f(Yes, false, "")},
+ {0xfa10, 0, 0, 0, f(No, false, "塚")},
+ {0xfa11, 0, 0, 0, f(Yes, false, "")},
+ {0xfa12, 0, 0, 0, f(No, false, "晴")},
+ {0xfa13, 0, 0, 0, f(Yes, false, "")},
+ {0xfa15, 0, 0, 0, f(No, false, "凞")},
+ {0xfa16, 0, 0, 0, f(No, false, "猪")},
+ {0xfa17, 0, 0, 0, f(No, false, "益")},
+ {0xfa18, 0, 0, 0, f(No, false, "礼")},
+ {0xfa19, 0, 0, 0, f(No, false, "神")},
+ {0xfa1a, 0, 0, 0, f(No, false, "祥")},
+ {0xfa1b, 0, 0, 0, f(No, false, "福")},
+ {0xfa1c, 0, 0, 0, f(No, false, "靖")},
+ {0xfa1d, 0, 0, 0, f(No, false, "精")},
+ {0xfa1e, 0, 0, 0, f(No, false, "羽")},
+ {0xfa1f, 0, 0, 0, f(Yes, false, "")},
+ {0xfa20, 0, 0, 0, f(No, false, "蘒")},
+ {0xfa21, 0, 0, 0, f(Yes, false, "")},
+ {0xfa22, 0, 0, 0, f(No, false, "諸")},
+ {0xfa23, 0, 0, 0, f(Yes, false, "")},
+ {0xfa25, 0, 0, 0, f(No, false, "逸")},
+ {0xfa26, 0, 0, 0, f(No, false, "都")},
+ {0xfa27, 0, 0, 0, f(Yes, false, "")},
+ {0xfa2a, 0, 0, 0, f(No, false, "飯")},
+ {0xfa2b, 0, 0, 0, f(No, false, "飼")},
+ {0xfa2c, 0, 0, 0, f(No, false, "館")},
+ {0xfa2d, 0, 0, 0, f(No, false, "鶴")},
+ {0xfa2e, 0, 0, 0, f(No, false, "郞")},
+ {0xfa2f, 0, 0, 0, f(No, false, "隷")},
+ {0xfa30, 0, 0, 0, f(No, false, "侮")},
+ {0xfa31, 0, 0, 0, f(No, false, "僧")},
+ {0xfa32, 0, 0, 0, f(No, false, "免")},
+ {0xfa33, 0, 0, 0, f(No, false, "勉")},
+ {0xfa34, 0, 0, 0, f(No, false, "勤")},
+ {0xfa35, 0, 0, 0, f(No, false, "卑")},
+ {0xfa36, 0, 0, 0, f(No, false, "喝")},
+ {0xfa37, 0, 0, 0, f(No, false, "嘆")},
+ {0xfa38, 0, 0, 0, f(No, false, "器")},
+ {0xfa39, 0, 0, 0, f(No, false, "塀")},
+ {0xfa3a, 0, 0, 0, f(No, false, "墨")},
+ {0xfa3b, 0, 0, 0, f(No, false, "層")},
+ {0xfa3c, 0, 0, 0, f(No, false, "屮")},
+ {0xfa3d, 0, 0, 0, f(No, false, "悔")},
+ {0xfa3e, 0, 0, 0, f(No, false, "慨")},
+ {0xfa3f, 0, 0, 0, f(No, false, "憎")},
+ {0xfa40, 0, 0, 0, f(No, false, "懲")},
+ {0xfa41, 0, 0, 0, f(No, false, "敏")},
+ {0xfa42, 0, 0, 0, f(No, false, "既")},
+ {0xfa43, 0, 0, 0, f(No, false, "暑")},
+ {0xfa44, 0, 0, 0, f(No, false, "梅")},
+ {0xfa45, 0, 0, 0, f(No, false, "海")},
+ {0xfa46, 0, 0, 0, f(No, false, "渚")},
+ {0xfa47, 0, 0, 0, f(No, false, "漢")},
+ {0xfa48, 0, 0, 0, f(No, false, "煮")},
+ {0xfa49, 0, 0, 0, f(No, false, "爫")},
+ {0xfa4a, 0, 0, 0, f(No, false, "琢")},
+ {0xfa4b, 0, 0, 0, f(No, false, "碑")},
+ {0xfa4c, 0, 0, 0, f(No, false, "社")},
+ {0xfa4d, 0, 0, 0, f(No, false, "祉")},
+ {0xfa4e, 0, 0, 0, f(No, false, "祈")},
+ {0xfa4f, 0, 0, 0, f(No, false, "祐")},
+ {0xfa50, 0, 0, 0, f(No, false, "祖")},
+ {0xfa51, 0, 0, 0, f(No, false, "祝")},
+ {0xfa52, 0, 0, 0, f(No, false, "禍")},
+ {0xfa53, 0, 0, 0, f(No, false, "禎")},
+ {0xfa54, 0, 0, 0, f(No, false, "穀")},
+ {0xfa55, 0, 0, 0, f(No, false, "突")},
+ {0xfa56, 0, 0, 0, f(No, false, "節")},
+ {0xfa57, 0, 0, 0, f(No, false, "練")},
+ {0xfa58, 0, 0, 0, f(No, false, "縉")},
+ {0xfa59, 0, 0, 0, f(No, false, "繁")},
+ {0xfa5a, 0, 0, 0, f(No, false, "署")},
+ {0xfa5b, 0, 0, 0, f(No, false, "者")},
+ {0xfa5c, 0, 0, 0, f(No, false, "臭")},
+ {0xfa5d, 0, 0, 0, f(No, false, "艹")},
+ {0xfa5f, 0, 0, 0, f(No, false, "著")},
+ {0xfa60, 0, 0, 0, f(No, false, "褐")},
+ {0xfa61, 0, 0, 0, f(No, false, "視")},
+ {0xfa62, 0, 0, 0, f(No, false, "謁")},
+ {0xfa63, 0, 0, 0, f(No, false, "謹")},
+ {0xfa64, 0, 0, 0, f(No, false, "賓")},
+ {0xfa65, 0, 0, 0, f(No, false, "贈")},
+ {0xfa66, 0, 0, 0, f(No, false, "辶")},
+ {0xfa67, 0, 0, 0, f(No, false, "逸")},
+ {0xfa68, 0, 0, 0, f(No, false, "難")},
+ {0xfa69, 0, 0, 0, f(No, false, "響")},
+ {0xfa6a, 0, 0, 0, f(No, false, "頻")},
+ {0xfa6b, 0, 0, 0, f(No, false, "恵")},
+ {0xfa6c, 0, 0, 0, f(No, false, "𤋮")},
+ {0xfa6d, 0, 0, 0, f(No, false, "舘")},
+ {0xfa6e, 0, 0, 0, f(Yes, false, "")},
+ {0xfa70, 0, 0, 0, f(No, false, "並")},
+ {0xfa71, 0, 0, 0, f(No, false, "况")},
+ {0xfa72, 0, 0, 0, f(No, false, "全")},
+ {0xfa73, 0, 0, 0, f(No, false, "侀")},
+ {0xfa74, 0, 0, 0, f(No, false, "充")},
+ {0xfa75, 0, 0, 0, f(No, false, "冀")},
+ {0xfa76, 0, 0, 0, f(No, false, "勇")},
+ {0xfa77, 0, 0, 0, f(No, false, "勺")},
+ {0xfa78, 0, 0, 0, f(No, false, "喝")},
+ {0xfa79, 0, 0, 0, f(No, false, "啕")},
+ {0xfa7a, 0, 0, 0, f(No, false, "喙")},
+ {0xfa7b, 0, 0, 0, f(No, false, "嗢")},
+ {0xfa7c, 0, 0, 0, f(No, false, "塚")},
+ {0xfa7d, 0, 0, 0, f(No, false, "墳")},
+ {0xfa7e, 0, 0, 0, f(No, false, "奄")},
+ {0xfa7f, 0, 0, 0, f(No, false, "奔")},
+ {0xfa80, 0, 0, 0, f(No, false, "婢")},
+ {0xfa81, 0, 0, 0, f(No, false, "嬨")},
+ {0xfa82, 0, 0, 0, f(No, false, "廒")},
+ {0xfa83, 0, 0, 0, f(No, false, "廙")},
+ {0xfa84, 0, 0, 0, f(No, false, "彩")},
+ {0xfa85, 0, 0, 0, f(No, false, "徭")},
+ {0xfa86, 0, 0, 0, f(No, false, "惘")},
+ {0xfa87, 0, 0, 0, f(No, false, "慎")},
+ {0xfa88, 0, 0, 0, f(No, false, "愈")},
+ {0xfa89, 0, 0, 0, f(No, false, "憎")},
+ {0xfa8a, 0, 0, 0, f(No, false, "慠")},
+ {0xfa8b, 0, 0, 0, f(No, false, "懲")},
+ {0xfa8c, 0, 0, 0, f(No, false, "戴")},
+ {0xfa8d, 0, 0, 0, f(No, false, "揄")},
+ {0xfa8e, 0, 0, 0, f(No, false, "搜")},
+ {0xfa8f, 0, 0, 0, f(No, false, "摒")},
+ {0xfa90, 0, 0, 0, f(No, false, "敖")},
+ {0xfa91, 0, 0, 0, f(No, false, "晴")},
+ {0xfa92, 0, 0, 0, f(No, false, "朗")},
+ {0xfa93, 0, 0, 0, f(No, false, "望")},
+ {0xfa94, 0, 0, 0, f(No, false, "杖")},
+ {0xfa95, 0, 0, 0, f(No, false, "歹")},
+ {0xfa96, 0, 0, 0, f(No, false, "殺")},
+ {0xfa97, 0, 0, 0, f(No, false, "流")},
+ {0xfa98, 0, 0, 0, f(No, false, "滛")},
+ {0xfa99, 0, 0, 0, f(No, false, "滋")},
+ {0xfa9a, 0, 0, 0, f(No, false, "漢")},
+ {0xfa9b, 0, 0, 0, f(No, false, "瀞")},
+ {0xfa9c, 0, 0, 0, f(No, false, "煮")},
+ {0xfa9d, 0, 0, 0, f(No, false, "瞧")},
+ {0xfa9e, 0, 0, 0, f(No, false, "爵")},
+ {0xfa9f, 0, 0, 0, f(No, false, "犯")},
+ {0xfaa0, 0, 0, 0, f(No, false, "猪")},
+ {0xfaa1, 0, 0, 0, f(No, false, "瑱")},
+ {0xfaa2, 0, 0, 0, f(No, false, "甆")},
+ {0xfaa3, 0, 0, 0, f(No, false, "画")},
+ {0xfaa4, 0, 0, 0, f(No, false, "瘝")},
+ {0xfaa5, 0, 0, 0, f(No, false, "瘟")},
+ {0xfaa6, 0, 0, 0, f(No, false, "益")},
+ {0xfaa7, 0, 0, 0, f(No, false, "盛")},
+ {0xfaa8, 0, 0, 0, f(No, false, "直")},
+ {0xfaa9, 0, 0, 0, f(No, false, "睊")},
+ {0xfaaa, 0, 0, 0, f(No, false, "着")},
+ {0xfaab, 0, 0, 0, f(No, false, "磌")},
+ {0xfaac, 0, 0, 0, f(No, false, "窱")},
+ {0xfaad, 0, 0, 0, f(No, false, "節")},
+ {0xfaae, 0, 0, 0, f(No, false, "类")},
+ {0xfaaf, 0, 0, 0, f(No, false, "絛")},
+ {0xfab0, 0, 0, 0, f(No, false, "練")},
+ {0xfab1, 0, 0, 0, f(No, false, "缾")},
+ {0xfab2, 0, 0, 0, f(No, false, "者")},
+ {0xfab3, 0, 0, 0, f(No, false, "荒")},
+ {0xfab4, 0, 0, 0, f(No, false, "華")},
+ {0xfab5, 0, 0, 0, f(No, false, "蝹")},
+ {0xfab6, 0, 0, 0, f(No, false, "襁")},
+ {0xfab7, 0, 0, 0, f(No, false, "覆")},
+ {0xfab8, 0, 0, 0, f(No, false, "視")},
+ {0xfab9, 0, 0, 0, f(No, false, "調")},
+ {0xfaba, 0, 0, 0, f(No, false, "諸")},
+ {0xfabb, 0, 0, 0, f(No, false, "請")},
+ {0xfabc, 0, 0, 0, f(No, false, "謁")},
+ {0xfabd, 0, 0, 0, f(No, false, "諾")},
+ {0xfabe, 0, 0, 0, f(No, false, "諭")},
+ {0xfabf, 0, 0, 0, f(No, false, "謹")},
+ {0xfac0, 0, 0, 0, f(No, false, "變")},
+ {0xfac1, 0, 0, 0, f(No, false, "贈")},
+ {0xfac2, 0, 0, 0, f(No, false, "輸")},
+ {0xfac3, 0, 0, 0, f(No, false, "遲")},
+ {0xfac4, 0, 0, 0, f(No, false, "醙")},
+ {0xfac5, 0, 0, 0, f(No, false, "鉶")},
+ {0xfac6, 0, 0, 0, f(No, false, "陼")},
+ {0xfac7, 0, 0, 0, f(No, false, "難")},
+ {0xfac8, 0, 0, 0, f(No, false, "靖")},
+ {0xfac9, 0, 0, 0, f(No, false, "韛")},
+ {0xfaca, 0, 0, 0, f(No, false, "響")},
+ {0xfacb, 0, 0, 0, f(No, false, "頋")},
+ {0xfacc, 0, 0, 0, f(No, false, "頻")},
+ {0xfacd, 0, 0, 0, f(No, false, "鬒")},
+ {0xface, 0, 0, 0, f(No, false, "龜")},
+ {0xfacf, 0, 0, 0, f(No, false, "𢡊")},
+ {0xfad0, 0, 0, 0, f(No, false, "𢡄")},
+ {0xfad1, 0, 0, 0, f(No, false, "𣏕")},
+ {0xfad2, 0, 0, 0, f(No, false, "㮝")},
+ {0xfad3, 0, 0, 0, f(No, false, "䀘")},
+ {0xfad4, 0, 0, 0, f(No, false, "䀹")},
+ {0xfad5, 0, 0, 0, f(No, false, "𥉉")},
+ {0xfad6, 0, 0, 0, f(No, false, "𥳐")},
+ {0xfad7, 0, 0, 0, f(No, false, "𧻓")},
+ {0xfad8, 0, 0, 0, f(No, false, "齃")},
+ {0xfad9, 0, 0, 0, f(No, false, "龎")},
+ {0xfada, 0, 0, 0, f(Yes, false, "")},
+ {0xfb00, 0, 0, 0, g(Yes, No, false, false, "", "ff")},
+ {0xfb01, 0, 0, 0, g(Yes, No, false, false, "", "fi")},
+ {0xfb02, 0, 0, 0, g(Yes, No, false, false, "", "fl")},
+ {0xfb03, 0, 0, 0, g(Yes, No, false, false, "", "ffi")},
+ {0xfb04, 0, 0, 0, g(Yes, No, false, false, "", "ffl")},
+ {0xfb05, 0, 0, 0, g(Yes, No, false, false, "", "st")},
+ {0xfb07, 0, 0, 0, f(Yes, false, "")},
+ {0xfb13, 0, 0, 0, g(Yes, No, false, false, "", "մն")},
+ {0xfb14, 0, 0, 0, g(Yes, No, false, false, "", "մե")},
+ {0xfb15, 0, 0, 0, g(Yes, No, false, false, "", "մի")},
+ {0xfb16, 0, 0, 0, g(Yes, No, false, false, "", "վն")},
+ {0xfb17, 0, 0, 0, g(Yes, No, false, false, "", "մխ")},
+ {0xfb18, 0, 0, 0, f(Yes, false, "")},
+ {0xfb1d, 0, 0, 1, f(No, false, "יִ")},
+ {0xfb1e, 26, 1, 1, f(Yes, false, "")},
+ {0xfb1f, 0, 0, 1, f(No, false, "ײַ")},
+ {0xfb20, 0, 0, 0, g(Yes, No, false, false, "", "ע")},
+ {0xfb21, 0, 0, 0, g(Yes, No, false, false, "", "א")},
+ {0xfb22, 0, 0, 0, g(Yes, No, false, false, "", "ד")},
+ {0xfb23, 0, 0, 0, g(Yes, No, false, false, "", "ה")},
+ {0xfb24, 0, 0, 0, g(Yes, No, false, false, "", "כ")},
+ {0xfb25, 0, 0, 0, g(Yes, No, false, false, "", "ל")},
+ {0xfb26, 0, 0, 0, g(Yes, No, false, false, "", "ם")},
+ {0xfb27, 0, 0, 0, g(Yes, No, false, false, "", "ר")},
+ {0xfb28, 0, 0, 0, g(Yes, No, false, false, "", "ת")},
+ {0xfb29, 0, 0, 0, g(Yes, No, false, false, "", "+")},
+ {0xfb2a, 0, 0, 1, f(No, false, "שׁ")},
+ {0xfb2b, 0, 0, 1, f(No, false, "שׂ")},
+ {0xfb2c, 0, 0, 2, f(No, false, "שּׁ")},
+ {0xfb2d, 0, 0, 2, f(No, false, "שּׂ")},
+ {0xfb2e, 0, 0, 1, f(No, false, "אַ")},
+ {0xfb2f, 0, 0, 1, f(No, false, "אָ")},
+ {0xfb30, 0, 0, 1, f(No, false, "אּ")},
+ {0xfb31, 0, 0, 1, f(No, false, "בּ")},
+ {0xfb32, 0, 0, 1, f(No, false, "גּ")},
+ {0xfb33, 0, 0, 1, f(No, false, "דּ")},
+ {0xfb34, 0, 0, 1, f(No, false, "הּ")},
+ {0xfb35, 0, 0, 1, f(No, false, "וּ")},
+ {0xfb36, 0, 0, 1, f(No, false, "זּ")},
+ {0xfb37, 0, 0, 0, f(Yes, false, "")},
+ {0xfb38, 0, 0, 1, f(No, false, "טּ")},
+ {0xfb39, 0, 0, 1, f(No, false, "יּ")},
+ {0xfb3a, 0, 0, 1, f(No, false, "ךּ")},
+ {0xfb3b, 0, 0, 1, f(No, false, "כּ")},
+ {0xfb3c, 0, 0, 1, f(No, false, "לּ")},
+ {0xfb3d, 0, 0, 0, f(Yes, false, "")},
+ {0xfb3e, 0, 0, 1, f(No, false, "מּ")},
+ {0xfb3f, 0, 0, 0, f(Yes, false, "")},
+ {0xfb40, 0, 0, 1, f(No, false, "נּ")},
+ {0xfb41, 0, 0, 1, f(No, false, "סּ")},
+ {0xfb42, 0, 0, 0, f(Yes, false, "")},
+ {0xfb43, 0, 0, 1, f(No, false, "ףּ")},
+ {0xfb44, 0, 0, 1, f(No, false, "פּ")},
+ {0xfb45, 0, 0, 0, f(Yes, false, "")},
+ {0xfb46, 0, 0, 1, f(No, false, "צּ")},
+ {0xfb47, 0, 0, 1, f(No, false, "קּ")},
+ {0xfb48, 0, 0, 1, f(No, false, "רּ")},
+ {0xfb49, 0, 0, 1, f(No, false, "שּ")},
+ {0xfb4a, 0, 0, 1, f(No, false, "תּ")},
+ {0xfb4b, 0, 0, 1, f(No, false, "וֹ")},
+ {0xfb4c, 0, 0, 1, f(No, false, "בֿ")},
+ {0xfb4d, 0, 0, 1, f(No, false, "כֿ")},
+ {0xfb4e, 0, 0, 1, f(No, false, "פֿ")},
+ {0xfb4f, 0, 0, 0, g(Yes, No, false, false, "", "אל")},
+ {0xfb50, 0, 0, 0, g(Yes, No, false, false, "", "ٱ")},
+ {0xfb52, 0, 0, 0, g(Yes, No, false, false, "", "ٻ")},
+ {0xfb56, 0, 0, 0, g(Yes, No, false, false, "", "پ")},
+ {0xfb5a, 0, 0, 0, g(Yes, No, false, false, "", "ڀ")},
+ {0xfb5e, 0, 0, 0, g(Yes, No, false, false, "", "ٺ")},
+ {0xfb62, 0, 0, 0, g(Yes, No, false, false, "", "ٿ")},
+ {0xfb66, 0, 0, 0, g(Yes, No, false, false, "", "ٹ")},
+ {0xfb6a, 0, 0, 0, g(Yes, No, false, false, "", "ڤ")},
+ {0xfb6e, 0, 0, 0, g(Yes, No, false, false, "", "ڦ")},
+ {0xfb72, 0, 0, 0, g(Yes, No, false, false, "", "ڄ")},
+ {0xfb76, 0, 0, 0, g(Yes, No, false, false, "", "ڃ")},
+ {0xfb7a, 0, 0, 0, g(Yes, No, false, false, "", "چ")},
+ {0xfb7e, 0, 0, 0, g(Yes, No, false, false, "", "ڇ")},
+ {0xfb82, 0, 0, 0, g(Yes, No, false, false, "", "ڍ")},
+ {0xfb84, 0, 0, 0, g(Yes, No, false, false, "", "ڌ")},
+ {0xfb86, 0, 0, 0, g(Yes, No, false, false, "", "ڎ")},
+ {0xfb88, 0, 0, 0, g(Yes, No, false, false, "", "ڈ")},
+ {0xfb8a, 0, 0, 0, g(Yes, No, false, false, "", "ژ")},
+ {0xfb8c, 0, 0, 0, g(Yes, No, false, false, "", "ڑ")},
+ {0xfb8e, 0, 0, 0, g(Yes, No, false, false, "", "ک")},
+ {0xfb92, 0, 0, 0, g(Yes, No, false, false, "", "گ")},
+ {0xfb96, 0, 0, 0, g(Yes, No, false, false, "", "ڳ")},
+ {0xfb9a, 0, 0, 0, g(Yes, No, false, false, "", "ڱ")},
+ {0xfb9e, 0, 0, 0, g(Yes, No, false, false, "", "ں")},
+ {0xfba0, 0, 0, 0, g(Yes, No, false, false, "", "ڻ")},
+ {0xfba4, 0, 0, 1, g(Yes, No, false, false, "", "ۀ")},
+ {0xfba6, 0, 0, 0, g(Yes, No, false, false, "", "ہ")},
+ {0xfbaa, 0, 0, 0, g(Yes, No, false, false, "", "ھ")},
+ {0xfbae, 0, 0, 0, g(Yes, No, false, false, "", "ے")},
+ {0xfbb0, 0, 0, 1, g(Yes, No, false, false, "", "ۓ")},
+ {0xfbb2, 0, 0, 0, f(Yes, false, "")},
+ {0xfbd3, 0, 0, 0, g(Yes, No, false, false, "", "ڭ")},
+ {0xfbd7, 0, 0, 0, g(Yes, No, false, false, "", "ۇ")},
+ {0xfbd9, 0, 0, 0, g(Yes, No, false, false, "", "ۆ")},
+ {0xfbdb, 0, 0, 0, g(Yes, No, false, false, "", "ۈ")},
+ {0xfbdd, 0, 0, 0, g(Yes, No, false, false, "", "ۇٴ")},
+ {0xfbde, 0, 0, 0, g(Yes, No, false, false, "", "ۋ")},
+ {0xfbe0, 0, 0, 0, g(Yes, No, false, false, "", "ۅ")},
+ {0xfbe2, 0, 0, 0, g(Yes, No, false, false, "", "ۉ")},
+ {0xfbe4, 0, 0, 0, g(Yes, No, false, false, "", "ې")},
+ {0xfbe8, 0, 0, 0, g(Yes, No, false, false, "", "ى")},
+ {0xfbea, 0, 0, 0, g(Yes, No, false, false, "", "ئا")},
+ {0xfbec, 0, 0, 0, g(Yes, No, false, false, "", "ئە")},
+ {0xfbee, 0, 0, 0, g(Yes, No, false, false, "", "ئو")},
+ {0xfbf0, 0, 0, 0, g(Yes, No, false, false, "", "ئۇ")},
+ {0xfbf2, 0, 0, 0, g(Yes, No, false, false, "", "ئۆ")},
+ {0xfbf4, 0, 0, 0, g(Yes, No, false, false, "", "ئۈ")},
+ {0xfbf6, 0, 0, 0, g(Yes, No, false, false, "", "ئې")},
+ {0xfbf9, 0, 0, 0, g(Yes, No, false, false, "", "ئى")},
+ {0xfbfc, 0, 0, 0, g(Yes, No, false, false, "", "ی")},
+ {0xfc00, 0, 0, 0, g(Yes, No, false, false, "", "ئج")},
+ {0xfc01, 0, 0, 0, g(Yes, No, false, false, "", "ئح")},
+ {0xfc02, 0, 0, 0, g(Yes, No, false, false, "", "ئم")},
+ {0xfc03, 0, 0, 0, g(Yes, No, false, false, "", "ئى")},
+ {0xfc04, 0, 0, 0, g(Yes, No, false, false, "", "ئي")},
+ {0xfc05, 0, 0, 0, g(Yes, No, false, false, "", "بج")},
+ {0xfc06, 0, 0, 0, g(Yes, No, false, false, "", "بح")},
+ {0xfc07, 0, 0, 0, g(Yes, No, false, false, "", "بخ")},
+ {0xfc08, 0, 0, 0, g(Yes, No, false, false, "", "بم")},
+ {0xfc09, 0, 0, 0, g(Yes, No, false, false, "", "بى")},
+ {0xfc0a, 0, 0, 0, g(Yes, No, false, false, "", "بي")},
+ {0xfc0b, 0, 0, 0, g(Yes, No, false, false, "", "تج")},
+ {0xfc0c, 0, 0, 0, g(Yes, No, false, false, "", "تح")},
+ {0xfc0d, 0, 0, 0, g(Yes, No, false, false, "", "تخ")},
+ {0xfc0e, 0, 0, 0, g(Yes, No, false, false, "", "تم")},
+ {0xfc0f, 0, 0, 0, g(Yes, No, false, false, "", "تى")},
+ {0xfc10, 0, 0, 0, g(Yes, No, false, false, "", "تي")},
+ {0xfc11, 0, 0, 0, g(Yes, No, false, false, "", "ثج")},
+ {0xfc12, 0, 0, 0, g(Yes, No, false, false, "", "ثم")},
+ {0xfc13, 0, 0, 0, g(Yes, No, false, false, "", "ثى")},
+ {0xfc14, 0, 0, 0, g(Yes, No, false, false, "", "ثي")},
+ {0xfc15, 0, 0, 0, g(Yes, No, false, false, "", "جح")},
+ {0xfc16, 0, 0, 0, g(Yes, No, false, false, "", "جم")},
+ {0xfc17, 0, 0, 0, g(Yes, No, false, false, "", "حج")},
+ {0xfc18, 0, 0, 0, g(Yes, No, false, false, "", "حم")},
+ {0xfc19, 0, 0, 0, g(Yes, No, false, false, "", "خج")},
+ {0xfc1a, 0, 0, 0, g(Yes, No, false, false, "", "خح")},
+ {0xfc1b, 0, 0, 0, g(Yes, No, false, false, "", "خم")},
+ {0xfc1c, 0, 0, 0, g(Yes, No, false, false, "", "سج")},
+ {0xfc1d, 0, 0, 0, g(Yes, No, false, false, "", "سح")},
+ {0xfc1e, 0, 0, 0, g(Yes, No, false, false, "", "سخ")},
+ {0xfc1f, 0, 0, 0, g(Yes, No, false, false, "", "سم")},
+ {0xfc20, 0, 0, 0, g(Yes, No, false, false, "", "صح")},
+ {0xfc21, 0, 0, 0, g(Yes, No, false, false, "", "صم")},
+ {0xfc22, 0, 0, 0, g(Yes, No, false, false, "", "ضج")},
+ {0xfc23, 0, 0, 0, g(Yes, No, false, false, "", "ضح")},
+ {0xfc24, 0, 0, 0, g(Yes, No, false, false, "", "ضخ")},
+ {0xfc25, 0, 0, 0, g(Yes, No, false, false, "", "ضم")},
+ {0xfc26, 0, 0, 0, g(Yes, No, false, false, "", "طح")},
+ {0xfc27, 0, 0, 0, g(Yes, No, false, false, "", "طم")},
+ {0xfc28, 0, 0, 0, g(Yes, No, false, false, "", "ظم")},
+ {0xfc29, 0, 0, 0, g(Yes, No, false, false, "", "عج")},
+ {0xfc2a, 0, 0, 0, g(Yes, No, false, false, "", "عم")},
+ {0xfc2b, 0, 0, 0, g(Yes, No, false, false, "", "غج")},
+ {0xfc2c, 0, 0, 0, g(Yes, No, false, false, "", "غم")},
+ {0xfc2d, 0, 0, 0, g(Yes, No, false, false, "", "فج")},
+ {0xfc2e, 0, 0, 0, g(Yes, No, false, false, "", "فح")},
+ {0xfc2f, 0, 0, 0, g(Yes, No, false, false, "", "فخ")},
+ {0xfc30, 0, 0, 0, g(Yes, No, false, false, "", "فم")},
+ {0xfc31, 0, 0, 0, g(Yes, No, false, false, "", "فى")},
+ {0xfc32, 0, 0, 0, g(Yes, No, false, false, "", "في")},
+ {0xfc33, 0, 0, 0, g(Yes, No, false, false, "", "قح")},
+ {0xfc34, 0, 0, 0, g(Yes, No, false, false, "", "قم")},
+ {0xfc35, 0, 0, 0, g(Yes, No, false, false, "", "قى")},
+ {0xfc36, 0, 0, 0, g(Yes, No, false, false, "", "قي")},
+ {0xfc37, 0, 0, 0, g(Yes, No, false, false, "", "كا")},
+ {0xfc38, 0, 0, 0, g(Yes, No, false, false, "", "كج")},
+ {0xfc39, 0, 0, 0, g(Yes, No, false, false, "", "كح")},
+ {0xfc3a, 0, 0, 0, g(Yes, No, false, false, "", "كخ")},
+ {0xfc3b, 0, 0, 0, g(Yes, No, false, false, "", "كل")},
+ {0xfc3c, 0, 0, 0, g(Yes, No, false, false, "", "كم")},
+ {0xfc3d, 0, 0, 0, g(Yes, No, false, false, "", "كى")},
+ {0xfc3e, 0, 0, 0, g(Yes, No, false, false, "", "كي")},
+ {0xfc3f, 0, 0, 0, g(Yes, No, false, false, "", "لج")},
+ {0xfc40, 0, 0, 0, g(Yes, No, false, false, "", "لح")},
+ {0xfc41, 0, 0, 0, g(Yes, No, false, false, "", "لخ")},
+ {0xfc42, 0, 0, 0, g(Yes, No, false, false, "", "لم")},
+ {0xfc43, 0, 0, 0, g(Yes, No, false, false, "", "لى")},
+ {0xfc44, 0, 0, 0, g(Yes, No, false, false, "", "لي")},
+ {0xfc45, 0, 0, 0, g(Yes, No, false, false, "", "مج")},
+ {0xfc46, 0, 0, 0, g(Yes, No, false, false, "", "مح")},
+ {0xfc47, 0, 0, 0, g(Yes, No, false, false, "", "مخ")},
+ {0xfc48, 0, 0, 0, g(Yes, No, false, false, "", "مم")},
+ {0xfc49, 0, 0, 0, g(Yes, No, false, false, "", "مى")},
+ {0xfc4a, 0, 0, 0, g(Yes, No, false, false, "", "مي")},
+ {0xfc4b, 0, 0, 0, g(Yes, No, false, false, "", "نج")},
+ {0xfc4c, 0, 0, 0, g(Yes, No, false, false, "", "نح")},
+ {0xfc4d, 0, 0, 0, g(Yes, No, false, false, "", "نخ")},
+ {0xfc4e, 0, 0, 0, g(Yes, No, false, false, "", "نم")},
+ {0xfc4f, 0, 0, 0, g(Yes, No, false, false, "", "نى")},
+ {0xfc50, 0, 0, 0, g(Yes, No, false, false, "", "ني")},
+ {0xfc51, 0, 0, 0, g(Yes, No, false, false, "", "هج")},
+ {0xfc52, 0, 0, 0, g(Yes, No, false, false, "", "هم")},
+ {0xfc53, 0, 0, 0, g(Yes, No, false, false, "", "هى")},
+ {0xfc54, 0, 0, 0, g(Yes, No, false, false, "", "هي")},
+ {0xfc55, 0, 0, 0, g(Yes, No, false, false, "", "يج")},
+ {0xfc56, 0, 0, 0, g(Yes, No, false, false, "", "يح")},
+ {0xfc57, 0, 0, 0, g(Yes, No, false, false, "", "يخ")},
+ {0xfc58, 0, 0, 0, g(Yes, No, false, false, "", "يم")},
+ {0xfc59, 0, 0, 0, g(Yes, No, false, false, "", "يى")},
+ {0xfc5a, 0, 0, 0, g(Yes, No, false, false, "", "يي")},
+ {0xfc5b, 0, 0, 1, g(Yes, No, false, false, "", "ذٰ")},
+ {0xfc5c, 0, 0, 1, g(Yes, No, false, false, "", "رٰ")},
+ {0xfc5d, 0, 0, 1, g(Yes, No, false, false, "", "ىٰ")},
+ {0xfc5e, 0, 0, 2, g(Yes, No, false, false, "", " ٌّ")},
+ {0xfc5f, 0, 0, 2, g(Yes, No, false, false, "", " ٍّ")},
+ {0xfc60, 0, 0, 2, g(Yes, No, false, false, "", " َّ")},
+ {0xfc61, 0, 0, 2, g(Yes, No, false, false, "", " ُّ")},
+ {0xfc62, 0, 0, 2, g(Yes, No, false, false, "", " ِّ")},
+ {0xfc63, 0, 0, 2, g(Yes, No, false, false, "", " ّٰ")},
+ {0xfc64, 0, 0, 0, g(Yes, No, false, false, "", "ئر")},
+ {0xfc65, 0, 0, 0, g(Yes, No, false, false, "", "ئز")},
+ {0xfc66, 0, 0, 0, g(Yes, No, false, false, "", "ئم")},
+ {0xfc67, 0, 0, 0, g(Yes, No, false, false, "", "ئن")},
+ {0xfc68, 0, 0, 0, g(Yes, No, false, false, "", "ئى")},
+ {0xfc69, 0, 0, 0, g(Yes, No, false, false, "", "ئي")},
+ {0xfc6a, 0, 0, 0, g(Yes, No, false, false, "", "بر")},
+ {0xfc6b, 0, 0, 0, g(Yes, No, false, false, "", "بز")},
+ {0xfc6c, 0, 0, 0, g(Yes, No, false, false, "", "بم")},
+ {0xfc6d, 0, 0, 0, g(Yes, No, false, false, "", "بن")},
+ {0xfc6e, 0, 0, 0, g(Yes, No, false, false, "", "بى")},
+ {0xfc6f, 0, 0, 0, g(Yes, No, false, false, "", "بي")},
+ {0xfc70, 0, 0, 0, g(Yes, No, false, false, "", "تر")},
+ {0xfc71, 0, 0, 0, g(Yes, No, false, false, "", "تز")},
+ {0xfc72, 0, 0, 0, g(Yes, No, false, false, "", "تم")},
+ {0xfc73, 0, 0, 0, g(Yes, No, false, false, "", "تن")},
+ {0xfc74, 0, 0, 0, g(Yes, No, false, false, "", "تى")},
+ {0xfc75, 0, 0, 0, g(Yes, No, false, false, "", "تي")},
+ {0xfc76, 0, 0, 0, g(Yes, No, false, false, "", "ثر")},
+ {0xfc77, 0, 0, 0, g(Yes, No, false, false, "", "ثز")},
+ {0xfc78, 0, 0, 0, g(Yes, No, false, false, "", "ثم")},
+ {0xfc79, 0, 0, 0, g(Yes, No, false, false, "", "ثن")},
+ {0xfc7a, 0, 0, 0, g(Yes, No, false, false, "", "ثى")},
+ {0xfc7b, 0, 0, 0, g(Yes, No, false, false, "", "ثي")},
+ {0xfc7c, 0, 0, 0, g(Yes, No, false, false, "", "فى")},
+ {0xfc7d, 0, 0, 0, g(Yes, No, false, false, "", "في")},
+ {0xfc7e, 0, 0, 0, g(Yes, No, false, false, "", "قى")},
+ {0xfc7f, 0, 0, 0, g(Yes, No, false, false, "", "قي")},
+ {0xfc80, 0, 0, 0, g(Yes, No, false, false, "", "كا")},
+ {0xfc81, 0, 0, 0, g(Yes, No, false, false, "", "كل")},
+ {0xfc82, 0, 0, 0, g(Yes, No, false, false, "", "كم")},
+ {0xfc83, 0, 0, 0, g(Yes, No, false, false, "", "كى")},
+ {0xfc84, 0, 0, 0, g(Yes, No, false, false, "", "كي")},
+ {0xfc85, 0, 0, 0, g(Yes, No, false, false, "", "لم")},
+ {0xfc86, 0, 0, 0, g(Yes, No, false, false, "", "لى")},
+ {0xfc87, 0, 0, 0, g(Yes, No, false, false, "", "لي")},
+ {0xfc88, 0, 0, 0, g(Yes, No, false, false, "", "ما")},
+ {0xfc89, 0, 0, 0, g(Yes, No, false, false, "", "مم")},
+ {0xfc8a, 0, 0, 0, g(Yes, No, false, false, "", "نر")},
+ {0xfc8b, 0, 0, 0, g(Yes, No, false, false, "", "نز")},
+ {0xfc8c, 0, 0, 0, g(Yes, No, false, false, "", "نم")},
+ {0xfc8d, 0, 0, 0, g(Yes, No, false, false, "", "نن")},
+ {0xfc8e, 0, 0, 0, g(Yes, No, false, false, "", "نى")},
+ {0xfc8f, 0, 0, 0, g(Yes, No, false, false, "", "ني")},
+ {0xfc90, 0, 0, 1, g(Yes, No, false, false, "", "ىٰ")},
+ {0xfc91, 0, 0, 0, g(Yes, No, false, false, "", "ير")},
+ {0xfc92, 0, 0, 0, g(Yes, No, false, false, "", "يز")},
+ {0xfc93, 0, 0, 0, g(Yes, No, false, false, "", "يم")},
+ {0xfc94, 0, 0, 0, g(Yes, No, false, false, "", "ين")},
+ {0xfc95, 0, 0, 0, g(Yes, No, false, false, "", "يى")},
+ {0xfc96, 0, 0, 0, g(Yes, No, false, false, "", "يي")},
+ {0xfc97, 0, 0, 0, g(Yes, No, false, false, "", "ئج")},
+ {0xfc98, 0, 0, 0, g(Yes, No, false, false, "", "ئح")},
+ {0xfc99, 0, 0, 0, g(Yes, No, false, false, "", "ئخ")},
+ {0xfc9a, 0, 0, 0, g(Yes, No, false, false, "", "ئم")},
+ {0xfc9b, 0, 0, 0, g(Yes, No, false, false, "", "ئه")},
+ {0xfc9c, 0, 0, 0, g(Yes, No, false, false, "", "بج")},
+ {0xfc9d, 0, 0, 0, g(Yes, No, false, false, "", "بح")},
+ {0xfc9e, 0, 0, 0, g(Yes, No, false, false, "", "بخ")},
+ {0xfc9f, 0, 0, 0, g(Yes, No, false, false, "", "بم")},
+ {0xfca0, 0, 0, 0, g(Yes, No, false, false, "", "به")},
+ {0xfca1, 0, 0, 0, g(Yes, No, false, false, "", "تج")},
+ {0xfca2, 0, 0, 0, g(Yes, No, false, false, "", "تح")},
+ {0xfca3, 0, 0, 0, g(Yes, No, false, false, "", "تخ")},
+ {0xfca4, 0, 0, 0, g(Yes, No, false, false, "", "تم")},
+ {0xfca5, 0, 0, 0, g(Yes, No, false, false, "", "ته")},
+ {0xfca6, 0, 0, 0, g(Yes, No, false, false, "", "ثم")},
+ {0xfca7, 0, 0, 0, g(Yes, No, false, false, "", "جح")},
+ {0xfca8, 0, 0, 0, g(Yes, No, false, false, "", "جم")},
+ {0xfca9, 0, 0, 0, g(Yes, No, false, false, "", "حج")},
+ {0xfcaa, 0, 0, 0, g(Yes, No, false, false, "", "حم")},
+ {0xfcab, 0, 0, 0, g(Yes, No, false, false, "", "خج")},
+ {0xfcac, 0, 0, 0, g(Yes, No, false, false, "", "خم")},
+ {0xfcad, 0, 0, 0, g(Yes, No, false, false, "", "سج")},
+ {0xfcae, 0, 0, 0, g(Yes, No, false, false, "", "سح")},
+ {0xfcaf, 0, 0, 0, g(Yes, No, false, false, "", "سخ")},
+ {0xfcb0, 0, 0, 0, g(Yes, No, false, false, "", "سم")},
+ {0xfcb1, 0, 0, 0, g(Yes, No, false, false, "", "صح")},
+ {0xfcb2, 0, 0, 0, g(Yes, No, false, false, "", "صخ")},
+ {0xfcb3, 0, 0, 0, g(Yes, No, false, false, "", "صم")},
+ {0xfcb4, 0, 0, 0, g(Yes, No, false, false, "", "ضج")},
+ {0xfcb5, 0, 0, 0, g(Yes, No, false, false, "", "ضح")},
+ {0xfcb6, 0, 0, 0, g(Yes, No, false, false, "", "ضخ")},
+ {0xfcb7, 0, 0, 0, g(Yes, No, false, false, "", "ضم")},
+ {0xfcb8, 0, 0, 0, g(Yes, No, false, false, "", "طح")},
+ {0xfcb9, 0, 0, 0, g(Yes, No, false, false, "", "ظم")},
+ {0xfcba, 0, 0, 0, g(Yes, No, false, false, "", "عج")},
+ {0xfcbb, 0, 0, 0, g(Yes, No, false, false, "", "عم")},
+ {0xfcbc, 0, 0, 0, g(Yes, No, false, false, "", "غج")},
+ {0xfcbd, 0, 0, 0, g(Yes, No, false, false, "", "غم")},
+ {0xfcbe, 0, 0, 0, g(Yes, No, false, false, "", "فج")},
+ {0xfcbf, 0, 0, 0, g(Yes, No, false, false, "", "فح")},
+ {0xfcc0, 0, 0, 0, g(Yes, No, false, false, "", "فخ")},
+ {0xfcc1, 0, 0, 0, g(Yes, No, false, false, "", "فم")},
+ {0xfcc2, 0, 0, 0, g(Yes, No, false, false, "", "قح")},
+ {0xfcc3, 0, 0, 0, g(Yes, No, false, false, "", "قم")},
+ {0xfcc4, 0, 0, 0, g(Yes, No, false, false, "", "كج")},
+ {0xfcc5, 0, 0, 0, g(Yes, No, false, false, "", "كح")},
+ {0xfcc6, 0, 0, 0, g(Yes, No, false, false, "", "كخ")},
+ {0xfcc7, 0, 0, 0, g(Yes, No, false, false, "", "كل")},
+ {0xfcc8, 0, 0, 0, g(Yes, No, false, false, "", "كم")},
+ {0xfcc9, 0, 0, 0, g(Yes, No, false, false, "", "لج")},
+ {0xfcca, 0, 0, 0, g(Yes, No, false, false, "", "لح")},
+ {0xfccb, 0, 0, 0, g(Yes, No, false, false, "", "لخ")},
+ {0xfccc, 0, 0, 0, g(Yes, No, false, false, "", "لم")},
+ {0xfccd, 0, 0, 0, g(Yes, No, false, false, "", "له")},
+ {0xfcce, 0, 0, 0, g(Yes, No, false, false, "", "مج")},
+ {0xfccf, 0, 0, 0, g(Yes, No, false, false, "", "مح")},
+ {0xfcd0, 0, 0, 0, g(Yes, No, false, false, "", "مخ")},
+ {0xfcd1, 0, 0, 0, g(Yes, No, false, false, "", "مم")},
+ {0xfcd2, 0, 0, 0, g(Yes, No, false, false, "", "نج")},
+ {0xfcd3, 0, 0, 0, g(Yes, No, false, false, "", "نح")},
+ {0xfcd4, 0, 0, 0, g(Yes, No, false, false, "", "نخ")},
+ {0xfcd5, 0, 0, 0, g(Yes, No, false, false, "", "نم")},
+ {0xfcd6, 0, 0, 0, g(Yes, No, false, false, "", "نه")},
+ {0xfcd7, 0, 0, 0, g(Yes, No, false, false, "", "هج")},
+ {0xfcd8, 0, 0, 0, g(Yes, No, false, false, "", "هم")},
+ {0xfcd9, 0, 0, 1, g(Yes, No, false, false, "", "هٰ")},
+ {0xfcda, 0, 0, 0, g(Yes, No, false, false, "", "يج")},
+ {0xfcdb, 0, 0, 0, g(Yes, No, false, false, "", "يح")},
+ {0xfcdc, 0, 0, 0, g(Yes, No, false, false, "", "يخ")},
+ {0xfcdd, 0, 0, 0, g(Yes, No, false, false, "", "يم")},
+ {0xfcde, 0, 0, 0, g(Yes, No, false, false, "", "يه")},
+ {0xfcdf, 0, 0, 0, g(Yes, No, false, false, "", "ئم")},
+ {0xfce0, 0, 0, 0, g(Yes, No, false, false, "", "ئه")},
+ {0xfce1, 0, 0, 0, g(Yes, No, false, false, "", "بم")},
+ {0xfce2, 0, 0, 0, g(Yes, No, false, false, "", "به")},
+ {0xfce3, 0, 0, 0, g(Yes, No, false, false, "", "تم")},
+ {0xfce4, 0, 0, 0, g(Yes, No, false, false, "", "ته")},
+ {0xfce5, 0, 0, 0, g(Yes, No, false, false, "", "ثم")},
+ {0xfce6, 0, 0, 0, g(Yes, No, false, false, "", "ثه")},
+ {0xfce7, 0, 0, 0, g(Yes, No, false, false, "", "سم")},
+ {0xfce8, 0, 0, 0, g(Yes, No, false, false, "", "سه")},
+ {0xfce9, 0, 0, 0, g(Yes, No, false, false, "", "شم")},
+ {0xfcea, 0, 0, 0, g(Yes, No, false, false, "", "شه")},
+ {0xfceb, 0, 0, 0, g(Yes, No, false, false, "", "كل")},
+ {0xfcec, 0, 0, 0, g(Yes, No, false, false, "", "كم")},
+ {0xfced, 0, 0, 0, g(Yes, No, false, false, "", "لم")},
+ {0xfcee, 0, 0, 0, g(Yes, No, false, false, "", "نم")},
+ {0xfcef, 0, 0, 0, g(Yes, No, false, false, "", "نه")},
+ {0xfcf0, 0, 0, 0, g(Yes, No, false, false, "", "يم")},
+ {0xfcf1, 0, 0, 0, g(Yes, No, false, false, "", "يه")},
+ {0xfcf2, 0, 0, 2, g(Yes, No, false, false, "", "ـَّ")},
+ {0xfcf3, 0, 0, 2, g(Yes, No, false, false, "", "ـُّ")},
+ {0xfcf4, 0, 0, 2, g(Yes, No, false, false, "", "ـِّ")},
+ {0xfcf5, 0, 0, 0, g(Yes, No, false, false, "", "طى")},
+ {0xfcf6, 0, 0, 0, g(Yes, No, false, false, "", "طي")},
+ {0xfcf7, 0, 0, 0, g(Yes, No, false, false, "", "عى")},
+ {0xfcf8, 0, 0, 0, g(Yes, No, false, false, "", "عي")},
+ {0xfcf9, 0, 0, 0, g(Yes, No, false, false, "", "غى")},
+ {0xfcfa, 0, 0, 0, g(Yes, No, false, false, "", "غي")},
+ {0xfcfb, 0, 0, 0, g(Yes, No, false, false, "", "سى")},
+ {0xfcfc, 0, 0, 0, g(Yes, No, false, false, "", "سي")},
+ {0xfcfd, 0, 0, 0, g(Yes, No, false, false, "", "شى")},
+ {0xfcfe, 0, 0, 0, g(Yes, No, false, false, "", "شي")},
+ {0xfcff, 0, 0, 0, g(Yes, No, false, false, "", "حى")},
+ {0xfd00, 0, 0, 0, g(Yes, No, false, false, "", "حي")},
+ {0xfd01, 0, 0, 0, g(Yes, No, false, false, "", "جى")},
+ {0xfd02, 0, 0, 0, g(Yes, No, false, false, "", "جي")},
+ {0xfd03, 0, 0, 0, g(Yes, No, false, false, "", "خى")},
+ {0xfd04, 0, 0, 0, g(Yes, No, false, false, "", "خي")},
+ {0xfd05, 0, 0, 0, g(Yes, No, false, false, "", "صى")},
+ {0xfd06, 0, 0, 0, g(Yes, No, false, false, "", "صي")},
+ {0xfd07, 0, 0, 0, g(Yes, No, false, false, "", "ضى")},
+ {0xfd08, 0, 0, 0, g(Yes, No, false, false, "", "ضي")},
+ {0xfd09, 0, 0, 0, g(Yes, No, false, false, "", "شج")},
+ {0xfd0a, 0, 0, 0, g(Yes, No, false, false, "", "شح")},
+ {0xfd0b, 0, 0, 0, g(Yes, No, false, false, "", "شخ")},
+ {0xfd0c, 0, 0, 0, g(Yes, No, false, false, "", "شم")},
+ {0xfd0d, 0, 0, 0, g(Yes, No, false, false, "", "شر")},
+ {0xfd0e, 0, 0, 0, g(Yes, No, false, false, "", "سر")},
+ {0xfd0f, 0, 0, 0, g(Yes, No, false, false, "", "صر")},
+ {0xfd10, 0, 0, 0, g(Yes, No, false, false, "", "ضر")},
+ {0xfd11, 0, 0, 0, g(Yes, No, false, false, "", "طى")},
+ {0xfd12, 0, 0, 0, g(Yes, No, false, false, "", "طي")},
+ {0xfd13, 0, 0, 0, g(Yes, No, false, false, "", "عى")},
+ {0xfd14, 0, 0, 0, g(Yes, No, false, false, "", "عي")},
+ {0xfd15, 0, 0, 0, g(Yes, No, false, false, "", "غى")},
+ {0xfd16, 0, 0, 0, g(Yes, No, false, false, "", "غي")},
+ {0xfd17, 0, 0, 0, g(Yes, No, false, false, "", "سى")},
+ {0xfd18, 0, 0, 0, g(Yes, No, false, false, "", "سي")},
+ {0xfd19, 0, 0, 0, g(Yes, No, false, false, "", "شى")},
+ {0xfd1a, 0, 0, 0, g(Yes, No, false, false, "", "شي")},
+ {0xfd1b, 0, 0, 0, g(Yes, No, false, false, "", "حى")},
+ {0xfd1c, 0, 0, 0, g(Yes, No, false, false, "", "حي")},
+ {0xfd1d, 0, 0, 0, g(Yes, No, false, false, "", "جى")},
+ {0xfd1e, 0, 0, 0, g(Yes, No, false, false, "", "جي")},
+ {0xfd1f, 0, 0, 0, g(Yes, No, false, false, "", "خى")},
+ {0xfd20, 0, 0, 0, g(Yes, No, false, false, "", "خي")},
+ {0xfd21, 0, 0, 0, g(Yes, No, false, false, "", "صى")},
+ {0xfd22, 0, 0, 0, g(Yes, No, false, false, "", "صي")},
+ {0xfd23, 0, 0, 0, g(Yes, No, false, false, "", "ضى")},
+ {0xfd24, 0, 0, 0, g(Yes, No, false, false, "", "ضي")},
+ {0xfd25, 0, 0, 0, g(Yes, No, false, false, "", "شج")},
+ {0xfd26, 0, 0, 0, g(Yes, No, false, false, "", "شح")},
+ {0xfd27, 0, 0, 0, g(Yes, No, false, false, "", "شخ")},
+ {0xfd28, 0, 0, 0, g(Yes, No, false, false, "", "شم")},
+ {0xfd29, 0, 0, 0, g(Yes, No, false, false, "", "شر")},
+ {0xfd2a, 0, 0, 0, g(Yes, No, false, false, "", "سر")},
+ {0xfd2b, 0, 0, 0, g(Yes, No, false, false, "", "صر")},
+ {0xfd2c, 0, 0, 0, g(Yes, No, false, false, "", "ضر")},
+ {0xfd2d, 0, 0, 0, g(Yes, No, false, false, "", "شج")},
+ {0xfd2e, 0, 0, 0, g(Yes, No, false, false, "", "شح")},
+ {0xfd2f, 0, 0, 0, g(Yes, No, false, false, "", "شخ")},
+ {0xfd30, 0, 0, 0, g(Yes, No, false, false, "", "شم")},
+ {0xfd31, 0, 0, 0, g(Yes, No, false, false, "", "سه")},
+ {0xfd32, 0, 0, 0, g(Yes, No, false, false, "", "شه")},
+ {0xfd33, 0, 0, 0, g(Yes, No, false, false, "", "طم")},
+ {0xfd34, 0, 0, 0, g(Yes, No, false, false, "", "سج")},
+ {0xfd35, 0, 0, 0, g(Yes, No, false, false, "", "سح")},
+ {0xfd36, 0, 0, 0, g(Yes, No, false, false, "", "سخ")},
+ {0xfd37, 0, 0, 0, g(Yes, No, false, false, "", "شج")},
+ {0xfd38, 0, 0, 0, g(Yes, No, false, false, "", "شح")},
+ {0xfd39, 0, 0, 0, g(Yes, No, false, false, "", "شخ")},
+ {0xfd3a, 0, 0, 0, g(Yes, No, false, false, "", "طم")},
+ {0xfd3b, 0, 0, 0, g(Yes, No, false, false, "", "ظم")},
+ {0xfd3c, 0, 0, 1, g(Yes, No, false, false, "", "اً")},
+ {0xfd3e, 0, 0, 0, f(Yes, false, "")},
+ {0xfd50, 0, 0, 0, g(Yes, No, false, false, "", "تجم")},
+ {0xfd51, 0, 0, 0, g(Yes, No, false, false, "", "تحج")},
+ {0xfd53, 0, 0, 0, g(Yes, No, false, false, "", "تحم")},
+ {0xfd54, 0, 0, 0, g(Yes, No, false, false, "", "تخم")},
+ {0xfd55, 0, 0, 0, g(Yes, No, false, false, "", "تمج")},
+ {0xfd56, 0, 0, 0, g(Yes, No, false, false, "", "تمح")},
+ {0xfd57, 0, 0, 0, g(Yes, No, false, false, "", "تمخ")},
+ {0xfd58, 0, 0, 0, g(Yes, No, false, false, "", "جمح")},
+ {0xfd5a, 0, 0, 0, g(Yes, No, false, false, "", "حمي")},
+ {0xfd5b, 0, 0, 0, g(Yes, No, false, false, "", "حمى")},
+ {0xfd5c, 0, 0, 0, g(Yes, No, false, false, "", "سحج")},
+ {0xfd5d, 0, 0, 0, g(Yes, No, false, false, "", "سجح")},
+ {0xfd5e, 0, 0, 0, g(Yes, No, false, false, "", "سجى")},
+ {0xfd5f, 0, 0, 0, g(Yes, No, false, false, "", "سمح")},
+ {0xfd61, 0, 0, 0, g(Yes, No, false, false, "", "سمج")},
+ {0xfd62, 0, 0, 0, g(Yes, No, false, false, "", "سمم")},
+ {0xfd64, 0, 0, 0, g(Yes, No, false, false, "", "صحح")},
+ {0xfd66, 0, 0, 0, g(Yes, No, false, false, "", "صمم")},
+ {0xfd67, 0, 0, 0, g(Yes, No, false, false, "", "شحم")},
+ {0xfd69, 0, 0, 0, g(Yes, No, false, false, "", "شجي")},
+ {0xfd6a, 0, 0, 0, g(Yes, No, false, false, "", "شمخ")},
+ {0xfd6c, 0, 0, 0, g(Yes, No, false, false, "", "شمم")},
+ {0xfd6e, 0, 0, 0, g(Yes, No, false, false, "", "ضحى")},
+ {0xfd6f, 0, 0, 0, g(Yes, No, false, false, "", "ضخم")},
+ {0xfd71, 0, 0, 0, g(Yes, No, false, false, "", "طمح")},
+ {0xfd73, 0, 0, 0, g(Yes, No, false, false, "", "طمم")},
+ {0xfd74, 0, 0, 0, g(Yes, No, false, false, "", "طمي")},
+ {0xfd75, 0, 0, 0, g(Yes, No, false, false, "", "عجم")},
+ {0xfd76, 0, 0, 0, g(Yes, No, false, false, "", "عمم")},
+ {0xfd78, 0, 0, 0, g(Yes, No, false, false, "", "عمى")},
+ {0xfd79, 0, 0, 0, g(Yes, No, false, false, "", "غمم")},
+ {0xfd7a, 0, 0, 0, g(Yes, No, false, false, "", "غمي")},
+ {0xfd7b, 0, 0, 0, g(Yes, No, false, false, "", "غمى")},
+ {0xfd7c, 0, 0, 0, g(Yes, No, false, false, "", "فخم")},
+ {0xfd7e, 0, 0, 0, g(Yes, No, false, false, "", "قمح")},
+ {0xfd7f, 0, 0, 0, g(Yes, No, false, false, "", "قمم")},
+ {0xfd80, 0, 0, 0, g(Yes, No, false, false, "", "لحم")},
+ {0xfd81, 0, 0, 0, g(Yes, No, false, false, "", "لحي")},
+ {0xfd82, 0, 0, 0, g(Yes, No, false, false, "", "لحى")},
+ {0xfd83, 0, 0, 0, g(Yes, No, false, false, "", "لجج")},
+ {0xfd85, 0, 0, 0, g(Yes, No, false, false, "", "لخم")},
+ {0xfd87, 0, 0, 0, g(Yes, No, false, false, "", "لمح")},
+ {0xfd89, 0, 0, 0, g(Yes, No, false, false, "", "محج")},
+ {0xfd8a, 0, 0, 0, g(Yes, No, false, false, "", "محم")},
+ {0xfd8b, 0, 0, 0, g(Yes, No, false, false, "", "محي")},
+ {0xfd8c, 0, 0, 0, g(Yes, No, false, false, "", "مجح")},
+ {0xfd8d, 0, 0, 0, g(Yes, No, false, false, "", "مجم")},
+ {0xfd8e, 0, 0, 0, g(Yes, No, false, false, "", "مخج")},
+ {0xfd8f, 0, 0, 0, g(Yes, No, false, false, "", "مخم")},
+ {0xfd90, 0, 0, 0, f(Yes, false, "")},
+ {0xfd92, 0, 0, 0, g(Yes, No, false, false, "", "مجخ")},
+ {0xfd93, 0, 0, 0, g(Yes, No, false, false, "", "همج")},
+ {0xfd94, 0, 0, 0, g(Yes, No, false, false, "", "همم")},
+ {0xfd95, 0, 0, 0, g(Yes, No, false, false, "", "نحم")},
+ {0xfd96, 0, 0, 0, g(Yes, No, false, false, "", "نحى")},
+ {0xfd97, 0, 0, 0, g(Yes, No, false, false, "", "نجم")},
+ {0xfd99, 0, 0, 0, g(Yes, No, false, false, "", "نجى")},
+ {0xfd9a, 0, 0, 0, g(Yes, No, false, false, "", "نمي")},
+ {0xfd9b, 0, 0, 0, g(Yes, No, false, false, "", "نمى")},
+ {0xfd9c, 0, 0, 0, g(Yes, No, false, false, "", "يمم")},
+ {0xfd9e, 0, 0, 0, g(Yes, No, false, false, "", "بخي")},
+ {0xfd9f, 0, 0, 0, g(Yes, No, false, false, "", "تجي")},
+ {0xfda0, 0, 0, 0, g(Yes, No, false, false, "", "تجى")},
+ {0xfda1, 0, 0, 0, g(Yes, No, false, false, "", "تخي")},
+ {0xfda2, 0, 0, 0, g(Yes, No, false, false, "", "تخى")},
+ {0xfda3, 0, 0, 0, g(Yes, No, false, false, "", "تمي")},
+ {0xfda4, 0, 0, 0, g(Yes, No, false, false, "", "تمى")},
+ {0xfda5, 0, 0, 0, g(Yes, No, false, false, "", "جمي")},
+ {0xfda6, 0, 0, 0, g(Yes, No, false, false, "", "جحى")},
+ {0xfda7, 0, 0, 0, g(Yes, No, false, false, "", "جمى")},
+ {0xfda8, 0, 0, 0, g(Yes, No, false, false, "", "سخى")},
+ {0xfda9, 0, 0, 0, g(Yes, No, false, false, "", "صحي")},
+ {0xfdaa, 0, 0, 0, g(Yes, No, false, false, "", "شحي")},
+ {0xfdab, 0, 0, 0, g(Yes, No, false, false, "", "ضحي")},
+ {0xfdac, 0, 0, 0, g(Yes, No, false, false, "", "لجي")},
+ {0xfdad, 0, 0, 0, g(Yes, No, false, false, "", "لمي")},
+ {0xfdae, 0, 0, 0, g(Yes, No, false, false, "", "يحي")},
+ {0xfdaf, 0, 0, 0, g(Yes, No, false, false, "", "يجي")},
+ {0xfdb0, 0, 0, 0, g(Yes, No, false, false, "", "يمي")},
+ {0xfdb1, 0, 0, 0, g(Yes, No, false, false, "", "ممي")},
+ {0xfdb2, 0, 0, 0, g(Yes, No, false, false, "", "قمي")},
+ {0xfdb3, 0, 0, 0, g(Yes, No, false, false, "", "نحي")},
+ {0xfdb4, 0, 0, 0, g(Yes, No, false, false, "", "قمح")},
+ {0xfdb5, 0, 0, 0, g(Yes, No, false, false, "", "لحم")},
+ {0xfdb6, 0, 0, 0, g(Yes, No, false, false, "", "عمي")},
+ {0xfdb7, 0, 0, 0, g(Yes, No, false, false, "", "كمي")},
+ {0xfdb8, 0, 0, 0, g(Yes, No, false, false, "", "نجح")},
+ {0xfdb9, 0, 0, 0, g(Yes, No, false, false, "", "مخي")},
+ {0xfdba, 0, 0, 0, g(Yes, No, false, false, "", "لجم")},
+ {0xfdbb, 0, 0, 0, g(Yes, No, false, false, "", "كمم")},
+ {0xfdbc, 0, 0, 0, g(Yes, No, false, false, "", "لجم")},
+ {0xfdbd, 0, 0, 0, g(Yes, No, false, false, "", "نجح")},
+ {0xfdbe, 0, 0, 0, g(Yes, No, false, false, "", "جحي")},
+ {0xfdbf, 0, 0, 0, g(Yes, No, false, false, "", "حجي")},
+ {0xfdc0, 0, 0, 0, g(Yes, No, false, false, "", "مجي")},
+ {0xfdc1, 0, 0, 0, g(Yes, No, false, false, "", "فمي")},
+ {0xfdc2, 0, 0, 0, g(Yes, No, false, false, "", "بحي")},
+ {0xfdc3, 0, 0, 0, g(Yes, No, false, false, "", "كمم")},
+ {0xfdc4, 0, 0, 0, g(Yes, No, false, false, "", "عجم")},
+ {0xfdc5, 0, 0, 0, g(Yes, No, false, false, "", "صمم")},
+ {0xfdc6, 0, 0, 0, g(Yes, No, false, false, "", "سخي")},
+ {0xfdc7, 0, 0, 0, g(Yes, No, false, false, "", "نجي")},
+ {0xfdc8, 0, 0, 0, f(Yes, false, "")},
+ {0xfdf0, 0, 0, 0, g(Yes, No, false, false, "", "صلے")},
+ {0xfdf1, 0, 0, 0, g(Yes, No, false, false, "", "قلے")},
+ {0xfdf2, 0, 0, 0, g(Yes, No, false, false, "", "الله")},
+ {0xfdf3, 0, 0, 0, g(Yes, No, false, false, "", "اكبر")},
+ {0xfdf4, 0, 0, 0, g(Yes, No, false, false, "", "محمد")},
+ {0xfdf5, 0, 0, 0, g(Yes, No, false, false, "", "صلعم")},
+ {0xfdf6, 0, 0, 0, g(Yes, No, false, false, "", "رسول")},
+ {0xfdf7, 0, 0, 0, g(Yes, No, false, false, "", "عليه")},
+ {0xfdf8, 0, 0, 0, g(Yes, No, false, false, "", "وسلم")},
+ {0xfdf9, 0, 0, 0, g(Yes, No, false, false, "", "صلى")},
+ {0xfdfa, 0, 0, 0, g(Yes, No, false, false, "", "صلى الله عليه وسلم")},
+ {0xfdfb, 0, 0, 0, g(Yes, No, false, false, "", "جل جلاله")},
+ {0xfdfc, 0, 0, 0, g(Yes, No, false, false, "", "ریال")},
+ {0xfdfd, 0, 0, 0, f(Yes, false, "")},
+ {0xfe10, 0, 0, 0, g(Yes, No, false, false, "", ",")},
+ {0xfe11, 0, 0, 0, g(Yes, No, false, false, "", "、")},
+ {0xfe12, 0, 0, 0, g(Yes, No, false, false, "", "。")},
+ {0xfe13, 0, 0, 0, g(Yes, No, false, false, "", ":")},
+ {0xfe14, 0, 0, 0, g(Yes, No, false, false, "", ";")},
+ {0xfe15, 0, 0, 0, g(Yes, No, false, false, "", "!")},
+ {0xfe16, 0, 0, 0, g(Yes, No, false, false, "", "?")},
+ {0xfe17, 0, 0, 0, g(Yes, No, false, false, "", "〖")},
+ {0xfe18, 0, 0, 0, g(Yes, No, false, false, "", "〗")},
+ {0xfe19, 0, 0, 0, g(Yes, No, false, false, "", "...")},
+ {0xfe1a, 0, 0, 0, f(Yes, false, "")},
+ {0xfe20, 230, 1, 1, f(Yes, false, "")},
+ {0xfe27, 220, 1, 1, f(Yes, false, "")},
+ {0xfe2e, 230, 1, 1, f(Yes, false, "")},
+ {0xfe30, 0, 0, 0, g(Yes, No, false, false, "", "..")},
+ {0xfe31, 0, 0, 0, g(Yes, No, false, false, "", "—")},
+ {0xfe32, 0, 0, 0, g(Yes, No, false, false, "", "–")},
+ {0xfe33, 0, 0, 0, g(Yes, No, false, false, "", "_")},
+ {0xfe35, 0, 0, 0, g(Yes, No, false, false, "", "(")},
+ {0xfe36, 0, 0, 0, g(Yes, No, false, false, "", ")")},
+ {0xfe37, 0, 0, 0, g(Yes, No, false, false, "", "{")},
+ {0xfe38, 0, 0, 0, g(Yes, No, false, false, "", "}")},
+ {0xfe39, 0, 0, 0, g(Yes, No, false, false, "", "〔")},
+ {0xfe3a, 0, 0, 0, g(Yes, No, false, false, "", "〕")},
+ {0xfe3b, 0, 0, 0, g(Yes, No, false, false, "", "【")},
+ {0xfe3c, 0, 0, 0, g(Yes, No, false, false, "", "】")},
+ {0xfe3d, 0, 0, 0, g(Yes, No, false, false, "", "《")},
+ {0xfe3e, 0, 0, 0, g(Yes, No, false, false, "", "》")},
+ {0xfe3f, 0, 0, 0, g(Yes, No, false, false, "", "〈")},
+ {0xfe40, 0, 0, 0, g(Yes, No, false, false, "", "〉")},
+ {0xfe41, 0, 0, 0, g(Yes, No, false, false, "", "「")},
+ {0xfe42, 0, 0, 0, g(Yes, No, false, false, "", "」")},
+ {0xfe43, 0, 0, 0, g(Yes, No, false, false, "", "『")},
+ {0xfe44, 0, 0, 0, g(Yes, No, false, false, "", "』")},
+ {0xfe45, 0, 0, 0, f(Yes, false, "")},
+ {0xfe47, 0, 0, 0, g(Yes, No, false, false, "", "[")},
+ {0xfe48, 0, 0, 0, g(Yes, No, false, false, "", "]")},
+ {0xfe49, 0, 0, 1, g(Yes, No, false, false, "", " ̅")},
+ {0xfe4d, 0, 0, 0, g(Yes, No, false, false, "", "_")},
+ {0xfe50, 0, 0, 0, g(Yes, No, false, false, "", ",")},
+ {0xfe51, 0, 0, 0, g(Yes, No, false, false, "", "、")},
+ {0xfe52, 0, 0, 0, g(Yes, No, false, false, "", ".")},
+ {0xfe53, 0, 0, 0, f(Yes, false, "")},
+ {0xfe54, 0, 0, 0, g(Yes, No, false, false, "", ";")},
+ {0xfe55, 0, 0, 0, g(Yes, No, false, false, "", ":")},
+ {0xfe56, 0, 0, 0, g(Yes, No, false, false, "", "?")},
+ {0xfe57, 0, 0, 0, g(Yes, No, false, false, "", "!")},
+ {0xfe58, 0, 0, 0, g(Yes, No, false, false, "", "—")},
+ {0xfe59, 0, 0, 0, g(Yes, No, false, false, "", "(")},
+ {0xfe5a, 0, 0, 0, g(Yes, No, false, false, "", ")")},
+ {0xfe5b, 0, 0, 0, g(Yes, No, false, false, "", "{")},
+ {0xfe5c, 0, 0, 0, g(Yes, No, false, false, "", "}")},
+ {0xfe5d, 0, 0, 0, g(Yes, No, false, false, "", "〔")},
+ {0xfe5e, 0, 0, 0, g(Yes, No, false, false, "", "〕")},
+ {0xfe5f, 0, 0, 0, g(Yes, No, false, false, "", "#")},
+ {0xfe60, 0, 0, 0, g(Yes, No, false, false, "", "&")},
+ {0xfe61, 0, 0, 0, g(Yes, No, false, false, "", "*")},
+ {0xfe62, 0, 0, 0, g(Yes, No, false, false, "", "+")},
+ {0xfe63, 0, 0, 0, g(Yes, No, false, false, "", "-")},
+ {0xfe64, 0, 0, 0, g(Yes, No, false, false, "", "<")},
+ {0xfe65, 0, 0, 0, g(Yes, No, false, false, "", ">")},
+ {0xfe66, 0, 0, 0, g(Yes, No, false, false, "", "=")},
+ {0xfe67, 0, 0, 0, f(Yes, false, "")},
+ {0xfe68, 0, 0, 0, g(Yes, No, false, false, "", "\\")},
+ {0xfe69, 0, 0, 0, g(Yes, No, false, false, "", "$")},
+ {0xfe6a, 0, 0, 0, g(Yes, No, false, false, "", "%")},
+ {0xfe6b, 0, 0, 0, g(Yes, No, false, false, "", "@")},
+ {0xfe6c, 0, 0, 0, f(Yes, false, "")},
+ {0xfe70, 0, 0, 1, g(Yes, No, false, false, "", " ً")},
+ {0xfe71, 0, 0, 1, g(Yes, No, false, false, "", "ـً")},
+ {0xfe72, 0, 0, 1, g(Yes, No, false, false, "", " ٌ")},
+ {0xfe73, 0, 0, 0, f(Yes, false, "")},
+ {0xfe74, 0, 0, 1, g(Yes, No, false, false, "", " ٍ")},
+ {0xfe75, 0, 0, 0, f(Yes, false, "")},
+ {0xfe76, 0, 0, 1, g(Yes, No, false, false, "", " َ")},
+ {0xfe77, 0, 0, 1, g(Yes, No, false, false, "", "ـَ")},
+ {0xfe78, 0, 0, 1, g(Yes, No, false, false, "", " ُ")},
+ {0xfe79, 0, 0, 1, g(Yes, No, false, false, "", "ـُ")},
+ {0xfe7a, 0, 0, 1, g(Yes, No, false, false, "", " ِ")},
+ {0xfe7b, 0, 0, 1, g(Yes, No, false, false, "", "ـِ")},
+ {0xfe7c, 0, 0, 1, g(Yes, No, false, false, "", " ّ")},
+ {0xfe7d, 0, 0, 1, g(Yes, No, false, false, "", "ـّ")},
+ {0xfe7e, 0, 0, 1, g(Yes, No, false, false, "", " ْ")},
+ {0xfe7f, 0, 0, 1, g(Yes, No, false, false, "", "ـْ")},
+ {0xfe80, 0, 0, 0, g(Yes, No, false, false, "", "ء")},
+ {0xfe81, 0, 0, 1, g(Yes, No, false, false, "", "آ")},
+ {0xfe83, 0, 0, 1, g(Yes, No, false, false, "", "أ")},
+ {0xfe85, 0, 0, 1, g(Yes, No, false, false, "", "ؤ")},
+ {0xfe87, 0, 0, 1, g(Yes, No, false, false, "", "إ")},
+ {0xfe89, 0, 0, 1, g(Yes, No, false, false, "", "ئ")},
+ {0xfe8d, 0, 0, 0, g(Yes, No, false, false, "", "ا")},
+ {0xfe8f, 0, 0, 0, g(Yes, No, false, false, "", "ب")},
+ {0xfe93, 0, 0, 0, g(Yes, No, false, false, "", "ة")},
+ {0xfe95, 0, 0, 0, g(Yes, No, false, false, "", "ت")},
+ {0xfe99, 0, 0, 0, g(Yes, No, false, false, "", "ث")},
+ {0xfe9d, 0, 0, 0, g(Yes, No, false, false, "", "ج")},
+ {0xfea1, 0, 0, 0, g(Yes, No, false, false, "", "ح")},
+ {0xfea5, 0, 0, 0, g(Yes, No, false, false, "", "خ")},
+ {0xfea9, 0, 0, 0, g(Yes, No, false, false, "", "د")},
+ {0xfeab, 0, 0, 0, g(Yes, No, false, false, "", "ذ")},
+ {0xfead, 0, 0, 0, g(Yes, No, false, false, "", "ر")},
+ {0xfeaf, 0, 0, 0, g(Yes, No, false, false, "", "ز")},
+ {0xfeb1, 0, 0, 0, g(Yes, No, false, false, "", "س")},
+ {0xfeb5, 0, 0, 0, g(Yes, No, false, false, "", "ش")},
+ {0xfeb9, 0, 0, 0, g(Yes, No, false, false, "", "ص")},
+ {0xfebd, 0, 0, 0, g(Yes, No, false, false, "", "ض")},
+ {0xfec1, 0, 0, 0, g(Yes, No, false, false, "", "ط")},
+ {0xfec5, 0, 0, 0, g(Yes, No, false, false, "", "ظ")},
+ {0xfec9, 0, 0, 0, g(Yes, No, false, false, "", "ع")},
+ {0xfecd, 0, 0, 0, g(Yes, No, false, false, "", "غ")},
+ {0xfed1, 0, 0, 0, g(Yes, No, false, false, "", "ف")},
+ {0xfed5, 0, 0, 0, g(Yes, No, false, false, "", "ق")},
+ {0xfed9, 0, 0, 0, g(Yes, No, false, false, "", "ك")},
+ {0xfedd, 0, 0, 0, g(Yes, No, false, false, "", "ل")},
+ {0xfee1, 0, 0, 0, g(Yes, No, false, false, "", "م")},
+ {0xfee5, 0, 0, 0, g(Yes, No, false, false, "", "ن")},
+ {0xfee9, 0, 0, 0, g(Yes, No, false, false, "", "ه")},
+ {0xfeed, 0, 0, 0, g(Yes, No, false, false, "", "و")},
+ {0xfeef, 0, 0, 0, g(Yes, No, false, false, "", "ى")},
+ {0xfef1, 0, 0, 0, g(Yes, No, false, false, "", "ي")},
+ {0xfef5, 0, 0, 1, g(Yes, No, false, false, "", "لآ")},
+ {0xfef7, 0, 0, 1, g(Yes, No, false, false, "", "لأ")},
+ {0xfef9, 0, 0, 1, g(Yes, No, false, false, "", "لإ")},
+ {0xfefb, 0, 0, 0, g(Yes, No, false, false, "", "لا")},
+ {0xfefd, 0, 0, 0, f(Yes, false, "")},
+ {0xff01, 0, 0, 0, g(Yes, No, false, false, "", "!")},
+ {0xff02, 0, 0, 0, g(Yes, No, false, false, "", "\"")},
+ {0xff03, 0, 0, 0, g(Yes, No, false, false, "", "#")},
+ {0xff04, 0, 0, 0, g(Yes, No, false, false, "", "$")},
+ {0xff05, 0, 0, 0, g(Yes, No, false, false, "", "%")},
+ {0xff06, 0, 0, 0, g(Yes, No, false, false, "", "&")},
+ {0xff07, 0, 0, 0, g(Yes, No, false, false, "", "'")},
+ {0xff08, 0, 0, 0, g(Yes, No, false, false, "", "(")},
+ {0xff09, 0, 0, 0, g(Yes, No, false, false, "", ")")},
+ {0xff0a, 0, 0, 0, g(Yes, No, false, false, "", "*")},
+ {0xff0b, 0, 0, 0, g(Yes, No, false, false, "", "+")},
+ {0xff0c, 0, 0, 0, g(Yes, No, false, false, "", ",")},
+ {0xff0d, 0, 0, 0, g(Yes, No, false, false, "", "-")},
+ {0xff0e, 0, 0, 0, g(Yes, No, false, false, "", ".")},
+ {0xff0f, 0, 0, 0, g(Yes, No, false, false, "", "/")},
+ {0xff10, 0, 0, 0, g(Yes, No, false, false, "", "0")},
+ {0xff11, 0, 0, 0, g(Yes, No, false, false, "", "1")},
+ {0xff12, 0, 0, 0, g(Yes, No, false, false, "", "2")},
+ {0xff13, 0, 0, 0, g(Yes, No, false, false, "", "3")},
+ {0xff14, 0, 0, 0, g(Yes, No, false, false, "", "4")},
+ {0xff15, 0, 0, 0, g(Yes, No, false, false, "", "5")},
+ {0xff16, 0, 0, 0, g(Yes, No, false, false, "", "6")},
+ {0xff17, 0, 0, 0, g(Yes, No, false, false, "", "7")},
+ {0xff18, 0, 0, 0, g(Yes, No, false, false, "", "8")},
+ {0xff19, 0, 0, 0, g(Yes, No, false, false, "", "9")},
+ {0xff1a, 0, 0, 0, g(Yes, No, false, false, "", ":")},
+ {0xff1b, 0, 0, 0, g(Yes, No, false, false, "", ";")},
+ {0xff1c, 0, 0, 0, g(Yes, No, false, false, "", "<")},
+ {0xff1d, 0, 0, 0, g(Yes, No, false, false, "", "=")},
+ {0xff1e, 0, 0, 0, g(Yes, No, false, false, "", ">")},
+ {0xff1f, 0, 0, 0, g(Yes, No, false, false, "", "?")},
+ {0xff20, 0, 0, 0, g(Yes, No, false, false, "", "@")},
+ {0xff21, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0xff22, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0xff23, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0xff24, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0xff25, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0xff26, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0xff27, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0xff28, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0xff29, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0xff2a, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0xff2b, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0xff2c, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0xff2d, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0xff2e, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0xff2f, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0xff30, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0xff31, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0xff32, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0xff33, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0xff34, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0xff35, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0xff36, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0xff37, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0xff38, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0xff39, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0xff3a, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0xff3b, 0, 0, 0, g(Yes, No, false, false, "", "[")},
+ {0xff3c, 0, 0, 0, g(Yes, No, false, false, "", "\\")},
+ {0xff3d, 0, 0, 0, g(Yes, No, false, false, "", "]")},
+ {0xff3e, 0, 0, 0, g(Yes, No, false, false, "", "^")},
+ {0xff3f, 0, 0, 0, g(Yes, No, false, false, "", "_")},
+ {0xff40, 0, 0, 0, g(Yes, No, false, false, "", "`")},
+ {0xff41, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0xff42, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0xff43, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0xff44, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0xff45, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0xff46, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0xff47, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0xff48, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0xff49, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0xff4a, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0xff4b, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0xff4c, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0xff4d, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0xff4e, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0xff4f, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0xff50, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0xff51, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0xff52, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0xff53, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0xff54, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0xff55, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0xff56, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0xff57, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0xff58, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0xff59, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0xff5a, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0xff5b, 0, 0, 0, g(Yes, No, false, false, "", "{")},
+ {0xff5c, 0, 0, 0, g(Yes, No, false, false, "", "|")},
+ {0xff5d, 0, 0, 0, g(Yes, No, false, false, "", "}")},
+ {0xff5e, 0, 0, 0, g(Yes, No, false, false, "", "~")},
+ {0xff5f, 0, 0, 0, g(Yes, No, false, false, "", "⦅")},
+ {0xff60, 0, 0, 0, g(Yes, No, false, false, "", "⦆")},
+ {0xff61, 0, 0, 0, g(Yes, No, false, false, "", "。")},
+ {0xff62, 0, 0, 0, g(Yes, No, false, false, "", "「")},
+ {0xff63, 0, 0, 0, g(Yes, No, false, false, "", "」")},
+ {0xff64, 0, 0, 0, g(Yes, No, false, false, "", "、")},
+ {0xff65, 0, 0, 0, g(Yes, No, false, false, "", "・")},
+ {0xff66, 0, 0, 0, g(Yes, No, false, false, "", "ヲ")},
+ {0xff67, 0, 0, 0, g(Yes, No, false, false, "", "ァ")},
+ {0xff68, 0, 0, 0, g(Yes, No, false, false, "", "ィ")},
+ {0xff69, 0, 0, 0, g(Yes, No, false, false, "", "ゥ")},
+ {0xff6a, 0, 0, 0, g(Yes, No, false, false, "", "ェ")},
+ {0xff6b, 0, 0, 0, g(Yes, No, false, false, "", "ォ")},
+ {0xff6c, 0, 0, 0, g(Yes, No, false, false, "", "ャ")},
+ {0xff6d, 0, 0, 0, g(Yes, No, false, false, "", "ュ")},
+ {0xff6e, 0, 0, 0, g(Yes, No, false, false, "", "ョ")},
+ {0xff6f, 0, 0, 0, g(Yes, No, false, false, "", "ッ")},
+ {0xff70, 0, 0, 0, g(Yes, No, false, false, "", "ー")},
+ {0xff71, 0, 0, 0, g(Yes, No, false, false, "", "ア")},
+ {0xff72, 0, 0, 0, g(Yes, No, false, false, "", "イ")},
+ {0xff73, 0, 0, 0, g(Yes, No, false, false, "", "ウ")},
+ {0xff74, 0, 0, 0, g(Yes, No, false, false, "", "エ")},
+ {0xff75, 0, 0, 0, g(Yes, No, false, false, "", "オ")},
+ {0xff76, 0, 0, 0, g(Yes, No, false, false, "", "カ")},
+ {0xff77, 0, 0, 0, g(Yes, No, false, false, "", "キ")},
+ {0xff78, 0, 0, 0, g(Yes, No, false, false, "", "ク")},
+ {0xff79, 0, 0, 0, g(Yes, No, false, false, "", "ケ")},
+ {0xff7a, 0, 0, 0, g(Yes, No, false, false, "", "コ")},
+ {0xff7b, 0, 0, 0, g(Yes, No, false, false, "", "サ")},
+ {0xff7c, 0, 0, 0, g(Yes, No, false, false, "", "シ")},
+ {0xff7d, 0, 0, 0, g(Yes, No, false, false, "", "ス")},
+ {0xff7e, 0, 0, 0, g(Yes, No, false, false, "", "セ")},
+ {0xff7f, 0, 0, 0, g(Yes, No, false, false, "", "ソ")},
+ {0xff80, 0, 0, 0, g(Yes, No, false, false, "", "タ")},
+ {0xff81, 0, 0, 0, g(Yes, No, false, false, "", "チ")},
+ {0xff82, 0, 0, 0, g(Yes, No, false, false, "", "ツ")},
+ {0xff83, 0, 0, 0, g(Yes, No, false, false, "", "テ")},
+ {0xff84, 0, 0, 0, g(Yes, No, false, false, "", "ト")},
+ {0xff85, 0, 0, 0, g(Yes, No, false, false, "", "ナ")},
+ {0xff86, 0, 0, 0, g(Yes, No, false, false, "", "ニ")},
+ {0xff87, 0, 0, 0, g(Yes, No, false, false, "", "ヌ")},
+ {0xff88, 0, 0, 0, g(Yes, No, false, false, "", "ネ")},
+ {0xff89, 0, 0, 0, g(Yes, No, false, false, "", "ノ")},
+ {0xff8a, 0, 0, 0, g(Yes, No, false, false, "", "ハ")},
+ {0xff8b, 0, 0, 0, g(Yes, No, false, false, "", "ヒ")},
+ {0xff8c, 0, 0, 0, g(Yes, No, false, false, "", "フ")},
+ {0xff8d, 0, 0, 0, g(Yes, No, false, false, "", "ヘ")},
+ {0xff8e, 0, 0, 0, g(Yes, No, false, false, "", "ホ")},
+ {0xff8f, 0, 0, 0, g(Yes, No, false, false, "", "マ")},
+ {0xff90, 0, 0, 0, g(Yes, No, false, false, "", "ミ")},
+ {0xff91, 0, 0, 0, g(Yes, No, false, false, "", "ム")},
+ {0xff92, 0, 0, 0, g(Yes, No, false, false, "", "メ")},
+ {0xff93, 0, 0, 0, g(Yes, No, false, false, "", "モ")},
+ {0xff94, 0, 0, 0, g(Yes, No, false, false, "", "ヤ")},
+ {0xff95, 0, 0, 0, g(Yes, No, false, false, "", "ユ")},
+ {0xff96, 0, 0, 0, g(Yes, No, false, false, "", "ヨ")},
+ {0xff97, 0, 0, 0, g(Yes, No, false, false, "", "ラ")},
+ {0xff98, 0, 0, 0, g(Yes, No, false, false, "", "リ")},
+ {0xff99, 0, 0, 0, g(Yes, No, false, false, "", "ル")},
+ {0xff9a, 0, 0, 0, g(Yes, No, false, false, "", "レ")},
+ {0xff9b, 0, 0, 0, g(Yes, No, false, false, "", "ロ")},
+ {0xff9c, 0, 0, 0, g(Yes, No, false, false, "", "ワ")},
+ {0xff9d, 0, 0, 0, g(Yes, No, false, false, "", "ン")},
+ {0xff9e, 0, 1, 1, g(Yes, No, false, false, "", "゙")},
+ {0xff9f, 0, 1, 1, g(Yes, No, false, false, "", "゚")},
+ {0xffa0, 0, 0, 0, g(Yes, No, false, false, "", "ᅠ")},
+ {0xffa1, 0, 0, 0, g(Yes, No, false, false, "", "ᄀ")},
+ {0xffa2, 0, 0, 0, g(Yes, No, false, false, "", "ᄁ")},
+ {0xffa3, 0, 1, 1, g(Yes, No, false, false, "", "ᆪ")},
+ {0xffa4, 0, 0, 0, g(Yes, No, false, false, "", "ᄂ")},
+ {0xffa5, 0, 1, 1, g(Yes, No, false, false, "", "ᆬ")},
+ {0xffa6, 0, 1, 1, g(Yes, No, false, false, "", "ᆭ")},
+ {0xffa7, 0, 0, 0, g(Yes, No, false, false, "", "ᄃ")},
+ {0xffa8, 0, 0, 0, g(Yes, No, false, false, "", "ᄄ")},
+ {0xffa9, 0, 0, 0, g(Yes, No, false, false, "", "ᄅ")},
+ {0xffaa, 0, 1, 1, g(Yes, No, false, false, "", "ᆰ")},
+ {0xffab, 0, 1, 1, g(Yes, No, false, false, "", "ᆱ")},
+ {0xffac, 0, 1, 1, g(Yes, No, false, false, "", "ᆲ")},
+ {0xffad, 0, 1, 1, g(Yes, No, false, false, "", "ᆳ")},
+ {0xffae, 0, 1, 1, g(Yes, No, false, false, "", "ᆴ")},
+ {0xffaf, 0, 1, 1, g(Yes, No, false, false, "", "ᆵ")},
+ {0xffb0, 0, 0, 0, g(Yes, No, false, false, "", "ᄚ")},
+ {0xffb1, 0, 0, 0, g(Yes, No, false, false, "", "ᄆ")},
+ {0xffb2, 0, 0, 0, g(Yes, No, false, false, "", "ᄇ")},
+ {0xffb3, 0, 0, 0, g(Yes, No, false, false, "", "ᄈ")},
+ {0xffb4, 0, 0, 0, g(Yes, No, false, false, "", "ᄡ")},
+ {0xffb5, 0, 0, 0, g(Yes, No, false, false, "", "ᄉ")},
+ {0xffb6, 0, 0, 0, g(Yes, No, false, false, "", "ᄊ")},
+ {0xffb7, 0, 0, 0, g(Yes, No, false, false, "", "ᄋ")},
+ {0xffb8, 0, 0, 0, g(Yes, No, false, false, "", "ᄌ")},
+ {0xffb9, 0, 0, 0, g(Yes, No, false, false, "", "ᄍ")},
+ {0xffba, 0, 0, 0, g(Yes, No, false, false, "", "ᄎ")},
+ {0xffbb, 0, 0, 0, g(Yes, No, false, false, "", "ᄏ")},
+ {0xffbc, 0, 0, 0, g(Yes, No, false, false, "", "ᄐ")},
+ {0xffbd, 0, 0, 0, g(Yes, No, false, false, "", "ᄑ")},
+ {0xffbe, 0, 0, 0, g(Yes, No, false, false, "", "ᄒ")},
+ {0xffbf, 0, 0, 0, f(Yes, false, "")},
+ {0xffc2, 0, 1, 1, g(Yes, No, false, false, "", "ᅡ")},
+ {0xffc3, 0, 1, 1, g(Yes, No, false, false, "", "ᅢ")},
+ {0xffc4, 0, 1, 1, g(Yes, No, false, false, "", "ᅣ")},
+ {0xffc5, 0, 1, 1, g(Yes, No, false, false, "", "ᅤ")},
+ {0xffc6, 0, 1, 1, g(Yes, No, false, false, "", "ᅥ")},
+ {0xffc7, 0, 1, 1, g(Yes, No, false, false, "", "ᅦ")},
+ {0xffc8, 0, 0, 0, f(Yes, false, "")},
+ {0xffca, 0, 1, 1, g(Yes, No, false, false, "", "ᅧ")},
+ {0xffcb, 0, 1, 1, g(Yes, No, false, false, "", "ᅨ")},
+ {0xffcc, 0, 1, 1, g(Yes, No, false, false, "", "ᅩ")},
+ {0xffcd, 0, 1, 1, g(Yes, No, false, false, "", "ᅪ")},
+ {0xffce, 0, 1, 1, g(Yes, No, false, false, "", "ᅫ")},
+ {0xffcf, 0, 1, 1, g(Yes, No, false, false, "", "ᅬ")},
+ {0xffd0, 0, 0, 0, f(Yes, false, "")},
+ {0xffd2, 0, 1, 1, g(Yes, No, false, false, "", "ᅭ")},
+ {0xffd3, 0, 1, 1, g(Yes, No, false, false, "", "ᅮ")},
+ {0xffd4, 0, 1, 1, g(Yes, No, false, false, "", "ᅯ")},
+ {0xffd5, 0, 1, 1, g(Yes, No, false, false, "", "ᅰ")},
+ {0xffd6, 0, 1, 1, g(Yes, No, false, false, "", "ᅱ")},
+ {0xffd7, 0, 1, 1, g(Yes, No, false, false, "", "ᅲ")},
+ {0xffd8, 0, 0, 0, f(Yes, false, "")},
+ {0xffda, 0, 1, 1, g(Yes, No, false, false, "", "ᅳ")},
+ {0xffdb, 0, 1, 1, g(Yes, No, false, false, "", "ᅴ")},
+ {0xffdc, 0, 1, 1, g(Yes, No, false, false, "", "ᅵ")},
+ {0xffdd, 0, 0, 0, f(Yes, false, "")},
+ {0xffe0, 0, 0, 0, g(Yes, No, false, false, "", "¢")},
+ {0xffe1, 0, 0, 0, g(Yes, No, false, false, "", "£")},
+ {0xffe2, 0, 0, 0, g(Yes, No, false, false, "", "¬")},
+ {0xffe3, 0, 0, 1, g(Yes, No, false, false, "", " ̄")},
+ {0xffe4, 0, 0, 0, g(Yes, No, false, false, "", "¦")},
+ {0xffe5, 0, 0, 0, g(Yes, No, false, false, "", "¥")},
+ {0xffe6, 0, 0, 0, g(Yes, No, false, false, "", "₩")},
+ {0xffe7, 0, 0, 0, f(Yes, false, "")},
+ {0xffe8, 0, 0, 0, g(Yes, No, false, false, "", "│")},
+ {0xffe9, 0, 0, 0, g(Yes, No, false, false, "", "←")},
+ {0xffea, 0, 0, 0, g(Yes, No, false, false, "", "↑")},
+ {0xffeb, 0, 0, 0, g(Yes, No, false, false, "", "→")},
+ {0xffec, 0, 0, 0, g(Yes, No, false, false, "", "↓")},
+ {0xffed, 0, 0, 0, g(Yes, No, false, false, "", "■")},
+ {0xffee, 0, 0, 0, g(Yes, No, false, false, "", "○")},
+ {0xffef, 0, 0, 0, f(Yes, false, "")},
+ {0x101fd, 220, 1, 1, f(Yes, false, "")},
+ {0x101fe, 0, 0, 0, f(Yes, false, "")},
+ {0x102e0, 220, 1, 1, f(Yes, false, "")},
+ {0x102e1, 0, 0, 0, f(Yes, false, "")},
+ {0x10376, 230, 1, 1, f(Yes, false, "")},
+ {0x1037b, 0, 0, 0, f(Yes, false, "")},
+ {0x10a0d, 220, 1, 1, f(Yes, false, "")},
+ {0x10a0e, 0, 0, 0, f(Yes, false, "")},
+ {0x10a0f, 230, 1, 1, f(Yes, false, "")},
+ {0x10a10, 0, 0, 0, f(Yes, false, "")},
+ {0x10a38, 230, 1, 1, f(Yes, false, "")},
+ {0x10a39, 1, 1, 1, f(Yes, false, "")},
+ {0x10a3a, 220, 1, 1, f(Yes, false, "")},
+ {0x10a3b, 0, 0, 0, f(Yes, false, "")},
+ {0x10a3f, 9, 1, 1, f(Yes, false, "")},
+ {0x10a40, 0, 0, 0, f(Yes, false, "")},
+ {0x10ae5, 230, 1, 1, f(Yes, false, "")},
+ {0x10ae6, 220, 1, 1, f(Yes, false, "")},
+ {0x10ae7, 0, 0, 0, f(Yes, false, "")},
+ {0x11046, 9, 1, 1, f(Yes, false, "")},
+ {0x11047, 0, 0, 0, f(Yes, false, "")},
+ {0x1107f, 9, 1, 1, f(Yes, false, "")},
+ {0x11080, 0, 0, 0, f(Yes, false, "")},
+ {0x11099, 0, 0, 0, f(Yes, true, "")},
+ {0x1109a, 0, 0, 1, f(Yes, false, "𑂚")},
+ {0x1109b, 0, 0, 0, f(Yes, true, "")},
+ {0x1109c, 0, 0, 1, f(Yes, false, "𑂜")},
+ {0x1109d, 0, 0, 0, f(Yes, false, "")},
+ {0x110a5, 0, 0, 0, f(Yes, true, "")},
+ {0x110a6, 0, 0, 0, f(Yes, false, "")},
+ {0x110ab, 0, 0, 1, f(Yes, false, "𑂫")},
+ {0x110ac, 0, 0, 0, f(Yes, false, "")},
+ {0x110b9, 9, 1, 1, f(Yes, false, "")},
+ {0x110ba, 7, 1, 1, f(Maybe, false, "")},
+ {0x110bb, 0, 0, 0, f(Yes, false, "")},
+ {0x11100, 230, 1, 1, f(Yes, false, "")},
+ {0x11103, 0, 0, 0, f(Yes, false, "")},
+ {0x11127, 0, 1, 1, f(Maybe, false, "")},
+ {0x11128, 0, 0, 0, f(Yes, false, "")},
+ {0x1112e, 0, 0, 1, f(Yes, false, "𑄮")},
+ {0x1112f, 0, 0, 1, f(Yes, false, "𑄯")},
+ {0x11130, 0, 0, 0, f(Yes, false, "")},
+ {0x11131, 0, 0, 0, f(Yes, true, "")},
+ {0x11133, 9, 1, 1, f(Yes, false, "")},
+ {0x11135, 0, 0, 0, f(Yes, false, "")},
+ {0x11173, 7, 1, 1, f(Yes, false, "")},
+ {0x11174, 0, 0, 0, f(Yes, false, "")},
+ {0x111c0, 9, 1, 1, f(Yes, false, "")},
+ {0x111c1, 0, 0, 0, f(Yes, false, "")},
+ {0x111ca, 7, 1, 1, f(Yes, false, "")},
+ {0x111cb, 0, 0, 0, f(Yes, false, "")},
+ {0x11235, 9, 1, 1, f(Yes, false, "")},
+ {0x11236, 7, 1, 1, f(Yes, false, "")},
+ {0x11237, 0, 0, 0, f(Yes, false, "")},
+ {0x112e9, 7, 1, 1, f(Yes, false, "")},
+ {0x112ea, 9, 1, 1, f(Yes, false, "")},
+ {0x112eb, 0, 0, 0, f(Yes, false, "")},
+ {0x1133c, 7, 1, 1, f(Yes, false, "")},
+ {0x1133d, 0, 0, 0, f(Yes, false, "")},
+ {0x1133e, 0, 1, 1, f(Maybe, false, "")},
+ {0x1133f, 0, 0, 0, f(Yes, false, "")},
+ {0x11347, 0, 0, 0, f(Yes, true, "")},
+ {0x11348, 0, 0, 0, f(Yes, false, "")},
+ {0x1134b, 0, 0, 1, f(Yes, false, "𑍋")},
+ {0x1134c, 0, 0, 1, f(Yes, false, "𑍌")},
+ {0x1134d, 9, 1, 1, f(Yes, false, "")},
+ {0x1134e, 0, 0, 0, f(Yes, false, "")},
+ {0x11357, 0, 1, 1, f(Maybe, false, "")},
+ {0x11358, 0, 0, 0, f(Yes, false, "")},
+ {0x11366, 230, 1, 1, f(Yes, false, "")},
+ {0x1136d, 0, 0, 0, f(Yes, false, "")},
+ {0x11370, 230, 1, 1, f(Yes, false, "")},
+ {0x11375, 0, 0, 0, f(Yes, false, "")},
+ {0x11442, 9, 1, 1, f(Yes, false, "")},
+ {0x11443, 0, 0, 0, f(Yes, false, "")},
+ {0x11446, 7, 1, 1, f(Yes, false, "")},
+ {0x11447, 0, 0, 0, f(Yes, false, "")},
+ {0x114b0, 0, 1, 1, f(Maybe, false, "")},
+ {0x114b1, 0, 0, 0, f(Yes, false, "")},
+ {0x114b9, 0, 0, 0, f(Yes, true, "")},
+ {0x114ba, 0, 1, 1, f(Maybe, false, "")},
+ {0x114bb, 0, 0, 1, f(Yes, false, "𑒻")},
+ {0x114bc, 0, 0, 1, f(Yes, false, "𑒼")},
+ {0x114bd, 0, 1, 1, f(Maybe, false, "")},
+ {0x114be, 0, 0, 1, f(Yes, false, "𑒾")},
+ {0x114bf, 0, 0, 0, f(Yes, false, "")},
+ {0x114c2, 9, 1, 1, f(Yes, false, "")},
+ {0x114c3, 7, 1, 1, f(Yes, false, "")},
+ {0x114c4, 0, 0, 0, f(Yes, false, "")},
+ {0x115af, 0, 1, 1, f(Maybe, false, "")},
+ {0x115b0, 0, 0, 0, f(Yes, false, "")},
+ {0x115b8, 0, 0, 0, f(Yes, true, "")},
+ {0x115ba, 0, 0, 1, f(Yes, false, "𑖺")},
+ {0x115bb, 0, 0, 1, f(Yes, false, "𑖻")},
+ {0x115bc, 0, 0, 0, f(Yes, false, "")},
+ {0x115bf, 9, 1, 1, f(Yes, false, "")},
+ {0x115c0, 7, 1, 1, f(Yes, false, "")},
+ {0x115c1, 0, 0, 0, f(Yes, false, "")},
+ {0x1163f, 9, 1, 1, f(Yes, false, "")},
+ {0x11640, 0, 0, 0, f(Yes, false, "")},
+ {0x116b6, 9, 1, 1, f(Yes, false, "")},
+ {0x116b7, 7, 1, 1, f(Yes, false, "")},
+ {0x116b8, 0, 0, 0, f(Yes, false, "")},
+ {0x1172b, 9, 1, 1, f(Yes, false, "")},
+ {0x1172c, 0, 0, 0, f(Yes, false, "")},
+ {0x11a34, 9, 1, 1, f(Yes, false, "")},
+ {0x11a35, 0, 0, 0, f(Yes, false, "")},
+ {0x11a47, 9, 1, 1, f(Yes, false, "")},
+ {0x11a48, 0, 0, 0, f(Yes, false, "")},
+ {0x11a99, 9, 1, 1, f(Yes, false, "")},
+ {0x11a9a, 0, 0, 0, f(Yes, false, "")},
+ {0x11c3f, 9, 1, 1, f(Yes, false, "")},
+ {0x11c40, 0, 0, 0, f(Yes, false, "")},
+ {0x11d42, 7, 1, 1, f(Yes, false, "")},
+ {0x11d43, 0, 0, 0, f(Yes, false, "")},
+ {0x11d44, 9, 1, 1, f(Yes, false, "")},
+ {0x11d46, 0, 0, 0, f(Yes, false, "")},
+ {0x16af0, 1, 1, 1, f(Yes, false, "")},
+ {0x16af5, 0, 0, 0, f(Yes, false, "")},
+ {0x16b30, 230, 1, 1, f(Yes, false, "")},
+ {0x16b37, 0, 0, 0, f(Yes, false, "")},
+ {0x1bc9e, 1, 1, 1, f(Yes, false, "")},
+ {0x1bc9f, 0, 0, 0, f(Yes, false, "")},
+ {0x1d15e, 0, 0, 1, f(No, false, "𝅗𝅥")},
+ {0x1d15f, 0, 0, 1, f(No, false, "𝅘𝅥")},
+ {0x1d160, 0, 0, 2, f(No, false, "𝅘𝅥𝅮")},
+ {0x1d161, 0, 0, 2, f(No, false, "𝅘𝅥𝅯")},
+ {0x1d162, 0, 0, 2, f(No, false, "𝅘𝅥𝅰")},
+ {0x1d163, 0, 0, 2, f(No, false, "𝅘𝅥𝅱")},
+ {0x1d164, 0, 0, 2, f(No, false, "𝅘𝅥𝅲")},
+ {0x1d165, 216, 1, 1, f(Yes, false, "")},
+ {0x1d167, 1, 1, 1, f(Yes, false, "")},
+ {0x1d16a, 0, 0, 0, f(Yes, false, "")},
+ {0x1d16d, 226, 1, 1, f(Yes, false, "")},
+ {0x1d16e, 216, 1, 1, f(Yes, false, "")},
+ {0x1d173, 0, 0, 0, f(Yes, false, "")},
+ {0x1d17b, 220, 1, 1, f(Yes, false, "")},
+ {0x1d183, 0, 0, 0, f(Yes, false, "")},
+ {0x1d185, 230, 1, 1, f(Yes, false, "")},
+ {0x1d18a, 220, 1, 1, f(Yes, false, "")},
+ {0x1d18c, 0, 0, 0, f(Yes, false, "")},
+ {0x1d1aa, 230, 1, 1, f(Yes, false, "")},
+ {0x1d1ae, 0, 0, 0, f(Yes, false, "")},
+ {0x1d1bb, 0, 0, 1, f(No, false, "𝆹𝅥")},
+ {0x1d1bc, 0, 0, 1, f(No, false, "𝆺𝅥")},
+ {0x1d1bd, 0, 0, 2, f(No, false, "𝆹𝅥𝅮")},
+ {0x1d1be, 0, 0, 2, f(No, false, "𝆺𝅥𝅮")},
+ {0x1d1bf, 0, 0, 2, f(No, false, "𝆹𝅥𝅯")},
+ {0x1d1c0, 0, 0, 2, f(No, false, "𝆺𝅥𝅯")},
+ {0x1d1c1, 0, 0, 0, f(Yes, false, "")},
+ {0x1d242, 230, 1, 1, f(Yes, false, "")},
+ {0x1d245, 0, 0, 0, f(Yes, false, "")},
+ {0x1d400, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d401, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d402, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1d403, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d404, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d405, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d406, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d407, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1d408, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d409, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d40a, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d40b, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d40c, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d40d, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d40e, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d40f, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d410, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d411, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1d412, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d413, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d414, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d415, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d416, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d417, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d418, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d419, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1d41a, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d41b, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d41c, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d41d, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d41e, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d41f, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d420, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d421, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d422, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d423, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d424, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d425, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d426, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d427, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d428, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d429, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d42a, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d42b, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d42c, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d42d, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d42e, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d42f, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d430, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d431, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d432, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d433, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d434, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d435, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d436, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1d437, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d438, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d439, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d43a, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d43b, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1d43c, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d43d, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d43e, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d43f, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d440, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d441, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d442, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d443, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d444, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d445, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1d446, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d447, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d448, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d449, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d44a, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d44b, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d44c, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d44d, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1d44e, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d44f, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d450, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d451, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d452, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d453, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d454, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d455, 0, 0, 0, f(Yes, false, "")},
+ {0x1d456, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d457, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d458, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d459, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d45a, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d45b, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d45c, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d45d, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d45e, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d45f, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d460, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d461, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d462, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d463, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d464, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d465, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d466, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d467, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d468, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d469, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d46a, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1d46b, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d46c, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d46d, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d46e, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d46f, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1d470, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d471, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d472, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d473, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d474, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d475, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d476, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d477, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d478, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d479, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1d47a, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d47b, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d47c, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d47d, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d47e, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d47f, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d480, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d481, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1d482, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d483, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d484, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d485, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d486, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d487, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d488, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d489, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d48a, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d48b, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d48c, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d48d, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d48e, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d48f, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d490, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d491, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d492, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d493, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d494, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d495, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d496, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d497, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d498, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d499, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d49a, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d49b, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d49c, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d49d, 0, 0, 0, f(Yes, false, "")},
+ {0x1d49e, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1d49f, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d4a0, 0, 0, 0, f(Yes, false, "")},
+ {0x1d4a2, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d4a3, 0, 0, 0, f(Yes, false, "")},
+ {0x1d4a5, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d4a6, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d4a7, 0, 0, 0, f(Yes, false, "")},
+ {0x1d4a9, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d4aa, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d4ab, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d4ac, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d4ad, 0, 0, 0, f(Yes, false, "")},
+ {0x1d4ae, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d4af, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d4b0, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d4b1, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d4b2, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d4b3, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d4b4, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d4b5, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1d4b6, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d4b7, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d4b8, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d4b9, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d4ba, 0, 0, 0, f(Yes, false, "")},
+ {0x1d4bb, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d4bc, 0, 0, 0, f(Yes, false, "")},
+ {0x1d4bd, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d4be, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d4bf, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d4c0, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d4c1, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d4c2, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d4c3, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d4c4, 0, 0, 0, f(Yes, false, "")},
+ {0x1d4c5, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d4c6, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d4c7, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d4c8, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d4c9, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d4ca, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d4cb, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d4cc, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d4cd, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d4ce, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d4cf, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d4d0, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d4d1, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d4d2, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1d4d3, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d4d4, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d4d5, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d4d6, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d4d7, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1d4d8, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d4d9, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d4da, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d4db, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d4dc, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d4dd, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d4de, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d4df, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d4e0, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d4e1, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1d4e2, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d4e3, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d4e4, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d4e5, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d4e6, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d4e7, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d4e8, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d4e9, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1d4ea, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d4eb, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d4ec, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d4ed, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d4ee, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d4ef, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d4f0, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d4f1, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d4f2, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d4f3, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d4f4, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d4f5, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d4f6, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d4f7, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d4f8, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d4f9, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d4fa, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d4fb, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d4fc, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d4fd, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d4fe, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d4ff, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d500, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d501, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d502, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d503, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d504, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d505, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d506, 0, 0, 0, f(Yes, false, "")},
+ {0x1d507, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d508, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d509, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d50a, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d50b, 0, 0, 0, f(Yes, false, "")},
+ {0x1d50d, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d50e, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d50f, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d510, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d511, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d512, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d513, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d514, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d515, 0, 0, 0, f(Yes, false, "")},
+ {0x1d516, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d517, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d518, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d519, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d51a, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d51b, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d51c, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d51d, 0, 0, 0, f(Yes, false, "")},
+ {0x1d51e, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d51f, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d520, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d521, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d522, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d523, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d524, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d525, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d526, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d527, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d528, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d529, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d52a, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d52b, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d52c, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d52d, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d52e, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d52f, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d530, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d531, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d532, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d533, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d534, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d535, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d536, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d537, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d538, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d539, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d53a, 0, 0, 0, f(Yes, false, "")},
+ {0x1d53b, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d53c, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d53d, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d53e, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d53f, 0, 0, 0, f(Yes, false, "")},
+ {0x1d540, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d541, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d542, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d543, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d544, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d545, 0, 0, 0, f(Yes, false, "")},
+ {0x1d546, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d547, 0, 0, 0, f(Yes, false, "")},
+ {0x1d54a, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d54b, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d54c, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d54d, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d54e, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d54f, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d550, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d551, 0, 0, 0, f(Yes, false, "")},
+ {0x1d552, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d553, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d554, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d555, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d556, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d557, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d558, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d559, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d55a, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d55b, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d55c, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d55d, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d55e, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d55f, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d560, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d561, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d562, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d563, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d564, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d565, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d566, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d567, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d568, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d569, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d56a, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d56b, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d56c, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d56d, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d56e, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1d56f, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d570, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d571, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d572, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d573, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1d574, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d575, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d576, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d577, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d578, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d579, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d57a, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d57b, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d57c, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d57d, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1d57e, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d57f, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d580, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d581, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d582, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d583, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d584, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d585, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1d586, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d587, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d588, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d589, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d58a, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d58b, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d58c, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d58d, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d58e, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d58f, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d590, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d591, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d592, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d593, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d594, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d595, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d596, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d597, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d598, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d599, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d59a, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d59b, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d59c, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d59d, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d59e, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d59f, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d5a0, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d5a1, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d5a2, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1d5a3, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d5a4, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d5a5, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d5a6, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d5a7, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1d5a8, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d5a9, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d5aa, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d5ab, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d5ac, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d5ad, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d5ae, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d5af, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d5b0, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d5b1, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1d5b2, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d5b3, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d5b4, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d5b5, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d5b6, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d5b7, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d5b8, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d5b9, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1d5ba, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d5bb, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d5bc, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d5bd, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d5be, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d5bf, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d5c0, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d5c1, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d5c2, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d5c3, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d5c4, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d5c5, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d5c6, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d5c7, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d5c8, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d5c9, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d5ca, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d5cb, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d5cc, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d5cd, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d5ce, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d5cf, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d5d0, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d5d1, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d5d2, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d5d3, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d5d4, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d5d5, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d5d6, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1d5d7, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d5d8, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d5d9, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d5da, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d5db, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1d5dc, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d5dd, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d5de, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d5df, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d5e0, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d5e1, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d5e2, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d5e3, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d5e4, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d5e5, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1d5e6, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d5e7, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d5e8, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d5e9, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d5ea, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d5eb, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d5ec, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d5ed, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1d5ee, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d5ef, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d5f0, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d5f1, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d5f2, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d5f3, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d5f4, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d5f5, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d5f6, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d5f7, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d5f8, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d5f9, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d5fa, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d5fb, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d5fc, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d5fd, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d5fe, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d5ff, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d600, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d601, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d602, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d603, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d604, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d605, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d606, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d607, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d608, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d609, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d60a, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1d60b, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d60c, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d60d, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d60e, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d60f, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1d610, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d611, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d612, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d613, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d614, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d615, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d616, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d617, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d618, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d619, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1d61a, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d61b, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d61c, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d61d, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d61e, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d61f, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d620, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d621, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1d622, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d623, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d624, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d625, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d626, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d627, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d628, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d629, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d62a, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d62b, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d62c, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d62d, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d62e, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d62f, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d630, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d631, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d632, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d633, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d634, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d635, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d636, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d637, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d638, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d639, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d63a, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d63b, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d63c, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d63d, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d63e, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1d63f, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d640, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d641, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d642, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d643, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1d644, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d645, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d646, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d647, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d648, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d649, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d64a, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d64b, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d64c, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d64d, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1d64e, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d64f, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d650, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d651, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d652, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d653, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d654, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d655, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1d656, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d657, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d658, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d659, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d65a, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d65b, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d65c, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d65d, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d65e, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d65f, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d660, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d661, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d662, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d663, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d664, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d665, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d666, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d667, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d668, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d669, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d66a, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d66b, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d66c, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d66d, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d66e, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d66f, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d670, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d671, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d672, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1d673, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d674, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d675, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d676, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d677, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1d678, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d679, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d67a, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d67b, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d67c, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d67d, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d67e, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d67f, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d680, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d681, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1d682, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d683, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d684, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d685, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d686, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d687, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d688, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d689, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1d68a, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d68b, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d68c, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d68d, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d68e, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d68f, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d690, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d691, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d692, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d693, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d694, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d695, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d696, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d697, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d698, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d699, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d69a, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d69b, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d69c, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d69d, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d69e, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d69f, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d6a0, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d6a1, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d6a2, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d6a3, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d6a4, 0, 0, 0, g(Yes, No, false, false, "", "ı")},
+ {0x1d6a5, 0, 0, 0, g(Yes, No, false, false, "", "ȷ")},
+ {0x1d6a6, 0, 0, 0, f(Yes, false, "")},
+ {0x1d6a8, 0, 0, 0, g(Yes, No, false, false, "", "Α")},
+ {0x1d6a9, 0, 0, 0, g(Yes, No, false, false, "", "Β")},
+ {0x1d6aa, 0, 0, 0, g(Yes, No, false, false, "", "Γ")},
+ {0x1d6ab, 0, 0, 0, g(Yes, No, false, false, "", "Δ")},
+ {0x1d6ac, 0, 0, 0, g(Yes, No, false, false, "", "Ε")},
+ {0x1d6ad, 0, 0, 0, g(Yes, No, false, false, "", "Ζ")},
+ {0x1d6ae, 0, 0, 0, g(Yes, No, false, false, "", "Η")},
+ {0x1d6af, 0, 0, 0, g(Yes, No, false, false, "", "Θ")},
+ {0x1d6b0, 0, 0, 0, g(Yes, No, false, false, "", "Ι")},
+ {0x1d6b1, 0, 0, 0, g(Yes, No, false, false, "", "Κ")},
+ {0x1d6b2, 0, 0, 0, g(Yes, No, false, false, "", "Λ")},
+ {0x1d6b3, 0, 0, 0, g(Yes, No, false, false, "", "Μ")},
+ {0x1d6b4, 0, 0, 0, g(Yes, No, false, false, "", "Ν")},
+ {0x1d6b5, 0, 0, 0, g(Yes, No, false, false, "", "Ξ")},
+ {0x1d6b6, 0, 0, 0, g(Yes, No, false, false, "", "Ο")},
+ {0x1d6b7, 0, 0, 0, g(Yes, No, false, false, "", "Π")},
+ {0x1d6b8, 0, 0, 0, g(Yes, No, false, false, "", "Ρ")},
+ {0x1d6b9, 0, 0, 0, g(Yes, No, false, false, "", "Θ")},
+ {0x1d6ba, 0, 0, 0, g(Yes, No, false, false, "", "Σ")},
+ {0x1d6bb, 0, 0, 0, g(Yes, No, false, false, "", "Τ")},
+ {0x1d6bc, 0, 0, 0, g(Yes, No, false, false, "", "Υ")},
+ {0x1d6bd, 0, 0, 0, g(Yes, No, false, false, "", "Φ")},
+ {0x1d6be, 0, 0, 0, g(Yes, No, false, false, "", "Χ")},
+ {0x1d6bf, 0, 0, 0, g(Yes, No, false, false, "", "Ψ")},
+ {0x1d6c0, 0, 0, 0, g(Yes, No, false, false, "", "Ω")},
+ {0x1d6c1, 0, 0, 0, g(Yes, No, false, false, "", "∇")},
+ {0x1d6c2, 0, 0, 0, g(Yes, No, false, false, "", "α")},
+ {0x1d6c3, 0, 0, 0, g(Yes, No, false, false, "", "β")},
+ {0x1d6c4, 0, 0, 0, g(Yes, No, false, false, "", "γ")},
+ {0x1d6c5, 0, 0, 0, g(Yes, No, false, false, "", "δ")},
+ {0x1d6c6, 0, 0, 0, g(Yes, No, false, false, "", "ε")},
+ {0x1d6c7, 0, 0, 0, g(Yes, No, false, false, "", "ζ")},
+ {0x1d6c8, 0, 0, 0, g(Yes, No, false, false, "", "η")},
+ {0x1d6c9, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x1d6ca, 0, 0, 0, g(Yes, No, false, false, "", "ι")},
+ {0x1d6cb, 0, 0, 0, g(Yes, No, false, false, "", "κ")},
+ {0x1d6cc, 0, 0, 0, g(Yes, No, false, false, "", "λ")},
+ {0x1d6cd, 0, 0, 0, g(Yes, No, false, false, "", "μ")},
+ {0x1d6ce, 0, 0, 0, g(Yes, No, false, false, "", "ν")},
+ {0x1d6cf, 0, 0, 0, g(Yes, No, false, false, "", "ξ")},
+ {0x1d6d0, 0, 0, 0, g(Yes, No, false, false, "", "ο")},
+ {0x1d6d1, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x1d6d2, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x1d6d3, 0, 0, 0, g(Yes, No, false, false, "", "ς")},
+ {0x1d6d4, 0, 0, 0, g(Yes, No, false, false, "", "σ")},
+ {0x1d6d5, 0, 0, 0, g(Yes, No, false, false, "", "τ")},
+ {0x1d6d6, 0, 0, 0, g(Yes, No, false, false, "", "υ")},
+ {0x1d6d7, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d6d8, 0, 0, 0, g(Yes, No, false, false, "", "χ")},
+ {0x1d6d9, 0, 0, 0, g(Yes, No, false, false, "", "ψ")},
+ {0x1d6da, 0, 0, 0, g(Yes, No, false, false, "", "ω")},
+ {0x1d6db, 0, 0, 0, g(Yes, No, false, false, "", "∂")},
+ {0x1d6dc, 0, 0, 0, g(Yes, No, false, false, "", "ε")},
+ {0x1d6dd, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x1d6de, 0, 0, 0, g(Yes, No, false, false, "", "κ")},
+ {0x1d6df, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d6e0, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x1d6e1, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x1d6e2, 0, 0, 0, g(Yes, No, false, false, "", "Α")},
+ {0x1d6e3, 0, 0, 0, g(Yes, No, false, false, "", "Β")},
+ {0x1d6e4, 0, 0, 0, g(Yes, No, false, false, "", "Γ")},
+ {0x1d6e5, 0, 0, 0, g(Yes, No, false, false, "", "Δ")},
+ {0x1d6e6, 0, 0, 0, g(Yes, No, false, false, "", "Ε")},
+ {0x1d6e7, 0, 0, 0, g(Yes, No, false, false, "", "Ζ")},
+ {0x1d6e8, 0, 0, 0, g(Yes, No, false, false, "", "Η")},
+ {0x1d6e9, 0, 0, 0, g(Yes, No, false, false, "", "Θ")},
+ {0x1d6ea, 0, 0, 0, g(Yes, No, false, false, "", "Ι")},
+ {0x1d6eb, 0, 0, 0, g(Yes, No, false, false, "", "Κ")},
+ {0x1d6ec, 0, 0, 0, g(Yes, No, false, false, "", "Λ")},
+ {0x1d6ed, 0, 0, 0, g(Yes, No, false, false, "", "Μ")},
+ {0x1d6ee, 0, 0, 0, g(Yes, No, false, false, "", "Ν")},
+ {0x1d6ef, 0, 0, 0, g(Yes, No, false, false, "", "Ξ")},
+ {0x1d6f0, 0, 0, 0, g(Yes, No, false, false, "", "Ο")},
+ {0x1d6f1, 0, 0, 0, g(Yes, No, false, false, "", "Π")},
+ {0x1d6f2, 0, 0, 0, g(Yes, No, false, false, "", "Ρ")},
+ {0x1d6f3, 0, 0, 0, g(Yes, No, false, false, "", "Θ")},
+ {0x1d6f4, 0, 0, 0, g(Yes, No, false, false, "", "Σ")},
+ {0x1d6f5, 0, 0, 0, g(Yes, No, false, false, "", "Τ")},
+ {0x1d6f6, 0, 0, 0, g(Yes, No, false, false, "", "Υ")},
+ {0x1d6f7, 0, 0, 0, g(Yes, No, false, false, "", "Φ")},
+ {0x1d6f8, 0, 0, 0, g(Yes, No, false, false, "", "Χ")},
+ {0x1d6f9, 0, 0, 0, g(Yes, No, false, false, "", "Ψ")},
+ {0x1d6fa, 0, 0, 0, g(Yes, No, false, false, "", "Ω")},
+ {0x1d6fb, 0, 0, 0, g(Yes, No, false, false, "", "∇")},
+ {0x1d6fc, 0, 0, 0, g(Yes, No, false, false, "", "α")},
+ {0x1d6fd, 0, 0, 0, g(Yes, No, false, false, "", "β")},
+ {0x1d6fe, 0, 0, 0, g(Yes, No, false, false, "", "γ")},
+ {0x1d6ff, 0, 0, 0, g(Yes, No, false, false, "", "δ")},
+ {0x1d700, 0, 0, 0, g(Yes, No, false, false, "", "ε")},
+ {0x1d701, 0, 0, 0, g(Yes, No, false, false, "", "ζ")},
+ {0x1d702, 0, 0, 0, g(Yes, No, false, false, "", "η")},
+ {0x1d703, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x1d704, 0, 0, 0, g(Yes, No, false, false, "", "ι")},
+ {0x1d705, 0, 0, 0, g(Yes, No, false, false, "", "κ")},
+ {0x1d706, 0, 0, 0, g(Yes, No, false, false, "", "λ")},
+ {0x1d707, 0, 0, 0, g(Yes, No, false, false, "", "μ")},
+ {0x1d708, 0, 0, 0, g(Yes, No, false, false, "", "ν")},
+ {0x1d709, 0, 0, 0, g(Yes, No, false, false, "", "ξ")},
+ {0x1d70a, 0, 0, 0, g(Yes, No, false, false, "", "ο")},
+ {0x1d70b, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x1d70c, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x1d70d, 0, 0, 0, g(Yes, No, false, false, "", "ς")},
+ {0x1d70e, 0, 0, 0, g(Yes, No, false, false, "", "σ")},
+ {0x1d70f, 0, 0, 0, g(Yes, No, false, false, "", "τ")},
+ {0x1d710, 0, 0, 0, g(Yes, No, false, false, "", "υ")},
+ {0x1d711, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d712, 0, 0, 0, g(Yes, No, false, false, "", "χ")},
+ {0x1d713, 0, 0, 0, g(Yes, No, false, false, "", "ψ")},
+ {0x1d714, 0, 0, 0, g(Yes, No, false, false, "", "ω")},
+ {0x1d715, 0, 0, 0, g(Yes, No, false, false, "", "∂")},
+ {0x1d716, 0, 0, 0, g(Yes, No, false, false, "", "ε")},
+ {0x1d717, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x1d718, 0, 0, 0, g(Yes, No, false, false, "", "κ")},
+ {0x1d719, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d71a, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x1d71b, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x1d71c, 0, 0, 0, g(Yes, No, false, false, "", "Α")},
+ {0x1d71d, 0, 0, 0, g(Yes, No, false, false, "", "Β")},
+ {0x1d71e, 0, 0, 0, g(Yes, No, false, false, "", "Γ")},
+ {0x1d71f, 0, 0, 0, g(Yes, No, false, false, "", "Δ")},
+ {0x1d720, 0, 0, 0, g(Yes, No, false, false, "", "Ε")},
+ {0x1d721, 0, 0, 0, g(Yes, No, false, false, "", "Ζ")},
+ {0x1d722, 0, 0, 0, g(Yes, No, false, false, "", "Η")},
+ {0x1d723, 0, 0, 0, g(Yes, No, false, false, "", "Θ")},
+ {0x1d724, 0, 0, 0, g(Yes, No, false, false, "", "Ι")},
+ {0x1d725, 0, 0, 0, g(Yes, No, false, false, "", "Κ")},
+ {0x1d726, 0, 0, 0, g(Yes, No, false, false, "", "Λ")},
+ {0x1d727, 0, 0, 0, g(Yes, No, false, false, "", "Μ")},
+ {0x1d728, 0, 0, 0, g(Yes, No, false, false, "", "Ν")},
+ {0x1d729, 0, 0, 0, g(Yes, No, false, false, "", "Ξ")},
+ {0x1d72a, 0, 0, 0, g(Yes, No, false, false, "", "Ο")},
+ {0x1d72b, 0, 0, 0, g(Yes, No, false, false, "", "Π")},
+ {0x1d72c, 0, 0, 0, g(Yes, No, false, false, "", "Ρ")},
+ {0x1d72d, 0, 0, 0, g(Yes, No, false, false, "", "Θ")},
+ {0x1d72e, 0, 0, 0, g(Yes, No, false, false, "", "Σ")},
+ {0x1d72f, 0, 0, 0, g(Yes, No, false, false, "", "Τ")},
+ {0x1d730, 0, 0, 0, g(Yes, No, false, false, "", "Υ")},
+ {0x1d731, 0, 0, 0, g(Yes, No, false, false, "", "Φ")},
+ {0x1d732, 0, 0, 0, g(Yes, No, false, false, "", "Χ")},
+ {0x1d733, 0, 0, 0, g(Yes, No, false, false, "", "Ψ")},
+ {0x1d734, 0, 0, 0, g(Yes, No, false, false, "", "Ω")},
+ {0x1d735, 0, 0, 0, g(Yes, No, false, false, "", "∇")},
+ {0x1d736, 0, 0, 0, g(Yes, No, false, false, "", "α")},
+ {0x1d737, 0, 0, 0, g(Yes, No, false, false, "", "β")},
+ {0x1d738, 0, 0, 0, g(Yes, No, false, false, "", "γ")},
+ {0x1d739, 0, 0, 0, g(Yes, No, false, false, "", "δ")},
+ {0x1d73a, 0, 0, 0, g(Yes, No, false, false, "", "ε")},
+ {0x1d73b, 0, 0, 0, g(Yes, No, false, false, "", "ζ")},
+ {0x1d73c, 0, 0, 0, g(Yes, No, false, false, "", "η")},
+ {0x1d73d, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x1d73e, 0, 0, 0, g(Yes, No, false, false, "", "ι")},
+ {0x1d73f, 0, 0, 0, g(Yes, No, false, false, "", "κ")},
+ {0x1d740, 0, 0, 0, g(Yes, No, false, false, "", "λ")},
+ {0x1d741, 0, 0, 0, g(Yes, No, false, false, "", "μ")},
+ {0x1d742, 0, 0, 0, g(Yes, No, false, false, "", "ν")},
+ {0x1d743, 0, 0, 0, g(Yes, No, false, false, "", "ξ")},
+ {0x1d744, 0, 0, 0, g(Yes, No, false, false, "", "ο")},
+ {0x1d745, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x1d746, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x1d747, 0, 0, 0, g(Yes, No, false, false, "", "ς")},
+ {0x1d748, 0, 0, 0, g(Yes, No, false, false, "", "σ")},
+ {0x1d749, 0, 0, 0, g(Yes, No, false, false, "", "τ")},
+ {0x1d74a, 0, 0, 0, g(Yes, No, false, false, "", "υ")},
+ {0x1d74b, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d74c, 0, 0, 0, g(Yes, No, false, false, "", "χ")},
+ {0x1d74d, 0, 0, 0, g(Yes, No, false, false, "", "ψ")},
+ {0x1d74e, 0, 0, 0, g(Yes, No, false, false, "", "ω")},
+ {0x1d74f, 0, 0, 0, g(Yes, No, false, false, "", "∂")},
+ {0x1d750, 0, 0, 0, g(Yes, No, false, false, "", "ε")},
+ {0x1d751, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x1d752, 0, 0, 0, g(Yes, No, false, false, "", "κ")},
+ {0x1d753, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d754, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x1d755, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x1d756, 0, 0, 0, g(Yes, No, false, false, "", "Α")},
+ {0x1d757, 0, 0, 0, g(Yes, No, false, false, "", "Β")},
+ {0x1d758, 0, 0, 0, g(Yes, No, false, false, "", "Γ")},
+ {0x1d759, 0, 0, 0, g(Yes, No, false, false, "", "Δ")},
+ {0x1d75a, 0, 0, 0, g(Yes, No, false, false, "", "Ε")},
+ {0x1d75b, 0, 0, 0, g(Yes, No, false, false, "", "Ζ")},
+ {0x1d75c, 0, 0, 0, g(Yes, No, false, false, "", "Η")},
+ {0x1d75d, 0, 0, 0, g(Yes, No, false, false, "", "Θ")},
+ {0x1d75e, 0, 0, 0, g(Yes, No, false, false, "", "Ι")},
+ {0x1d75f, 0, 0, 0, g(Yes, No, false, false, "", "Κ")},
+ {0x1d760, 0, 0, 0, g(Yes, No, false, false, "", "Λ")},
+ {0x1d761, 0, 0, 0, g(Yes, No, false, false, "", "Μ")},
+ {0x1d762, 0, 0, 0, g(Yes, No, false, false, "", "Ν")},
+ {0x1d763, 0, 0, 0, g(Yes, No, false, false, "", "Ξ")},
+ {0x1d764, 0, 0, 0, g(Yes, No, false, false, "", "Ο")},
+ {0x1d765, 0, 0, 0, g(Yes, No, false, false, "", "Π")},
+ {0x1d766, 0, 0, 0, g(Yes, No, false, false, "", "Ρ")},
+ {0x1d767, 0, 0, 0, g(Yes, No, false, false, "", "Θ")},
+ {0x1d768, 0, 0, 0, g(Yes, No, false, false, "", "Σ")},
+ {0x1d769, 0, 0, 0, g(Yes, No, false, false, "", "Τ")},
+ {0x1d76a, 0, 0, 0, g(Yes, No, false, false, "", "Υ")},
+ {0x1d76b, 0, 0, 0, g(Yes, No, false, false, "", "Φ")},
+ {0x1d76c, 0, 0, 0, g(Yes, No, false, false, "", "Χ")},
+ {0x1d76d, 0, 0, 0, g(Yes, No, false, false, "", "Ψ")},
+ {0x1d76e, 0, 0, 0, g(Yes, No, false, false, "", "Ω")},
+ {0x1d76f, 0, 0, 0, g(Yes, No, false, false, "", "∇")},
+ {0x1d770, 0, 0, 0, g(Yes, No, false, false, "", "α")},
+ {0x1d771, 0, 0, 0, g(Yes, No, false, false, "", "β")},
+ {0x1d772, 0, 0, 0, g(Yes, No, false, false, "", "γ")},
+ {0x1d773, 0, 0, 0, g(Yes, No, false, false, "", "δ")},
+ {0x1d774, 0, 0, 0, g(Yes, No, false, false, "", "ε")},
+ {0x1d775, 0, 0, 0, g(Yes, No, false, false, "", "ζ")},
+ {0x1d776, 0, 0, 0, g(Yes, No, false, false, "", "η")},
+ {0x1d777, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x1d778, 0, 0, 0, g(Yes, No, false, false, "", "ι")},
+ {0x1d779, 0, 0, 0, g(Yes, No, false, false, "", "κ")},
+ {0x1d77a, 0, 0, 0, g(Yes, No, false, false, "", "λ")},
+ {0x1d77b, 0, 0, 0, g(Yes, No, false, false, "", "μ")},
+ {0x1d77c, 0, 0, 0, g(Yes, No, false, false, "", "ν")},
+ {0x1d77d, 0, 0, 0, g(Yes, No, false, false, "", "ξ")},
+ {0x1d77e, 0, 0, 0, g(Yes, No, false, false, "", "ο")},
+ {0x1d77f, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x1d780, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x1d781, 0, 0, 0, g(Yes, No, false, false, "", "ς")},
+ {0x1d782, 0, 0, 0, g(Yes, No, false, false, "", "σ")},
+ {0x1d783, 0, 0, 0, g(Yes, No, false, false, "", "τ")},
+ {0x1d784, 0, 0, 0, g(Yes, No, false, false, "", "υ")},
+ {0x1d785, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d786, 0, 0, 0, g(Yes, No, false, false, "", "χ")},
+ {0x1d787, 0, 0, 0, g(Yes, No, false, false, "", "ψ")},
+ {0x1d788, 0, 0, 0, g(Yes, No, false, false, "", "ω")},
+ {0x1d789, 0, 0, 0, g(Yes, No, false, false, "", "∂")},
+ {0x1d78a, 0, 0, 0, g(Yes, No, false, false, "", "ε")},
+ {0x1d78b, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x1d78c, 0, 0, 0, g(Yes, No, false, false, "", "κ")},
+ {0x1d78d, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d78e, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x1d78f, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x1d790, 0, 0, 0, g(Yes, No, false, false, "", "Α")},
+ {0x1d791, 0, 0, 0, g(Yes, No, false, false, "", "Β")},
+ {0x1d792, 0, 0, 0, g(Yes, No, false, false, "", "Γ")},
+ {0x1d793, 0, 0, 0, g(Yes, No, false, false, "", "Δ")},
+ {0x1d794, 0, 0, 0, g(Yes, No, false, false, "", "Ε")},
+ {0x1d795, 0, 0, 0, g(Yes, No, false, false, "", "Ζ")},
+ {0x1d796, 0, 0, 0, g(Yes, No, false, false, "", "Η")},
+ {0x1d797, 0, 0, 0, g(Yes, No, false, false, "", "Θ")},
+ {0x1d798, 0, 0, 0, g(Yes, No, false, false, "", "Ι")},
+ {0x1d799, 0, 0, 0, g(Yes, No, false, false, "", "Κ")},
+ {0x1d79a, 0, 0, 0, g(Yes, No, false, false, "", "Λ")},
+ {0x1d79b, 0, 0, 0, g(Yes, No, false, false, "", "Μ")},
+ {0x1d79c, 0, 0, 0, g(Yes, No, false, false, "", "Ν")},
+ {0x1d79d, 0, 0, 0, g(Yes, No, false, false, "", "Ξ")},
+ {0x1d79e, 0, 0, 0, g(Yes, No, false, false, "", "Ο")},
+ {0x1d79f, 0, 0, 0, g(Yes, No, false, false, "", "Π")},
+ {0x1d7a0, 0, 0, 0, g(Yes, No, false, false, "", "Ρ")},
+ {0x1d7a1, 0, 0, 0, g(Yes, No, false, false, "", "Θ")},
+ {0x1d7a2, 0, 0, 0, g(Yes, No, false, false, "", "Σ")},
+ {0x1d7a3, 0, 0, 0, g(Yes, No, false, false, "", "Τ")},
+ {0x1d7a4, 0, 0, 0, g(Yes, No, false, false, "", "Υ")},
+ {0x1d7a5, 0, 0, 0, g(Yes, No, false, false, "", "Φ")},
+ {0x1d7a6, 0, 0, 0, g(Yes, No, false, false, "", "Χ")},
+ {0x1d7a7, 0, 0, 0, g(Yes, No, false, false, "", "Ψ")},
+ {0x1d7a8, 0, 0, 0, g(Yes, No, false, false, "", "Ω")},
+ {0x1d7a9, 0, 0, 0, g(Yes, No, false, false, "", "∇")},
+ {0x1d7aa, 0, 0, 0, g(Yes, No, false, false, "", "α")},
+ {0x1d7ab, 0, 0, 0, g(Yes, No, false, false, "", "β")},
+ {0x1d7ac, 0, 0, 0, g(Yes, No, false, false, "", "γ")},
+ {0x1d7ad, 0, 0, 0, g(Yes, No, false, false, "", "δ")},
+ {0x1d7ae, 0, 0, 0, g(Yes, No, false, false, "", "ε")},
+ {0x1d7af, 0, 0, 0, g(Yes, No, false, false, "", "ζ")},
+ {0x1d7b0, 0, 0, 0, g(Yes, No, false, false, "", "η")},
+ {0x1d7b1, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x1d7b2, 0, 0, 0, g(Yes, No, false, false, "", "ι")},
+ {0x1d7b3, 0, 0, 0, g(Yes, No, false, false, "", "κ")},
+ {0x1d7b4, 0, 0, 0, g(Yes, No, false, false, "", "λ")},
+ {0x1d7b5, 0, 0, 0, g(Yes, No, false, false, "", "μ")},
+ {0x1d7b6, 0, 0, 0, g(Yes, No, false, false, "", "ν")},
+ {0x1d7b7, 0, 0, 0, g(Yes, No, false, false, "", "ξ")},
+ {0x1d7b8, 0, 0, 0, g(Yes, No, false, false, "", "ο")},
+ {0x1d7b9, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x1d7ba, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x1d7bb, 0, 0, 0, g(Yes, No, false, false, "", "ς")},
+ {0x1d7bc, 0, 0, 0, g(Yes, No, false, false, "", "σ")},
+ {0x1d7bd, 0, 0, 0, g(Yes, No, false, false, "", "τ")},
+ {0x1d7be, 0, 0, 0, g(Yes, No, false, false, "", "υ")},
+ {0x1d7bf, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d7c0, 0, 0, 0, g(Yes, No, false, false, "", "χ")},
+ {0x1d7c1, 0, 0, 0, g(Yes, No, false, false, "", "ψ")},
+ {0x1d7c2, 0, 0, 0, g(Yes, No, false, false, "", "ω")},
+ {0x1d7c3, 0, 0, 0, g(Yes, No, false, false, "", "∂")},
+ {0x1d7c4, 0, 0, 0, g(Yes, No, false, false, "", "ε")},
+ {0x1d7c5, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x1d7c6, 0, 0, 0, g(Yes, No, false, false, "", "κ")},
+ {0x1d7c7, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d7c8, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x1d7c9, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x1d7ca, 0, 0, 0, g(Yes, No, false, false, "", "Ϝ")},
+ {0x1d7cb, 0, 0, 0, g(Yes, No, false, false, "", "ϝ")},
+ {0x1d7cc, 0, 0, 0, f(Yes, false, "")},
+ {0x1d7ce, 0, 0, 0, g(Yes, No, false, false, "", "0")},
+ {0x1d7cf, 0, 0, 0, g(Yes, No, false, false, "", "1")},
+ {0x1d7d0, 0, 0, 0, g(Yes, No, false, false, "", "2")},
+ {0x1d7d1, 0, 0, 0, g(Yes, No, false, false, "", "3")},
+ {0x1d7d2, 0, 0, 0, g(Yes, No, false, false, "", "4")},
+ {0x1d7d3, 0, 0, 0, g(Yes, No, false, false, "", "5")},
+ {0x1d7d4, 0, 0, 0, g(Yes, No, false, false, "", "6")},
+ {0x1d7d5, 0, 0, 0, g(Yes, No, false, false, "", "7")},
+ {0x1d7d6, 0, 0, 0, g(Yes, No, false, false, "", "8")},
+ {0x1d7d7, 0, 0, 0, g(Yes, No, false, false, "", "9")},
+ {0x1d7d8, 0, 0, 0, g(Yes, No, false, false, "", "0")},
+ {0x1d7d9, 0, 0, 0, g(Yes, No, false, false, "", "1")},
+ {0x1d7da, 0, 0, 0, g(Yes, No, false, false, "", "2")},
+ {0x1d7db, 0, 0, 0, g(Yes, No, false, false, "", "3")},
+ {0x1d7dc, 0, 0, 0, g(Yes, No, false, false, "", "4")},
+ {0x1d7dd, 0, 0, 0, g(Yes, No, false, false, "", "5")},
+ {0x1d7de, 0, 0, 0, g(Yes, No, false, false, "", "6")},
+ {0x1d7df, 0, 0, 0, g(Yes, No, false, false, "", "7")},
+ {0x1d7e0, 0, 0, 0, g(Yes, No, false, false, "", "8")},
+ {0x1d7e1, 0, 0, 0, g(Yes, No, false, false, "", "9")},
+ {0x1d7e2, 0, 0, 0, g(Yes, No, false, false, "", "0")},
+ {0x1d7e3, 0, 0, 0, g(Yes, No, false, false, "", "1")},
+ {0x1d7e4, 0, 0, 0, g(Yes, No, false, false, "", "2")},
+ {0x1d7e5, 0, 0, 0, g(Yes, No, false, false, "", "3")},
+ {0x1d7e6, 0, 0, 0, g(Yes, No, false, false, "", "4")},
+ {0x1d7e7, 0, 0, 0, g(Yes, No, false, false, "", "5")},
+ {0x1d7e8, 0, 0, 0, g(Yes, No, false, false, "", "6")},
+ {0x1d7e9, 0, 0, 0, g(Yes, No, false, false, "", "7")},
+ {0x1d7ea, 0, 0, 0, g(Yes, No, false, false, "", "8")},
+ {0x1d7eb, 0, 0, 0, g(Yes, No, false, false, "", "9")},
+ {0x1d7ec, 0, 0, 0, g(Yes, No, false, false, "", "0")},
+ {0x1d7ed, 0, 0, 0, g(Yes, No, false, false, "", "1")},
+ {0x1d7ee, 0, 0, 0, g(Yes, No, false, false, "", "2")},
+ {0x1d7ef, 0, 0, 0, g(Yes, No, false, false, "", "3")},
+ {0x1d7f0, 0, 0, 0, g(Yes, No, false, false, "", "4")},
+ {0x1d7f1, 0, 0, 0, g(Yes, No, false, false, "", "5")},
+ {0x1d7f2, 0, 0, 0, g(Yes, No, false, false, "", "6")},
+ {0x1d7f3, 0, 0, 0, g(Yes, No, false, false, "", "7")},
+ {0x1d7f4, 0, 0, 0, g(Yes, No, false, false, "", "8")},
+ {0x1d7f5, 0, 0, 0, g(Yes, No, false, false, "", "9")},
+ {0x1d7f6, 0, 0, 0, g(Yes, No, false, false, "", "0")},
+ {0x1d7f7, 0, 0, 0, g(Yes, No, false, false, "", "1")},
+ {0x1d7f8, 0, 0, 0, g(Yes, No, false, false, "", "2")},
+ {0x1d7f9, 0, 0, 0, g(Yes, No, false, false, "", "3")},
+ {0x1d7fa, 0, 0, 0, g(Yes, No, false, false, "", "4")},
+ {0x1d7fb, 0, 0, 0, g(Yes, No, false, false, "", "5")},
+ {0x1d7fc, 0, 0, 0, g(Yes, No, false, false, "", "6")},
+ {0x1d7fd, 0, 0, 0, g(Yes, No, false, false, "", "7")},
+ {0x1d7fe, 0, 0, 0, g(Yes, No, false, false, "", "8")},
+ {0x1d7ff, 0, 0, 0, g(Yes, No, false, false, "", "9")},
+ {0x1d800, 0, 0, 0, f(Yes, false, "")},
+ {0x1e000, 230, 1, 1, f(Yes, false, "")},
+ {0x1e007, 0, 0, 0, f(Yes, false, "")},
+ {0x1e008, 230, 1, 1, f(Yes, false, "")},
+ {0x1e019, 0, 0, 0, f(Yes, false, "")},
+ {0x1e01b, 230, 1, 1, f(Yes, false, "")},
+ {0x1e022, 0, 0, 0, f(Yes, false, "")},
+ {0x1e023, 230, 1, 1, f(Yes, false, "")},
+ {0x1e025, 0, 0, 0, f(Yes, false, "")},
+ {0x1e026, 230, 1, 1, f(Yes, false, "")},
+ {0x1e02b, 0, 0, 0, f(Yes, false, "")},
+ {0x1e8d0, 220, 1, 1, f(Yes, false, "")},
+ {0x1e8d7, 0, 0, 0, f(Yes, false, "")},
+ {0x1e944, 230, 1, 1, f(Yes, false, "")},
+ {0x1e94a, 7, 1, 1, f(Yes, false, "")},
+ {0x1e94b, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee00, 0, 0, 0, g(Yes, No, false, false, "", "ا")},
+ {0x1ee01, 0, 0, 0, g(Yes, No, false, false, "", "ب")},
+ {0x1ee02, 0, 0, 0, g(Yes, No, false, false, "", "ج")},
+ {0x1ee03, 0, 0, 0, g(Yes, No, false, false, "", "د")},
+ {0x1ee04, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee05, 0, 0, 0, g(Yes, No, false, false, "", "و")},
+ {0x1ee06, 0, 0, 0, g(Yes, No, false, false, "", "ز")},
+ {0x1ee07, 0, 0, 0, g(Yes, No, false, false, "", "ح")},
+ {0x1ee08, 0, 0, 0, g(Yes, No, false, false, "", "ط")},
+ {0x1ee09, 0, 0, 0, g(Yes, No, false, false, "", "ي")},
+ {0x1ee0a, 0, 0, 0, g(Yes, No, false, false, "", "ك")},
+ {0x1ee0b, 0, 0, 0, g(Yes, No, false, false, "", "ل")},
+ {0x1ee0c, 0, 0, 0, g(Yes, No, false, false, "", "م")},
+ {0x1ee0d, 0, 0, 0, g(Yes, No, false, false, "", "ن")},
+ {0x1ee0e, 0, 0, 0, g(Yes, No, false, false, "", "س")},
+ {0x1ee0f, 0, 0, 0, g(Yes, No, false, false, "", "ع")},
+ {0x1ee10, 0, 0, 0, g(Yes, No, false, false, "", "ف")},
+ {0x1ee11, 0, 0, 0, g(Yes, No, false, false, "", "ص")},
+ {0x1ee12, 0, 0, 0, g(Yes, No, false, false, "", "ق")},
+ {0x1ee13, 0, 0, 0, g(Yes, No, false, false, "", "ر")},
+ {0x1ee14, 0, 0, 0, g(Yes, No, false, false, "", "ش")},
+ {0x1ee15, 0, 0, 0, g(Yes, No, false, false, "", "ت")},
+ {0x1ee16, 0, 0, 0, g(Yes, No, false, false, "", "ث")},
+ {0x1ee17, 0, 0, 0, g(Yes, No, false, false, "", "خ")},
+ {0x1ee18, 0, 0, 0, g(Yes, No, false, false, "", "ذ")},
+ {0x1ee19, 0, 0, 0, g(Yes, No, false, false, "", "ض")},
+ {0x1ee1a, 0, 0, 0, g(Yes, No, false, false, "", "ظ")},
+ {0x1ee1b, 0, 0, 0, g(Yes, No, false, false, "", "غ")},
+ {0x1ee1c, 0, 0, 0, g(Yes, No, false, false, "", "ٮ")},
+ {0x1ee1d, 0, 0, 0, g(Yes, No, false, false, "", "ں")},
+ {0x1ee1e, 0, 0, 0, g(Yes, No, false, false, "", "ڡ")},
+ {0x1ee1f, 0, 0, 0, g(Yes, No, false, false, "", "ٯ")},
+ {0x1ee20, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee21, 0, 0, 0, g(Yes, No, false, false, "", "ب")},
+ {0x1ee22, 0, 0, 0, g(Yes, No, false, false, "", "ج")},
+ {0x1ee23, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee24, 0, 0, 0, g(Yes, No, false, false, "", "ه")},
+ {0x1ee25, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee27, 0, 0, 0, g(Yes, No, false, false, "", "ح")},
+ {0x1ee28, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee29, 0, 0, 0, g(Yes, No, false, false, "", "ي")},
+ {0x1ee2a, 0, 0, 0, g(Yes, No, false, false, "", "ك")},
+ {0x1ee2b, 0, 0, 0, g(Yes, No, false, false, "", "ل")},
+ {0x1ee2c, 0, 0, 0, g(Yes, No, false, false, "", "م")},
+ {0x1ee2d, 0, 0, 0, g(Yes, No, false, false, "", "ن")},
+ {0x1ee2e, 0, 0, 0, g(Yes, No, false, false, "", "س")},
+ {0x1ee2f, 0, 0, 0, g(Yes, No, false, false, "", "ع")},
+ {0x1ee30, 0, 0, 0, g(Yes, No, false, false, "", "ف")},
+ {0x1ee31, 0, 0, 0, g(Yes, No, false, false, "", "ص")},
+ {0x1ee32, 0, 0, 0, g(Yes, No, false, false, "", "ق")},
+ {0x1ee33, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee34, 0, 0, 0, g(Yes, No, false, false, "", "ش")},
+ {0x1ee35, 0, 0, 0, g(Yes, No, false, false, "", "ت")},
+ {0x1ee36, 0, 0, 0, g(Yes, No, false, false, "", "ث")},
+ {0x1ee37, 0, 0, 0, g(Yes, No, false, false, "", "خ")},
+ {0x1ee38, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee39, 0, 0, 0, g(Yes, No, false, false, "", "ض")},
+ {0x1ee3a, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee3b, 0, 0, 0, g(Yes, No, false, false, "", "غ")},
+ {0x1ee3c, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee42, 0, 0, 0, g(Yes, No, false, false, "", "ج")},
+ {0x1ee43, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee47, 0, 0, 0, g(Yes, No, false, false, "", "ح")},
+ {0x1ee48, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee49, 0, 0, 0, g(Yes, No, false, false, "", "ي")},
+ {0x1ee4a, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee4b, 0, 0, 0, g(Yes, No, false, false, "", "ل")},
+ {0x1ee4c, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee4d, 0, 0, 0, g(Yes, No, false, false, "", "ن")},
+ {0x1ee4e, 0, 0, 0, g(Yes, No, false, false, "", "س")},
+ {0x1ee4f, 0, 0, 0, g(Yes, No, false, false, "", "ع")},
+ {0x1ee50, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee51, 0, 0, 0, g(Yes, No, false, false, "", "ص")},
+ {0x1ee52, 0, 0, 0, g(Yes, No, false, false, "", "ق")},
+ {0x1ee53, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee54, 0, 0, 0, g(Yes, No, false, false, "", "ش")},
+ {0x1ee55, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee57, 0, 0, 0, g(Yes, No, false, false, "", "خ")},
+ {0x1ee58, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee59, 0, 0, 0, g(Yes, No, false, false, "", "ض")},
+ {0x1ee5a, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee5b, 0, 0, 0, g(Yes, No, false, false, "", "غ")},
+ {0x1ee5c, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee5d, 0, 0, 0, g(Yes, No, false, false, "", "ں")},
+ {0x1ee5e, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee5f, 0, 0, 0, g(Yes, No, false, false, "", "ٯ")},
+ {0x1ee60, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee61, 0, 0, 0, g(Yes, No, false, false, "", "ب")},
+ {0x1ee62, 0, 0, 0, g(Yes, No, false, false, "", "ج")},
+ {0x1ee63, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee64, 0, 0, 0, g(Yes, No, false, false, "", "ه")},
+ {0x1ee65, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee67, 0, 0, 0, g(Yes, No, false, false, "", "ح")},
+ {0x1ee68, 0, 0, 0, g(Yes, No, false, false, "", "ط")},
+ {0x1ee69, 0, 0, 0, g(Yes, No, false, false, "", "ي")},
+ {0x1ee6a, 0, 0, 0, g(Yes, No, false, false, "", "ك")},
+ {0x1ee6b, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee6c, 0, 0, 0, g(Yes, No, false, false, "", "م")},
+ {0x1ee6d, 0, 0, 0, g(Yes, No, false, false, "", "ن")},
+ {0x1ee6e, 0, 0, 0, g(Yes, No, false, false, "", "س")},
+ {0x1ee6f, 0, 0, 0, g(Yes, No, false, false, "", "ع")},
+ {0x1ee70, 0, 0, 0, g(Yes, No, false, false, "", "ف")},
+ {0x1ee71, 0, 0, 0, g(Yes, No, false, false, "", "ص")},
+ {0x1ee72, 0, 0, 0, g(Yes, No, false, false, "", "ق")},
+ {0x1ee73, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee74, 0, 0, 0, g(Yes, No, false, false, "", "ش")},
+ {0x1ee75, 0, 0, 0, g(Yes, No, false, false, "", "ت")},
+ {0x1ee76, 0, 0, 0, g(Yes, No, false, false, "", "ث")},
+ {0x1ee77, 0, 0, 0, g(Yes, No, false, false, "", "خ")},
+ {0x1ee78, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee79, 0, 0, 0, g(Yes, No, false, false, "", "ض")},
+ {0x1ee7a, 0, 0, 0, g(Yes, No, false, false, "", "ظ")},
+ {0x1ee7b, 0, 0, 0, g(Yes, No, false, false, "", "غ")},
+ {0x1ee7c, 0, 0, 0, g(Yes, No, false, false, "", "ٮ")},
+ {0x1ee7d, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee7e, 0, 0, 0, g(Yes, No, false, false, "", "ڡ")},
+ {0x1ee7f, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee80, 0, 0, 0, g(Yes, No, false, false, "", "ا")},
+ {0x1ee81, 0, 0, 0, g(Yes, No, false, false, "", "ب")},
+ {0x1ee82, 0, 0, 0, g(Yes, No, false, false, "", "ج")},
+ {0x1ee83, 0, 0, 0, g(Yes, No, false, false, "", "د")},
+ {0x1ee84, 0, 0, 0, g(Yes, No, false, false, "", "ه")},
+ {0x1ee85, 0, 0, 0, g(Yes, No, false, false, "", "و")},
+ {0x1ee86, 0, 0, 0, g(Yes, No, false, false, "", "ز")},
+ {0x1ee87, 0, 0, 0, g(Yes, No, false, false, "", "ح")},
+ {0x1ee88, 0, 0, 0, g(Yes, No, false, false, "", "ط")},
+ {0x1ee89, 0, 0, 0, g(Yes, No, false, false, "", "ي")},
+ {0x1ee8a, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee8b, 0, 0, 0, g(Yes, No, false, false, "", "ل")},
+ {0x1ee8c, 0, 0, 0, g(Yes, No, false, false, "", "م")},
+ {0x1ee8d, 0, 0, 0, g(Yes, No, false, false, "", "ن")},
+ {0x1ee8e, 0, 0, 0, g(Yes, No, false, false, "", "س")},
+ {0x1ee8f, 0, 0, 0, g(Yes, No, false, false, "", "ع")},
+ {0x1ee90, 0, 0, 0, g(Yes, No, false, false, "", "ف")},
+ {0x1ee91, 0, 0, 0, g(Yes, No, false, false, "", "ص")},
+ {0x1ee92, 0, 0, 0, g(Yes, No, false, false, "", "ق")},
+ {0x1ee93, 0, 0, 0, g(Yes, No, false, false, "", "ر")},
+ {0x1ee94, 0, 0, 0, g(Yes, No, false, false, "", "ش")},
+ {0x1ee95, 0, 0, 0, g(Yes, No, false, false, "", "ت")},
+ {0x1ee96, 0, 0, 0, g(Yes, No, false, false, "", "ث")},
+ {0x1ee97, 0, 0, 0, g(Yes, No, false, false, "", "خ")},
+ {0x1ee98, 0, 0, 0, g(Yes, No, false, false, "", "ذ")},
+ {0x1ee99, 0, 0, 0, g(Yes, No, false, false, "", "ض")},
+ {0x1ee9a, 0, 0, 0, g(Yes, No, false, false, "", "ظ")},
+ {0x1ee9b, 0, 0, 0, g(Yes, No, false, false, "", "غ")},
+ {0x1ee9c, 0, 0, 0, f(Yes, false, "")},
+ {0x1eea1, 0, 0, 0, g(Yes, No, false, false, "", "ب")},
+ {0x1eea2, 0, 0, 0, g(Yes, No, false, false, "", "ج")},
+ {0x1eea3, 0, 0, 0, g(Yes, No, false, false, "", "د")},
+ {0x1eea4, 0, 0, 0, f(Yes, false, "")},
+ {0x1eea5, 0, 0, 0, g(Yes, No, false, false, "", "و")},
+ {0x1eea6, 0, 0, 0, g(Yes, No, false, false, "", "ز")},
+ {0x1eea7, 0, 0, 0, g(Yes, No, false, false, "", "ح")},
+ {0x1eea8, 0, 0, 0, g(Yes, No, false, false, "", "ط")},
+ {0x1eea9, 0, 0, 0, g(Yes, No, false, false, "", "ي")},
+ {0x1eeaa, 0, 0, 0, f(Yes, false, "")},
+ {0x1eeab, 0, 0, 0, g(Yes, No, false, false, "", "ل")},
+ {0x1eeac, 0, 0, 0, g(Yes, No, false, false, "", "م")},
+ {0x1eead, 0, 0, 0, g(Yes, No, false, false, "", "ن")},
+ {0x1eeae, 0, 0, 0, g(Yes, No, false, false, "", "س")},
+ {0x1eeaf, 0, 0, 0, g(Yes, No, false, false, "", "ع")},
+ {0x1eeb0, 0, 0, 0, g(Yes, No, false, false, "", "ف")},
+ {0x1eeb1, 0, 0, 0, g(Yes, No, false, false, "", "ص")},
+ {0x1eeb2, 0, 0, 0, g(Yes, No, false, false, "", "ق")},
+ {0x1eeb3, 0, 0, 0, g(Yes, No, false, false, "", "ر")},
+ {0x1eeb4, 0, 0, 0, g(Yes, No, false, false, "", "ش")},
+ {0x1eeb5, 0, 0, 0, g(Yes, No, false, false, "", "ت")},
+ {0x1eeb6, 0, 0, 0, g(Yes, No, false, false, "", "ث")},
+ {0x1eeb7, 0, 0, 0, g(Yes, No, false, false, "", "خ")},
+ {0x1eeb8, 0, 0, 0, g(Yes, No, false, false, "", "ذ")},
+ {0x1eeb9, 0, 0, 0, g(Yes, No, false, false, "", "ض")},
+ {0x1eeba, 0, 0, 0, g(Yes, No, false, false, "", "ظ")},
+ {0x1eebb, 0, 0, 0, g(Yes, No, false, false, "", "غ")},
+ {0x1eebc, 0, 0, 0, f(Yes, false, "")},
+ {0x1f100, 0, 0, 0, g(Yes, No, false, false, "", "0.")},
+ {0x1f101, 0, 0, 0, g(Yes, No, false, false, "", "0,")},
+ {0x1f102, 0, 0, 0, g(Yes, No, false, false, "", "1,")},
+ {0x1f103, 0, 0, 0, g(Yes, No, false, false, "", "2,")},
+ {0x1f104, 0, 0, 0, g(Yes, No, false, false, "", "3,")},
+ {0x1f105, 0, 0, 0, g(Yes, No, false, false, "", "4,")},
+ {0x1f106, 0, 0, 0, g(Yes, No, false, false, "", "5,")},
+ {0x1f107, 0, 0, 0, g(Yes, No, false, false, "", "6,")},
+ {0x1f108, 0, 0, 0, g(Yes, No, false, false, "", "7,")},
+ {0x1f109, 0, 0, 0, g(Yes, No, false, false, "", "8,")},
+ {0x1f10a, 0, 0, 0, g(Yes, No, false, false, "", "9,")},
+ {0x1f10b, 0, 0, 0, f(Yes, false, "")},
+ {0x1f110, 0, 0, 0, g(Yes, No, false, false, "", "(A)")},
+ {0x1f111, 0, 0, 0, g(Yes, No, false, false, "", "(B)")},
+ {0x1f112, 0, 0, 0, g(Yes, No, false, false, "", "(C)")},
+ {0x1f113, 0, 0, 0, g(Yes, No, false, false, "", "(D)")},
+ {0x1f114, 0, 0, 0, g(Yes, No, false, false, "", "(E)")},
+ {0x1f115, 0, 0, 0, g(Yes, No, false, false, "", "(F)")},
+ {0x1f116, 0, 0, 0, g(Yes, No, false, false, "", "(G)")},
+ {0x1f117, 0, 0, 0, g(Yes, No, false, false, "", "(H)")},
+ {0x1f118, 0, 0, 0, g(Yes, No, false, false, "", "(I)")},
+ {0x1f119, 0, 0, 0, g(Yes, No, false, false, "", "(J)")},
+ {0x1f11a, 0, 0, 0, g(Yes, No, false, false, "", "(K)")},
+ {0x1f11b, 0, 0, 0, g(Yes, No, false, false, "", "(L)")},
+ {0x1f11c, 0, 0, 0, g(Yes, No, false, false, "", "(M)")},
+ {0x1f11d, 0, 0, 0, g(Yes, No, false, false, "", "(N)")},
+ {0x1f11e, 0, 0, 0, g(Yes, No, false, false, "", "(O)")},
+ {0x1f11f, 0, 0, 0, g(Yes, No, false, false, "", "(P)")},
+ {0x1f120, 0, 0, 0, g(Yes, No, false, false, "", "(Q)")},
+ {0x1f121, 0, 0, 0, g(Yes, No, false, false, "", "(R)")},
+ {0x1f122, 0, 0, 0, g(Yes, No, false, false, "", "(S)")},
+ {0x1f123, 0, 0, 0, g(Yes, No, false, false, "", "(T)")},
+ {0x1f124, 0, 0, 0, g(Yes, No, false, false, "", "(U)")},
+ {0x1f125, 0, 0, 0, g(Yes, No, false, false, "", "(V)")},
+ {0x1f126, 0, 0, 0, g(Yes, No, false, false, "", "(W)")},
+ {0x1f127, 0, 0, 0, g(Yes, No, false, false, "", "(X)")},
+ {0x1f128, 0, 0, 0, g(Yes, No, false, false, "", "(Y)")},
+ {0x1f129, 0, 0, 0, g(Yes, No, false, false, "", "(Z)")},
+ {0x1f12a, 0, 0, 0, g(Yes, No, false, false, "", "〔S〕")},
+ {0x1f12b, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1f12c, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1f12d, 0, 0, 0, g(Yes, No, false, false, "", "CD")},
+ {0x1f12e, 0, 0, 0, g(Yes, No, false, false, "", "WZ")},
+ {0x1f12f, 0, 0, 0, f(Yes, false, "")},
+ {0x1f130, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1f131, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1f132, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1f133, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1f134, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1f135, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1f136, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1f137, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1f138, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1f139, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1f13a, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1f13b, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1f13c, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1f13d, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1f13e, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1f13f, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1f140, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1f141, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1f142, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1f143, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1f144, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1f145, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1f146, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1f147, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1f148, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1f149, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1f14a, 0, 0, 0, g(Yes, No, false, false, "", "HV")},
+ {0x1f14b, 0, 0, 0, g(Yes, No, false, false, "", "MV")},
+ {0x1f14c, 0, 0, 0, g(Yes, No, false, false, "", "SD")},
+ {0x1f14d, 0, 0, 0, g(Yes, No, false, false, "", "SS")},
+ {0x1f14e, 0, 0, 0, g(Yes, No, false, false, "", "PPV")},
+ {0x1f14f, 0, 0, 0, g(Yes, No, false, false, "", "WC")},
+ {0x1f150, 0, 0, 0, f(Yes, false, "")},
+ {0x1f16a, 0, 0, 0, g(Yes, No, false, false, "", "MC")},
+ {0x1f16b, 0, 0, 0, g(Yes, No, false, false, "", "MD")},
+ {0x1f16c, 0, 0, 0, f(Yes, false, "")},
+ {0x1f190, 0, 0, 0, g(Yes, No, false, false, "", "DJ")},
+ {0x1f191, 0, 0, 0, f(Yes, false, "")},
+ {0x1f200, 0, 0, 0, g(Yes, No, false, false, "", "ほか")},
+ {0x1f201, 0, 0, 0, g(Yes, No, false, false, "", "ココ")},
+ {0x1f202, 0, 0, 0, g(Yes, No, false, false, "", "サ")},
+ {0x1f203, 0, 0, 0, f(Yes, false, "")},
+ {0x1f210, 0, 0, 0, g(Yes, No, false, false, "", "手")},
+ {0x1f211, 0, 0, 0, g(Yes, No, false, false, "", "字")},
+ {0x1f212, 0, 0, 0, g(Yes, No, false, false, "", "双")},
+ {0x1f213, 0, 0, 1, g(Yes, No, false, false, "", "デ")},
+ {0x1f214, 0, 0, 0, g(Yes, No, false, false, "", "二")},
+ {0x1f215, 0, 0, 0, g(Yes, No, false, false, "", "多")},
+ {0x1f216, 0, 0, 0, g(Yes, No, false, false, "", "解")},
+ {0x1f217, 0, 0, 0, g(Yes, No, false, false, "", "天")},
+ {0x1f218, 0, 0, 0, g(Yes, No, false, false, "", "交")},
+ {0x1f219, 0, 0, 0, g(Yes, No, false, false, "", "映")},
+ {0x1f21a, 0, 0, 0, g(Yes, No, false, false, "", "無")},
+ {0x1f21b, 0, 0, 0, g(Yes, No, false, false, "", "料")},
+ {0x1f21c, 0, 0, 0, g(Yes, No, false, false, "", "前")},
+ {0x1f21d, 0, 0, 0, g(Yes, No, false, false, "", "後")},
+ {0x1f21e, 0, 0, 0, g(Yes, No, false, false, "", "再")},
+ {0x1f21f, 0, 0, 0, g(Yes, No, false, false, "", "新")},
+ {0x1f220, 0, 0, 0, g(Yes, No, false, false, "", "初")},
+ {0x1f221, 0, 0, 0, g(Yes, No, false, false, "", "終")},
+ {0x1f222, 0, 0, 0, g(Yes, No, false, false, "", "生")},
+ {0x1f223, 0, 0, 0, g(Yes, No, false, false, "", "販")},
+ {0x1f224, 0, 0, 0, g(Yes, No, false, false, "", "声")},
+ {0x1f225, 0, 0, 0, g(Yes, No, false, false, "", "吹")},
+ {0x1f226, 0, 0, 0, g(Yes, No, false, false, "", "演")},
+ {0x1f227, 0, 0, 0, g(Yes, No, false, false, "", "投")},
+ {0x1f228, 0, 0, 0, g(Yes, No, false, false, "", "捕")},
+ {0x1f229, 0, 0, 0, g(Yes, No, false, false, "", "一")},
+ {0x1f22a, 0, 0, 0, g(Yes, No, false, false, "", "三")},
+ {0x1f22b, 0, 0, 0, g(Yes, No, false, false, "", "遊")},
+ {0x1f22c, 0, 0, 0, g(Yes, No, false, false, "", "左")},
+ {0x1f22d, 0, 0, 0, g(Yes, No, false, false, "", "中")},
+ {0x1f22e, 0, 0, 0, g(Yes, No, false, false, "", "右")},
+ {0x1f22f, 0, 0, 0, g(Yes, No, false, false, "", "指")},
+ {0x1f230, 0, 0, 0, g(Yes, No, false, false, "", "走")},
+ {0x1f231, 0, 0, 0, g(Yes, No, false, false, "", "打")},
+ {0x1f232, 0, 0, 0, g(Yes, No, false, false, "", "禁")},
+ {0x1f233, 0, 0, 0, g(Yes, No, false, false, "", "空")},
+ {0x1f234, 0, 0, 0, g(Yes, No, false, false, "", "合")},
+ {0x1f235, 0, 0, 0, g(Yes, No, false, false, "", "満")},
+ {0x1f236, 0, 0, 0, g(Yes, No, false, false, "", "有")},
+ {0x1f237, 0, 0, 0, g(Yes, No, false, false, "", "月")},
+ {0x1f238, 0, 0, 0, g(Yes, No, false, false, "", "申")},
+ {0x1f239, 0, 0, 0, g(Yes, No, false, false, "", "割")},
+ {0x1f23a, 0, 0, 0, g(Yes, No, false, false, "", "営")},
+ {0x1f23b, 0, 0, 0, g(Yes, No, false, false, "", "配")},
+ {0x1f23c, 0, 0, 0, f(Yes, false, "")},
+ {0x1f240, 0, 0, 0, g(Yes, No, false, false, "", "〔本〕")},
+ {0x1f241, 0, 0, 0, g(Yes, No, false, false, "", "〔三〕")},
+ {0x1f242, 0, 0, 0, g(Yes, No, false, false, "", "〔二〕")},
+ {0x1f243, 0, 0, 0, g(Yes, No, false, false, "", "〔安〕")},
+ {0x1f244, 0, 0, 0, g(Yes, No, false, false, "", "〔点〕")},
+ {0x1f245, 0, 0, 0, g(Yes, No, false, false, "", "〔打〕")},
+ {0x1f246, 0, 0, 0, g(Yes, No, false, false, "", "〔盗〕")},
+ {0x1f247, 0, 0, 0, g(Yes, No, false, false, "", "〔勝〕")},
+ {0x1f248, 0, 0, 0, g(Yes, No, false, false, "", "〔敗〕")},
+ {0x1f249, 0, 0, 0, f(Yes, false, "")},
+ {0x1f250, 0, 0, 0, g(Yes, No, false, false, "", "得")},
+ {0x1f251, 0, 0, 0, g(Yes, No, false, false, "", "可")},
+ {0x1f252, 0, 0, 0, f(Yes, false, "")},
+ {0x2f800, 0, 0, 0, f(No, false, "丽")},
+ {0x2f801, 0, 0, 0, f(No, false, "丸")},
+ {0x2f802, 0, 0, 0, f(No, false, "乁")},
+ {0x2f803, 0, 0, 0, f(No, false, "𠄢")},
+ {0x2f804, 0, 0, 0, f(No, false, "你")},
+ {0x2f805, 0, 0, 0, f(No, false, "侮")},
+ {0x2f806, 0, 0, 0, f(No, false, "侻")},
+ {0x2f807, 0, 0, 0, f(No, false, "倂")},
+ {0x2f808, 0, 0, 0, f(No, false, "偺")},
+ {0x2f809, 0, 0, 0, f(No, false, "備")},
+ {0x2f80a, 0, 0, 0, f(No, false, "僧")},
+ {0x2f80b, 0, 0, 0, f(No, false, "像")},
+ {0x2f80c, 0, 0, 0, f(No, false, "㒞")},
+ {0x2f80d, 0, 0, 0, f(No, false, "𠘺")},
+ {0x2f80e, 0, 0, 0, f(No, false, "免")},
+ {0x2f80f, 0, 0, 0, f(No, false, "兔")},
+ {0x2f810, 0, 0, 0, f(No, false, "兤")},
+ {0x2f811, 0, 0, 0, f(No, false, "具")},
+ {0x2f812, 0, 0, 0, f(No, false, "𠔜")},
+ {0x2f813, 0, 0, 0, f(No, false, "㒹")},
+ {0x2f814, 0, 0, 0, f(No, false, "內")},
+ {0x2f815, 0, 0, 0, f(No, false, "再")},
+ {0x2f816, 0, 0, 0, f(No, false, "𠕋")},
+ {0x2f817, 0, 0, 0, f(No, false, "冗")},
+ {0x2f818, 0, 0, 0, f(No, false, "冤")},
+ {0x2f819, 0, 0, 0, f(No, false, "仌")},
+ {0x2f81a, 0, 0, 0, f(No, false, "冬")},
+ {0x2f81b, 0, 0, 0, f(No, false, "况")},
+ {0x2f81c, 0, 0, 0, f(No, false, "𩇟")},
+ {0x2f81d, 0, 0, 0, f(No, false, "凵")},
+ {0x2f81e, 0, 0, 0, f(No, false, "刃")},
+ {0x2f81f, 0, 0, 0, f(No, false, "㓟")},
+ {0x2f820, 0, 0, 0, f(No, false, "刻")},
+ {0x2f821, 0, 0, 0, f(No, false, "剆")},
+ {0x2f822, 0, 0, 0, f(No, false, "割")},
+ {0x2f823, 0, 0, 0, f(No, false, "剷")},
+ {0x2f824, 0, 0, 0, f(No, false, "㔕")},
+ {0x2f825, 0, 0, 0, f(No, false, "勇")},
+ {0x2f826, 0, 0, 0, f(No, false, "勉")},
+ {0x2f827, 0, 0, 0, f(No, false, "勤")},
+ {0x2f828, 0, 0, 0, f(No, false, "勺")},
+ {0x2f829, 0, 0, 0, f(No, false, "包")},
+ {0x2f82a, 0, 0, 0, f(No, false, "匆")},
+ {0x2f82b, 0, 0, 0, f(No, false, "北")},
+ {0x2f82c, 0, 0, 0, f(No, false, "卉")},
+ {0x2f82d, 0, 0, 0, f(No, false, "卑")},
+ {0x2f82e, 0, 0, 0, f(No, false, "博")},
+ {0x2f82f, 0, 0, 0, f(No, false, "即")},
+ {0x2f830, 0, 0, 0, f(No, false, "卽")},
+ {0x2f831, 0, 0, 0, f(No, false, "卿")},
+ {0x2f834, 0, 0, 0, f(No, false, "𠨬")},
+ {0x2f835, 0, 0, 0, f(No, false, "灰")},
+ {0x2f836, 0, 0, 0, f(No, false, "及")},
+ {0x2f837, 0, 0, 0, f(No, false, "叟")},
+ {0x2f838, 0, 0, 0, f(No, false, "𠭣")},
+ {0x2f839, 0, 0, 0, f(No, false, "叫")},
+ {0x2f83a, 0, 0, 0, f(No, false, "叱")},
+ {0x2f83b, 0, 0, 0, f(No, false, "吆")},
+ {0x2f83c, 0, 0, 0, f(No, false, "咞")},
+ {0x2f83d, 0, 0, 0, f(No, false, "吸")},
+ {0x2f83e, 0, 0, 0, f(No, false, "呈")},
+ {0x2f83f, 0, 0, 0, f(No, false, "周")},
+ {0x2f840, 0, 0, 0, f(No, false, "咢")},
+ {0x2f841, 0, 0, 0, f(No, false, "哶")},
+ {0x2f842, 0, 0, 0, f(No, false, "唐")},
+ {0x2f843, 0, 0, 0, f(No, false, "啓")},
+ {0x2f844, 0, 0, 0, f(No, false, "啣")},
+ {0x2f845, 0, 0, 0, f(No, false, "善")},
+ {0x2f847, 0, 0, 0, f(No, false, "喙")},
+ {0x2f848, 0, 0, 0, f(No, false, "喫")},
+ {0x2f849, 0, 0, 0, f(No, false, "喳")},
+ {0x2f84a, 0, 0, 0, f(No, false, "嗂")},
+ {0x2f84b, 0, 0, 0, f(No, false, "圖")},
+ {0x2f84c, 0, 0, 0, f(No, false, "嘆")},
+ {0x2f84d, 0, 0, 0, f(No, false, "圗")},
+ {0x2f84e, 0, 0, 0, f(No, false, "噑")},
+ {0x2f84f, 0, 0, 0, f(No, false, "噴")},
+ {0x2f850, 0, 0, 0, f(No, false, "切")},
+ {0x2f851, 0, 0, 0, f(No, false, "壮")},
+ {0x2f852, 0, 0, 0, f(No, false, "城")},
+ {0x2f853, 0, 0, 0, f(No, false, "埴")},
+ {0x2f854, 0, 0, 0, f(No, false, "堍")},
+ {0x2f855, 0, 0, 0, f(No, false, "型")},
+ {0x2f856, 0, 0, 0, f(No, false, "堲")},
+ {0x2f857, 0, 0, 0, f(No, false, "報")},
+ {0x2f858, 0, 0, 0, f(No, false, "墬")},
+ {0x2f859, 0, 0, 0, f(No, false, "𡓤")},
+ {0x2f85a, 0, 0, 0, f(No, false, "売")},
+ {0x2f85b, 0, 0, 0, f(No, false, "壷")},
+ {0x2f85c, 0, 0, 0, f(No, false, "夆")},
+ {0x2f85d, 0, 0, 0, f(No, false, "多")},
+ {0x2f85e, 0, 0, 0, f(No, false, "夢")},
+ {0x2f85f, 0, 0, 0, f(No, false, "奢")},
+ {0x2f860, 0, 0, 0, f(No, false, "𡚨")},
+ {0x2f861, 0, 0, 0, f(No, false, "𡛪")},
+ {0x2f862, 0, 0, 0, f(No, false, "姬")},
+ {0x2f863, 0, 0, 0, f(No, false, "娛")},
+ {0x2f864, 0, 0, 0, f(No, false, "娧")},
+ {0x2f865, 0, 0, 0, f(No, false, "姘")},
+ {0x2f866, 0, 0, 0, f(No, false, "婦")},
+ {0x2f867, 0, 0, 0, f(No, false, "㛮")},
+ {0x2f868, 0, 0, 0, f(No, false, "㛼")},
+ {0x2f869, 0, 0, 0, f(No, false, "嬈")},
+ {0x2f86a, 0, 0, 0, f(No, false, "嬾")},
+ {0x2f86c, 0, 0, 0, f(No, false, "𡧈")},
+ {0x2f86d, 0, 0, 0, f(No, false, "寃")},
+ {0x2f86e, 0, 0, 0, f(No, false, "寘")},
+ {0x2f86f, 0, 0, 0, f(No, false, "寧")},
+ {0x2f870, 0, 0, 0, f(No, false, "寳")},
+ {0x2f871, 0, 0, 0, f(No, false, "𡬘")},
+ {0x2f872, 0, 0, 0, f(No, false, "寿")},
+ {0x2f873, 0, 0, 0, f(No, false, "将")},
+ {0x2f874, 0, 0, 0, f(No, false, "当")},
+ {0x2f875, 0, 0, 0, f(No, false, "尢")},
+ {0x2f876, 0, 0, 0, f(No, false, "㞁")},
+ {0x2f877, 0, 0, 0, f(No, false, "屠")},
+ {0x2f878, 0, 0, 0, f(No, false, "屮")},
+ {0x2f879, 0, 0, 0, f(No, false, "峀")},
+ {0x2f87a, 0, 0, 0, f(No, false, "岍")},
+ {0x2f87b, 0, 0, 0, f(No, false, "𡷤")},
+ {0x2f87c, 0, 0, 0, f(No, false, "嵃")},
+ {0x2f87d, 0, 0, 0, f(No, false, "𡷦")},
+ {0x2f87e, 0, 0, 0, f(No, false, "嵮")},
+ {0x2f87f, 0, 0, 0, f(No, false, "嵫")},
+ {0x2f880, 0, 0, 0, f(No, false, "嵼")},
+ {0x2f881, 0, 0, 0, f(No, false, "巡")},
+ {0x2f882, 0, 0, 0, f(No, false, "巢")},
+ {0x2f883, 0, 0, 0, f(No, false, "㠯")},
+ {0x2f884, 0, 0, 0, f(No, false, "巽")},
+ {0x2f885, 0, 0, 0, f(No, false, "帨")},
+ {0x2f886, 0, 0, 0, f(No, false, "帽")},
+ {0x2f887, 0, 0, 0, f(No, false, "幩")},
+ {0x2f888, 0, 0, 0, f(No, false, "㡢")},
+ {0x2f889, 0, 0, 0, f(No, false, "𢆃")},
+ {0x2f88a, 0, 0, 0, f(No, false, "㡼")},
+ {0x2f88b, 0, 0, 0, f(No, false, "庰")},
+ {0x2f88c, 0, 0, 0, f(No, false, "庳")},
+ {0x2f88d, 0, 0, 0, f(No, false, "庶")},
+ {0x2f88e, 0, 0, 0, f(No, false, "廊")},
+ {0x2f88f, 0, 0, 0, f(No, false, "𪎒")},
+ {0x2f890, 0, 0, 0, f(No, false, "廾")},
+ {0x2f891, 0, 0, 0, f(No, false, "𢌱")},
+ {0x2f893, 0, 0, 0, f(No, false, "舁")},
+ {0x2f894, 0, 0, 0, f(No, false, "弢")},
+ {0x2f896, 0, 0, 0, f(No, false, "㣇")},
+ {0x2f897, 0, 0, 0, f(No, false, "𣊸")},
+ {0x2f898, 0, 0, 0, f(No, false, "𦇚")},
+ {0x2f899, 0, 0, 0, f(No, false, "形")},
+ {0x2f89a, 0, 0, 0, f(No, false, "彫")},
+ {0x2f89b, 0, 0, 0, f(No, false, "㣣")},
+ {0x2f89c, 0, 0, 0, f(No, false, "徚")},
+ {0x2f89d, 0, 0, 0, f(No, false, "忍")},
+ {0x2f89e, 0, 0, 0, f(No, false, "志")},
+ {0x2f89f, 0, 0, 0, f(No, false, "忹")},
+ {0x2f8a0, 0, 0, 0, f(No, false, "悁")},
+ {0x2f8a1, 0, 0, 0, f(No, false, "㤺")},
+ {0x2f8a2, 0, 0, 0, f(No, false, "㤜")},
+ {0x2f8a3, 0, 0, 0, f(No, false, "悔")},
+ {0x2f8a4, 0, 0, 0, f(No, false, "𢛔")},
+ {0x2f8a5, 0, 0, 0, f(No, false, "惇")},
+ {0x2f8a6, 0, 0, 0, f(No, false, "慈")},
+ {0x2f8a7, 0, 0, 0, f(No, false, "慌")},
+ {0x2f8a8, 0, 0, 0, f(No, false, "慎")},
+ {0x2f8a9, 0, 0, 0, f(No, false, "慌")},
+ {0x2f8aa, 0, 0, 0, f(No, false, "慺")},
+ {0x2f8ab, 0, 0, 0, f(No, false, "憎")},
+ {0x2f8ac, 0, 0, 0, f(No, false, "憲")},
+ {0x2f8ad, 0, 0, 0, f(No, false, "憤")},
+ {0x2f8ae, 0, 0, 0, f(No, false, "憯")},
+ {0x2f8af, 0, 0, 0, f(No, false, "懞")},
+ {0x2f8b0, 0, 0, 0, f(No, false, "懲")},
+ {0x2f8b1, 0, 0, 0, f(No, false, "懶")},
+ {0x2f8b2, 0, 0, 0, f(No, false, "成")},
+ {0x2f8b3, 0, 0, 0, f(No, false, "戛")},
+ {0x2f8b4, 0, 0, 0, f(No, false, "扝")},
+ {0x2f8b5, 0, 0, 0, f(No, false, "抱")},
+ {0x2f8b6, 0, 0, 0, f(No, false, "拔")},
+ {0x2f8b7, 0, 0, 0, f(No, false, "捐")},
+ {0x2f8b8, 0, 0, 0, f(No, false, "𢬌")},
+ {0x2f8b9, 0, 0, 0, f(No, false, "挽")},
+ {0x2f8ba, 0, 0, 0, f(No, false, "拼")},
+ {0x2f8bb, 0, 0, 0, f(No, false, "捨")},
+ {0x2f8bc, 0, 0, 0, f(No, false, "掃")},
+ {0x2f8bd, 0, 0, 0, f(No, false, "揤")},
+ {0x2f8be, 0, 0, 0, f(No, false, "𢯱")},
+ {0x2f8bf, 0, 0, 0, f(No, false, "搢")},
+ {0x2f8c0, 0, 0, 0, f(No, false, "揅")},
+ {0x2f8c1, 0, 0, 0, f(No, false, "掩")},
+ {0x2f8c2, 0, 0, 0, f(No, false, "㨮")},
+ {0x2f8c3, 0, 0, 0, f(No, false, "摩")},
+ {0x2f8c4, 0, 0, 0, f(No, false, "摾")},
+ {0x2f8c5, 0, 0, 0, f(No, false, "撝")},
+ {0x2f8c6, 0, 0, 0, f(No, false, "摷")},
+ {0x2f8c7, 0, 0, 0, f(No, false, "㩬")},
+ {0x2f8c8, 0, 0, 0, f(No, false, "敏")},
+ {0x2f8c9, 0, 0, 0, f(No, false, "敬")},
+ {0x2f8ca, 0, 0, 0, f(No, false, "𣀊")},
+ {0x2f8cb, 0, 0, 0, f(No, false, "旣")},
+ {0x2f8cc, 0, 0, 0, f(No, false, "書")},
+ {0x2f8cd, 0, 0, 0, f(No, false, "晉")},
+ {0x2f8ce, 0, 0, 0, f(No, false, "㬙")},
+ {0x2f8cf, 0, 0, 0, f(No, false, "暑")},
+ {0x2f8d0, 0, 0, 0, f(No, false, "㬈")},
+ {0x2f8d1, 0, 0, 0, f(No, false, "㫤")},
+ {0x2f8d2, 0, 0, 0, f(No, false, "冒")},
+ {0x2f8d3, 0, 0, 0, f(No, false, "冕")},
+ {0x2f8d4, 0, 0, 0, f(No, false, "最")},
+ {0x2f8d5, 0, 0, 0, f(No, false, "暜")},
+ {0x2f8d6, 0, 0, 0, f(No, false, "肭")},
+ {0x2f8d7, 0, 0, 0, f(No, false, "䏙")},
+ {0x2f8d8, 0, 0, 0, f(No, false, "朗")},
+ {0x2f8d9, 0, 0, 0, f(No, false, "望")},
+ {0x2f8da, 0, 0, 0, f(No, false, "朡")},
+ {0x2f8db, 0, 0, 0, f(No, false, "杞")},
+ {0x2f8dc, 0, 0, 0, f(No, false, "杓")},
+ {0x2f8dd, 0, 0, 0, f(No, false, "𣏃")},
+ {0x2f8de, 0, 0, 0, f(No, false, "㭉")},
+ {0x2f8df, 0, 0, 0, f(No, false, "柺")},
+ {0x2f8e0, 0, 0, 0, f(No, false, "枅")},
+ {0x2f8e1, 0, 0, 0, f(No, false, "桒")},
+ {0x2f8e2, 0, 0, 0, f(No, false, "梅")},
+ {0x2f8e3, 0, 0, 0, f(No, false, "𣑭")},
+ {0x2f8e4, 0, 0, 0, f(No, false, "梎")},
+ {0x2f8e5, 0, 0, 0, f(No, false, "栟")},
+ {0x2f8e6, 0, 0, 0, f(No, false, "椔")},
+ {0x2f8e7, 0, 0, 0, f(No, false, "㮝")},
+ {0x2f8e8, 0, 0, 0, f(No, false, "楂")},
+ {0x2f8e9, 0, 0, 0, f(No, false, "榣")},
+ {0x2f8ea, 0, 0, 0, f(No, false, "槪")},
+ {0x2f8eb, 0, 0, 0, f(No, false, "檨")},
+ {0x2f8ec, 0, 0, 0, f(No, false, "𣚣")},
+ {0x2f8ed, 0, 0, 0, f(No, false, "櫛")},
+ {0x2f8ee, 0, 0, 0, f(No, false, "㰘")},
+ {0x2f8ef, 0, 0, 0, f(No, false, "次")},
+ {0x2f8f0, 0, 0, 0, f(No, false, "𣢧")},
+ {0x2f8f1, 0, 0, 0, f(No, false, "歔")},
+ {0x2f8f2, 0, 0, 0, f(No, false, "㱎")},
+ {0x2f8f3, 0, 0, 0, f(No, false, "歲")},
+ {0x2f8f4, 0, 0, 0, f(No, false, "殟")},
+ {0x2f8f5, 0, 0, 0, f(No, false, "殺")},
+ {0x2f8f6, 0, 0, 0, f(No, false, "殻")},
+ {0x2f8f7, 0, 0, 0, f(No, false, "𣪍")},
+ {0x2f8f8, 0, 0, 0, f(No, false, "𡴋")},
+ {0x2f8f9, 0, 0, 0, f(No, false, "𣫺")},
+ {0x2f8fa, 0, 0, 0, f(No, false, "汎")},
+ {0x2f8fb, 0, 0, 0, f(No, false, "𣲼")},
+ {0x2f8fc, 0, 0, 0, f(No, false, "沿")},
+ {0x2f8fd, 0, 0, 0, f(No, false, "泍")},
+ {0x2f8fe, 0, 0, 0, f(No, false, "汧")},
+ {0x2f8ff, 0, 0, 0, f(No, false, "洖")},
+ {0x2f900, 0, 0, 0, f(No, false, "派")},
+ {0x2f901, 0, 0, 0, f(No, false, "海")},
+ {0x2f902, 0, 0, 0, f(No, false, "流")},
+ {0x2f903, 0, 0, 0, f(No, false, "浩")},
+ {0x2f904, 0, 0, 0, f(No, false, "浸")},
+ {0x2f905, 0, 0, 0, f(No, false, "涅")},
+ {0x2f906, 0, 0, 0, f(No, false, "𣴞")},
+ {0x2f907, 0, 0, 0, f(No, false, "洴")},
+ {0x2f908, 0, 0, 0, f(No, false, "港")},
+ {0x2f909, 0, 0, 0, f(No, false, "湮")},
+ {0x2f90a, 0, 0, 0, f(No, false, "㴳")},
+ {0x2f90b, 0, 0, 0, f(No, false, "滋")},
+ {0x2f90c, 0, 0, 0, f(No, false, "滇")},
+ {0x2f90d, 0, 0, 0, f(No, false, "𣻑")},
+ {0x2f90e, 0, 0, 0, f(No, false, "淹")},
+ {0x2f90f, 0, 0, 0, f(No, false, "潮")},
+ {0x2f910, 0, 0, 0, f(No, false, "𣽞")},
+ {0x2f911, 0, 0, 0, f(No, false, "𣾎")},
+ {0x2f912, 0, 0, 0, f(No, false, "濆")},
+ {0x2f913, 0, 0, 0, f(No, false, "瀹")},
+ {0x2f914, 0, 0, 0, f(No, false, "瀞")},
+ {0x2f915, 0, 0, 0, f(No, false, "瀛")},
+ {0x2f916, 0, 0, 0, f(No, false, "㶖")},
+ {0x2f917, 0, 0, 0, f(No, false, "灊")},
+ {0x2f918, 0, 0, 0, f(No, false, "災")},
+ {0x2f919, 0, 0, 0, f(No, false, "灷")},
+ {0x2f91a, 0, 0, 0, f(No, false, "炭")},
+ {0x2f91b, 0, 0, 0, f(No, false, "𠔥")},
+ {0x2f91c, 0, 0, 0, f(No, false, "煅")},
+ {0x2f91d, 0, 0, 0, f(No, false, "𤉣")},
+ {0x2f91e, 0, 0, 0, f(No, false, "熜")},
+ {0x2f91f, 0, 0, 0, f(No, false, "𤎫")},
+ {0x2f920, 0, 0, 0, f(No, false, "爨")},
+ {0x2f921, 0, 0, 0, f(No, false, "爵")},
+ {0x2f922, 0, 0, 0, f(No, false, "牐")},
+ {0x2f923, 0, 0, 0, f(No, false, "𤘈")},
+ {0x2f924, 0, 0, 0, f(No, false, "犀")},
+ {0x2f925, 0, 0, 0, f(No, false, "犕")},
+ {0x2f926, 0, 0, 0, f(No, false, "𤜵")},
+ {0x2f927, 0, 0, 0, f(No, false, "𤠔")},
+ {0x2f928, 0, 0, 0, f(No, false, "獺")},
+ {0x2f929, 0, 0, 0, f(No, false, "王")},
+ {0x2f92a, 0, 0, 0, f(No, false, "㺬")},
+ {0x2f92b, 0, 0, 0, f(No, false, "玥")},
+ {0x2f92c, 0, 0, 0, f(No, false, "㺸")},
+ {0x2f92e, 0, 0, 0, f(No, false, "瑇")},
+ {0x2f92f, 0, 0, 0, f(No, false, "瑜")},
+ {0x2f930, 0, 0, 0, f(No, false, "瑱")},
+ {0x2f931, 0, 0, 0, f(No, false, "璅")},
+ {0x2f932, 0, 0, 0, f(No, false, "瓊")},
+ {0x2f933, 0, 0, 0, f(No, false, "㼛")},
+ {0x2f934, 0, 0, 0, f(No, false, "甤")},
+ {0x2f935, 0, 0, 0, f(No, false, "𤰶")},
+ {0x2f936, 0, 0, 0, f(No, false, "甾")},
+ {0x2f937, 0, 0, 0, f(No, false, "𤲒")},
+ {0x2f938, 0, 0, 0, f(No, false, "異")},
+ {0x2f939, 0, 0, 0, f(No, false, "𢆟")},
+ {0x2f93a, 0, 0, 0, f(No, false, "瘐")},
+ {0x2f93b, 0, 0, 0, f(No, false, "𤾡")},
+ {0x2f93c, 0, 0, 0, f(No, false, "𤾸")},
+ {0x2f93d, 0, 0, 0, f(No, false, "𥁄")},
+ {0x2f93e, 0, 0, 0, f(No, false, "㿼")},
+ {0x2f93f, 0, 0, 0, f(No, false, "䀈")},
+ {0x2f940, 0, 0, 0, f(No, false, "直")},
+ {0x2f941, 0, 0, 0, f(No, false, "𥃳")},
+ {0x2f942, 0, 0, 0, f(No, false, "𥃲")},
+ {0x2f943, 0, 0, 0, f(No, false, "𥄙")},
+ {0x2f944, 0, 0, 0, f(No, false, "𥄳")},
+ {0x2f945, 0, 0, 0, f(No, false, "眞")},
+ {0x2f946, 0, 0, 0, f(No, false, "真")},
+ {0x2f948, 0, 0, 0, f(No, false, "睊")},
+ {0x2f949, 0, 0, 0, f(No, false, "䀹")},
+ {0x2f94a, 0, 0, 0, f(No, false, "瞋")},
+ {0x2f94b, 0, 0, 0, f(No, false, "䁆")},
+ {0x2f94c, 0, 0, 0, f(No, false, "䂖")},
+ {0x2f94d, 0, 0, 0, f(No, false, "𥐝")},
+ {0x2f94e, 0, 0, 0, f(No, false, "硎")},
+ {0x2f94f, 0, 0, 0, f(No, false, "碌")},
+ {0x2f950, 0, 0, 0, f(No, false, "磌")},
+ {0x2f951, 0, 0, 0, f(No, false, "䃣")},
+ {0x2f952, 0, 0, 0, f(No, false, "𥘦")},
+ {0x2f953, 0, 0, 0, f(No, false, "祖")},
+ {0x2f954, 0, 0, 0, f(No, false, "𥚚")},
+ {0x2f955, 0, 0, 0, f(No, false, "𥛅")},
+ {0x2f956, 0, 0, 0, f(No, false, "福")},
+ {0x2f957, 0, 0, 0, f(No, false, "秫")},
+ {0x2f958, 0, 0, 0, f(No, false, "䄯")},
+ {0x2f959, 0, 0, 0, f(No, false, "穀")},
+ {0x2f95a, 0, 0, 0, f(No, false, "穊")},
+ {0x2f95b, 0, 0, 0, f(No, false, "穏")},
+ {0x2f95c, 0, 0, 0, f(No, false, "𥥼")},
+ {0x2f95d, 0, 0, 0, f(No, false, "𥪧")},
+ {0x2f95f, 0, 0, 0, f(No, false, "竮")},
+ {0x2f960, 0, 0, 0, f(No, false, "䈂")},
+ {0x2f961, 0, 0, 0, f(No, false, "𥮫")},
+ {0x2f962, 0, 0, 0, f(No, false, "篆")},
+ {0x2f963, 0, 0, 0, f(No, false, "築")},
+ {0x2f964, 0, 0, 0, f(No, false, "䈧")},
+ {0x2f965, 0, 0, 0, f(No, false, "𥲀")},
+ {0x2f966, 0, 0, 0, f(No, false, "糒")},
+ {0x2f967, 0, 0, 0, f(No, false, "䊠")},
+ {0x2f968, 0, 0, 0, f(No, false, "糨")},
+ {0x2f969, 0, 0, 0, f(No, false, "糣")},
+ {0x2f96a, 0, 0, 0, f(No, false, "紀")},
+ {0x2f96b, 0, 0, 0, f(No, false, "𥾆")},
+ {0x2f96c, 0, 0, 0, f(No, false, "絣")},
+ {0x2f96d, 0, 0, 0, f(No, false, "䌁")},
+ {0x2f96e, 0, 0, 0, f(No, false, "緇")},
+ {0x2f96f, 0, 0, 0, f(No, false, "縂")},
+ {0x2f970, 0, 0, 0, f(No, false, "繅")},
+ {0x2f971, 0, 0, 0, f(No, false, "䌴")},
+ {0x2f972, 0, 0, 0, f(No, false, "𦈨")},
+ {0x2f973, 0, 0, 0, f(No, false, "𦉇")},
+ {0x2f974, 0, 0, 0, f(No, false, "䍙")},
+ {0x2f975, 0, 0, 0, f(No, false, "𦋙")},
+ {0x2f976, 0, 0, 0, f(No, false, "罺")},
+ {0x2f977, 0, 0, 0, f(No, false, "𦌾")},
+ {0x2f978, 0, 0, 0, f(No, false, "羕")},
+ {0x2f979, 0, 0, 0, f(No, false, "翺")},
+ {0x2f97a, 0, 0, 0, f(No, false, "者")},
+ {0x2f97b, 0, 0, 0, f(No, false, "𦓚")},
+ {0x2f97c, 0, 0, 0, f(No, false, "𦔣")},
+ {0x2f97d, 0, 0, 0, f(No, false, "聠")},
+ {0x2f97e, 0, 0, 0, f(No, false, "𦖨")},
+ {0x2f97f, 0, 0, 0, f(No, false, "聰")},
+ {0x2f980, 0, 0, 0, f(No, false, "𣍟")},
+ {0x2f981, 0, 0, 0, f(No, false, "䏕")},
+ {0x2f982, 0, 0, 0, f(No, false, "育")},
+ {0x2f983, 0, 0, 0, f(No, false, "脃")},
+ {0x2f984, 0, 0, 0, f(No, false, "䐋")},
+ {0x2f985, 0, 0, 0, f(No, false, "脾")},
+ {0x2f986, 0, 0, 0, f(No, false, "媵")},
+ {0x2f987, 0, 0, 0, f(No, false, "𦞧")},
+ {0x2f988, 0, 0, 0, f(No, false, "𦞵")},
+ {0x2f989, 0, 0, 0, f(No, false, "𣎓")},
+ {0x2f98a, 0, 0, 0, f(No, false, "𣎜")},
+ {0x2f98b, 0, 0, 0, f(No, false, "舁")},
+ {0x2f98c, 0, 0, 0, f(No, false, "舄")},
+ {0x2f98d, 0, 0, 0, f(No, false, "辞")},
+ {0x2f98e, 0, 0, 0, f(No, false, "䑫")},
+ {0x2f98f, 0, 0, 0, f(No, false, "芑")},
+ {0x2f990, 0, 0, 0, f(No, false, "芋")},
+ {0x2f991, 0, 0, 0, f(No, false, "芝")},
+ {0x2f992, 0, 0, 0, f(No, false, "劳")},
+ {0x2f993, 0, 0, 0, f(No, false, "花")},
+ {0x2f994, 0, 0, 0, f(No, false, "芳")},
+ {0x2f995, 0, 0, 0, f(No, false, "芽")},
+ {0x2f996, 0, 0, 0, f(No, false, "苦")},
+ {0x2f997, 0, 0, 0, f(No, false, "𦬼")},
+ {0x2f998, 0, 0, 0, f(No, false, "若")},
+ {0x2f999, 0, 0, 0, f(No, false, "茝")},
+ {0x2f99a, 0, 0, 0, f(No, false, "荣")},
+ {0x2f99b, 0, 0, 0, f(No, false, "莭")},
+ {0x2f99c, 0, 0, 0, f(No, false, "茣")},
+ {0x2f99d, 0, 0, 0, f(No, false, "莽")},
+ {0x2f99e, 0, 0, 0, f(No, false, "菧")},
+ {0x2f99f, 0, 0, 0, f(No, false, "著")},
+ {0x2f9a0, 0, 0, 0, f(No, false, "荓")},
+ {0x2f9a1, 0, 0, 0, f(No, false, "菊")},
+ {0x2f9a2, 0, 0, 0, f(No, false, "菌")},
+ {0x2f9a3, 0, 0, 0, f(No, false, "菜")},
+ {0x2f9a4, 0, 0, 0, f(No, false, "𦰶")},
+ {0x2f9a5, 0, 0, 0, f(No, false, "𦵫")},
+ {0x2f9a6, 0, 0, 0, f(No, false, "𦳕")},
+ {0x2f9a7, 0, 0, 0, f(No, false, "䔫")},
+ {0x2f9a8, 0, 0, 0, f(No, false, "蓱")},
+ {0x2f9a9, 0, 0, 0, f(No, false, "蓳")},
+ {0x2f9aa, 0, 0, 0, f(No, false, "蔖")},
+ {0x2f9ab, 0, 0, 0, f(No, false, "𧏊")},
+ {0x2f9ac, 0, 0, 0, f(No, false, "蕤")},
+ {0x2f9ad, 0, 0, 0, f(No, false, "𦼬")},
+ {0x2f9ae, 0, 0, 0, f(No, false, "䕝")},
+ {0x2f9af, 0, 0, 0, f(No, false, "䕡")},
+ {0x2f9b0, 0, 0, 0, f(No, false, "𦾱")},
+ {0x2f9b1, 0, 0, 0, f(No, false, "𧃒")},
+ {0x2f9b2, 0, 0, 0, f(No, false, "䕫")},
+ {0x2f9b3, 0, 0, 0, f(No, false, "虐")},
+ {0x2f9b4, 0, 0, 0, f(No, false, "虜")},
+ {0x2f9b5, 0, 0, 0, f(No, false, "虧")},
+ {0x2f9b6, 0, 0, 0, f(No, false, "虩")},
+ {0x2f9b7, 0, 0, 0, f(No, false, "蚩")},
+ {0x2f9b8, 0, 0, 0, f(No, false, "蚈")},
+ {0x2f9b9, 0, 0, 0, f(No, false, "蜎")},
+ {0x2f9ba, 0, 0, 0, f(No, false, "蛢")},
+ {0x2f9bb, 0, 0, 0, f(No, false, "蝹")},
+ {0x2f9bc, 0, 0, 0, f(No, false, "蜨")},
+ {0x2f9bd, 0, 0, 0, f(No, false, "蝫")},
+ {0x2f9be, 0, 0, 0, f(No, false, "螆")},
+ {0x2f9bf, 0, 0, 0, f(No, false, "䗗")},
+ {0x2f9c0, 0, 0, 0, f(No, false, "蟡")},
+ {0x2f9c1, 0, 0, 0, f(No, false, "蠁")},
+ {0x2f9c2, 0, 0, 0, f(No, false, "䗹")},
+ {0x2f9c3, 0, 0, 0, f(No, false, "衠")},
+ {0x2f9c4, 0, 0, 0, f(No, false, "衣")},
+ {0x2f9c5, 0, 0, 0, f(No, false, "𧙧")},
+ {0x2f9c6, 0, 0, 0, f(No, false, "裗")},
+ {0x2f9c7, 0, 0, 0, f(No, false, "裞")},
+ {0x2f9c8, 0, 0, 0, f(No, false, "䘵")},
+ {0x2f9c9, 0, 0, 0, f(No, false, "裺")},
+ {0x2f9ca, 0, 0, 0, f(No, false, "㒻")},
+ {0x2f9cb, 0, 0, 0, f(No, false, "𧢮")},
+ {0x2f9cc, 0, 0, 0, f(No, false, "𧥦")},
+ {0x2f9cd, 0, 0, 0, f(No, false, "䚾")},
+ {0x2f9ce, 0, 0, 0, f(No, false, "䛇")},
+ {0x2f9cf, 0, 0, 0, f(No, false, "誠")},
+ {0x2f9d0, 0, 0, 0, f(No, false, "諭")},
+ {0x2f9d1, 0, 0, 0, f(No, false, "變")},
+ {0x2f9d2, 0, 0, 0, f(No, false, "豕")},
+ {0x2f9d3, 0, 0, 0, f(No, false, "𧲨")},
+ {0x2f9d4, 0, 0, 0, f(No, false, "貫")},
+ {0x2f9d5, 0, 0, 0, f(No, false, "賁")},
+ {0x2f9d6, 0, 0, 0, f(No, false, "贛")},
+ {0x2f9d7, 0, 0, 0, f(No, false, "起")},
+ {0x2f9d8, 0, 0, 0, f(No, false, "𧼯")},
+ {0x2f9d9, 0, 0, 0, f(No, false, "𠠄")},
+ {0x2f9da, 0, 0, 0, f(No, false, "跋")},
+ {0x2f9db, 0, 0, 0, f(No, false, "趼")},
+ {0x2f9dc, 0, 0, 0, f(No, false, "跰")},
+ {0x2f9dd, 0, 0, 0, f(No, false, "𠣞")},
+ {0x2f9de, 0, 0, 0, f(No, false, "軔")},
+ {0x2f9df, 0, 0, 0, f(No, false, "輸")},
+ {0x2f9e0, 0, 0, 0, f(No, false, "𨗒")},
+ {0x2f9e1, 0, 0, 0, f(No, false, "𨗭")},
+ {0x2f9e2, 0, 0, 0, f(No, false, "邔")},
+ {0x2f9e3, 0, 0, 0, f(No, false, "郱")},
+ {0x2f9e4, 0, 0, 0, f(No, false, "鄑")},
+ {0x2f9e5, 0, 0, 0, f(No, false, "𨜮")},
+ {0x2f9e6, 0, 0, 0, f(No, false, "鄛")},
+ {0x2f9e7, 0, 0, 0, f(No, false, "鈸")},
+ {0x2f9e8, 0, 0, 0, f(No, false, "鋗")},
+ {0x2f9e9, 0, 0, 0, f(No, false, "鋘")},
+ {0x2f9ea, 0, 0, 0, f(No, false, "鉼")},
+ {0x2f9eb, 0, 0, 0, f(No, false, "鏹")},
+ {0x2f9ec, 0, 0, 0, f(No, false, "鐕")},
+ {0x2f9ed, 0, 0, 0, f(No, false, "𨯺")},
+ {0x2f9ee, 0, 0, 0, f(No, false, "開")},
+ {0x2f9ef, 0, 0, 0, f(No, false, "䦕")},
+ {0x2f9f0, 0, 0, 0, f(No, false, "閷")},
+ {0x2f9f1, 0, 0, 0, f(No, false, "𨵷")},
+ {0x2f9f2, 0, 0, 0, f(No, false, "䧦")},
+ {0x2f9f3, 0, 0, 0, f(No, false, "雃")},
+ {0x2f9f4, 0, 0, 0, f(No, false, "嶲")},
+ {0x2f9f5, 0, 0, 0, f(No, false, "霣")},
+ {0x2f9f6, 0, 0, 0, f(No, false, "𩅅")},
+ {0x2f9f7, 0, 0, 0, f(No, false, "𩈚")},
+ {0x2f9f8, 0, 0, 0, f(No, false, "䩮")},
+ {0x2f9f9, 0, 0, 0, f(No, false, "䩶")},
+ {0x2f9fa, 0, 0, 0, f(No, false, "韠")},
+ {0x2f9fb, 0, 0, 0, f(No, false, "𩐊")},
+ {0x2f9fc, 0, 0, 0, f(No, false, "䪲")},
+ {0x2f9fd, 0, 0, 0, f(No, false, "𩒖")},
+ {0x2f9fe, 0, 0, 0, f(No, false, "頋")},
+ {0x2fa00, 0, 0, 0, f(No, false, "頩")},
+ {0x2fa01, 0, 0, 0, f(No, false, "𩖶")},
+ {0x2fa02, 0, 0, 0, f(No, false, "飢")},
+ {0x2fa03, 0, 0, 0, f(No, false, "䬳")},
+ {0x2fa04, 0, 0, 0, f(No, false, "餩")},
+ {0x2fa05, 0, 0, 0, f(No, false, "馧")},
+ {0x2fa06, 0, 0, 0, f(No, false, "駂")},
+ {0x2fa07, 0, 0, 0, f(No, false, "駾")},
+ {0x2fa08, 0, 0, 0, f(No, false, "䯎")},
+ {0x2fa09, 0, 0, 0, f(No, false, "𩬰")},
+ {0x2fa0a, 0, 0, 0, f(No, false, "鬒")},
+ {0x2fa0b, 0, 0, 0, f(No, false, "鱀")},
+ {0x2fa0c, 0, 0, 0, f(No, false, "鳽")},
+ {0x2fa0d, 0, 0, 0, f(No, false, "䳎")},
+ {0x2fa0e, 0, 0, 0, f(No, false, "䳭")},
+ {0x2fa0f, 0, 0, 0, f(No, false, "鵧")},
+ {0x2fa10, 0, 0, 0, f(No, false, "𪃎")},
+ {0x2fa11, 0, 0, 0, f(No, false, "䳸")},
+ {0x2fa12, 0, 0, 0, f(No, false, "𪄅")},
+ {0x2fa13, 0, 0, 0, f(No, false, "𪈎")},
+ {0x2fa14, 0, 0, 0, f(No, false, "𪊑")},
+ {0x2fa15, 0, 0, 0, f(No, false, "麻")},
+ {0x2fa16, 0, 0, 0, f(No, false, "䵖")},
+ {0x2fa17, 0, 0, 0, f(No, false, "黹")},
+ {0x2fa18, 0, 0, 0, f(No, false, "黾")},
+ {0x2fa19, 0, 0, 0, f(No, false, "鼅")},
+ {0x2fa1a, 0, 0, 0, f(No, false, "鼏")},
+ {0x2fa1b, 0, 0, 0, f(No, false, "鼖")},
+ {0x2fa1c, 0, 0, 0, f(No, false, "鼻")},
+ {0x2fa1d, 0, 0, 0, f(No, false, "𪘀")},
+ {0x2fa1e, 0, 0, 0, f(Yes, false, "")},
+}
diff --git a/vendor/golang.org/x/text/unicode/norm/data9.0.0_test.go b/vendor/golang.org/x/text/unicode/norm/data9.0.0_test.go
new file mode 100644
index 0000000..b1be64d
--- /dev/null
+++ b/vendor/golang.org/x/text/unicode/norm/data9.0.0_test.go
@@ -0,0 +1,7409 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+// +build !go1.10
+
+package norm
+
+const (
+ Yes = iota
+ No
+ Maybe
+)
+
+type formData struct {
+ qc uint8
+ combinesForward bool
+ decomposition string
+}
+
+type runeData struct {
+ r rune
+ ccc uint8
+ nLead uint8
+ nTrail uint8
+ f [2]formData // 0: canonical; 1: compatibility
+}
+
+func f(qc uint8, cf bool, dec string) [2]formData {
+ return [2]formData{{qc, cf, dec}, {qc, cf, dec}}
+}
+
+func g(qc, qck uint8, cf, cfk bool, d, dk string) [2]formData {
+ return [2]formData{{qc, cf, d}, {qck, cfk, dk}}
+}
+
+var testData = []runeData{
+ {0x0, 0, 0, 0, f(Yes, false, "")},
+ {0x3c, 0, 0, 0, f(Yes, true, "")},
+ {0x3f, 0, 0, 0, f(Yes, false, "")},
+ {0x41, 0, 0, 0, f(Yes, true, "")},
+ {0x51, 0, 0, 0, f(Yes, false, "")},
+ {0x52, 0, 0, 0, f(Yes, true, "")},
+ {0x5b, 0, 0, 0, f(Yes, false, "")},
+ {0x61, 0, 0, 0, f(Yes, true, "")},
+ {0x71, 0, 0, 0, f(Yes, false, "")},
+ {0x72, 0, 0, 0, f(Yes, true, "")},
+ {0x7b, 0, 0, 0, f(Yes, false, "")},
+ {0xa0, 0, 0, 0, g(Yes, No, false, false, "", " ")},
+ {0xa1, 0, 0, 0, f(Yes, false, "")},
+ {0xa8, 0, 0, 1, g(Yes, No, true, false, "", " ̈")},
+ {0xa9, 0, 0, 0, f(Yes, false, "")},
+ {0xaa, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0xab, 0, 0, 0, f(Yes, false, "")},
+ {0xaf, 0, 0, 1, g(Yes, No, false, false, "", " ̄")},
+ {0xb0, 0, 0, 0, f(Yes, false, "")},
+ {0xb2, 0, 0, 0, g(Yes, No, false, false, "", "2")},
+ {0xb3, 0, 0, 0, g(Yes, No, false, false, "", "3")},
+ {0xb4, 0, 0, 1, g(Yes, No, false, false, "", " ́")},
+ {0xb5, 0, 0, 0, g(Yes, No, false, false, "", "μ")},
+ {0xb6, 0, 0, 0, f(Yes, false, "")},
+ {0xb8, 0, 0, 1, g(Yes, No, false, false, "", " ̧")},
+ {0xb9, 0, 0, 0, g(Yes, No, false, false, "", "1")},
+ {0xba, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0xbb, 0, 0, 0, f(Yes, false, "")},
+ {0xbc, 0, 0, 0, g(Yes, No, false, false, "", "1⁄4")},
+ {0xbd, 0, 0, 0, g(Yes, No, false, false, "", "1⁄2")},
+ {0xbe, 0, 0, 0, g(Yes, No, false, false, "", "3⁄4")},
+ {0xbf, 0, 0, 0, f(Yes, false, "")},
+ {0xc0, 0, 0, 1, f(Yes, false, "À")},
+ {0xc1, 0, 0, 1, f(Yes, false, "Á")},
+ {0xc2, 0, 0, 1, f(Yes, true, "Â")},
+ {0xc3, 0, 0, 1, f(Yes, false, "Ã")},
+ {0xc4, 0, 0, 1, f(Yes, true, "Ä")},
+ {0xc5, 0, 0, 1, f(Yes, true, "Å")},
+ {0xc6, 0, 0, 0, f(Yes, true, "")},
+ {0xc7, 0, 0, 1, f(Yes, true, "Ç")},
+ {0xc8, 0, 0, 1, f(Yes, false, "È")},
+ {0xc9, 0, 0, 1, f(Yes, false, "É")},
+ {0xca, 0, 0, 1, f(Yes, true, "Ê")},
+ {0xcb, 0, 0, 1, f(Yes, false, "Ë")},
+ {0xcc, 0, 0, 1, f(Yes, false, "Ì")},
+ {0xcd, 0, 0, 1, f(Yes, false, "Í")},
+ {0xce, 0, 0, 1, f(Yes, false, "Î")},
+ {0xcf, 0, 0, 1, f(Yes, true, "Ï")},
+ {0xd0, 0, 0, 0, f(Yes, false, "")},
+ {0xd1, 0, 0, 1, f(Yes, false, "Ñ")},
+ {0xd2, 0, 0, 1, f(Yes, false, "Ò")},
+ {0xd3, 0, 0, 1, f(Yes, false, "Ó")},
+ {0xd4, 0, 0, 1, f(Yes, true, "Ô")},
+ {0xd5, 0, 0, 1, f(Yes, true, "Õ")},
+ {0xd6, 0, 0, 1, f(Yes, true, "Ö")},
+ {0xd7, 0, 0, 0, f(Yes, false, "")},
+ {0xd8, 0, 0, 0, f(Yes, true, "")},
+ {0xd9, 0, 0, 1, f(Yes, false, "Ù")},
+ {0xda, 0, 0, 1, f(Yes, false, "Ú")},
+ {0xdb, 0, 0, 1, f(Yes, false, "Û")},
+ {0xdc, 0, 0, 1, f(Yes, true, "Ü")},
+ {0xdd, 0, 0, 1, f(Yes, false, "Ý")},
+ {0xde, 0, 0, 0, f(Yes, false, "")},
+ {0xe0, 0, 0, 1, f(Yes, false, "à")},
+ {0xe1, 0, 0, 1, f(Yes, false, "á")},
+ {0xe2, 0, 0, 1, f(Yes, true, "â")},
+ {0xe3, 0, 0, 1, f(Yes, false, "ã")},
+ {0xe4, 0, 0, 1, f(Yes, true, "ä")},
+ {0xe5, 0, 0, 1, f(Yes, true, "å")},
+ {0xe6, 0, 0, 0, f(Yes, true, "")},
+ {0xe7, 0, 0, 1, f(Yes, true, "ç")},
+ {0xe8, 0, 0, 1, f(Yes, false, "è")},
+ {0xe9, 0, 0, 1, f(Yes, false, "é")},
+ {0xea, 0, 0, 1, f(Yes, true, "ê")},
+ {0xeb, 0, 0, 1, f(Yes, false, "ë")},
+ {0xec, 0, 0, 1, f(Yes, false, "ì")},
+ {0xed, 0, 0, 1, f(Yes, false, "í")},
+ {0xee, 0, 0, 1, f(Yes, false, "î")},
+ {0xef, 0, 0, 1, f(Yes, true, "ï")},
+ {0xf0, 0, 0, 0, f(Yes, false, "")},
+ {0xf1, 0, 0, 1, f(Yes, false, "ñ")},
+ {0xf2, 0, 0, 1, f(Yes, false, "ò")},
+ {0xf3, 0, 0, 1, f(Yes, false, "ó")},
+ {0xf4, 0, 0, 1, f(Yes, true, "ô")},
+ {0xf5, 0, 0, 1, f(Yes, true, "õ")},
+ {0xf6, 0, 0, 1, f(Yes, true, "ö")},
+ {0xf7, 0, 0, 0, f(Yes, false, "")},
+ {0xf8, 0, 0, 0, f(Yes, true, "")},
+ {0xf9, 0, 0, 1, f(Yes, false, "ù")},
+ {0xfa, 0, 0, 1, f(Yes, false, "ú")},
+ {0xfb, 0, 0, 1, f(Yes, false, "û")},
+ {0xfc, 0, 0, 1, f(Yes, true, "ü")},
+ {0xfd, 0, 0, 1, f(Yes, false, "ý")},
+ {0xfe, 0, 0, 0, f(Yes, false, "")},
+ {0xff, 0, 0, 1, f(Yes, false, "ÿ")},
+ {0x100, 0, 0, 1, f(Yes, false, "Ā")},
+ {0x101, 0, 0, 1, f(Yes, false, "ā")},
+ {0x102, 0, 0, 1, f(Yes, true, "Ă")},
+ {0x103, 0, 0, 1, f(Yes, true, "ă")},
+ {0x104, 0, 0, 1, f(Yes, false, "Ą")},
+ {0x105, 0, 0, 1, f(Yes, false, "ą")},
+ {0x106, 0, 0, 1, f(Yes, false, "Ć")},
+ {0x107, 0, 0, 1, f(Yes, false, "ć")},
+ {0x108, 0, 0, 1, f(Yes, false, "Ĉ")},
+ {0x109, 0, 0, 1, f(Yes, false, "ĉ")},
+ {0x10a, 0, 0, 1, f(Yes, false, "Ċ")},
+ {0x10b, 0, 0, 1, f(Yes, false, "ċ")},
+ {0x10c, 0, 0, 1, f(Yes, false, "Č")},
+ {0x10d, 0, 0, 1, f(Yes, false, "č")},
+ {0x10e, 0, 0, 1, f(Yes, false, "Ď")},
+ {0x10f, 0, 0, 1, f(Yes, false, "ď")},
+ {0x110, 0, 0, 0, f(Yes, false, "")},
+ {0x112, 0, 0, 1, f(Yes, true, "Ē")},
+ {0x113, 0, 0, 1, f(Yes, true, "ē")},
+ {0x114, 0, 0, 1, f(Yes, false, "Ĕ")},
+ {0x115, 0, 0, 1, f(Yes, false, "ĕ")},
+ {0x116, 0, 0, 1, f(Yes, false, "Ė")},
+ {0x117, 0, 0, 1, f(Yes, false, "ė")},
+ {0x118, 0, 0, 1, f(Yes, false, "Ę")},
+ {0x119, 0, 0, 1, f(Yes, false, "ę")},
+ {0x11a, 0, 0, 1, f(Yes, false, "Ě")},
+ {0x11b, 0, 0, 1, f(Yes, false, "ě")},
+ {0x11c, 0, 0, 1, f(Yes, false, "Ĝ")},
+ {0x11d, 0, 0, 1, f(Yes, false, "ĝ")},
+ {0x11e, 0, 0, 1, f(Yes, false, "Ğ")},
+ {0x11f, 0, 0, 1, f(Yes, false, "ğ")},
+ {0x120, 0, 0, 1, f(Yes, false, "Ġ")},
+ {0x121, 0, 0, 1, f(Yes, false, "ġ")},
+ {0x122, 0, 0, 1, f(Yes, false, "Ģ")},
+ {0x123, 0, 0, 1, f(Yes, false, "ģ")},
+ {0x124, 0, 0, 1, f(Yes, false, "Ĥ")},
+ {0x125, 0, 0, 1, f(Yes, false, "ĥ")},
+ {0x126, 0, 0, 0, f(Yes, false, "")},
+ {0x128, 0, 0, 1, f(Yes, false, "Ĩ")},
+ {0x129, 0, 0, 1, f(Yes, false, "ĩ")},
+ {0x12a, 0, 0, 1, f(Yes, false, "Ī")},
+ {0x12b, 0, 0, 1, f(Yes, false, "ī")},
+ {0x12c, 0, 0, 1, f(Yes, false, "Ĭ")},
+ {0x12d, 0, 0, 1, f(Yes, false, "ĭ")},
+ {0x12e, 0, 0, 1, f(Yes, false, "Į")},
+ {0x12f, 0, 0, 1, f(Yes, false, "į")},
+ {0x130, 0, 0, 1, f(Yes, false, "İ")},
+ {0x131, 0, 0, 0, f(Yes, false, "")},
+ {0x132, 0, 0, 0, g(Yes, No, false, false, "", "IJ")},
+ {0x133, 0, 0, 0, g(Yes, No, false, false, "", "ij")},
+ {0x134, 0, 0, 1, f(Yes, false, "Ĵ")},
+ {0x135, 0, 0, 1, f(Yes, false, "ĵ")},
+ {0x136, 0, 0, 1, f(Yes, false, "Ķ")},
+ {0x137, 0, 0, 1, f(Yes, false, "ķ")},
+ {0x138, 0, 0, 0, f(Yes, false, "")},
+ {0x139, 0, 0, 1, f(Yes, false, "Ĺ")},
+ {0x13a, 0, 0, 1, f(Yes, false, "ĺ")},
+ {0x13b, 0, 0, 1, f(Yes, false, "Ļ")},
+ {0x13c, 0, 0, 1, f(Yes, false, "ļ")},
+ {0x13d, 0, 0, 1, f(Yes, false, "Ľ")},
+ {0x13e, 0, 0, 1, f(Yes, false, "ľ")},
+ {0x13f, 0, 0, 0, g(Yes, No, false, false, "", "L·")},
+ {0x140, 0, 0, 0, g(Yes, No, false, false, "", "l·")},
+ {0x141, 0, 0, 0, f(Yes, false, "")},
+ {0x143, 0, 0, 1, f(Yes, false, "Ń")},
+ {0x144, 0, 0, 1, f(Yes, false, "ń")},
+ {0x145, 0, 0, 1, f(Yes, false, "Ņ")},
+ {0x146, 0, 0, 1, f(Yes, false, "ņ")},
+ {0x147, 0, 0, 1, f(Yes, false, "Ň")},
+ {0x148, 0, 0, 1, f(Yes, false, "ň")},
+ {0x149, 0, 0, 0, g(Yes, No, false, false, "", "ʼn")},
+ {0x14a, 0, 0, 0, f(Yes, false, "")},
+ {0x14c, 0, 0, 1, f(Yes, true, "Ō")},
+ {0x14d, 0, 0, 1, f(Yes, true, "ō")},
+ {0x14e, 0, 0, 1, f(Yes, false, "Ŏ")},
+ {0x14f, 0, 0, 1, f(Yes, false, "ŏ")},
+ {0x150, 0, 0, 1, f(Yes, false, "Ő")},
+ {0x151, 0, 0, 1, f(Yes, false, "ő")},
+ {0x152, 0, 0, 0, f(Yes, false, "")},
+ {0x154, 0, 0, 1, f(Yes, false, "Ŕ")},
+ {0x155, 0, 0, 1, f(Yes, false, "ŕ")},
+ {0x156, 0, 0, 1, f(Yes, false, "Ŗ")},
+ {0x157, 0, 0, 1, f(Yes, false, "ŗ")},
+ {0x158, 0, 0, 1, f(Yes, false, "Ř")},
+ {0x159, 0, 0, 1, f(Yes, false, "ř")},
+ {0x15a, 0, 0, 1, f(Yes, true, "Ś")},
+ {0x15b, 0, 0, 1, f(Yes, true, "ś")},
+ {0x15c, 0, 0, 1, f(Yes, false, "Ŝ")},
+ {0x15d, 0, 0, 1, f(Yes, false, "ŝ")},
+ {0x15e, 0, 0, 1, f(Yes, false, "Ş")},
+ {0x15f, 0, 0, 1, f(Yes, false, "ş")},
+ {0x160, 0, 0, 1, f(Yes, true, "Š")},
+ {0x161, 0, 0, 1, f(Yes, true, "š")},
+ {0x162, 0, 0, 1, f(Yes, false, "Ţ")},
+ {0x163, 0, 0, 1, f(Yes, false, "ţ")},
+ {0x164, 0, 0, 1, f(Yes, false, "Ť")},
+ {0x165, 0, 0, 1, f(Yes, false, "ť")},
+ {0x166, 0, 0, 0, f(Yes, false, "")},
+ {0x168, 0, 0, 1, f(Yes, true, "Ũ")},
+ {0x169, 0, 0, 1, f(Yes, true, "ũ")},
+ {0x16a, 0, 0, 1, f(Yes, true, "Ū")},
+ {0x16b, 0, 0, 1, f(Yes, true, "ū")},
+ {0x16c, 0, 0, 1, f(Yes, false, "Ŭ")},
+ {0x16d, 0, 0, 1, f(Yes, false, "ŭ")},
+ {0x16e, 0, 0, 1, f(Yes, false, "Ů")},
+ {0x16f, 0, 0, 1, f(Yes, false, "ů")},
+ {0x170, 0, 0, 1, f(Yes, false, "Ű")},
+ {0x171, 0, 0, 1, f(Yes, false, "ű")},
+ {0x172, 0, 0, 1, f(Yes, false, "Ų")},
+ {0x173, 0, 0, 1, f(Yes, false, "ų")},
+ {0x174, 0, 0, 1, f(Yes, false, "Ŵ")},
+ {0x175, 0, 0, 1, f(Yes, false, "ŵ")},
+ {0x176, 0, 0, 1, f(Yes, false, "Ŷ")},
+ {0x177, 0, 0, 1, f(Yes, false, "ŷ")},
+ {0x178, 0, 0, 1, f(Yes, false, "Ÿ")},
+ {0x179, 0, 0, 1, f(Yes, false, "Ź")},
+ {0x17a, 0, 0, 1, f(Yes, false, "ź")},
+ {0x17b, 0, 0, 1, f(Yes, false, "Ż")},
+ {0x17c, 0, 0, 1, f(Yes, false, "ż")},
+ {0x17d, 0, 0, 1, f(Yes, false, "Ž")},
+ {0x17e, 0, 0, 1, f(Yes, false, "ž")},
+ {0x17f, 0, 0, 0, g(Yes, No, true, false, "", "s")},
+ {0x180, 0, 0, 0, f(Yes, false, "")},
+ {0x1a0, 0, 0, 1, f(Yes, true, "Ơ")},
+ {0x1a1, 0, 0, 1, f(Yes, true, "ơ")},
+ {0x1a2, 0, 0, 0, f(Yes, false, "")},
+ {0x1af, 0, 0, 1, f(Yes, true, "Ư")},
+ {0x1b0, 0, 0, 1, f(Yes, true, "ư")},
+ {0x1b1, 0, 0, 0, f(Yes, false, "")},
+ {0x1b7, 0, 0, 0, f(Yes, true, "")},
+ {0x1b8, 0, 0, 0, f(Yes, false, "")},
+ {0x1c4, 0, 0, 1, g(Yes, No, false, false, "", "DŽ")},
+ {0x1c5, 0, 0, 1, g(Yes, No, false, false, "", "Dž")},
+ {0x1c6, 0, 0, 1, g(Yes, No, false, false, "", "dž")},
+ {0x1c7, 0, 0, 0, g(Yes, No, false, false, "", "LJ")},
+ {0x1c8, 0, 0, 0, g(Yes, No, false, false, "", "Lj")},
+ {0x1c9, 0, 0, 0, g(Yes, No, false, false, "", "lj")},
+ {0x1ca, 0, 0, 0, g(Yes, No, false, false, "", "NJ")},
+ {0x1cb, 0, 0, 0, g(Yes, No, false, false, "", "Nj")},
+ {0x1cc, 0, 0, 0, g(Yes, No, false, false, "", "nj")},
+ {0x1cd, 0, 0, 1, f(Yes, false, "Ǎ")},
+ {0x1ce, 0, 0, 1, f(Yes, false, "ǎ")},
+ {0x1cf, 0, 0, 1, f(Yes, false, "Ǐ")},
+ {0x1d0, 0, 0, 1, f(Yes, false, "ǐ")},
+ {0x1d1, 0, 0, 1, f(Yes, false, "Ǒ")},
+ {0x1d2, 0, 0, 1, f(Yes, false, "ǒ")},
+ {0x1d3, 0, 0, 1, f(Yes, false, "Ǔ")},
+ {0x1d4, 0, 0, 1, f(Yes, false, "ǔ")},
+ {0x1d5, 0, 0, 2, f(Yes, false, "Ǖ")},
+ {0x1d6, 0, 0, 2, f(Yes, false, "ǖ")},
+ {0x1d7, 0, 0, 2, f(Yes, false, "Ǘ")},
+ {0x1d8, 0, 0, 2, f(Yes, false, "ǘ")},
+ {0x1d9, 0, 0, 2, f(Yes, false, "Ǚ")},
+ {0x1da, 0, 0, 2, f(Yes, false, "ǚ")},
+ {0x1db, 0, 0, 2, f(Yes, false, "Ǜ")},
+ {0x1dc, 0, 0, 2, f(Yes, false, "ǜ")},
+ {0x1dd, 0, 0, 0, f(Yes, false, "")},
+ {0x1de, 0, 0, 2, f(Yes, false, "Ǟ")},
+ {0x1df, 0, 0, 2, f(Yes, false, "ǟ")},
+ {0x1e0, 0, 0, 2, f(Yes, false, "Ǡ")},
+ {0x1e1, 0, 0, 2, f(Yes, false, "ǡ")},
+ {0x1e2, 0, 0, 1, f(Yes, false, "Ǣ")},
+ {0x1e3, 0, 0, 1, f(Yes, false, "ǣ")},
+ {0x1e4, 0, 0, 0, f(Yes, false, "")},
+ {0x1e6, 0, 0, 1, f(Yes, false, "Ǧ")},
+ {0x1e7, 0, 0, 1, f(Yes, false, "ǧ")},
+ {0x1e8, 0, 0, 1, f(Yes, false, "Ǩ")},
+ {0x1e9, 0, 0, 1, f(Yes, false, "ǩ")},
+ {0x1ea, 0, 0, 1, f(Yes, true, "Ǫ")},
+ {0x1eb, 0, 0, 1, f(Yes, true, "ǫ")},
+ {0x1ec, 0, 0, 2, f(Yes, false, "Ǭ")},
+ {0x1ed, 0, 0, 2, f(Yes, false, "ǭ")},
+ {0x1ee, 0, 0, 1, f(Yes, false, "Ǯ")},
+ {0x1ef, 0, 0, 1, f(Yes, false, "ǯ")},
+ {0x1f0, 0, 0, 1, f(Yes, false, "ǰ")},
+ {0x1f1, 0, 0, 0, g(Yes, No, false, false, "", "DZ")},
+ {0x1f2, 0, 0, 0, g(Yes, No, false, false, "", "Dz")},
+ {0x1f3, 0, 0, 0, g(Yes, No, false, false, "", "dz")},
+ {0x1f4, 0, 0, 1, f(Yes, false, "Ǵ")},
+ {0x1f5, 0, 0, 1, f(Yes, false, "ǵ")},
+ {0x1f6, 0, 0, 0, f(Yes, false, "")},
+ {0x1f8, 0, 0, 1, f(Yes, false, "Ǹ")},
+ {0x1f9, 0, 0, 1, f(Yes, false, "ǹ")},
+ {0x1fa, 0, 0, 2, f(Yes, false, "Ǻ")},
+ {0x1fb, 0, 0, 2, f(Yes, false, "ǻ")},
+ {0x1fc, 0, 0, 1, f(Yes, false, "Ǽ")},
+ {0x1fd, 0, 0, 1, f(Yes, false, "ǽ")},
+ {0x1fe, 0, 0, 1, f(Yes, false, "Ǿ")},
+ {0x1ff, 0, 0, 1, f(Yes, false, "ǿ")},
+ {0x200, 0, 0, 1, f(Yes, false, "Ȁ")},
+ {0x201, 0, 0, 1, f(Yes, false, "ȁ")},
+ {0x202, 0, 0, 1, f(Yes, false, "Ȃ")},
+ {0x203, 0, 0, 1, f(Yes, false, "ȃ")},
+ {0x204, 0, 0, 1, f(Yes, false, "Ȅ")},
+ {0x205, 0, 0, 1, f(Yes, false, "ȅ")},
+ {0x206, 0, 0, 1, f(Yes, false, "Ȇ")},
+ {0x207, 0, 0, 1, f(Yes, false, "ȇ")},
+ {0x208, 0, 0, 1, f(Yes, false, "Ȉ")},
+ {0x209, 0, 0, 1, f(Yes, false, "ȉ")},
+ {0x20a, 0, 0, 1, f(Yes, false, "Ȋ")},
+ {0x20b, 0, 0, 1, f(Yes, false, "ȋ")},
+ {0x20c, 0, 0, 1, f(Yes, false, "Ȍ")},
+ {0x20d, 0, 0, 1, f(Yes, false, "ȍ")},
+ {0x20e, 0, 0, 1, f(Yes, false, "Ȏ")},
+ {0x20f, 0, 0, 1, f(Yes, false, "ȏ")},
+ {0x210, 0, 0, 1, f(Yes, false, "Ȑ")},
+ {0x211, 0, 0, 1, f(Yes, false, "ȑ")},
+ {0x212, 0, 0, 1, f(Yes, false, "Ȓ")},
+ {0x213, 0, 0, 1, f(Yes, false, "ȓ")},
+ {0x214, 0, 0, 1, f(Yes, false, "Ȕ")},
+ {0x215, 0, 0, 1, f(Yes, false, "ȕ")},
+ {0x216, 0, 0, 1, f(Yes, false, "Ȗ")},
+ {0x217, 0, 0, 1, f(Yes, false, "ȗ")},
+ {0x218, 0, 0, 1, f(Yes, false, "Ș")},
+ {0x219, 0, 0, 1, f(Yes, false, "ș")},
+ {0x21a, 0, 0, 1, f(Yes, false, "Ț")},
+ {0x21b, 0, 0, 1, f(Yes, false, "ț")},
+ {0x21c, 0, 0, 0, f(Yes, false, "")},
+ {0x21e, 0, 0, 1, f(Yes, false, "Ȟ")},
+ {0x21f, 0, 0, 1, f(Yes, false, "ȟ")},
+ {0x220, 0, 0, 0, f(Yes, false, "")},
+ {0x226, 0, 0, 1, f(Yes, true, "Ȧ")},
+ {0x227, 0, 0, 1, f(Yes, true, "ȧ")},
+ {0x228, 0, 0, 1, f(Yes, true, "Ȩ")},
+ {0x229, 0, 0, 1, f(Yes, true, "ȩ")},
+ {0x22a, 0, 0, 2, f(Yes, false, "Ȫ")},
+ {0x22b, 0, 0, 2, f(Yes, false, "ȫ")},
+ {0x22c, 0, 0, 2, f(Yes, false, "Ȭ")},
+ {0x22d, 0, 0, 2, f(Yes, false, "ȭ")},
+ {0x22e, 0, 0, 1, f(Yes, true, "Ȯ")},
+ {0x22f, 0, 0, 1, f(Yes, true, "ȯ")},
+ {0x230, 0, 0, 2, f(Yes, false, "Ȱ")},
+ {0x231, 0, 0, 2, f(Yes, false, "ȱ")},
+ {0x232, 0, 0, 1, f(Yes, false, "Ȳ")},
+ {0x233, 0, 0, 1, f(Yes, false, "ȳ")},
+ {0x234, 0, 0, 0, f(Yes, false, "")},
+ {0x292, 0, 0, 0, f(Yes, true, "")},
+ {0x293, 0, 0, 0, f(Yes, false, "")},
+ {0x2b0, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x2b1, 0, 0, 0, g(Yes, No, false, false, "", "ɦ")},
+ {0x2b2, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x2b3, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x2b4, 0, 0, 0, g(Yes, No, false, false, "", "ɹ")},
+ {0x2b5, 0, 0, 0, g(Yes, No, false, false, "", "ɻ")},
+ {0x2b6, 0, 0, 0, g(Yes, No, false, false, "", "ʁ")},
+ {0x2b7, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x2b8, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x2b9, 0, 0, 0, f(Yes, false, "")},
+ {0x2d8, 0, 0, 1, g(Yes, No, false, false, "", " ̆")},
+ {0x2d9, 0, 0, 1, g(Yes, No, false, false, "", " ̇")},
+ {0x2da, 0, 0, 1, g(Yes, No, false, false, "", " ̊")},
+ {0x2db, 0, 0, 1, g(Yes, No, false, false, "", " ̨")},
+ {0x2dc, 0, 0, 1, g(Yes, No, false, false, "", " ̃")},
+ {0x2dd, 0, 0, 1, g(Yes, No, false, false, "", " ̋")},
+ {0x2de, 0, 0, 0, f(Yes, false, "")},
+ {0x2e0, 0, 0, 0, g(Yes, No, false, false, "", "ɣ")},
+ {0x2e1, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x2e2, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x2e3, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x2e4, 0, 0, 0, g(Yes, No, false, false, "", "ʕ")},
+ {0x2e5, 0, 0, 0, f(Yes, false, "")},
+ {0x300, 230, 1, 1, f(Maybe, false, "")},
+ {0x305, 230, 1, 1, f(Yes, false, "")},
+ {0x306, 230, 1, 1, f(Maybe, false, "")},
+ {0x30d, 230, 1, 1, f(Yes, false, "")},
+ {0x30f, 230, 1, 1, f(Maybe, false, "")},
+ {0x310, 230, 1, 1, f(Yes, false, "")},
+ {0x311, 230, 1, 1, f(Maybe, false, "")},
+ {0x312, 230, 1, 1, f(Yes, false, "")},
+ {0x313, 230, 1, 1, f(Maybe, false, "")},
+ {0x315, 232, 1, 1, f(Yes, false, "")},
+ {0x316, 220, 1, 1, f(Yes, false, "")},
+ {0x31a, 232, 1, 1, f(Yes, false, "")},
+ {0x31b, 216, 1, 1, f(Maybe, false, "")},
+ {0x31c, 220, 1, 1, f(Yes, false, "")},
+ {0x321, 202, 1, 1, f(Yes, false, "")},
+ {0x323, 220, 1, 1, f(Maybe, false, "")},
+ {0x327, 202, 1, 1, f(Maybe, false, "")},
+ {0x329, 220, 1, 1, f(Yes, false, "")},
+ {0x32d, 220, 1, 1, f(Maybe, false, "")},
+ {0x32f, 220, 1, 1, f(Yes, false, "")},
+ {0x330, 220, 1, 1, f(Maybe, false, "")},
+ {0x332, 220, 1, 1, f(Yes, false, "")},
+ {0x334, 1, 1, 1, f(Yes, false, "")},
+ {0x338, 1, 1, 1, f(Maybe, false, "")},
+ {0x339, 220, 1, 1, f(Yes, false, "")},
+ {0x33d, 230, 1, 1, f(Yes, false, "")},
+ {0x340, 230, 1, 1, f(No, false, "̀")},
+ {0x341, 230, 1, 1, f(No, false, "́")},
+ {0x342, 230, 1, 1, f(Maybe, false, "")},
+ {0x343, 230, 1, 1, f(No, false, "̓")},
+ {0x344, 230, 2, 2, f(No, false, "̈́")},
+ {0x345, 240, 1, 1, f(Maybe, false, "")},
+ {0x346, 230, 1, 1, f(Yes, false, "")},
+ {0x347, 220, 1, 1, f(Yes, false, "")},
+ {0x34a, 230, 1, 1, f(Yes, false, "")},
+ {0x34d, 220, 1, 1, f(Yes, false, "")},
+ {0x34f, 0, 0, 0, f(Yes, false, "")},
+ {0x350, 230, 1, 1, f(Yes, false, "")},
+ {0x353, 220, 1, 1, f(Yes, false, "")},
+ {0x357, 230, 1, 1, f(Yes, false, "")},
+ {0x358, 232, 1, 1, f(Yes, false, "")},
+ {0x359, 220, 1, 1, f(Yes, false, "")},
+ {0x35b, 230, 1, 1, f(Yes, false, "")},
+ {0x35c, 233, 1, 1, f(Yes, false, "")},
+ {0x35d, 234, 1, 1, f(Yes, false, "")},
+ {0x35f, 233, 1, 1, f(Yes, false, "")},
+ {0x360, 234, 1, 1, f(Yes, false, "")},
+ {0x362, 233, 1, 1, f(Yes, false, "")},
+ {0x363, 230, 1, 1, f(Yes, false, "")},
+ {0x370, 0, 0, 0, f(Yes, false, "")},
+ {0x374, 0, 0, 0, f(No, false, "ʹ")},
+ {0x375, 0, 0, 0, f(Yes, false, "")},
+ {0x37a, 0, 0, 1, g(Yes, No, false, false, "", " ͅ")},
+ {0x37b, 0, 0, 0, f(Yes, false, "")},
+ {0x37e, 0, 0, 0, f(No, false, ";")},
+ {0x37f, 0, 0, 0, f(Yes, false, "")},
+ {0x384, 0, 0, 1, g(Yes, No, false, false, "", " ́")},
+ {0x385, 0, 0, 2, g(Yes, No, false, false, "΅", " ̈́")},
+ {0x386, 0, 0, 1, f(Yes, false, "Ά")},
+ {0x387, 0, 0, 0, f(No, false, "·")},
+ {0x388, 0, 0, 1, f(Yes, false, "Έ")},
+ {0x389, 0, 0, 1, f(Yes, false, "Ή")},
+ {0x38a, 0, 0, 1, f(Yes, false, "Ί")},
+ {0x38b, 0, 0, 0, f(Yes, false, "")},
+ {0x38c, 0, 0, 1, f(Yes, false, "Ό")},
+ {0x38d, 0, 0, 0, f(Yes, false, "")},
+ {0x38e, 0, 0, 1, f(Yes, false, "Ύ")},
+ {0x38f, 0, 0, 1, f(Yes, false, "Ώ")},
+ {0x390, 0, 0, 2, f(Yes, false, "ΐ")},
+ {0x391, 0, 0, 0, f(Yes, true, "")},
+ {0x392, 0, 0, 0, f(Yes, false, "")},
+ {0x395, 0, 0, 0, f(Yes, true, "")},
+ {0x396, 0, 0, 0, f(Yes, false, "")},
+ {0x397, 0, 0, 0, f(Yes, true, "")},
+ {0x398, 0, 0, 0, f(Yes, false, "")},
+ {0x399, 0, 0, 0, f(Yes, true, "")},
+ {0x39a, 0, 0, 0, f(Yes, false, "")},
+ {0x39f, 0, 0, 0, f(Yes, true, "")},
+ {0x3a0, 0, 0, 0, f(Yes, false, "")},
+ {0x3a1, 0, 0, 0, f(Yes, true, "")},
+ {0x3a2, 0, 0, 0, f(Yes, false, "")},
+ {0x3a5, 0, 0, 0, f(Yes, true, "")},
+ {0x3a6, 0, 0, 0, f(Yes, false, "")},
+ {0x3a9, 0, 0, 0, f(Yes, true, "")},
+ {0x3aa, 0, 0, 1, f(Yes, false, "Ϊ")},
+ {0x3ab, 0, 0, 1, f(Yes, false, "Ϋ")},
+ {0x3ac, 0, 0, 1, f(Yes, true, "ά")},
+ {0x3ad, 0, 0, 1, f(Yes, false, "έ")},
+ {0x3ae, 0, 0, 1, f(Yes, true, "ή")},
+ {0x3af, 0, 0, 1, f(Yes, false, "ί")},
+ {0x3b0, 0, 0, 2, f(Yes, false, "ΰ")},
+ {0x3b1, 0, 0, 0, f(Yes, true, "")},
+ {0x3b2, 0, 0, 0, f(Yes, false, "")},
+ {0x3b5, 0, 0, 0, f(Yes, true, "")},
+ {0x3b6, 0, 0, 0, f(Yes, false, "")},
+ {0x3b7, 0, 0, 0, f(Yes, true, "")},
+ {0x3b8, 0, 0, 0, f(Yes, false, "")},
+ {0x3b9, 0, 0, 0, f(Yes, true, "")},
+ {0x3ba, 0, 0, 0, f(Yes, false, "")},
+ {0x3bf, 0, 0, 0, f(Yes, true, "")},
+ {0x3c0, 0, 0, 0, f(Yes, false, "")},
+ {0x3c1, 0, 0, 0, f(Yes, true, "")},
+ {0x3c2, 0, 0, 0, f(Yes, false, "")},
+ {0x3c5, 0, 0, 0, f(Yes, true, "")},
+ {0x3c6, 0, 0, 0, f(Yes, false, "")},
+ {0x3c9, 0, 0, 0, f(Yes, true, "")},
+ {0x3ca, 0, 0, 1, f(Yes, true, "ϊ")},
+ {0x3cb, 0, 0, 1, f(Yes, true, "ϋ")},
+ {0x3cc, 0, 0, 1, f(Yes, false, "ό")},
+ {0x3cd, 0, 0, 1, f(Yes, false, "ύ")},
+ {0x3ce, 0, 0, 1, f(Yes, true, "ώ")},
+ {0x3cf, 0, 0, 0, f(Yes, false, "")},
+ {0x3d0, 0, 0, 0, g(Yes, No, false, false, "", "β")},
+ {0x3d1, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x3d2, 0, 0, 0, g(Yes, No, true, false, "", "Υ")},
+ {0x3d3, 0, 0, 1, g(Yes, No, false, false, "ϓ", "Ύ")},
+ {0x3d4, 0, 0, 1, g(Yes, No, false, false, "ϔ", "Ϋ")},
+ {0x3d5, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x3d6, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x3d7, 0, 0, 0, f(Yes, false, "")},
+ {0x3f0, 0, 0, 0, g(Yes, No, false, false, "", "κ")},
+ {0x3f1, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x3f2, 0, 0, 0, g(Yes, No, false, false, "", "ς")},
+ {0x3f3, 0, 0, 0, f(Yes, false, "")},
+ {0x3f4, 0, 0, 0, g(Yes, No, false, false, "", "Θ")},
+ {0x3f5, 0, 0, 0, g(Yes, No, false, false, "", "ε")},
+ {0x3f6, 0, 0, 0, f(Yes, false, "")},
+ {0x3f9, 0, 0, 0, g(Yes, No, false, false, "", "Σ")},
+ {0x3fa, 0, 0, 0, f(Yes, false, "")},
+ {0x400, 0, 0, 1, f(Yes, false, "Ѐ")},
+ {0x401, 0, 0, 1, f(Yes, false, "Ё")},
+ {0x402, 0, 0, 0, f(Yes, false, "")},
+ {0x403, 0, 0, 1, f(Yes, false, "Ѓ")},
+ {0x404, 0, 0, 0, f(Yes, false, "")},
+ {0x406, 0, 0, 0, f(Yes, true, "")},
+ {0x407, 0, 0, 1, f(Yes, false, "Ї")},
+ {0x408, 0, 0, 0, f(Yes, false, "")},
+ {0x40c, 0, 0, 1, f(Yes, false, "Ќ")},
+ {0x40d, 0, 0, 1, f(Yes, false, "Ѝ")},
+ {0x40e, 0, 0, 1, f(Yes, false, "Ў")},
+ {0x40f, 0, 0, 0, f(Yes, false, "")},
+ {0x410, 0, 0, 0, f(Yes, true, "")},
+ {0x411, 0, 0, 0, f(Yes, false, "")},
+ {0x413, 0, 0, 0, f(Yes, true, "")},
+ {0x414, 0, 0, 0, f(Yes, false, "")},
+ {0x415, 0, 0, 0, f(Yes, true, "")},
+ {0x419, 0, 0, 1, f(Yes, false, "Й")},
+ {0x41a, 0, 0, 0, f(Yes, true, "")},
+ {0x41b, 0, 0, 0, f(Yes, false, "")},
+ {0x41e, 0, 0, 0, f(Yes, true, "")},
+ {0x41f, 0, 0, 0, f(Yes, false, "")},
+ {0x423, 0, 0, 0, f(Yes, true, "")},
+ {0x424, 0, 0, 0, f(Yes, false, "")},
+ {0x427, 0, 0, 0, f(Yes, true, "")},
+ {0x428, 0, 0, 0, f(Yes, false, "")},
+ {0x42b, 0, 0, 0, f(Yes, true, "")},
+ {0x42c, 0, 0, 0, f(Yes, false, "")},
+ {0x42d, 0, 0, 0, f(Yes, true, "")},
+ {0x42e, 0, 0, 0, f(Yes, false, "")},
+ {0x430, 0, 0, 0, f(Yes, true, "")},
+ {0x431, 0, 0, 0, f(Yes, false, "")},
+ {0x433, 0, 0, 0, f(Yes, true, "")},
+ {0x434, 0, 0, 0, f(Yes, false, "")},
+ {0x435, 0, 0, 0, f(Yes, true, "")},
+ {0x439, 0, 0, 1, f(Yes, false, "й")},
+ {0x43a, 0, 0, 0, f(Yes, true, "")},
+ {0x43b, 0, 0, 0, f(Yes, false, "")},
+ {0x43e, 0, 0, 0, f(Yes, true, "")},
+ {0x43f, 0, 0, 0, f(Yes, false, "")},
+ {0x443, 0, 0, 0, f(Yes, true, "")},
+ {0x444, 0, 0, 0, f(Yes, false, "")},
+ {0x447, 0, 0, 0, f(Yes, true, "")},
+ {0x448, 0, 0, 0, f(Yes, false, "")},
+ {0x44b, 0, 0, 0, f(Yes, true, "")},
+ {0x44c, 0, 0, 0, f(Yes, false, "")},
+ {0x44d, 0, 0, 0, f(Yes, true, "")},
+ {0x44e, 0, 0, 0, f(Yes, false, "")},
+ {0x450, 0, 0, 1, f(Yes, false, "ѐ")},
+ {0x451, 0, 0, 1, f(Yes, false, "ё")},
+ {0x452, 0, 0, 0, f(Yes, false, "")},
+ {0x453, 0, 0, 1, f(Yes, false, "ѓ")},
+ {0x454, 0, 0, 0, f(Yes, false, "")},
+ {0x456, 0, 0, 0, f(Yes, true, "")},
+ {0x457, 0, 0, 1, f(Yes, false, "ї")},
+ {0x458, 0, 0, 0, f(Yes, false, "")},
+ {0x45c, 0, 0, 1, f(Yes, false, "ќ")},
+ {0x45d, 0, 0, 1, f(Yes, false, "ѝ")},
+ {0x45e, 0, 0, 1, f(Yes, false, "ў")},
+ {0x45f, 0, 0, 0, f(Yes, false, "")},
+ {0x474, 0, 0, 0, f(Yes, true, "")},
+ {0x476, 0, 0, 1, f(Yes, false, "Ѷ")},
+ {0x477, 0, 0, 1, f(Yes, false, "ѷ")},
+ {0x478, 0, 0, 0, f(Yes, false, "")},
+ {0x483, 230, 1, 1, f(Yes, false, "")},
+ {0x488, 0, 0, 0, f(Yes, false, "")},
+ {0x4c1, 0, 0, 1, f(Yes, false, "Ӂ")},
+ {0x4c2, 0, 0, 1, f(Yes, false, "ӂ")},
+ {0x4c3, 0, 0, 0, f(Yes, false, "")},
+ {0x4d0, 0, 0, 1, f(Yes, false, "Ӑ")},
+ {0x4d1, 0, 0, 1, f(Yes, false, "ӑ")},
+ {0x4d2, 0, 0, 1, f(Yes, false, "Ӓ")},
+ {0x4d3, 0, 0, 1, f(Yes, false, "ӓ")},
+ {0x4d4, 0, 0, 0, f(Yes, false, "")},
+ {0x4d6, 0, 0, 1, f(Yes, false, "Ӗ")},
+ {0x4d7, 0, 0, 1, f(Yes, false, "ӗ")},
+ {0x4d8, 0, 0, 0, f(Yes, true, "")},
+ {0x4da, 0, 0, 1, f(Yes, false, "Ӛ")},
+ {0x4db, 0, 0, 1, f(Yes, false, "ӛ")},
+ {0x4dc, 0, 0, 1, f(Yes, false, "Ӝ")},
+ {0x4dd, 0, 0, 1, f(Yes, false, "ӝ")},
+ {0x4de, 0, 0, 1, f(Yes, false, "Ӟ")},
+ {0x4df, 0, 0, 1, f(Yes, false, "ӟ")},
+ {0x4e0, 0, 0, 0, f(Yes, false, "")},
+ {0x4e2, 0, 0, 1, f(Yes, false, "Ӣ")},
+ {0x4e3, 0, 0, 1, f(Yes, false, "ӣ")},
+ {0x4e4, 0, 0, 1, f(Yes, false, "Ӥ")},
+ {0x4e5, 0, 0, 1, f(Yes, false, "ӥ")},
+ {0x4e6, 0, 0, 1, f(Yes, false, "Ӧ")},
+ {0x4e7, 0, 0, 1, f(Yes, false, "ӧ")},
+ {0x4e8, 0, 0, 0, f(Yes, true, "")},
+ {0x4ea, 0, 0, 1, f(Yes, false, "Ӫ")},
+ {0x4eb, 0, 0, 1, f(Yes, false, "ӫ")},
+ {0x4ec, 0, 0, 1, f(Yes, false, "Ӭ")},
+ {0x4ed, 0, 0, 1, f(Yes, false, "ӭ")},
+ {0x4ee, 0, 0, 1, f(Yes, false, "Ӯ")},
+ {0x4ef, 0, 0, 1, f(Yes, false, "ӯ")},
+ {0x4f0, 0, 0, 1, f(Yes, false, "Ӱ")},
+ {0x4f1, 0, 0, 1, f(Yes, false, "ӱ")},
+ {0x4f2, 0, 0, 1, f(Yes, false, "Ӳ")},
+ {0x4f3, 0, 0, 1, f(Yes, false, "ӳ")},
+ {0x4f4, 0, 0, 1, f(Yes, false, "Ӵ")},
+ {0x4f5, 0, 0, 1, f(Yes, false, "ӵ")},
+ {0x4f6, 0, 0, 0, f(Yes, false, "")},
+ {0x4f8, 0, 0, 1, f(Yes, false, "Ӹ")},
+ {0x4f9, 0, 0, 1, f(Yes, false, "ӹ")},
+ {0x4fa, 0, 0, 0, f(Yes, false, "")},
+ {0x587, 0, 0, 0, g(Yes, No, false, false, "", "եւ")},
+ {0x588, 0, 0, 0, f(Yes, false, "")},
+ {0x591, 220, 1, 1, f(Yes, false, "")},
+ {0x592, 230, 1, 1, f(Yes, false, "")},
+ {0x596, 220, 1, 1, f(Yes, false, "")},
+ {0x597, 230, 1, 1, f(Yes, false, "")},
+ {0x59a, 222, 1, 1, f(Yes, false, "")},
+ {0x59b, 220, 1, 1, f(Yes, false, "")},
+ {0x59c, 230, 1, 1, f(Yes, false, "")},
+ {0x5a2, 220, 1, 1, f(Yes, false, "")},
+ {0x5a8, 230, 1, 1, f(Yes, false, "")},
+ {0x5aa, 220, 1, 1, f(Yes, false, "")},
+ {0x5ab, 230, 1, 1, f(Yes, false, "")},
+ {0x5ad, 222, 1, 1, f(Yes, false, "")},
+ {0x5ae, 228, 1, 1, f(Yes, false, "")},
+ {0x5af, 230, 1, 1, f(Yes, false, "")},
+ {0x5b0, 10, 1, 1, f(Yes, false, "")},
+ {0x5b1, 11, 1, 1, f(Yes, false, "")},
+ {0x5b2, 12, 1, 1, f(Yes, false, "")},
+ {0x5b3, 13, 1, 1, f(Yes, false, "")},
+ {0x5b4, 14, 1, 1, f(Yes, false, "")},
+ {0x5b5, 15, 1, 1, f(Yes, false, "")},
+ {0x5b6, 16, 1, 1, f(Yes, false, "")},
+ {0x5b7, 17, 1, 1, f(Yes, false, "")},
+ {0x5b8, 18, 1, 1, f(Yes, false, "")},
+ {0x5b9, 19, 1, 1, f(Yes, false, "")},
+ {0x5bb, 20, 1, 1, f(Yes, false, "")},
+ {0x5bc, 21, 1, 1, f(Yes, false, "")},
+ {0x5bd, 22, 1, 1, f(Yes, false, "")},
+ {0x5be, 0, 0, 0, f(Yes, false, "")},
+ {0x5bf, 23, 1, 1, f(Yes, false, "")},
+ {0x5c0, 0, 0, 0, f(Yes, false, "")},
+ {0x5c1, 24, 1, 1, f(Yes, false, "")},
+ {0x5c2, 25, 1, 1, f(Yes, false, "")},
+ {0x5c3, 0, 0, 0, f(Yes, false, "")},
+ {0x5c4, 230, 1, 1, f(Yes, false, "")},
+ {0x5c5, 220, 1, 1, f(Yes, false, "")},
+ {0x5c6, 0, 0, 0, f(Yes, false, "")},
+ {0x5c7, 18, 1, 1, f(Yes, false, "")},
+ {0x5c8, 0, 0, 0, f(Yes, false, "")},
+ {0x610, 230, 1, 1, f(Yes, false, "")},
+ {0x618, 30, 1, 1, f(Yes, false, "")},
+ {0x619, 31, 1, 1, f(Yes, false, "")},
+ {0x61a, 32, 1, 1, f(Yes, false, "")},
+ {0x61b, 0, 0, 0, f(Yes, false, "")},
+ {0x622, 0, 0, 1, f(Yes, false, "آ")},
+ {0x623, 0, 0, 1, f(Yes, false, "أ")},
+ {0x624, 0, 0, 1, f(Yes, false, "ؤ")},
+ {0x625, 0, 0, 1, f(Yes, false, "إ")},
+ {0x626, 0, 0, 1, f(Yes, false, "ئ")},
+ {0x627, 0, 0, 0, f(Yes, true, "")},
+ {0x628, 0, 0, 0, f(Yes, false, "")},
+ {0x648, 0, 0, 0, f(Yes, true, "")},
+ {0x649, 0, 0, 0, f(Yes, false, "")},
+ {0x64a, 0, 0, 0, f(Yes, true, "")},
+ {0x64b, 27, 1, 1, f(Yes, false, "")},
+ {0x64c, 28, 1, 1, f(Yes, false, "")},
+ {0x64d, 29, 1, 1, f(Yes, false, "")},
+ {0x64e, 30, 1, 1, f(Yes, false, "")},
+ {0x64f, 31, 1, 1, f(Yes, false, "")},
+ {0x650, 32, 1, 1, f(Yes, false, "")},
+ {0x651, 33, 1, 1, f(Yes, false, "")},
+ {0x652, 34, 1, 1, f(Yes, false, "")},
+ {0x653, 230, 1, 1, f(Maybe, false, "")},
+ {0x655, 220, 1, 1, f(Maybe, false, "")},
+ {0x656, 220, 1, 1, f(Yes, false, "")},
+ {0x657, 230, 1, 1, f(Yes, false, "")},
+ {0x65c, 220, 1, 1, f(Yes, false, "")},
+ {0x65d, 230, 1, 1, f(Yes, false, "")},
+ {0x65f, 220, 1, 1, f(Yes, false, "")},
+ {0x660, 0, 0, 0, f(Yes, false, "")},
+ {0x670, 35, 1, 1, f(Yes, false, "")},
+ {0x671, 0, 0, 0, f(Yes, false, "")},
+ {0x675, 0, 0, 0, g(Yes, No, false, false, "", "اٴ")},
+ {0x676, 0, 0, 0, g(Yes, No, false, false, "", "وٴ")},
+ {0x677, 0, 0, 0, g(Yes, No, false, false, "", "ۇٴ")},
+ {0x678, 0, 0, 0, g(Yes, No, false, false, "", "يٴ")},
+ {0x679, 0, 0, 0, f(Yes, false, "")},
+ {0x6c0, 0, 0, 1, f(Yes, false, "ۀ")},
+ {0x6c1, 0, 0, 0, f(Yes, true, "")},
+ {0x6c2, 0, 0, 1, f(Yes, false, "ۂ")},
+ {0x6c3, 0, 0, 0, f(Yes, false, "")},
+ {0x6d2, 0, 0, 0, f(Yes, true, "")},
+ {0x6d3, 0, 0, 1, f(Yes, false, "ۓ")},
+ {0x6d4, 0, 0, 0, f(Yes, false, "")},
+ {0x6d5, 0, 0, 0, f(Yes, true, "")},
+ {0x6d6, 230, 1, 1, f(Yes, false, "")},
+ {0x6dd, 0, 0, 0, f(Yes, false, "")},
+ {0x6df, 230, 1, 1, f(Yes, false, "")},
+ {0x6e3, 220, 1, 1, f(Yes, false, "")},
+ {0x6e4, 230, 1, 1, f(Yes, false, "")},
+ {0x6e5, 0, 0, 0, f(Yes, false, "")},
+ {0x6e7, 230, 1, 1, f(Yes, false, "")},
+ {0x6e9, 0, 0, 0, f(Yes, false, "")},
+ {0x6ea, 220, 1, 1, f(Yes, false, "")},
+ {0x6eb, 230, 1, 1, f(Yes, false, "")},
+ {0x6ed, 220, 1, 1, f(Yes, false, "")},
+ {0x6ee, 0, 0, 0, f(Yes, false, "")},
+ {0x711, 36, 1, 1, f(Yes, false, "")},
+ {0x712, 0, 0, 0, f(Yes, false, "")},
+ {0x730, 230, 1, 1, f(Yes, false, "")},
+ {0x731, 220, 1, 1, f(Yes, false, "")},
+ {0x732, 230, 1, 1, f(Yes, false, "")},
+ {0x734, 220, 1, 1, f(Yes, false, "")},
+ {0x735, 230, 1, 1, f(Yes, false, "")},
+ {0x737, 220, 1, 1, f(Yes, false, "")},
+ {0x73a, 230, 1, 1, f(Yes, false, "")},
+ {0x73b, 220, 1, 1, f(Yes, false, "")},
+ {0x73d, 230, 1, 1, f(Yes, false, "")},
+ {0x73e, 220, 1, 1, f(Yes, false, "")},
+ {0x73f, 230, 1, 1, f(Yes, false, "")},
+ {0x742, 220, 1, 1, f(Yes, false, "")},
+ {0x743, 230, 1, 1, f(Yes, false, "")},
+ {0x744, 220, 1, 1, f(Yes, false, "")},
+ {0x745, 230, 1, 1, f(Yes, false, "")},
+ {0x746, 220, 1, 1, f(Yes, false, "")},
+ {0x747, 230, 1, 1, f(Yes, false, "")},
+ {0x748, 220, 1, 1, f(Yes, false, "")},
+ {0x749, 230, 1, 1, f(Yes, false, "")},
+ {0x74b, 0, 0, 0, f(Yes, false, "")},
+ {0x7eb, 230, 1, 1, f(Yes, false, "")},
+ {0x7f2, 220, 1, 1, f(Yes, false, "")},
+ {0x7f3, 230, 1, 1, f(Yes, false, "")},
+ {0x7f4, 0, 0, 0, f(Yes, false, "")},
+ {0x816, 230, 1, 1, f(Yes, false, "")},
+ {0x81a, 0, 0, 0, f(Yes, false, "")},
+ {0x81b, 230, 1, 1, f(Yes, false, "")},
+ {0x824, 0, 0, 0, f(Yes, false, "")},
+ {0x825, 230, 1, 1, f(Yes, false, "")},
+ {0x828, 0, 0, 0, f(Yes, false, "")},
+ {0x829, 230, 1, 1, f(Yes, false, "")},
+ {0x82e, 0, 0, 0, f(Yes, false, "")},
+ {0x859, 220, 1, 1, f(Yes, false, "")},
+ {0x85c, 0, 0, 0, f(Yes, false, "")},
+ {0x8d4, 230, 1, 1, f(Yes, false, "")},
+ {0x8e2, 0, 0, 0, f(Yes, false, "")},
+ {0x8e3, 220, 1, 1, f(Yes, false, "")},
+ {0x8e4, 230, 1, 1, f(Yes, false, "")},
+ {0x8e6, 220, 1, 1, f(Yes, false, "")},
+ {0x8e7, 230, 1, 1, f(Yes, false, "")},
+ {0x8e9, 220, 1, 1, f(Yes, false, "")},
+ {0x8ea, 230, 1, 1, f(Yes, false, "")},
+ {0x8ed, 220, 1, 1, f(Yes, false, "")},
+ {0x8f0, 27, 1, 1, f(Yes, false, "")},
+ {0x8f1, 28, 1, 1, f(Yes, false, "")},
+ {0x8f2, 29, 1, 1, f(Yes, false, "")},
+ {0x8f3, 230, 1, 1, f(Yes, false, "")},
+ {0x8f6, 220, 1, 1, f(Yes, false, "")},
+ {0x8f7, 230, 1, 1, f(Yes, false, "")},
+ {0x8f9, 220, 1, 1, f(Yes, false, "")},
+ {0x8fb, 230, 1, 1, f(Yes, false, "")},
+ {0x900, 0, 0, 0, f(Yes, false, "")},
+ {0x928, 0, 0, 0, f(Yes, true, "")},
+ {0x929, 0, 0, 1, f(Yes, false, "ऩ")},
+ {0x92a, 0, 0, 0, f(Yes, false, "")},
+ {0x930, 0, 0, 0, f(Yes, true, "")},
+ {0x931, 0, 0, 1, f(Yes, false, "ऱ")},
+ {0x932, 0, 0, 0, f(Yes, false, "")},
+ {0x933, 0, 0, 0, f(Yes, true, "")},
+ {0x934, 0, 0, 1, f(Yes, false, "ऴ")},
+ {0x935, 0, 0, 0, f(Yes, false, "")},
+ {0x93c, 7, 1, 1, f(Maybe, false, "")},
+ {0x93d, 0, 0, 0, f(Yes, false, "")},
+ {0x94d, 9, 1, 1, f(Yes, false, "")},
+ {0x94e, 0, 0, 0, f(Yes, false, "")},
+ {0x951, 230, 1, 1, f(Yes, false, "")},
+ {0x952, 220, 1, 1, f(Yes, false, "")},
+ {0x953, 230, 1, 1, f(Yes, false, "")},
+ {0x955, 0, 0, 0, f(Yes, false, "")},
+ {0x958, 0, 0, 1, f(No, false, "क़")},
+ {0x959, 0, 0, 1, f(No, false, "ख़")},
+ {0x95a, 0, 0, 1, f(No, false, "ग़")},
+ {0x95b, 0, 0, 1, f(No, false, "ज़")},
+ {0x95c, 0, 0, 1, f(No, false, "ड़")},
+ {0x95d, 0, 0, 1, f(No, false, "ढ़")},
+ {0x95e, 0, 0, 1, f(No, false, "फ़")},
+ {0x95f, 0, 0, 1, f(No, false, "य़")},
+ {0x960, 0, 0, 0, f(Yes, false, "")},
+ {0x9bc, 7, 1, 1, f(Yes, false, "")},
+ {0x9bd, 0, 0, 0, f(Yes, false, "")},
+ {0x9be, 0, 1, 1, f(Maybe, false, "")},
+ {0x9bf, 0, 0, 0, f(Yes, false, "")},
+ {0x9c7, 0, 0, 0, f(Yes, true, "")},
+ {0x9c8, 0, 0, 0, f(Yes, false, "")},
+ {0x9cb, 0, 0, 1, f(Yes, false, "ো")},
+ {0x9cc, 0, 0, 1, f(Yes, false, "ৌ")},
+ {0x9cd, 9, 1, 1, f(Yes, false, "")},
+ {0x9ce, 0, 0, 0, f(Yes, false, "")},
+ {0x9d7, 0, 1, 1, f(Maybe, false, "")},
+ {0x9d8, 0, 0, 0, f(Yes, false, "")},
+ {0x9dc, 0, 0, 1, f(No, false, "ড়")},
+ {0x9dd, 0, 0, 1, f(No, false, "ঢ়")},
+ {0x9de, 0, 0, 0, f(Yes, false, "")},
+ {0x9df, 0, 0, 1, f(No, false, "য়")},
+ {0x9e0, 0, 0, 0, f(Yes, false, "")},
+ {0xa33, 0, 0, 1, f(No, false, "ਲ਼")},
+ {0xa34, 0, 0, 0, f(Yes, false, "")},
+ {0xa36, 0, 0, 1, f(No, false, "ਸ਼")},
+ {0xa37, 0, 0, 0, f(Yes, false, "")},
+ {0xa3c, 7, 1, 1, f(Yes, false, "")},
+ {0xa3d, 0, 0, 0, f(Yes, false, "")},
+ {0xa4d, 9, 1, 1, f(Yes, false, "")},
+ {0xa4e, 0, 0, 0, f(Yes, false, "")},
+ {0xa59, 0, 0, 1, f(No, false, "ਖ਼")},
+ {0xa5a, 0, 0, 1, f(No, false, "ਗ਼")},
+ {0xa5b, 0, 0, 1, f(No, false, "ਜ਼")},
+ {0xa5c, 0, 0, 0, f(Yes, false, "")},
+ {0xa5e, 0, 0, 1, f(No, false, "ਫ਼")},
+ {0xa5f, 0, 0, 0, f(Yes, false, "")},
+ {0xabc, 7, 1, 1, f(Yes, false, "")},
+ {0xabd, 0, 0, 0, f(Yes, false, "")},
+ {0xacd, 9, 1, 1, f(Yes, false, "")},
+ {0xace, 0, 0, 0, f(Yes, false, "")},
+ {0xb3c, 7, 1, 1, f(Yes, false, "")},
+ {0xb3d, 0, 0, 0, f(Yes, false, "")},
+ {0xb3e, 0, 1, 1, f(Maybe, false, "")},
+ {0xb3f, 0, 0, 0, f(Yes, false, "")},
+ {0xb47, 0, 0, 0, f(Yes, true, "")},
+ {0xb48, 0, 0, 1, f(Yes, false, "ୈ")},
+ {0xb49, 0, 0, 0, f(Yes, false, "")},
+ {0xb4b, 0, 0, 1, f(Yes, false, "ୋ")},
+ {0xb4c, 0, 0, 1, f(Yes, false, "ୌ")},
+ {0xb4d, 9, 1, 1, f(Yes, false, "")},
+ {0xb4e, 0, 0, 0, f(Yes, false, "")},
+ {0xb56, 0, 1, 1, f(Maybe, false, "")},
+ {0xb58, 0, 0, 0, f(Yes, false, "")},
+ {0xb5c, 0, 0, 1, f(No, false, "ଡ଼")},
+ {0xb5d, 0, 0, 1, f(No, false, "ଢ଼")},
+ {0xb5e, 0, 0, 0, f(Yes, false, "")},
+ {0xb92, 0, 0, 0, f(Yes, true, "")},
+ {0xb93, 0, 0, 0, f(Yes, false, "")},
+ {0xb94, 0, 0, 1, f(Yes, false, "ஔ")},
+ {0xb95, 0, 0, 0, f(Yes, false, "")},
+ {0xbbe, 0, 1, 1, f(Maybe, false, "")},
+ {0xbbf, 0, 0, 0, f(Yes, false, "")},
+ {0xbc6, 0, 0, 0, f(Yes, true, "")},
+ {0xbc8, 0, 0, 0, f(Yes, false, "")},
+ {0xbca, 0, 0, 1, f(Yes, false, "ொ")},
+ {0xbcb, 0, 0, 1, f(Yes, false, "ோ")},
+ {0xbcc, 0, 0, 1, f(Yes, false, "ௌ")},
+ {0xbcd, 9, 1, 1, f(Yes, false, "")},
+ {0xbce, 0, 0, 0, f(Yes, false, "")},
+ {0xbd7, 0, 1, 1, f(Maybe, false, "")},
+ {0xbd8, 0, 0, 0, f(Yes, false, "")},
+ {0xc46, 0, 0, 0, f(Yes, true, "")},
+ {0xc47, 0, 0, 0, f(Yes, false, "")},
+ {0xc48, 0, 0, 1, f(Yes, false, "ై")},
+ {0xc49, 0, 0, 0, f(Yes, false, "")},
+ {0xc4d, 9, 1, 1, f(Yes, false, "")},
+ {0xc4e, 0, 0, 0, f(Yes, false, "")},
+ {0xc55, 84, 1, 1, f(Yes, false, "")},
+ {0xc56, 91, 1, 1, f(Maybe, false, "")},
+ {0xc57, 0, 0, 0, f(Yes, false, "")},
+ {0xcbc, 7, 1, 1, f(Yes, false, "")},
+ {0xcbd, 0, 0, 0, f(Yes, false, "")},
+ {0xcbf, 0, 0, 0, f(Yes, true, "")},
+ {0xcc0, 0, 0, 1, f(Yes, false, "ೀ")},
+ {0xcc1, 0, 0, 0, f(Yes, false, "")},
+ {0xcc2, 0, 1, 1, f(Maybe, false, "")},
+ {0xcc3, 0, 0, 0, f(Yes, false, "")},
+ {0xcc6, 0, 0, 0, f(Yes, true, "")},
+ {0xcc7, 0, 0, 1, f(Yes, false, "ೇ")},
+ {0xcc8, 0, 0, 1, f(Yes, false, "ೈ")},
+ {0xcc9, 0, 0, 0, f(Yes, false, "")},
+ {0xcca, 0, 0, 1, f(Yes, true, "ೊ")},
+ {0xccb, 0, 0, 2, f(Yes, false, "ೋ")},
+ {0xccc, 0, 0, 0, f(Yes, false, "")},
+ {0xccd, 9, 1, 1, f(Yes, false, "")},
+ {0xcce, 0, 0, 0, f(Yes, false, "")},
+ {0xcd5, 0, 1, 1, f(Maybe, false, "")},
+ {0xcd7, 0, 0, 0, f(Yes, false, "")},
+ {0xd3e, 0, 1, 1, f(Maybe, false, "")},
+ {0xd3f, 0, 0, 0, f(Yes, false, "")},
+ {0xd46, 0, 0, 0, f(Yes, true, "")},
+ {0xd48, 0, 0, 0, f(Yes, false, "")},
+ {0xd4a, 0, 0, 1, f(Yes, false, "ൊ")},
+ {0xd4b, 0, 0, 1, f(Yes, false, "ോ")},
+ {0xd4c, 0, 0, 1, f(Yes, false, "ൌ")},
+ {0xd4d, 9, 1, 1, f(Yes, false, "")},
+ {0xd4e, 0, 0, 0, f(Yes, false, "")},
+ {0xd57, 0, 1, 1, f(Maybe, false, "")},
+ {0xd58, 0, 0, 0, f(Yes, false, "")},
+ {0xdca, 9, 1, 1, f(Maybe, false, "")},
+ {0xdcb, 0, 0, 0, f(Yes, false, "")},
+ {0xdcf, 0, 1, 1, f(Maybe, false, "")},
+ {0xdd0, 0, 0, 0, f(Yes, false, "")},
+ {0xdd9, 0, 0, 0, f(Yes, true, "")},
+ {0xdda, 0, 0, 1, f(Yes, false, "ේ")},
+ {0xddb, 0, 0, 0, f(Yes, false, "")},
+ {0xddc, 0, 0, 1, f(Yes, true, "ො")},
+ {0xddd, 0, 0, 2, f(Yes, false, "ෝ")},
+ {0xdde, 0, 0, 1, f(Yes, false, "ෞ")},
+ {0xddf, 0, 1, 1, f(Maybe, false, "")},
+ {0xde0, 0, 0, 0, f(Yes, false, "")},
+ {0xe33, 0, 0, 0, g(Yes, No, false, false, "", "ํา")},
+ {0xe34, 0, 0, 0, f(Yes, false, "")},
+ {0xe38, 103, 1, 1, f(Yes, false, "")},
+ {0xe3a, 9, 1, 1, f(Yes, false, "")},
+ {0xe3b, 0, 0, 0, f(Yes, false, "")},
+ {0xe48, 107, 1, 1, f(Yes, false, "")},
+ {0xe4c, 0, 0, 0, f(Yes, false, "")},
+ {0xeb3, 0, 0, 0, g(Yes, No, false, false, "", "ໍາ")},
+ {0xeb4, 0, 0, 0, f(Yes, false, "")},
+ {0xeb8, 118, 1, 1, f(Yes, false, "")},
+ {0xeba, 0, 0, 0, f(Yes, false, "")},
+ {0xec8, 122, 1, 1, f(Yes, false, "")},
+ {0xecc, 0, 0, 0, f(Yes, false, "")},
+ {0xedc, 0, 0, 0, g(Yes, No, false, false, "", "ຫນ")},
+ {0xedd, 0, 0, 0, g(Yes, No, false, false, "", "ຫມ")},
+ {0xede, 0, 0, 0, f(Yes, false, "")},
+ {0xf0c, 0, 0, 0, g(Yes, No, false, false, "", "་")},
+ {0xf0d, 0, 0, 0, f(Yes, false, "")},
+ {0xf18, 220, 1, 1, f(Yes, false, "")},
+ {0xf1a, 0, 0, 0, f(Yes, false, "")},
+ {0xf35, 220, 1, 1, f(Yes, false, "")},
+ {0xf36, 0, 0, 0, f(Yes, false, "")},
+ {0xf37, 220, 1, 1, f(Yes, false, "")},
+ {0xf38, 0, 0, 0, f(Yes, false, "")},
+ {0xf39, 216, 1, 1, f(Yes, false, "")},
+ {0xf3a, 0, 0, 0, f(Yes, false, "")},
+ {0xf43, 0, 0, 0, f(No, false, "གྷ")},
+ {0xf44, 0, 0, 0, f(Yes, false, "")},
+ {0xf4d, 0, 0, 0, f(No, false, "ཌྷ")},
+ {0xf4e, 0, 0, 0, f(Yes, false, "")},
+ {0xf52, 0, 0, 0, f(No, false, "དྷ")},
+ {0xf53, 0, 0, 0, f(Yes, false, "")},
+ {0xf57, 0, 0, 0, f(No, false, "བྷ")},
+ {0xf58, 0, 0, 0, f(Yes, false, "")},
+ {0xf5c, 0, 0, 0, f(No, false, "ཛྷ")},
+ {0xf5d, 0, 0, 0, f(Yes, false, "")},
+ {0xf69, 0, 0, 0, f(No, false, "ཀྵ")},
+ {0xf6a, 0, 0, 0, f(Yes, false, "")},
+ {0xf71, 129, 1, 1, f(Yes, false, "")},
+ {0xf72, 130, 1, 1, f(Yes, false, "")},
+ {0xf73, 0, 2, 2, f(No, false, "ཱི")},
+ {0xf74, 132, 1, 1, f(Yes, false, "")},
+ {0xf75, 0, 2, 2, f(No, false, "ཱུ")},
+ {0xf76, 0, 0, 1, f(No, false, "ྲྀ")},
+ {0xf77, 0, 0, 2, g(Yes, No, false, false, "", "ྲཱྀ")},
+ {0xf78, 0, 0, 1, f(No, false, "ླྀ")},
+ {0xf79, 0, 0, 2, g(Yes, No, false, false, "", "ླཱྀ")},
+ {0xf7a, 130, 1, 1, f(Yes, false, "")},
+ {0xf7e, 0, 0, 0, f(Yes, false, "")},
+ {0xf80, 130, 1, 1, f(Yes, false, "")},
+ {0xf81, 0, 2, 2, f(No, false, "ཱྀ")},
+ {0xf82, 230, 1, 1, f(Yes, false, "")},
+ {0xf84, 9, 1, 1, f(Yes, false, "")},
+ {0xf85, 0, 0, 0, f(Yes, false, "")},
+ {0xf86, 230, 1, 1, f(Yes, false, "")},
+ {0xf88, 0, 0, 0, f(Yes, false, "")},
+ {0xf93, 0, 0, 0, f(No, false, "ྒྷ")},
+ {0xf94, 0, 0, 0, f(Yes, false, "")},
+ {0xf9d, 0, 0, 0, f(No, false, "ྜྷ")},
+ {0xf9e, 0, 0, 0, f(Yes, false, "")},
+ {0xfa2, 0, 0, 0, f(No, false, "ྡྷ")},
+ {0xfa3, 0, 0, 0, f(Yes, false, "")},
+ {0xfa7, 0, 0, 0, f(No, false, "ྦྷ")},
+ {0xfa8, 0, 0, 0, f(Yes, false, "")},
+ {0xfac, 0, 0, 0, f(No, false, "ྫྷ")},
+ {0xfad, 0, 0, 0, f(Yes, false, "")},
+ {0xfb9, 0, 0, 0, f(No, false, "ྐྵ")},
+ {0xfba, 0, 0, 0, f(Yes, false, "")},
+ {0xfc6, 220, 1, 1, f(Yes, false, "")},
+ {0xfc7, 0, 0, 0, f(Yes, false, "")},
+ {0x1025, 0, 0, 0, f(Yes, true, "")},
+ {0x1026, 0, 0, 1, f(Yes, false, "ဦ")},
+ {0x1027, 0, 0, 0, f(Yes, false, "")},
+ {0x102e, 0, 1, 1, f(Maybe, false, "")},
+ {0x102f, 0, 0, 0, f(Yes, false, "")},
+ {0x1037, 7, 1, 1, f(Yes, false, "")},
+ {0x1038, 0, 0, 0, f(Yes, false, "")},
+ {0x1039, 9, 1, 1, f(Yes, false, "")},
+ {0x103b, 0, 0, 0, f(Yes, false, "")},
+ {0x108d, 220, 1, 1, f(Yes, false, "")},
+ {0x108e, 0, 0, 0, f(Yes, false, "")},
+ {0x10fc, 0, 0, 0, g(Yes, No, false, false, "", "ნ")},
+ {0x10fd, 0, 0, 0, f(Yes, false, "")},
+ {0x1100, 0, 0, 0, f(Yes, true, "")},
+ {0x1113, 0, 0, 0, f(Yes, false, "")},
+ {0x1161, 0, 1, 1, f(Maybe, true, "")},
+ {0x1176, 0, 0, 0, f(Yes, false, "")},
+ {0x11a8, 0, 1, 1, f(Maybe, false, "")},
+ {0x11c3, 0, 0, 0, f(Yes, false, "")},
+ {0x135d, 230, 1, 1, f(Yes, false, "")},
+ {0x1360, 0, 0, 0, f(Yes, false, "")},
+ {0x1714, 9, 1, 1, f(Yes, false, "")},
+ {0x1715, 0, 0, 0, f(Yes, false, "")},
+ {0x1734, 9, 1, 1, f(Yes, false, "")},
+ {0x1735, 0, 0, 0, f(Yes, false, "")},
+ {0x17d2, 9, 1, 1, f(Yes, false, "")},
+ {0x17d3, 0, 0, 0, f(Yes, false, "")},
+ {0x17dd, 230, 1, 1, f(Yes, false, "")},
+ {0x17de, 0, 0, 0, f(Yes, false, "")},
+ {0x18a9, 228, 1, 1, f(Yes, false, "")},
+ {0x18aa, 0, 0, 0, f(Yes, false, "")},
+ {0x1939, 222, 1, 1, f(Yes, false, "")},
+ {0x193a, 230, 1, 1, f(Yes, false, "")},
+ {0x193b, 220, 1, 1, f(Yes, false, "")},
+ {0x193c, 0, 0, 0, f(Yes, false, "")},
+ {0x1a17, 230, 1, 1, f(Yes, false, "")},
+ {0x1a18, 220, 1, 1, f(Yes, false, "")},
+ {0x1a19, 0, 0, 0, f(Yes, false, "")},
+ {0x1a60, 9, 1, 1, f(Yes, false, "")},
+ {0x1a61, 0, 0, 0, f(Yes, false, "")},
+ {0x1a75, 230, 1, 1, f(Yes, false, "")},
+ {0x1a7d, 0, 0, 0, f(Yes, false, "")},
+ {0x1a7f, 220, 1, 1, f(Yes, false, "")},
+ {0x1a80, 0, 0, 0, f(Yes, false, "")},
+ {0x1ab0, 230, 1, 1, f(Yes, false, "")},
+ {0x1ab5, 220, 1, 1, f(Yes, false, "")},
+ {0x1abb, 230, 1, 1, f(Yes, false, "")},
+ {0x1abd, 220, 1, 1, f(Yes, false, "")},
+ {0x1abe, 0, 0, 0, f(Yes, false, "")},
+ {0x1b05, 0, 0, 0, f(Yes, true, "")},
+ {0x1b06, 0, 0, 1, f(Yes, false, "ᬆ")},
+ {0x1b07, 0, 0, 0, f(Yes, true, "")},
+ {0x1b08, 0, 0, 1, f(Yes, false, "ᬈ")},
+ {0x1b09, 0, 0, 0, f(Yes, true, "")},
+ {0x1b0a, 0, 0, 1, f(Yes, false, "ᬊ")},
+ {0x1b0b, 0, 0, 0, f(Yes, true, "")},
+ {0x1b0c, 0, 0, 1, f(Yes, false, "ᬌ")},
+ {0x1b0d, 0, 0, 0, f(Yes, true, "")},
+ {0x1b0e, 0, 0, 1, f(Yes, false, "ᬎ")},
+ {0x1b0f, 0, 0, 0, f(Yes, false, "")},
+ {0x1b11, 0, 0, 0, f(Yes, true, "")},
+ {0x1b12, 0, 0, 1, f(Yes, false, "ᬒ")},
+ {0x1b13, 0, 0, 0, f(Yes, false, "")},
+ {0x1b34, 7, 1, 1, f(Yes, false, "")},
+ {0x1b35, 0, 1, 1, f(Maybe, false, "")},
+ {0x1b36, 0, 0, 0, f(Yes, false, "")},
+ {0x1b3a, 0, 0, 0, f(Yes, true, "")},
+ {0x1b3b, 0, 0, 1, f(Yes, false, "ᬻ")},
+ {0x1b3c, 0, 0, 0, f(Yes, true, "")},
+ {0x1b3d, 0, 0, 1, f(Yes, false, "ᬽ")},
+ {0x1b3e, 0, 0, 0, f(Yes, true, "")},
+ {0x1b40, 0, 0, 1, f(Yes, false, "ᭀ")},
+ {0x1b41, 0, 0, 1, f(Yes, false, "ᭁ")},
+ {0x1b42, 0, 0, 0, f(Yes, true, "")},
+ {0x1b43, 0, 0, 1, f(Yes, false, "ᭃ")},
+ {0x1b44, 9, 1, 1, f(Yes, false, "")},
+ {0x1b45, 0, 0, 0, f(Yes, false, "")},
+ {0x1b6b, 230, 1, 1, f(Yes, false, "")},
+ {0x1b6c, 220, 1, 1, f(Yes, false, "")},
+ {0x1b6d, 230, 1, 1, f(Yes, false, "")},
+ {0x1b74, 0, 0, 0, f(Yes, false, "")},
+ {0x1baa, 9, 1, 1, f(Yes, false, "")},
+ {0x1bac, 0, 0, 0, f(Yes, false, "")},
+ {0x1be6, 7, 1, 1, f(Yes, false, "")},
+ {0x1be7, 0, 0, 0, f(Yes, false, "")},
+ {0x1bf2, 9, 1, 1, f(Yes, false, "")},
+ {0x1bf4, 0, 0, 0, f(Yes, false, "")},
+ {0x1c37, 7, 1, 1, f(Yes, false, "")},
+ {0x1c38, 0, 0, 0, f(Yes, false, "")},
+ {0x1cd0, 230, 1, 1, f(Yes, false, "")},
+ {0x1cd3, 0, 0, 0, f(Yes, false, "")},
+ {0x1cd4, 1, 1, 1, f(Yes, false, "")},
+ {0x1cd5, 220, 1, 1, f(Yes, false, "")},
+ {0x1cda, 230, 1, 1, f(Yes, false, "")},
+ {0x1cdc, 220, 1, 1, f(Yes, false, "")},
+ {0x1ce0, 230, 1, 1, f(Yes, false, "")},
+ {0x1ce1, 0, 0, 0, f(Yes, false, "")},
+ {0x1ce2, 1, 1, 1, f(Yes, false, "")},
+ {0x1ce9, 0, 0, 0, f(Yes, false, "")},
+ {0x1ced, 220, 1, 1, f(Yes, false, "")},
+ {0x1cee, 0, 0, 0, f(Yes, false, "")},
+ {0x1cf4, 230, 1, 1, f(Yes, false, "")},
+ {0x1cf5, 0, 0, 0, f(Yes, false, "")},
+ {0x1cf8, 230, 1, 1, f(Yes, false, "")},
+ {0x1cfa, 0, 0, 0, f(Yes, false, "")},
+ {0x1d2c, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d2d, 0, 0, 0, g(Yes, No, false, false, "", "Æ")},
+ {0x1d2e, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d2f, 0, 0, 0, f(Yes, false, "")},
+ {0x1d30, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d31, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d32, 0, 0, 0, g(Yes, No, false, false, "", "Ǝ")},
+ {0x1d33, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d34, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1d35, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d36, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d37, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d38, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d39, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d3a, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d3b, 0, 0, 0, f(Yes, false, "")},
+ {0x1d3c, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d3d, 0, 0, 0, g(Yes, No, false, false, "", "Ȣ")},
+ {0x1d3e, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d3f, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1d40, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d41, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d42, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d43, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d44, 0, 0, 0, g(Yes, No, false, false, "", "ɐ")},
+ {0x1d45, 0, 0, 0, g(Yes, No, false, false, "", "ɑ")},
+ {0x1d46, 0, 0, 0, g(Yes, No, false, false, "", "ᴂ")},
+ {0x1d47, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d48, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d49, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d4a, 0, 0, 0, g(Yes, No, false, false, "", "ə")},
+ {0x1d4b, 0, 0, 0, g(Yes, No, false, false, "", "ɛ")},
+ {0x1d4c, 0, 0, 0, g(Yes, No, false, false, "", "ɜ")},
+ {0x1d4d, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d4e, 0, 0, 0, f(Yes, false, "")},
+ {0x1d4f, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d50, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d51, 0, 0, 0, g(Yes, No, false, false, "", "ŋ")},
+ {0x1d52, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d53, 0, 0, 0, g(Yes, No, false, false, "", "ɔ")},
+ {0x1d54, 0, 0, 0, g(Yes, No, false, false, "", "ᴖ")},
+ {0x1d55, 0, 0, 0, g(Yes, No, false, false, "", "ᴗ")},
+ {0x1d56, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d57, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d58, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d59, 0, 0, 0, g(Yes, No, false, false, "", "ᴝ")},
+ {0x1d5a, 0, 0, 0, g(Yes, No, false, false, "", "ɯ")},
+ {0x1d5b, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d5c, 0, 0, 0, g(Yes, No, false, false, "", "ᴥ")},
+ {0x1d5d, 0, 0, 0, g(Yes, No, false, false, "", "β")},
+ {0x1d5e, 0, 0, 0, g(Yes, No, false, false, "", "γ")},
+ {0x1d5f, 0, 0, 0, g(Yes, No, false, false, "", "δ")},
+ {0x1d60, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d61, 0, 0, 0, g(Yes, No, false, false, "", "χ")},
+ {0x1d62, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d63, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d64, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d65, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d66, 0, 0, 0, g(Yes, No, false, false, "", "β")},
+ {0x1d67, 0, 0, 0, g(Yes, No, false, false, "", "γ")},
+ {0x1d68, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x1d69, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d6a, 0, 0, 0, g(Yes, No, false, false, "", "χ")},
+ {0x1d6b, 0, 0, 0, f(Yes, false, "")},
+ {0x1d78, 0, 0, 0, g(Yes, No, false, false, "", "н")},
+ {0x1d79, 0, 0, 0, f(Yes, false, "")},
+ {0x1d9b, 0, 0, 0, g(Yes, No, false, false, "", "ɒ")},
+ {0x1d9c, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d9d, 0, 0, 0, g(Yes, No, false, false, "", "ɕ")},
+ {0x1d9e, 0, 0, 0, g(Yes, No, false, false, "", "ð")},
+ {0x1d9f, 0, 0, 0, g(Yes, No, false, false, "", "ɜ")},
+ {0x1da0, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1da1, 0, 0, 0, g(Yes, No, false, false, "", "ɟ")},
+ {0x1da2, 0, 0, 0, g(Yes, No, false, false, "", "ɡ")},
+ {0x1da3, 0, 0, 0, g(Yes, No, false, false, "", "ɥ")},
+ {0x1da4, 0, 0, 0, g(Yes, No, false, false, "", "ɨ")},
+ {0x1da5, 0, 0, 0, g(Yes, No, false, false, "", "ɩ")},
+ {0x1da6, 0, 0, 0, g(Yes, No, false, false, "", "ɪ")},
+ {0x1da7, 0, 0, 0, g(Yes, No, false, false, "", "ᵻ")},
+ {0x1da8, 0, 0, 0, g(Yes, No, false, false, "", "ʝ")},
+ {0x1da9, 0, 0, 0, g(Yes, No, false, false, "", "ɭ")},
+ {0x1daa, 0, 0, 0, g(Yes, No, false, false, "", "ᶅ")},
+ {0x1dab, 0, 0, 0, g(Yes, No, false, false, "", "ʟ")},
+ {0x1dac, 0, 0, 0, g(Yes, No, false, false, "", "ɱ")},
+ {0x1dad, 0, 0, 0, g(Yes, No, false, false, "", "ɰ")},
+ {0x1dae, 0, 0, 0, g(Yes, No, false, false, "", "ɲ")},
+ {0x1daf, 0, 0, 0, g(Yes, No, false, false, "", "ɳ")},
+ {0x1db0, 0, 0, 0, g(Yes, No, false, false, "", "ɴ")},
+ {0x1db1, 0, 0, 0, g(Yes, No, false, false, "", "ɵ")},
+ {0x1db2, 0, 0, 0, g(Yes, No, false, false, "", "ɸ")},
+ {0x1db3, 0, 0, 0, g(Yes, No, false, false, "", "ʂ")},
+ {0x1db4, 0, 0, 0, g(Yes, No, false, false, "", "ʃ")},
+ {0x1db5, 0, 0, 0, g(Yes, No, false, false, "", "ƫ")},
+ {0x1db6, 0, 0, 0, g(Yes, No, false, false, "", "ʉ")},
+ {0x1db7, 0, 0, 0, g(Yes, No, false, false, "", "ʊ")},
+ {0x1db8, 0, 0, 0, g(Yes, No, false, false, "", "ᴜ")},
+ {0x1db9, 0, 0, 0, g(Yes, No, false, false, "", "ʋ")},
+ {0x1dba, 0, 0, 0, g(Yes, No, false, false, "", "ʌ")},
+ {0x1dbb, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1dbc, 0, 0, 0, g(Yes, No, false, false, "", "ʐ")},
+ {0x1dbd, 0, 0, 0, g(Yes, No, false, false, "", "ʑ")},
+ {0x1dbe, 0, 0, 0, g(Yes, No, false, false, "", "ʒ")},
+ {0x1dbf, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x1dc0, 230, 1, 1, f(Yes, false, "")},
+ {0x1dc2, 220, 1, 1, f(Yes, false, "")},
+ {0x1dc3, 230, 1, 1, f(Yes, false, "")},
+ {0x1dca, 220, 1, 1, f(Yes, false, "")},
+ {0x1dcb, 230, 1, 1, f(Yes, false, "")},
+ {0x1dcd, 234, 1, 1, f(Yes, false, "")},
+ {0x1dce, 214, 1, 1, f(Yes, false, "")},
+ {0x1dcf, 220, 1, 1, f(Yes, false, "")},
+ {0x1dd0, 202, 1, 1, f(Yes, false, "")},
+ {0x1dd1, 230, 1, 1, f(Yes, false, "")},
+ {0x1df6, 0, 0, 0, f(Yes, false, "")},
+ {0x1dfb, 230, 1, 1, f(Yes, false, "")},
+ {0x1dfc, 233, 1, 1, f(Yes, false, "")},
+ {0x1dfd, 220, 1, 1, f(Yes, false, "")},
+ {0x1dfe, 230, 1, 1, f(Yes, false, "")},
+ {0x1dff, 220, 1, 1, f(Yes, false, "")},
+ {0x1e00, 0, 0, 1, f(Yes, false, "Ḁ")},
+ {0x1e01, 0, 0, 1, f(Yes, false, "ḁ")},
+ {0x1e02, 0, 0, 1, f(Yes, false, "Ḃ")},
+ {0x1e03, 0, 0, 1, f(Yes, false, "ḃ")},
+ {0x1e04, 0, 0, 1, f(Yes, false, "Ḅ")},
+ {0x1e05, 0, 0, 1, f(Yes, false, "ḅ")},
+ {0x1e06, 0, 0, 1, f(Yes, false, "Ḇ")},
+ {0x1e07, 0, 0, 1, f(Yes, false, "ḇ")},
+ {0x1e08, 0, 0, 2, f(Yes, false, "Ḉ")},
+ {0x1e09, 0, 0, 2, f(Yes, false, "ḉ")},
+ {0x1e0a, 0, 0, 1, f(Yes, false, "Ḋ")},
+ {0x1e0b, 0, 0, 1, f(Yes, false, "ḋ")},
+ {0x1e0c, 0, 0, 1, f(Yes, false, "Ḍ")},
+ {0x1e0d, 0, 0, 1, f(Yes, false, "ḍ")},
+ {0x1e0e, 0, 0, 1, f(Yes, false, "Ḏ")},
+ {0x1e0f, 0, 0, 1, f(Yes, false, "ḏ")},
+ {0x1e10, 0, 0, 1, f(Yes, false, "Ḑ")},
+ {0x1e11, 0, 0, 1, f(Yes, false, "ḑ")},
+ {0x1e12, 0, 0, 1, f(Yes, false, "Ḓ")},
+ {0x1e13, 0, 0, 1, f(Yes, false, "ḓ")},
+ {0x1e14, 0, 0, 2, f(Yes, false, "Ḕ")},
+ {0x1e15, 0, 0, 2, f(Yes, false, "ḕ")},
+ {0x1e16, 0, 0, 2, f(Yes, false, "Ḗ")},
+ {0x1e17, 0, 0, 2, f(Yes, false, "ḗ")},
+ {0x1e18, 0, 0, 1, f(Yes, false, "Ḙ")},
+ {0x1e19, 0, 0, 1, f(Yes, false, "ḙ")},
+ {0x1e1a, 0, 0, 1, f(Yes, false, "Ḛ")},
+ {0x1e1b, 0, 0, 1, f(Yes, false, "ḛ")},
+ {0x1e1c, 0, 0, 2, f(Yes, false, "Ḝ")},
+ {0x1e1d, 0, 0, 2, f(Yes, false, "ḝ")},
+ {0x1e1e, 0, 0, 1, f(Yes, false, "Ḟ")},
+ {0x1e1f, 0, 0, 1, f(Yes, false, "ḟ")},
+ {0x1e20, 0, 0, 1, f(Yes, false, "Ḡ")},
+ {0x1e21, 0, 0, 1, f(Yes, false, "ḡ")},
+ {0x1e22, 0, 0, 1, f(Yes, false, "Ḣ")},
+ {0x1e23, 0, 0, 1, f(Yes, false, "ḣ")},
+ {0x1e24, 0, 0, 1, f(Yes, false, "Ḥ")},
+ {0x1e25, 0, 0, 1, f(Yes, false, "ḥ")},
+ {0x1e26, 0, 0, 1, f(Yes, false, "Ḧ")},
+ {0x1e27, 0, 0, 1, f(Yes, false, "ḧ")},
+ {0x1e28, 0, 0, 1, f(Yes, false, "Ḩ")},
+ {0x1e29, 0, 0, 1, f(Yes, false, "ḩ")},
+ {0x1e2a, 0, 0, 1, f(Yes, false, "Ḫ")},
+ {0x1e2b, 0, 0, 1, f(Yes, false, "ḫ")},
+ {0x1e2c, 0, 0, 1, f(Yes, false, "Ḭ")},
+ {0x1e2d, 0, 0, 1, f(Yes, false, "ḭ")},
+ {0x1e2e, 0, 0, 2, f(Yes, false, "Ḯ")},
+ {0x1e2f, 0, 0, 2, f(Yes, false, "ḯ")},
+ {0x1e30, 0, 0, 1, f(Yes, false, "Ḱ")},
+ {0x1e31, 0, 0, 1, f(Yes, false, "ḱ")},
+ {0x1e32, 0, 0, 1, f(Yes, false, "Ḳ")},
+ {0x1e33, 0, 0, 1, f(Yes, false, "ḳ")},
+ {0x1e34, 0, 0, 1, f(Yes, false, "Ḵ")},
+ {0x1e35, 0, 0, 1, f(Yes, false, "ḵ")},
+ {0x1e36, 0, 0, 1, f(Yes, true, "Ḷ")},
+ {0x1e37, 0, 0, 1, f(Yes, true, "ḷ")},
+ {0x1e38, 0, 0, 2, f(Yes, false, "Ḹ")},
+ {0x1e39, 0, 0, 2, f(Yes, false, "ḹ")},
+ {0x1e3a, 0, 0, 1, f(Yes, false, "Ḻ")},
+ {0x1e3b, 0, 0, 1, f(Yes, false, "ḻ")},
+ {0x1e3c, 0, 0, 1, f(Yes, false, "Ḽ")},
+ {0x1e3d, 0, 0, 1, f(Yes, false, "ḽ")},
+ {0x1e3e, 0, 0, 1, f(Yes, false, "Ḿ")},
+ {0x1e3f, 0, 0, 1, f(Yes, false, "ḿ")},
+ {0x1e40, 0, 0, 1, f(Yes, false, "Ṁ")},
+ {0x1e41, 0, 0, 1, f(Yes, false, "ṁ")},
+ {0x1e42, 0, 0, 1, f(Yes, false, "Ṃ")},
+ {0x1e43, 0, 0, 1, f(Yes, false, "ṃ")},
+ {0x1e44, 0, 0, 1, f(Yes, false, "Ṅ")},
+ {0x1e45, 0, 0, 1, f(Yes, false, "ṅ")},
+ {0x1e46, 0, 0, 1, f(Yes, false, "Ṇ")},
+ {0x1e47, 0, 0, 1, f(Yes, false, "ṇ")},
+ {0x1e48, 0, 0, 1, f(Yes, false, "Ṉ")},
+ {0x1e49, 0, 0, 1, f(Yes, false, "ṉ")},
+ {0x1e4a, 0, 0, 1, f(Yes, false, "Ṋ")},
+ {0x1e4b, 0, 0, 1, f(Yes, false, "ṋ")},
+ {0x1e4c, 0, 0, 2, f(Yes, false, "Ṍ")},
+ {0x1e4d, 0, 0, 2, f(Yes, false, "ṍ")},
+ {0x1e4e, 0, 0, 2, f(Yes, false, "Ṏ")},
+ {0x1e4f, 0, 0, 2, f(Yes, false, "ṏ")},
+ {0x1e50, 0, 0, 2, f(Yes, false, "Ṑ")},
+ {0x1e51, 0, 0, 2, f(Yes, false, "ṑ")},
+ {0x1e52, 0, 0, 2, f(Yes, false, "Ṓ")},
+ {0x1e53, 0, 0, 2, f(Yes, false, "ṓ")},
+ {0x1e54, 0, 0, 1, f(Yes, false, "Ṕ")},
+ {0x1e55, 0, 0, 1, f(Yes, false, "ṕ")},
+ {0x1e56, 0, 0, 1, f(Yes, false, "Ṗ")},
+ {0x1e57, 0, 0, 1, f(Yes, false, "ṗ")},
+ {0x1e58, 0, 0, 1, f(Yes, false, "Ṙ")},
+ {0x1e59, 0, 0, 1, f(Yes, false, "ṙ")},
+ {0x1e5a, 0, 0, 1, f(Yes, true, "Ṛ")},
+ {0x1e5b, 0, 0, 1, f(Yes, true, "ṛ")},
+ {0x1e5c, 0, 0, 2, f(Yes, false, "Ṝ")},
+ {0x1e5d, 0, 0, 2, f(Yes, false, "ṝ")},
+ {0x1e5e, 0, 0, 1, f(Yes, false, "Ṟ")},
+ {0x1e5f, 0, 0, 1, f(Yes, false, "ṟ")},
+ {0x1e60, 0, 0, 1, f(Yes, false, "Ṡ")},
+ {0x1e61, 0, 0, 1, f(Yes, false, "ṡ")},
+ {0x1e62, 0, 0, 1, f(Yes, true, "Ṣ")},
+ {0x1e63, 0, 0, 1, f(Yes, true, "ṣ")},
+ {0x1e64, 0, 0, 2, f(Yes, false, "Ṥ")},
+ {0x1e65, 0, 0, 2, f(Yes, false, "ṥ")},
+ {0x1e66, 0, 0, 2, f(Yes, false, "Ṧ")},
+ {0x1e67, 0, 0, 2, f(Yes, false, "ṧ")},
+ {0x1e68, 0, 0, 2, f(Yes, false, "Ṩ")},
+ {0x1e69, 0, 0, 2, f(Yes, false, "ṩ")},
+ {0x1e6a, 0, 0, 1, f(Yes, false, "Ṫ")},
+ {0x1e6b, 0, 0, 1, f(Yes, false, "ṫ")},
+ {0x1e6c, 0, 0, 1, f(Yes, false, "Ṭ")},
+ {0x1e6d, 0, 0, 1, f(Yes, false, "ṭ")},
+ {0x1e6e, 0, 0, 1, f(Yes, false, "Ṯ")},
+ {0x1e6f, 0, 0, 1, f(Yes, false, "ṯ")},
+ {0x1e70, 0, 0, 1, f(Yes, false, "Ṱ")},
+ {0x1e71, 0, 0, 1, f(Yes, false, "ṱ")},
+ {0x1e72, 0, 0, 1, f(Yes, false, "Ṳ")},
+ {0x1e73, 0, 0, 1, f(Yes, false, "ṳ")},
+ {0x1e74, 0, 0, 1, f(Yes, false, "Ṵ")},
+ {0x1e75, 0, 0, 1, f(Yes, false, "ṵ")},
+ {0x1e76, 0, 0, 1, f(Yes, false, "Ṷ")},
+ {0x1e77, 0, 0, 1, f(Yes, false, "ṷ")},
+ {0x1e78, 0, 0, 2, f(Yes, false, "Ṹ")},
+ {0x1e79, 0, 0, 2, f(Yes, false, "ṹ")},
+ {0x1e7a, 0, 0, 2, f(Yes, false, "Ṻ")},
+ {0x1e7b, 0, 0, 2, f(Yes, false, "ṻ")},
+ {0x1e7c, 0, 0, 1, f(Yes, false, "Ṽ")},
+ {0x1e7d, 0, 0, 1, f(Yes, false, "ṽ")},
+ {0x1e7e, 0, 0, 1, f(Yes, false, "Ṿ")},
+ {0x1e7f, 0, 0, 1, f(Yes, false, "ṿ")},
+ {0x1e80, 0, 0, 1, f(Yes, false, "Ẁ")},
+ {0x1e81, 0, 0, 1, f(Yes, false, "ẁ")},
+ {0x1e82, 0, 0, 1, f(Yes, false, "Ẃ")},
+ {0x1e83, 0, 0, 1, f(Yes, false, "ẃ")},
+ {0x1e84, 0, 0, 1, f(Yes, false, "Ẅ")},
+ {0x1e85, 0, 0, 1, f(Yes, false, "ẅ")},
+ {0x1e86, 0, 0, 1, f(Yes, false, "Ẇ")},
+ {0x1e87, 0, 0, 1, f(Yes, false, "ẇ")},
+ {0x1e88, 0, 0, 1, f(Yes, false, "Ẉ")},
+ {0x1e89, 0, 0, 1, f(Yes, false, "ẉ")},
+ {0x1e8a, 0, 0, 1, f(Yes, false, "Ẋ")},
+ {0x1e8b, 0, 0, 1, f(Yes, false, "ẋ")},
+ {0x1e8c, 0, 0, 1, f(Yes, false, "Ẍ")},
+ {0x1e8d, 0, 0, 1, f(Yes, false, "ẍ")},
+ {0x1e8e, 0, 0, 1, f(Yes, false, "Ẏ")},
+ {0x1e8f, 0, 0, 1, f(Yes, false, "ẏ")},
+ {0x1e90, 0, 0, 1, f(Yes, false, "Ẑ")},
+ {0x1e91, 0, 0, 1, f(Yes, false, "ẑ")},
+ {0x1e92, 0, 0, 1, f(Yes, false, "Ẓ")},
+ {0x1e93, 0, 0, 1, f(Yes, false, "ẓ")},
+ {0x1e94, 0, 0, 1, f(Yes, false, "Ẕ")},
+ {0x1e95, 0, 0, 1, f(Yes, false, "ẕ")},
+ {0x1e96, 0, 0, 1, f(Yes, false, "ẖ")},
+ {0x1e97, 0, 0, 1, f(Yes, false, "ẗ")},
+ {0x1e98, 0, 0, 1, f(Yes, false, "ẘ")},
+ {0x1e99, 0, 0, 1, f(Yes, false, "ẙ")},
+ {0x1e9a, 0, 0, 0, g(Yes, No, false, false, "", "aʾ")},
+ {0x1e9b, 0, 0, 1, g(Yes, No, false, false, "ẛ", "ṡ")},
+ {0x1e9c, 0, 0, 0, f(Yes, false, "")},
+ {0x1ea0, 0, 0, 1, f(Yes, true, "Ạ")},
+ {0x1ea1, 0, 0, 1, f(Yes, true, "ạ")},
+ {0x1ea2, 0, 0, 1, f(Yes, false, "Ả")},
+ {0x1ea3, 0, 0, 1, f(Yes, false, "ả")},
+ {0x1ea4, 0, 0, 2, f(Yes, false, "Ấ")},
+ {0x1ea5, 0, 0, 2, f(Yes, false, "ấ")},
+ {0x1ea6, 0, 0, 2, f(Yes, false, "Ầ")},
+ {0x1ea7, 0, 0, 2, f(Yes, false, "ầ")},
+ {0x1ea8, 0, 0, 2, f(Yes, false, "Ẩ")},
+ {0x1ea9, 0, 0, 2, f(Yes, false, "ẩ")},
+ {0x1eaa, 0, 0, 2, f(Yes, false, "Ẫ")},
+ {0x1eab, 0, 0, 2, f(Yes, false, "ẫ")},
+ {0x1eac, 0, 0, 2, f(Yes, false, "Ậ")},
+ {0x1ead, 0, 0, 2, f(Yes, false, "ậ")},
+ {0x1eae, 0, 0, 2, f(Yes, false, "Ắ")},
+ {0x1eaf, 0, 0, 2, f(Yes, false, "ắ")},
+ {0x1eb0, 0, 0, 2, f(Yes, false, "Ằ")},
+ {0x1eb1, 0, 0, 2, f(Yes, false, "ằ")},
+ {0x1eb2, 0, 0, 2, f(Yes, false, "Ẳ")},
+ {0x1eb3, 0, 0, 2, f(Yes, false, "ẳ")},
+ {0x1eb4, 0, 0, 2, f(Yes, false, "Ẵ")},
+ {0x1eb5, 0, 0, 2, f(Yes, false, "ẵ")},
+ {0x1eb6, 0, 0, 2, f(Yes, false, "Ặ")},
+ {0x1eb7, 0, 0, 2, f(Yes, false, "ặ")},
+ {0x1eb8, 0, 0, 1, f(Yes, true, "Ẹ")},
+ {0x1eb9, 0, 0, 1, f(Yes, true, "ẹ")},
+ {0x1eba, 0, 0, 1, f(Yes, false, "Ẻ")},
+ {0x1ebb, 0, 0, 1, f(Yes, false, "ẻ")},
+ {0x1ebc, 0, 0, 1, f(Yes, false, "Ẽ")},
+ {0x1ebd, 0, 0, 1, f(Yes, false, "ẽ")},
+ {0x1ebe, 0, 0, 2, f(Yes, false, "Ế")},
+ {0x1ebf, 0, 0, 2, f(Yes, false, "ế")},
+ {0x1ec0, 0, 0, 2, f(Yes, false, "Ề")},
+ {0x1ec1, 0, 0, 2, f(Yes, false, "ề")},
+ {0x1ec2, 0, 0, 2, f(Yes, false, "Ể")},
+ {0x1ec3, 0, 0, 2, f(Yes, false, "ể")},
+ {0x1ec4, 0, 0, 2, f(Yes, false, "Ễ")},
+ {0x1ec5, 0, 0, 2, f(Yes, false, "ễ")},
+ {0x1ec6, 0, 0, 2, f(Yes, false, "Ệ")},
+ {0x1ec7, 0, 0, 2, f(Yes, false, "ệ")},
+ {0x1ec8, 0, 0, 1, f(Yes, false, "Ỉ")},
+ {0x1ec9, 0, 0, 1, f(Yes, false, "ỉ")},
+ {0x1eca, 0, 0, 1, f(Yes, false, "Ị")},
+ {0x1ecb, 0, 0, 1, f(Yes, false, "ị")},
+ {0x1ecc, 0, 0, 1, f(Yes, true, "Ọ")},
+ {0x1ecd, 0, 0, 1, f(Yes, true, "ọ")},
+ {0x1ece, 0, 0, 1, f(Yes, false, "Ỏ")},
+ {0x1ecf, 0, 0, 1, f(Yes, false, "ỏ")},
+ {0x1ed0, 0, 0, 2, f(Yes, false, "Ố")},
+ {0x1ed1, 0, 0, 2, f(Yes, false, "ố")},
+ {0x1ed2, 0, 0, 2, f(Yes, false, "Ồ")},
+ {0x1ed3, 0, 0, 2, f(Yes, false, "ồ")},
+ {0x1ed4, 0, 0, 2, f(Yes, false, "Ổ")},
+ {0x1ed5, 0, 0, 2, f(Yes, false, "ổ")},
+ {0x1ed6, 0, 0, 2, f(Yes, false, "Ỗ")},
+ {0x1ed7, 0, 0, 2, f(Yes, false, "ỗ")},
+ {0x1ed8, 0, 0, 2, f(Yes, false, "Ộ")},
+ {0x1ed9, 0, 0, 2, f(Yes, false, "ộ")},
+ {0x1eda, 0, 0, 2, f(Yes, false, "Ớ")},
+ {0x1edb, 0, 0, 2, f(Yes, false, "ớ")},
+ {0x1edc, 0, 0, 2, f(Yes, false, "Ờ")},
+ {0x1edd, 0, 0, 2, f(Yes, false, "ờ")},
+ {0x1ede, 0, 0, 2, f(Yes, false, "Ở")},
+ {0x1edf, 0, 0, 2, f(Yes, false, "ở")},
+ {0x1ee0, 0, 0, 2, f(Yes, false, "Ỡ")},
+ {0x1ee1, 0, 0, 2, f(Yes, false, "ỡ")},
+ {0x1ee2, 0, 0, 2, f(Yes, false, "Ợ")},
+ {0x1ee3, 0, 0, 2, f(Yes, false, "ợ")},
+ {0x1ee4, 0, 0, 1, f(Yes, false, "Ụ")},
+ {0x1ee5, 0, 0, 1, f(Yes, false, "ụ")},
+ {0x1ee6, 0, 0, 1, f(Yes, false, "Ủ")},
+ {0x1ee7, 0, 0, 1, f(Yes, false, "ủ")},
+ {0x1ee8, 0, 0, 2, f(Yes, false, "Ứ")},
+ {0x1ee9, 0, 0, 2, f(Yes, false, "ứ")},
+ {0x1eea, 0, 0, 2, f(Yes, false, "Ừ")},
+ {0x1eeb, 0, 0, 2, f(Yes, false, "ừ")},
+ {0x1eec, 0, 0, 2, f(Yes, false, "Ử")},
+ {0x1eed, 0, 0, 2, f(Yes, false, "ử")},
+ {0x1eee, 0, 0, 2, f(Yes, false, "Ữ")},
+ {0x1eef, 0, 0, 2, f(Yes, false, "ữ")},
+ {0x1ef0, 0, 0, 2, f(Yes, false, "Ự")},
+ {0x1ef1, 0, 0, 2, f(Yes, false, "ự")},
+ {0x1ef2, 0, 0, 1, f(Yes, false, "Ỳ")},
+ {0x1ef3, 0, 0, 1, f(Yes, false, "ỳ")},
+ {0x1ef4, 0, 0, 1, f(Yes, false, "Ỵ")},
+ {0x1ef5, 0, 0, 1, f(Yes, false, "ỵ")},
+ {0x1ef6, 0, 0, 1, f(Yes, false, "Ỷ")},
+ {0x1ef7, 0, 0, 1, f(Yes, false, "ỷ")},
+ {0x1ef8, 0, 0, 1, f(Yes, false, "Ỹ")},
+ {0x1ef9, 0, 0, 1, f(Yes, false, "ỹ")},
+ {0x1efa, 0, 0, 0, f(Yes, false, "")},
+ {0x1f00, 0, 0, 1, f(Yes, true, "ἀ")},
+ {0x1f01, 0, 0, 1, f(Yes, true, "ἁ")},
+ {0x1f02, 0, 0, 2, f(Yes, true, "ἂ")},
+ {0x1f03, 0, 0, 2, f(Yes, true, "ἃ")},
+ {0x1f04, 0, 0, 2, f(Yes, true, "ἄ")},
+ {0x1f05, 0, 0, 2, f(Yes, true, "ἅ")},
+ {0x1f06, 0, 0, 2, f(Yes, true, "ἆ")},
+ {0x1f07, 0, 0, 2, f(Yes, true, "ἇ")},
+ {0x1f08, 0, 0, 1, f(Yes, true, "Ἀ")},
+ {0x1f09, 0, 0, 1, f(Yes, true, "Ἁ")},
+ {0x1f0a, 0, 0, 2, f(Yes, true, "Ἂ")},
+ {0x1f0b, 0, 0, 2, f(Yes, true, "Ἃ")},
+ {0x1f0c, 0, 0, 2, f(Yes, true, "Ἄ")},
+ {0x1f0d, 0, 0, 2, f(Yes, true, "Ἅ")},
+ {0x1f0e, 0, 0, 2, f(Yes, true, "Ἆ")},
+ {0x1f0f, 0, 0, 2, f(Yes, true, "Ἇ")},
+ {0x1f10, 0, 0, 1, f(Yes, true, "ἐ")},
+ {0x1f11, 0, 0, 1, f(Yes, true, "ἑ")},
+ {0x1f12, 0, 0, 2, f(Yes, false, "ἒ")},
+ {0x1f13, 0, 0, 2, f(Yes, false, "ἓ")},
+ {0x1f14, 0, 0, 2, f(Yes, false, "ἔ")},
+ {0x1f15, 0, 0, 2, f(Yes, false, "ἕ")},
+ {0x1f16, 0, 0, 0, f(Yes, false, "")},
+ {0x1f18, 0, 0, 1, f(Yes, true, "Ἐ")},
+ {0x1f19, 0, 0, 1, f(Yes, true, "Ἑ")},
+ {0x1f1a, 0, 0, 2, f(Yes, false, "Ἒ")},
+ {0x1f1b, 0, 0, 2, f(Yes, false, "Ἓ")},
+ {0x1f1c, 0, 0, 2, f(Yes, false, "Ἔ")},
+ {0x1f1d, 0, 0, 2, f(Yes, false, "Ἕ")},
+ {0x1f1e, 0, 0, 0, f(Yes, false, "")},
+ {0x1f20, 0, 0, 1, f(Yes, true, "ἠ")},
+ {0x1f21, 0, 0, 1, f(Yes, true, "ἡ")},
+ {0x1f22, 0, 0, 2, f(Yes, true, "ἢ")},
+ {0x1f23, 0, 0, 2, f(Yes, true, "ἣ")},
+ {0x1f24, 0, 0, 2, f(Yes, true, "ἤ")},
+ {0x1f25, 0, 0, 2, f(Yes, true, "ἥ")},
+ {0x1f26, 0, 0, 2, f(Yes, true, "ἦ")},
+ {0x1f27, 0, 0, 2, f(Yes, true, "ἧ")},
+ {0x1f28, 0, 0, 1, f(Yes, true, "Ἠ")},
+ {0x1f29, 0, 0, 1, f(Yes, true, "Ἡ")},
+ {0x1f2a, 0, 0, 2, f(Yes, true, "Ἢ")},
+ {0x1f2b, 0, 0, 2, f(Yes, true, "Ἣ")},
+ {0x1f2c, 0, 0, 2, f(Yes, true, "Ἤ")},
+ {0x1f2d, 0, 0, 2, f(Yes, true, "Ἥ")},
+ {0x1f2e, 0, 0, 2, f(Yes, true, "Ἦ")},
+ {0x1f2f, 0, 0, 2, f(Yes, true, "Ἧ")},
+ {0x1f30, 0, 0, 1, f(Yes, true, "ἰ")},
+ {0x1f31, 0, 0, 1, f(Yes, true, "ἱ")},
+ {0x1f32, 0, 0, 2, f(Yes, false, "ἲ")},
+ {0x1f33, 0, 0, 2, f(Yes, false, "ἳ")},
+ {0x1f34, 0, 0, 2, f(Yes, false, "ἴ")},
+ {0x1f35, 0, 0, 2, f(Yes, false, "ἵ")},
+ {0x1f36, 0, 0, 2, f(Yes, false, "ἶ")},
+ {0x1f37, 0, 0, 2, f(Yes, false, "ἷ")},
+ {0x1f38, 0, 0, 1, f(Yes, true, "Ἰ")},
+ {0x1f39, 0, 0, 1, f(Yes, true, "Ἱ")},
+ {0x1f3a, 0, 0, 2, f(Yes, false, "Ἲ")},
+ {0x1f3b, 0, 0, 2, f(Yes, false, "Ἳ")},
+ {0x1f3c, 0, 0, 2, f(Yes, false, "Ἴ")},
+ {0x1f3d, 0, 0, 2, f(Yes, false, "Ἵ")},
+ {0x1f3e, 0, 0, 2, f(Yes, false, "Ἶ")},
+ {0x1f3f, 0, 0, 2, f(Yes, false, "Ἷ")},
+ {0x1f40, 0, 0, 1, f(Yes, true, "ὀ")},
+ {0x1f41, 0, 0, 1, f(Yes, true, "ὁ")},
+ {0x1f42, 0, 0, 2, f(Yes, false, "ὂ")},
+ {0x1f43, 0, 0, 2, f(Yes, false, "ὃ")},
+ {0x1f44, 0, 0, 2, f(Yes, false, "ὄ")},
+ {0x1f45, 0, 0, 2, f(Yes, false, "ὅ")},
+ {0x1f46, 0, 0, 0, f(Yes, false, "")},
+ {0x1f48, 0, 0, 1, f(Yes, true, "Ὀ")},
+ {0x1f49, 0, 0, 1, f(Yes, true, "Ὁ")},
+ {0x1f4a, 0, 0, 2, f(Yes, false, "Ὂ")},
+ {0x1f4b, 0, 0, 2, f(Yes, false, "Ὃ")},
+ {0x1f4c, 0, 0, 2, f(Yes, false, "Ὄ")},
+ {0x1f4d, 0, 0, 2, f(Yes, false, "Ὅ")},
+ {0x1f4e, 0, 0, 0, f(Yes, false, "")},
+ {0x1f50, 0, 0, 1, f(Yes, true, "ὐ")},
+ {0x1f51, 0, 0, 1, f(Yes, true, "ὑ")},
+ {0x1f52, 0, 0, 2, f(Yes, false, "ὒ")},
+ {0x1f53, 0, 0, 2, f(Yes, false, "ὓ")},
+ {0x1f54, 0, 0, 2, f(Yes, false, "ὔ")},
+ {0x1f55, 0, 0, 2, f(Yes, false, "ὕ")},
+ {0x1f56, 0, 0, 2, f(Yes, false, "ὖ")},
+ {0x1f57, 0, 0, 2, f(Yes, false, "ὗ")},
+ {0x1f58, 0, 0, 0, f(Yes, false, "")},
+ {0x1f59, 0, 0, 1, f(Yes, true, "Ὑ")},
+ {0x1f5a, 0, 0, 0, f(Yes, false, "")},
+ {0x1f5b, 0, 0, 2, f(Yes, false, "Ὓ")},
+ {0x1f5c, 0, 0, 0, f(Yes, false, "")},
+ {0x1f5d, 0, 0, 2, f(Yes, false, "Ὕ")},
+ {0x1f5e, 0, 0, 0, f(Yes, false, "")},
+ {0x1f5f, 0, 0, 2, f(Yes, false, "Ὗ")},
+ {0x1f60, 0, 0, 1, f(Yes, true, "ὠ")},
+ {0x1f61, 0, 0, 1, f(Yes, true, "ὡ")},
+ {0x1f62, 0, 0, 2, f(Yes, true, "ὢ")},
+ {0x1f63, 0, 0, 2, f(Yes, true, "ὣ")},
+ {0x1f64, 0, 0, 2, f(Yes, true, "ὤ")},
+ {0x1f65, 0, 0, 2, f(Yes, true, "ὥ")},
+ {0x1f66, 0, 0, 2, f(Yes, true, "ὦ")},
+ {0x1f67, 0, 0, 2, f(Yes, true, "ὧ")},
+ {0x1f68, 0, 0, 1, f(Yes, true, "Ὠ")},
+ {0x1f69, 0, 0, 1, f(Yes, true, "Ὡ")},
+ {0x1f6a, 0, 0, 2, f(Yes, true, "Ὢ")},
+ {0x1f6b, 0, 0, 2, f(Yes, true, "Ὣ")},
+ {0x1f6c, 0, 0, 2, f(Yes, true, "Ὤ")},
+ {0x1f6d, 0, 0, 2, f(Yes, true, "Ὥ")},
+ {0x1f6e, 0, 0, 2, f(Yes, true, "Ὦ")},
+ {0x1f6f, 0, 0, 2, f(Yes, true, "Ὧ")},
+ {0x1f70, 0, 0, 1, f(Yes, true, "ὰ")},
+ {0x1f71, 0, 0, 1, f(No, false, "ά")},
+ {0x1f72, 0, 0, 1, f(Yes, false, "ὲ")},
+ {0x1f73, 0, 0, 1, f(No, false, "έ")},
+ {0x1f74, 0, 0, 1, f(Yes, true, "ὴ")},
+ {0x1f75, 0, 0, 1, f(No, false, "ή")},
+ {0x1f76, 0, 0, 1, f(Yes, false, "ὶ")},
+ {0x1f77, 0, 0, 1, f(No, false, "ί")},
+ {0x1f78, 0, 0, 1, f(Yes, false, "ὸ")},
+ {0x1f79, 0, 0, 1, f(No, false, "ό")},
+ {0x1f7a, 0, 0, 1, f(Yes, false, "ὺ")},
+ {0x1f7b, 0, 0, 1, f(No, false, "ύ")},
+ {0x1f7c, 0, 0, 1, f(Yes, true, "ὼ")},
+ {0x1f7d, 0, 0, 1, f(No, false, "ώ")},
+ {0x1f7e, 0, 0, 0, f(Yes, false, "")},
+ {0x1f80, 0, 0, 2, f(Yes, false, "ᾀ")},
+ {0x1f81, 0, 0, 2, f(Yes, false, "ᾁ")},
+ {0x1f82, 0, 0, 3, f(Yes, false, "ᾂ")},
+ {0x1f83, 0, 0, 3, f(Yes, false, "ᾃ")},
+ {0x1f84, 0, 0, 3, f(Yes, false, "ᾄ")},
+ {0x1f85, 0, 0, 3, f(Yes, false, "ᾅ")},
+ {0x1f86, 0, 0, 3, f(Yes, false, "ᾆ")},
+ {0x1f87, 0, 0, 3, f(Yes, false, "ᾇ")},
+ {0x1f88, 0, 0, 2, f(Yes, false, "ᾈ")},
+ {0x1f89, 0, 0, 2, f(Yes, false, "ᾉ")},
+ {0x1f8a, 0, 0, 3, f(Yes, false, "ᾊ")},
+ {0x1f8b, 0, 0, 3, f(Yes, false, "ᾋ")},
+ {0x1f8c, 0, 0, 3, f(Yes, false, "ᾌ")},
+ {0x1f8d, 0, 0, 3, f(Yes, false, "ᾍ")},
+ {0x1f8e, 0, 0, 3, f(Yes, false, "ᾎ")},
+ {0x1f8f, 0, 0, 3, f(Yes, false, "ᾏ")},
+ {0x1f90, 0, 0, 2, f(Yes, false, "ᾐ")},
+ {0x1f91, 0, 0, 2, f(Yes, false, "ᾑ")},
+ {0x1f92, 0, 0, 3, f(Yes, false, "ᾒ")},
+ {0x1f93, 0, 0, 3, f(Yes, false, "ᾓ")},
+ {0x1f94, 0, 0, 3, f(Yes, false, "ᾔ")},
+ {0x1f95, 0, 0, 3, f(Yes, false, "ᾕ")},
+ {0x1f96, 0, 0, 3, f(Yes, false, "ᾖ")},
+ {0x1f97, 0, 0, 3, f(Yes, false, "ᾗ")},
+ {0x1f98, 0, 0, 2, f(Yes, false, "ᾘ")},
+ {0x1f99, 0, 0, 2, f(Yes, false, "ᾙ")},
+ {0x1f9a, 0, 0, 3, f(Yes, false, "ᾚ")},
+ {0x1f9b, 0, 0, 3, f(Yes, false, "ᾛ")},
+ {0x1f9c, 0, 0, 3, f(Yes, false, "ᾜ")},
+ {0x1f9d, 0, 0, 3, f(Yes, false, "ᾝ")},
+ {0x1f9e, 0, 0, 3, f(Yes, false, "ᾞ")},
+ {0x1f9f, 0, 0, 3, f(Yes, false, "ᾟ")},
+ {0x1fa0, 0, 0, 2, f(Yes, false, "ᾠ")},
+ {0x1fa1, 0, 0, 2, f(Yes, false, "ᾡ")},
+ {0x1fa2, 0, 0, 3, f(Yes, false, "ᾢ")},
+ {0x1fa3, 0, 0, 3, f(Yes, false, "ᾣ")},
+ {0x1fa4, 0, 0, 3, f(Yes, false, "ᾤ")},
+ {0x1fa5, 0, 0, 3, f(Yes, false, "ᾥ")},
+ {0x1fa6, 0, 0, 3, f(Yes, false, "ᾦ")},
+ {0x1fa7, 0, 0, 3, f(Yes, false, "ᾧ")},
+ {0x1fa8, 0, 0, 2, f(Yes, false, "ᾨ")},
+ {0x1fa9, 0, 0, 2, f(Yes, false, "ᾩ")},
+ {0x1faa, 0, 0, 3, f(Yes, false, "ᾪ")},
+ {0x1fab, 0, 0, 3, f(Yes, false, "ᾫ")},
+ {0x1fac, 0, 0, 3, f(Yes, false, "ᾬ")},
+ {0x1fad, 0, 0, 3, f(Yes, false, "ᾭ")},
+ {0x1fae, 0, 0, 3, f(Yes, false, "ᾮ")},
+ {0x1faf, 0, 0, 3, f(Yes, false, "ᾯ")},
+ {0x1fb0, 0, 0, 1, f(Yes, false, "ᾰ")},
+ {0x1fb1, 0, 0, 1, f(Yes, false, "ᾱ")},
+ {0x1fb2, 0, 0, 2, f(Yes, false, "ᾲ")},
+ {0x1fb3, 0, 0, 1, f(Yes, false, "ᾳ")},
+ {0x1fb4, 0, 0, 2, f(Yes, false, "ᾴ")},
+ {0x1fb5, 0, 0, 0, f(Yes, false, "")},
+ {0x1fb6, 0, 0, 1, f(Yes, true, "ᾶ")},
+ {0x1fb7, 0, 0, 2, f(Yes, false, "ᾷ")},
+ {0x1fb8, 0, 0, 1, f(Yes, false, "Ᾰ")},
+ {0x1fb9, 0, 0, 1, f(Yes, false, "Ᾱ")},
+ {0x1fba, 0, 0, 1, f(Yes, false, "Ὰ")},
+ {0x1fbb, 0, 0, 1, f(No, false, "Ά")},
+ {0x1fbc, 0, 0, 1, f(Yes, false, "ᾼ")},
+ {0x1fbd, 0, 0, 1, g(Yes, No, false, false, "", " ̓")},
+ {0x1fbe, 0, 0, 0, f(No, false, "ι")},
+ {0x1fbf, 0, 0, 1, g(Yes, No, true, false, "", " ̓")},
+ {0x1fc0, 0, 0, 1, g(Yes, No, false, false, "", " ͂")},
+ {0x1fc1, 0, 0, 2, g(Yes, No, false, false, "῁", " ̈͂")},
+ {0x1fc2, 0, 0, 2, f(Yes, false, "ῂ")},
+ {0x1fc3, 0, 0, 1, f(Yes, false, "ῃ")},
+ {0x1fc4, 0, 0, 2, f(Yes, false, "ῄ")},
+ {0x1fc5, 0, 0, 0, f(Yes, false, "")},
+ {0x1fc6, 0, 0, 1, f(Yes, true, "ῆ")},
+ {0x1fc7, 0, 0, 2, f(Yes, false, "ῇ")},
+ {0x1fc8, 0, 0, 1, f(Yes, false, "Ὲ")},
+ {0x1fc9, 0, 0, 1, f(No, false, "Έ")},
+ {0x1fca, 0, 0, 1, f(Yes, false, "Ὴ")},
+ {0x1fcb, 0, 0, 1, f(No, false, "Ή")},
+ {0x1fcc, 0, 0, 1, f(Yes, false, "ῌ")},
+ {0x1fcd, 0, 0, 2, g(Yes, No, false, false, "῍", " ̓̀")},
+ {0x1fce, 0, 0, 2, g(Yes, No, false, false, "῎", " ̓́")},
+ {0x1fcf, 0, 0, 2, g(Yes, No, false, false, "῏", " ̓͂")},
+ {0x1fd0, 0, 0, 1, f(Yes, false, "ῐ")},
+ {0x1fd1, 0, 0, 1, f(Yes, false, "ῑ")},
+ {0x1fd2, 0, 0, 2, f(Yes, false, "ῒ")},
+ {0x1fd3, 0, 0, 2, f(No, false, "ΐ")},
+ {0x1fd4, 0, 0, 0, f(Yes, false, "")},
+ {0x1fd6, 0, 0, 1, f(Yes, false, "ῖ")},
+ {0x1fd7, 0, 0, 2, f(Yes, false, "ῗ")},
+ {0x1fd8, 0, 0, 1, f(Yes, false, "Ῐ")},
+ {0x1fd9, 0, 0, 1, f(Yes, false, "Ῑ")},
+ {0x1fda, 0, 0, 1, f(Yes, false, "Ὶ")},
+ {0x1fdb, 0, 0, 1, f(No, false, "Ί")},
+ {0x1fdc, 0, 0, 0, f(Yes, false, "")},
+ {0x1fdd, 0, 0, 2, g(Yes, No, false, false, "῝", " ̔̀")},
+ {0x1fde, 0, 0, 2, g(Yes, No, false, false, "῞", " ̔́")},
+ {0x1fdf, 0, 0, 2, g(Yes, No, false, false, "῟", " ̔͂")},
+ {0x1fe0, 0, 0, 1, f(Yes, false, "ῠ")},
+ {0x1fe1, 0, 0, 1, f(Yes, false, "ῡ")},
+ {0x1fe2, 0, 0, 2, f(Yes, false, "ῢ")},
+ {0x1fe3, 0, 0, 2, f(No, false, "ΰ")},
+ {0x1fe4, 0, 0, 1, f(Yes, false, "ῤ")},
+ {0x1fe5, 0, 0, 1, f(Yes, false, "ῥ")},
+ {0x1fe6, 0, 0, 1, f(Yes, false, "ῦ")},
+ {0x1fe7, 0, 0, 2, f(Yes, false, "ῧ")},
+ {0x1fe8, 0, 0, 1, f(Yes, false, "Ῠ")},
+ {0x1fe9, 0, 0, 1, f(Yes, false, "Ῡ")},
+ {0x1fea, 0, 0, 1, f(Yes, false, "Ὺ")},
+ {0x1feb, 0, 0, 1, f(No, false, "Ύ")},
+ {0x1fec, 0, 0, 1, f(Yes, false, "Ῥ")},
+ {0x1fed, 0, 0, 2, g(Yes, No, false, false, "῭", " ̈̀")},
+ {0x1fee, 0, 0, 2, g(No, No, false, false, "΅", " ̈́")},
+ {0x1fef, 0, 0, 0, f(No, false, "`")},
+ {0x1ff0, 0, 0, 0, f(Yes, false, "")},
+ {0x1ff2, 0, 0, 2, f(Yes, false, "ῲ")},
+ {0x1ff3, 0, 0, 1, f(Yes, false, "ῳ")},
+ {0x1ff4, 0, 0, 2, f(Yes, false, "ῴ")},
+ {0x1ff5, 0, 0, 0, f(Yes, false, "")},
+ {0x1ff6, 0, 0, 1, f(Yes, true, "ῶ")},
+ {0x1ff7, 0, 0, 2, f(Yes, false, "ῷ")},
+ {0x1ff8, 0, 0, 1, f(Yes, false, "Ὸ")},
+ {0x1ff9, 0, 0, 1, f(No, false, "Ό")},
+ {0x1ffa, 0, 0, 1, f(Yes, false, "Ὼ")},
+ {0x1ffb, 0, 0, 1, f(No, false, "Ώ")},
+ {0x1ffc, 0, 0, 1, f(Yes, false, "ῼ")},
+ {0x1ffd, 0, 0, 1, g(No, No, false, false, "´", " ́")},
+ {0x1ffe, 0, 0, 1, g(Yes, No, true, false, "", " ̔")},
+ {0x1fff, 0, 0, 0, f(Yes, false, "")},
+ {0x2000, 0, 0, 0, g(No, No, false, false, "\u2002", " ")},
+ {0x2001, 0, 0, 0, g(No, No, false, false, "\u2003", " ")},
+ {0x2002, 0, 0, 0, g(Yes, No, false, false, "", " ")},
+ {0x200b, 0, 0, 0, f(Yes, false, "")},
+ {0x2011, 0, 0, 0, g(Yes, No, false, false, "", "‐")},
+ {0x2012, 0, 0, 0, f(Yes, false, "")},
+ {0x2017, 0, 0, 1, g(Yes, No, false, false, "", " ̳")},
+ {0x2018, 0, 0, 0, f(Yes, false, "")},
+ {0x2024, 0, 0, 0, g(Yes, No, false, false, "", ".")},
+ {0x2025, 0, 0, 0, g(Yes, No, false, false, "", "..")},
+ {0x2026, 0, 0, 0, g(Yes, No, false, false, "", "...")},
+ {0x2027, 0, 0, 0, f(Yes, false, "")},
+ {0x202f, 0, 0, 0, g(Yes, No, false, false, "", " ")},
+ {0x2030, 0, 0, 0, f(Yes, false, "")},
+ {0x2033, 0, 0, 0, g(Yes, No, false, false, "", "′′")},
+ {0x2034, 0, 0, 0, g(Yes, No, false, false, "", "′′′")},
+ {0x2035, 0, 0, 0, f(Yes, false, "")},
+ {0x2036, 0, 0, 0, g(Yes, No, false, false, "", "‵‵")},
+ {0x2037, 0, 0, 0, g(Yes, No, false, false, "", "‵‵‵")},
+ {0x2038, 0, 0, 0, f(Yes, false, "")},
+ {0x203c, 0, 0, 0, g(Yes, No, false, false, "", "!!")},
+ {0x203d, 0, 0, 0, f(Yes, false, "")},
+ {0x203e, 0, 0, 1, g(Yes, No, false, false, "", " ̅")},
+ {0x203f, 0, 0, 0, f(Yes, false, "")},
+ {0x2047, 0, 0, 0, g(Yes, No, false, false, "", "??")},
+ {0x2048, 0, 0, 0, g(Yes, No, false, false, "", "?!")},
+ {0x2049, 0, 0, 0, g(Yes, No, false, false, "", "!?")},
+ {0x204a, 0, 0, 0, f(Yes, false, "")},
+ {0x2057, 0, 0, 0, g(Yes, No, false, false, "", "′′′′")},
+ {0x2058, 0, 0, 0, f(Yes, false, "")},
+ {0x205f, 0, 0, 0, g(Yes, No, false, false, "", " ")},
+ {0x2060, 0, 0, 0, f(Yes, false, "")},
+ {0x2070, 0, 0, 0, g(Yes, No, false, false, "", "0")},
+ {0x2071, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x2072, 0, 0, 0, f(Yes, false, "")},
+ {0x2074, 0, 0, 0, g(Yes, No, false, false, "", "4")},
+ {0x2075, 0, 0, 0, g(Yes, No, false, false, "", "5")},
+ {0x2076, 0, 0, 0, g(Yes, No, false, false, "", "6")},
+ {0x2077, 0, 0, 0, g(Yes, No, false, false, "", "7")},
+ {0x2078, 0, 0, 0, g(Yes, No, false, false, "", "8")},
+ {0x2079, 0, 0, 0, g(Yes, No, false, false, "", "9")},
+ {0x207a, 0, 0, 0, g(Yes, No, false, false, "", "+")},
+ {0x207b, 0, 0, 0, g(Yes, No, false, false, "", "−")},
+ {0x207c, 0, 0, 0, g(Yes, No, false, false, "", "=")},
+ {0x207d, 0, 0, 0, g(Yes, No, false, false, "", "(")},
+ {0x207e, 0, 0, 0, g(Yes, No, false, false, "", ")")},
+ {0x207f, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x2080, 0, 0, 0, g(Yes, No, false, false, "", "0")},
+ {0x2081, 0, 0, 0, g(Yes, No, false, false, "", "1")},
+ {0x2082, 0, 0, 0, g(Yes, No, false, false, "", "2")},
+ {0x2083, 0, 0, 0, g(Yes, No, false, false, "", "3")},
+ {0x2084, 0, 0, 0, g(Yes, No, false, false, "", "4")},
+ {0x2085, 0, 0, 0, g(Yes, No, false, false, "", "5")},
+ {0x2086, 0, 0, 0, g(Yes, No, false, false, "", "6")},
+ {0x2087, 0, 0, 0, g(Yes, No, false, false, "", "7")},
+ {0x2088, 0, 0, 0, g(Yes, No, false, false, "", "8")},
+ {0x2089, 0, 0, 0, g(Yes, No, false, false, "", "9")},
+ {0x208a, 0, 0, 0, g(Yes, No, false, false, "", "+")},
+ {0x208b, 0, 0, 0, g(Yes, No, false, false, "", "−")},
+ {0x208c, 0, 0, 0, g(Yes, No, false, false, "", "=")},
+ {0x208d, 0, 0, 0, g(Yes, No, false, false, "", "(")},
+ {0x208e, 0, 0, 0, g(Yes, No, false, false, "", ")")},
+ {0x208f, 0, 0, 0, f(Yes, false, "")},
+ {0x2090, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x2091, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x2092, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x2093, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x2094, 0, 0, 0, g(Yes, No, false, false, "", "ə")},
+ {0x2095, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x2096, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x2097, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x2098, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x2099, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x209a, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x209b, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x209c, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x209d, 0, 0, 0, f(Yes, false, "")},
+ {0x20a8, 0, 0, 0, g(Yes, No, false, false, "", "Rs")},
+ {0x20a9, 0, 0, 0, f(Yes, false, "")},
+ {0x20d0, 230, 1, 1, f(Yes, false, "")},
+ {0x20d2, 1, 1, 1, f(Yes, false, "")},
+ {0x20d4, 230, 1, 1, f(Yes, false, "")},
+ {0x20d8, 1, 1, 1, f(Yes, false, "")},
+ {0x20db, 230, 1, 1, f(Yes, false, "")},
+ {0x20dd, 0, 0, 0, f(Yes, false, "")},
+ {0x20e1, 230, 1, 1, f(Yes, false, "")},
+ {0x20e2, 0, 0, 0, f(Yes, false, "")},
+ {0x20e5, 1, 1, 1, f(Yes, false, "")},
+ {0x20e7, 230, 1, 1, f(Yes, false, "")},
+ {0x20e8, 220, 1, 1, f(Yes, false, "")},
+ {0x20e9, 230, 1, 1, f(Yes, false, "")},
+ {0x20ea, 1, 1, 1, f(Yes, false, "")},
+ {0x20ec, 220, 1, 1, f(Yes, false, "")},
+ {0x20f0, 230, 1, 1, f(Yes, false, "")},
+ {0x20f1, 0, 0, 0, f(Yes, false, "")},
+ {0x2100, 0, 0, 0, g(Yes, No, false, false, "", "a/c")},
+ {0x2101, 0, 0, 0, g(Yes, No, false, false, "", "a/s")},
+ {0x2102, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x2103, 0, 0, 0, g(Yes, No, false, false, "", "°C")},
+ {0x2104, 0, 0, 0, f(Yes, false, "")},
+ {0x2105, 0, 0, 0, g(Yes, No, false, false, "", "c/o")},
+ {0x2106, 0, 0, 0, g(Yes, No, false, false, "", "c/u")},
+ {0x2107, 0, 0, 0, g(Yes, No, false, false, "", "Ɛ")},
+ {0x2108, 0, 0, 0, f(Yes, false, "")},
+ {0x2109, 0, 0, 0, g(Yes, No, false, false, "", "°F")},
+ {0x210a, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x210b, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x210e, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x210f, 0, 0, 0, g(Yes, No, false, false, "", "ħ")},
+ {0x2110, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x2112, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x2113, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x2114, 0, 0, 0, f(Yes, false, "")},
+ {0x2115, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x2116, 0, 0, 0, g(Yes, No, false, false, "", "No")},
+ {0x2117, 0, 0, 0, f(Yes, false, "")},
+ {0x2119, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x211a, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x211b, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x211e, 0, 0, 0, f(Yes, false, "")},
+ {0x2120, 0, 0, 0, g(Yes, No, false, false, "", "SM")},
+ {0x2121, 0, 0, 0, g(Yes, No, false, false, "", "TEL")},
+ {0x2122, 0, 0, 0, g(Yes, No, false, false, "", "TM")},
+ {0x2123, 0, 0, 0, f(Yes, false, "")},
+ {0x2124, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x2125, 0, 0, 0, f(Yes, false, "")},
+ {0x2126, 0, 0, 0, f(No, false, "Ω")},
+ {0x2127, 0, 0, 0, f(Yes, false, "")},
+ {0x2128, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x2129, 0, 0, 0, f(Yes, false, "")},
+ {0x212a, 0, 0, 0, f(No, false, "K")},
+ {0x212b, 0, 0, 1, f(No, false, "Å")},
+ {0x212c, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x212d, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x212e, 0, 0, 0, f(Yes, false, "")},
+ {0x212f, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x2130, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x2131, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x2132, 0, 0, 0, f(Yes, false, "")},
+ {0x2133, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x2134, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x2135, 0, 0, 0, g(Yes, No, false, false, "", "א")},
+ {0x2136, 0, 0, 0, g(Yes, No, false, false, "", "ב")},
+ {0x2137, 0, 0, 0, g(Yes, No, false, false, "", "ג")},
+ {0x2138, 0, 0, 0, g(Yes, No, false, false, "", "ד")},
+ {0x2139, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x213a, 0, 0, 0, f(Yes, false, "")},
+ {0x213b, 0, 0, 0, g(Yes, No, false, false, "", "FAX")},
+ {0x213c, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x213d, 0, 0, 0, g(Yes, No, false, false, "", "γ")},
+ {0x213e, 0, 0, 0, g(Yes, No, false, false, "", "Γ")},
+ {0x213f, 0, 0, 0, g(Yes, No, false, false, "", "Π")},
+ {0x2140, 0, 0, 0, g(Yes, No, false, false, "", "∑")},
+ {0x2141, 0, 0, 0, f(Yes, false, "")},
+ {0x2145, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x2146, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x2147, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x2148, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x2149, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x214a, 0, 0, 0, f(Yes, false, "")},
+ {0x2150, 0, 0, 0, g(Yes, No, false, false, "", "1⁄7")},
+ {0x2151, 0, 0, 0, g(Yes, No, false, false, "", "1⁄9")},
+ {0x2152, 0, 0, 0, g(Yes, No, false, false, "", "1⁄10")},
+ {0x2153, 0, 0, 0, g(Yes, No, false, false, "", "1⁄3")},
+ {0x2154, 0, 0, 0, g(Yes, No, false, false, "", "2⁄3")},
+ {0x2155, 0, 0, 0, g(Yes, No, false, false, "", "1⁄5")},
+ {0x2156, 0, 0, 0, g(Yes, No, false, false, "", "2⁄5")},
+ {0x2157, 0, 0, 0, g(Yes, No, false, false, "", "3⁄5")},
+ {0x2158, 0, 0, 0, g(Yes, No, false, false, "", "4⁄5")},
+ {0x2159, 0, 0, 0, g(Yes, No, false, false, "", "1⁄6")},
+ {0x215a, 0, 0, 0, g(Yes, No, false, false, "", "5⁄6")},
+ {0x215b, 0, 0, 0, g(Yes, No, false, false, "", "1⁄8")},
+ {0x215c, 0, 0, 0, g(Yes, No, false, false, "", "3⁄8")},
+ {0x215d, 0, 0, 0, g(Yes, No, false, false, "", "5⁄8")},
+ {0x215e, 0, 0, 0, g(Yes, No, false, false, "", "7⁄8")},
+ {0x215f, 0, 0, 0, g(Yes, No, false, false, "", "1⁄")},
+ {0x2160, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x2161, 0, 0, 0, g(Yes, No, false, false, "", "II")},
+ {0x2162, 0, 0, 0, g(Yes, No, false, false, "", "III")},
+ {0x2163, 0, 0, 0, g(Yes, No, false, false, "", "IV")},
+ {0x2164, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x2165, 0, 0, 0, g(Yes, No, false, false, "", "VI")},
+ {0x2166, 0, 0, 0, g(Yes, No, false, false, "", "VII")},
+ {0x2167, 0, 0, 0, g(Yes, No, false, false, "", "VIII")},
+ {0x2168, 0, 0, 0, g(Yes, No, false, false, "", "IX")},
+ {0x2169, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x216a, 0, 0, 0, g(Yes, No, false, false, "", "XI")},
+ {0x216b, 0, 0, 0, g(Yes, No, false, false, "", "XII")},
+ {0x216c, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x216d, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x216e, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x216f, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x2170, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x2171, 0, 0, 0, g(Yes, No, false, false, "", "ii")},
+ {0x2172, 0, 0, 0, g(Yes, No, false, false, "", "iii")},
+ {0x2173, 0, 0, 0, g(Yes, No, false, false, "", "iv")},
+ {0x2174, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x2175, 0, 0, 0, g(Yes, No, false, false, "", "vi")},
+ {0x2176, 0, 0, 0, g(Yes, No, false, false, "", "vii")},
+ {0x2177, 0, 0, 0, g(Yes, No, false, false, "", "viii")},
+ {0x2178, 0, 0, 0, g(Yes, No, false, false, "", "ix")},
+ {0x2179, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x217a, 0, 0, 0, g(Yes, No, false, false, "", "xi")},
+ {0x217b, 0, 0, 0, g(Yes, No, false, false, "", "xii")},
+ {0x217c, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x217d, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x217e, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x217f, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x2180, 0, 0, 0, f(Yes, false, "")},
+ {0x2189, 0, 0, 0, g(Yes, No, false, false, "", "0⁄3")},
+ {0x218a, 0, 0, 0, f(Yes, false, "")},
+ {0x2190, 0, 0, 0, f(Yes, true, "")},
+ {0x2191, 0, 0, 0, f(Yes, false, "")},
+ {0x2192, 0, 0, 0, f(Yes, true, "")},
+ {0x2193, 0, 0, 0, f(Yes, false, "")},
+ {0x2194, 0, 0, 0, f(Yes, true, "")},
+ {0x2195, 0, 0, 0, f(Yes, false, "")},
+ {0x219a, 0, 0, 1, f(Yes, false, "↚")},
+ {0x219b, 0, 0, 1, f(Yes, false, "↛")},
+ {0x219c, 0, 0, 0, f(Yes, false, "")},
+ {0x21ae, 0, 0, 1, f(Yes, false, "↮")},
+ {0x21af, 0, 0, 0, f(Yes, false, "")},
+ {0x21cd, 0, 0, 1, f(Yes, false, "⇍")},
+ {0x21ce, 0, 0, 1, f(Yes, false, "⇎")},
+ {0x21cf, 0, 0, 1, f(Yes, false, "⇏")},
+ {0x21d0, 0, 0, 0, f(Yes, true, "")},
+ {0x21d1, 0, 0, 0, f(Yes, false, "")},
+ {0x21d2, 0, 0, 0, f(Yes, true, "")},
+ {0x21d3, 0, 0, 0, f(Yes, false, "")},
+ {0x21d4, 0, 0, 0, f(Yes, true, "")},
+ {0x21d5, 0, 0, 0, f(Yes, false, "")},
+ {0x2203, 0, 0, 0, f(Yes, true, "")},
+ {0x2204, 0, 0, 1, f(Yes, false, "∄")},
+ {0x2205, 0, 0, 0, f(Yes, false, "")},
+ {0x2208, 0, 0, 0, f(Yes, true, "")},
+ {0x2209, 0, 0, 1, f(Yes, false, "∉")},
+ {0x220a, 0, 0, 0, f(Yes, false, "")},
+ {0x220b, 0, 0, 0, f(Yes, true, "")},
+ {0x220c, 0, 0, 1, f(Yes, false, "∌")},
+ {0x220d, 0, 0, 0, f(Yes, false, "")},
+ {0x2223, 0, 0, 0, f(Yes, true, "")},
+ {0x2224, 0, 0, 1, f(Yes, false, "∤")},
+ {0x2225, 0, 0, 0, f(Yes, true, "")},
+ {0x2226, 0, 0, 1, f(Yes, false, "∦")},
+ {0x2227, 0, 0, 0, f(Yes, false, "")},
+ {0x222c, 0, 0, 0, g(Yes, No, false, false, "", "∫∫")},
+ {0x222d, 0, 0, 0, g(Yes, No, false, false, "", "∫∫∫")},
+ {0x222e, 0, 0, 0, f(Yes, false, "")},
+ {0x222f, 0, 0, 0, g(Yes, No, false, false, "", "∮∮")},
+ {0x2230, 0, 0, 0, g(Yes, No, false, false, "", "∮∮∮")},
+ {0x2231, 0, 0, 0, f(Yes, false, "")},
+ {0x223c, 0, 0, 0, f(Yes, true, "")},
+ {0x223d, 0, 0, 0, f(Yes, false, "")},
+ {0x2241, 0, 0, 1, f(Yes, false, "≁")},
+ {0x2242, 0, 0, 0, f(Yes, false, "")},
+ {0x2243, 0, 0, 0, f(Yes, true, "")},
+ {0x2244, 0, 0, 1, f(Yes, false, "≄")},
+ {0x2245, 0, 0, 0, f(Yes, true, "")},
+ {0x2246, 0, 0, 0, f(Yes, false, "")},
+ {0x2247, 0, 0, 1, f(Yes, false, "≇")},
+ {0x2248, 0, 0, 0, f(Yes, true, "")},
+ {0x2249, 0, 0, 1, f(Yes, false, "≉")},
+ {0x224a, 0, 0, 0, f(Yes, false, "")},
+ {0x224d, 0, 0, 0, f(Yes, true, "")},
+ {0x224e, 0, 0, 0, f(Yes, false, "")},
+ {0x2260, 0, 0, 1, f(Yes, false, "≠")},
+ {0x2261, 0, 0, 0, f(Yes, true, "")},
+ {0x2262, 0, 0, 1, f(Yes, false, "≢")},
+ {0x2263, 0, 0, 0, f(Yes, false, "")},
+ {0x2264, 0, 0, 0, f(Yes, true, "")},
+ {0x2266, 0, 0, 0, f(Yes, false, "")},
+ {0x226d, 0, 0, 1, f(Yes, false, "≭")},
+ {0x226e, 0, 0, 1, f(Yes, false, "≮")},
+ {0x226f, 0, 0, 1, f(Yes, false, "≯")},
+ {0x2270, 0, 0, 1, f(Yes, false, "≰")},
+ {0x2271, 0, 0, 1, f(Yes, false, "≱")},
+ {0x2272, 0, 0, 0, f(Yes, true, "")},
+ {0x2274, 0, 0, 1, f(Yes, false, "≴")},
+ {0x2275, 0, 0, 1, f(Yes, false, "≵")},
+ {0x2276, 0, 0, 0, f(Yes, true, "")},
+ {0x2278, 0, 0, 1, f(Yes, false, "≸")},
+ {0x2279, 0, 0, 1, f(Yes, false, "≹")},
+ {0x227a, 0, 0, 0, f(Yes, true, "")},
+ {0x227e, 0, 0, 0, f(Yes, false, "")},
+ {0x2280, 0, 0, 1, f(Yes, false, "⊀")},
+ {0x2281, 0, 0, 1, f(Yes, false, "⊁")},
+ {0x2282, 0, 0, 0, f(Yes, true, "")},
+ {0x2284, 0, 0, 1, f(Yes, false, "⊄")},
+ {0x2285, 0, 0, 1, f(Yes, false, "⊅")},
+ {0x2286, 0, 0, 0, f(Yes, true, "")},
+ {0x2288, 0, 0, 1, f(Yes, false, "⊈")},
+ {0x2289, 0, 0, 1, f(Yes, false, "⊉")},
+ {0x228a, 0, 0, 0, f(Yes, false, "")},
+ {0x2291, 0, 0, 0, f(Yes, true, "")},
+ {0x2293, 0, 0, 0, f(Yes, false, "")},
+ {0x22a2, 0, 0, 0, f(Yes, true, "")},
+ {0x22a3, 0, 0, 0, f(Yes, false, "")},
+ {0x22a8, 0, 0, 0, f(Yes, true, "")},
+ {0x22aa, 0, 0, 0, f(Yes, false, "")},
+ {0x22ab, 0, 0, 0, f(Yes, true, "")},
+ {0x22ac, 0, 0, 1, f(Yes, false, "⊬")},
+ {0x22ad, 0, 0, 1, f(Yes, false, "⊭")},
+ {0x22ae, 0, 0, 1, f(Yes, false, "⊮")},
+ {0x22af, 0, 0, 1, f(Yes, false, "⊯")},
+ {0x22b0, 0, 0, 0, f(Yes, false, "")},
+ {0x22b2, 0, 0, 0, f(Yes, true, "")},
+ {0x22b6, 0, 0, 0, f(Yes, false, "")},
+ {0x22e0, 0, 0, 1, f(Yes, false, "⋠")},
+ {0x22e1, 0, 0, 1, f(Yes, false, "⋡")},
+ {0x22e2, 0, 0, 1, f(Yes, false, "⋢")},
+ {0x22e3, 0, 0, 1, f(Yes, false, "⋣")},
+ {0x22e4, 0, 0, 0, f(Yes, false, "")},
+ {0x22ea, 0, 0, 1, f(Yes, false, "⋪")},
+ {0x22eb, 0, 0, 1, f(Yes, false, "⋫")},
+ {0x22ec, 0, 0, 1, f(Yes, false, "⋬")},
+ {0x22ed, 0, 0, 1, f(Yes, false, "⋭")},
+ {0x22ee, 0, 0, 0, f(Yes, false, "")},
+ {0x2329, 0, 0, 0, f(No, false, "〈")},
+ {0x232a, 0, 0, 0, f(No, false, "〉")},
+ {0x232b, 0, 0, 0, f(Yes, false, "")},
+ {0x2460, 0, 0, 0, g(Yes, No, false, false, "", "1")},
+ {0x2461, 0, 0, 0, g(Yes, No, false, false, "", "2")},
+ {0x2462, 0, 0, 0, g(Yes, No, false, false, "", "3")},
+ {0x2463, 0, 0, 0, g(Yes, No, false, false, "", "4")},
+ {0x2464, 0, 0, 0, g(Yes, No, false, false, "", "5")},
+ {0x2465, 0, 0, 0, g(Yes, No, false, false, "", "6")},
+ {0x2466, 0, 0, 0, g(Yes, No, false, false, "", "7")},
+ {0x2467, 0, 0, 0, g(Yes, No, false, false, "", "8")},
+ {0x2468, 0, 0, 0, g(Yes, No, false, false, "", "9")},
+ {0x2469, 0, 0, 0, g(Yes, No, false, false, "", "10")},
+ {0x246a, 0, 0, 0, g(Yes, No, false, false, "", "11")},
+ {0x246b, 0, 0, 0, g(Yes, No, false, false, "", "12")},
+ {0x246c, 0, 0, 0, g(Yes, No, false, false, "", "13")},
+ {0x246d, 0, 0, 0, g(Yes, No, false, false, "", "14")},
+ {0x246e, 0, 0, 0, g(Yes, No, false, false, "", "15")},
+ {0x246f, 0, 0, 0, g(Yes, No, false, false, "", "16")},
+ {0x2470, 0, 0, 0, g(Yes, No, false, false, "", "17")},
+ {0x2471, 0, 0, 0, g(Yes, No, false, false, "", "18")},
+ {0x2472, 0, 0, 0, g(Yes, No, false, false, "", "19")},
+ {0x2473, 0, 0, 0, g(Yes, No, false, false, "", "20")},
+ {0x2474, 0, 0, 0, g(Yes, No, false, false, "", "(1)")},
+ {0x2475, 0, 0, 0, g(Yes, No, false, false, "", "(2)")},
+ {0x2476, 0, 0, 0, g(Yes, No, false, false, "", "(3)")},
+ {0x2477, 0, 0, 0, g(Yes, No, false, false, "", "(4)")},
+ {0x2478, 0, 0, 0, g(Yes, No, false, false, "", "(5)")},
+ {0x2479, 0, 0, 0, g(Yes, No, false, false, "", "(6)")},
+ {0x247a, 0, 0, 0, g(Yes, No, false, false, "", "(7)")},
+ {0x247b, 0, 0, 0, g(Yes, No, false, false, "", "(8)")},
+ {0x247c, 0, 0, 0, g(Yes, No, false, false, "", "(9)")},
+ {0x247d, 0, 0, 0, g(Yes, No, false, false, "", "(10)")},
+ {0x247e, 0, 0, 0, g(Yes, No, false, false, "", "(11)")},
+ {0x247f, 0, 0, 0, g(Yes, No, false, false, "", "(12)")},
+ {0x2480, 0, 0, 0, g(Yes, No, false, false, "", "(13)")},
+ {0x2481, 0, 0, 0, g(Yes, No, false, false, "", "(14)")},
+ {0x2482, 0, 0, 0, g(Yes, No, false, false, "", "(15)")},
+ {0x2483, 0, 0, 0, g(Yes, No, false, false, "", "(16)")},
+ {0x2484, 0, 0, 0, g(Yes, No, false, false, "", "(17)")},
+ {0x2485, 0, 0, 0, g(Yes, No, false, false, "", "(18)")},
+ {0x2486, 0, 0, 0, g(Yes, No, false, false, "", "(19)")},
+ {0x2487, 0, 0, 0, g(Yes, No, false, false, "", "(20)")},
+ {0x2488, 0, 0, 0, g(Yes, No, false, false, "", "1.")},
+ {0x2489, 0, 0, 0, g(Yes, No, false, false, "", "2.")},
+ {0x248a, 0, 0, 0, g(Yes, No, false, false, "", "3.")},
+ {0x248b, 0, 0, 0, g(Yes, No, false, false, "", "4.")},
+ {0x248c, 0, 0, 0, g(Yes, No, false, false, "", "5.")},
+ {0x248d, 0, 0, 0, g(Yes, No, false, false, "", "6.")},
+ {0x248e, 0, 0, 0, g(Yes, No, false, false, "", "7.")},
+ {0x248f, 0, 0, 0, g(Yes, No, false, false, "", "8.")},
+ {0x2490, 0, 0, 0, g(Yes, No, false, false, "", "9.")},
+ {0x2491, 0, 0, 0, g(Yes, No, false, false, "", "10.")},
+ {0x2492, 0, 0, 0, g(Yes, No, false, false, "", "11.")},
+ {0x2493, 0, 0, 0, g(Yes, No, false, false, "", "12.")},
+ {0x2494, 0, 0, 0, g(Yes, No, false, false, "", "13.")},
+ {0x2495, 0, 0, 0, g(Yes, No, false, false, "", "14.")},
+ {0x2496, 0, 0, 0, g(Yes, No, false, false, "", "15.")},
+ {0x2497, 0, 0, 0, g(Yes, No, false, false, "", "16.")},
+ {0x2498, 0, 0, 0, g(Yes, No, false, false, "", "17.")},
+ {0x2499, 0, 0, 0, g(Yes, No, false, false, "", "18.")},
+ {0x249a, 0, 0, 0, g(Yes, No, false, false, "", "19.")},
+ {0x249b, 0, 0, 0, g(Yes, No, false, false, "", "20.")},
+ {0x249c, 0, 0, 0, g(Yes, No, false, false, "", "(a)")},
+ {0x249d, 0, 0, 0, g(Yes, No, false, false, "", "(b)")},
+ {0x249e, 0, 0, 0, g(Yes, No, false, false, "", "(c)")},
+ {0x249f, 0, 0, 0, g(Yes, No, false, false, "", "(d)")},
+ {0x24a0, 0, 0, 0, g(Yes, No, false, false, "", "(e)")},
+ {0x24a1, 0, 0, 0, g(Yes, No, false, false, "", "(f)")},
+ {0x24a2, 0, 0, 0, g(Yes, No, false, false, "", "(g)")},
+ {0x24a3, 0, 0, 0, g(Yes, No, false, false, "", "(h)")},
+ {0x24a4, 0, 0, 0, g(Yes, No, false, false, "", "(i)")},
+ {0x24a5, 0, 0, 0, g(Yes, No, false, false, "", "(j)")},
+ {0x24a6, 0, 0, 0, g(Yes, No, false, false, "", "(k)")},
+ {0x24a7, 0, 0, 0, g(Yes, No, false, false, "", "(l)")},
+ {0x24a8, 0, 0, 0, g(Yes, No, false, false, "", "(m)")},
+ {0x24a9, 0, 0, 0, g(Yes, No, false, false, "", "(n)")},
+ {0x24aa, 0, 0, 0, g(Yes, No, false, false, "", "(o)")},
+ {0x24ab, 0, 0, 0, g(Yes, No, false, false, "", "(p)")},
+ {0x24ac, 0, 0, 0, g(Yes, No, false, false, "", "(q)")},
+ {0x24ad, 0, 0, 0, g(Yes, No, false, false, "", "(r)")},
+ {0x24ae, 0, 0, 0, g(Yes, No, false, false, "", "(s)")},
+ {0x24af, 0, 0, 0, g(Yes, No, false, false, "", "(t)")},
+ {0x24b0, 0, 0, 0, g(Yes, No, false, false, "", "(u)")},
+ {0x24b1, 0, 0, 0, g(Yes, No, false, false, "", "(v)")},
+ {0x24b2, 0, 0, 0, g(Yes, No, false, false, "", "(w)")},
+ {0x24b3, 0, 0, 0, g(Yes, No, false, false, "", "(x)")},
+ {0x24b4, 0, 0, 0, g(Yes, No, false, false, "", "(y)")},
+ {0x24b5, 0, 0, 0, g(Yes, No, false, false, "", "(z)")},
+ {0x24b6, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x24b7, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x24b8, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x24b9, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x24ba, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x24bb, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x24bc, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x24bd, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x24be, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x24bf, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x24c0, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x24c1, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x24c2, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x24c3, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x24c4, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x24c5, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x24c6, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x24c7, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x24c8, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x24c9, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x24ca, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x24cb, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x24cc, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x24cd, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x24ce, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x24cf, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x24d0, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x24d1, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x24d2, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x24d3, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x24d4, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x24d5, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x24d6, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x24d7, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x24d8, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x24d9, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x24da, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x24db, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x24dc, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x24dd, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x24de, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x24df, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x24e0, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x24e1, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x24e2, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x24e3, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x24e4, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x24e5, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x24e6, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x24e7, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x24e8, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x24e9, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x24ea, 0, 0, 0, g(Yes, No, false, false, "", "0")},
+ {0x24eb, 0, 0, 0, f(Yes, false, "")},
+ {0x2a0c, 0, 0, 0, g(Yes, No, false, false, "", "∫∫∫∫")},
+ {0x2a0d, 0, 0, 0, f(Yes, false, "")},
+ {0x2a74, 0, 0, 0, g(Yes, No, false, false, "", "::=")},
+ {0x2a75, 0, 0, 0, g(Yes, No, false, false, "", "==")},
+ {0x2a76, 0, 0, 0, g(Yes, No, false, false, "", "===")},
+ {0x2a77, 0, 0, 0, f(Yes, false, "")},
+ {0x2adc, 0, 0, 1, f(No, false, "⫝̸")},
+ {0x2add, 0, 0, 0, f(Yes, false, "")},
+ {0x2c7c, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x2c7d, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x2c7e, 0, 0, 0, f(Yes, false, "")},
+ {0x2cef, 230, 1, 1, f(Yes, false, "")},
+ {0x2cf2, 0, 0, 0, f(Yes, false, "")},
+ {0x2d6f, 0, 0, 0, g(Yes, No, false, false, "", "ⵡ")},
+ {0x2d70, 0, 0, 0, f(Yes, false, "")},
+ {0x2d7f, 9, 1, 1, f(Yes, false, "")},
+ {0x2d80, 0, 0, 0, f(Yes, false, "")},
+ {0x2de0, 230, 1, 1, f(Yes, false, "")},
+ {0x2e00, 0, 0, 0, f(Yes, false, "")},
+ {0x2e9f, 0, 0, 0, g(Yes, No, false, false, "", "母")},
+ {0x2ea0, 0, 0, 0, f(Yes, false, "")},
+ {0x2ef3, 0, 0, 0, g(Yes, No, false, false, "", "龟")},
+ {0x2ef4, 0, 0, 0, f(Yes, false, "")},
+ {0x2f00, 0, 0, 0, g(Yes, No, false, false, "", "一")},
+ {0x2f01, 0, 0, 0, g(Yes, No, false, false, "", "丨")},
+ {0x2f02, 0, 0, 0, g(Yes, No, false, false, "", "丶")},
+ {0x2f03, 0, 0, 0, g(Yes, No, false, false, "", "丿")},
+ {0x2f04, 0, 0, 0, g(Yes, No, false, false, "", "乙")},
+ {0x2f05, 0, 0, 0, g(Yes, No, false, false, "", "亅")},
+ {0x2f06, 0, 0, 0, g(Yes, No, false, false, "", "二")},
+ {0x2f07, 0, 0, 0, g(Yes, No, false, false, "", "亠")},
+ {0x2f08, 0, 0, 0, g(Yes, No, false, false, "", "人")},
+ {0x2f09, 0, 0, 0, g(Yes, No, false, false, "", "儿")},
+ {0x2f0a, 0, 0, 0, g(Yes, No, false, false, "", "入")},
+ {0x2f0b, 0, 0, 0, g(Yes, No, false, false, "", "八")},
+ {0x2f0c, 0, 0, 0, g(Yes, No, false, false, "", "冂")},
+ {0x2f0d, 0, 0, 0, g(Yes, No, false, false, "", "冖")},
+ {0x2f0e, 0, 0, 0, g(Yes, No, false, false, "", "冫")},
+ {0x2f0f, 0, 0, 0, g(Yes, No, false, false, "", "几")},
+ {0x2f10, 0, 0, 0, g(Yes, No, false, false, "", "凵")},
+ {0x2f11, 0, 0, 0, g(Yes, No, false, false, "", "刀")},
+ {0x2f12, 0, 0, 0, g(Yes, No, false, false, "", "力")},
+ {0x2f13, 0, 0, 0, g(Yes, No, false, false, "", "勹")},
+ {0x2f14, 0, 0, 0, g(Yes, No, false, false, "", "匕")},
+ {0x2f15, 0, 0, 0, g(Yes, No, false, false, "", "匚")},
+ {0x2f16, 0, 0, 0, g(Yes, No, false, false, "", "匸")},
+ {0x2f17, 0, 0, 0, g(Yes, No, false, false, "", "十")},
+ {0x2f18, 0, 0, 0, g(Yes, No, false, false, "", "卜")},
+ {0x2f19, 0, 0, 0, g(Yes, No, false, false, "", "卩")},
+ {0x2f1a, 0, 0, 0, g(Yes, No, false, false, "", "厂")},
+ {0x2f1b, 0, 0, 0, g(Yes, No, false, false, "", "厶")},
+ {0x2f1c, 0, 0, 0, g(Yes, No, false, false, "", "又")},
+ {0x2f1d, 0, 0, 0, g(Yes, No, false, false, "", "口")},
+ {0x2f1e, 0, 0, 0, g(Yes, No, false, false, "", "囗")},
+ {0x2f1f, 0, 0, 0, g(Yes, No, false, false, "", "土")},
+ {0x2f20, 0, 0, 0, g(Yes, No, false, false, "", "士")},
+ {0x2f21, 0, 0, 0, g(Yes, No, false, false, "", "夂")},
+ {0x2f22, 0, 0, 0, g(Yes, No, false, false, "", "夊")},
+ {0x2f23, 0, 0, 0, g(Yes, No, false, false, "", "夕")},
+ {0x2f24, 0, 0, 0, g(Yes, No, false, false, "", "大")},
+ {0x2f25, 0, 0, 0, g(Yes, No, false, false, "", "女")},
+ {0x2f26, 0, 0, 0, g(Yes, No, false, false, "", "子")},
+ {0x2f27, 0, 0, 0, g(Yes, No, false, false, "", "宀")},
+ {0x2f28, 0, 0, 0, g(Yes, No, false, false, "", "寸")},
+ {0x2f29, 0, 0, 0, g(Yes, No, false, false, "", "小")},
+ {0x2f2a, 0, 0, 0, g(Yes, No, false, false, "", "尢")},
+ {0x2f2b, 0, 0, 0, g(Yes, No, false, false, "", "尸")},
+ {0x2f2c, 0, 0, 0, g(Yes, No, false, false, "", "屮")},
+ {0x2f2d, 0, 0, 0, g(Yes, No, false, false, "", "山")},
+ {0x2f2e, 0, 0, 0, g(Yes, No, false, false, "", "巛")},
+ {0x2f2f, 0, 0, 0, g(Yes, No, false, false, "", "工")},
+ {0x2f30, 0, 0, 0, g(Yes, No, false, false, "", "己")},
+ {0x2f31, 0, 0, 0, g(Yes, No, false, false, "", "巾")},
+ {0x2f32, 0, 0, 0, g(Yes, No, false, false, "", "干")},
+ {0x2f33, 0, 0, 0, g(Yes, No, false, false, "", "幺")},
+ {0x2f34, 0, 0, 0, g(Yes, No, false, false, "", "广")},
+ {0x2f35, 0, 0, 0, g(Yes, No, false, false, "", "廴")},
+ {0x2f36, 0, 0, 0, g(Yes, No, false, false, "", "廾")},
+ {0x2f37, 0, 0, 0, g(Yes, No, false, false, "", "弋")},
+ {0x2f38, 0, 0, 0, g(Yes, No, false, false, "", "弓")},
+ {0x2f39, 0, 0, 0, g(Yes, No, false, false, "", "彐")},
+ {0x2f3a, 0, 0, 0, g(Yes, No, false, false, "", "彡")},
+ {0x2f3b, 0, 0, 0, g(Yes, No, false, false, "", "彳")},
+ {0x2f3c, 0, 0, 0, g(Yes, No, false, false, "", "心")},
+ {0x2f3d, 0, 0, 0, g(Yes, No, false, false, "", "戈")},
+ {0x2f3e, 0, 0, 0, g(Yes, No, false, false, "", "戶")},
+ {0x2f3f, 0, 0, 0, g(Yes, No, false, false, "", "手")},
+ {0x2f40, 0, 0, 0, g(Yes, No, false, false, "", "支")},
+ {0x2f41, 0, 0, 0, g(Yes, No, false, false, "", "攴")},
+ {0x2f42, 0, 0, 0, g(Yes, No, false, false, "", "文")},
+ {0x2f43, 0, 0, 0, g(Yes, No, false, false, "", "斗")},
+ {0x2f44, 0, 0, 0, g(Yes, No, false, false, "", "斤")},
+ {0x2f45, 0, 0, 0, g(Yes, No, false, false, "", "方")},
+ {0x2f46, 0, 0, 0, g(Yes, No, false, false, "", "无")},
+ {0x2f47, 0, 0, 0, g(Yes, No, false, false, "", "日")},
+ {0x2f48, 0, 0, 0, g(Yes, No, false, false, "", "曰")},
+ {0x2f49, 0, 0, 0, g(Yes, No, false, false, "", "月")},
+ {0x2f4a, 0, 0, 0, g(Yes, No, false, false, "", "木")},
+ {0x2f4b, 0, 0, 0, g(Yes, No, false, false, "", "欠")},
+ {0x2f4c, 0, 0, 0, g(Yes, No, false, false, "", "止")},
+ {0x2f4d, 0, 0, 0, g(Yes, No, false, false, "", "歹")},
+ {0x2f4e, 0, 0, 0, g(Yes, No, false, false, "", "殳")},
+ {0x2f4f, 0, 0, 0, g(Yes, No, false, false, "", "毋")},
+ {0x2f50, 0, 0, 0, g(Yes, No, false, false, "", "比")},
+ {0x2f51, 0, 0, 0, g(Yes, No, false, false, "", "毛")},
+ {0x2f52, 0, 0, 0, g(Yes, No, false, false, "", "氏")},
+ {0x2f53, 0, 0, 0, g(Yes, No, false, false, "", "气")},
+ {0x2f54, 0, 0, 0, g(Yes, No, false, false, "", "水")},
+ {0x2f55, 0, 0, 0, g(Yes, No, false, false, "", "火")},
+ {0x2f56, 0, 0, 0, g(Yes, No, false, false, "", "爪")},
+ {0x2f57, 0, 0, 0, g(Yes, No, false, false, "", "父")},
+ {0x2f58, 0, 0, 0, g(Yes, No, false, false, "", "爻")},
+ {0x2f59, 0, 0, 0, g(Yes, No, false, false, "", "爿")},
+ {0x2f5a, 0, 0, 0, g(Yes, No, false, false, "", "片")},
+ {0x2f5b, 0, 0, 0, g(Yes, No, false, false, "", "牙")},
+ {0x2f5c, 0, 0, 0, g(Yes, No, false, false, "", "牛")},
+ {0x2f5d, 0, 0, 0, g(Yes, No, false, false, "", "犬")},
+ {0x2f5e, 0, 0, 0, g(Yes, No, false, false, "", "玄")},
+ {0x2f5f, 0, 0, 0, g(Yes, No, false, false, "", "玉")},
+ {0x2f60, 0, 0, 0, g(Yes, No, false, false, "", "瓜")},
+ {0x2f61, 0, 0, 0, g(Yes, No, false, false, "", "瓦")},
+ {0x2f62, 0, 0, 0, g(Yes, No, false, false, "", "甘")},
+ {0x2f63, 0, 0, 0, g(Yes, No, false, false, "", "生")},
+ {0x2f64, 0, 0, 0, g(Yes, No, false, false, "", "用")},
+ {0x2f65, 0, 0, 0, g(Yes, No, false, false, "", "田")},
+ {0x2f66, 0, 0, 0, g(Yes, No, false, false, "", "疋")},
+ {0x2f67, 0, 0, 0, g(Yes, No, false, false, "", "疒")},
+ {0x2f68, 0, 0, 0, g(Yes, No, false, false, "", "癶")},
+ {0x2f69, 0, 0, 0, g(Yes, No, false, false, "", "白")},
+ {0x2f6a, 0, 0, 0, g(Yes, No, false, false, "", "皮")},
+ {0x2f6b, 0, 0, 0, g(Yes, No, false, false, "", "皿")},
+ {0x2f6c, 0, 0, 0, g(Yes, No, false, false, "", "目")},
+ {0x2f6d, 0, 0, 0, g(Yes, No, false, false, "", "矛")},
+ {0x2f6e, 0, 0, 0, g(Yes, No, false, false, "", "矢")},
+ {0x2f6f, 0, 0, 0, g(Yes, No, false, false, "", "石")},
+ {0x2f70, 0, 0, 0, g(Yes, No, false, false, "", "示")},
+ {0x2f71, 0, 0, 0, g(Yes, No, false, false, "", "禸")},
+ {0x2f72, 0, 0, 0, g(Yes, No, false, false, "", "禾")},
+ {0x2f73, 0, 0, 0, g(Yes, No, false, false, "", "穴")},
+ {0x2f74, 0, 0, 0, g(Yes, No, false, false, "", "立")},
+ {0x2f75, 0, 0, 0, g(Yes, No, false, false, "", "竹")},
+ {0x2f76, 0, 0, 0, g(Yes, No, false, false, "", "米")},
+ {0x2f77, 0, 0, 0, g(Yes, No, false, false, "", "糸")},
+ {0x2f78, 0, 0, 0, g(Yes, No, false, false, "", "缶")},
+ {0x2f79, 0, 0, 0, g(Yes, No, false, false, "", "网")},
+ {0x2f7a, 0, 0, 0, g(Yes, No, false, false, "", "羊")},
+ {0x2f7b, 0, 0, 0, g(Yes, No, false, false, "", "羽")},
+ {0x2f7c, 0, 0, 0, g(Yes, No, false, false, "", "老")},
+ {0x2f7d, 0, 0, 0, g(Yes, No, false, false, "", "而")},
+ {0x2f7e, 0, 0, 0, g(Yes, No, false, false, "", "耒")},
+ {0x2f7f, 0, 0, 0, g(Yes, No, false, false, "", "耳")},
+ {0x2f80, 0, 0, 0, g(Yes, No, false, false, "", "聿")},
+ {0x2f81, 0, 0, 0, g(Yes, No, false, false, "", "肉")},
+ {0x2f82, 0, 0, 0, g(Yes, No, false, false, "", "臣")},
+ {0x2f83, 0, 0, 0, g(Yes, No, false, false, "", "自")},
+ {0x2f84, 0, 0, 0, g(Yes, No, false, false, "", "至")},
+ {0x2f85, 0, 0, 0, g(Yes, No, false, false, "", "臼")},
+ {0x2f86, 0, 0, 0, g(Yes, No, false, false, "", "舌")},
+ {0x2f87, 0, 0, 0, g(Yes, No, false, false, "", "舛")},
+ {0x2f88, 0, 0, 0, g(Yes, No, false, false, "", "舟")},
+ {0x2f89, 0, 0, 0, g(Yes, No, false, false, "", "艮")},
+ {0x2f8a, 0, 0, 0, g(Yes, No, false, false, "", "色")},
+ {0x2f8b, 0, 0, 0, g(Yes, No, false, false, "", "艸")},
+ {0x2f8c, 0, 0, 0, g(Yes, No, false, false, "", "虍")},
+ {0x2f8d, 0, 0, 0, g(Yes, No, false, false, "", "虫")},
+ {0x2f8e, 0, 0, 0, g(Yes, No, false, false, "", "血")},
+ {0x2f8f, 0, 0, 0, g(Yes, No, false, false, "", "行")},
+ {0x2f90, 0, 0, 0, g(Yes, No, false, false, "", "衣")},
+ {0x2f91, 0, 0, 0, g(Yes, No, false, false, "", "襾")},
+ {0x2f92, 0, 0, 0, g(Yes, No, false, false, "", "見")},
+ {0x2f93, 0, 0, 0, g(Yes, No, false, false, "", "角")},
+ {0x2f94, 0, 0, 0, g(Yes, No, false, false, "", "言")},
+ {0x2f95, 0, 0, 0, g(Yes, No, false, false, "", "谷")},
+ {0x2f96, 0, 0, 0, g(Yes, No, false, false, "", "豆")},
+ {0x2f97, 0, 0, 0, g(Yes, No, false, false, "", "豕")},
+ {0x2f98, 0, 0, 0, g(Yes, No, false, false, "", "豸")},
+ {0x2f99, 0, 0, 0, g(Yes, No, false, false, "", "貝")},
+ {0x2f9a, 0, 0, 0, g(Yes, No, false, false, "", "赤")},
+ {0x2f9b, 0, 0, 0, g(Yes, No, false, false, "", "走")},
+ {0x2f9c, 0, 0, 0, g(Yes, No, false, false, "", "足")},
+ {0x2f9d, 0, 0, 0, g(Yes, No, false, false, "", "身")},
+ {0x2f9e, 0, 0, 0, g(Yes, No, false, false, "", "車")},
+ {0x2f9f, 0, 0, 0, g(Yes, No, false, false, "", "辛")},
+ {0x2fa0, 0, 0, 0, g(Yes, No, false, false, "", "辰")},
+ {0x2fa1, 0, 0, 0, g(Yes, No, false, false, "", "辵")},
+ {0x2fa2, 0, 0, 0, g(Yes, No, false, false, "", "邑")},
+ {0x2fa3, 0, 0, 0, g(Yes, No, false, false, "", "酉")},
+ {0x2fa4, 0, 0, 0, g(Yes, No, false, false, "", "釆")},
+ {0x2fa5, 0, 0, 0, g(Yes, No, false, false, "", "里")},
+ {0x2fa6, 0, 0, 0, g(Yes, No, false, false, "", "金")},
+ {0x2fa7, 0, 0, 0, g(Yes, No, false, false, "", "長")},
+ {0x2fa8, 0, 0, 0, g(Yes, No, false, false, "", "門")},
+ {0x2fa9, 0, 0, 0, g(Yes, No, false, false, "", "阜")},
+ {0x2faa, 0, 0, 0, g(Yes, No, false, false, "", "隶")},
+ {0x2fab, 0, 0, 0, g(Yes, No, false, false, "", "隹")},
+ {0x2fac, 0, 0, 0, g(Yes, No, false, false, "", "雨")},
+ {0x2fad, 0, 0, 0, g(Yes, No, false, false, "", "靑")},
+ {0x2fae, 0, 0, 0, g(Yes, No, false, false, "", "非")},
+ {0x2faf, 0, 0, 0, g(Yes, No, false, false, "", "面")},
+ {0x2fb0, 0, 0, 0, g(Yes, No, false, false, "", "革")},
+ {0x2fb1, 0, 0, 0, g(Yes, No, false, false, "", "韋")},
+ {0x2fb2, 0, 0, 0, g(Yes, No, false, false, "", "韭")},
+ {0x2fb3, 0, 0, 0, g(Yes, No, false, false, "", "音")},
+ {0x2fb4, 0, 0, 0, g(Yes, No, false, false, "", "頁")},
+ {0x2fb5, 0, 0, 0, g(Yes, No, false, false, "", "風")},
+ {0x2fb6, 0, 0, 0, g(Yes, No, false, false, "", "飛")},
+ {0x2fb7, 0, 0, 0, g(Yes, No, false, false, "", "食")},
+ {0x2fb8, 0, 0, 0, g(Yes, No, false, false, "", "首")},
+ {0x2fb9, 0, 0, 0, g(Yes, No, false, false, "", "香")},
+ {0x2fba, 0, 0, 0, g(Yes, No, false, false, "", "馬")},
+ {0x2fbb, 0, 0, 0, g(Yes, No, false, false, "", "骨")},
+ {0x2fbc, 0, 0, 0, g(Yes, No, false, false, "", "高")},
+ {0x2fbd, 0, 0, 0, g(Yes, No, false, false, "", "髟")},
+ {0x2fbe, 0, 0, 0, g(Yes, No, false, false, "", "鬥")},
+ {0x2fbf, 0, 0, 0, g(Yes, No, false, false, "", "鬯")},
+ {0x2fc0, 0, 0, 0, g(Yes, No, false, false, "", "鬲")},
+ {0x2fc1, 0, 0, 0, g(Yes, No, false, false, "", "鬼")},
+ {0x2fc2, 0, 0, 0, g(Yes, No, false, false, "", "魚")},
+ {0x2fc3, 0, 0, 0, g(Yes, No, false, false, "", "鳥")},
+ {0x2fc4, 0, 0, 0, g(Yes, No, false, false, "", "鹵")},
+ {0x2fc5, 0, 0, 0, g(Yes, No, false, false, "", "鹿")},
+ {0x2fc6, 0, 0, 0, g(Yes, No, false, false, "", "麥")},
+ {0x2fc7, 0, 0, 0, g(Yes, No, false, false, "", "麻")},
+ {0x2fc8, 0, 0, 0, g(Yes, No, false, false, "", "黃")},
+ {0x2fc9, 0, 0, 0, g(Yes, No, false, false, "", "黍")},
+ {0x2fca, 0, 0, 0, g(Yes, No, false, false, "", "黑")},
+ {0x2fcb, 0, 0, 0, g(Yes, No, false, false, "", "黹")},
+ {0x2fcc, 0, 0, 0, g(Yes, No, false, false, "", "黽")},
+ {0x2fcd, 0, 0, 0, g(Yes, No, false, false, "", "鼎")},
+ {0x2fce, 0, 0, 0, g(Yes, No, false, false, "", "鼓")},
+ {0x2fcf, 0, 0, 0, g(Yes, No, false, false, "", "鼠")},
+ {0x2fd0, 0, 0, 0, g(Yes, No, false, false, "", "鼻")},
+ {0x2fd1, 0, 0, 0, g(Yes, No, false, false, "", "齊")},
+ {0x2fd2, 0, 0, 0, g(Yes, No, false, false, "", "齒")},
+ {0x2fd3, 0, 0, 0, g(Yes, No, false, false, "", "龍")},
+ {0x2fd4, 0, 0, 0, g(Yes, No, false, false, "", "龜")},
+ {0x2fd5, 0, 0, 0, g(Yes, No, false, false, "", "龠")},
+ {0x2fd6, 0, 0, 0, f(Yes, false, "")},
+ {0x3000, 0, 0, 0, g(Yes, No, false, false, "", " ")},
+ {0x3001, 0, 0, 0, f(Yes, false, "")},
+ {0x302a, 218, 1, 1, f(Yes, false, "")},
+ {0x302b, 228, 1, 1, f(Yes, false, "")},
+ {0x302c, 232, 1, 1, f(Yes, false, "")},
+ {0x302d, 222, 1, 1, f(Yes, false, "")},
+ {0x302e, 224, 1, 1, f(Yes, false, "")},
+ {0x3030, 0, 0, 0, f(Yes, false, "")},
+ {0x3036, 0, 0, 0, g(Yes, No, false, false, "", "〒")},
+ {0x3037, 0, 0, 0, f(Yes, false, "")},
+ {0x3038, 0, 0, 0, g(Yes, No, false, false, "", "十")},
+ {0x3039, 0, 0, 0, g(Yes, No, false, false, "", "卄")},
+ {0x303a, 0, 0, 0, g(Yes, No, false, false, "", "卅")},
+ {0x303b, 0, 0, 0, f(Yes, false, "")},
+ {0x3046, 0, 0, 0, f(Yes, true, "")},
+ {0x3047, 0, 0, 0, f(Yes, false, "")},
+ {0x304b, 0, 0, 0, f(Yes, true, "")},
+ {0x304c, 0, 0, 1, f(Yes, false, "が")},
+ {0x304d, 0, 0, 0, f(Yes, true, "")},
+ {0x304e, 0, 0, 1, f(Yes, false, "ぎ")},
+ {0x304f, 0, 0, 0, f(Yes, true, "")},
+ {0x3050, 0, 0, 1, f(Yes, false, "ぐ")},
+ {0x3051, 0, 0, 0, f(Yes, true, "")},
+ {0x3052, 0, 0, 1, f(Yes, false, "げ")},
+ {0x3053, 0, 0, 0, f(Yes, true, "")},
+ {0x3054, 0, 0, 1, f(Yes, false, "ご")},
+ {0x3055, 0, 0, 0, f(Yes, true, "")},
+ {0x3056, 0, 0, 1, f(Yes, false, "ざ")},
+ {0x3057, 0, 0, 0, f(Yes, true, "")},
+ {0x3058, 0, 0, 1, f(Yes, false, "じ")},
+ {0x3059, 0, 0, 0, f(Yes, true, "")},
+ {0x305a, 0, 0, 1, f(Yes, false, "ず")},
+ {0x305b, 0, 0, 0, f(Yes, true, "")},
+ {0x305c, 0, 0, 1, f(Yes, false, "ぜ")},
+ {0x305d, 0, 0, 0, f(Yes, true, "")},
+ {0x305e, 0, 0, 1, f(Yes, false, "ぞ")},
+ {0x305f, 0, 0, 0, f(Yes, true, "")},
+ {0x3060, 0, 0, 1, f(Yes, false, "だ")},
+ {0x3061, 0, 0, 0, f(Yes, true, "")},
+ {0x3062, 0, 0, 1, f(Yes, false, "ぢ")},
+ {0x3063, 0, 0, 0, f(Yes, false, "")},
+ {0x3064, 0, 0, 0, f(Yes, true, "")},
+ {0x3065, 0, 0, 1, f(Yes, false, "づ")},
+ {0x3066, 0, 0, 0, f(Yes, true, "")},
+ {0x3067, 0, 0, 1, f(Yes, false, "で")},
+ {0x3068, 0, 0, 0, f(Yes, true, "")},
+ {0x3069, 0, 0, 1, f(Yes, false, "ど")},
+ {0x306a, 0, 0, 0, f(Yes, false, "")},
+ {0x306f, 0, 0, 0, f(Yes, true, "")},
+ {0x3070, 0, 0, 1, f(Yes, false, "ば")},
+ {0x3071, 0, 0, 1, f(Yes, false, "ぱ")},
+ {0x3072, 0, 0, 0, f(Yes, true, "")},
+ {0x3073, 0, 0, 1, f(Yes, false, "び")},
+ {0x3074, 0, 0, 1, f(Yes, false, "ぴ")},
+ {0x3075, 0, 0, 0, f(Yes, true, "")},
+ {0x3076, 0, 0, 1, f(Yes, false, "ぶ")},
+ {0x3077, 0, 0, 1, f(Yes, false, "ぷ")},
+ {0x3078, 0, 0, 0, f(Yes, true, "")},
+ {0x3079, 0, 0, 1, f(Yes, false, "べ")},
+ {0x307a, 0, 0, 1, f(Yes, false, "ぺ")},
+ {0x307b, 0, 0, 0, f(Yes, true, "")},
+ {0x307c, 0, 0, 1, f(Yes, false, "ぼ")},
+ {0x307d, 0, 0, 1, f(Yes, false, "ぽ")},
+ {0x307e, 0, 0, 0, f(Yes, false, "")},
+ {0x3094, 0, 0, 1, f(Yes, false, "ゔ")},
+ {0x3095, 0, 0, 0, f(Yes, false, "")},
+ {0x3099, 8, 1, 1, f(Maybe, false, "")},
+ {0x309b, 0, 0, 1, g(Yes, No, false, false, "", " ゙")},
+ {0x309c, 0, 0, 1, g(Yes, No, false, false, "", " ゚")},
+ {0x309d, 0, 0, 0, f(Yes, true, "")},
+ {0x309e, 0, 0, 1, f(Yes, false, "ゞ")},
+ {0x309f, 0, 0, 0, g(Yes, No, false, false, "", "より")},
+ {0x30a0, 0, 0, 0, f(Yes, false, "")},
+ {0x30a6, 0, 0, 0, f(Yes, true, "")},
+ {0x30a7, 0, 0, 0, f(Yes, false, "")},
+ {0x30ab, 0, 0, 0, f(Yes, true, "")},
+ {0x30ac, 0, 0, 1, f(Yes, false, "ガ")},
+ {0x30ad, 0, 0, 0, f(Yes, true, "")},
+ {0x30ae, 0, 0, 1, f(Yes, false, "ギ")},
+ {0x30af, 0, 0, 0, f(Yes, true, "")},
+ {0x30b0, 0, 0, 1, f(Yes, false, "グ")},
+ {0x30b1, 0, 0, 0, f(Yes, true, "")},
+ {0x30b2, 0, 0, 1, f(Yes, false, "ゲ")},
+ {0x30b3, 0, 0, 0, f(Yes, true, "")},
+ {0x30b4, 0, 0, 1, f(Yes, false, "ゴ")},
+ {0x30b5, 0, 0, 0, f(Yes, true, "")},
+ {0x30b6, 0, 0, 1, f(Yes, false, "ザ")},
+ {0x30b7, 0, 0, 0, f(Yes, true, "")},
+ {0x30b8, 0, 0, 1, f(Yes, false, "ジ")},
+ {0x30b9, 0, 0, 0, f(Yes, true, "")},
+ {0x30ba, 0, 0, 1, f(Yes, false, "ズ")},
+ {0x30bb, 0, 0, 0, f(Yes, true, "")},
+ {0x30bc, 0, 0, 1, f(Yes, false, "ゼ")},
+ {0x30bd, 0, 0, 0, f(Yes, true, "")},
+ {0x30be, 0, 0, 1, f(Yes, false, "ゾ")},
+ {0x30bf, 0, 0, 0, f(Yes, true, "")},
+ {0x30c0, 0, 0, 1, f(Yes, false, "ダ")},
+ {0x30c1, 0, 0, 0, f(Yes, true, "")},
+ {0x30c2, 0, 0, 1, f(Yes, false, "ヂ")},
+ {0x30c3, 0, 0, 0, f(Yes, false, "")},
+ {0x30c4, 0, 0, 0, f(Yes, true, "")},
+ {0x30c5, 0, 0, 1, f(Yes, false, "ヅ")},
+ {0x30c6, 0, 0, 0, f(Yes, true, "")},
+ {0x30c7, 0, 0, 1, f(Yes, false, "デ")},
+ {0x30c8, 0, 0, 0, f(Yes, true, "")},
+ {0x30c9, 0, 0, 1, f(Yes, false, "ド")},
+ {0x30ca, 0, 0, 0, f(Yes, false, "")},
+ {0x30cf, 0, 0, 0, f(Yes, true, "")},
+ {0x30d0, 0, 0, 1, f(Yes, false, "バ")},
+ {0x30d1, 0, 0, 1, f(Yes, false, "パ")},
+ {0x30d2, 0, 0, 0, f(Yes, true, "")},
+ {0x30d3, 0, 0, 1, f(Yes, false, "ビ")},
+ {0x30d4, 0, 0, 1, f(Yes, false, "ピ")},
+ {0x30d5, 0, 0, 0, f(Yes, true, "")},
+ {0x30d6, 0, 0, 1, f(Yes, false, "ブ")},
+ {0x30d7, 0, 0, 1, f(Yes, false, "プ")},
+ {0x30d8, 0, 0, 0, f(Yes, true, "")},
+ {0x30d9, 0, 0, 1, f(Yes, false, "ベ")},
+ {0x30da, 0, 0, 1, f(Yes, false, "ペ")},
+ {0x30db, 0, 0, 0, f(Yes, true, "")},
+ {0x30dc, 0, 0, 1, f(Yes, false, "ボ")},
+ {0x30dd, 0, 0, 1, f(Yes, false, "ポ")},
+ {0x30de, 0, 0, 0, f(Yes, false, "")},
+ {0x30ef, 0, 0, 0, f(Yes, true, "")},
+ {0x30f3, 0, 0, 0, f(Yes, false, "")},
+ {0x30f4, 0, 0, 1, f(Yes, false, "ヴ")},
+ {0x30f5, 0, 0, 0, f(Yes, false, "")},
+ {0x30f7, 0, 0, 1, f(Yes, false, "ヷ")},
+ {0x30f8, 0, 0, 1, f(Yes, false, "ヸ")},
+ {0x30f9, 0, 0, 1, f(Yes, false, "ヹ")},
+ {0x30fa, 0, 0, 1, f(Yes, false, "ヺ")},
+ {0x30fb, 0, 0, 0, f(Yes, false, "")},
+ {0x30fd, 0, 0, 0, f(Yes, true, "")},
+ {0x30fe, 0, 0, 1, f(Yes, false, "ヾ")},
+ {0x30ff, 0, 0, 0, g(Yes, No, false, false, "", "コト")},
+ {0x3100, 0, 0, 0, f(Yes, false, "")},
+ {0x3131, 0, 0, 0, g(Yes, No, false, false, "", "ᄀ")},
+ {0x3132, 0, 0, 0, g(Yes, No, false, false, "", "ᄁ")},
+ {0x3133, 0, 1, 1, g(Yes, No, false, false, "", "ᆪ")},
+ {0x3134, 0, 0, 0, g(Yes, No, false, false, "", "ᄂ")},
+ {0x3135, 0, 1, 1, g(Yes, No, false, false, "", "ᆬ")},
+ {0x3136, 0, 1, 1, g(Yes, No, false, false, "", "ᆭ")},
+ {0x3137, 0, 0, 0, g(Yes, No, false, false, "", "ᄃ")},
+ {0x3138, 0, 0, 0, g(Yes, No, false, false, "", "ᄄ")},
+ {0x3139, 0, 0, 0, g(Yes, No, false, false, "", "ᄅ")},
+ {0x313a, 0, 1, 1, g(Yes, No, false, false, "", "ᆰ")},
+ {0x313b, 0, 1, 1, g(Yes, No, false, false, "", "ᆱ")},
+ {0x313c, 0, 1, 1, g(Yes, No, false, false, "", "ᆲ")},
+ {0x313d, 0, 1, 1, g(Yes, No, false, false, "", "ᆳ")},
+ {0x313e, 0, 1, 1, g(Yes, No, false, false, "", "ᆴ")},
+ {0x313f, 0, 1, 1, g(Yes, No, false, false, "", "ᆵ")},
+ {0x3140, 0, 0, 0, g(Yes, No, false, false, "", "ᄚ")},
+ {0x3141, 0, 0, 0, g(Yes, No, false, false, "", "ᄆ")},
+ {0x3142, 0, 0, 0, g(Yes, No, false, false, "", "ᄇ")},
+ {0x3143, 0, 0, 0, g(Yes, No, false, false, "", "ᄈ")},
+ {0x3144, 0, 0, 0, g(Yes, No, false, false, "", "ᄡ")},
+ {0x3145, 0, 0, 0, g(Yes, No, false, false, "", "ᄉ")},
+ {0x3146, 0, 0, 0, g(Yes, No, false, false, "", "ᄊ")},
+ {0x3147, 0, 0, 0, g(Yes, No, false, false, "", "ᄋ")},
+ {0x3148, 0, 0, 0, g(Yes, No, false, false, "", "ᄌ")},
+ {0x3149, 0, 0, 0, g(Yes, No, false, false, "", "ᄍ")},
+ {0x314a, 0, 0, 0, g(Yes, No, false, false, "", "ᄎ")},
+ {0x314b, 0, 0, 0, g(Yes, No, false, false, "", "ᄏ")},
+ {0x314c, 0, 0, 0, g(Yes, No, false, false, "", "ᄐ")},
+ {0x314d, 0, 0, 0, g(Yes, No, false, false, "", "ᄑ")},
+ {0x314e, 0, 0, 0, g(Yes, No, false, false, "", "ᄒ")},
+ {0x314f, 0, 1, 1, g(Yes, No, false, false, "", "ᅡ")},
+ {0x3150, 0, 1, 1, g(Yes, No, false, false, "", "ᅢ")},
+ {0x3151, 0, 1, 1, g(Yes, No, false, false, "", "ᅣ")},
+ {0x3152, 0, 1, 1, g(Yes, No, false, false, "", "ᅤ")},
+ {0x3153, 0, 1, 1, g(Yes, No, false, false, "", "ᅥ")},
+ {0x3154, 0, 1, 1, g(Yes, No, false, false, "", "ᅦ")},
+ {0x3155, 0, 1, 1, g(Yes, No, false, false, "", "ᅧ")},
+ {0x3156, 0, 1, 1, g(Yes, No, false, false, "", "ᅨ")},
+ {0x3157, 0, 1, 1, g(Yes, No, false, false, "", "ᅩ")},
+ {0x3158, 0, 1, 1, g(Yes, No, false, false, "", "ᅪ")},
+ {0x3159, 0, 1, 1, g(Yes, No, false, false, "", "ᅫ")},
+ {0x315a, 0, 1, 1, g(Yes, No, false, false, "", "ᅬ")},
+ {0x315b, 0, 1, 1, g(Yes, No, false, false, "", "ᅭ")},
+ {0x315c, 0, 1, 1, g(Yes, No, false, false, "", "ᅮ")},
+ {0x315d, 0, 1, 1, g(Yes, No, false, false, "", "ᅯ")},
+ {0x315e, 0, 1, 1, g(Yes, No, false, false, "", "ᅰ")},
+ {0x315f, 0, 1, 1, g(Yes, No, false, false, "", "ᅱ")},
+ {0x3160, 0, 1, 1, g(Yes, No, false, false, "", "ᅲ")},
+ {0x3161, 0, 1, 1, g(Yes, No, false, false, "", "ᅳ")},
+ {0x3162, 0, 1, 1, g(Yes, No, false, false, "", "ᅴ")},
+ {0x3163, 0, 1, 1, g(Yes, No, false, false, "", "ᅵ")},
+ {0x3164, 0, 0, 0, g(Yes, No, false, false, "", "ᅠ")},
+ {0x3165, 0, 0, 0, g(Yes, No, false, false, "", "ᄔ")},
+ {0x3166, 0, 0, 0, g(Yes, No, false, false, "", "ᄕ")},
+ {0x3167, 0, 0, 0, g(Yes, No, false, false, "", "ᇇ")},
+ {0x3168, 0, 0, 0, g(Yes, No, false, false, "", "ᇈ")},
+ {0x3169, 0, 0, 0, g(Yes, No, false, false, "", "ᇌ")},
+ {0x316a, 0, 0, 0, g(Yes, No, false, false, "", "ᇎ")},
+ {0x316b, 0, 0, 0, g(Yes, No, false, false, "", "ᇓ")},
+ {0x316c, 0, 0, 0, g(Yes, No, false, false, "", "ᇗ")},
+ {0x316d, 0, 0, 0, g(Yes, No, false, false, "", "ᇙ")},
+ {0x316e, 0, 0, 0, g(Yes, No, false, false, "", "ᄜ")},
+ {0x316f, 0, 0, 0, g(Yes, No, false, false, "", "ᇝ")},
+ {0x3170, 0, 0, 0, g(Yes, No, false, false, "", "ᇟ")},
+ {0x3171, 0, 0, 0, g(Yes, No, false, false, "", "ᄝ")},
+ {0x3172, 0, 0, 0, g(Yes, No, false, false, "", "ᄞ")},
+ {0x3173, 0, 0, 0, g(Yes, No, false, false, "", "ᄠ")},
+ {0x3174, 0, 0, 0, g(Yes, No, false, false, "", "ᄢ")},
+ {0x3175, 0, 0, 0, g(Yes, No, false, false, "", "ᄣ")},
+ {0x3176, 0, 0, 0, g(Yes, No, false, false, "", "ᄧ")},
+ {0x3177, 0, 0, 0, g(Yes, No, false, false, "", "ᄩ")},
+ {0x3178, 0, 0, 0, g(Yes, No, false, false, "", "ᄫ")},
+ {0x3179, 0, 0, 0, g(Yes, No, false, false, "", "ᄬ")},
+ {0x317a, 0, 0, 0, g(Yes, No, false, false, "", "ᄭ")},
+ {0x317b, 0, 0, 0, g(Yes, No, false, false, "", "ᄮ")},
+ {0x317c, 0, 0, 0, g(Yes, No, false, false, "", "ᄯ")},
+ {0x317d, 0, 0, 0, g(Yes, No, false, false, "", "ᄲ")},
+ {0x317e, 0, 0, 0, g(Yes, No, false, false, "", "ᄶ")},
+ {0x317f, 0, 0, 0, g(Yes, No, false, false, "", "ᅀ")},
+ {0x3180, 0, 0, 0, g(Yes, No, false, false, "", "ᅇ")},
+ {0x3181, 0, 0, 0, g(Yes, No, false, false, "", "ᅌ")},
+ {0x3182, 0, 0, 0, g(Yes, No, false, false, "", "ᇱ")},
+ {0x3183, 0, 0, 0, g(Yes, No, false, false, "", "ᇲ")},
+ {0x3184, 0, 0, 0, g(Yes, No, false, false, "", "ᅗ")},
+ {0x3185, 0, 0, 0, g(Yes, No, false, false, "", "ᅘ")},
+ {0x3186, 0, 0, 0, g(Yes, No, false, false, "", "ᅙ")},
+ {0x3187, 0, 0, 0, g(Yes, No, false, false, "", "ᆄ")},
+ {0x3188, 0, 0, 0, g(Yes, No, false, false, "", "ᆅ")},
+ {0x3189, 0, 0, 0, g(Yes, No, false, false, "", "ᆈ")},
+ {0x318a, 0, 0, 0, g(Yes, No, false, false, "", "ᆑ")},
+ {0x318b, 0, 0, 0, g(Yes, No, false, false, "", "ᆒ")},
+ {0x318c, 0, 0, 0, g(Yes, No, false, false, "", "ᆔ")},
+ {0x318d, 0, 0, 0, g(Yes, No, false, false, "", "ᆞ")},
+ {0x318e, 0, 0, 0, g(Yes, No, false, false, "", "ᆡ")},
+ {0x318f, 0, 0, 0, f(Yes, false, "")},
+ {0x3192, 0, 0, 0, g(Yes, No, false, false, "", "一")},
+ {0x3193, 0, 0, 0, g(Yes, No, false, false, "", "二")},
+ {0x3194, 0, 0, 0, g(Yes, No, false, false, "", "三")},
+ {0x3195, 0, 0, 0, g(Yes, No, false, false, "", "四")},
+ {0x3196, 0, 0, 0, g(Yes, No, false, false, "", "上")},
+ {0x3197, 0, 0, 0, g(Yes, No, false, false, "", "中")},
+ {0x3198, 0, 0, 0, g(Yes, No, false, false, "", "下")},
+ {0x3199, 0, 0, 0, g(Yes, No, false, false, "", "甲")},
+ {0x319a, 0, 0, 0, g(Yes, No, false, false, "", "乙")},
+ {0x319b, 0, 0, 0, g(Yes, No, false, false, "", "丙")},
+ {0x319c, 0, 0, 0, g(Yes, No, false, false, "", "丁")},
+ {0x319d, 0, 0, 0, g(Yes, No, false, false, "", "天")},
+ {0x319e, 0, 0, 0, g(Yes, No, false, false, "", "地")},
+ {0x319f, 0, 0, 0, g(Yes, No, false, false, "", "人")},
+ {0x31a0, 0, 0, 0, f(Yes, false, "")},
+ {0x3200, 0, 0, 0, g(Yes, No, false, false, "", "(ᄀ)")},
+ {0x3201, 0, 0, 0, g(Yes, No, false, false, "", "(ᄂ)")},
+ {0x3202, 0, 0, 0, g(Yes, No, false, false, "", "(ᄃ)")},
+ {0x3203, 0, 0, 0, g(Yes, No, false, false, "", "(ᄅ)")},
+ {0x3204, 0, 0, 0, g(Yes, No, false, false, "", "(ᄆ)")},
+ {0x3205, 0, 0, 0, g(Yes, No, false, false, "", "(ᄇ)")},
+ {0x3206, 0, 0, 0, g(Yes, No, false, false, "", "(ᄉ)")},
+ {0x3207, 0, 0, 0, g(Yes, No, false, false, "", "(ᄋ)")},
+ {0x3208, 0, 0, 0, g(Yes, No, false, false, "", "(ᄌ)")},
+ {0x3209, 0, 0, 0, g(Yes, No, false, false, "", "(ᄎ)")},
+ {0x320a, 0, 0, 0, g(Yes, No, false, false, "", "(ᄏ)")},
+ {0x320b, 0, 0, 0, g(Yes, No, false, false, "", "(ᄐ)")},
+ {0x320c, 0, 0, 0, g(Yes, No, false, false, "", "(ᄑ)")},
+ {0x320d, 0, 0, 0, g(Yes, No, false, false, "", "(ᄒ)")},
+ {0x320e, 0, 0, 0, g(Yes, No, false, false, "", "(가)")},
+ {0x320f, 0, 0, 0, g(Yes, No, false, false, "", "(나)")},
+ {0x3210, 0, 0, 0, g(Yes, No, false, false, "", "(다)")},
+ {0x3211, 0, 0, 0, g(Yes, No, false, false, "", "(라)")},
+ {0x3212, 0, 0, 0, g(Yes, No, false, false, "", "(마)")},
+ {0x3213, 0, 0, 0, g(Yes, No, false, false, "", "(바)")},
+ {0x3214, 0, 0, 0, g(Yes, No, false, false, "", "(사)")},
+ {0x3215, 0, 0, 0, g(Yes, No, false, false, "", "(아)")},
+ {0x3216, 0, 0, 0, g(Yes, No, false, false, "", "(자)")},
+ {0x3217, 0, 0, 0, g(Yes, No, false, false, "", "(차)")},
+ {0x3218, 0, 0, 0, g(Yes, No, false, false, "", "(카)")},
+ {0x3219, 0, 0, 0, g(Yes, No, false, false, "", "(타)")},
+ {0x321a, 0, 0, 0, g(Yes, No, false, false, "", "(파)")},
+ {0x321b, 0, 0, 0, g(Yes, No, false, false, "", "(하)")},
+ {0x321c, 0, 0, 0, g(Yes, No, false, false, "", "(주)")},
+ {0x321d, 0, 0, 0, g(Yes, No, false, false, "", "(오전)")},
+ {0x321e, 0, 0, 0, g(Yes, No, false, false, "", "(오후)")},
+ {0x321f, 0, 0, 0, f(Yes, false, "")},
+ {0x3220, 0, 0, 0, g(Yes, No, false, false, "", "(一)")},
+ {0x3221, 0, 0, 0, g(Yes, No, false, false, "", "(二)")},
+ {0x3222, 0, 0, 0, g(Yes, No, false, false, "", "(三)")},
+ {0x3223, 0, 0, 0, g(Yes, No, false, false, "", "(四)")},
+ {0x3224, 0, 0, 0, g(Yes, No, false, false, "", "(五)")},
+ {0x3225, 0, 0, 0, g(Yes, No, false, false, "", "(六)")},
+ {0x3226, 0, 0, 0, g(Yes, No, false, false, "", "(七)")},
+ {0x3227, 0, 0, 0, g(Yes, No, false, false, "", "(八)")},
+ {0x3228, 0, 0, 0, g(Yes, No, false, false, "", "(九)")},
+ {0x3229, 0, 0, 0, g(Yes, No, false, false, "", "(十)")},
+ {0x322a, 0, 0, 0, g(Yes, No, false, false, "", "(月)")},
+ {0x322b, 0, 0, 0, g(Yes, No, false, false, "", "(火)")},
+ {0x322c, 0, 0, 0, g(Yes, No, false, false, "", "(水)")},
+ {0x322d, 0, 0, 0, g(Yes, No, false, false, "", "(木)")},
+ {0x322e, 0, 0, 0, g(Yes, No, false, false, "", "(金)")},
+ {0x322f, 0, 0, 0, g(Yes, No, false, false, "", "(土)")},
+ {0x3230, 0, 0, 0, g(Yes, No, false, false, "", "(日)")},
+ {0x3231, 0, 0, 0, g(Yes, No, false, false, "", "(株)")},
+ {0x3232, 0, 0, 0, g(Yes, No, false, false, "", "(有)")},
+ {0x3233, 0, 0, 0, g(Yes, No, false, false, "", "(社)")},
+ {0x3234, 0, 0, 0, g(Yes, No, false, false, "", "(名)")},
+ {0x3235, 0, 0, 0, g(Yes, No, false, false, "", "(特)")},
+ {0x3236, 0, 0, 0, g(Yes, No, false, false, "", "(財)")},
+ {0x3237, 0, 0, 0, g(Yes, No, false, false, "", "(祝)")},
+ {0x3238, 0, 0, 0, g(Yes, No, false, false, "", "(労)")},
+ {0x3239, 0, 0, 0, g(Yes, No, false, false, "", "(代)")},
+ {0x323a, 0, 0, 0, g(Yes, No, false, false, "", "(呼)")},
+ {0x323b, 0, 0, 0, g(Yes, No, false, false, "", "(学)")},
+ {0x323c, 0, 0, 0, g(Yes, No, false, false, "", "(監)")},
+ {0x323d, 0, 0, 0, g(Yes, No, false, false, "", "(企)")},
+ {0x323e, 0, 0, 0, g(Yes, No, false, false, "", "(資)")},
+ {0x323f, 0, 0, 0, g(Yes, No, false, false, "", "(協)")},
+ {0x3240, 0, 0, 0, g(Yes, No, false, false, "", "(祭)")},
+ {0x3241, 0, 0, 0, g(Yes, No, false, false, "", "(休)")},
+ {0x3242, 0, 0, 0, g(Yes, No, false, false, "", "(自)")},
+ {0x3243, 0, 0, 0, g(Yes, No, false, false, "", "(至)")},
+ {0x3244, 0, 0, 0, g(Yes, No, false, false, "", "問")},
+ {0x3245, 0, 0, 0, g(Yes, No, false, false, "", "幼")},
+ {0x3246, 0, 0, 0, g(Yes, No, false, false, "", "文")},
+ {0x3247, 0, 0, 0, g(Yes, No, false, false, "", "箏")},
+ {0x3248, 0, 0, 0, f(Yes, false, "")},
+ {0x3250, 0, 0, 0, g(Yes, No, false, false, "", "PTE")},
+ {0x3251, 0, 0, 0, g(Yes, No, false, false, "", "21")},
+ {0x3252, 0, 0, 0, g(Yes, No, false, false, "", "22")},
+ {0x3253, 0, 0, 0, g(Yes, No, false, false, "", "23")},
+ {0x3254, 0, 0, 0, g(Yes, No, false, false, "", "24")},
+ {0x3255, 0, 0, 0, g(Yes, No, false, false, "", "25")},
+ {0x3256, 0, 0, 0, g(Yes, No, false, false, "", "26")},
+ {0x3257, 0, 0, 0, g(Yes, No, false, false, "", "27")},
+ {0x3258, 0, 0, 0, g(Yes, No, false, false, "", "28")},
+ {0x3259, 0, 0, 0, g(Yes, No, false, false, "", "29")},
+ {0x325a, 0, 0, 0, g(Yes, No, false, false, "", "30")},
+ {0x325b, 0, 0, 0, g(Yes, No, false, false, "", "31")},
+ {0x325c, 0, 0, 0, g(Yes, No, false, false, "", "32")},
+ {0x325d, 0, 0, 0, g(Yes, No, false, false, "", "33")},
+ {0x325e, 0, 0, 0, g(Yes, No, false, false, "", "34")},
+ {0x325f, 0, 0, 0, g(Yes, No, false, false, "", "35")},
+ {0x3260, 0, 0, 0, g(Yes, No, false, false, "", "ᄀ")},
+ {0x3261, 0, 0, 0, g(Yes, No, false, false, "", "ᄂ")},
+ {0x3262, 0, 0, 0, g(Yes, No, false, false, "", "ᄃ")},
+ {0x3263, 0, 0, 0, g(Yes, No, false, false, "", "ᄅ")},
+ {0x3264, 0, 0, 0, g(Yes, No, false, false, "", "ᄆ")},
+ {0x3265, 0, 0, 0, g(Yes, No, false, false, "", "ᄇ")},
+ {0x3266, 0, 0, 0, g(Yes, No, false, false, "", "ᄉ")},
+ {0x3267, 0, 0, 0, g(Yes, No, false, false, "", "ᄋ")},
+ {0x3268, 0, 0, 0, g(Yes, No, false, false, "", "ᄌ")},
+ {0x3269, 0, 0, 0, g(Yes, No, false, false, "", "ᄎ")},
+ {0x326a, 0, 0, 0, g(Yes, No, false, false, "", "ᄏ")},
+ {0x326b, 0, 0, 0, g(Yes, No, false, false, "", "ᄐ")},
+ {0x326c, 0, 0, 0, g(Yes, No, false, false, "", "ᄑ")},
+ {0x326d, 0, 0, 0, g(Yes, No, false, false, "", "ᄒ")},
+ {0x326e, 0, 0, 1, g(Yes, No, false, false, "", "가")},
+ {0x326f, 0, 0, 1, g(Yes, No, false, false, "", "나")},
+ {0x3270, 0, 0, 1, g(Yes, No, false, false, "", "다")},
+ {0x3271, 0, 0, 1, g(Yes, No, false, false, "", "라")},
+ {0x3272, 0, 0, 1, g(Yes, No, false, false, "", "마")},
+ {0x3273, 0, 0, 1, g(Yes, No, false, false, "", "바")},
+ {0x3274, 0, 0, 1, g(Yes, No, false, false, "", "사")},
+ {0x3275, 0, 0, 1, g(Yes, No, false, false, "", "아")},
+ {0x3276, 0, 0, 1, g(Yes, No, false, false, "", "자")},
+ {0x3277, 0, 0, 1, g(Yes, No, false, false, "", "차")},
+ {0x3278, 0, 0, 1, g(Yes, No, false, false, "", "카")},
+ {0x3279, 0, 0, 1, g(Yes, No, false, false, "", "타")},
+ {0x327a, 0, 0, 1, g(Yes, No, false, false, "", "파")},
+ {0x327b, 0, 0, 1, g(Yes, No, false, false, "", "하")},
+ {0x327c, 0, 0, 1, g(Yes, No, false, false, "", "참고")},
+ {0x327d, 0, 0, 1, g(Yes, No, false, false, "", "주의")},
+ {0x327e, 0, 0, 1, g(Yes, No, false, false, "", "우")},
+ {0x327f, 0, 0, 0, f(Yes, false, "")},
+ {0x3280, 0, 0, 0, g(Yes, No, false, false, "", "一")},
+ {0x3281, 0, 0, 0, g(Yes, No, false, false, "", "二")},
+ {0x3282, 0, 0, 0, g(Yes, No, false, false, "", "三")},
+ {0x3283, 0, 0, 0, g(Yes, No, false, false, "", "四")},
+ {0x3284, 0, 0, 0, g(Yes, No, false, false, "", "五")},
+ {0x3285, 0, 0, 0, g(Yes, No, false, false, "", "六")},
+ {0x3286, 0, 0, 0, g(Yes, No, false, false, "", "七")},
+ {0x3287, 0, 0, 0, g(Yes, No, false, false, "", "八")},
+ {0x3288, 0, 0, 0, g(Yes, No, false, false, "", "九")},
+ {0x3289, 0, 0, 0, g(Yes, No, false, false, "", "十")},
+ {0x328a, 0, 0, 0, g(Yes, No, false, false, "", "月")},
+ {0x328b, 0, 0, 0, g(Yes, No, false, false, "", "火")},
+ {0x328c, 0, 0, 0, g(Yes, No, false, false, "", "水")},
+ {0x328d, 0, 0, 0, g(Yes, No, false, false, "", "木")},
+ {0x328e, 0, 0, 0, g(Yes, No, false, false, "", "金")},
+ {0x328f, 0, 0, 0, g(Yes, No, false, false, "", "土")},
+ {0x3290, 0, 0, 0, g(Yes, No, false, false, "", "日")},
+ {0x3291, 0, 0, 0, g(Yes, No, false, false, "", "株")},
+ {0x3292, 0, 0, 0, g(Yes, No, false, false, "", "有")},
+ {0x3293, 0, 0, 0, g(Yes, No, false, false, "", "社")},
+ {0x3294, 0, 0, 0, g(Yes, No, false, false, "", "名")},
+ {0x3295, 0, 0, 0, g(Yes, No, false, false, "", "特")},
+ {0x3296, 0, 0, 0, g(Yes, No, false, false, "", "財")},
+ {0x3297, 0, 0, 0, g(Yes, No, false, false, "", "祝")},
+ {0x3298, 0, 0, 0, g(Yes, No, false, false, "", "労")},
+ {0x3299, 0, 0, 0, g(Yes, No, false, false, "", "秘")},
+ {0x329a, 0, 0, 0, g(Yes, No, false, false, "", "男")},
+ {0x329b, 0, 0, 0, g(Yes, No, false, false, "", "女")},
+ {0x329c, 0, 0, 0, g(Yes, No, false, false, "", "適")},
+ {0x329d, 0, 0, 0, g(Yes, No, false, false, "", "優")},
+ {0x329e, 0, 0, 0, g(Yes, No, false, false, "", "印")},
+ {0x329f, 0, 0, 0, g(Yes, No, false, false, "", "注")},
+ {0x32a0, 0, 0, 0, g(Yes, No, false, false, "", "項")},
+ {0x32a1, 0, 0, 0, g(Yes, No, false, false, "", "休")},
+ {0x32a2, 0, 0, 0, g(Yes, No, false, false, "", "写")},
+ {0x32a3, 0, 0, 0, g(Yes, No, false, false, "", "正")},
+ {0x32a4, 0, 0, 0, g(Yes, No, false, false, "", "上")},
+ {0x32a5, 0, 0, 0, g(Yes, No, false, false, "", "中")},
+ {0x32a6, 0, 0, 0, g(Yes, No, false, false, "", "下")},
+ {0x32a7, 0, 0, 0, g(Yes, No, false, false, "", "左")},
+ {0x32a8, 0, 0, 0, g(Yes, No, false, false, "", "右")},
+ {0x32a9, 0, 0, 0, g(Yes, No, false, false, "", "医")},
+ {0x32aa, 0, 0, 0, g(Yes, No, false, false, "", "宗")},
+ {0x32ab, 0, 0, 0, g(Yes, No, false, false, "", "学")},
+ {0x32ac, 0, 0, 0, g(Yes, No, false, false, "", "監")},
+ {0x32ad, 0, 0, 0, g(Yes, No, false, false, "", "企")},
+ {0x32ae, 0, 0, 0, g(Yes, No, false, false, "", "資")},
+ {0x32af, 0, 0, 0, g(Yes, No, false, false, "", "協")},
+ {0x32b0, 0, 0, 0, g(Yes, No, false, false, "", "夜")},
+ {0x32b1, 0, 0, 0, g(Yes, No, false, false, "", "36")},
+ {0x32b2, 0, 0, 0, g(Yes, No, false, false, "", "37")},
+ {0x32b3, 0, 0, 0, g(Yes, No, false, false, "", "38")},
+ {0x32b4, 0, 0, 0, g(Yes, No, false, false, "", "39")},
+ {0x32b5, 0, 0, 0, g(Yes, No, false, false, "", "40")},
+ {0x32b6, 0, 0, 0, g(Yes, No, false, false, "", "41")},
+ {0x32b7, 0, 0, 0, g(Yes, No, false, false, "", "42")},
+ {0x32b8, 0, 0, 0, g(Yes, No, false, false, "", "43")},
+ {0x32b9, 0, 0, 0, g(Yes, No, false, false, "", "44")},
+ {0x32ba, 0, 0, 0, g(Yes, No, false, false, "", "45")},
+ {0x32bb, 0, 0, 0, g(Yes, No, false, false, "", "46")},
+ {0x32bc, 0, 0, 0, g(Yes, No, false, false, "", "47")},
+ {0x32bd, 0, 0, 0, g(Yes, No, false, false, "", "48")},
+ {0x32be, 0, 0, 0, g(Yes, No, false, false, "", "49")},
+ {0x32bf, 0, 0, 0, g(Yes, No, false, false, "", "50")},
+ {0x32c0, 0, 0, 0, g(Yes, No, false, false, "", "1月")},
+ {0x32c1, 0, 0, 0, g(Yes, No, false, false, "", "2月")},
+ {0x32c2, 0, 0, 0, g(Yes, No, false, false, "", "3月")},
+ {0x32c3, 0, 0, 0, g(Yes, No, false, false, "", "4月")},
+ {0x32c4, 0, 0, 0, g(Yes, No, false, false, "", "5月")},
+ {0x32c5, 0, 0, 0, g(Yes, No, false, false, "", "6月")},
+ {0x32c6, 0, 0, 0, g(Yes, No, false, false, "", "7月")},
+ {0x32c7, 0, 0, 0, g(Yes, No, false, false, "", "8月")},
+ {0x32c8, 0, 0, 0, g(Yes, No, false, false, "", "9月")},
+ {0x32c9, 0, 0, 0, g(Yes, No, false, false, "", "10月")},
+ {0x32ca, 0, 0, 0, g(Yes, No, false, false, "", "11月")},
+ {0x32cb, 0, 0, 0, g(Yes, No, false, false, "", "12月")},
+ {0x32cc, 0, 0, 0, g(Yes, No, false, false, "", "Hg")},
+ {0x32cd, 0, 0, 0, g(Yes, No, false, false, "", "erg")},
+ {0x32ce, 0, 0, 0, g(Yes, No, false, false, "", "eV")},
+ {0x32cf, 0, 0, 0, g(Yes, No, false, false, "", "LTD")},
+ {0x32d0, 0, 0, 0, g(Yes, No, false, false, "", "ア")},
+ {0x32d1, 0, 0, 0, g(Yes, No, false, false, "", "イ")},
+ {0x32d2, 0, 0, 0, g(Yes, No, false, false, "", "ウ")},
+ {0x32d3, 0, 0, 0, g(Yes, No, false, false, "", "エ")},
+ {0x32d4, 0, 0, 0, g(Yes, No, false, false, "", "オ")},
+ {0x32d5, 0, 0, 0, g(Yes, No, false, false, "", "カ")},
+ {0x32d6, 0, 0, 0, g(Yes, No, false, false, "", "キ")},
+ {0x32d7, 0, 0, 0, g(Yes, No, false, false, "", "ク")},
+ {0x32d8, 0, 0, 0, g(Yes, No, false, false, "", "ケ")},
+ {0x32d9, 0, 0, 0, g(Yes, No, false, false, "", "コ")},
+ {0x32da, 0, 0, 0, g(Yes, No, false, false, "", "サ")},
+ {0x32db, 0, 0, 0, g(Yes, No, false, false, "", "シ")},
+ {0x32dc, 0, 0, 0, g(Yes, No, false, false, "", "ス")},
+ {0x32dd, 0, 0, 0, g(Yes, No, false, false, "", "セ")},
+ {0x32de, 0, 0, 0, g(Yes, No, false, false, "", "ソ")},
+ {0x32df, 0, 0, 0, g(Yes, No, false, false, "", "タ")},
+ {0x32e0, 0, 0, 0, g(Yes, No, false, false, "", "チ")},
+ {0x32e1, 0, 0, 0, g(Yes, No, false, false, "", "ツ")},
+ {0x32e2, 0, 0, 0, g(Yes, No, false, false, "", "テ")},
+ {0x32e3, 0, 0, 0, g(Yes, No, false, false, "", "ト")},
+ {0x32e4, 0, 0, 0, g(Yes, No, false, false, "", "ナ")},
+ {0x32e5, 0, 0, 0, g(Yes, No, false, false, "", "ニ")},
+ {0x32e6, 0, 0, 0, g(Yes, No, false, false, "", "ヌ")},
+ {0x32e7, 0, 0, 0, g(Yes, No, false, false, "", "ネ")},
+ {0x32e8, 0, 0, 0, g(Yes, No, false, false, "", "ノ")},
+ {0x32e9, 0, 0, 0, g(Yes, No, false, false, "", "ハ")},
+ {0x32ea, 0, 0, 0, g(Yes, No, false, false, "", "ヒ")},
+ {0x32eb, 0, 0, 0, g(Yes, No, false, false, "", "フ")},
+ {0x32ec, 0, 0, 0, g(Yes, No, false, false, "", "ヘ")},
+ {0x32ed, 0, 0, 0, g(Yes, No, false, false, "", "ホ")},
+ {0x32ee, 0, 0, 0, g(Yes, No, false, false, "", "マ")},
+ {0x32ef, 0, 0, 0, g(Yes, No, false, false, "", "ミ")},
+ {0x32f0, 0, 0, 0, g(Yes, No, false, false, "", "ム")},
+ {0x32f1, 0, 0, 0, g(Yes, No, false, false, "", "メ")},
+ {0x32f2, 0, 0, 0, g(Yes, No, false, false, "", "モ")},
+ {0x32f3, 0, 0, 0, g(Yes, No, false, false, "", "ヤ")},
+ {0x32f4, 0, 0, 0, g(Yes, No, false, false, "", "ユ")},
+ {0x32f5, 0, 0, 0, g(Yes, No, false, false, "", "ヨ")},
+ {0x32f6, 0, 0, 0, g(Yes, No, false, false, "", "ラ")},
+ {0x32f7, 0, 0, 0, g(Yes, No, false, false, "", "リ")},
+ {0x32f8, 0, 0, 0, g(Yes, No, false, false, "", "ル")},
+ {0x32f9, 0, 0, 0, g(Yes, No, false, false, "", "レ")},
+ {0x32fa, 0, 0, 0, g(Yes, No, false, false, "", "ロ")},
+ {0x32fb, 0, 0, 0, g(Yes, No, false, false, "", "ワ")},
+ {0x32fc, 0, 0, 0, g(Yes, No, false, false, "", "ヰ")},
+ {0x32fd, 0, 0, 0, g(Yes, No, false, false, "", "ヱ")},
+ {0x32fe, 0, 0, 0, g(Yes, No, false, false, "", "ヲ")},
+ {0x32ff, 0, 0, 0, f(Yes, false, "")},
+ {0x3300, 0, 0, 0, g(Yes, No, false, false, "", "アパート")},
+ {0x3301, 0, 0, 0, g(Yes, No, false, false, "", "アルファ")},
+ {0x3302, 0, 0, 0, g(Yes, No, false, false, "", "アンペア")},
+ {0x3303, 0, 0, 0, g(Yes, No, false, false, "", "アール")},
+ {0x3304, 0, 0, 1, g(Yes, No, false, false, "", "イニング")},
+ {0x3305, 0, 0, 0, g(Yes, No, false, false, "", "インチ")},
+ {0x3306, 0, 0, 0, g(Yes, No, false, false, "", "ウォン")},
+ {0x3307, 0, 0, 1, g(Yes, No, false, false, "", "エスクード")},
+ {0x3308, 0, 0, 0, g(Yes, No, false, false, "", "エーカー")},
+ {0x3309, 0, 0, 0, g(Yes, No, false, false, "", "オンス")},
+ {0x330a, 0, 0, 0, g(Yes, No, false, false, "", "オーム")},
+ {0x330b, 0, 0, 0, g(Yes, No, false, false, "", "カイリ")},
+ {0x330c, 0, 0, 0, g(Yes, No, false, false, "", "カラット")},
+ {0x330d, 0, 0, 0, g(Yes, No, false, false, "", "カロリー")},
+ {0x330e, 0, 0, 0, g(Yes, No, false, false, "", "ガロン")},
+ {0x330f, 0, 0, 0, g(Yes, No, false, false, "", "ガンマ")},
+ {0x3310, 0, 0, 1, g(Yes, No, false, false, "", "ギガ")},
+ {0x3311, 0, 0, 0, g(Yes, No, false, false, "", "ギニー")},
+ {0x3312, 0, 0, 0, g(Yes, No, false, false, "", "キュリー")},
+ {0x3313, 0, 0, 0, g(Yes, No, false, false, "", "ギルダー")},
+ {0x3314, 0, 0, 0, g(Yes, No, false, false, "", "キロ")},
+ {0x3315, 0, 0, 0, g(Yes, No, false, false, "", "キログラム")},
+ {0x3316, 0, 0, 0, g(Yes, No, false, false, "", "キロメートル")},
+ {0x3317, 0, 0, 0, g(Yes, No, false, false, "", "キロワット")},
+ {0x3318, 0, 0, 0, g(Yes, No, false, false, "", "グラム")},
+ {0x3319, 0, 0, 0, g(Yes, No, false, false, "", "グラムトン")},
+ {0x331a, 0, 0, 0, g(Yes, No, false, false, "", "クルゼイロ")},
+ {0x331b, 0, 0, 0, g(Yes, No, false, false, "", "クローネ")},
+ {0x331c, 0, 0, 0, g(Yes, No, false, false, "", "ケース")},
+ {0x331d, 0, 0, 0, g(Yes, No, false, false, "", "コルナ")},
+ {0x331e, 0, 0, 1, g(Yes, No, false, false, "", "コーポ")},
+ {0x331f, 0, 0, 0, g(Yes, No, false, false, "", "サイクル")},
+ {0x3320, 0, 0, 0, g(Yes, No, false, false, "", "サンチーム")},
+ {0x3321, 0, 0, 1, g(Yes, No, false, false, "", "シリング")},
+ {0x3322, 0, 0, 0, g(Yes, No, false, false, "", "センチ")},
+ {0x3323, 0, 0, 0, g(Yes, No, false, false, "", "セント")},
+ {0x3324, 0, 0, 0, g(Yes, No, false, false, "", "ダース")},
+ {0x3325, 0, 0, 0, g(Yes, No, false, false, "", "デシ")},
+ {0x3326, 0, 0, 0, g(Yes, No, false, false, "", "ドル")},
+ {0x3327, 0, 0, 0, g(Yes, No, false, false, "", "トン")},
+ {0x3328, 0, 0, 0, g(Yes, No, false, false, "", "ナノ")},
+ {0x3329, 0, 0, 0, g(Yes, No, false, false, "", "ノット")},
+ {0x332a, 0, 0, 0, g(Yes, No, false, false, "", "ハイツ")},
+ {0x332b, 0, 0, 0, g(Yes, No, false, false, "", "パーセント")},
+ {0x332c, 0, 0, 0, g(Yes, No, false, false, "", "パーツ")},
+ {0x332d, 0, 0, 0, g(Yes, No, false, false, "", "バーレル")},
+ {0x332e, 0, 0, 0, g(Yes, No, false, false, "", "ピアストル")},
+ {0x332f, 0, 0, 0, g(Yes, No, false, false, "", "ピクル")},
+ {0x3330, 0, 0, 0, g(Yes, No, false, false, "", "ピコ")},
+ {0x3331, 0, 0, 0, g(Yes, No, false, false, "", "ビル")},
+ {0x3332, 0, 0, 1, g(Yes, No, false, false, "", "ファラッド")},
+ {0x3333, 0, 0, 0, g(Yes, No, false, false, "", "フィート")},
+ {0x3334, 0, 0, 0, g(Yes, No, false, false, "", "ブッシェル")},
+ {0x3335, 0, 0, 0, g(Yes, No, false, false, "", "フラン")},
+ {0x3336, 0, 0, 0, g(Yes, No, false, false, "", "ヘクタール")},
+ {0x3337, 0, 0, 0, g(Yes, No, false, false, "", "ペソ")},
+ {0x3338, 0, 0, 0, g(Yes, No, false, false, "", "ペニヒ")},
+ {0x3339, 0, 0, 0, g(Yes, No, false, false, "", "ヘルツ")},
+ {0x333a, 0, 0, 0, g(Yes, No, false, false, "", "ペンス")},
+ {0x333b, 0, 0, 1, g(Yes, No, false, false, "", "ページ")},
+ {0x333c, 0, 0, 0, g(Yes, No, false, false, "", "ベータ")},
+ {0x333d, 0, 0, 0, g(Yes, No, false, false, "", "ポイント")},
+ {0x333e, 0, 0, 0, g(Yes, No, false, false, "", "ボルト")},
+ {0x333f, 0, 0, 0, g(Yes, No, false, false, "", "ホン")},
+ {0x3340, 0, 0, 1, g(Yes, No, false, false, "", "ポンド")},
+ {0x3341, 0, 0, 0, g(Yes, No, false, false, "", "ホール")},
+ {0x3342, 0, 0, 0, g(Yes, No, false, false, "", "ホーン")},
+ {0x3343, 0, 0, 0, g(Yes, No, false, false, "", "マイクロ")},
+ {0x3344, 0, 0, 0, g(Yes, No, false, false, "", "マイル")},
+ {0x3345, 0, 0, 0, g(Yes, No, false, false, "", "マッハ")},
+ {0x3346, 0, 0, 0, g(Yes, No, false, false, "", "マルク")},
+ {0x3347, 0, 0, 0, g(Yes, No, false, false, "", "マンション")},
+ {0x3348, 0, 0, 0, g(Yes, No, false, false, "", "ミクロン")},
+ {0x3349, 0, 0, 0, g(Yes, No, false, false, "", "ミリ")},
+ {0x334a, 0, 0, 0, g(Yes, No, false, false, "", "ミリバール")},
+ {0x334b, 0, 0, 1, g(Yes, No, false, false, "", "メガ")},
+ {0x334c, 0, 0, 0, g(Yes, No, false, false, "", "メガトン")},
+ {0x334d, 0, 0, 0, g(Yes, No, false, false, "", "メートル")},
+ {0x334e, 0, 0, 1, g(Yes, No, false, false, "", "ヤード")},
+ {0x334f, 0, 0, 0, g(Yes, No, false, false, "", "ヤール")},
+ {0x3350, 0, 0, 0, g(Yes, No, false, false, "", "ユアン")},
+ {0x3351, 0, 0, 0, g(Yes, No, false, false, "", "リットル")},
+ {0x3352, 0, 0, 0, g(Yes, No, false, false, "", "リラ")},
+ {0x3353, 0, 0, 0, g(Yes, No, false, false, "", "ルピー")},
+ {0x3354, 0, 0, 0, g(Yes, No, false, false, "", "ルーブル")},
+ {0x3355, 0, 0, 0, g(Yes, No, false, false, "", "レム")},
+ {0x3356, 0, 0, 0, g(Yes, No, false, false, "", "レントゲン")},
+ {0x3357, 0, 0, 0, g(Yes, No, false, false, "", "ワット")},
+ {0x3358, 0, 0, 0, g(Yes, No, false, false, "", "0点")},
+ {0x3359, 0, 0, 0, g(Yes, No, false, false, "", "1点")},
+ {0x335a, 0, 0, 0, g(Yes, No, false, false, "", "2点")},
+ {0x335b, 0, 0, 0, g(Yes, No, false, false, "", "3点")},
+ {0x335c, 0, 0, 0, g(Yes, No, false, false, "", "4点")},
+ {0x335d, 0, 0, 0, g(Yes, No, false, false, "", "5点")},
+ {0x335e, 0, 0, 0, g(Yes, No, false, false, "", "6点")},
+ {0x335f, 0, 0, 0, g(Yes, No, false, false, "", "7点")},
+ {0x3360, 0, 0, 0, g(Yes, No, false, false, "", "8点")},
+ {0x3361, 0, 0, 0, g(Yes, No, false, false, "", "9点")},
+ {0x3362, 0, 0, 0, g(Yes, No, false, false, "", "10点")},
+ {0x3363, 0, 0, 0, g(Yes, No, false, false, "", "11点")},
+ {0x3364, 0, 0, 0, g(Yes, No, false, false, "", "12点")},
+ {0x3365, 0, 0, 0, g(Yes, No, false, false, "", "13点")},
+ {0x3366, 0, 0, 0, g(Yes, No, false, false, "", "14点")},
+ {0x3367, 0, 0, 0, g(Yes, No, false, false, "", "15点")},
+ {0x3368, 0, 0, 0, g(Yes, No, false, false, "", "16点")},
+ {0x3369, 0, 0, 0, g(Yes, No, false, false, "", "17点")},
+ {0x336a, 0, 0, 0, g(Yes, No, false, false, "", "18点")},
+ {0x336b, 0, 0, 0, g(Yes, No, false, false, "", "19点")},
+ {0x336c, 0, 0, 0, g(Yes, No, false, false, "", "20点")},
+ {0x336d, 0, 0, 0, g(Yes, No, false, false, "", "21点")},
+ {0x336e, 0, 0, 0, g(Yes, No, false, false, "", "22点")},
+ {0x336f, 0, 0, 0, g(Yes, No, false, false, "", "23点")},
+ {0x3370, 0, 0, 0, g(Yes, No, false, false, "", "24点")},
+ {0x3371, 0, 0, 0, g(Yes, No, false, false, "", "hPa")},
+ {0x3372, 0, 0, 0, g(Yes, No, false, false, "", "da")},
+ {0x3373, 0, 0, 0, g(Yes, No, false, false, "", "AU")},
+ {0x3374, 0, 0, 0, g(Yes, No, false, false, "", "bar")},
+ {0x3375, 0, 0, 0, g(Yes, No, false, false, "", "oV")},
+ {0x3376, 0, 0, 0, g(Yes, No, false, false, "", "pc")},
+ {0x3377, 0, 0, 0, g(Yes, No, false, false, "", "dm")},
+ {0x3378, 0, 0, 0, g(Yes, No, false, false, "", "dm2")},
+ {0x3379, 0, 0, 0, g(Yes, No, false, false, "", "dm3")},
+ {0x337a, 0, 0, 0, g(Yes, No, false, false, "", "IU")},
+ {0x337b, 0, 0, 0, g(Yes, No, false, false, "", "平成")},
+ {0x337c, 0, 0, 0, g(Yes, No, false, false, "", "昭和")},
+ {0x337d, 0, 0, 0, g(Yes, No, false, false, "", "大正")},
+ {0x337e, 0, 0, 0, g(Yes, No, false, false, "", "明治")},
+ {0x337f, 0, 0, 0, g(Yes, No, false, false, "", "株式会社")},
+ {0x3380, 0, 0, 0, g(Yes, No, false, false, "", "pA")},
+ {0x3381, 0, 0, 0, g(Yes, No, false, false, "", "nA")},
+ {0x3382, 0, 0, 0, g(Yes, No, false, false, "", "μA")},
+ {0x3383, 0, 0, 0, g(Yes, No, false, false, "", "mA")},
+ {0x3384, 0, 0, 0, g(Yes, No, false, false, "", "kA")},
+ {0x3385, 0, 0, 0, g(Yes, No, false, false, "", "KB")},
+ {0x3386, 0, 0, 0, g(Yes, No, false, false, "", "MB")},
+ {0x3387, 0, 0, 0, g(Yes, No, false, false, "", "GB")},
+ {0x3388, 0, 0, 0, g(Yes, No, false, false, "", "cal")},
+ {0x3389, 0, 0, 0, g(Yes, No, false, false, "", "kcal")},
+ {0x338a, 0, 0, 0, g(Yes, No, false, false, "", "pF")},
+ {0x338b, 0, 0, 0, g(Yes, No, false, false, "", "nF")},
+ {0x338c, 0, 0, 0, g(Yes, No, false, false, "", "μF")},
+ {0x338d, 0, 0, 0, g(Yes, No, false, false, "", "μg")},
+ {0x338e, 0, 0, 0, g(Yes, No, false, false, "", "mg")},
+ {0x338f, 0, 0, 0, g(Yes, No, false, false, "", "kg")},
+ {0x3390, 0, 0, 0, g(Yes, No, false, false, "", "Hz")},
+ {0x3391, 0, 0, 0, g(Yes, No, false, false, "", "kHz")},
+ {0x3392, 0, 0, 0, g(Yes, No, false, false, "", "MHz")},
+ {0x3393, 0, 0, 0, g(Yes, No, false, false, "", "GHz")},
+ {0x3394, 0, 0, 0, g(Yes, No, false, false, "", "THz")},
+ {0x3395, 0, 0, 0, g(Yes, No, false, false, "", "μl")},
+ {0x3396, 0, 0, 0, g(Yes, No, false, false, "", "ml")},
+ {0x3397, 0, 0, 0, g(Yes, No, false, false, "", "dl")},
+ {0x3398, 0, 0, 0, g(Yes, No, false, false, "", "kl")},
+ {0x3399, 0, 0, 0, g(Yes, No, false, false, "", "fm")},
+ {0x339a, 0, 0, 0, g(Yes, No, false, false, "", "nm")},
+ {0x339b, 0, 0, 0, g(Yes, No, false, false, "", "μm")},
+ {0x339c, 0, 0, 0, g(Yes, No, false, false, "", "mm")},
+ {0x339d, 0, 0, 0, g(Yes, No, false, false, "", "cm")},
+ {0x339e, 0, 0, 0, g(Yes, No, false, false, "", "km")},
+ {0x339f, 0, 0, 0, g(Yes, No, false, false, "", "mm2")},
+ {0x33a0, 0, 0, 0, g(Yes, No, false, false, "", "cm2")},
+ {0x33a1, 0, 0, 0, g(Yes, No, false, false, "", "m2")},
+ {0x33a2, 0, 0, 0, g(Yes, No, false, false, "", "km2")},
+ {0x33a3, 0, 0, 0, g(Yes, No, false, false, "", "mm3")},
+ {0x33a4, 0, 0, 0, g(Yes, No, false, false, "", "cm3")},
+ {0x33a5, 0, 0, 0, g(Yes, No, false, false, "", "m3")},
+ {0x33a6, 0, 0, 0, g(Yes, No, false, false, "", "km3")},
+ {0x33a7, 0, 0, 0, g(Yes, No, false, false, "", "m∕s")},
+ {0x33a8, 0, 0, 0, g(Yes, No, false, false, "", "m∕s2")},
+ {0x33a9, 0, 0, 0, g(Yes, No, false, false, "", "Pa")},
+ {0x33aa, 0, 0, 0, g(Yes, No, false, false, "", "kPa")},
+ {0x33ab, 0, 0, 0, g(Yes, No, false, false, "", "MPa")},
+ {0x33ac, 0, 0, 0, g(Yes, No, false, false, "", "GPa")},
+ {0x33ad, 0, 0, 0, g(Yes, No, false, false, "", "rad")},
+ {0x33ae, 0, 0, 0, g(Yes, No, false, false, "", "rad∕s")},
+ {0x33af, 0, 0, 0, g(Yes, No, false, false, "", "rad∕s2")},
+ {0x33b0, 0, 0, 0, g(Yes, No, false, false, "", "ps")},
+ {0x33b1, 0, 0, 0, g(Yes, No, false, false, "", "ns")},
+ {0x33b2, 0, 0, 0, g(Yes, No, false, false, "", "μs")},
+ {0x33b3, 0, 0, 0, g(Yes, No, false, false, "", "ms")},
+ {0x33b4, 0, 0, 0, g(Yes, No, false, false, "", "pV")},
+ {0x33b5, 0, 0, 0, g(Yes, No, false, false, "", "nV")},
+ {0x33b6, 0, 0, 0, g(Yes, No, false, false, "", "μV")},
+ {0x33b7, 0, 0, 0, g(Yes, No, false, false, "", "mV")},
+ {0x33b8, 0, 0, 0, g(Yes, No, false, false, "", "kV")},
+ {0x33b9, 0, 0, 0, g(Yes, No, false, false, "", "MV")},
+ {0x33ba, 0, 0, 0, g(Yes, No, false, false, "", "pW")},
+ {0x33bb, 0, 0, 0, g(Yes, No, false, false, "", "nW")},
+ {0x33bc, 0, 0, 0, g(Yes, No, false, false, "", "μW")},
+ {0x33bd, 0, 0, 0, g(Yes, No, false, false, "", "mW")},
+ {0x33be, 0, 0, 0, g(Yes, No, false, false, "", "kW")},
+ {0x33bf, 0, 0, 0, g(Yes, No, false, false, "", "MW")},
+ {0x33c0, 0, 0, 0, g(Yes, No, false, false, "", "kΩ")},
+ {0x33c1, 0, 0, 0, g(Yes, No, false, false, "", "MΩ")},
+ {0x33c2, 0, 0, 0, g(Yes, No, false, false, "", "a.m.")},
+ {0x33c3, 0, 0, 0, g(Yes, No, false, false, "", "Bq")},
+ {0x33c4, 0, 0, 0, g(Yes, No, false, false, "", "cc")},
+ {0x33c5, 0, 0, 0, g(Yes, No, false, false, "", "cd")},
+ {0x33c6, 0, 0, 0, g(Yes, No, false, false, "", "C∕kg")},
+ {0x33c7, 0, 0, 0, g(Yes, No, false, false, "", "Co.")},
+ {0x33c8, 0, 0, 0, g(Yes, No, false, false, "", "dB")},
+ {0x33c9, 0, 0, 0, g(Yes, No, false, false, "", "Gy")},
+ {0x33ca, 0, 0, 0, g(Yes, No, false, false, "", "ha")},
+ {0x33cb, 0, 0, 0, g(Yes, No, false, false, "", "HP")},
+ {0x33cc, 0, 0, 0, g(Yes, No, false, false, "", "in")},
+ {0x33cd, 0, 0, 0, g(Yes, No, false, false, "", "KK")},
+ {0x33ce, 0, 0, 0, g(Yes, No, false, false, "", "KM")},
+ {0x33cf, 0, 0, 0, g(Yes, No, false, false, "", "kt")},
+ {0x33d0, 0, 0, 0, g(Yes, No, false, false, "", "lm")},
+ {0x33d1, 0, 0, 0, g(Yes, No, false, false, "", "ln")},
+ {0x33d2, 0, 0, 0, g(Yes, No, false, false, "", "log")},
+ {0x33d3, 0, 0, 0, g(Yes, No, false, false, "", "lx")},
+ {0x33d4, 0, 0, 0, g(Yes, No, false, false, "", "mb")},
+ {0x33d5, 0, 0, 0, g(Yes, No, false, false, "", "mil")},
+ {0x33d6, 0, 0, 0, g(Yes, No, false, false, "", "mol")},
+ {0x33d7, 0, 0, 0, g(Yes, No, false, false, "", "PH")},
+ {0x33d8, 0, 0, 0, g(Yes, No, false, false, "", "p.m.")},
+ {0x33d9, 0, 0, 0, g(Yes, No, false, false, "", "PPM")},
+ {0x33da, 0, 0, 0, g(Yes, No, false, false, "", "PR")},
+ {0x33db, 0, 0, 0, g(Yes, No, false, false, "", "sr")},
+ {0x33dc, 0, 0, 0, g(Yes, No, false, false, "", "Sv")},
+ {0x33dd, 0, 0, 0, g(Yes, No, false, false, "", "Wb")},
+ {0x33de, 0, 0, 0, g(Yes, No, false, false, "", "V∕m")},
+ {0x33df, 0, 0, 0, g(Yes, No, false, false, "", "A∕m")},
+ {0x33e0, 0, 0, 0, g(Yes, No, false, false, "", "1日")},
+ {0x33e1, 0, 0, 0, g(Yes, No, false, false, "", "2日")},
+ {0x33e2, 0, 0, 0, g(Yes, No, false, false, "", "3日")},
+ {0x33e3, 0, 0, 0, g(Yes, No, false, false, "", "4日")},
+ {0x33e4, 0, 0, 0, g(Yes, No, false, false, "", "5日")},
+ {0x33e5, 0, 0, 0, g(Yes, No, false, false, "", "6日")},
+ {0x33e6, 0, 0, 0, g(Yes, No, false, false, "", "7日")},
+ {0x33e7, 0, 0, 0, g(Yes, No, false, false, "", "8日")},
+ {0x33e8, 0, 0, 0, g(Yes, No, false, false, "", "9日")},
+ {0x33e9, 0, 0, 0, g(Yes, No, false, false, "", "10日")},
+ {0x33ea, 0, 0, 0, g(Yes, No, false, false, "", "11日")},
+ {0x33eb, 0, 0, 0, g(Yes, No, false, false, "", "12日")},
+ {0x33ec, 0, 0, 0, g(Yes, No, false, false, "", "13日")},
+ {0x33ed, 0, 0, 0, g(Yes, No, false, false, "", "14日")},
+ {0x33ee, 0, 0, 0, g(Yes, No, false, false, "", "15日")},
+ {0x33ef, 0, 0, 0, g(Yes, No, false, false, "", "16日")},
+ {0x33f0, 0, 0, 0, g(Yes, No, false, false, "", "17日")},
+ {0x33f1, 0, 0, 0, g(Yes, No, false, false, "", "18日")},
+ {0x33f2, 0, 0, 0, g(Yes, No, false, false, "", "19日")},
+ {0x33f3, 0, 0, 0, g(Yes, No, false, false, "", "20日")},
+ {0x33f4, 0, 0, 0, g(Yes, No, false, false, "", "21日")},
+ {0x33f5, 0, 0, 0, g(Yes, No, false, false, "", "22日")},
+ {0x33f6, 0, 0, 0, g(Yes, No, false, false, "", "23日")},
+ {0x33f7, 0, 0, 0, g(Yes, No, false, false, "", "24日")},
+ {0x33f8, 0, 0, 0, g(Yes, No, false, false, "", "25日")},
+ {0x33f9, 0, 0, 0, g(Yes, No, false, false, "", "26日")},
+ {0x33fa, 0, 0, 0, g(Yes, No, false, false, "", "27日")},
+ {0x33fb, 0, 0, 0, g(Yes, No, false, false, "", "28日")},
+ {0x33fc, 0, 0, 0, g(Yes, No, false, false, "", "29日")},
+ {0x33fd, 0, 0, 0, g(Yes, No, false, false, "", "30日")},
+ {0x33fe, 0, 0, 0, g(Yes, No, false, false, "", "31日")},
+ {0x33ff, 0, 0, 0, g(Yes, No, false, false, "", "gal")},
+ {0x3400, 0, 0, 0, f(Yes, false, "")},
+ {0xa66f, 230, 1, 1, f(Yes, false, "")},
+ {0xa670, 0, 0, 0, f(Yes, false, "")},
+ {0xa674, 230, 1, 1, f(Yes, false, "")},
+ {0xa67e, 0, 0, 0, f(Yes, false, "")},
+ {0xa69c, 0, 0, 0, g(Yes, No, false, false, "", "ъ")},
+ {0xa69d, 0, 0, 0, g(Yes, No, false, false, "", "ь")},
+ {0xa69e, 230, 1, 1, f(Yes, false, "")},
+ {0xa6a0, 0, 0, 0, f(Yes, false, "")},
+ {0xa6f0, 230, 1, 1, f(Yes, false, "")},
+ {0xa6f2, 0, 0, 0, f(Yes, false, "")},
+ {0xa770, 0, 0, 0, g(Yes, No, false, false, "", "ꝯ")},
+ {0xa771, 0, 0, 0, f(Yes, false, "")},
+ {0xa7f8, 0, 0, 0, g(Yes, No, false, false, "", "Ħ")},
+ {0xa7f9, 0, 0, 0, g(Yes, No, false, false, "", "œ")},
+ {0xa7fa, 0, 0, 0, f(Yes, false, "")},
+ {0xa806, 9, 1, 1, f(Yes, false, "")},
+ {0xa807, 0, 0, 0, f(Yes, false, "")},
+ {0xa8c4, 9, 1, 1, f(Yes, false, "")},
+ {0xa8c5, 0, 0, 0, f(Yes, false, "")},
+ {0xa8e0, 230, 1, 1, f(Yes, false, "")},
+ {0xa8f2, 0, 0, 0, f(Yes, false, "")},
+ {0xa92b, 220, 1, 1, f(Yes, false, "")},
+ {0xa92e, 0, 0, 0, f(Yes, false, "")},
+ {0xa953, 9, 1, 1, f(Yes, false, "")},
+ {0xa954, 0, 0, 0, f(Yes, false, "")},
+ {0xa9b3, 7, 1, 1, f(Yes, false, "")},
+ {0xa9b4, 0, 0, 0, f(Yes, false, "")},
+ {0xa9c0, 9, 1, 1, f(Yes, false, "")},
+ {0xa9c1, 0, 0, 0, f(Yes, false, "")},
+ {0xaab0, 230, 1, 1, f(Yes, false, "")},
+ {0xaab1, 0, 0, 0, f(Yes, false, "")},
+ {0xaab2, 230, 1, 1, f(Yes, false, "")},
+ {0xaab4, 220, 1, 1, f(Yes, false, "")},
+ {0xaab5, 0, 0, 0, f(Yes, false, "")},
+ {0xaab7, 230, 1, 1, f(Yes, false, "")},
+ {0xaab9, 0, 0, 0, f(Yes, false, "")},
+ {0xaabe, 230, 1, 1, f(Yes, false, "")},
+ {0xaac0, 0, 0, 0, f(Yes, false, "")},
+ {0xaac1, 230, 1, 1, f(Yes, false, "")},
+ {0xaac2, 0, 0, 0, f(Yes, false, "")},
+ {0xaaf6, 9, 1, 1, f(Yes, false, "")},
+ {0xaaf7, 0, 0, 0, f(Yes, false, "")},
+ {0xab5c, 0, 0, 0, g(Yes, No, false, false, "", "ꜧ")},
+ {0xab5d, 0, 0, 0, g(Yes, No, false, false, "", "ꬷ")},
+ {0xab5e, 0, 0, 0, g(Yes, No, false, false, "", "ɫ")},
+ {0xab5f, 0, 0, 0, g(Yes, No, false, false, "", "ꭒ")},
+ {0xab60, 0, 0, 0, f(Yes, false, "")},
+ {0xabed, 9, 1, 1, f(Yes, false, "")},
+ {0xabee, 0, 0, 0, f(Yes, false, "")},
+ {0xac00, 0, 0, 1, f(Yes, true, "")},
+ {0xac01, 0, 0, 2, f(Yes, false, "")},
+ {0xac1c, 0, 0, 1, f(Yes, true, "")},
+ {0xac1d, 0, 0, 2, f(Yes, false, "")},
+ {0xac38, 0, 0, 1, f(Yes, true, "")},
+ {0xac39, 0, 0, 2, f(Yes, false, "")},
+ {0xac54, 0, 0, 1, f(Yes, true, "")},
+ {0xac55, 0, 0, 2, f(Yes, false, "")},
+ {0xac70, 0, 0, 1, f(Yes, true, "")},
+ {0xac71, 0, 0, 2, f(Yes, false, "")},
+ {0xac8c, 0, 0, 1, f(Yes, true, "")},
+ {0xac8d, 0, 0, 2, f(Yes, false, "")},
+ {0xaca8, 0, 0, 1, f(Yes, true, "")},
+ {0xaca9, 0, 0, 2, f(Yes, false, "")},
+ {0xacc4, 0, 0, 1, f(Yes, true, "")},
+ {0xacc5, 0, 0, 2, f(Yes, false, "")},
+ {0xace0, 0, 0, 1, f(Yes, true, "")},
+ {0xace1, 0, 0, 2, f(Yes, false, "")},
+ {0xacfc, 0, 0, 1, f(Yes, true, "")},
+ {0xacfd, 0, 0, 2, f(Yes, false, "")},
+ {0xad18, 0, 0, 1, f(Yes, true, "")},
+ {0xad19, 0, 0, 2, f(Yes, false, "")},
+ {0xad34, 0, 0, 1, f(Yes, true, "")},
+ {0xad35, 0, 0, 2, f(Yes, false, "")},
+ {0xad50, 0, 0, 1, f(Yes, true, "")},
+ {0xad51, 0, 0, 2, f(Yes, false, "")},
+ {0xad6c, 0, 0, 1, f(Yes, true, "")},
+ {0xad6d, 0, 0, 2, f(Yes, false, "")},
+ {0xad88, 0, 0, 1, f(Yes, true, "")},
+ {0xad89, 0, 0, 2, f(Yes, false, "")},
+ {0xada4, 0, 0, 1, f(Yes, true, "")},
+ {0xada5, 0, 0, 2, f(Yes, false, "")},
+ {0xadc0, 0, 0, 1, f(Yes, true, "")},
+ {0xadc1, 0, 0, 2, f(Yes, false, "")},
+ {0xaddc, 0, 0, 1, f(Yes, true, "")},
+ {0xaddd, 0, 0, 2, f(Yes, false, "")},
+ {0xadf8, 0, 0, 1, f(Yes, true, "")},
+ {0xadf9, 0, 0, 2, f(Yes, false, "")},
+ {0xae14, 0, 0, 1, f(Yes, true, "")},
+ {0xae15, 0, 0, 2, f(Yes, false, "")},
+ {0xae30, 0, 0, 1, f(Yes, true, "")},
+ {0xae31, 0, 0, 2, f(Yes, false, "")},
+ {0xae4c, 0, 0, 1, f(Yes, true, "")},
+ {0xae4d, 0, 0, 2, f(Yes, false, "")},
+ {0xae68, 0, 0, 1, f(Yes, true, "")},
+ {0xae69, 0, 0, 2, f(Yes, false, "")},
+ {0xae84, 0, 0, 1, f(Yes, true, "")},
+ {0xae85, 0, 0, 2, f(Yes, false, "")},
+ {0xaea0, 0, 0, 1, f(Yes, true, "")},
+ {0xaea1, 0, 0, 2, f(Yes, false, "")},
+ {0xaebc, 0, 0, 1, f(Yes, true, "")},
+ {0xaebd, 0, 0, 2, f(Yes, false, "")},
+ {0xaed8, 0, 0, 1, f(Yes, true, "")},
+ {0xaed9, 0, 0, 2, f(Yes, false, "")},
+ {0xaef4, 0, 0, 1, f(Yes, true, "")},
+ {0xaef5, 0, 0, 2, f(Yes, false, "")},
+ {0xaf10, 0, 0, 1, f(Yes, true, "")},
+ {0xaf11, 0, 0, 2, f(Yes, false, "")},
+ {0xaf2c, 0, 0, 1, f(Yes, true, "")},
+ {0xaf2d, 0, 0, 2, f(Yes, false, "")},
+ {0xaf48, 0, 0, 1, f(Yes, true, "")},
+ {0xaf49, 0, 0, 2, f(Yes, false, "")},
+ {0xaf64, 0, 0, 1, f(Yes, true, "")},
+ {0xaf65, 0, 0, 2, f(Yes, false, "")},
+ {0xaf80, 0, 0, 1, f(Yes, true, "")},
+ {0xaf81, 0, 0, 2, f(Yes, false, "")},
+ {0xaf9c, 0, 0, 1, f(Yes, true, "")},
+ {0xaf9d, 0, 0, 2, f(Yes, false, "")},
+ {0xafb8, 0, 0, 1, f(Yes, true, "")},
+ {0xafb9, 0, 0, 2, f(Yes, false, "")},
+ {0xafd4, 0, 0, 1, f(Yes, true, "")},
+ {0xafd5, 0, 0, 2, f(Yes, false, "")},
+ {0xaff0, 0, 0, 1, f(Yes, true, "")},
+ {0xaff1, 0, 0, 2, f(Yes, false, "")},
+ {0xb00c, 0, 0, 1, f(Yes, true, "")},
+ {0xb00d, 0, 0, 2, f(Yes, false, "")},
+ {0xb028, 0, 0, 1, f(Yes, true, "")},
+ {0xb029, 0, 0, 2, f(Yes, false, "")},
+ {0xb044, 0, 0, 1, f(Yes, true, "")},
+ {0xb045, 0, 0, 2, f(Yes, false, "")},
+ {0xb060, 0, 0, 1, f(Yes, true, "")},
+ {0xb061, 0, 0, 2, f(Yes, false, "")},
+ {0xb07c, 0, 0, 1, f(Yes, true, "")},
+ {0xb07d, 0, 0, 2, f(Yes, false, "")},
+ {0xb098, 0, 0, 1, f(Yes, true, "")},
+ {0xb099, 0, 0, 2, f(Yes, false, "")},
+ {0xb0b4, 0, 0, 1, f(Yes, true, "")},
+ {0xb0b5, 0, 0, 2, f(Yes, false, "")},
+ {0xb0d0, 0, 0, 1, f(Yes, true, "")},
+ {0xb0d1, 0, 0, 2, f(Yes, false, "")},
+ {0xb0ec, 0, 0, 1, f(Yes, true, "")},
+ {0xb0ed, 0, 0, 2, f(Yes, false, "")},
+ {0xb108, 0, 0, 1, f(Yes, true, "")},
+ {0xb109, 0, 0, 2, f(Yes, false, "")},
+ {0xb124, 0, 0, 1, f(Yes, true, "")},
+ {0xb125, 0, 0, 2, f(Yes, false, "")},
+ {0xb140, 0, 0, 1, f(Yes, true, "")},
+ {0xb141, 0, 0, 2, f(Yes, false, "")},
+ {0xb15c, 0, 0, 1, f(Yes, true, "")},
+ {0xb15d, 0, 0, 2, f(Yes, false, "")},
+ {0xb178, 0, 0, 1, f(Yes, true, "")},
+ {0xb179, 0, 0, 2, f(Yes, false, "")},
+ {0xb194, 0, 0, 1, f(Yes, true, "")},
+ {0xb195, 0, 0, 2, f(Yes, false, "")},
+ {0xb1b0, 0, 0, 1, f(Yes, true, "")},
+ {0xb1b1, 0, 0, 2, f(Yes, false, "")},
+ {0xb1cc, 0, 0, 1, f(Yes, true, "")},
+ {0xb1cd, 0, 0, 2, f(Yes, false, "")},
+ {0xb1e8, 0, 0, 1, f(Yes, true, "")},
+ {0xb1e9, 0, 0, 2, f(Yes, false, "")},
+ {0xb204, 0, 0, 1, f(Yes, true, "")},
+ {0xb205, 0, 0, 2, f(Yes, false, "")},
+ {0xb220, 0, 0, 1, f(Yes, true, "")},
+ {0xb221, 0, 0, 2, f(Yes, false, "")},
+ {0xb23c, 0, 0, 1, f(Yes, true, "")},
+ {0xb23d, 0, 0, 2, f(Yes, false, "")},
+ {0xb258, 0, 0, 1, f(Yes, true, "")},
+ {0xb259, 0, 0, 2, f(Yes, false, "")},
+ {0xb274, 0, 0, 1, f(Yes, true, "")},
+ {0xb275, 0, 0, 2, f(Yes, false, "")},
+ {0xb290, 0, 0, 1, f(Yes, true, "")},
+ {0xb291, 0, 0, 2, f(Yes, false, "")},
+ {0xb2ac, 0, 0, 1, f(Yes, true, "")},
+ {0xb2ad, 0, 0, 2, f(Yes, false, "")},
+ {0xb2c8, 0, 0, 1, f(Yes, true, "")},
+ {0xb2c9, 0, 0, 2, f(Yes, false, "")},
+ {0xb2e4, 0, 0, 1, f(Yes, true, "")},
+ {0xb2e5, 0, 0, 2, f(Yes, false, "")},
+ {0xb300, 0, 0, 1, f(Yes, true, "")},
+ {0xb301, 0, 0, 2, f(Yes, false, "")},
+ {0xb31c, 0, 0, 1, f(Yes, true, "")},
+ {0xb31d, 0, 0, 2, f(Yes, false, "")},
+ {0xb338, 0, 0, 1, f(Yes, true, "")},
+ {0xb339, 0, 0, 2, f(Yes, false, "")},
+ {0xb354, 0, 0, 1, f(Yes, true, "")},
+ {0xb355, 0, 0, 2, f(Yes, false, "")},
+ {0xb370, 0, 0, 1, f(Yes, true, "")},
+ {0xb371, 0, 0, 2, f(Yes, false, "")},
+ {0xb38c, 0, 0, 1, f(Yes, true, "")},
+ {0xb38d, 0, 0, 2, f(Yes, false, "")},
+ {0xb3a8, 0, 0, 1, f(Yes, true, "")},
+ {0xb3a9, 0, 0, 2, f(Yes, false, "")},
+ {0xb3c4, 0, 0, 1, f(Yes, true, "")},
+ {0xb3c5, 0, 0, 2, f(Yes, false, "")},
+ {0xb3e0, 0, 0, 1, f(Yes, true, "")},
+ {0xb3e1, 0, 0, 2, f(Yes, false, "")},
+ {0xb3fc, 0, 0, 1, f(Yes, true, "")},
+ {0xb3fd, 0, 0, 2, f(Yes, false, "")},
+ {0xb418, 0, 0, 1, f(Yes, true, "")},
+ {0xb419, 0, 0, 2, f(Yes, false, "")},
+ {0xb434, 0, 0, 1, f(Yes, true, "")},
+ {0xb435, 0, 0, 2, f(Yes, false, "")},
+ {0xb450, 0, 0, 1, f(Yes, true, "")},
+ {0xb451, 0, 0, 2, f(Yes, false, "")},
+ {0xb46c, 0, 0, 1, f(Yes, true, "")},
+ {0xb46d, 0, 0, 2, f(Yes, false, "")},
+ {0xb488, 0, 0, 1, f(Yes, true, "")},
+ {0xb489, 0, 0, 2, f(Yes, false, "")},
+ {0xb4a4, 0, 0, 1, f(Yes, true, "")},
+ {0xb4a5, 0, 0, 2, f(Yes, false, "")},
+ {0xb4c0, 0, 0, 1, f(Yes, true, "")},
+ {0xb4c1, 0, 0, 2, f(Yes, false, "")},
+ {0xb4dc, 0, 0, 1, f(Yes, true, "")},
+ {0xb4dd, 0, 0, 2, f(Yes, false, "")},
+ {0xb4f8, 0, 0, 1, f(Yes, true, "")},
+ {0xb4f9, 0, 0, 2, f(Yes, false, "")},
+ {0xb514, 0, 0, 1, f(Yes, true, "")},
+ {0xb515, 0, 0, 2, f(Yes, false, "")},
+ {0xb530, 0, 0, 1, f(Yes, true, "")},
+ {0xb531, 0, 0, 2, f(Yes, false, "")},
+ {0xb54c, 0, 0, 1, f(Yes, true, "")},
+ {0xb54d, 0, 0, 2, f(Yes, false, "")},
+ {0xb568, 0, 0, 1, f(Yes, true, "")},
+ {0xb569, 0, 0, 2, f(Yes, false, "")},
+ {0xb584, 0, 0, 1, f(Yes, true, "")},
+ {0xb585, 0, 0, 2, f(Yes, false, "")},
+ {0xb5a0, 0, 0, 1, f(Yes, true, "")},
+ {0xb5a1, 0, 0, 2, f(Yes, false, "")},
+ {0xb5bc, 0, 0, 1, f(Yes, true, "")},
+ {0xb5bd, 0, 0, 2, f(Yes, false, "")},
+ {0xb5d8, 0, 0, 1, f(Yes, true, "")},
+ {0xb5d9, 0, 0, 2, f(Yes, false, "")},
+ {0xb5f4, 0, 0, 1, f(Yes, true, "")},
+ {0xb5f5, 0, 0, 2, f(Yes, false, "")},
+ {0xb610, 0, 0, 1, f(Yes, true, "")},
+ {0xb611, 0, 0, 2, f(Yes, false, "")},
+ {0xb62c, 0, 0, 1, f(Yes, true, "")},
+ {0xb62d, 0, 0, 2, f(Yes, false, "")},
+ {0xb648, 0, 0, 1, f(Yes, true, "")},
+ {0xb649, 0, 0, 2, f(Yes, false, "")},
+ {0xb664, 0, 0, 1, f(Yes, true, "")},
+ {0xb665, 0, 0, 2, f(Yes, false, "")},
+ {0xb680, 0, 0, 1, f(Yes, true, "")},
+ {0xb681, 0, 0, 2, f(Yes, false, "")},
+ {0xb69c, 0, 0, 1, f(Yes, true, "")},
+ {0xb69d, 0, 0, 2, f(Yes, false, "")},
+ {0xb6b8, 0, 0, 1, f(Yes, true, "")},
+ {0xb6b9, 0, 0, 2, f(Yes, false, "")},
+ {0xb6d4, 0, 0, 1, f(Yes, true, "")},
+ {0xb6d5, 0, 0, 2, f(Yes, false, "")},
+ {0xb6f0, 0, 0, 1, f(Yes, true, "")},
+ {0xb6f1, 0, 0, 2, f(Yes, false, "")},
+ {0xb70c, 0, 0, 1, f(Yes, true, "")},
+ {0xb70d, 0, 0, 2, f(Yes, false, "")},
+ {0xb728, 0, 0, 1, f(Yes, true, "")},
+ {0xb729, 0, 0, 2, f(Yes, false, "")},
+ {0xb744, 0, 0, 1, f(Yes, true, "")},
+ {0xb745, 0, 0, 2, f(Yes, false, "")},
+ {0xb760, 0, 0, 1, f(Yes, true, "")},
+ {0xb761, 0, 0, 2, f(Yes, false, "")},
+ {0xb77c, 0, 0, 1, f(Yes, true, "")},
+ {0xb77d, 0, 0, 2, f(Yes, false, "")},
+ {0xb798, 0, 0, 1, f(Yes, true, "")},
+ {0xb799, 0, 0, 2, f(Yes, false, "")},
+ {0xb7b4, 0, 0, 1, f(Yes, true, "")},
+ {0xb7b5, 0, 0, 2, f(Yes, false, "")},
+ {0xb7d0, 0, 0, 1, f(Yes, true, "")},
+ {0xb7d1, 0, 0, 2, f(Yes, false, "")},
+ {0xb7ec, 0, 0, 1, f(Yes, true, "")},
+ {0xb7ed, 0, 0, 2, f(Yes, false, "")},
+ {0xb808, 0, 0, 1, f(Yes, true, "")},
+ {0xb809, 0, 0, 2, f(Yes, false, "")},
+ {0xb824, 0, 0, 1, f(Yes, true, "")},
+ {0xb825, 0, 0, 2, f(Yes, false, "")},
+ {0xb840, 0, 0, 1, f(Yes, true, "")},
+ {0xb841, 0, 0, 2, f(Yes, false, "")},
+ {0xb85c, 0, 0, 1, f(Yes, true, "")},
+ {0xb85d, 0, 0, 2, f(Yes, false, "")},
+ {0xb878, 0, 0, 1, f(Yes, true, "")},
+ {0xb879, 0, 0, 2, f(Yes, false, "")},
+ {0xb894, 0, 0, 1, f(Yes, true, "")},
+ {0xb895, 0, 0, 2, f(Yes, false, "")},
+ {0xb8b0, 0, 0, 1, f(Yes, true, "")},
+ {0xb8b1, 0, 0, 2, f(Yes, false, "")},
+ {0xb8cc, 0, 0, 1, f(Yes, true, "")},
+ {0xb8cd, 0, 0, 2, f(Yes, false, "")},
+ {0xb8e8, 0, 0, 1, f(Yes, true, "")},
+ {0xb8e9, 0, 0, 2, f(Yes, false, "")},
+ {0xb904, 0, 0, 1, f(Yes, true, "")},
+ {0xb905, 0, 0, 2, f(Yes, false, "")},
+ {0xb920, 0, 0, 1, f(Yes, true, "")},
+ {0xb921, 0, 0, 2, f(Yes, false, "")},
+ {0xb93c, 0, 0, 1, f(Yes, true, "")},
+ {0xb93d, 0, 0, 2, f(Yes, false, "")},
+ {0xb958, 0, 0, 1, f(Yes, true, "")},
+ {0xb959, 0, 0, 2, f(Yes, false, "")},
+ {0xb974, 0, 0, 1, f(Yes, true, "")},
+ {0xb975, 0, 0, 2, f(Yes, false, "")},
+ {0xb990, 0, 0, 1, f(Yes, true, "")},
+ {0xb991, 0, 0, 2, f(Yes, false, "")},
+ {0xb9ac, 0, 0, 1, f(Yes, true, "")},
+ {0xb9ad, 0, 0, 2, f(Yes, false, "")},
+ {0xb9c8, 0, 0, 1, f(Yes, true, "")},
+ {0xb9c9, 0, 0, 2, f(Yes, false, "")},
+ {0xb9e4, 0, 0, 1, f(Yes, true, "")},
+ {0xb9e5, 0, 0, 2, f(Yes, false, "")},
+ {0xba00, 0, 0, 1, f(Yes, true, "")},
+ {0xba01, 0, 0, 2, f(Yes, false, "")},
+ {0xba1c, 0, 0, 1, f(Yes, true, "")},
+ {0xba1d, 0, 0, 2, f(Yes, false, "")},
+ {0xba38, 0, 0, 1, f(Yes, true, "")},
+ {0xba39, 0, 0, 2, f(Yes, false, "")},
+ {0xba54, 0, 0, 1, f(Yes, true, "")},
+ {0xba55, 0, 0, 2, f(Yes, false, "")},
+ {0xba70, 0, 0, 1, f(Yes, true, "")},
+ {0xba71, 0, 0, 2, f(Yes, false, "")},
+ {0xba8c, 0, 0, 1, f(Yes, true, "")},
+ {0xba8d, 0, 0, 2, f(Yes, false, "")},
+ {0xbaa8, 0, 0, 1, f(Yes, true, "")},
+ {0xbaa9, 0, 0, 2, f(Yes, false, "")},
+ {0xbac4, 0, 0, 1, f(Yes, true, "")},
+ {0xbac5, 0, 0, 2, f(Yes, false, "")},
+ {0xbae0, 0, 0, 1, f(Yes, true, "")},
+ {0xbae1, 0, 0, 2, f(Yes, false, "")},
+ {0xbafc, 0, 0, 1, f(Yes, true, "")},
+ {0xbafd, 0, 0, 2, f(Yes, false, "")},
+ {0xbb18, 0, 0, 1, f(Yes, true, "")},
+ {0xbb19, 0, 0, 2, f(Yes, false, "")},
+ {0xbb34, 0, 0, 1, f(Yes, true, "")},
+ {0xbb35, 0, 0, 2, f(Yes, false, "")},
+ {0xbb50, 0, 0, 1, f(Yes, true, "")},
+ {0xbb51, 0, 0, 2, f(Yes, false, "")},
+ {0xbb6c, 0, 0, 1, f(Yes, true, "")},
+ {0xbb6d, 0, 0, 2, f(Yes, false, "")},
+ {0xbb88, 0, 0, 1, f(Yes, true, "")},
+ {0xbb89, 0, 0, 2, f(Yes, false, "")},
+ {0xbba4, 0, 0, 1, f(Yes, true, "")},
+ {0xbba5, 0, 0, 2, f(Yes, false, "")},
+ {0xbbc0, 0, 0, 1, f(Yes, true, "")},
+ {0xbbc1, 0, 0, 2, f(Yes, false, "")},
+ {0xbbdc, 0, 0, 1, f(Yes, true, "")},
+ {0xbbdd, 0, 0, 2, f(Yes, false, "")},
+ {0xbbf8, 0, 0, 1, f(Yes, true, "")},
+ {0xbbf9, 0, 0, 2, f(Yes, false, "")},
+ {0xbc14, 0, 0, 1, f(Yes, true, "")},
+ {0xbc15, 0, 0, 2, f(Yes, false, "")},
+ {0xbc30, 0, 0, 1, f(Yes, true, "")},
+ {0xbc31, 0, 0, 2, f(Yes, false, "")},
+ {0xbc4c, 0, 0, 1, f(Yes, true, "")},
+ {0xbc4d, 0, 0, 2, f(Yes, false, "")},
+ {0xbc68, 0, 0, 1, f(Yes, true, "")},
+ {0xbc69, 0, 0, 2, f(Yes, false, "")},
+ {0xbc84, 0, 0, 1, f(Yes, true, "")},
+ {0xbc85, 0, 0, 2, f(Yes, false, "")},
+ {0xbca0, 0, 0, 1, f(Yes, true, "")},
+ {0xbca1, 0, 0, 2, f(Yes, false, "")},
+ {0xbcbc, 0, 0, 1, f(Yes, true, "")},
+ {0xbcbd, 0, 0, 2, f(Yes, false, "")},
+ {0xbcd8, 0, 0, 1, f(Yes, true, "")},
+ {0xbcd9, 0, 0, 2, f(Yes, false, "")},
+ {0xbcf4, 0, 0, 1, f(Yes, true, "")},
+ {0xbcf5, 0, 0, 2, f(Yes, false, "")},
+ {0xbd10, 0, 0, 1, f(Yes, true, "")},
+ {0xbd11, 0, 0, 2, f(Yes, false, "")},
+ {0xbd2c, 0, 0, 1, f(Yes, true, "")},
+ {0xbd2d, 0, 0, 2, f(Yes, false, "")},
+ {0xbd48, 0, 0, 1, f(Yes, true, "")},
+ {0xbd49, 0, 0, 2, f(Yes, false, "")},
+ {0xbd64, 0, 0, 1, f(Yes, true, "")},
+ {0xbd65, 0, 0, 2, f(Yes, false, "")},
+ {0xbd80, 0, 0, 1, f(Yes, true, "")},
+ {0xbd81, 0, 0, 2, f(Yes, false, "")},
+ {0xbd9c, 0, 0, 1, f(Yes, true, "")},
+ {0xbd9d, 0, 0, 2, f(Yes, false, "")},
+ {0xbdb8, 0, 0, 1, f(Yes, true, "")},
+ {0xbdb9, 0, 0, 2, f(Yes, false, "")},
+ {0xbdd4, 0, 0, 1, f(Yes, true, "")},
+ {0xbdd5, 0, 0, 2, f(Yes, false, "")},
+ {0xbdf0, 0, 0, 1, f(Yes, true, "")},
+ {0xbdf1, 0, 0, 2, f(Yes, false, "")},
+ {0xbe0c, 0, 0, 1, f(Yes, true, "")},
+ {0xbe0d, 0, 0, 2, f(Yes, false, "")},
+ {0xbe28, 0, 0, 1, f(Yes, true, "")},
+ {0xbe29, 0, 0, 2, f(Yes, false, "")},
+ {0xbe44, 0, 0, 1, f(Yes, true, "")},
+ {0xbe45, 0, 0, 2, f(Yes, false, "")},
+ {0xbe60, 0, 0, 1, f(Yes, true, "")},
+ {0xbe61, 0, 0, 2, f(Yes, false, "")},
+ {0xbe7c, 0, 0, 1, f(Yes, true, "")},
+ {0xbe7d, 0, 0, 2, f(Yes, false, "")},
+ {0xbe98, 0, 0, 1, f(Yes, true, "")},
+ {0xbe99, 0, 0, 2, f(Yes, false, "")},
+ {0xbeb4, 0, 0, 1, f(Yes, true, "")},
+ {0xbeb5, 0, 0, 2, f(Yes, false, "")},
+ {0xbed0, 0, 0, 1, f(Yes, true, "")},
+ {0xbed1, 0, 0, 2, f(Yes, false, "")},
+ {0xbeec, 0, 0, 1, f(Yes, true, "")},
+ {0xbeed, 0, 0, 2, f(Yes, false, "")},
+ {0xbf08, 0, 0, 1, f(Yes, true, "")},
+ {0xbf09, 0, 0, 2, f(Yes, false, "")},
+ {0xbf24, 0, 0, 1, f(Yes, true, "")},
+ {0xbf25, 0, 0, 2, f(Yes, false, "")},
+ {0xbf40, 0, 0, 1, f(Yes, true, "")},
+ {0xbf41, 0, 0, 2, f(Yes, false, "")},
+ {0xbf5c, 0, 0, 1, f(Yes, true, "")},
+ {0xbf5d, 0, 0, 2, f(Yes, false, "")},
+ {0xbf78, 0, 0, 1, f(Yes, true, "")},
+ {0xbf79, 0, 0, 2, f(Yes, false, "")},
+ {0xbf94, 0, 0, 1, f(Yes, true, "")},
+ {0xbf95, 0, 0, 2, f(Yes, false, "")},
+ {0xbfb0, 0, 0, 1, f(Yes, true, "")},
+ {0xbfb1, 0, 0, 2, f(Yes, false, "")},
+ {0xbfcc, 0, 0, 1, f(Yes, true, "")},
+ {0xbfcd, 0, 0, 2, f(Yes, false, "")},
+ {0xbfe8, 0, 0, 1, f(Yes, true, "")},
+ {0xbfe9, 0, 0, 2, f(Yes, false, "")},
+ {0xc004, 0, 0, 1, f(Yes, true, "")},
+ {0xc005, 0, 0, 2, f(Yes, false, "")},
+ {0xc020, 0, 0, 1, f(Yes, true, "")},
+ {0xc021, 0, 0, 2, f(Yes, false, "")},
+ {0xc03c, 0, 0, 1, f(Yes, true, "")},
+ {0xc03d, 0, 0, 2, f(Yes, false, "")},
+ {0xc058, 0, 0, 1, f(Yes, true, "")},
+ {0xc059, 0, 0, 2, f(Yes, false, "")},
+ {0xc074, 0, 0, 1, f(Yes, true, "")},
+ {0xc075, 0, 0, 2, f(Yes, false, "")},
+ {0xc090, 0, 0, 1, f(Yes, true, "")},
+ {0xc091, 0, 0, 2, f(Yes, false, "")},
+ {0xc0ac, 0, 0, 1, f(Yes, true, "")},
+ {0xc0ad, 0, 0, 2, f(Yes, false, "")},
+ {0xc0c8, 0, 0, 1, f(Yes, true, "")},
+ {0xc0c9, 0, 0, 2, f(Yes, false, "")},
+ {0xc0e4, 0, 0, 1, f(Yes, true, "")},
+ {0xc0e5, 0, 0, 2, f(Yes, false, "")},
+ {0xc100, 0, 0, 1, f(Yes, true, "")},
+ {0xc101, 0, 0, 2, f(Yes, false, "")},
+ {0xc11c, 0, 0, 1, f(Yes, true, "")},
+ {0xc11d, 0, 0, 2, f(Yes, false, "")},
+ {0xc138, 0, 0, 1, f(Yes, true, "")},
+ {0xc139, 0, 0, 2, f(Yes, false, "")},
+ {0xc154, 0, 0, 1, f(Yes, true, "")},
+ {0xc155, 0, 0, 2, f(Yes, false, "")},
+ {0xc170, 0, 0, 1, f(Yes, true, "")},
+ {0xc171, 0, 0, 2, f(Yes, false, "")},
+ {0xc18c, 0, 0, 1, f(Yes, true, "")},
+ {0xc18d, 0, 0, 2, f(Yes, false, "")},
+ {0xc1a8, 0, 0, 1, f(Yes, true, "")},
+ {0xc1a9, 0, 0, 2, f(Yes, false, "")},
+ {0xc1c4, 0, 0, 1, f(Yes, true, "")},
+ {0xc1c5, 0, 0, 2, f(Yes, false, "")},
+ {0xc1e0, 0, 0, 1, f(Yes, true, "")},
+ {0xc1e1, 0, 0, 2, f(Yes, false, "")},
+ {0xc1fc, 0, 0, 1, f(Yes, true, "")},
+ {0xc1fd, 0, 0, 2, f(Yes, false, "")},
+ {0xc218, 0, 0, 1, f(Yes, true, "")},
+ {0xc219, 0, 0, 2, f(Yes, false, "")},
+ {0xc234, 0, 0, 1, f(Yes, true, "")},
+ {0xc235, 0, 0, 2, f(Yes, false, "")},
+ {0xc250, 0, 0, 1, f(Yes, true, "")},
+ {0xc251, 0, 0, 2, f(Yes, false, "")},
+ {0xc26c, 0, 0, 1, f(Yes, true, "")},
+ {0xc26d, 0, 0, 2, f(Yes, false, "")},
+ {0xc288, 0, 0, 1, f(Yes, true, "")},
+ {0xc289, 0, 0, 2, f(Yes, false, "")},
+ {0xc2a4, 0, 0, 1, f(Yes, true, "")},
+ {0xc2a5, 0, 0, 2, f(Yes, false, "")},
+ {0xc2c0, 0, 0, 1, f(Yes, true, "")},
+ {0xc2c1, 0, 0, 2, f(Yes, false, "")},
+ {0xc2dc, 0, 0, 1, f(Yes, true, "")},
+ {0xc2dd, 0, 0, 2, f(Yes, false, "")},
+ {0xc2f8, 0, 0, 1, f(Yes, true, "")},
+ {0xc2f9, 0, 0, 2, f(Yes, false, "")},
+ {0xc314, 0, 0, 1, f(Yes, true, "")},
+ {0xc315, 0, 0, 2, f(Yes, false, "")},
+ {0xc330, 0, 0, 1, f(Yes, true, "")},
+ {0xc331, 0, 0, 2, f(Yes, false, "")},
+ {0xc34c, 0, 0, 1, f(Yes, true, "")},
+ {0xc34d, 0, 0, 2, f(Yes, false, "")},
+ {0xc368, 0, 0, 1, f(Yes, true, "")},
+ {0xc369, 0, 0, 2, f(Yes, false, "")},
+ {0xc384, 0, 0, 1, f(Yes, true, "")},
+ {0xc385, 0, 0, 2, f(Yes, false, "")},
+ {0xc3a0, 0, 0, 1, f(Yes, true, "")},
+ {0xc3a1, 0, 0, 2, f(Yes, false, "")},
+ {0xc3bc, 0, 0, 1, f(Yes, true, "")},
+ {0xc3bd, 0, 0, 2, f(Yes, false, "")},
+ {0xc3d8, 0, 0, 1, f(Yes, true, "")},
+ {0xc3d9, 0, 0, 2, f(Yes, false, "")},
+ {0xc3f4, 0, 0, 1, f(Yes, true, "")},
+ {0xc3f5, 0, 0, 2, f(Yes, false, "")},
+ {0xc410, 0, 0, 1, f(Yes, true, "")},
+ {0xc411, 0, 0, 2, f(Yes, false, "")},
+ {0xc42c, 0, 0, 1, f(Yes, true, "")},
+ {0xc42d, 0, 0, 2, f(Yes, false, "")},
+ {0xc448, 0, 0, 1, f(Yes, true, "")},
+ {0xc449, 0, 0, 2, f(Yes, false, "")},
+ {0xc464, 0, 0, 1, f(Yes, true, "")},
+ {0xc465, 0, 0, 2, f(Yes, false, "")},
+ {0xc480, 0, 0, 1, f(Yes, true, "")},
+ {0xc481, 0, 0, 2, f(Yes, false, "")},
+ {0xc49c, 0, 0, 1, f(Yes, true, "")},
+ {0xc49d, 0, 0, 2, f(Yes, false, "")},
+ {0xc4b8, 0, 0, 1, f(Yes, true, "")},
+ {0xc4b9, 0, 0, 2, f(Yes, false, "")},
+ {0xc4d4, 0, 0, 1, f(Yes, true, "")},
+ {0xc4d5, 0, 0, 2, f(Yes, false, "")},
+ {0xc4f0, 0, 0, 1, f(Yes, true, "")},
+ {0xc4f1, 0, 0, 2, f(Yes, false, "")},
+ {0xc50c, 0, 0, 1, f(Yes, true, "")},
+ {0xc50d, 0, 0, 2, f(Yes, false, "")},
+ {0xc528, 0, 0, 1, f(Yes, true, "")},
+ {0xc529, 0, 0, 2, f(Yes, false, "")},
+ {0xc544, 0, 0, 1, f(Yes, true, "")},
+ {0xc545, 0, 0, 2, f(Yes, false, "")},
+ {0xc560, 0, 0, 1, f(Yes, true, "")},
+ {0xc561, 0, 0, 2, f(Yes, false, "")},
+ {0xc57c, 0, 0, 1, f(Yes, true, "")},
+ {0xc57d, 0, 0, 2, f(Yes, false, "")},
+ {0xc598, 0, 0, 1, f(Yes, true, "")},
+ {0xc599, 0, 0, 2, f(Yes, false, "")},
+ {0xc5b4, 0, 0, 1, f(Yes, true, "")},
+ {0xc5b5, 0, 0, 2, f(Yes, false, "")},
+ {0xc5d0, 0, 0, 1, f(Yes, true, "")},
+ {0xc5d1, 0, 0, 2, f(Yes, false, "")},
+ {0xc5ec, 0, 0, 1, f(Yes, true, "")},
+ {0xc5ed, 0, 0, 2, f(Yes, false, "")},
+ {0xc608, 0, 0, 1, f(Yes, true, "")},
+ {0xc609, 0, 0, 2, f(Yes, false, "")},
+ {0xc624, 0, 0, 1, f(Yes, true, "")},
+ {0xc625, 0, 0, 2, f(Yes, false, "")},
+ {0xc640, 0, 0, 1, f(Yes, true, "")},
+ {0xc641, 0, 0, 2, f(Yes, false, "")},
+ {0xc65c, 0, 0, 1, f(Yes, true, "")},
+ {0xc65d, 0, 0, 2, f(Yes, false, "")},
+ {0xc678, 0, 0, 1, f(Yes, true, "")},
+ {0xc679, 0, 0, 2, f(Yes, false, "")},
+ {0xc694, 0, 0, 1, f(Yes, true, "")},
+ {0xc695, 0, 0, 2, f(Yes, false, "")},
+ {0xc6b0, 0, 0, 1, f(Yes, true, "")},
+ {0xc6b1, 0, 0, 2, f(Yes, false, "")},
+ {0xc6cc, 0, 0, 1, f(Yes, true, "")},
+ {0xc6cd, 0, 0, 2, f(Yes, false, "")},
+ {0xc6e8, 0, 0, 1, f(Yes, true, "")},
+ {0xc6e9, 0, 0, 2, f(Yes, false, "")},
+ {0xc704, 0, 0, 1, f(Yes, true, "")},
+ {0xc705, 0, 0, 2, f(Yes, false, "")},
+ {0xc720, 0, 0, 1, f(Yes, true, "")},
+ {0xc721, 0, 0, 2, f(Yes, false, "")},
+ {0xc73c, 0, 0, 1, f(Yes, true, "")},
+ {0xc73d, 0, 0, 2, f(Yes, false, "")},
+ {0xc758, 0, 0, 1, f(Yes, true, "")},
+ {0xc759, 0, 0, 2, f(Yes, false, "")},
+ {0xc774, 0, 0, 1, f(Yes, true, "")},
+ {0xc775, 0, 0, 2, f(Yes, false, "")},
+ {0xc790, 0, 0, 1, f(Yes, true, "")},
+ {0xc791, 0, 0, 2, f(Yes, false, "")},
+ {0xc7ac, 0, 0, 1, f(Yes, true, "")},
+ {0xc7ad, 0, 0, 2, f(Yes, false, "")},
+ {0xc7c8, 0, 0, 1, f(Yes, true, "")},
+ {0xc7c9, 0, 0, 2, f(Yes, false, "")},
+ {0xc7e4, 0, 0, 1, f(Yes, true, "")},
+ {0xc7e5, 0, 0, 2, f(Yes, false, "")},
+ {0xc800, 0, 0, 1, f(Yes, true, "")},
+ {0xc801, 0, 0, 2, f(Yes, false, "")},
+ {0xc81c, 0, 0, 1, f(Yes, true, "")},
+ {0xc81d, 0, 0, 2, f(Yes, false, "")},
+ {0xc838, 0, 0, 1, f(Yes, true, "")},
+ {0xc839, 0, 0, 2, f(Yes, false, "")},
+ {0xc854, 0, 0, 1, f(Yes, true, "")},
+ {0xc855, 0, 0, 2, f(Yes, false, "")},
+ {0xc870, 0, 0, 1, f(Yes, true, "")},
+ {0xc871, 0, 0, 2, f(Yes, false, "")},
+ {0xc88c, 0, 0, 1, f(Yes, true, "")},
+ {0xc88d, 0, 0, 2, f(Yes, false, "")},
+ {0xc8a8, 0, 0, 1, f(Yes, true, "")},
+ {0xc8a9, 0, 0, 2, f(Yes, false, "")},
+ {0xc8c4, 0, 0, 1, f(Yes, true, "")},
+ {0xc8c5, 0, 0, 2, f(Yes, false, "")},
+ {0xc8e0, 0, 0, 1, f(Yes, true, "")},
+ {0xc8e1, 0, 0, 2, f(Yes, false, "")},
+ {0xc8fc, 0, 0, 1, f(Yes, true, "")},
+ {0xc8fd, 0, 0, 2, f(Yes, false, "")},
+ {0xc918, 0, 0, 1, f(Yes, true, "")},
+ {0xc919, 0, 0, 2, f(Yes, false, "")},
+ {0xc934, 0, 0, 1, f(Yes, true, "")},
+ {0xc935, 0, 0, 2, f(Yes, false, "")},
+ {0xc950, 0, 0, 1, f(Yes, true, "")},
+ {0xc951, 0, 0, 2, f(Yes, false, "")},
+ {0xc96c, 0, 0, 1, f(Yes, true, "")},
+ {0xc96d, 0, 0, 2, f(Yes, false, "")},
+ {0xc988, 0, 0, 1, f(Yes, true, "")},
+ {0xc989, 0, 0, 2, f(Yes, false, "")},
+ {0xc9a4, 0, 0, 1, f(Yes, true, "")},
+ {0xc9a5, 0, 0, 2, f(Yes, false, "")},
+ {0xc9c0, 0, 0, 1, f(Yes, true, "")},
+ {0xc9c1, 0, 0, 2, f(Yes, false, "")},
+ {0xc9dc, 0, 0, 1, f(Yes, true, "")},
+ {0xc9dd, 0, 0, 2, f(Yes, false, "")},
+ {0xc9f8, 0, 0, 1, f(Yes, true, "")},
+ {0xc9f9, 0, 0, 2, f(Yes, false, "")},
+ {0xca14, 0, 0, 1, f(Yes, true, "")},
+ {0xca15, 0, 0, 2, f(Yes, false, "")},
+ {0xca30, 0, 0, 1, f(Yes, true, "")},
+ {0xca31, 0, 0, 2, f(Yes, false, "")},
+ {0xca4c, 0, 0, 1, f(Yes, true, "")},
+ {0xca4d, 0, 0, 2, f(Yes, false, "")},
+ {0xca68, 0, 0, 1, f(Yes, true, "")},
+ {0xca69, 0, 0, 2, f(Yes, false, "")},
+ {0xca84, 0, 0, 1, f(Yes, true, "")},
+ {0xca85, 0, 0, 2, f(Yes, false, "")},
+ {0xcaa0, 0, 0, 1, f(Yes, true, "")},
+ {0xcaa1, 0, 0, 2, f(Yes, false, "")},
+ {0xcabc, 0, 0, 1, f(Yes, true, "")},
+ {0xcabd, 0, 0, 2, f(Yes, false, "")},
+ {0xcad8, 0, 0, 1, f(Yes, true, "")},
+ {0xcad9, 0, 0, 2, f(Yes, false, "")},
+ {0xcaf4, 0, 0, 1, f(Yes, true, "")},
+ {0xcaf5, 0, 0, 2, f(Yes, false, "")},
+ {0xcb10, 0, 0, 1, f(Yes, true, "")},
+ {0xcb11, 0, 0, 2, f(Yes, false, "")},
+ {0xcb2c, 0, 0, 1, f(Yes, true, "")},
+ {0xcb2d, 0, 0, 2, f(Yes, false, "")},
+ {0xcb48, 0, 0, 1, f(Yes, true, "")},
+ {0xcb49, 0, 0, 2, f(Yes, false, "")},
+ {0xcb64, 0, 0, 1, f(Yes, true, "")},
+ {0xcb65, 0, 0, 2, f(Yes, false, "")},
+ {0xcb80, 0, 0, 1, f(Yes, true, "")},
+ {0xcb81, 0, 0, 2, f(Yes, false, "")},
+ {0xcb9c, 0, 0, 1, f(Yes, true, "")},
+ {0xcb9d, 0, 0, 2, f(Yes, false, "")},
+ {0xcbb8, 0, 0, 1, f(Yes, true, "")},
+ {0xcbb9, 0, 0, 2, f(Yes, false, "")},
+ {0xcbd4, 0, 0, 1, f(Yes, true, "")},
+ {0xcbd5, 0, 0, 2, f(Yes, false, "")},
+ {0xcbf0, 0, 0, 1, f(Yes, true, "")},
+ {0xcbf1, 0, 0, 2, f(Yes, false, "")},
+ {0xcc0c, 0, 0, 1, f(Yes, true, "")},
+ {0xcc0d, 0, 0, 2, f(Yes, false, "")},
+ {0xcc28, 0, 0, 1, f(Yes, true, "")},
+ {0xcc29, 0, 0, 2, f(Yes, false, "")},
+ {0xcc44, 0, 0, 1, f(Yes, true, "")},
+ {0xcc45, 0, 0, 2, f(Yes, false, "")},
+ {0xcc60, 0, 0, 1, f(Yes, true, "")},
+ {0xcc61, 0, 0, 2, f(Yes, false, "")},
+ {0xcc7c, 0, 0, 1, f(Yes, true, "")},
+ {0xcc7d, 0, 0, 2, f(Yes, false, "")},
+ {0xcc98, 0, 0, 1, f(Yes, true, "")},
+ {0xcc99, 0, 0, 2, f(Yes, false, "")},
+ {0xccb4, 0, 0, 1, f(Yes, true, "")},
+ {0xccb5, 0, 0, 2, f(Yes, false, "")},
+ {0xccd0, 0, 0, 1, f(Yes, true, "")},
+ {0xccd1, 0, 0, 2, f(Yes, false, "")},
+ {0xccec, 0, 0, 1, f(Yes, true, "")},
+ {0xcced, 0, 0, 2, f(Yes, false, "")},
+ {0xcd08, 0, 0, 1, f(Yes, true, "")},
+ {0xcd09, 0, 0, 2, f(Yes, false, "")},
+ {0xcd24, 0, 0, 1, f(Yes, true, "")},
+ {0xcd25, 0, 0, 2, f(Yes, false, "")},
+ {0xcd40, 0, 0, 1, f(Yes, true, "")},
+ {0xcd41, 0, 0, 2, f(Yes, false, "")},
+ {0xcd5c, 0, 0, 1, f(Yes, true, "")},
+ {0xcd5d, 0, 0, 2, f(Yes, false, "")},
+ {0xcd78, 0, 0, 1, f(Yes, true, "")},
+ {0xcd79, 0, 0, 2, f(Yes, false, "")},
+ {0xcd94, 0, 0, 1, f(Yes, true, "")},
+ {0xcd95, 0, 0, 2, f(Yes, false, "")},
+ {0xcdb0, 0, 0, 1, f(Yes, true, "")},
+ {0xcdb1, 0, 0, 2, f(Yes, false, "")},
+ {0xcdcc, 0, 0, 1, f(Yes, true, "")},
+ {0xcdcd, 0, 0, 2, f(Yes, false, "")},
+ {0xcde8, 0, 0, 1, f(Yes, true, "")},
+ {0xcde9, 0, 0, 2, f(Yes, false, "")},
+ {0xce04, 0, 0, 1, f(Yes, true, "")},
+ {0xce05, 0, 0, 2, f(Yes, false, "")},
+ {0xce20, 0, 0, 1, f(Yes, true, "")},
+ {0xce21, 0, 0, 2, f(Yes, false, "")},
+ {0xce3c, 0, 0, 1, f(Yes, true, "")},
+ {0xce3d, 0, 0, 2, f(Yes, false, "")},
+ {0xce58, 0, 0, 1, f(Yes, true, "")},
+ {0xce59, 0, 0, 2, f(Yes, false, "")},
+ {0xce74, 0, 0, 1, f(Yes, true, "")},
+ {0xce75, 0, 0, 2, f(Yes, false, "")},
+ {0xce90, 0, 0, 1, f(Yes, true, "")},
+ {0xce91, 0, 0, 2, f(Yes, false, "")},
+ {0xceac, 0, 0, 1, f(Yes, true, "")},
+ {0xcead, 0, 0, 2, f(Yes, false, "")},
+ {0xcec8, 0, 0, 1, f(Yes, true, "")},
+ {0xcec9, 0, 0, 2, f(Yes, false, "")},
+ {0xcee4, 0, 0, 1, f(Yes, true, "")},
+ {0xcee5, 0, 0, 2, f(Yes, false, "")},
+ {0xcf00, 0, 0, 1, f(Yes, true, "")},
+ {0xcf01, 0, 0, 2, f(Yes, false, "")},
+ {0xcf1c, 0, 0, 1, f(Yes, true, "")},
+ {0xcf1d, 0, 0, 2, f(Yes, false, "")},
+ {0xcf38, 0, 0, 1, f(Yes, true, "")},
+ {0xcf39, 0, 0, 2, f(Yes, false, "")},
+ {0xcf54, 0, 0, 1, f(Yes, true, "")},
+ {0xcf55, 0, 0, 2, f(Yes, false, "")},
+ {0xcf70, 0, 0, 1, f(Yes, true, "")},
+ {0xcf71, 0, 0, 2, f(Yes, false, "")},
+ {0xcf8c, 0, 0, 1, f(Yes, true, "")},
+ {0xcf8d, 0, 0, 2, f(Yes, false, "")},
+ {0xcfa8, 0, 0, 1, f(Yes, true, "")},
+ {0xcfa9, 0, 0, 2, f(Yes, false, "")},
+ {0xcfc4, 0, 0, 1, f(Yes, true, "")},
+ {0xcfc5, 0, 0, 2, f(Yes, false, "")},
+ {0xcfe0, 0, 0, 1, f(Yes, true, "")},
+ {0xcfe1, 0, 0, 2, f(Yes, false, "")},
+ {0xcffc, 0, 0, 1, f(Yes, true, "")},
+ {0xcffd, 0, 0, 2, f(Yes, false, "")},
+ {0xd018, 0, 0, 1, f(Yes, true, "")},
+ {0xd019, 0, 0, 2, f(Yes, false, "")},
+ {0xd034, 0, 0, 1, f(Yes, true, "")},
+ {0xd035, 0, 0, 2, f(Yes, false, "")},
+ {0xd050, 0, 0, 1, f(Yes, true, "")},
+ {0xd051, 0, 0, 2, f(Yes, false, "")},
+ {0xd06c, 0, 0, 1, f(Yes, true, "")},
+ {0xd06d, 0, 0, 2, f(Yes, false, "")},
+ {0xd088, 0, 0, 1, f(Yes, true, "")},
+ {0xd089, 0, 0, 2, f(Yes, false, "")},
+ {0xd0a4, 0, 0, 1, f(Yes, true, "")},
+ {0xd0a5, 0, 0, 2, f(Yes, false, "")},
+ {0xd0c0, 0, 0, 1, f(Yes, true, "")},
+ {0xd0c1, 0, 0, 2, f(Yes, false, "")},
+ {0xd0dc, 0, 0, 1, f(Yes, true, "")},
+ {0xd0dd, 0, 0, 2, f(Yes, false, "")},
+ {0xd0f8, 0, 0, 1, f(Yes, true, "")},
+ {0xd0f9, 0, 0, 2, f(Yes, false, "")},
+ {0xd114, 0, 0, 1, f(Yes, true, "")},
+ {0xd115, 0, 0, 2, f(Yes, false, "")},
+ {0xd130, 0, 0, 1, f(Yes, true, "")},
+ {0xd131, 0, 0, 2, f(Yes, false, "")},
+ {0xd14c, 0, 0, 1, f(Yes, true, "")},
+ {0xd14d, 0, 0, 2, f(Yes, false, "")},
+ {0xd168, 0, 0, 1, f(Yes, true, "")},
+ {0xd169, 0, 0, 2, f(Yes, false, "")},
+ {0xd184, 0, 0, 1, f(Yes, true, "")},
+ {0xd185, 0, 0, 2, f(Yes, false, "")},
+ {0xd1a0, 0, 0, 1, f(Yes, true, "")},
+ {0xd1a1, 0, 0, 2, f(Yes, false, "")},
+ {0xd1bc, 0, 0, 1, f(Yes, true, "")},
+ {0xd1bd, 0, 0, 2, f(Yes, false, "")},
+ {0xd1d8, 0, 0, 1, f(Yes, true, "")},
+ {0xd1d9, 0, 0, 2, f(Yes, false, "")},
+ {0xd1f4, 0, 0, 1, f(Yes, true, "")},
+ {0xd1f5, 0, 0, 2, f(Yes, false, "")},
+ {0xd210, 0, 0, 1, f(Yes, true, "")},
+ {0xd211, 0, 0, 2, f(Yes, false, "")},
+ {0xd22c, 0, 0, 1, f(Yes, true, "")},
+ {0xd22d, 0, 0, 2, f(Yes, false, "")},
+ {0xd248, 0, 0, 1, f(Yes, true, "")},
+ {0xd249, 0, 0, 2, f(Yes, false, "")},
+ {0xd264, 0, 0, 1, f(Yes, true, "")},
+ {0xd265, 0, 0, 2, f(Yes, false, "")},
+ {0xd280, 0, 0, 1, f(Yes, true, "")},
+ {0xd281, 0, 0, 2, f(Yes, false, "")},
+ {0xd29c, 0, 0, 1, f(Yes, true, "")},
+ {0xd29d, 0, 0, 2, f(Yes, false, "")},
+ {0xd2b8, 0, 0, 1, f(Yes, true, "")},
+ {0xd2b9, 0, 0, 2, f(Yes, false, "")},
+ {0xd2d4, 0, 0, 1, f(Yes, true, "")},
+ {0xd2d5, 0, 0, 2, f(Yes, false, "")},
+ {0xd2f0, 0, 0, 1, f(Yes, true, "")},
+ {0xd2f1, 0, 0, 2, f(Yes, false, "")},
+ {0xd30c, 0, 0, 1, f(Yes, true, "")},
+ {0xd30d, 0, 0, 2, f(Yes, false, "")},
+ {0xd328, 0, 0, 1, f(Yes, true, "")},
+ {0xd329, 0, 0, 2, f(Yes, false, "")},
+ {0xd344, 0, 0, 1, f(Yes, true, "")},
+ {0xd345, 0, 0, 2, f(Yes, false, "")},
+ {0xd360, 0, 0, 1, f(Yes, true, "")},
+ {0xd361, 0, 0, 2, f(Yes, false, "")},
+ {0xd37c, 0, 0, 1, f(Yes, true, "")},
+ {0xd37d, 0, 0, 2, f(Yes, false, "")},
+ {0xd398, 0, 0, 1, f(Yes, true, "")},
+ {0xd399, 0, 0, 2, f(Yes, false, "")},
+ {0xd3b4, 0, 0, 1, f(Yes, true, "")},
+ {0xd3b5, 0, 0, 2, f(Yes, false, "")},
+ {0xd3d0, 0, 0, 1, f(Yes, true, "")},
+ {0xd3d1, 0, 0, 2, f(Yes, false, "")},
+ {0xd3ec, 0, 0, 1, f(Yes, true, "")},
+ {0xd3ed, 0, 0, 2, f(Yes, false, "")},
+ {0xd408, 0, 0, 1, f(Yes, true, "")},
+ {0xd409, 0, 0, 2, f(Yes, false, "")},
+ {0xd424, 0, 0, 1, f(Yes, true, "")},
+ {0xd425, 0, 0, 2, f(Yes, false, "")},
+ {0xd440, 0, 0, 1, f(Yes, true, "")},
+ {0xd441, 0, 0, 2, f(Yes, false, "")},
+ {0xd45c, 0, 0, 1, f(Yes, true, "")},
+ {0xd45d, 0, 0, 2, f(Yes, false, "")},
+ {0xd478, 0, 0, 1, f(Yes, true, "")},
+ {0xd479, 0, 0, 2, f(Yes, false, "")},
+ {0xd494, 0, 0, 1, f(Yes, true, "")},
+ {0xd495, 0, 0, 2, f(Yes, false, "")},
+ {0xd4b0, 0, 0, 1, f(Yes, true, "")},
+ {0xd4b1, 0, 0, 2, f(Yes, false, "")},
+ {0xd4cc, 0, 0, 1, f(Yes, true, "")},
+ {0xd4cd, 0, 0, 2, f(Yes, false, "")},
+ {0xd4e8, 0, 0, 1, f(Yes, true, "")},
+ {0xd4e9, 0, 0, 2, f(Yes, false, "")},
+ {0xd504, 0, 0, 1, f(Yes, true, "")},
+ {0xd505, 0, 0, 2, f(Yes, false, "")},
+ {0xd520, 0, 0, 1, f(Yes, true, "")},
+ {0xd521, 0, 0, 2, f(Yes, false, "")},
+ {0xd53c, 0, 0, 1, f(Yes, true, "")},
+ {0xd53d, 0, 0, 2, f(Yes, false, "")},
+ {0xd558, 0, 0, 1, f(Yes, true, "")},
+ {0xd559, 0, 0, 2, f(Yes, false, "")},
+ {0xd574, 0, 0, 1, f(Yes, true, "")},
+ {0xd575, 0, 0, 2, f(Yes, false, "")},
+ {0xd590, 0, 0, 1, f(Yes, true, "")},
+ {0xd591, 0, 0, 2, f(Yes, false, "")},
+ {0xd5ac, 0, 0, 1, f(Yes, true, "")},
+ {0xd5ad, 0, 0, 2, f(Yes, false, "")},
+ {0xd5c8, 0, 0, 1, f(Yes, true, "")},
+ {0xd5c9, 0, 0, 2, f(Yes, false, "")},
+ {0xd5e4, 0, 0, 1, f(Yes, true, "")},
+ {0xd5e5, 0, 0, 2, f(Yes, false, "")},
+ {0xd600, 0, 0, 1, f(Yes, true, "")},
+ {0xd601, 0, 0, 2, f(Yes, false, "")},
+ {0xd61c, 0, 0, 1, f(Yes, true, "")},
+ {0xd61d, 0, 0, 2, f(Yes, false, "")},
+ {0xd638, 0, 0, 1, f(Yes, true, "")},
+ {0xd639, 0, 0, 2, f(Yes, false, "")},
+ {0xd654, 0, 0, 1, f(Yes, true, "")},
+ {0xd655, 0, 0, 2, f(Yes, false, "")},
+ {0xd670, 0, 0, 1, f(Yes, true, "")},
+ {0xd671, 0, 0, 2, f(Yes, false, "")},
+ {0xd68c, 0, 0, 1, f(Yes, true, "")},
+ {0xd68d, 0, 0, 2, f(Yes, false, "")},
+ {0xd6a8, 0, 0, 1, f(Yes, true, "")},
+ {0xd6a9, 0, 0, 2, f(Yes, false, "")},
+ {0xd6c4, 0, 0, 1, f(Yes, true, "")},
+ {0xd6c5, 0, 0, 2, f(Yes, false, "")},
+ {0xd6e0, 0, 0, 1, f(Yes, true, "")},
+ {0xd6e1, 0, 0, 2, f(Yes, false, "")},
+ {0xd6fc, 0, 0, 1, f(Yes, true, "")},
+ {0xd6fd, 0, 0, 2, f(Yes, false, "")},
+ {0xd718, 0, 0, 1, f(Yes, true, "")},
+ {0xd719, 0, 0, 2, f(Yes, false, "")},
+ {0xd734, 0, 0, 1, f(Yes, true, "")},
+ {0xd735, 0, 0, 2, f(Yes, false, "")},
+ {0xd750, 0, 0, 1, f(Yes, true, "")},
+ {0xd751, 0, 0, 2, f(Yes, false, "")},
+ {0xd76c, 0, 0, 1, f(Yes, true, "")},
+ {0xd76d, 0, 0, 2, f(Yes, false, "")},
+ {0xd788, 0, 0, 1, f(Yes, true, "")},
+ {0xd789, 0, 0, 2, f(Yes, false, "")},
+ {0xd7a4, 0, 0, 0, f(Yes, false, "")},
+ {0xf900, 0, 0, 0, f(No, false, "豈")},
+ {0xf901, 0, 0, 0, f(No, false, "更")},
+ {0xf902, 0, 0, 0, f(No, false, "車")},
+ {0xf903, 0, 0, 0, f(No, false, "賈")},
+ {0xf904, 0, 0, 0, f(No, false, "滑")},
+ {0xf905, 0, 0, 0, f(No, false, "串")},
+ {0xf906, 0, 0, 0, f(No, false, "句")},
+ {0xf907, 0, 0, 0, f(No, false, "龜")},
+ {0xf909, 0, 0, 0, f(No, false, "契")},
+ {0xf90a, 0, 0, 0, f(No, false, "金")},
+ {0xf90b, 0, 0, 0, f(No, false, "喇")},
+ {0xf90c, 0, 0, 0, f(No, false, "奈")},
+ {0xf90d, 0, 0, 0, f(No, false, "懶")},
+ {0xf90e, 0, 0, 0, f(No, false, "癩")},
+ {0xf90f, 0, 0, 0, f(No, false, "羅")},
+ {0xf910, 0, 0, 0, f(No, false, "蘿")},
+ {0xf911, 0, 0, 0, f(No, false, "螺")},
+ {0xf912, 0, 0, 0, f(No, false, "裸")},
+ {0xf913, 0, 0, 0, f(No, false, "邏")},
+ {0xf914, 0, 0, 0, f(No, false, "樂")},
+ {0xf915, 0, 0, 0, f(No, false, "洛")},
+ {0xf916, 0, 0, 0, f(No, false, "烙")},
+ {0xf917, 0, 0, 0, f(No, false, "珞")},
+ {0xf918, 0, 0, 0, f(No, false, "落")},
+ {0xf919, 0, 0, 0, f(No, false, "酪")},
+ {0xf91a, 0, 0, 0, f(No, false, "駱")},
+ {0xf91b, 0, 0, 0, f(No, false, "亂")},
+ {0xf91c, 0, 0, 0, f(No, false, "卵")},
+ {0xf91d, 0, 0, 0, f(No, false, "欄")},
+ {0xf91e, 0, 0, 0, f(No, false, "爛")},
+ {0xf91f, 0, 0, 0, f(No, false, "蘭")},
+ {0xf920, 0, 0, 0, f(No, false, "鸞")},
+ {0xf921, 0, 0, 0, f(No, false, "嵐")},
+ {0xf922, 0, 0, 0, f(No, false, "濫")},
+ {0xf923, 0, 0, 0, f(No, false, "藍")},
+ {0xf924, 0, 0, 0, f(No, false, "襤")},
+ {0xf925, 0, 0, 0, f(No, false, "拉")},
+ {0xf926, 0, 0, 0, f(No, false, "臘")},
+ {0xf927, 0, 0, 0, f(No, false, "蠟")},
+ {0xf928, 0, 0, 0, f(No, false, "廊")},
+ {0xf929, 0, 0, 0, f(No, false, "朗")},
+ {0xf92a, 0, 0, 0, f(No, false, "浪")},
+ {0xf92b, 0, 0, 0, f(No, false, "狼")},
+ {0xf92c, 0, 0, 0, f(No, false, "郎")},
+ {0xf92d, 0, 0, 0, f(No, false, "來")},
+ {0xf92e, 0, 0, 0, f(No, false, "冷")},
+ {0xf92f, 0, 0, 0, f(No, false, "勞")},
+ {0xf930, 0, 0, 0, f(No, false, "擄")},
+ {0xf931, 0, 0, 0, f(No, false, "櫓")},
+ {0xf932, 0, 0, 0, f(No, false, "爐")},
+ {0xf933, 0, 0, 0, f(No, false, "盧")},
+ {0xf934, 0, 0, 0, f(No, false, "老")},
+ {0xf935, 0, 0, 0, f(No, false, "蘆")},
+ {0xf936, 0, 0, 0, f(No, false, "虜")},
+ {0xf937, 0, 0, 0, f(No, false, "路")},
+ {0xf938, 0, 0, 0, f(No, false, "露")},
+ {0xf939, 0, 0, 0, f(No, false, "魯")},
+ {0xf93a, 0, 0, 0, f(No, false, "鷺")},
+ {0xf93b, 0, 0, 0, f(No, false, "碌")},
+ {0xf93c, 0, 0, 0, f(No, false, "祿")},
+ {0xf93d, 0, 0, 0, f(No, false, "綠")},
+ {0xf93e, 0, 0, 0, f(No, false, "菉")},
+ {0xf93f, 0, 0, 0, f(No, false, "錄")},
+ {0xf940, 0, 0, 0, f(No, false, "鹿")},
+ {0xf941, 0, 0, 0, f(No, false, "論")},
+ {0xf942, 0, 0, 0, f(No, false, "壟")},
+ {0xf943, 0, 0, 0, f(No, false, "弄")},
+ {0xf944, 0, 0, 0, f(No, false, "籠")},
+ {0xf945, 0, 0, 0, f(No, false, "聾")},
+ {0xf946, 0, 0, 0, f(No, false, "牢")},
+ {0xf947, 0, 0, 0, f(No, false, "磊")},
+ {0xf948, 0, 0, 0, f(No, false, "賂")},
+ {0xf949, 0, 0, 0, f(No, false, "雷")},
+ {0xf94a, 0, 0, 0, f(No, false, "壘")},
+ {0xf94b, 0, 0, 0, f(No, false, "屢")},
+ {0xf94c, 0, 0, 0, f(No, false, "樓")},
+ {0xf94d, 0, 0, 0, f(No, false, "淚")},
+ {0xf94e, 0, 0, 0, f(No, false, "漏")},
+ {0xf94f, 0, 0, 0, f(No, false, "累")},
+ {0xf950, 0, 0, 0, f(No, false, "縷")},
+ {0xf951, 0, 0, 0, f(No, false, "陋")},
+ {0xf952, 0, 0, 0, f(No, false, "勒")},
+ {0xf953, 0, 0, 0, f(No, false, "肋")},
+ {0xf954, 0, 0, 0, f(No, false, "凜")},
+ {0xf955, 0, 0, 0, f(No, false, "凌")},
+ {0xf956, 0, 0, 0, f(No, false, "稜")},
+ {0xf957, 0, 0, 0, f(No, false, "綾")},
+ {0xf958, 0, 0, 0, f(No, false, "菱")},
+ {0xf959, 0, 0, 0, f(No, false, "陵")},
+ {0xf95a, 0, 0, 0, f(No, false, "讀")},
+ {0xf95b, 0, 0, 0, f(No, false, "拏")},
+ {0xf95c, 0, 0, 0, f(No, false, "樂")},
+ {0xf95d, 0, 0, 0, f(No, false, "諾")},
+ {0xf95e, 0, 0, 0, f(No, false, "丹")},
+ {0xf95f, 0, 0, 0, f(No, false, "寧")},
+ {0xf960, 0, 0, 0, f(No, false, "怒")},
+ {0xf961, 0, 0, 0, f(No, false, "率")},
+ {0xf962, 0, 0, 0, f(No, false, "異")},
+ {0xf963, 0, 0, 0, f(No, false, "北")},
+ {0xf964, 0, 0, 0, f(No, false, "磻")},
+ {0xf965, 0, 0, 0, f(No, false, "便")},
+ {0xf966, 0, 0, 0, f(No, false, "復")},
+ {0xf967, 0, 0, 0, f(No, false, "不")},
+ {0xf968, 0, 0, 0, f(No, false, "泌")},
+ {0xf969, 0, 0, 0, f(No, false, "數")},
+ {0xf96a, 0, 0, 0, f(No, false, "索")},
+ {0xf96b, 0, 0, 0, f(No, false, "參")},
+ {0xf96c, 0, 0, 0, f(No, false, "塞")},
+ {0xf96d, 0, 0, 0, f(No, false, "省")},
+ {0xf96e, 0, 0, 0, f(No, false, "葉")},
+ {0xf96f, 0, 0, 0, f(No, false, "說")},
+ {0xf970, 0, 0, 0, f(No, false, "殺")},
+ {0xf971, 0, 0, 0, f(No, false, "辰")},
+ {0xf972, 0, 0, 0, f(No, false, "沈")},
+ {0xf973, 0, 0, 0, f(No, false, "拾")},
+ {0xf974, 0, 0, 0, f(No, false, "若")},
+ {0xf975, 0, 0, 0, f(No, false, "掠")},
+ {0xf976, 0, 0, 0, f(No, false, "略")},
+ {0xf977, 0, 0, 0, f(No, false, "亮")},
+ {0xf978, 0, 0, 0, f(No, false, "兩")},
+ {0xf979, 0, 0, 0, f(No, false, "凉")},
+ {0xf97a, 0, 0, 0, f(No, false, "梁")},
+ {0xf97b, 0, 0, 0, f(No, false, "糧")},
+ {0xf97c, 0, 0, 0, f(No, false, "良")},
+ {0xf97d, 0, 0, 0, f(No, false, "諒")},
+ {0xf97e, 0, 0, 0, f(No, false, "量")},
+ {0xf97f, 0, 0, 0, f(No, false, "勵")},
+ {0xf980, 0, 0, 0, f(No, false, "呂")},
+ {0xf981, 0, 0, 0, f(No, false, "女")},
+ {0xf982, 0, 0, 0, f(No, false, "廬")},
+ {0xf983, 0, 0, 0, f(No, false, "旅")},
+ {0xf984, 0, 0, 0, f(No, false, "濾")},
+ {0xf985, 0, 0, 0, f(No, false, "礪")},
+ {0xf986, 0, 0, 0, f(No, false, "閭")},
+ {0xf987, 0, 0, 0, f(No, false, "驪")},
+ {0xf988, 0, 0, 0, f(No, false, "麗")},
+ {0xf989, 0, 0, 0, f(No, false, "黎")},
+ {0xf98a, 0, 0, 0, f(No, false, "力")},
+ {0xf98b, 0, 0, 0, f(No, false, "曆")},
+ {0xf98c, 0, 0, 0, f(No, false, "歷")},
+ {0xf98d, 0, 0, 0, f(No, false, "轢")},
+ {0xf98e, 0, 0, 0, f(No, false, "年")},
+ {0xf98f, 0, 0, 0, f(No, false, "憐")},
+ {0xf990, 0, 0, 0, f(No, false, "戀")},
+ {0xf991, 0, 0, 0, f(No, false, "撚")},
+ {0xf992, 0, 0, 0, f(No, false, "漣")},
+ {0xf993, 0, 0, 0, f(No, false, "煉")},
+ {0xf994, 0, 0, 0, f(No, false, "璉")},
+ {0xf995, 0, 0, 0, f(No, false, "秊")},
+ {0xf996, 0, 0, 0, f(No, false, "練")},
+ {0xf997, 0, 0, 0, f(No, false, "聯")},
+ {0xf998, 0, 0, 0, f(No, false, "輦")},
+ {0xf999, 0, 0, 0, f(No, false, "蓮")},
+ {0xf99a, 0, 0, 0, f(No, false, "連")},
+ {0xf99b, 0, 0, 0, f(No, false, "鍊")},
+ {0xf99c, 0, 0, 0, f(No, false, "列")},
+ {0xf99d, 0, 0, 0, f(No, false, "劣")},
+ {0xf99e, 0, 0, 0, f(No, false, "咽")},
+ {0xf99f, 0, 0, 0, f(No, false, "烈")},
+ {0xf9a0, 0, 0, 0, f(No, false, "裂")},
+ {0xf9a1, 0, 0, 0, f(No, false, "說")},
+ {0xf9a2, 0, 0, 0, f(No, false, "廉")},
+ {0xf9a3, 0, 0, 0, f(No, false, "念")},
+ {0xf9a4, 0, 0, 0, f(No, false, "捻")},
+ {0xf9a5, 0, 0, 0, f(No, false, "殮")},
+ {0xf9a6, 0, 0, 0, f(No, false, "簾")},
+ {0xf9a7, 0, 0, 0, f(No, false, "獵")},
+ {0xf9a8, 0, 0, 0, f(No, false, "令")},
+ {0xf9a9, 0, 0, 0, f(No, false, "囹")},
+ {0xf9aa, 0, 0, 0, f(No, false, "寧")},
+ {0xf9ab, 0, 0, 0, f(No, false, "嶺")},
+ {0xf9ac, 0, 0, 0, f(No, false, "怜")},
+ {0xf9ad, 0, 0, 0, f(No, false, "玲")},
+ {0xf9ae, 0, 0, 0, f(No, false, "瑩")},
+ {0xf9af, 0, 0, 0, f(No, false, "羚")},
+ {0xf9b0, 0, 0, 0, f(No, false, "聆")},
+ {0xf9b1, 0, 0, 0, f(No, false, "鈴")},
+ {0xf9b2, 0, 0, 0, f(No, false, "零")},
+ {0xf9b3, 0, 0, 0, f(No, false, "靈")},
+ {0xf9b4, 0, 0, 0, f(No, false, "領")},
+ {0xf9b5, 0, 0, 0, f(No, false, "例")},
+ {0xf9b6, 0, 0, 0, f(No, false, "禮")},
+ {0xf9b7, 0, 0, 0, f(No, false, "醴")},
+ {0xf9b8, 0, 0, 0, f(No, false, "隸")},
+ {0xf9b9, 0, 0, 0, f(No, false, "惡")},
+ {0xf9ba, 0, 0, 0, f(No, false, "了")},
+ {0xf9bb, 0, 0, 0, f(No, false, "僚")},
+ {0xf9bc, 0, 0, 0, f(No, false, "寮")},
+ {0xf9bd, 0, 0, 0, f(No, false, "尿")},
+ {0xf9be, 0, 0, 0, f(No, false, "料")},
+ {0xf9bf, 0, 0, 0, f(No, false, "樂")},
+ {0xf9c0, 0, 0, 0, f(No, false, "燎")},
+ {0xf9c1, 0, 0, 0, f(No, false, "療")},
+ {0xf9c2, 0, 0, 0, f(No, false, "蓼")},
+ {0xf9c3, 0, 0, 0, f(No, false, "遼")},
+ {0xf9c4, 0, 0, 0, f(No, false, "龍")},
+ {0xf9c5, 0, 0, 0, f(No, false, "暈")},
+ {0xf9c6, 0, 0, 0, f(No, false, "阮")},
+ {0xf9c7, 0, 0, 0, f(No, false, "劉")},
+ {0xf9c8, 0, 0, 0, f(No, false, "杻")},
+ {0xf9c9, 0, 0, 0, f(No, false, "柳")},
+ {0xf9ca, 0, 0, 0, f(No, false, "流")},
+ {0xf9cb, 0, 0, 0, f(No, false, "溜")},
+ {0xf9cc, 0, 0, 0, f(No, false, "琉")},
+ {0xf9cd, 0, 0, 0, f(No, false, "留")},
+ {0xf9ce, 0, 0, 0, f(No, false, "硫")},
+ {0xf9cf, 0, 0, 0, f(No, false, "紐")},
+ {0xf9d0, 0, 0, 0, f(No, false, "類")},
+ {0xf9d1, 0, 0, 0, f(No, false, "六")},
+ {0xf9d2, 0, 0, 0, f(No, false, "戮")},
+ {0xf9d3, 0, 0, 0, f(No, false, "陸")},
+ {0xf9d4, 0, 0, 0, f(No, false, "倫")},
+ {0xf9d5, 0, 0, 0, f(No, false, "崙")},
+ {0xf9d6, 0, 0, 0, f(No, false, "淪")},
+ {0xf9d7, 0, 0, 0, f(No, false, "輪")},
+ {0xf9d8, 0, 0, 0, f(No, false, "律")},
+ {0xf9d9, 0, 0, 0, f(No, false, "慄")},
+ {0xf9da, 0, 0, 0, f(No, false, "栗")},
+ {0xf9db, 0, 0, 0, f(No, false, "率")},
+ {0xf9dc, 0, 0, 0, f(No, false, "隆")},
+ {0xf9dd, 0, 0, 0, f(No, false, "利")},
+ {0xf9de, 0, 0, 0, f(No, false, "吏")},
+ {0xf9df, 0, 0, 0, f(No, false, "履")},
+ {0xf9e0, 0, 0, 0, f(No, false, "易")},
+ {0xf9e1, 0, 0, 0, f(No, false, "李")},
+ {0xf9e2, 0, 0, 0, f(No, false, "梨")},
+ {0xf9e3, 0, 0, 0, f(No, false, "泥")},
+ {0xf9e4, 0, 0, 0, f(No, false, "理")},
+ {0xf9e5, 0, 0, 0, f(No, false, "痢")},
+ {0xf9e6, 0, 0, 0, f(No, false, "罹")},
+ {0xf9e7, 0, 0, 0, f(No, false, "裏")},
+ {0xf9e8, 0, 0, 0, f(No, false, "裡")},
+ {0xf9e9, 0, 0, 0, f(No, false, "里")},
+ {0xf9ea, 0, 0, 0, f(No, false, "離")},
+ {0xf9eb, 0, 0, 0, f(No, false, "匿")},
+ {0xf9ec, 0, 0, 0, f(No, false, "溺")},
+ {0xf9ed, 0, 0, 0, f(No, false, "吝")},
+ {0xf9ee, 0, 0, 0, f(No, false, "燐")},
+ {0xf9ef, 0, 0, 0, f(No, false, "璘")},
+ {0xf9f0, 0, 0, 0, f(No, false, "藺")},
+ {0xf9f1, 0, 0, 0, f(No, false, "隣")},
+ {0xf9f2, 0, 0, 0, f(No, false, "鱗")},
+ {0xf9f3, 0, 0, 0, f(No, false, "麟")},
+ {0xf9f4, 0, 0, 0, f(No, false, "林")},
+ {0xf9f5, 0, 0, 0, f(No, false, "淋")},
+ {0xf9f6, 0, 0, 0, f(No, false, "臨")},
+ {0xf9f7, 0, 0, 0, f(No, false, "立")},
+ {0xf9f8, 0, 0, 0, f(No, false, "笠")},
+ {0xf9f9, 0, 0, 0, f(No, false, "粒")},
+ {0xf9fa, 0, 0, 0, f(No, false, "狀")},
+ {0xf9fb, 0, 0, 0, f(No, false, "炙")},
+ {0xf9fc, 0, 0, 0, f(No, false, "識")},
+ {0xf9fd, 0, 0, 0, f(No, false, "什")},
+ {0xf9fe, 0, 0, 0, f(No, false, "茶")},
+ {0xf9ff, 0, 0, 0, f(No, false, "刺")},
+ {0xfa00, 0, 0, 0, f(No, false, "切")},
+ {0xfa01, 0, 0, 0, f(No, false, "度")},
+ {0xfa02, 0, 0, 0, f(No, false, "拓")},
+ {0xfa03, 0, 0, 0, f(No, false, "糖")},
+ {0xfa04, 0, 0, 0, f(No, false, "宅")},
+ {0xfa05, 0, 0, 0, f(No, false, "洞")},
+ {0xfa06, 0, 0, 0, f(No, false, "暴")},
+ {0xfa07, 0, 0, 0, f(No, false, "輻")},
+ {0xfa08, 0, 0, 0, f(No, false, "行")},
+ {0xfa09, 0, 0, 0, f(No, false, "降")},
+ {0xfa0a, 0, 0, 0, f(No, false, "見")},
+ {0xfa0b, 0, 0, 0, f(No, false, "廓")},
+ {0xfa0c, 0, 0, 0, f(No, false, "兀")},
+ {0xfa0d, 0, 0, 0, f(No, false, "嗀")},
+ {0xfa0e, 0, 0, 0, f(Yes, false, "")},
+ {0xfa10, 0, 0, 0, f(No, false, "塚")},
+ {0xfa11, 0, 0, 0, f(Yes, false, "")},
+ {0xfa12, 0, 0, 0, f(No, false, "晴")},
+ {0xfa13, 0, 0, 0, f(Yes, false, "")},
+ {0xfa15, 0, 0, 0, f(No, false, "凞")},
+ {0xfa16, 0, 0, 0, f(No, false, "猪")},
+ {0xfa17, 0, 0, 0, f(No, false, "益")},
+ {0xfa18, 0, 0, 0, f(No, false, "礼")},
+ {0xfa19, 0, 0, 0, f(No, false, "神")},
+ {0xfa1a, 0, 0, 0, f(No, false, "祥")},
+ {0xfa1b, 0, 0, 0, f(No, false, "福")},
+ {0xfa1c, 0, 0, 0, f(No, false, "靖")},
+ {0xfa1d, 0, 0, 0, f(No, false, "精")},
+ {0xfa1e, 0, 0, 0, f(No, false, "羽")},
+ {0xfa1f, 0, 0, 0, f(Yes, false, "")},
+ {0xfa20, 0, 0, 0, f(No, false, "蘒")},
+ {0xfa21, 0, 0, 0, f(Yes, false, "")},
+ {0xfa22, 0, 0, 0, f(No, false, "諸")},
+ {0xfa23, 0, 0, 0, f(Yes, false, "")},
+ {0xfa25, 0, 0, 0, f(No, false, "逸")},
+ {0xfa26, 0, 0, 0, f(No, false, "都")},
+ {0xfa27, 0, 0, 0, f(Yes, false, "")},
+ {0xfa2a, 0, 0, 0, f(No, false, "飯")},
+ {0xfa2b, 0, 0, 0, f(No, false, "飼")},
+ {0xfa2c, 0, 0, 0, f(No, false, "館")},
+ {0xfa2d, 0, 0, 0, f(No, false, "鶴")},
+ {0xfa2e, 0, 0, 0, f(No, false, "郞")},
+ {0xfa2f, 0, 0, 0, f(No, false, "隷")},
+ {0xfa30, 0, 0, 0, f(No, false, "侮")},
+ {0xfa31, 0, 0, 0, f(No, false, "僧")},
+ {0xfa32, 0, 0, 0, f(No, false, "免")},
+ {0xfa33, 0, 0, 0, f(No, false, "勉")},
+ {0xfa34, 0, 0, 0, f(No, false, "勤")},
+ {0xfa35, 0, 0, 0, f(No, false, "卑")},
+ {0xfa36, 0, 0, 0, f(No, false, "喝")},
+ {0xfa37, 0, 0, 0, f(No, false, "嘆")},
+ {0xfa38, 0, 0, 0, f(No, false, "器")},
+ {0xfa39, 0, 0, 0, f(No, false, "塀")},
+ {0xfa3a, 0, 0, 0, f(No, false, "墨")},
+ {0xfa3b, 0, 0, 0, f(No, false, "層")},
+ {0xfa3c, 0, 0, 0, f(No, false, "屮")},
+ {0xfa3d, 0, 0, 0, f(No, false, "悔")},
+ {0xfa3e, 0, 0, 0, f(No, false, "慨")},
+ {0xfa3f, 0, 0, 0, f(No, false, "憎")},
+ {0xfa40, 0, 0, 0, f(No, false, "懲")},
+ {0xfa41, 0, 0, 0, f(No, false, "敏")},
+ {0xfa42, 0, 0, 0, f(No, false, "既")},
+ {0xfa43, 0, 0, 0, f(No, false, "暑")},
+ {0xfa44, 0, 0, 0, f(No, false, "梅")},
+ {0xfa45, 0, 0, 0, f(No, false, "海")},
+ {0xfa46, 0, 0, 0, f(No, false, "渚")},
+ {0xfa47, 0, 0, 0, f(No, false, "漢")},
+ {0xfa48, 0, 0, 0, f(No, false, "煮")},
+ {0xfa49, 0, 0, 0, f(No, false, "爫")},
+ {0xfa4a, 0, 0, 0, f(No, false, "琢")},
+ {0xfa4b, 0, 0, 0, f(No, false, "碑")},
+ {0xfa4c, 0, 0, 0, f(No, false, "社")},
+ {0xfa4d, 0, 0, 0, f(No, false, "祉")},
+ {0xfa4e, 0, 0, 0, f(No, false, "祈")},
+ {0xfa4f, 0, 0, 0, f(No, false, "祐")},
+ {0xfa50, 0, 0, 0, f(No, false, "祖")},
+ {0xfa51, 0, 0, 0, f(No, false, "祝")},
+ {0xfa52, 0, 0, 0, f(No, false, "禍")},
+ {0xfa53, 0, 0, 0, f(No, false, "禎")},
+ {0xfa54, 0, 0, 0, f(No, false, "穀")},
+ {0xfa55, 0, 0, 0, f(No, false, "突")},
+ {0xfa56, 0, 0, 0, f(No, false, "節")},
+ {0xfa57, 0, 0, 0, f(No, false, "練")},
+ {0xfa58, 0, 0, 0, f(No, false, "縉")},
+ {0xfa59, 0, 0, 0, f(No, false, "繁")},
+ {0xfa5a, 0, 0, 0, f(No, false, "署")},
+ {0xfa5b, 0, 0, 0, f(No, false, "者")},
+ {0xfa5c, 0, 0, 0, f(No, false, "臭")},
+ {0xfa5d, 0, 0, 0, f(No, false, "艹")},
+ {0xfa5f, 0, 0, 0, f(No, false, "著")},
+ {0xfa60, 0, 0, 0, f(No, false, "褐")},
+ {0xfa61, 0, 0, 0, f(No, false, "視")},
+ {0xfa62, 0, 0, 0, f(No, false, "謁")},
+ {0xfa63, 0, 0, 0, f(No, false, "謹")},
+ {0xfa64, 0, 0, 0, f(No, false, "賓")},
+ {0xfa65, 0, 0, 0, f(No, false, "贈")},
+ {0xfa66, 0, 0, 0, f(No, false, "辶")},
+ {0xfa67, 0, 0, 0, f(No, false, "逸")},
+ {0xfa68, 0, 0, 0, f(No, false, "難")},
+ {0xfa69, 0, 0, 0, f(No, false, "響")},
+ {0xfa6a, 0, 0, 0, f(No, false, "頻")},
+ {0xfa6b, 0, 0, 0, f(No, false, "恵")},
+ {0xfa6c, 0, 0, 0, f(No, false, "𤋮")},
+ {0xfa6d, 0, 0, 0, f(No, false, "舘")},
+ {0xfa6e, 0, 0, 0, f(Yes, false, "")},
+ {0xfa70, 0, 0, 0, f(No, false, "並")},
+ {0xfa71, 0, 0, 0, f(No, false, "况")},
+ {0xfa72, 0, 0, 0, f(No, false, "全")},
+ {0xfa73, 0, 0, 0, f(No, false, "侀")},
+ {0xfa74, 0, 0, 0, f(No, false, "充")},
+ {0xfa75, 0, 0, 0, f(No, false, "冀")},
+ {0xfa76, 0, 0, 0, f(No, false, "勇")},
+ {0xfa77, 0, 0, 0, f(No, false, "勺")},
+ {0xfa78, 0, 0, 0, f(No, false, "喝")},
+ {0xfa79, 0, 0, 0, f(No, false, "啕")},
+ {0xfa7a, 0, 0, 0, f(No, false, "喙")},
+ {0xfa7b, 0, 0, 0, f(No, false, "嗢")},
+ {0xfa7c, 0, 0, 0, f(No, false, "塚")},
+ {0xfa7d, 0, 0, 0, f(No, false, "墳")},
+ {0xfa7e, 0, 0, 0, f(No, false, "奄")},
+ {0xfa7f, 0, 0, 0, f(No, false, "奔")},
+ {0xfa80, 0, 0, 0, f(No, false, "婢")},
+ {0xfa81, 0, 0, 0, f(No, false, "嬨")},
+ {0xfa82, 0, 0, 0, f(No, false, "廒")},
+ {0xfa83, 0, 0, 0, f(No, false, "廙")},
+ {0xfa84, 0, 0, 0, f(No, false, "彩")},
+ {0xfa85, 0, 0, 0, f(No, false, "徭")},
+ {0xfa86, 0, 0, 0, f(No, false, "惘")},
+ {0xfa87, 0, 0, 0, f(No, false, "慎")},
+ {0xfa88, 0, 0, 0, f(No, false, "愈")},
+ {0xfa89, 0, 0, 0, f(No, false, "憎")},
+ {0xfa8a, 0, 0, 0, f(No, false, "慠")},
+ {0xfa8b, 0, 0, 0, f(No, false, "懲")},
+ {0xfa8c, 0, 0, 0, f(No, false, "戴")},
+ {0xfa8d, 0, 0, 0, f(No, false, "揄")},
+ {0xfa8e, 0, 0, 0, f(No, false, "搜")},
+ {0xfa8f, 0, 0, 0, f(No, false, "摒")},
+ {0xfa90, 0, 0, 0, f(No, false, "敖")},
+ {0xfa91, 0, 0, 0, f(No, false, "晴")},
+ {0xfa92, 0, 0, 0, f(No, false, "朗")},
+ {0xfa93, 0, 0, 0, f(No, false, "望")},
+ {0xfa94, 0, 0, 0, f(No, false, "杖")},
+ {0xfa95, 0, 0, 0, f(No, false, "歹")},
+ {0xfa96, 0, 0, 0, f(No, false, "殺")},
+ {0xfa97, 0, 0, 0, f(No, false, "流")},
+ {0xfa98, 0, 0, 0, f(No, false, "滛")},
+ {0xfa99, 0, 0, 0, f(No, false, "滋")},
+ {0xfa9a, 0, 0, 0, f(No, false, "漢")},
+ {0xfa9b, 0, 0, 0, f(No, false, "瀞")},
+ {0xfa9c, 0, 0, 0, f(No, false, "煮")},
+ {0xfa9d, 0, 0, 0, f(No, false, "瞧")},
+ {0xfa9e, 0, 0, 0, f(No, false, "爵")},
+ {0xfa9f, 0, 0, 0, f(No, false, "犯")},
+ {0xfaa0, 0, 0, 0, f(No, false, "猪")},
+ {0xfaa1, 0, 0, 0, f(No, false, "瑱")},
+ {0xfaa2, 0, 0, 0, f(No, false, "甆")},
+ {0xfaa3, 0, 0, 0, f(No, false, "画")},
+ {0xfaa4, 0, 0, 0, f(No, false, "瘝")},
+ {0xfaa5, 0, 0, 0, f(No, false, "瘟")},
+ {0xfaa6, 0, 0, 0, f(No, false, "益")},
+ {0xfaa7, 0, 0, 0, f(No, false, "盛")},
+ {0xfaa8, 0, 0, 0, f(No, false, "直")},
+ {0xfaa9, 0, 0, 0, f(No, false, "睊")},
+ {0xfaaa, 0, 0, 0, f(No, false, "着")},
+ {0xfaab, 0, 0, 0, f(No, false, "磌")},
+ {0xfaac, 0, 0, 0, f(No, false, "窱")},
+ {0xfaad, 0, 0, 0, f(No, false, "節")},
+ {0xfaae, 0, 0, 0, f(No, false, "类")},
+ {0xfaaf, 0, 0, 0, f(No, false, "絛")},
+ {0xfab0, 0, 0, 0, f(No, false, "練")},
+ {0xfab1, 0, 0, 0, f(No, false, "缾")},
+ {0xfab2, 0, 0, 0, f(No, false, "者")},
+ {0xfab3, 0, 0, 0, f(No, false, "荒")},
+ {0xfab4, 0, 0, 0, f(No, false, "華")},
+ {0xfab5, 0, 0, 0, f(No, false, "蝹")},
+ {0xfab6, 0, 0, 0, f(No, false, "襁")},
+ {0xfab7, 0, 0, 0, f(No, false, "覆")},
+ {0xfab8, 0, 0, 0, f(No, false, "視")},
+ {0xfab9, 0, 0, 0, f(No, false, "調")},
+ {0xfaba, 0, 0, 0, f(No, false, "諸")},
+ {0xfabb, 0, 0, 0, f(No, false, "請")},
+ {0xfabc, 0, 0, 0, f(No, false, "謁")},
+ {0xfabd, 0, 0, 0, f(No, false, "諾")},
+ {0xfabe, 0, 0, 0, f(No, false, "諭")},
+ {0xfabf, 0, 0, 0, f(No, false, "謹")},
+ {0xfac0, 0, 0, 0, f(No, false, "變")},
+ {0xfac1, 0, 0, 0, f(No, false, "贈")},
+ {0xfac2, 0, 0, 0, f(No, false, "輸")},
+ {0xfac3, 0, 0, 0, f(No, false, "遲")},
+ {0xfac4, 0, 0, 0, f(No, false, "醙")},
+ {0xfac5, 0, 0, 0, f(No, false, "鉶")},
+ {0xfac6, 0, 0, 0, f(No, false, "陼")},
+ {0xfac7, 0, 0, 0, f(No, false, "難")},
+ {0xfac8, 0, 0, 0, f(No, false, "靖")},
+ {0xfac9, 0, 0, 0, f(No, false, "韛")},
+ {0xfaca, 0, 0, 0, f(No, false, "響")},
+ {0xfacb, 0, 0, 0, f(No, false, "頋")},
+ {0xfacc, 0, 0, 0, f(No, false, "頻")},
+ {0xfacd, 0, 0, 0, f(No, false, "鬒")},
+ {0xface, 0, 0, 0, f(No, false, "龜")},
+ {0xfacf, 0, 0, 0, f(No, false, "𢡊")},
+ {0xfad0, 0, 0, 0, f(No, false, "𢡄")},
+ {0xfad1, 0, 0, 0, f(No, false, "𣏕")},
+ {0xfad2, 0, 0, 0, f(No, false, "㮝")},
+ {0xfad3, 0, 0, 0, f(No, false, "䀘")},
+ {0xfad4, 0, 0, 0, f(No, false, "䀹")},
+ {0xfad5, 0, 0, 0, f(No, false, "𥉉")},
+ {0xfad6, 0, 0, 0, f(No, false, "𥳐")},
+ {0xfad7, 0, 0, 0, f(No, false, "𧻓")},
+ {0xfad8, 0, 0, 0, f(No, false, "齃")},
+ {0xfad9, 0, 0, 0, f(No, false, "龎")},
+ {0xfada, 0, 0, 0, f(Yes, false, "")},
+ {0xfb00, 0, 0, 0, g(Yes, No, false, false, "", "ff")},
+ {0xfb01, 0, 0, 0, g(Yes, No, false, false, "", "fi")},
+ {0xfb02, 0, 0, 0, g(Yes, No, false, false, "", "fl")},
+ {0xfb03, 0, 0, 0, g(Yes, No, false, false, "", "ffi")},
+ {0xfb04, 0, 0, 0, g(Yes, No, false, false, "", "ffl")},
+ {0xfb05, 0, 0, 0, g(Yes, No, false, false, "", "st")},
+ {0xfb07, 0, 0, 0, f(Yes, false, "")},
+ {0xfb13, 0, 0, 0, g(Yes, No, false, false, "", "մն")},
+ {0xfb14, 0, 0, 0, g(Yes, No, false, false, "", "մե")},
+ {0xfb15, 0, 0, 0, g(Yes, No, false, false, "", "մի")},
+ {0xfb16, 0, 0, 0, g(Yes, No, false, false, "", "վն")},
+ {0xfb17, 0, 0, 0, g(Yes, No, false, false, "", "մխ")},
+ {0xfb18, 0, 0, 0, f(Yes, false, "")},
+ {0xfb1d, 0, 0, 1, f(No, false, "יִ")},
+ {0xfb1e, 26, 1, 1, f(Yes, false, "")},
+ {0xfb1f, 0, 0, 1, f(No, false, "ײַ")},
+ {0xfb20, 0, 0, 0, g(Yes, No, false, false, "", "ע")},
+ {0xfb21, 0, 0, 0, g(Yes, No, false, false, "", "א")},
+ {0xfb22, 0, 0, 0, g(Yes, No, false, false, "", "ד")},
+ {0xfb23, 0, 0, 0, g(Yes, No, false, false, "", "ה")},
+ {0xfb24, 0, 0, 0, g(Yes, No, false, false, "", "כ")},
+ {0xfb25, 0, 0, 0, g(Yes, No, false, false, "", "ל")},
+ {0xfb26, 0, 0, 0, g(Yes, No, false, false, "", "ם")},
+ {0xfb27, 0, 0, 0, g(Yes, No, false, false, "", "ר")},
+ {0xfb28, 0, 0, 0, g(Yes, No, false, false, "", "ת")},
+ {0xfb29, 0, 0, 0, g(Yes, No, false, false, "", "+")},
+ {0xfb2a, 0, 0, 1, f(No, false, "שׁ")},
+ {0xfb2b, 0, 0, 1, f(No, false, "שׂ")},
+ {0xfb2c, 0, 0, 2, f(No, false, "שּׁ")},
+ {0xfb2d, 0, 0, 2, f(No, false, "שּׂ")},
+ {0xfb2e, 0, 0, 1, f(No, false, "אַ")},
+ {0xfb2f, 0, 0, 1, f(No, false, "אָ")},
+ {0xfb30, 0, 0, 1, f(No, false, "אּ")},
+ {0xfb31, 0, 0, 1, f(No, false, "בּ")},
+ {0xfb32, 0, 0, 1, f(No, false, "גּ")},
+ {0xfb33, 0, 0, 1, f(No, false, "דּ")},
+ {0xfb34, 0, 0, 1, f(No, false, "הּ")},
+ {0xfb35, 0, 0, 1, f(No, false, "וּ")},
+ {0xfb36, 0, 0, 1, f(No, false, "זּ")},
+ {0xfb37, 0, 0, 0, f(Yes, false, "")},
+ {0xfb38, 0, 0, 1, f(No, false, "טּ")},
+ {0xfb39, 0, 0, 1, f(No, false, "יּ")},
+ {0xfb3a, 0, 0, 1, f(No, false, "ךּ")},
+ {0xfb3b, 0, 0, 1, f(No, false, "כּ")},
+ {0xfb3c, 0, 0, 1, f(No, false, "לּ")},
+ {0xfb3d, 0, 0, 0, f(Yes, false, "")},
+ {0xfb3e, 0, 0, 1, f(No, false, "מּ")},
+ {0xfb3f, 0, 0, 0, f(Yes, false, "")},
+ {0xfb40, 0, 0, 1, f(No, false, "נּ")},
+ {0xfb41, 0, 0, 1, f(No, false, "סּ")},
+ {0xfb42, 0, 0, 0, f(Yes, false, "")},
+ {0xfb43, 0, 0, 1, f(No, false, "ףּ")},
+ {0xfb44, 0, 0, 1, f(No, false, "פּ")},
+ {0xfb45, 0, 0, 0, f(Yes, false, "")},
+ {0xfb46, 0, 0, 1, f(No, false, "צּ")},
+ {0xfb47, 0, 0, 1, f(No, false, "קּ")},
+ {0xfb48, 0, 0, 1, f(No, false, "רּ")},
+ {0xfb49, 0, 0, 1, f(No, false, "שּ")},
+ {0xfb4a, 0, 0, 1, f(No, false, "תּ")},
+ {0xfb4b, 0, 0, 1, f(No, false, "וֹ")},
+ {0xfb4c, 0, 0, 1, f(No, false, "בֿ")},
+ {0xfb4d, 0, 0, 1, f(No, false, "כֿ")},
+ {0xfb4e, 0, 0, 1, f(No, false, "פֿ")},
+ {0xfb4f, 0, 0, 0, g(Yes, No, false, false, "", "אל")},
+ {0xfb50, 0, 0, 0, g(Yes, No, false, false, "", "ٱ")},
+ {0xfb52, 0, 0, 0, g(Yes, No, false, false, "", "ٻ")},
+ {0xfb56, 0, 0, 0, g(Yes, No, false, false, "", "پ")},
+ {0xfb5a, 0, 0, 0, g(Yes, No, false, false, "", "ڀ")},
+ {0xfb5e, 0, 0, 0, g(Yes, No, false, false, "", "ٺ")},
+ {0xfb62, 0, 0, 0, g(Yes, No, false, false, "", "ٿ")},
+ {0xfb66, 0, 0, 0, g(Yes, No, false, false, "", "ٹ")},
+ {0xfb6a, 0, 0, 0, g(Yes, No, false, false, "", "ڤ")},
+ {0xfb6e, 0, 0, 0, g(Yes, No, false, false, "", "ڦ")},
+ {0xfb72, 0, 0, 0, g(Yes, No, false, false, "", "ڄ")},
+ {0xfb76, 0, 0, 0, g(Yes, No, false, false, "", "ڃ")},
+ {0xfb7a, 0, 0, 0, g(Yes, No, false, false, "", "چ")},
+ {0xfb7e, 0, 0, 0, g(Yes, No, false, false, "", "ڇ")},
+ {0xfb82, 0, 0, 0, g(Yes, No, false, false, "", "ڍ")},
+ {0xfb84, 0, 0, 0, g(Yes, No, false, false, "", "ڌ")},
+ {0xfb86, 0, 0, 0, g(Yes, No, false, false, "", "ڎ")},
+ {0xfb88, 0, 0, 0, g(Yes, No, false, false, "", "ڈ")},
+ {0xfb8a, 0, 0, 0, g(Yes, No, false, false, "", "ژ")},
+ {0xfb8c, 0, 0, 0, g(Yes, No, false, false, "", "ڑ")},
+ {0xfb8e, 0, 0, 0, g(Yes, No, false, false, "", "ک")},
+ {0xfb92, 0, 0, 0, g(Yes, No, false, false, "", "گ")},
+ {0xfb96, 0, 0, 0, g(Yes, No, false, false, "", "ڳ")},
+ {0xfb9a, 0, 0, 0, g(Yes, No, false, false, "", "ڱ")},
+ {0xfb9e, 0, 0, 0, g(Yes, No, false, false, "", "ں")},
+ {0xfba0, 0, 0, 0, g(Yes, No, false, false, "", "ڻ")},
+ {0xfba4, 0, 0, 1, g(Yes, No, false, false, "", "ۀ")},
+ {0xfba6, 0, 0, 0, g(Yes, No, false, false, "", "ہ")},
+ {0xfbaa, 0, 0, 0, g(Yes, No, false, false, "", "ھ")},
+ {0xfbae, 0, 0, 0, g(Yes, No, false, false, "", "ے")},
+ {0xfbb0, 0, 0, 1, g(Yes, No, false, false, "", "ۓ")},
+ {0xfbb2, 0, 0, 0, f(Yes, false, "")},
+ {0xfbd3, 0, 0, 0, g(Yes, No, false, false, "", "ڭ")},
+ {0xfbd7, 0, 0, 0, g(Yes, No, false, false, "", "ۇ")},
+ {0xfbd9, 0, 0, 0, g(Yes, No, false, false, "", "ۆ")},
+ {0xfbdb, 0, 0, 0, g(Yes, No, false, false, "", "ۈ")},
+ {0xfbdd, 0, 0, 0, g(Yes, No, false, false, "", "ۇٴ")},
+ {0xfbde, 0, 0, 0, g(Yes, No, false, false, "", "ۋ")},
+ {0xfbe0, 0, 0, 0, g(Yes, No, false, false, "", "ۅ")},
+ {0xfbe2, 0, 0, 0, g(Yes, No, false, false, "", "ۉ")},
+ {0xfbe4, 0, 0, 0, g(Yes, No, false, false, "", "ې")},
+ {0xfbe8, 0, 0, 0, g(Yes, No, false, false, "", "ى")},
+ {0xfbea, 0, 0, 0, g(Yes, No, false, false, "", "ئا")},
+ {0xfbec, 0, 0, 0, g(Yes, No, false, false, "", "ئە")},
+ {0xfbee, 0, 0, 0, g(Yes, No, false, false, "", "ئو")},
+ {0xfbf0, 0, 0, 0, g(Yes, No, false, false, "", "ئۇ")},
+ {0xfbf2, 0, 0, 0, g(Yes, No, false, false, "", "ئۆ")},
+ {0xfbf4, 0, 0, 0, g(Yes, No, false, false, "", "ئۈ")},
+ {0xfbf6, 0, 0, 0, g(Yes, No, false, false, "", "ئې")},
+ {0xfbf9, 0, 0, 0, g(Yes, No, false, false, "", "ئى")},
+ {0xfbfc, 0, 0, 0, g(Yes, No, false, false, "", "ی")},
+ {0xfc00, 0, 0, 0, g(Yes, No, false, false, "", "ئج")},
+ {0xfc01, 0, 0, 0, g(Yes, No, false, false, "", "ئح")},
+ {0xfc02, 0, 0, 0, g(Yes, No, false, false, "", "ئم")},
+ {0xfc03, 0, 0, 0, g(Yes, No, false, false, "", "ئى")},
+ {0xfc04, 0, 0, 0, g(Yes, No, false, false, "", "ئي")},
+ {0xfc05, 0, 0, 0, g(Yes, No, false, false, "", "بج")},
+ {0xfc06, 0, 0, 0, g(Yes, No, false, false, "", "بح")},
+ {0xfc07, 0, 0, 0, g(Yes, No, false, false, "", "بخ")},
+ {0xfc08, 0, 0, 0, g(Yes, No, false, false, "", "بم")},
+ {0xfc09, 0, 0, 0, g(Yes, No, false, false, "", "بى")},
+ {0xfc0a, 0, 0, 0, g(Yes, No, false, false, "", "بي")},
+ {0xfc0b, 0, 0, 0, g(Yes, No, false, false, "", "تج")},
+ {0xfc0c, 0, 0, 0, g(Yes, No, false, false, "", "تح")},
+ {0xfc0d, 0, 0, 0, g(Yes, No, false, false, "", "تخ")},
+ {0xfc0e, 0, 0, 0, g(Yes, No, false, false, "", "تم")},
+ {0xfc0f, 0, 0, 0, g(Yes, No, false, false, "", "تى")},
+ {0xfc10, 0, 0, 0, g(Yes, No, false, false, "", "تي")},
+ {0xfc11, 0, 0, 0, g(Yes, No, false, false, "", "ثج")},
+ {0xfc12, 0, 0, 0, g(Yes, No, false, false, "", "ثم")},
+ {0xfc13, 0, 0, 0, g(Yes, No, false, false, "", "ثى")},
+ {0xfc14, 0, 0, 0, g(Yes, No, false, false, "", "ثي")},
+ {0xfc15, 0, 0, 0, g(Yes, No, false, false, "", "جح")},
+ {0xfc16, 0, 0, 0, g(Yes, No, false, false, "", "جم")},
+ {0xfc17, 0, 0, 0, g(Yes, No, false, false, "", "حج")},
+ {0xfc18, 0, 0, 0, g(Yes, No, false, false, "", "حم")},
+ {0xfc19, 0, 0, 0, g(Yes, No, false, false, "", "خج")},
+ {0xfc1a, 0, 0, 0, g(Yes, No, false, false, "", "خح")},
+ {0xfc1b, 0, 0, 0, g(Yes, No, false, false, "", "خم")},
+ {0xfc1c, 0, 0, 0, g(Yes, No, false, false, "", "سج")},
+ {0xfc1d, 0, 0, 0, g(Yes, No, false, false, "", "سح")},
+ {0xfc1e, 0, 0, 0, g(Yes, No, false, false, "", "سخ")},
+ {0xfc1f, 0, 0, 0, g(Yes, No, false, false, "", "سم")},
+ {0xfc20, 0, 0, 0, g(Yes, No, false, false, "", "صح")},
+ {0xfc21, 0, 0, 0, g(Yes, No, false, false, "", "صم")},
+ {0xfc22, 0, 0, 0, g(Yes, No, false, false, "", "ضج")},
+ {0xfc23, 0, 0, 0, g(Yes, No, false, false, "", "ضح")},
+ {0xfc24, 0, 0, 0, g(Yes, No, false, false, "", "ضخ")},
+ {0xfc25, 0, 0, 0, g(Yes, No, false, false, "", "ضم")},
+ {0xfc26, 0, 0, 0, g(Yes, No, false, false, "", "طح")},
+ {0xfc27, 0, 0, 0, g(Yes, No, false, false, "", "طم")},
+ {0xfc28, 0, 0, 0, g(Yes, No, false, false, "", "ظم")},
+ {0xfc29, 0, 0, 0, g(Yes, No, false, false, "", "عج")},
+ {0xfc2a, 0, 0, 0, g(Yes, No, false, false, "", "عم")},
+ {0xfc2b, 0, 0, 0, g(Yes, No, false, false, "", "غج")},
+ {0xfc2c, 0, 0, 0, g(Yes, No, false, false, "", "غم")},
+ {0xfc2d, 0, 0, 0, g(Yes, No, false, false, "", "فج")},
+ {0xfc2e, 0, 0, 0, g(Yes, No, false, false, "", "فح")},
+ {0xfc2f, 0, 0, 0, g(Yes, No, false, false, "", "فخ")},
+ {0xfc30, 0, 0, 0, g(Yes, No, false, false, "", "فم")},
+ {0xfc31, 0, 0, 0, g(Yes, No, false, false, "", "فى")},
+ {0xfc32, 0, 0, 0, g(Yes, No, false, false, "", "في")},
+ {0xfc33, 0, 0, 0, g(Yes, No, false, false, "", "قح")},
+ {0xfc34, 0, 0, 0, g(Yes, No, false, false, "", "قم")},
+ {0xfc35, 0, 0, 0, g(Yes, No, false, false, "", "قى")},
+ {0xfc36, 0, 0, 0, g(Yes, No, false, false, "", "قي")},
+ {0xfc37, 0, 0, 0, g(Yes, No, false, false, "", "كا")},
+ {0xfc38, 0, 0, 0, g(Yes, No, false, false, "", "كج")},
+ {0xfc39, 0, 0, 0, g(Yes, No, false, false, "", "كح")},
+ {0xfc3a, 0, 0, 0, g(Yes, No, false, false, "", "كخ")},
+ {0xfc3b, 0, 0, 0, g(Yes, No, false, false, "", "كل")},
+ {0xfc3c, 0, 0, 0, g(Yes, No, false, false, "", "كم")},
+ {0xfc3d, 0, 0, 0, g(Yes, No, false, false, "", "كى")},
+ {0xfc3e, 0, 0, 0, g(Yes, No, false, false, "", "كي")},
+ {0xfc3f, 0, 0, 0, g(Yes, No, false, false, "", "لج")},
+ {0xfc40, 0, 0, 0, g(Yes, No, false, false, "", "لح")},
+ {0xfc41, 0, 0, 0, g(Yes, No, false, false, "", "لخ")},
+ {0xfc42, 0, 0, 0, g(Yes, No, false, false, "", "لم")},
+ {0xfc43, 0, 0, 0, g(Yes, No, false, false, "", "لى")},
+ {0xfc44, 0, 0, 0, g(Yes, No, false, false, "", "لي")},
+ {0xfc45, 0, 0, 0, g(Yes, No, false, false, "", "مج")},
+ {0xfc46, 0, 0, 0, g(Yes, No, false, false, "", "مح")},
+ {0xfc47, 0, 0, 0, g(Yes, No, false, false, "", "مخ")},
+ {0xfc48, 0, 0, 0, g(Yes, No, false, false, "", "مم")},
+ {0xfc49, 0, 0, 0, g(Yes, No, false, false, "", "مى")},
+ {0xfc4a, 0, 0, 0, g(Yes, No, false, false, "", "مي")},
+ {0xfc4b, 0, 0, 0, g(Yes, No, false, false, "", "نج")},
+ {0xfc4c, 0, 0, 0, g(Yes, No, false, false, "", "نح")},
+ {0xfc4d, 0, 0, 0, g(Yes, No, false, false, "", "نخ")},
+ {0xfc4e, 0, 0, 0, g(Yes, No, false, false, "", "نم")},
+ {0xfc4f, 0, 0, 0, g(Yes, No, false, false, "", "نى")},
+ {0xfc50, 0, 0, 0, g(Yes, No, false, false, "", "ني")},
+ {0xfc51, 0, 0, 0, g(Yes, No, false, false, "", "هج")},
+ {0xfc52, 0, 0, 0, g(Yes, No, false, false, "", "هم")},
+ {0xfc53, 0, 0, 0, g(Yes, No, false, false, "", "هى")},
+ {0xfc54, 0, 0, 0, g(Yes, No, false, false, "", "هي")},
+ {0xfc55, 0, 0, 0, g(Yes, No, false, false, "", "يج")},
+ {0xfc56, 0, 0, 0, g(Yes, No, false, false, "", "يح")},
+ {0xfc57, 0, 0, 0, g(Yes, No, false, false, "", "يخ")},
+ {0xfc58, 0, 0, 0, g(Yes, No, false, false, "", "يم")},
+ {0xfc59, 0, 0, 0, g(Yes, No, false, false, "", "يى")},
+ {0xfc5a, 0, 0, 0, g(Yes, No, false, false, "", "يي")},
+ {0xfc5b, 0, 0, 1, g(Yes, No, false, false, "", "ذٰ")},
+ {0xfc5c, 0, 0, 1, g(Yes, No, false, false, "", "رٰ")},
+ {0xfc5d, 0, 0, 1, g(Yes, No, false, false, "", "ىٰ")},
+ {0xfc5e, 0, 0, 2, g(Yes, No, false, false, "", " ٌّ")},
+ {0xfc5f, 0, 0, 2, g(Yes, No, false, false, "", " ٍّ")},
+ {0xfc60, 0, 0, 2, g(Yes, No, false, false, "", " َّ")},
+ {0xfc61, 0, 0, 2, g(Yes, No, false, false, "", " ُّ")},
+ {0xfc62, 0, 0, 2, g(Yes, No, false, false, "", " ِّ")},
+ {0xfc63, 0, 0, 2, g(Yes, No, false, false, "", " ّٰ")},
+ {0xfc64, 0, 0, 0, g(Yes, No, false, false, "", "ئر")},
+ {0xfc65, 0, 0, 0, g(Yes, No, false, false, "", "ئز")},
+ {0xfc66, 0, 0, 0, g(Yes, No, false, false, "", "ئم")},
+ {0xfc67, 0, 0, 0, g(Yes, No, false, false, "", "ئن")},
+ {0xfc68, 0, 0, 0, g(Yes, No, false, false, "", "ئى")},
+ {0xfc69, 0, 0, 0, g(Yes, No, false, false, "", "ئي")},
+ {0xfc6a, 0, 0, 0, g(Yes, No, false, false, "", "بر")},
+ {0xfc6b, 0, 0, 0, g(Yes, No, false, false, "", "بز")},
+ {0xfc6c, 0, 0, 0, g(Yes, No, false, false, "", "بم")},
+ {0xfc6d, 0, 0, 0, g(Yes, No, false, false, "", "بن")},
+ {0xfc6e, 0, 0, 0, g(Yes, No, false, false, "", "بى")},
+ {0xfc6f, 0, 0, 0, g(Yes, No, false, false, "", "بي")},
+ {0xfc70, 0, 0, 0, g(Yes, No, false, false, "", "تر")},
+ {0xfc71, 0, 0, 0, g(Yes, No, false, false, "", "تز")},
+ {0xfc72, 0, 0, 0, g(Yes, No, false, false, "", "تم")},
+ {0xfc73, 0, 0, 0, g(Yes, No, false, false, "", "تن")},
+ {0xfc74, 0, 0, 0, g(Yes, No, false, false, "", "تى")},
+ {0xfc75, 0, 0, 0, g(Yes, No, false, false, "", "تي")},
+ {0xfc76, 0, 0, 0, g(Yes, No, false, false, "", "ثر")},
+ {0xfc77, 0, 0, 0, g(Yes, No, false, false, "", "ثز")},
+ {0xfc78, 0, 0, 0, g(Yes, No, false, false, "", "ثم")},
+ {0xfc79, 0, 0, 0, g(Yes, No, false, false, "", "ثن")},
+ {0xfc7a, 0, 0, 0, g(Yes, No, false, false, "", "ثى")},
+ {0xfc7b, 0, 0, 0, g(Yes, No, false, false, "", "ثي")},
+ {0xfc7c, 0, 0, 0, g(Yes, No, false, false, "", "فى")},
+ {0xfc7d, 0, 0, 0, g(Yes, No, false, false, "", "في")},
+ {0xfc7e, 0, 0, 0, g(Yes, No, false, false, "", "قى")},
+ {0xfc7f, 0, 0, 0, g(Yes, No, false, false, "", "قي")},
+ {0xfc80, 0, 0, 0, g(Yes, No, false, false, "", "كا")},
+ {0xfc81, 0, 0, 0, g(Yes, No, false, false, "", "كل")},
+ {0xfc82, 0, 0, 0, g(Yes, No, false, false, "", "كم")},
+ {0xfc83, 0, 0, 0, g(Yes, No, false, false, "", "كى")},
+ {0xfc84, 0, 0, 0, g(Yes, No, false, false, "", "كي")},
+ {0xfc85, 0, 0, 0, g(Yes, No, false, false, "", "لم")},
+ {0xfc86, 0, 0, 0, g(Yes, No, false, false, "", "لى")},
+ {0xfc87, 0, 0, 0, g(Yes, No, false, false, "", "لي")},
+ {0xfc88, 0, 0, 0, g(Yes, No, false, false, "", "ما")},
+ {0xfc89, 0, 0, 0, g(Yes, No, false, false, "", "مم")},
+ {0xfc8a, 0, 0, 0, g(Yes, No, false, false, "", "نر")},
+ {0xfc8b, 0, 0, 0, g(Yes, No, false, false, "", "نز")},
+ {0xfc8c, 0, 0, 0, g(Yes, No, false, false, "", "نم")},
+ {0xfc8d, 0, 0, 0, g(Yes, No, false, false, "", "نن")},
+ {0xfc8e, 0, 0, 0, g(Yes, No, false, false, "", "نى")},
+ {0xfc8f, 0, 0, 0, g(Yes, No, false, false, "", "ني")},
+ {0xfc90, 0, 0, 1, g(Yes, No, false, false, "", "ىٰ")},
+ {0xfc91, 0, 0, 0, g(Yes, No, false, false, "", "ير")},
+ {0xfc92, 0, 0, 0, g(Yes, No, false, false, "", "يز")},
+ {0xfc93, 0, 0, 0, g(Yes, No, false, false, "", "يم")},
+ {0xfc94, 0, 0, 0, g(Yes, No, false, false, "", "ين")},
+ {0xfc95, 0, 0, 0, g(Yes, No, false, false, "", "يى")},
+ {0xfc96, 0, 0, 0, g(Yes, No, false, false, "", "يي")},
+ {0xfc97, 0, 0, 0, g(Yes, No, false, false, "", "ئج")},
+ {0xfc98, 0, 0, 0, g(Yes, No, false, false, "", "ئح")},
+ {0xfc99, 0, 0, 0, g(Yes, No, false, false, "", "ئخ")},
+ {0xfc9a, 0, 0, 0, g(Yes, No, false, false, "", "ئم")},
+ {0xfc9b, 0, 0, 0, g(Yes, No, false, false, "", "ئه")},
+ {0xfc9c, 0, 0, 0, g(Yes, No, false, false, "", "بج")},
+ {0xfc9d, 0, 0, 0, g(Yes, No, false, false, "", "بح")},
+ {0xfc9e, 0, 0, 0, g(Yes, No, false, false, "", "بخ")},
+ {0xfc9f, 0, 0, 0, g(Yes, No, false, false, "", "بم")},
+ {0xfca0, 0, 0, 0, g(Yes, No, false, false, "", "به")},
+ {0xfca1, 0, 0, 0, g(Yes, No, false, false, "", "تج")},
+ {0xfca2, 0, 0, 0, g(Yes, No, false, false, "", "تح")},
+ {0xfca3, 0, 0, 0, g(Yes, No, false, false, "", "تخ")},
+ {0xfca4, 0, 0, 0, g(Yes, No, false, false, "", "تم")},
+ {0xfca5, 0, 0, 0, g(Yes, No, false, false, "", "ته")},
+ {0xfca6, 0, 0, 0, g(Yes, No, false, false, "", "ثم")},
+ {0xfca7, 0, 0, 0, g(Yes, No, false, false, "", "جح")},
+ {0xfca8, 0, 0, 0, g(Yes, No, false, false, "", "جم")},
+ {0xfca9, 0, 0, 0, g(Yes, No, false, false, "", "حج")},
+ {0xfcaa, 0, 0, 0, g(Yes, No, false, false, "", "حم")},
+ {0xfcab, 0, 0, 0, g(Yes, No, false, false, "", "خج")},
+ {0xfcac, 0, 0, 0, g(Yes, No, false, false, "", "خم")},
+ {0xfcad, 0, 0, 0, g(Yes, No, false, false, "", "سج")},
+ {0xfcae, 0, 0, 0, g(Yes, No, false, false, "", "سح")},
+ {0xfcaf, 0, 0, 0, g(Yes, No, false, false, "", "سخ")},
+ {0xfcb0, 0, 0, 0, g(Yes, No, false, false, "", "سم")},
+ {0xfcb1, 0, 0, 0, g(Yes, No, false, false, "", "صح")},
+ {0xfcb2, 0, 0, 0, g(Yes, No, false, false, "", "صخ")},
+ {0xfcb3, 0, 0, 0, g(Yes, No, false, false, "", "صم")},
+ {0xfcb4, 0, 0, 0, g(Yes, No, false, false, "", "ضج")},
+ {0xfcb5, 0, 0, 0, g(Yes, No, false, false, "", "ضح")},
+ {0xfcb6, 0, 0, 0, g(Yes, No, false, false, "", "ضخ")},
+ {0xfcb7, 0, 0, 0, g(Yes, No, false, false, "", "ضم")},
+ {0xfcb8, 0, 0, 0, g(Yes, No, false, false, "", "طح")},
+ {0xfcb9, 0, 0, 0, g(Yes, No, false, false, "", "ظم")},
+ {0xfcba, 0, 0, 0, g(Yes, No, false, false, "", "عج")},
+ {0xfcbb, 0, 0, 0, g(Yes, No, false, false, "", "عم")},
+ {0xfcbc, 0, 0, 0, g(Yes, No, false, false, "", "غج")},
+ {0xfcbd, 0, 0, 0, g(Yes, No, false, false, "", "غم")},
+ {0xfcbe, 0, 0, 0, g(Yes, No, false, false, "", "فج")},
+ {0xfcbf, 0, 0, 0, g(Yes, No, false, false, "", "فح")},
+ {0xfcc0, 0, 0, 0, g(Yes, No, false, false, "", "فخ")},
+ {0xfcc1, 0, 0, 0, g(Yes, No, false, false, "", "فم")},
+ {0xfcc2, 0, 0, 0, g(Yes, No, false, false, "", "قح")},
+ {0xfcc3, 0, 0, 0, g(Yes, No, false, false, "", "قم")},
+ {0xfcc4, 0, 0, 0, g(Yes, No, false, false, "", "كج")},
+ {0xfcc5, 0, 0, 0, g(Yes, No, false, false, "", "كح")},
+ {0xfcc6, 0, 0, 0, g(Yes, No, false, false, "", "كخ")},
+ {0xfcc7, 0, 0, 0, g(Yes, No, false, false, "", "كل")},
+ {0xfcc8, 0, 0, 0, g(Yes, No, false, false, "", "كم")},
+ {0xfcc9, 0, 0, 0, g(Yes, No, false, false, "", "لج")},
+ {0xfcca, 0, 0, 0, g(Yes, No, false, false, "", "لح")},
+ {0xfccb, 0, 0, 0, g(Yes, No, false, false, "", "لخ")},
+ {0xfccc, 0, 0, 0, g(Yes, No, false, false, "", "لم")},
+ {0xfccd, 0, 0, 0, g(Yes, No, false, false, "", "له")},
+ {0xfcce, 0, 0, 0, g(Yes, No, false, false, "", "مج")},
+ {0xfccf, 0, 0, 0, g(Yes, No, false, false, "", "مح")},
+ {0xfcd0, 0, 0, 0, g(Yes, No, false, false, "", "مخ")},
+ {0xfcd1, 0, 0, 0, g(Yes, No, false, false, "", "مم")},
+ {0xfcd2, 0, 0, 0, g(Yes, No, false, false, "", "نج")},
+ {0xfcd3, 0, 0, 0, g(Yes, No, false, false, "", "نح")},
+ {0xfcd4, 0, 0, 0, g(Yes, No, false, false, "", "نخ")},
+ {0xfcd5, 0, 0, 0, g(Yes, No, false, false, "", "نم")},
+ {0xfcd6, 0, 0, 0, g(Yes, No, false, false, "", "نه")},
+ {0xfcd7, 0, 0, 0, g(Yes, No, false, false, "", "هج")},
+ {0xfcd8, 0, 0, 0, g(Yes, No, false, false, "", "هم")},
+ {0xfcd9, 0, 0, 1, g(Yes, No, false, false, "", "هٰ")},
+ {0xfcda, 0, 0, 0, g(Yes, No, false, false, "", "يج")},
+ {0xfcdb, 0, 0, 0, g(Yes, No, false, false, "", "يح")},
+ {0xfcdc, 0, 0, 0, g(Yes, No, false, false, "", "يخ")},
+ {0xfcdd, 0, 0, 0, g(Yes, No, false, false, "", "يم")},
+ {0xfcde, 0, 0, 0, g(Yes, No, false, false, "", "يه")},
+ {0xfcdf, 0, 0, 0, g(Yes, No, false, false, "", "ئم")},
+ {0xfce0, 0, 0, 0, g(Yes, No, false, false, "", "ئه")},
+ {0xfce1, 0, 0, 0, g(Yes, No, false, false, "", "بم")},
+ {0xfce2, 0, 0, 0, g(Yes, No, false, false, "", "به")},
+ {0xfce3, 0, 0, 0, g(Yes, No, false, false, "", "تم")},
+ {0xfce4, 0, 0, 0, g(Yes, No, false, false, "", "ته")},
+ {0xfce5, 0, 0, 0, g(Yes, No, false, false, "", "ثم")},
+ {0xfce6, 0, 0, 0, g(Yes, No, false, false, "", "ثه")},
+ {0xfce7, 0, 0, 0, g(Yes, No, false, false, "", "سم")},
+ {0xfce8, 0, 0, 0, g(Yes, No, false, false, "", "سه")},
+ {0xfce9, 0, 0, 0, g(Yes, No, false, false, "", "شم")},
+ {0xfcea, 0, 0, 0, g(Yes, No, false, false, "", "شه")},
+ {0xfceb, 0, 0, 0, g(Yes, No, false, false, "", "كل")},
+ {0xfcec, 0, 0, 0, g(Yes, No, false, false, "", "كم")},
+ {0xfced, 0, 0, 0, g(Yes, No, false, false, "", "لم")},
+ {0xfcee, 0, 0, 0, g(Yes, No, false, false, "", "نم")},
+ {0xfcef, 0, 0, 0, g(Yes, No, false, false, "", "نه")},
+ {0xfcf0, 0, 0, 0, g(Yes, No, false, false, "", "يم")},
+ {0xfcf1, 0, 0, 0, g(Yes, No, false, false, "", "يه")},
+ {0xfcf2, 0, 0, 2, g(Yes, No, false, false, "", "ـَّ")},
+ {0xfcf3, 0, 0, 2, g(Yes, No, false, false, "", "ـُّ")},
+ {0xfcf4, 0, 0, 2, g(Yes, No, false, false, "", "ـِّ")},
+ {0xfcf5, 0, 0, 0, g(Yes, No, false, false, "", "طى")},
+ {0xfcf6, 0, 0, 0, g(Yes, No, false, false, "", "طي")},
+ {0xfcf7, 0, 0, 0, g(Yes, No, false, false, "", "عى")},
+ {0xfcf8, 0, 0, 0, g(Yes, No, false, false, "", "عي")},
+ {0xfcf9, 0, 0, 0, g(Yes, No, false, false, "", "غى")},
+ {0xfcfa, 0, 0, 0, g(Yes, No, false, false, "", "غي")},
+ {0xfcfb, 0, 0, 0, g(Yes, No, false, false, "", "سى")},
+ {0xfcfc, 0, 0, 0, g(Yes, No, false, false, "", "سي")},
+ {0xfcfd, 0, 0, 0, g(Yes, No, false, false, "", "شى")},
+ {0xfcfe, 0, 0, 0, g(Yes, No, false, false, "", "شي")},
+ {0xfcff, 0, 0, 0, g(Yes, No, false, false, "", "حى")},
+ {0xfd00, 0, 0, 0, g(Yes, No, false, false, "", "حي")},
+ {0xfd01, 0, 0, 0, g(Yes, No, false, false, "", "جى")},
+ {0xfd02, 0, 0, 0, g(Yes, No, false, false, "", "جي")},
+ {0xfd03, 0, 0, 0, g(Yes, No, false, false, "", "خى")},
+ {0xfd04, 0, 0, 0, g(Yes, No, false, false, "", "خي")},
+ {0xfd05, 0, 0, 0, g(Yes, No, false, false, "", "صى")},
+ {0xfd06, 0, 0, 0, g(Yes, No, false, false, "", "صي")},
+ {0xfd07, 0, 0, 0, g(Yes, No, false, false, "", "ضى")},
+ {0xfd08, 0, 0, 0, g(Yes, No, false, false, "", "ضي")},
+ {0xfd09, 0, 0, 0, g(Yes, No, false, false, "", "شج")},
+ {0xfd0a, 0, 0, 0, g(Yes, No, false, false, "", "شح")},
+ {0xfd0b, 0, 0, 0, g(Yes, No, false, false, "", "شخ")},
+ {0xfd0c, 0, 0, 0, g(Yes, No, false, false, "", "شم")},
+ {0xfd0d, 0, 0, 0, g(Yes, No, false, false, "", "شر")},
+ {0xfd0e, 0, 0, 0, g(Yes, No, false, false, "", "سر")},
+ {0xfd0f, 0, 0, 0, g(Yes, No, false, false, "", "صر")},
+ {0xfd10, 0, 0, 0, g(Yes, No, false, false, "", "ضر")},
+ {0xfd11, 0, 0, 0, g(Yes, No, false, false, "", "طى")},
+ {0xfd12, 0, 0, 0, g(Yes, No, false, false, "", "طي")},
+ {0xfd13, 0, 0, 0, g(Yes, No, false, false, "", "عى")},
+ {0xfd14, 0, 0, 0, g(Yes, No, false, false, "", "عي")},
+ {0xfd15, 0, 0, 0, g(Yes, No, false, false, "", "غى")},
+ {0xfd16, 0, 0, 0, g(Yes, No, false, false, "", "غي")},
+ {0xfd17, 0, 0, 0, g(Yes, No, false, false, "", "سى")},
+ {0xfd18, 0, 0, 0, g(Yes, No, false, false, "", "سي")},
+ {0xfd19, 0, 0, 0, g(Yes, No, false, false, "", "شى")},
+ {0xfd1a, 0, 0, 0, g(Yes, No, false, false, "", "شي")},
+ {0xfd1b, 0, 0, 0, g(Yes, No, false, false, "", "حى")},
+ {0xfd1c, 0, 0, 0, g(Yes, No, false, false, "", "حي")},
+ {0xfd1d, 0, 0, 0, g(Yes, No, false, false, "", "جى")},
+ {0xfd1e, 0, 0, 0, g(Yes, No, false, false, "", "جي")},
+ {0xfd1f, 0, 0, 0, g(Yes, No, false, false, "", "خى")},
+ {0xfd20, 0, 0, 0, g(Yes, No, false, false, "", "خي")},
+ {0xfd21, 0, 0, 0, g(Yes, No, false, false, "", "صى")},
+ {0xfd22, 0, 0, 0, g(Yes, No, false, false, "", "صي")},
+ {0xfd23, 0, 0, 0, g(Yes, No, false, false, "", "ضى")},
+ {0xfd24, 0, 0, 0, g(Yes, No, false, false, "", "ضي")},
+ {0xfd25, 0, 0, 0, g(Yes, No, false, false, "", "شج")},
+ {0xfd26, 0, 0, 0, g(Yes, No, false, false, "", "شح")},
+ {0xfd27, 0, 0, 0, g(Yes, No, false, false, "", "شخ")},
+ {0xfd28, 0, 0, 0, g(Yes, No, false, false, "", "شم")},
+ {0xfd29, 0, 0, 0, g(Yes, No, false, false, "", "شر")},
+ {0xfd2a, 0, 0, 0, g(Yes, No, false, false, "", "سر")},
+ {0xfd2b, 0, 0, 0, g(Yes, No, false, false, "", "صر")},
+ {0xfd2c, 0, 0, 0, g(Yes, No, false, false, "", "ضر")},
+ {0xfd2d, 0, 0, 0, g(Yes, No, false, false, "", "شج")},
+ {0xfd2e, 0, 0, 0, g(Yes, No, false, false, "", "شح")},
+ {0xfd2f, 0, 0, 0, g(Yes, No, false, false, "", "شخ")},
+ {0xfd30, 0, 0, 0, g(Yes, No, false, false, "", "شم")},
+ {0xfd31, 0, 0, 0, g(Yes, No, false, false, "", "سه")},
+ {0xfd32, 0, 0, 0, g(Yes, No, false, false, "", "شه")},
+ {0xfd33, 0, 0, 0, g(Yes, No, false, false, "", "طم")},
+ {0xfd34, 0, 0, 0, g(Yes, No, false, false, "", "سج")},
+ {0xfd35, 0, 0, 0, g(Yes, No, false, false, "", "سح")},
+ {0xfd36, 0, 0, 0, g(Yes, No, false, false, "", "سخ")},
+ {0xfd37, 0, 0, 0, g(Yes, No, false, false, "", "شج")},
+ {0xfd38, 0, 0, 0, g(Yes, No, false, false, "", "شح")},
+ {0xfd39, 0, 0, 0, g(Yes, No, false, false, "", "شخ")},
+ {0xfd3a, 0, 0, 0, g(Yes, No, false, false, "", "طم")},
+ {0xfd3b, 0, 0, 0, g(Yes, No, false, false, "", "ظم")},
+ {0xfd3c, 0, 0, 1, g(Yes, No, false, false, "", "اً")},
+ {0xfd3e, 0, 0, 0, f(Yes, false, "")},
+ {0xfd50, 0, 0, 0, g(Yes, No, false, false, "", "تجم")},
+ {0xfd51, 0, 0, 0, g(Yes, No, false, false, "", "تحج")},
+ {0xfd53, 0, 0, 0, g(Yes, No, false, false, "", "تحم")},
+ {0xfd54, 0, 0, 0, g(Yes, No, false, false, "", "تخم")},
+ {0xfd55, 0, 0, 0, g(Yes, No, false, false, "", "تمج")},
+ {0xfd56, 0, 0, 0, g(Yes, No, false, false, "", "تمح")},
+ {0xfd57, 0, 0, 0, g(Yes, No, false, false, "", "تمخ")},
+ {0xfd58, 0, 0, 0, g(Yes, No, false, false, "", "جمح")},
+ {0xfd5a, 0, 0, 0, g(Yes, No, false, false, "", "حمي")},
+ {0xfd5b, 0, 0, 0, g(Yes, No, false, false, "", "حمى")},
+ {0xfd5c, 0, 0, 0, g(Yes, No, false, false, "", "سحج")},
+ {0xfd5d, 0, 0, 0, g(Yes, No, false, false, "", "سجح")},
+ {0xfd5e, 0, 0, 0, g(Yes, No, false, false, "", "سجى")},
+ {0xfd5f, 0, 0, 0, g(Yes, No, false, false, "", "سمح")},
+ {0xfd61, 0, 0, 0, g(Yes, No, false, false, "", "سمج")},
+ {0xfd62, 0, 0, 0, g(Yes, No, false, false, "", "سمم")},
+ {0xfd64, 0, 0, 0, g(Yes, No, false, false, "", "صحح")},
+ {0xfd66, 0, 0, 0, g(Yes, No, false, false, "", "صمم")},
+ {0xfd67, 0, 0, 0, g(Yes, No, false, false, "", "شحم")},
+ {0xfd69, 0, 0, 0, g(Yes, No, false, false, "", "شجي")},
+ {0xfd6a, 0, 0, 0, g(Yes, No, false, false, "", "شمخ")},
+ {0xfd6c, 0, 0, 0, g(Yes, No, false, false, "", "شمم")},
+ {0xfd6e, 0, 0, 0, g(Yes, No, false, false, "", "ضحى")},
+ {0xfd6f, 0, 0, 0, g(Yes, No, false, false, "", "ضخم")},
+ {0xfd71, 0, 0, 0, g(Yes, No, false, false, "", "طمح")},
+ {0xfd73, 0, 0, 0, g(Yes, No, false, false, "", "طمم")},
+ {0xfd74, 0, 0, 0, g(Yes, No, false, false, "", "طمي")},
+ {0xfd75, 0, 0, 0, g(Yes, No, false, false, "", "عجم")},
+ {0xfd76, 0, 0, 0, g(Yes, No, false, false, "", "عمم")},
+ {0xfd78, 0, 0, 0, g(Yes, No, false, false, "", "عمى")},
+ {0xfd79, 0, 0, 0, g(Yes, No, false, false, "", "غمم")},
+ {0xfd7a, 0, 0, 0, g(Yes, No, false, false, "", "غمي")},
+ {0xfd7b, 0, 0, 0, g(Yes, No, false, false, "", "غمى")},
+ {0xfd7c, 0, 0, 0, g(Yes, No, false, false, "", "فخم")},
+ {0xfd7e, 0, 0, 0, g(Yes, No, false, false, "", "قمح")},
+ {0xfd7f, 0, 0, 0, g(Yes, No, false, false, "", "قمم")},
+ {0xfd80, 0, 0, 0, g(Yes, No, false, false, "", "لحم")},
+ {0xfd81, 0, 0, 0, g(Yes, No, false, false, "", "لحي")},
+ {0xfd82, 0, 0, 0, g(Yes, No, false, false, "", "لحى")},
+ {0xfd83, 0, 0, 0, g(Yes, No, false, false, "", "لجج")},
+ {0xfd85, 0, 0, 0, g(Yes, No, false, false, "", "لخم")},
+ {0xfd87, 0, 0, 0, g(Yes, No, false, false, "", "لمح")},
+ {0xfd89, 0, 0, 0, g(Yes, No, false, false, "", "محج")},
+ {0xfd8a, 0, 0, 0, g(Yes, No, false, false, "", "محم")},
+ {0xfd8b, 0, 0, 0, g(Yes, No, false, false, "", "محي")},
+ {0xfd8c, 0, 0, 0, g(Yes, No, false, false, "", "مجح")},
+ {0xfd8d, 0, 0, 0, g(Yes, No, false, false, "", "مجم")},
+ {0xfd8e, 0, 0, 0, g(Yes, No, false, false, "", "مخج")},
+ {0xfd8f, 0, 0, 0, g(Yes, No, false, false, "", "مخم")},
+ {0xfd90, 0, 0, 0, f(Yes, false, "")},
+ {0xfd92, 0, 0, 0, g(Yes, No, false, false, "", "مجخ")},
+ {0xfd93, 0, 0, 0, g(Yes, No, false, false, "", "همج")},
+ {0xfd94, 0, 0, 0, g(Yes, No, false, false, "", "همم")},
+ {0xfd95, 0, 0, 0, g(Yes, No, false, false, "", "نحم")},
+ {0xfd96, 0, 0, 0, g(Yes, No, false, false, "", "نحى")},
+ {0xfd97, 0, 0, 0, g(Yes, No, false, false, "", "نجم")},
+ {0xfd99, 0, 0, 0, g(Yes, No, false, false, "", "نجى")},
+ {0xfd9a, 0, 0, 0, g(Yes, No, false, false, "", "نمي")},
+ {0xfd9b, 0, 0, 0, g(Yes, No, false, false, "", "نمى")},
+ {0xfd9c, 0, 0, 0, g(Yes, No, false, false, "", "يمم")},
+ {0xfd9e, 0, 0, 0, g(Yes, No, false, false, "", "بخي")},
+ {0xfd9f, 0, 0, 0, g(Yes, No, false, false, "", "تجي")},
+ {0xfda0, 0, 0, 0, g(Yes, No, false, false, "", "تجى")},
+ {0xfda1, 0, 0, 0, g(Yes, No, false, false, "", "تخي")},
+ {0xfda2, 0, 0, 0, g(Yes, No, false, false, "", "تخى")},
+ {0xfda3, 0, 0, 0, g(Yes, No, false, false, "", "تمي")},
+ {0xfda4, 0, 0, 0, g(Yes, No, false, false, "", "تمى")},
+ {0xfda5, 0, 0, 0, g(Yes, No, false, false, "", "جمي")},
+ {0xfda6, 0, 0, 0, g(Yes, No, false, false, "", "جحى")},
+ {0xfda7, 0, 0, 0, g(Yes, No, false, false, "", "جمى")},
+ {0xfda8, 0, 0, 0, g(Yes, No, false, false, "", "سخى")},
+ {0xfda9, 0, 0, 0, g(Yes, No, false, false, "", "صحي")},
+ {0xfdaa, 0, 0, 0, g(Yes, No, false, false, "", "شحي")},
+ {0xfdab, 0, 0, 0, g(Yes, No, false, false, "", "ضحي")},
+ {0xfdac, 0, 0, 0, g(Yes, No, false, false, "", "لجي")},
+ {0xfdad, 0, 0, 0, g(Yes, No, false, false, "", "لمي")},
+ {0xfdae, 0, 0, 0, g(Yes, No, false, false, "", "يحي")},
+ {0xfdaf, 0, 0, 0, g(Yes, No, false, false, "", "يجي")},
+ {0xfdb0, 0, 0, 0, g(Yes, No, false, false, "", "يمي")},
+ {0xfdb1, 0, 0, 0, g(Yes, No, false, false, "", "ممي")},
+ {0xfdb2, 0, 0, 0, g(Yes, No, false, false, "", "قمي")},
+ {0xfdb3, 0, 0, 0, g(Yes, No, false, false, "", "نحي")},
+ {0xfdb4, 0, 0, 0, g(Yes, No, false, false, "", "قمح")},
+ {0xfdb5, 0, 0, 0, g(Yes, No, false, false, "", "لحم")},
+ {0xfdb6, 0, 0, 0, g(Yes, No, false, false, "", "عمي")},
+ {0xfdb7, 0, 0, 0, g(Yes, No, false, false, "", "كمي")},
+ {0xfdb8, 0, 0, 0, g(Yes, No, false, false, "", "نجح")},
+ {0xfdb9, 0, 0, 0, g(Yes, No, false, false, "", "مخي")},
+ {0xfdba, 0, 0, 0, g(Yes, No, false, false, "", "لجم")},
+ {0xfdbb, 0, 0, 0, g(Yes, No, false, false, "", "كمم")},
+ {0xfdbc, 0, 0, 0, g(Yes, No, false, false, "", "لجم")},
+ {0xfdbd, 0, 0, 0, g(Yes, No, false, false, "", "نجح")},
+ {0xfdbe, 0, 0, 0, g(Yes, No, false, false, "", "جحي")},
+ {0xfdbf, 0, 0, 0, g(Yes, No, false, false, "", "حجي")},
+ {0xfdc0, 0, 0, 0, g(Yes, No, false, false, "", "مجي")},
+ {0xfdc1, 0, 0, 0, g(Yes, No, false, false, "", "فمي")},
+ {0xfdc2, 0, 0, 0, g(Yes, No, false, false, "", "بحي")},
+ {0xfdc3, 0, 0, 0, g(Yes, No, false, false, "", "كمم")},
+ {0xfdc4, 0, 0, 0, g(Yes, No, false, false, "", "عجم")},
+ {0xfdc5, 0, 0, 0, g(Yes, No, false, false, "", "صمم")},
+ {0xfdc6, 0, 0, 0, g(Yes, No, false, false, "", "سخي")},
+ {0xfdc7, 0, 0, 0, g(Yes, No, false, false, "", "نجي")},
+ {0xfdc8, 0, 0, 0, f(Yes, false, "")},
+ {0xfdf0, 0, 0, 0, g(Yes, No, false, false, "", "صلے")},
+ {0xfdf1, 0, 0, 0, g(Yes, No, false, false, "", "قلے")},
+ {0xfdf2, 0, 0, 0, g(Yes, No, false, false, "", "الله")},
+ {0xfdf3, 0, 0, 0, g(Yes, No, false, false, "", "اكبر")},
+ {0xfdf4, 0, 0, 0, g(Yes, No, false, false, "", "محمد")},
+ {0xfdf5, 0, 0, 0, g(Yes, No, false, false, "", "صلعم")},
+ {0xfdf6, 0, 0, 0, g(Yes, No, false, false, "", "رسول")},
+ {0xfdf7, 0, 0, 0, g(Yes, No, false, false, "", "عليه")},
+ {0xfdf8, 0, 0, 0, g(Yes, No, false, false, "", "وسلم")},
+ {0xfdf9, 0, 0, 0, g(Yes, No, false, false, "", "صلى")},
+ {0xfdfa, 0, 0, 0, g(Yes, No, false, false, "", "صلى الله عليه وسلم")},
+ {0xfdfb, 0, 0, 0, g(Yes, No, false, false, "", "جل جلاله")},
+ {0xfdfc, 0, 0, 0, g(Yes, No, false, false, "", "ریال")},
+ {0xfdfd, 0, 0, 0, f(Yes, false, "")},
+ {0xfe10, 0, 0, 0, g(Yes, No, false, false, "", ",")},
+ {0xfe11, 0, 0, 0, g(Yes, No, false, false, "", "、")},
+ {0xfe12, 0, 0, 0, g(Yes, No, false, false, "", "。")},
+ {0xfe13, 0, 0, 0, g(Yes, No, false, false, "", ":")},
+ {0xfe14, 0, 0, 0, g(Yes, No, false, false, "", ";")},
+ {0xfe15, 0, 0, 0, g(Yes, No, false, false, "", "!")},
+ {0xfe16, 0, 0, 0, g(Yes, No, false, false, "", "?")},
+ {0xfe17, 0, 0, 0, g(Yes, No, false, false, "", "〖")},
+ {0xfe18, 0, 0, 0, g(Yes, No, false, false, "", "〗")},
+ {0xfe19, 0, 0, 0, g(Yes, No, false, false, "", "...")},
+ {0xfe1a, 0, 0, 0, f(Yes, false, "")},
+ {0xfe20, 230, 1, 1, f(Yes, false, "")},
+ {0xfe27, 220, 1, 1, f(Yes, false, "")},
+ {0xfe2e, 230, 1, 1, f(Yes, false, "")},
+ {0xfe30, 0, 0, 0, g(Yes, No, false, false, "", "..")},
+ {0xfe31, 0, 0, 0, g(Yes, No, false, false, "", "—")},
+ {0xfe32, 0, 0, 0, g(Yes, No, false, false, "", "–")},
+ {0xfe33, 0, 0, 0, g(Yes, No, false, false, "", "_")},
+ {0xfe35, 0, 0, 0, g(Yes, No, false, false, "", "(")},
+ {0xfe36, 0, 0, 0, g(Yes, No, false, false, "", ")")},
+ {0xfe37, 0, 0, 0, g(Yes, No, false, false, "", "{")},
+ {0xfe38, 0, 0, 0, g(Yes, No, false, false, "", "}")},
+ {0xfe39, 0, 0, 0, g(Yes, No, false, false, "", "〔")},
+ {0xfe3a, 0, 0, 0, g(Yes, No, false, false, "", "〕")},
+ {0xfe3b, 0, 0, 0, g(Yes, No, false, false, "", "【")},
+ {0xfe3c, 0, 0, 0, g(Yes, No, false, false, "", "】")},
+ {0xfe3d, 0, 0, 0, g(Yes, No, false, false, "", "《")},
+ {0xfe3e, 0, 0, 0, g(Yes, No, false, false, "", "》")},
+ {0xfe3f, 0, 0, 0, g(Yes, No, false, false, "", "〈")},
+ {0xfe40, 0, 0, 0, g(Yes, No, false, false, "", "〉")},
+ {0xfe41, 0, 0, 0, g(Yes, No, false, false, "", "「")},
+ {0xfe42, 0, 0, 0, g(Yes, No, false, false, "", "」")},
+ {0xfe43, 0, 0, 0, g(Yes, No, false, false, "", "『")},
+ {0xfe44, 0, 0, 0, g(Yes, No, false, false, "", "』")},
+ {0xfe45, 0, 0, 0, f(Yes, false, "")},
+ {0xfe47, 0, 0, 0, g(Yes, No, false, false, "", "[")},
+ {0xfe48, 0, 0, 0, g(Yes, No, false, false, "", "]")},
+ {0xfe49, 0, 0, 1, g(Yes, No, false, false, "", " ̅")},
+ {0xfe4d, 0, 0, 0, g(Yes, No, false, false, "", "_")},
+ {0xfe50, 0, 0, 0, g(Yes, No, false, false, "", ",")},
+ {0xfe51, 0, 0, 0, g(Yes, No, false, false, "", "、")},
+ {0xfe52, 0, 0, 0, g(Yes, No, false, false, "", ".")},
+ {0xfe53, 0, 0, 0, f(Yes, false, "")},
+ {0xfe54, 0, 0, 0, g(Yes, No, false, false, "", ";")},
+ {0xfe55, 0, 0, 0, g(Yes, No, false, false, "", ":")},
+ {0xfe56, 0, 0, 0, g(Yes, No, false, false, "", "?")},
+ {0xfe57, 0, 0, 0, g(Yes, No, false, false, "", "!")},
+ {0xfe58, 0, 0, 0, g(Yes, No, false, false, "", "—")},
+ {0xfe59, 0, 0, 0, g(Yes, No, false, false, "", "(")},
+ {0xfe5a, 0, 0, 0, g(Yes, No, false, false, "", ")")},
+ {0xfe5b, 0, 0, 0, g(Yes, No, false, false, "", "{")},
+ {0xfe5c, 0, 0, 0, g(Yes, No, false, false, "", "}")},
+ {0xfe5d, 0, 0, 0, g(Yes, No, false, false, "", "〔")},
+ {0xfe5e, 0, 0, 0, g(Yes, No, false, false, "", "〕")},
+ {0xfe5f, 0, 0, 0, g(Yes, No, false, false, "", "#")},
+ {0xfe60, 0, 0, 0, g(Yes, No, false, false, "", "&")},
+ {0xfe61, 0, 0, 0, g(Yes, No, false, false, "", "*")},
+ {0xfe62, 0, 0, 0, g(Yes, No, false, false, "", "+")},
+ {0xfe63, 0, 0, 0, g(Yes, No, false, false, "", "-")},
+ {0xfe64, 0, 0, 0, g(Yes, No, false, false, "", "<")},
+ {0xfe65, 0, 0, 0, g(Yes, No, false, false, "", ">")},
+ {0xfe66, 0, 0, 0, g(Yes, No, false, false, "", "=")},
+ {0xfe67, 0, 0, 0, f(Yes, false, "")},
+ {0xfe68, 0, 0, 0, g(Yes, No, false, false, "", "\\")},
+ {0xfe69, 0, 0, 0, g(Yes, No, false, false, "", "$")},
+ {0xfe6a, 0, 0, 0, g(Yes, No, false, false, "", "%")},
+ {0xfe6b, 0, 0, 0, g(Yes, No, false, false, "", "@")},
+ {0xfe6c, 0, 0, 0, f(Yes, false, "")},
+ {0xfe70, 0, 0, 1, g(Yes, No, false, false, "", " ً")},
+ {0xfe71, 0, 0, 1, g(Yes, No, false, false, "", "ـً")},
+ {0xfe72, 0, 0, 1, g(Yes, No, false, false, "", " ٌ")},
+ {0xfe73, 0, 0, 0, f(Yes, false, "")},
+ {0xfe74, 0, 0, 1, g(Yes, No, false, false, "", " ٍ")},
+ {0xfe75, 0, 0, 0, f(Yes, false, "")},
+ {0xfe76, 0, 0, 1, g(Yes, No, false, false, "", " َ")},
+ {0xfe77, 0, 0, 1, g(Yes, No, false, false, "", "ـَ")},
+ {0xfe78, 0, 0, 1, g(Yes, No, false, false, "", " ُ")},
+ {0xfe79, 0, 0, 1, g(Yes, No, false, false, "", "ـُ")},
+ {0xfe7a, 0, 0, 1, g(Yes, No, false, false, "", " ِ")},
+ {0xfe7b, 0, 0, 1, g(Yes, No, false, false, "", "ـِ")},
+ {0xfe7c, 0, 0, 1, g(Yes, No, false, false, "", " ّ")},
+ {0xfe7d, 0, 0, 1, g(Yes, No, false, false, "", "ـّ")},
+ {0xfe7e, 0, 0, 1, g(Yes, No, false, false, "", " ْ")},
+ {0xfe7f, 0, 0, 1, g(Yes, No, false, false, "", "ـْ")},
+ {0xfe80, 0, 0, 0, g(Yes, No, false, false, "", "ء")},
+ {0xfe81, 0, 0, 1, g(Yes, No, false, false, "", "آ")},
+ {0xfe83, 0, 0, 1, g(Yes, No, false, false, "", "أ")},
+ {0xfe85, 0, 0, 1, g(Yes, No, false, false, "", "ؤ")},
+ {0xfe87, 0, 0, 1, g(Yes, No, false, false, "", "إ")},
+ {0xfe89, 0, 0, 1, g(Yes, No, false, false, "", "ئ")},
+ {0xfe8d, 0, 0, 0, g(Yes, No, false, false, "", "ا")},
+ {0xfe8f, 0, 0, 0, g(Yes, No, false, false, "", "ب")},
+ {0xfe93, 0, 0, 0, g(Yes, No, false, false, "", "ة")},
+ {0xfe95, 0, 0, 0, g(Yes, No, false, false, "", "ت")},
+ {0xfe99, 0, 0, 0, g(Yes, No, false, false, "", "ث")},
+ {0xfe9d, 0, 0, 0, g(Yes, No, false, false, "", "ج")},
+ {0xfea1, 0, 0, 0, g(Yes, No, false, false, "", "ح")},
+ {0xfea5, 0, 0, 0, g(Yes, No, false, false, "", "خ")},
+ {0xfea9, 0, 0, 0, g(Yes, No, false, false, "", "د")},
+ {0xfeab, 0, 0, 0, g(Yes, No, false, false, "", "ذ")},
+ {0xfead, 0, 0, 0, g(Yes, No, false, false, "", "ر")},
+ {0xfeaf, 0, 0, 0, g(Yes, No, false, false, "", "ز")},
+ {0xfeb1, 0, 0, 0, g(Yes, No, false, false, "", "س")},
+ {0xfeb5, 0, 0, 0, g(Yes, No, false, false, "", "ش")},
+ {0xfeb9, 0, 0, 0, g(Yes, No, false, false, "", "ص")},
+ {0xfebd, 0, 0, 0, g(Yes, No, false, false, "", "ض")},
+ {0xfec1, 0, 0, 0, g(Yes, No, false, false, "", "ط")},
+ {0xfec5, 0, 0, 0, g(Yes, No, false, false, "", "ظ")},
+ {0xfec9, 0, 0, 0, g(Yes, No, false, false, "", "ع")},
+ {0xfecd, 0, 0, 0, g(Yes, No, false, false, "", "غ")},
+ {0xfed1, 0, 0, 0, g(Yes, No, false, false, "", "ف")},
+ {0xfed5, 0, 0, 0, g(Yes, No, false, false, "", "ق")},
+ {0xfed9, 0, 0, 0, g(Yes, No, false, false, "", "ك")},
+ {0xfedd, 0, 0, 0, g(Yes, No, false, false, "", "ل")},
+ {0xfee1, 0, 0, 0, g(Yes, No, false, false, "", "م")},
+ {0xfee5, 0, 0, 0, g(Yes, No, false, false, "", "ن")},
+ {0xfee9, 0, 0, 0, g(Yes, No, false, false, "", "ه")},
+ {0xfeed, 0, 0, 0, g(Yes, No, false, false, "", "و")},
+ {0xfeef, 0, 0, 0, g(Yes, No, false, false, "", "ى")},
+ {0xfef1, 0, 0, 0, g(Yes, No, false, false, "", "ي")},
+ {0xfef5, 0, 0, 1, g(Yes, No, false, false, "", "لآ")},
+ {0xfef7, 0, 0, 1, g(Yes, No, false, false, "", "لأ")},
+ {0xfef9, 0, 0, 1, g(Yes, No, false, false, "", "لإ")},
+ {0xfefb, 0, 0, 0, g(Yes, No, false, false, "", "لا")},
+ {0xfefd, 0, 0, 0, f(Yes, false, "")},
+ {0xff01, 0, 0, 0, g(Yes, No, false, false, "", "!")},
+ {0xff02, 0, 0, 0, g(Yes, No, false, false, "", "\"")},
+ {0xff03, 0, 0, 0, g(Yes, No, false, false, "", "#")},
+ {0xff04, 0, 0, 0, g(Yes, No, false, false, "", "$")},
+ {0xff05, 0, 0, 0, g(Yes, No, false, false, "", "%")},
+ {0xff06, 0, 0, 0, g(Yes, No, false, false, "", "&")},
+ {0xff07, 0, 0, 0, g(Yes, No, false, false, "", "'")},
+ {0xff08, 0, 0, 0, g(Yes, No, false, false, "", "(")},
+ {0xff09, 0, 0, 0, g(Yes, No, false, false, "", ")")},
+ {0xff0a, 0, 0, 0, g(Yes, No, false, false, "", "*")},
+ {0xff0b, 0, 0, 0, g(Yes, No, false, false, "", "+")},
+ {0xff0c, 0, 0, 0, g(Yes, No, false, false, "", ",")},
+ {0xff0d, 0, 0, 0, g(Yes, No, false, false, "", "-")},
+ {0xff0e, 0, 0, 0, g(Yes, No, false, false, "", ".")},
+ {0xff0f, 0, 0, 0, g(Yes, No, false, false, "", "/")},
+ {0xff10, 0, 0, 0, g(Yes, No, false, false, "", "0")},
+ {0xff11, 0, 0, 0, g(Yes, No, false, false, "", "1")},
+ {0xff12, 0, 0, 0, g(Yes, No, false, false, "", "2")},
+ {0xff13, 0, 0, 0, g(Yes, No, false, false, "", "3")},
+ {0xff14, 0, 0, 0, g(Yes, No, false, false, "", "4")},
+ {0xff15, 0, 0, 0, g(Yes, No, false, false, "", "5")},
+ {0xff16, 0, 0, 0, g(Yes, No, false, false, "", "6")},
+ {0xff17, 0, 0, 0, g(Yes, No, false, false, "", "7")},
+ {0xff18, 0, 0, 0, g(Yes, No, false, false, "", "8")},
+ {0xff19, 0, 0, 0, g(Yes, No, false, false, "", "9")},
+ {0xff1a, 0, 0, 0, g(Yes, No, false, false, "", ":")},
+ {0xff1b, 0, 0, 0, g(Yes, No, false, false, "", ";")},
+ {0xff1c, 0, 0, 0, g(Yes, No, false, false, "", "<")},
+ {0xff1d, 0, 0, 0, g(Yes, No, false, false, "", "=")},
+ {0xff1e, 0, 0, 0, g(Yes, No, false, false, "", ">")},
+ {0xff1f, 0, 0, 0, g(Yes, No, false, false, "", "?")},
+ {0xff20, 0, 0, 0, g(Yes, No, false, false, "", "@")},
+ {0xff21, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0xff22, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0xff23, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0xff24, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0xff25, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0xff26, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0xff27, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0xff28, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0xff29, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0xff2a, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0xff2b, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0xff2c, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0xff2d, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0xff2e, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0xff2f, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0xff30, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0xff31, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0xff32, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0xff33, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0xff34, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0xff35, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0xff36, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0xff37, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0xff38, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0xff39, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0xff3a, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0xff3b, 0, 0, 0, g(Yes, No, false, false, "", "[")},
+ {0xff3c, 0, 0, 0, g(Yes, No, false, false, "", "\\")},
+ {0xff3d, 0, 0, 0, g(Yes, No, false, false, "", "]")},
+ {0xff3e, 0, 0, 0, g(Yes, No, false, false, "", "^")},
+ {0xff3f, 0, 0, 0, g(Yes, No, false, false, "", "_")},
+ {0xff40, 0, 0, 0, g(Yes, No, false, false, "", "`")},
+ {0xff41, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0xff42, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0xff43, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0xff44, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0xff45, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0xff46, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0xff47, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0xff48, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0xff49, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0xff4a, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0xff4b, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0xff4c, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0xff4d, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0xff4e, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0xff4f, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0xff50, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0xff51, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0xff52, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0xff53, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0xff54, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0xff55, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0xff56, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0xff57, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0xff58, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0xff59, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0xff5a, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0xff5b, 0, 0, 0, g(Yes, No, false, false, "", "{")},
+ {0xff5c, 0, 0, 0, g(Yes, No, false, false, "", "|")},
+ {0xff5d, 0, 0, 0, g(Yes, No, false, false, "", "}")},
+ {0xff5e, 0, 0, 0, g(Yes, No, false, false, "", "~")},
+ {0xff5f, 0, 0, 0, g(Yes, No, false, false, "", "⦅")},
+ {0xff60, 0, 0, 0, g(Yes, No, false, false, "", "⦆")},
+ {0xff61, 0, 0, 0, g(Yes, No, false, false, "", "。")},
+ {0xff62, 0, 0, 0, g(Yes, No, false, false, "", "「")},
+ {0xff63, 0, 0, 0, g(Yes, No, false, false, "", "」")},
+ {0xff64, 0, 0, 0, g(Yes, No, false, false, "", "、")},
+ {0xff65, 0, 0, 0, g(Yes, No, false, false, "", "・")},
+ {0xff66, 0, 0, 0, g(Yes, No, false, false, "", "ヲ")},
+ {0xff67, 0, 0, 0, g(Yes, No, false, false, "", "ァ")},
+ {0xff68, 0, 0, 0, g(Yes, No, false, false, "", "ィ")},
+ {0xff69, 0, 0, 0, g(Yes, No, false, false, "", "ゥ")},
+ {0xff6a, 0, 0, 0, g(Yes, No, false, false, "", "ェ")},
+ {0xff6b, 0, 0, 0, g(Yes, No, false, false, "", "ォ")},
+ {0xff6c, 0, 0, 0, g(Yes, No, false, false, "", "ャ")},
+ {0xff6d, 0, 0, 0, g(Yes, No, false, false, "", "ュ")},
+ {0xff6e, 0, 0, 0, g(Yes, No, false, false, "", "ョ")},
+ {0xff6f, 0, 0, 0, g(Yes, No, false, false, "", "ッ")},
+ {0xff70, 0, 0, 0, g(Yes, No, false, false, "", "ー")},
+ {0xff71, 0, 0, 0, g(Yes, No, false, false, "", "ア")},
+ {0xff72, 0, 0, 0, g(Yes, No, false, false, "", "イ")},
+ {0xff73, 0, 0, 0, g(Yes, No, false, false, "", "ウ")},
+ {0xff74, 0, 0, 0, g(Yes, No, false, false, "", "エ")},
+ {0xff75, 0, 0, 0, g(Yes, No, false, false, "", "オ")},
+ {0xff76, 0, 0, 0, g(Yes, No, false, false, "", "カ")},
+ {0xff77, 0, 0, 0, g(Yes, No, false, false, "", "キ")},
+ {0xff78, 0, 0, 0, g(Yes, No, false, false, "", "ク")},
+ {0xff79, 0, 0, 0, g(Yes, No, false, false, "", "ケ")},
+ {0xff7a, 0, 0, 0, g(Yes, No, false, false, "", "コ")},
+ {0xff7b, 0, 0, 0, g(Yes, No, false, false, "", "サ")},
+ {0xff7c, 0, 0, 0, g(Yes, No, false, false, "", "シ")},
+ {0xff7d, 0, 0, 0, g(Yes, No, false, false, "", "ス")},
+ {0xff7e, 0, 0, 0, g(Yes, No, false, false, "", "セ")},
+ {0xff7f, 0, 0, 0, g(Yes, No, false, false, "", "ソ")},
+ {0xff80, 0, 0, 0, g(Yes, No, false, false, "", "タ")},
+ {0xff81, 0, 0, 0, g(Yes, No, false, false, "", "チ")},
+ {0xff82, 0, 0, 0, g(Yes, No, false, false, "", "ツ")},
+ {0xff83, 0, 0, 0, g(Yes, No, false, false, "", "テ")},
+ {0xff84, 0, 0, 0, g(Yes, No, false, false, "", "ト")},
+ {0xff85, 0, 0, 0, g(Yes, No, false, false, "", "ナ")},
+ {0xff86, 0, 0, 0, g(Yes, No, false, false, "", "ニ")},
+ {0xff87, 0, 0, 0, g(Yes, No, false, false, "", "ヌ")},
+ {0xff88, 0, 0, 0, g(Yes, No, false, false, "", "ネ")},
+ {0xff89, 0, 0, 0, g(Yes, No, false, false, "", "ノ")},
+ {0xff8a, 0, 0, 0, g(Yes, No, false, false, "", "ハ")},
+ {0xff8b, 0, 0, 0, g(Yes, No, false, false, "", "ヒ")},
+ {0xff8c, 0, 0, 0, g(Yes, No, false, false, "", "フ")},
+ {0xff8d, 0, 0, 0, g(Yes, No, false, false, "", "ヘ")},
+ {0xff8e, 0, 0, 0, g(Yes, No, false, false, "", "ホ")},
+ {0xff8f, 0, 0, 0, g(Yes, No, false, false, "", "マ")},
+ {0xff90, 0, 0, 0, g(Yes, No, false, false, "", "ミ")},
+ {0xff91, 0, 0, 0, g(Yes, No, false, false, "", "ム")},
+ {0xff92, 0, 0, 0, g(Yes, No, false, false, "", "メ")},
+ {0xff93, 0, 0, 0, g(Yes, No, false, false, "", "モ")},
+ {0xff94, 0, 0, 0, g(Yes, No, false, false, "", "ヤ")},
+ {0xff95, 0, 0, 0, g(Yes, No, false, false, "", "ユ")},
+ {0xff96, 0, 0, 0, g(Yes, No, false, false, "", "ヨ")},
+ {0xff97, 0, 0, 0, g(Yes, No, false, false, "", "ラ")},
+ {0xff98, 0, 0, 0, g(Yes, No, false, false, "", "リ")},
+ {0xff99, 0, 0, 0, g(Yes, No, false, false, "", "ル")},
+ {0xff9a, 0, 0, 0, g(Yes, No, false, false, "", "レ")},
+ {0xff9b, 0, 0, 0, g(Yes, No, false, false, "", "ロ")},
+ {0xff9c, 0, 0, 0, g(Yes, No, false, false, "", "ワ")},
+ {0xff9d, 0, 0, 0, g(Yes, No, false, false, "", "ン")},
+ {0xff9e, 0, 1, 1, g(Yes, No, false, false, "", "゙")},
+ {0xff9f, 0, 1, 1, g(Yes, No, false, false, "", "゚")},
+ {0xffa0, 0, 0, 0, g(Yes, No, false, false, "", "ᅠ")},
+ {0xffa1, 0, 0, 0, g(Yes, No, false, false, "", "ᄀ")},
+ {0xffa2, 0, 0, 0, g(Yes, No, false, false, "", "ᄁ")},
+ {0xffa3, 0, 1, 1, g(Yes, No, false, false, "", "ᆪ")},
+ {0xffa4, 0, 0, 0, g(Yes, No, false, false, "", "ᄂ")},
+ {0xffa5, 0, 1, 1, g(Yes, No, false, false, "", "ᆬ")},
+ {0xffa6, 0, 1, 1, g(Yes, No, false, false, "", "ᆭ")},
+ {0xffa7, 0, 0, 0, g(Yes, No, false, false, "", "ᄃ")},
+ {0xffa8, 0, 0, 0, g(Yes, No, false, false, "", "ᄄ")},
+ {0xffa9, 0, 0, 0, g(Yes, No, false, false, "", "ᄅ")},
+ {0xffaa, 0, 1, 1, g(Yes, No, false, false, "", "ᆰ")},
+ {0xffab, 0, 1, 1, g(Yes, No, false, false, "", "ᆱ")},
+ {0xffac, 0, 1, 1, g(Yes, No, false, false, "", "ᆲ")},
+ {0xffad, 0, 1, 1, g(Yes, No, false, false, "", "ᆳ")},
+ {0xffae, 0, 1, 1, g(Yes, No, false, false, "", "ᆴ")},
+ {0xffaf, 0, 1, 1, g(Yes, No, false, false, "", "ᆵ")},
+ {0xffb0, 0, 0, 0, g(Yes, No, false, false, "", "ᄚ")},
+ {0xffb1, 0, 0, 0, g(Yes, No, false, false, "", "ᄆ")},
+ {0xffb2, 0, 0, 0, g(Yes, No, false, false, "", "ᄇ")},
+ {0xffb3, 0, 0, 0, g(Yes, No, false, false, "", "ᄈ")},
+ {0xffb4, 0, 0, 0, g(Yes, No, false, false, "", "ᄡ")},
+ {0xffb5, 0, 0, 0, g(Yes, No, false, false, "", "ᄉ")},
+ {0xffb6, 0, 0, 0, g(Yes, No, false, false, "", "ᄊ")},
+ {0xffb7, 0, 0, 0, g(Yes, No, false, false, "", "ᄋ")},
+ {0xffb8, 0, 0, 0, g(Yes, No, false, false, "", "ᄌ")},
+ {0xffb9, 0, 0, 0, g(Yes, No, false, false, "", "ᄍ")},
+ {0xffba, 0, 0, 0, g(Yes, No, false, false, "", "ᄎ")},
+ {0xffbb, 0, 0, 0, g(Yes, No, false, false, "", "ᄏ")},
+ {0xffbc, 0, 0, 0, g(Yes, No, false, false, "", "ᄐ")},
+ {0xffbd, 0, 0, 0, g(Yes, No, false, false, "", "ᄑ")},
+ {0xffbe, 0, 0, 0, g(Yes, No, false, false, "", "ᄒ")},
+ {0xffbf, 0, 0, 0, f(Yes, false, "")},
+ {0xffc2, 0, 1, 1, g(Yes, No, false, false, "", "ᅡ")},
+ {0xffc3, 0, 1, 1, g(Yes, No, false, false, "", "ᅢ")},
+ {0xffc4, 0, 1, 1, g(Yes, No, false, false, "", "ᅣ")},
+ {0xffc5, 0, 1, 1, g(Yes, No, false, false, "", "ᅤ")},
+ {0xffc6, 0, 1, 1, g(Yes, No, false, false, "", "ᅥ")},
+ {0xffc7, 0, 1, 1, g(Yes, No, false, false, "", "ᅦ")},
+ {0xffc8, 0, 0, 0, f(Yes, false, "")},
+ {0xffca, 0, 1, 1, g(Yes, No, false, false, "", "ᅧ")},
+ {0xffcb, 0, 1, 1, g(Yes, No, false, false, "", "ᅨ")},
+ {0xffcc, 0, 1, 1, g(Yes, No, false, false, "", "ᅩ")},
+ {0xffcd, 0, 1, 1, g(Yes, No, false, false, "", "ᅪ")},
+ {0xffce, 0, 1, 1, g(Yes, No, false, false, "", "ᅫ")},
+ {0xffcf, 0, 1, 1, g(Yes, No, false, false, "", "ᅬ")},
+ {0xffd0, 0, 0, 0, f(Yes, false, "")},
+ {0xffd2, 0, 1, 1, g(Yes, No, false, false, "", "ᅭ")},
+ {0xffd3, 0, 1, 1, g(Yes, No, false, false, "", "ᅮ")},
+ {0xffd4, 0, 1, 1, g(Yes, No, false, false, "", "ᅯ")},
+ {0xffd5, 0, 1, 1, g(Yes, No, false, false, "", "ᅰ")},
+ {0xffd6, 0, 1, 1, g(Yes, No, false, false, "", "ᅱ")},
+ {0xffd7, 0, 1, 1, g(Yes, No, false, false, "", "ᅲ")},
+ {0xffd8, 0, 0, 0, f(Yes, false, "")},
+ {0xffda, 0, 1, 1, g(Yes, No, false, false, "", "ᅳ")},
+ {0xffdb, 0, 1, 1, g(Yes, No, false, false, "", "ᅴ")},
+ {0xffdc, 0, 1, 1, g(Yes, No, false, false, "", "ᅵ")},
+ {0xffdd, 0, 0, 0, f(Yes, false, "")},
+ {0xffe0, 0, 0, 0, g(Yes, No, false, false, "", "¢")},
+ {0xffe1, 0, 0, 0, g(Yes, No, false, false, "", "£")},
+ {0xffe2, 0, 0, 0, g(Yes, No, false, false, "", "¬")},
+ {0xffe3, 0, 0, 1, g(Yes, No, false, false, "", " ̄")},
+ {0xffe4, 0, 0, 0, g(Yes, No, false, false, "", "¦")},
+ {0xffe5, 0, 0, 0, g(Yes, No, false, false, "", "¥")},
+ {0xffe6, 0, 0, 0, g(Yes, No, false, false, "", "₩")},
+ {0xffe7, 0, 0, 0, f(Yes, false, "")},
+ {0xffe8, 0, 0, 0, g(Yes, No, false, false, "", "│")},
+ {0xffe9, 0, 0, 0, g(Yes, No, false, false, "", "←")},
+ {0xffea, 0, 0, 0, g(Yes, No, false, false, "", "↑")},
+ {0xffeb, 0, 0, 0, g(Yes, No, false, false, "", "→")},
+ {0xffec, 0, 0, 0, g(Yes, No, false, false, "", "↓")},
+ {0xffed, 0, 0, 0, g(Yes, No, false, false, "", "■")},
+ {0xffee, 0, 0, 0, g(Yes, No, false, false, "", "○")},
+ {0xffef, 0, 0, 0, f(Yes, false, "")},
+ {0x101fd, 220, 1, 1, f(Yes, false, "")},
+ {0x101fe, 0, 0, 0, f(Yes, false, "")},
+ {0x102e0, 220, 1, 1, f(Yes, false, "")},
+ {0x102e1, 0, 0, 0, f(Yes, false, "")},
+ {0x10376, 230, 1, 1, f(Yes, false, "")},
+ {0x1037b, 0, 0, 0, f(Yes, false, "")},
+ {0x10a0d, 220, 1, 1, f(Yes, false, "")},
+ {0x10a0e, 0, 0, 0, f(Yes, false, "")},
+ {0x10a0f, 230, 1, 1, f(Yes, false, "")},
+ {0x10a10, 0, 0, 0, f(Yes, false, "")},
+ {0x10a38, 230, 1, 1, f(Yes, false, "")},
+ {0x10a39, 1, 1, 1, f(Yes, false, "")},
+ {0x10a3a, 220, 1, 1, f(Yes, false, "")},
+ {0x10a3b, 0, 0, 0, f(Yes, false, "")},
+ {0x10a3f, 9, 1, 1, f(Yes, false, "")},
+ {0x10a40, 0, 0, 0, f(Yes, false, "")},
+ {0x10ae5, 230, 1, 1, f(Yes, false, "")},
+ {0x10ae6, 220, 1, 1, f(Yes, false, "")},
+ {0x10ae7, 0, 0, 0, f(Yes, false, "")},
+ {0x11046, 9, 1, 1, f(Yes, false, "")},
+ {0x11047, 0, 0, 0, f(Yes, false, "")},
+ {0x1107f, 9, 1, 1, f(Yes, false, "")},
+ {0x11080, 0, 0, 0, f(Yes, false, "")},
+ {0x11099, 0, 0, 0, f(Yes, true, "")},
+ {0x1109a, 0, 0, 1, f(Yes, false, "𑂚")},
+ {0x1109b, 0, 0, 0, f(Yes, true, "")},
+ {0x1109c, 0, 0, 1, f(Yes, false, "𑂜")},
+ {0x1109d, 0, 0, 0, f(Yes, false, "")},
+ {0x110a5, 0, 0, 0, f(Yes, true, "")},
+ {0x110a6, 0, 0, 0, f(Yes, false, "")},
+ {0x110ab, 0, 0, 1, f(Yes, false, "𑂫")},
+ {0x110ac, 0, 0, 0, f(Yes, false, "")},
+ {0x110b9, 9, 1, 1, f(Yes, false, "")},
+ {0x110ba, 7, 1, 1, f(Maybe, false, "")},
+ {0x110bb, 0, 0, 0, f(Yes, false, "")},
+ {0x11100, 230, 1, 1, f(Yes, false, "")},
+ {0x11103, 0, 0, 0, f(Yes, false, "")},
+ {0x11127, 0, 1, 1, f(Maybe, false, "")},
+ {0x11128, 0, 0, 0, f(Yes, false, "")},
+ {0x1112e, 0, 0, 1, f(Yes, false, "𑄮")},
+ {0x1112f, 0, 0, 1, f(Yes, false, "𑄯")},
+ {0x11130, 0, 0, 0, f(Yes, false, "")},
+ {0x11131, 0, 0, 0, f(Yes, true, "")},
+ {0x11133, 9, 1, 1, f(Yes, false, "")},
+ {0x11135, 0, 0, 0, f(Yes, false, "")},
+ {0x11173, 7, 1, 1, f(Yes, false, "")},
+ {0x11174, 0, 0, 0, f(Yes, false, "")},
+ {0x111c0, 9, 1, 1, f(Yes, false, "")},
+ {0x111c1, 0, 0, 0, f(Yes, false, "")},
+ {0x111ca, 7, 1, 1, f(Yes, false, "")},
+ {0x111cb, 0, 0, 0, f(Yes, false, "")},
+ {0x11235, 9, 1, 1, f(Yes, false, "")},
+ {0x11236, 7, 1, 1, f(Yes, false, "")},
+ {0x11237, 0, 0, 0, f(Yes, false, "")},
+ {0x112e9, 7, 1, 1, f(Yes, false, "")},
+ {0x112ea, 9, 1, 1, f(Yes, false, "")},
+ {0x112eb, 0, 0, 0, f(Yes, false, "")},
+ {0x1133c, 7, 1, 1, f(Yes, false, "")},
+ {0x1133d, 0, 0, 0, f(Yes, false, "")},
+ {0x1133e, 0, 1, 1, f(Maybe, false, "")},
+ {0x1133f, 0, 0, 0, f(Yes, false, "")},
+ {0x11347, 0, 0, 0, f(Yes, true, "")},
+ {0x11348, 0, 0, 0, f(Yes, false, "")},
+ {0x1134b, 0, 0, 1, f(Yes, false, "𑍋")},
+ {0x1134c, 0, 0, 1, f(Yes, false, "𑍌")},
+ {0x1134d, 9, 1, 1, f(Yes, false, "")},
+ {0x1134e, 0, 0, 0, f(Yes, false, "")},
+ {0x11357, 0, 1, 1, f(Maybe, false, "")},
+ {0x11358, 0, 0, 0, f(Yes, false, "")},
+ {0x11366, 230, 1, 1, f(Yes, false, "")},
+ {0x1136d, 0, 0, 0, f(Yes, false, "")},
+ {0x11370, 230, 1, 1, f(Yes, false, "")},
+ {0x11375, 0, 0, 0, f(Yes, false, "")},
+ {0x11442, 9, 1, 1, f(Yes, false, "")},
+ {0x11443, 0, 0, 0, f(Yes, false, "")},
+ {0x11446, 7, 1, 1, f(Yes, false, "")},
+ {0x11447, 0, 0, 0, f(Yes, false, "")},
+ {0x114b0, 0, 1, 1, f(Maybe, false, "")},
+ {0x114b1, 0, 0, 0, f(Yes, false, "")},
+ {0x114b9, 0, 0, 0, f(Yes, true, "")},
+ {0x114ba, 0, 1, 1, f(Maybe, false, "")},
+ {0x114bb, 0, 0, 1, f(Yes, false, "𑒻")},
+ {0x114bc, 0, 0, 1, f(Yes, false, "𑒼")},
+ {0x114bd, 0, 1, 1, f(Maybe, false, "")},
+ {0x114be, 0, 0, 1, f(Yes, false, "𑒾")},
+ {0x114bf, 0, 0, 0, f(Yes, false, "")},
+ {0x114c2, 9, 1, 1, f(Yes, false, "")},
+ {0x114c3, 7, 1, 1, f(Yes, false, "")},
+ {0x114c4, 0, 0, 0, f(Yes, false, "")},
+ {0x115af, 0, 1, 1, f(Maybe, false, "")},
+ {0x115b0, 0, 0, 0, f(Yes, false, "")},
+ {0x115b8, 0, 0, 0, f(Yes, true, "")},
+ {0x115ba, 0, 0, 1, f(Yes, false, "𑖺")},
+ {0x115bb, 0, 0, 1, f(Yes, false, "𑖻")},
+ {0x115bc, 0, 0, 0, f(Yes, false, "")},
+ {0x115bf, 9, 1, 1, f(Yes, false, "")},
+ {0x115c0, 7, 1, 1, f(Yes, false, "")},
+ {0x115c1, 0, 0, 0, f(Yes, false, "")},
+ {0x1163f, 9, 1, 1, f(Yes, false, "")},
+ {0x11640, 0, 0, 0, f(Yes, false, "")},
+ {0x116b6, 9, 1, 1, f(Yes, false, "")},
+ {0x116b7, 7, 1, 1, f(Yes, false, "")},
+ {0x116b8, 0, 0, 0, f(Yes, false, "")},
+ {0x1172b, 9, 1, 1, f(Yes, false, "")},
+ {0x1172c, 0, 0, 0, f(Yes, false, "")},
+ {0x11c3f, 9, 1, 1, f(Yes, false, "")},
+ {0x11c40, 0, 0, 0, f(Yes, false, "")},
+ {0x16af0, 1, 1, 1, f(Yes, false, "")},
+ {0x16af5, 0, 0, 0, f(Yes, false, "")},
+ {0x16b30, 230, 1, 1, f(Yes, false, "")},
+ {0x16b37, 0, 0, 0, f(Yes, false, "")},
+ {0x1bc9e, 1, 1, 1, f(Yes, false, "")},
+ {0x1bc9f, 0, 0, 0, f(Yes, false, "")},
+ {0x1d15e, 0, 0, 1, f(No, false, "𝅗𝅥")},
+ {0x1d15f, 0, 0, 1, f(No, false, "𝅘𝅥")},
+ {0x1d160, 0, 0, 2, f(No, false, "𝅘𝅥𝅮")},
+ {0x1d161, 0, 0, 2, f(No, false, "𝅘𝅥𝅯")},
+ {0x1d162, 0, 0, 2, f(No, false, "𝅘𝅥𝅰")},
+ {0x1d163, 0, 0, 2, f(No, false, "𝅘𝅥𝅱")},
+ {0x1d164, 0, 0, 2, f(No, false, "𝅘𝅥𝅲")},
+ {0x1d165, 216, 1, 1, f(Yes, false, "")},
+ {0x1d167, 1, 1, 1, f(Yes, false, "")},
+ {0x1d16a, 0, 0, 0, f(Yes, false, "")},
+ {0x1d16d, 226, 1, 1, f(Yes, false, "")},
+ {0x1d16e, 216, 1, 1, f(Yes, false, "")},
+ {0x1d173, 0, 0, 0, f(Yes, false, "")},
+ {0x1d17b, 220, 1, 1, f(Yes, false, "")},
+ {0x1d183, 0, 0, 0, f(Yes, false, "")},
+ {0x1d185, 230, 1, 1, f(Yes, false, "")},
+ {0x1d18a, 220, 1, 1, f(Yes, false, "")},
+ {0x1d18c, 0, 0, 0, f(Yes, false, "")},
+ {0x1d1aa, 230, 1, 1, f(Yes, false, "")},
+ {0x1d1ae, 0, 0, 0, f(Yes, false, "")},
+ {0x1d1bb, 0, 0, 1, f(No, false, "𝆹𝅥")},
+ {0x1d1bc, 0, 0, 1, f(No, false, "𝆺𝅥")},
+ {0x1d1bd, 0, 0, 2, f(No, false, "𝆹𝅥𝅮")},
+ {0x1d1be, 0, 0, 2, f(No, false, "𝆺𝅥𝅮")},
+ {0x1d1bf, 0, 0, 2, f(No, false, "𝆹𝅥𝅯")},
+ {0x1d1c0, 0, 0, 2, f(No, false, "𝆺𝅥𝅯")},
+ {0x1d1c1, 0, 0, 0, f(Yes, false, "")},
+ {0x1d242, 230, 1, 1, f(Yes, false, "")},
+ {0x1d245, 0, 0, 0, f(Yes, false, "")},
+ {0x1d400, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d401, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d402, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1d403, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d404, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d405, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d406, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d407, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1d408, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d409, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d40a, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d40b, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d40c, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d40d, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d40e, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d40f, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d410, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d411, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1d412, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d413, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d414, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d415, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d416, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d417, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d418, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d419, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1d41a, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d41b, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d41c, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d41d, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d41e, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d41f, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d420, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d421, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d422, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d423, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d424, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d425, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d426, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d427, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d428, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d429, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d42a, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d42b, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d42c, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d42d, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d42e, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d42f, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d430, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d431, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d432, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d433, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d434, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d435, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d436, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1d437, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d438, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d439, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d43a, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d43b, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1d43c, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d43d, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d43e, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d43f, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d440, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d441, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d442, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d443, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d444, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d445, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1d446, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d447, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d448, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d449, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d44a, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d44b, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d44c, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d44d, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1d44e, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d44f, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d450, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d451, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d452, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d453, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d454, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d455, 0, 0, 0, f(Yes, false, "")},
+ {0x1d456, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d457, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d458, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d459, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d45a, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d45b, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d45c, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d45d, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d45e, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d45f, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d460, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d461, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d462, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d463, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d464, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d465, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d466, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d467, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d468, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d469, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d46a, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1d46b, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d46c, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d46d, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d46e, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d46f, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1d470, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d471, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d472, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d473, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d474, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d475, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d476, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d477, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d478, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d479, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1d47a, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d47b, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d47c, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d47d, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d47e, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d47f, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d480, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d481, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1d482, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d483, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d484, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d485, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d486, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d487, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d488, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d489, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d48a, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d48b, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d48c, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d48d, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d48e, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d48f, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d490, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d491, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d492, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d493, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d494, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d495, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d496, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d497, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d498, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d499, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d49a, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d49b, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d49c, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d49d, 0, 0, 0, f(Yes, false, "")},
+ {0x1d49e, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1d49f, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d4a0, 0, 0, 0, f(Yes, false, "")},
+ {0x1d4a2, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d4a3, 0, 0, 0, f(Yes, false, "")},
+ {0x1d4a5, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d4a6, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d4a7, 0, 0, 0, f(Yes, false, "")},
+ {0x1d4a9, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d4aa, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d4ab, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d4ac, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d4ad, 0, 0, 0, f(Yes, false, "")},
+ {0x1d4ae, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d4af, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d4b0, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d4b1, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d4b2, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d4b3, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d4b4, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d4b5, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1d4b6, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d4b7, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d4b8, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d4b9, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d4ba, 0, 0, 0, f(Yes, false, "")},
+ {0x1d4bb, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d4bc, 0, 0, 0, f(Yes, false, "")},
+ {0x1d4bd, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d4be, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d4bf, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d4c0, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d4c1, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d4c2, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d4c3, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d4c4, 0, 0, 0, f(Yes, false, "")},
+ {0x1d4c5, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d4c6, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d4c7, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d4c8, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d4c9, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d4ca, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d4cb, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d4cc, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d4cd, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d4ce, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d4cf, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d4d0, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d4d1, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d4d2, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1d4d3, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d4d4, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d4d5, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d4d6, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d4d7, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1d4d8, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d4d9, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d4da, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d4db, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d4dc, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d4dd, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d4de, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d4df, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d4e0, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d4e1, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1d4e2, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d4e3, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d4e4, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d4e5, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d4e6, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d4e7, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d4e8, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d4e9, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1d4ea, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d4eb, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d4ec, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d4ed, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d4ee, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d4ef, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d4f0, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d4f1, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d4f2, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d4f3, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d4f4, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d4f5, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d4f6, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d4f7, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d4f8, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d4f9, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d4fa, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d4fb, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d4fc, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d4fd, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d4fe, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d4ff, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d500, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d501, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d502, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d503, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d504, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d505, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d506, 0, 0, 0, f(Yes, false, "")},
+ {0x1d507, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d508, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d509, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d50a, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d50b, 0, 0, 0, f(Yes, false, "")},
+ {0x1d50d, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d50e, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d50f, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d510, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d511, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d512, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d513, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d514, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d515, 0, 0, 0, f(Yes, false, "")},
+ {0x1d516, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d517, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d518, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d519, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d51a, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d51b, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d51c, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d51d, 0, 0, 0, f(Yes, false, "")},
+ {0x1d51e, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d51f, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d520, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d521, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d522, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d523, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d524, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d525, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d526, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d527, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d528, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d529, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d52a, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d52b, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d52c, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d52d, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d52e, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d52f, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d530, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d531, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d532, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d533, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d534, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d535, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d536, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d537, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d538, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d539, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d53a, 0, 0, 0, f(Yes, false, "")},
+ {0x1d53b, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d53c, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d53d, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d53e, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d53f, 0, 0, 0, f(Yes, false, "")},
+ {0x1d540, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d541, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d542, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d543, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d544, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d545, 0, 0, 0, f(Yes, false, "")},
+ {0x1d546, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d547, 0, 0, 0, f(Yes, false, "")},
+ {0x1d54a, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d54b, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d54c, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d54d, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d54e, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d54f, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d550, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d551, 0, 0, 0, f(Yes, false, "")},
+ {0x1d552, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d553, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d554, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d555, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d556, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d557, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d558, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d559, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d55a, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d55b, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d55c, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d55d, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d55e, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d55f, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d560, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d561, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d562, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d563, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d564, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d565, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d566, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d567, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d568, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d569, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d56a, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d56b, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d56c, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d56d, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d56e, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1d56f, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d570, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d571, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d572, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d573, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1d574, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d575, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d576, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d577, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d578, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d579, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d57a, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d57b, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d57c, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d57d, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1d57e, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d57f, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d580, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d581, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d582, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d583, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d584, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d585, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1d586, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d587, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d588, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d589, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d58a, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d58b, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d58c, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d58d, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d58e, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d58f, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d590, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d591, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d592, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d593, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d594, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d595, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d596, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d597, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d598, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d599, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d59a, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d59b, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d59c, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d59d, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d59e, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d59f, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d5a0, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d5a1, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d5a2, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1d5a3, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d5a4, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d5a5, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d5a6, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d5a7, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1d5a8, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d5a9, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d5aa, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d5ab, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d5ac, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d5ad, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d5ae, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d5af, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d5b0, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d5b1, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1d5b2, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d5b3, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d5b4, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d5b5, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d5b6, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d5b7, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d5b8, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d5b9, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1d5ba, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d5bb, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d5bc, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d5bd, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d5be, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d5bf, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d5c0, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d5c1, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d5c2, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d5c3, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d5c4, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d5c5, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d5c6, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d5c7, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d5c8, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d5c9, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d5ca, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d5cb, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d5cc, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d5cd, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d5ce, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d5cf, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d5d0, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d5d1, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d5d2, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d5d3, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d5d4, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d5d5, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d5d6, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1d5d7, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d5d8, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d5d9, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d5da, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d5db, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1d5dc, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d5dd, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d5de, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d5df, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d5e0, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d5e1, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d5e2, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d5e3, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d5e4, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d5e5, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1d5e6, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d5e7, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d5e8, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d5e9, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d5ea, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d5eb, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d5ec, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d5ed, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1d5ee, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d5ef, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d5f0, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d5f1, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d5f2, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d5f3, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d5f4, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d5f5, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d5f6, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d5f7, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d5f8, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d5f9, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d5fa, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d5fb, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d5fc, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d5fd, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d5fe, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d5ff, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d600, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d601, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d602, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d603, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d604, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d605, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d606, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d607, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d608, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d609, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d60a, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1d60b, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d60c, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d60d, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d60e, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d60f, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1d610, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d611, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d612, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d613, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d614, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d615, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d616, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d617, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d618, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d619, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1d61a, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d61b, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d61c, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d61d, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d61e, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d61f, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d620, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d621, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1d622, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d623, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d624, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d625, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d626, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d627, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d628, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d629, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d62a, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d62b, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d62c, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d62d, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d62e, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d62f, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d630, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d631, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d632, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d633, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d634, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d635, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d636, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d637, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d638, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d639, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d63a, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d63b, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d63c, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d63d, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d63e, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1d63f, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d640, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d641, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d642, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d643, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1d644, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d645, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d646, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d647, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d648, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d649, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d64a, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d64b, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d64c, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d64d, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1d64e, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d64f, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d650, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d651, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d652, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d653, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d654, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d655, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1d656, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d657, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d658, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d659, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d65a, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d65b, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d65c, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d65d, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d65e, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d65f, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d660, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d661, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d662, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d663, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d664, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d665, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d666, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d667, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d668, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d669, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d66a, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d66b, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d66c, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d66d, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d66e, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d66f, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d670, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1d671, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1d672, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1d673, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1d674, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1d675, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1d676, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1d677, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1d678, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1d679, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1d67a, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1d67b, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1d67c, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1d67d, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1d67e, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1d67f, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1d680, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1d681, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1d682, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1d683, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1d684, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1d685, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1d686, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1d687, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1d688, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1d689, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1d68a, 0, 0, 0, g(Yes, No, false, false, "", "a")},
+ {0x1d68b, 0, 0, 0, g(Yes, No, false, false, "", "b")},
+ {0x1d68c, 0, 0, 0, g(Yes, No, false, false, "", "c")},
+ {0x1d68d, 0, 0, 0, g(Yes, No, false, false, "", "d")},
+ {0x1d68e, 0, 0, 0, g(Yes, No, false, false, "", "e")},
+ {0x1d68f, 0, 0, 0, g(Yes, No, false, false, "", "f")},
+ {0x1d690, 0, 0, 0, g(Yes, No, false, false, "", "g")},
+ {0x1d691, 0, 0, 0, g(Yes, No, false, false, "", "h")},
+ {0x1d692, 0, 0, 0, g(Yes, No, false, false, "", "i")},
+ {0x1d693, 0, 0, 0, g(Yes, No, false, false, "", "j")},
+ {0x1d694, 0, 0, 0, g(Yes, No, false, false, "", "k")},
+ {0x1d695, 0, 0, 0, g(Yes, No, false, false, "", "l")},
+ {0x1d696, 0, 0, 0, g(Yes, No, false, false, "", "m")},
+ {0x1d697, 0, 0, 0, g(Yes, No, false, false, "", "n")},
+ {0x1d698, 0, 0, 0, g(Yes, No, false, false, "", "o")},
+ {0x1d699, 0, 0, 0, g(Yes, No, false, false, "", "p")},
+ {0x1d69a, 0, 0, 0, g(Yes, No, false, false, "", "q")},
+ {0x1d69b, 0, 0, 0, g(Yes, No, false, false, "", "r")},
+ {0x1d69c, 0, 0, 0, g(Yes, No, false, false, "", "s")},
+ {0x1d69d, 0, 0, 0, g(Yes, No, false, false, "", "t")},
+ {0x1d69e, 0, 0, 0, g(Yes, No, false, false, "", "u")},
+ {0x1d69f, 0, 0, 0, g(Yes, No, false, false, "", "v")},
+ {0x1d6a0, 0, 0, 0, g(Yes, No, false, false, "", "w")},
+ {0x1d6a1, 0, 0, 0, g(Yes, No, false, false, "", "x")},
+ {0x1d6a2, 0, 0, 0, g(Yes, No, false, false, "", "y")},
+ {0x1d6a3, 0, 0, 0, g(Yes, No, false, false, "", "z")},
+ {0x1d6a4, 0, 0, 0, g(Yes, No, false, false, "", "ı")},
+ {0x1d6a5, 0, 0, 0, g(Yes, No, false, false, "", "ȷ")},
+ {0x1d6a6, 0, 0, 0, f(Yes, false, "")},
+ {0x1d6a8, 0, 0, 0, g(Yes, No, false, false, "", "Α")},
+ {0x1d6a9, 0, 0, 0, g(Yes, No, false, false, "", "Β")},
+ {0x1d6aa, 0, 0, 0, g(Yes, No, false, false, "", "Γ")},
+ {0x1d6ab, 0, 0, 0, g(Yes, No, false, false, "", "Δ")},
+ {0x1d6ac, 0, 0, 0, g(Yes, No, false, false, "", "Ε")},
+ {0x1d6ad, 0, 0, 0, g(Yes, No, false, false, "", "Ζ")},
+ {0x1d6ae, 0, 0, 0, g(Yes, No, false, false, "", "Η")},
+ {0x1d6af, 0, 0, 0, g(Yes, No, false, false, "", "Θ")},
+ {0x1d6b0, 0, 0, 0, g(Yes, No, false, false, "", "Ι")},
+ {0x1d6b1, 0, 0, 0, g(Yes, No, false, false, "", "Κ")},
+ {0x1d6b2, 0, 0, 0, g(Yes, No, false, false, "", "Λ")},
+ {0x1d6b3, 0, 0, 0, g(Yes, No, false, false, "", "Μ")},
+ {0x1d6b4, 0, 0, 0, g(Yes, No, false, false, "", "Ν")},
+ {0x1d6b5, 0, 0, 0, g(Yes, No, false, false, "", "Ξ")},
+ {0x1d6b6, 0, 0, 0, g(Yes, No, false, false, "", "Ο")},
+ {0x1d6b7, 0, 0, 0, g(Yes, No, false, false, "", "Π")},
+ {0x1d6b8, 0, 0, 0, g(Yes, No, false, false, "", "Ρ")},
+ {0x1d6b9, 0, 0, 0, g(Yes, No, false, false, "", "Θ")},
+ {0x1d6ba, 0, 0, 0, g(Yes, No, false, false, "", "Σ")},
+ {0x1d6bb, 0, 0, 0, g(Yes, No, false, false, "", "Τ")},
+ {0x1d6bc, 0, 0, 0, g(Yes, No, false, false, "", "Υ")},
+ {0x1d6bd, 0, 0, 0, g(Yes, No, false, false, "", "Φ")},
+ {0x1d6be, 0, 0, 0, g(Yes, No, false, false, "", "Χ")},
+ {0x1d6bf, 0, 0, 0, g(Yes, No, false, false, "", "Ψ")},
+ {0x1d6c0, 0, 0, 0, g(Yes, No, false, false, "", "Ω")},
+ {0x1d6c1, 0, 0, 0, g(Yes, No, false, false, "", "∇")},
+ {0x1d6c2, 0, 0, 0, g(Yes, No, false, false, "", "α")},
+ {0x1d6c3, 0, 0, 0, g(Yes, No, false, false, "", "β")},
+ {0x1d6c4, 0, 0, 0, g(Yes, No, false, false, "", "γ")},
+ {0x1d6c5, 0, 0, 0, g(Yes, No, false, false, "", "δ")},
+ {0x1d6c6, 0, 0, 0, g(Yes, No, false, false, "", "ε")},
+ {0x1d6c7, 0, 0, 0, g(Yes, No, false, false, "", "ζ")},
+ {0x1d6c8, 0, 0, 0, g(Yes, No, false, false, "", "η")},
+ {0x1d6c9, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x1d6ca, 0, 0, 0, g(Yes, No, false, false, "", "ι")},
+ {0x1d6cb, 0, 0, 0, g(Yes, No, false, false, "", "κ")},
+ {0x1d6cc, 0, 0, 0, g(Yes, No, false, false, "", "λ")},
+ {0x1d6cd, 0, 0, 0, g(Yes, No, false, false, "", "μ")},
+ {0x1d6ce, 0, 0, 0, g(Yes, No, false, false, "", "ν")},
+ {0x1d6cf, 0, 0, 0, g(Yes, No, false, false, "", "ξ")},
+ {0x1d6d0, 0, 0, 0, g(Yes, No, false, false, "", "ο")},
+ {0x1d6d1, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x1d6d2, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x1d6d3, 0, 0, 0, g(Yes, No, false, false, "", "ς")},
+ {0x1d6d4, 0, 0, 0, g(Yes, No, false, false, "", "σ")},
+ {0x1d6d5, 0, 0, 0, g(Yes, No, false, false, "", "τ")},
+ {0x1d6d6, 0, 0, 0, g(Yes, No, false, false, "", "υ")},
+ {0x1d6d7, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d6d8, 0, 0, 0, g(Yes, No, false, false, "", "χ")},
+ {0x1d6d9, 0, 0, 0, g(Yes, No, false, false, "", "ψ")},
+ {0x1d6da, 0, 0, 0, g(Yes, No, false, false, "", "ω")},
+ {0x1d6db, 0, 0, 0, g(Yes, No, false, false, "", "∂")},
+ {0x1d6dc, 0, 0, 0, g(Yes, No, false, false, "", "ε")},
+ {0x1d6dd, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x1d6de, 0, 0, 0, g(Yes, No, false, false, "", "κ")},
+ {0x1d6df, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d6e0, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x1d6e1, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x1d6e2, 0, 0, 0, g(Yes, No, false, false, "", "Α")},
+ {0x1d6e3, 0, 0, 0, g(Yes, No, false, false, "", "Β")},
+ {0x1d6e4, 0, 0, 0, g(Yes, No, false, false, "", "Γ")},
+ {0x1d6e5, 0, 0, 0, g(Yes, No, false, false, "", "Δ")},
+ {0x1d6e6, 0, 0, 0, g(Yes, No, false, false, "", "Ε")},
+ {0x1d6e7, 0, 0, 0, g(Yes, No, false, false, "", "Ζ")},
+ {0x1d6e8, 0, 0, 0, g(Yes, No, false, false, "", "Η")},
+ {0x1d6e9, 0, 0, 0, g(Yes, No, false, false, "", "Θ")},
+ {0x1d6ea, 0, 0, 0, g(Yes, No, false, false, "", "Ι")},
+ {0x1d6eb, 0, 0, 0, g(Yes, No, false, false, "", "Κ")},
+ {0x1d6ec, 0, 0, 0, g(Yes, No, false, false, "", "Λ")},
+ {0x1d6ed, 0, 0, 0, g(Yes, No, false, false, "", "Μ")},
+ {0x1d6ee, 0, 0, 0, g(Yes, No, false, false, "", "Ν")},
+ {0x1d6ef, 0, 0, 0, g(Yes, No, false, false, "", "Ξ")},
+ {0x1d6f0, 0, 0, 0, g(Yes, No, false, false, "", "Ο")},
+ {0x1d6f1, 0, 0, 0, g(Yes, No, false, false, "", "Π")},
+ {0x1d6f2, 0, 0, 0, g(Yes, No, false, false, "", "Ρ")},
+ {0x1d6f3, 0, 0, 0, g(Yes, No, false, false, "", "Θ")},
+ {0x1d6f4, 0, 0, 0, g(Yes, No, false, false, "", "Σ")},
+ {0x1d6f5, 0, 0, 0, g(Yes, No, false, false, "", "Τ")},
+ {0x1d6f6, 0, 0, 0, g(Yes, No, false, false, "", "Υ")},
+ {0x1d6f7, 0, 0, 0, g(Yes, No, false, false, "", "Φ")},
+ {0x1d6f8, 0, 0, 0, g(Yes, No, false, false, "", "Χ")},
+ {0x1d6f9, 0, 0, 0, g(Yes, No, false, false, "", "Ψ")},
+ {0x1d6fa, 0, 0, 0, g(Yes, No, false, false, "", "Ω")},
+ {0x1d6fb, 0, 0, 0, g(Yes, No, false, false, "", "∇")},
+ {0x1d6fc, 0, 0, 0, g(Yes, No, false, false, "", "α")},
+ {0x1d6fd, 0, 0, 0, g(Yes, No, false, false, "", "β")},
+ {0x1d6fe, 0, 0, 0, g(Yes, No, false, false, "", "γ")},
+ {0x1d6ff, 0, 0, 0, g(Yes, No, false, false, "", "δ")},
+ {0x1d700, 0, 0, 0, g(Yes, No, false, false, "", "ε")},
+ {0x1d701, 0, 0, 0, g(Yes, No, false, false, "", "ζ")},
+ {0x1d702, 0, 0, 0, g(Yes, No, false, false, "", "η")},
+ {0x1d703, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x1d704, 0, 0, 0, g(Yes, No, false, false, "", "ι")},
+ {0x1d705, 0, 0, 0, g(Yes, No, false, false, "", "κ")},
+ {0x1d706, 0, 0, 0, g(Yes, No, false, false, "", "λ")},
+ {0x1d707, 0, 0, 0, g(Yes, No, false, false, "", "μ")},
+ {0x1d708, 0, 0, 0, g(Yes, No, false, false, "", "ν")},
+ {0x1d709, 0, 0, 0, g(Yes, No, false, false, "", "ξ")},
+ {0x1d70a, 0, 0, 0, g(Yes, No, false, false, "", "ο")},
+ {0x1d70b, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x1d70c, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x1d70d, 0, 0, 0, g(Yes, No, false, false, "", "ς")},
+ {0x1d70e, 0, 0, 0, g(Yes, No, false, false, "", "σ")},
+ {0x1d70f, 0, 0, 0, g(Yes, No, false, false, "", "τ")},
+ {0x1d710, 0, 0, 0, g(Yes, No, false, false, "", "υ")},
+ {0x1d711, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d712, 0, 0, 0, g(Yes, No, false, false, "", "χ")},
+ {0x1d713, 0, 0, 0, g(Yes, No, false, false, "", "ψ")},
+ {0x1d714, 0, 0, 0, g(Yes, No, false, false, "", "ω")},
+ {0x1d715, 0, 0, 0, g(Yes, No, false, false, "", "∂")},
+ {0x1d716, 0, 0, 0, g(Yes, No, false, false, "", "ε")},
+ {0x1d717, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x1d718, 0, 0, 0, g(Yes, No, false, false, "", "κ")},
+ {0x1d719, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d71a, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x1d71b, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x1d71c, 0, 0, 0, g(Yes, No, false, false, "", "Α")},
+ {0x1d71d, 0, 0, 0, g(Yes, No, false, false, "", "Β")},
+ {0x1d71e, 0, 0, 0, g(Yes, No, false, false, "", "Γ")},
+ {0x1d71f, 0, 0, 0, g(Yes, No, false, false, "", "Δ")},
+ {0x1d720, 0, 0, 0, g(Yes, No, false, false, "", "Ε")},
+ {0x1d721, 0, 0, 0, g(Yes, No, false, false, "", "Ζ")},
+ {0x1d722, 0, 0, 0, g(Yes, No, false, false, "", "Η")},
+ {0x1d723, 0, 0, 0, g(Yes, No, false, false, "", "Θ")},
+ {0x1d724, 0, 0, 0, g(Yes, No, false, false, "", "Ι")},
+ {0x1d725, 0, 0, 0, g(Yes, No, false, false, "", "Κ")},
+ {0x1d726, 0, 0, 0, g(Yes, No, false, false, "", "Λ")},
+ {0x1d727, 0, 0, 0, g(Yes, No, false, false, "", "Μ")},
+ {0x1d728, 0, 0, 0, g(Yes, No, false, false, "", "Ν")},
+ {0x1d729, 0, 0, 0, g(Yes, No, false, false, "", "Ξ")},
+ {0x1d72a, 0, 0, 0, g(Yes, No, false, false, "", "Ο")},
+ {0x1d72b, 0, 0, 0, g(Yes, No, false, false, "", "Π")},
+ {0x1d72c, 0, 0, 0, g(Yes, No, false, false, "", "Ρ")},
+ {0x1d72d, 0, 0, 0, g(Yes, No, false, false, "", "Θ")},
+ {0x1d72e, 0, 0, 0, g(Yes, No, false, false, "", "Σ")},
+ {0x1d72f, 0, 0, 0, g(Yes, No, false, false, "", "Τ")},
+ {0x1d730, 0, 0, 0, g(Yes, No, false, false, "", "Υ")},
+ {0x1d731, 0, 0, 0, g(Yes, No, false, false, "", "Φ")},
+ {0x1d732, 0, 0, 0, g(Yes, No, false, false, "", "Χ")},
+ {0x1d733, 0, 0, 0, g(Yes, No, false, false, "", "Ψ")},
+ {0x1d734, 0, 0, 0, g(Yes, No, false, false, "", "Ω")},
+ {0x1d735, 0, 0, 0, g(Yes, No, false, false, "", "∇")},
+ {0x1d736, 0, 0, 0, g(Yes, No, false, false, "", "α")},
+ {0x1d737, 0, 0, 0, g(Yes, No, false, false, "", "β")},
+ {0x1d738, 0, 0, 0, g(Yes, No, false, false, "", "γ")},
+ {0x1d739, 0, 0, 0, g(Yes, No, false, false, "", "δ")},
+ {0x1d73a, 0, 0, 0, g(Yes, No, false, false, "", "ε")},
+ {0x1d73b, 0, 0, 0, g(Yes, No, false, false, "", "ζ")},
+ {0x1d73c, 0, 0, 0, g(Yes, No, false, false, "", "η")},
+ {0x1d73d, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x1d73e, 0, 0, 0, g(Yes, No, false, false, "", "ι")},
+ {0x1d73f, 0, 0, 0, g(Yes, No, false, false, "", "κ")},
+ {0x1d740, 0, 0, 0, g(Yes, No, false, false, "", "λ")},
+ {0x1d741, 0, 0, 0, g(Yes, No, false, false, "", "μ")},
+ {0x1d742, 0, 0, 0, g(Yes, No, false, false, "", "ν")},
+ {0x1d743, 0, 0, 0, g(Yes, No, false, false, "", "ξ")},
+ {0x1d744, 0, 0, 0, g(Yes, No, false, false, "", "ο")},
+ {0x1d745, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x1d746, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x1d747, 0, 0, 0, g(Yes, No, false, false, "", "ς")},
+ {0x1d748, 0, 0, 0, g(Yes, No, false, false, "", "σ")},
+ {0x1d749, 0, 0, 0, g(Yes, No, false, false, "", "τ")},
+ {0x1d74a, 0, 0, 0, g(Yes, No, false, false, "", "υ")},
+ {0x1d74b, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d74c, 0, 0, 0, g(Yes, No, false, false, "", "χ")},
+ {0x1d74d, 0, 0, 0, g(Yes, No, false, false, "", "ψ")},
+ {0x1d74e, 0, 0, 0, g(Yes, No, false, false, "", "ω")},
+ {0x1d74f, 0, 0, 0, g(Yes, No, false, false, "", "∂")},
+ {0x1d750, 0, 0, 0, g(Yes, No, false, false, "", "ε")},
+ {0x1d751, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x1d752, 0, 0, 0, g(Yes, No, false, false, "", "κ")},
+ {0x1d753, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d754, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x1d755, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x1d756, 0, 0, 0, g(Yes, No, false, false, "", "Α")},
+ {0x1d757, 0, 0, 0, g(Yes, No, false, false, "", "Β")},
+ {0x1d758, 0, 0, 0, g(Yes, No, false, false, "", "Γ")},
+ {0x1d759, 0, 0, 0, g(Yes, No, false, false, "", "Δ")},
+ {0x1d75a, 0, 0, 0, g(Yes, No, false, false, "", "Ε")},
+ {0x1d75b, 0, 0, 0, g(Yes, No, false, false, "", "Ζ")},
+ {0x1d75c, 0, 0, 0, g(Yes, No, false, false, "", "Η")},
+ {0x1d75d, 0, 0, 0, g(Yes, No, false, false, "", "Θ")},
+ {0x1d75e, 0, 0, 0, g(Yes, No, false, false, "", "Ι")},
+ {0x1d75f, 0, 0, 0, g(Yes, No, false, false, "", "Κ")},
+ {0x1d760, 0, 0, 0, g(Yes, No, false, false, "", "Λ")},
+ {0x1d761, 0, 0, 0, g(Yes, No, false, false, "", "Μ")},
+ {0x1d762, 0, 0, 0, g(Yes, No, false, false, "", "Ν")},
+ {0x1d763, 0, 0, 0, g(Yes, No, false, false, "", "Ξ")},
+ {0x1d764, 0, 0, 0, g(Yes, No, false, false, "", "Ο")},
+ {0x1d765, 0, 0, 0, g(Yes, No, false, false, "", "Π")},
+ {0x1d766, 0, 0, 0, g(Yes, No, false, false, "", "Ρ")},
+ {0x1d767, 0, 0, 0, g(Yes, No, false, false, "", "Θ")},
+ {0x1d768, 0, 0, 0, g(Yes, No, false, false, "", "Σ")},
+ {0x1d769, 0, 0, 0, g(Yes, No, false, false, "", "Τ")},
+ {0x1d76a, 0, 0, 0, g(Yes, No, false, false, "", "Υ")},
+ {0x1d76b, 0, 0, 0, g(Yes, No, false, false, "", "Φ")},
+ {0x1d76c, 0, 0, 0, g(Yes, No, false, false, "", "Χ")},
+ {0x1d76d, 0, 0, 0, g(Yes, No, false, false, "", "Ψ")},
+ {0x1d76e, 0, 0, 0, g(Yes, No, false, false, "", "Ω")},
+ {0x1d76f, 0, 0, 0, g(Yes, No, false, false, "", "∇")},
+ {0x1d770, 0, 0, 0, g(Yes, No, false, false, "", "α")},
+ {0x1d771, 0, 0, 0, g(Yes, No, false, false, "", "β")},
+ {0x1d772, 0, 0, 0, g(Yes, No, false, false, "", "γ")},
+ {0x1d773, 0, 0, 0, g(Yes, No, false, false, "", "δ")},
+ {0x1d774, 0, 0, 0, g(Yes, No, false, false, "", "ε")},
+ {0x1d775, 0, 0, 0, g(Yes, No, false, false, "", "ζ")},
+ {0x1d776, 0, 0, 0, g(Yes, No, false, false, "", "η")},
+ {0x1d777, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x1d778, 0, 0, 0, g(Yes, No, false, false, "", "ι")},
+ {0x1d779, 0, 0, 0, g(Yes, No, false, false, "", "κ")},
+ {0x1d77a, 0, 0, 0, g(Yes, No, false, false, "", "λ")},
+ {0x1d77b, 0, 0, 0, g(Yes, No, false, false, "", "μ")},
+ {0x1d77c, 0, 0, 0, g(Yes, No, false, false, "", "ν")},
+ {0x1d77d, 0, 0, 0, g(Yes, No, false, false, "", "ξ")},
+ {0x1d77e, 0, 0, 0, g(Yes, No, false, false, "", "ο")},
+ {0x1d77f, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x1d780, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x1d781, 0, 0, 0, g(Yes, No, false, false, "", "ς")},
+ {0x1d782, 0, 0, 0, g(Yes, No, false, false, "", "σ")},
+ {0x1d783, 0, 0, 0, g(Yes, No, false, false, "", "τ")},
+ {0x1d784, 0, 0, 0, g(Yes, No, false, false, "", "υ")},
+ {0x1d785, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d786, 0, 0, 0, g(Yes, No, false, false, "", "χ")},
+ {0x1d787, 0, 0, 0, g(Yes, No, false, false, "", "ψ")},
+ {0x1d788, 0, 0, 0, g(Yes, No, false, false, "", "ω")},
+ {0x1d789, 0, 0, 0, g(Yes, No, false, false, "", "∂")},
+ {0x1d78a, 0, 0, 0, g(Yes, No, false, false, "", "ε")},
+ {0x1d78b, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x1d78c, 0, 0, 0, g(Yes, No, false, false, "", "κ")},
+ {0x1d78d, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d78e, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x1d78f, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x1d790, 0, 0, 0, g(Yes, No, false, false, "", "Α")},
+ {0x1d791, 0, 0, 0, g(Yes, No, false, false, "", "Β")},
+ {0x1d792, 0, 0, 0, g(Yes, No, false, false, "", "Γ")},
+ {0x1d793, 0, 0, 0, g(Yes, No, false, false, "", "Δ")},
+ {0x1d794, 0, 0, 0, g(Yes, No, false, false, "", "Ε")},
+ {0x1d795, 0, 0, 0, g(Yes, No, false, false, "", "Ζ")},
+ {0x1d796, 0, 0, 0, g(Yes, No, false, false, "", "Η")},
+ {0x1d797, 0, 0, 0, g(Yes, No, false, false, "", "Θ")},
+ {0x1d798, 0, 0, 0, g(Yes, No, false, false, "", "Ι")},
+ {0x1d799, 0, 0, 0, g(Yes, No, false, false, "", "Κ")},
+ {0x1d79a, 0, 0, 0, g(Yes, No, false, false, "", "Λ")},
+ {0x1d79b, 0, 0, 0, g(Yes, No, false, false, "", "Μ")},
+ {0x1d79c, 0, 0, 0, g(Yes, No, false, false, "", "Ν")},
+ {0x1d79d, 0, 0, 0, g(Yes, No, false, false, "", "Ξ")},
+ {0x1d79e, 0, 0, 0, g(Yes, No, false, false, "", "Ο")},
+ {0x1d79f, 0, 0, 0, g(Yes, No, false, false, "", "Π")},
+ {0x1d7a0, 0, 0, 0, g(Yes, No, false, false, "", "Ρ")},
+ {0x1d7a1, 0, 0, 0, g(Yes, No, false, false, "", "Θ")},
+ {0x1d7a2, 0, 0, 0, g(Yes, No, false, false, "", "Σ")},
+ {0x1d7a3, 0, 0, 0, g(Yes, No, false, false, "", "Τ")},
+ {0x1d7a4, 0, 0, 0, g(Yes, No, false, false, "", "Υ")},
+ {0x1d7a5, 0, 0, 0, g(Yes, No, false, false, "", "Φ")},
+ {0x1d7a6, 0, 0, 0, g(Yes, No, false, false, "", "Χ")},
+ {0x1d7a7, 0, 0, 0, g(Yes, No, false, false, "", "Ψ")},
+ {0x1d7a8, 0, 0, 0, g(Yes, No, false, false, "", "Ω")},
+ {0x1d7a9, 0, 0, 0, g(Yes, No, false, false, "", "∇")},
+ {0x1d7aa, 0, 0, 0, g(Yes, No, false, false, "", "α")},
+ {0x1d7ab, 0, 0, 0, g(Yes, No, false, false, "", "β")},
+ {0x1d7ac, 0, 0, 0, g(Yes, No, false, false, "", "γ")},
+ {0x1d7ad, 0, 0, 0, g(Yes, No, false, false, "", "δ")},
+ {0x1d7ae, 0, 0, 0, g(Yes, No, false, false, "", "ε")},
+ {0x1d7af, 0, 0, 0, g(Yes, No, false, false, "", "ζ")},
+ {0x1d7b0, 0, 0, 0, g(Yes, No, false, false, "", "η")},
+ {0x1d7b1, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x1d7b2, 0, 0, 0, g(Yes, No, false, false, "", "ι")},
+ {0x1d7b3, 0, 0, 0, g(Yes, No, false, false, "", "κ")},
+ {0x1d7b4, 0, 0, 0, g(Yes, No, false, false, "", "λ")},
+ {0x1d7b5, 0, 0, 0, g(Yes, No, false, false, "", "μ")},
+ {0x1d7b6, 0, 0, 0, g(Yes, No, false, false, "", "ν")},
+ {0x1d7b7, 0, 0, 0, g(Yes, No, false, false, "", "ξ")},
+ {0x1d7b8, 0, 0, 0, g(Yes, No, false, false, "", "ο")},
+ {0x1d7b9, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x1d7ba, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x1d7bb, 0, 0, 0, g(Yes, No, false, false, "", "ς")},
+ {0x1d7bc, 0, 0, 0, g(Yes, No, false, false, "", "σ")},
+ {0x1d7bd, 0, 0, 0, g(Yes, No, false, false, "", "τ")},
+ {0x1d7be, 0, 0, 0, g(Yes, No, false, false, "", "υ")},
+ {0x1d7bf, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d7c0, 0, 0, 0, g(Yes, No, false, false, "", "χ")},
+ {0x1d7c1, 0, 0, 0, g(Yes, No, false, false, "", "ψ")},
+ {0x1d7c2, 0, 0, 0, g(Yes, No, false, false, "", "ω")},
+ {0x1d7c3, 0, 0, 0, g(Yes, No, false, false, "", "∂")},
+ {0x1d7c4, 0, 0, 0, g(Yes, No, false, false, "", "ε")},
+ {0x1d7c5, 0, 0, 0, g(Yes, No, false, false, "", "θ")},
+ {0x1d7c6, 0, 0, 0, g(Yes, No, false, false, "", "κ")},
+ {0x1d7c7, 0, 0, 0, g(Yes, No, false, false, "", "φ")},
+ {0x1d7c8, 0, 0, 0, g(Yes, No, false, false, "", "ρ")},
+ {0x1d7c9, 0, 0, 0, g(Yes, No, false, false, "", "π")},
+ {0x1d7ca, 0, 0, 0, g(Yes, No, false, false, "", "Ϝ")},
+ {0x1d7cb, 0, 0, 0, g(Yes, No, false, false, "", "ϝ")},
+ {0x1d7cc, 0, 0, 0, f(Yes, false, "")},
+ {0x1d7ce, 0, 0, 0, g(Yes, No, false, false, "", "0")},
+ {0x1d7cf, 0, 0, 0, g(Yes, No, false, false, "", "1")},
+ {0x1d7d0, 0, 0, 0, g(Yes, No, false, false, "", "2")},
+ {0x1d7d1, 0, 0, 0, g(Yes, No, false, false, "", "3")},
+ {0x1d7d2, 0, 0, 0, g(Yes, No, false, false, "", "4")},
+ {0x1d7d3, 0, 0, 0, g(Yes, No, false, false, "", "5")},
+ {0x1d7d4, 0, 0, 0, g(Yes, No, false, false, "", "6")},
+ {0x1d7d5, 0, 0, 0, g(Yes, No, false, false, "", "7")},
+ {0x1d7d6, 0, 0, 0, g(Yes, No, false, false, "", "8")},
+ {0x1d7d7, 0, 0, 0, g(Yes, No, false, false, "", "9")},
+ {0x1d7d8, 0, 0, 0, g(Yes, No, false, false, "", "0")},
+ {0x1d7d9, 0, 0, 0, g(Yes, No, false, false, "", "1")},
+ {0x1d7da, 0, 0, 0, g(Yes, No, false, false, "", "2")},
+ {0x1d7db, 0, 0, 0, g(Yes, No, false, false, "", "3")},
+ {0x1d7dc, 0, 0, 0, g(Yes, No, false, false, "", "4")},
+ {0x1d7dd, 0, 0, 0, g(Yes, No, false, false, "", "5")},
+ {0x1d7de, 0, 0, 0, g(Yes, No, false, false, "", "6")},
+ {0x1d7df, 0, 0, 0, g(Yes, No, false, false, "", "7")},
+ {0x1d7e0, 0, 0, 0, g(Yes, No, false, false, "", "8")},
+ {0x1d7e1, 0, 0, 0, g(Yes, No, false, false, "", "9")},
+ {0x1d7e2, 0, 0, 0, g(Yes, No, false, false, "", "0")},
+ {0x1d7e3, 0, 0, 0, g(Yes, No, false, false, "", "1")},
+ {0x1d7e4, 0, 0, 0, g(Yes, No, false, false, "", "2")},
+ {0x1d7e5, 0, 0, 0, g(Yes, No, false, false, "", "3")},
+ {0x1d7e6, 0, 0, 0, g(Yes, No, false, false, "", "4")},
+ {0x1d7e7, 0, 0, 0, g(Yes, No, false, false, "", "5")},
+ {0x1d7e8, 0, 0, 0, g(Yes, No, false, false, "", "6")},
+ {0x1d7e9, 0, 0, 0, g(Yes, No, false, false, "", "7")},
+ {0x1d7ea, 0, 0, 0, g(Yes, No, false, false, "", "8")},
+ {0x1d7eb, 0, 0, 0, g(Yes, No, false, false, "", "9")},
+ {0x1d7ec, 0, 0, 0, g(Yes, No, false, false, "", "0")},
+ {0x1d7ed, 0, 0, 0, g(Yes, No, false, false, "", "1")},
+ {0x1d7ee, 0, 0, 0, g(Yes, No, false, false, "", "2")},
+ {0x1d7ef, 0, 0, 0, g(Yes, No, false, false, "", "3")},
+ {0x1d7f0, 0, 0, 0, g(Yes, No, false, false, "", "4")},
+ {0x1d7f1, 0, 0, 0, g(Yes, No, false, false, "", "5")},
+ {0x1d7f2, 0, 0, 0, g(Yes, No, false, false, "", "6")},
+ {0x1d7f3, 0, 0, 0, g(Yes, No, false, false, "", "7")},
+ {0x1d7f4, 0, 0, 0, g(Yes, No, false, false, "", "8")},
+ {0x1d7f5, 0, 0, 0, g(Yes, No, false, false, "", "9")},
+ {0x1d7f6, 0, 0, 0, g(Yes, No, false, false, "", "0")},
+ {0x1d7f7, 0, 0, 0, g(Yes, No, false, false, "", "1")},
+ {0x1d7f8, 0, 0, 0, g(Yes, No, false, false, "", "2")},
+ {0x1d7f9, 0, 0, 0, g(Yes, No, false, false, "", "3")},
+ {0x1d7fa, 0, 0, 0, g(Yes, No, false, false, "", "4")},
+ {0x1d7fb, 0, 0, 0, g(Yes, No, false, false, "", "5")},
+ {0x1d7fc, 0, 0, 0, g(Yes, No, false, false, "", "6")},
+ {0x1d7fd, 0, 0, 0, g(Yes, No, false, false, "", "7")},
+ {0x1d7fe, 0, 0, 0, g(Yes, No, false, false, "", "8")},
+ {0x1d7ff, 0, 0, 0, g(Yes, No, false, false, "", "9")},
+ {0x1d800, 0, 0, 0, f(Yes, false, "")},
+ {0x1e000, 230, 1, 1, f(Yes, false, "")},
+ {0x1e007, 0, 0, 0, f(Yes, false, "")},
+ {0x1e008, 230, 1, 1, f(Yes, false, "")},
+ {0x1e019, 0, 0, 0, f(Yes, false, "")},
+ {0x1e01b, 230, 1, 1, f(Yes, false, "")},
+ {0x1e022, 0, 0, 0, f(Yes, false, "")},
+ {0x1e023, 230, 1, 1, f(Yes, false, "")},
+ {0x1e025, 0, 0, 0, f(Yes, false, "")},
+ {0x1e026, 230, 1, 1, f(Yes, false, "")},
+ {0x1e02b, 0, 0, 0, f(Yes, false, "")},
+ {0x1e8d0, 220, 1, 1, f(Yes, false, "")},
+ {0x1e8d7, 0, 0, 0, f(Yes, false, "")},
+ {0x1e944, 230, 1, 1, f(Yes, false, "")},
+ {0x1e94a, 7, 1, 1, f(Yes, false, "")},
+ {0x1e94b, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee00, 0, 0, 0, g(Yes, No, false, false, "", "ا")},
+ {0x1ee01, 0, 0, 0, g(Yes, No, false, false, "", "ب")},
+ {0x1ee02, 0, 0, 0, g(Yes, No, false, false, "", "ج")},
+ {0x1ee03, 0, 0, 0, g(Yes, No, false, false, "", "د")},
+ {0x1ee04, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee05, 0, 0, 0, g(Yes, No, false, false, "", "و")},
+ {0x1ee06, 0, 0, 0, g(Yes, No, false, false, "", "ز")},
+ {0x1ee07, 0, 0, 0, g(Yes, No, false, false, "", "ح")},
+ {0x1ee08, 0, 0, 0, g(Yes, No, false, false, "", "ط")},
+ {0x1ee09, 0, 0, 0, g(Yes, No, false, false, "", "ي")},
+ {0x1ee0a, 0, 0, 0, g(Yes, No, false, false, "", "ك")},
+ {0x1ee0b, 0, 0, 0, g(Yes, No, false, false, "", "ل")},
+ {0x1ee0c, 0, 0, 0, g(Yes, No, false, false, "", "م")},
+ {0x1ee0d, 0, 0, 0, g(Yes, No, false, false, "", "ن")},
+ {0x1ee0e, 0, 0, 0, g(Yes, No, false, false, "", "س")},
+ {0x1ee0f, 0, 0, 0, g(Yes, No, false, false, "", "ع")},
+ {0x1ee10, 0, 0, 0, g(Yes, No, false, false, "", "ف")},
+ {0x1ee11, 0, 0, 0, g(Yes, No, false, false, "", "ص")},
+ {0x1ee12, 0, 0, 0, g(Yes, No, false, false, "", "ق")},
+ {0x1ee13, 0, 0, 0, g(Yes, No, false, false, "", "ر")},
+ {0x1ee14, 0, 0, 0, g(Yes, No, false, false, "", "ش")},
+ {0x1ee15, 0, 0, 0, g(Yes, No, false, false, "", "ت")},
+ {0x1ee16, 0, 0, 0, g(Yes, No, false, false, "", "ث")},
+ {0x1ee17, 0, 0, 0, g(Yes, No, false, false, "", "خ")},
+ {0x1ee18, 0, 0, 0, g(Yes, No, false, false, "", "ذ")},
+ {0x1ee19, 0, 0, 0, g(Yes, No, false, false, "", "ض")},
+ {0x1ee1a, 0, 0, 0, g(Yes, No, false, false, "", "ظ")},
+ {0x1ee1b, 0, 0, 0, g(Yes, No, false, false, "", "غ")},
+ {0x1ee1c, 0, 0, 0, g(Yes, No, false, false, "", "ٮ")},
+ {0x1ee1d, 0, 0, 0, g(Yes, No, false, false, "", "ں")},
+ {0x1ee1e, 0, 0, 0, g(Yes, No, false, false, "", "ڡ")},
+ {0x1ee1f, 0, 0, 0, g(Yes, No, false, false, "", "ٯ")},
+ {0x1ee20, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee21, 0, 0, 0, g(Yes, No, false, false, "", "ب")},
+ {0x1ee22, 0, 0, 0, g(Yes, No, false, false, "", "ج")},
+ {0x1ee23, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee24, 0, 0, 0, g(Yes, No, false, false, "", "ه")},
+ {0x1ee25, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee27, 0, 0, 0, g(Yes, No, false, false, "", "ح")},
+ {0x1ee28, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee29, 0, 0, 0, g(Yes, No, false, false, "", "ي")},
+ {0x1ee2a, 0, 0, 0, g(Yes, No, false, false, "", "ك")},
+ {0x1ee2b, 0, 0, 0, g(Yes, No, false, false, "", "ل")},
+ {0x1ee2c, 0, 0, 0, g(Yes, No, false, false, "", "م")},
+ {0x1ee2d, 0, 0, 0, g(Yes, No, false, false, "", "ن")},
+ {0x1ee2e, 0, 0, 0, g(Yes, No, false, false, "", "س")},
+ {0x1ee2f, 0, 0, 0, g(Yes, No, false, false, "", "ع")},
+ {0x1ee30, 0, 0, 0, g(Yes, No, false, false, "", "ف")},
+ {0x1ee31, 0, 0, 0, g(Yes, No, false, false, "", "ص")},
+ {0x1ee32, 0, 0, 0, g(Yes, No, false, false, "", "ق")},
+ {0x1ee33, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee34, 0, 0, 0, g(Yes, No, false, false, "", "ش")},
+ {0x1ee35, 0, 0, 0, g(Yes, No, false, false, "", "ت")},
+ {0x1ee36, 0, 0, 0, g(Yes, No, false, false, "", "ث")},
+ {0x1ee37, 0, 0, 0, g(Yes, No, false, false, "", "خ")},
+ {0x1ee38, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee39, 0, 0, 0, g(Yes, No, false, false, "", "ض")},
+ {0x1ee3a, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee3b, 0, 0, 0, g(Yes, No, false, false, "", "غ")},
+ {0x1ee3c, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee42, 0, 0, 0, g(Yes, No, false, false, "", "ج")},
+ {0x1ee43, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee47, 0, 0, 0, g(Yes, No, false, false, "", "ح")},
+ {0x1ee48, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee49, 0, 0, 0, g(Yes, No, false, false, "", "ي")},
+ {0x1ee4a, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee4b, 0, 0, 0, g(Yes, No, false, false, "", "ل")},
+ {0x1ee4c, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee4d, 0, 0, 0, g(Yes, No, false, false, "", "ن")},
+ {0x1ee4e, 0, 0, 0, g(Yes, No, false, false, "", "س")},
+ {0x1ee4f, 0, 0, 0, g(Yes, No, false, false, "", "ع")},
+ {0x1ee50, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee51, 0, 0, 0, g(Yes, No, false, false, "", "ص")},
+ {0x1ee52, 0, 0, 0, g(Yes, No, false, false, "", "ق")},
+ {0x1ee53, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee54, 0, 0, 0, g(Yes, No, false, false, "", "ش")},
+ {0x1ee55, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee57, 0, 0, 0, g(Yes, No, false, false, "", "خ")},
+ {0x1ee58, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee59, 0, 0, 0, g(Yes, No, false, false, "", "ض")},
+ {0x1ee5a, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee5b, 0, 0, 0, g(Yes, No, false, false, "", "غ")},
+ {0x1ee5c, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee5d, 0, 0, 0, g(Yes, No, false, false, "", "ں")},
+ {0x1ee5e, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee5f, 0, 0, 0, g(Yes, No, false, false, "", "ٯ")},
+ {0x1ee60, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee61, 0, 0, 0, g(Yes, No, false, false, "", "ب")},
+ {0x1ee62, 0, 0, 0, g(Yes, No, false, false, "", "ج")},
+ {0x1ee63, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee64, 0, 0, 0, g(Yes, No, false, false, "", "ه")},
+ {0x1ee65, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee67, 0, 0, 0, g(Yes, No, false, false, "", "ح")},
+ {0x1ee68, 0, 0, 0, g(Yes, No, false, false, "", "ط")},
+ {0x1ee69, 0, 0, 0, g(Yes, No, false, false, "", "ي")},
+ {0x1ee6a, 0, 0, 0, g(Yes, No, false, false, "", "ك")},
+ {0x1ee6b, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee6c, 0, 0, 0, g(Yes, No, false, false, "", "م")},
+ {0x1ee6d, 0, 0, 0, g(Yes, No, false, false, "", "ن")},
+ {0x1ee6e, 0, 0, 0, g(Yes, No, false, false, "", "س")},
+ {0x1ee6f, 0, 0, 0, g(Yes, No, false, false, "", "ع")},
+ {0x1ee70, 0, 0, 0, g(Yes, No, false, false, "", "ف")},
+ {0x1ee71, 0, 0, 0, g(Yes, No, false, false, "", "ص")},
+ {0x1ee72, 0, 0, 0, g(Yes, No, false, false, "", "ق")},
+ {0x1ee73, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee74, 0, 0, 0, g(Yes, No, false, false, "", "ش")},
+ {0x1ee75, 0, 0, 0, g(Yes, No, false, false, "", "ت")},
+ {0x1ee76, 0, 0, 0, g(Yes, No, false, false, "", "ث")},
+ {0x1ee77, 0, 0, 0, g(Yes, No, false, false, "", "خ")},
+ {0x1ee78, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee79, 0, 0, 0, g(Yes, No, false, false, "", "ض")},
+ {0x1ee7a, 0, 0, 0, g(Yes, No, false, false, "", "ظ")},
+ {0x1ee7b, 0, 0, 0, g(Yes, No, false, false, "", "غ")},
+ {0x1ee7c, 0, 0, 0, g(Yes, No, false, false, "", "ٮ")},
+ {0x1ee7d, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee7e, 0, 0, 0, g(Yes, No, false, false, "", "ڡ")},
+ {0x1ee7f, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee80, 0, 0, 0, g(Yes, No, false, false, "", "ا")},
+ {0x1ee81, 0, 0, 0, g(Yes, No, false, false, "", "ب")},
+ {0x1ee82, 0, 0, 0, g(Yes, No, false, false, "", "ج")},
+ {0x1ee83, 0, 0, 0, g(Yes, No, false, false, "", "د")},
+ {0x1ee84, 0, 0, 0, g(Yes, No, false, false, "", "ه")},
+ {0x1ee85, 0, 0, 0, g(Yes, No, false, false, "", "و")},
+ {0x1ee86, 0, 0, 0, g(Yes, No, false, false, "", "ز")},
+ {0x1ee87, 0, 0, 0, g(Yes, No, false, false, "", "ح")},
+ {0x1ee88, 0, 0, 0, g(Yes, No, false, false, "", "ط")},
+ {0x1ee89, 0, 0, 0, g(Yes, No, false, false, "", "ي")},
+ {0x1ee8a, 0, 0, 0, f(Yes, false, "")},
+ {0x1ee8b, 0, 0, 0, g(Yes, No, false, false, "", "ل")},
+ {0x1ee8c, 0, 0, 0, g(Yes, No, false, false, "", "م")},
+ {0x1ee8d, 0, 0, 0, g(Yes, No, false, false, "", "ن")},
+ {0x1ee8e, 0, 0, 0, g(Yes, No, false, false, "", "س")},
+ {0x1ee8f, 0, 0, 0, g(Yes, No, false, false, "", "ع")},
+ {0x1ee90, 0, 0, 0, g(Yes, No, false, false, "", "ف")},
+ {0x1ee91, 0, 0, 0, g(Yes, No, false, false, "", "ص")},
+ {0x1ee92, 0, 0, 0, g(Yes, No, false, false, "", "ق")},
+ {0x1ee93, 0, 0, 0, g(Yes, No, false, false, "", "ر")},
+ {0x1ee94, 0, 0, 0, g(Yes, No, false, false, "", "ش")},
+ {0x1ee95, 0, 0, 0, g(Yes, No, false, false, "", "ت")},
+ {0x1ee96, 0, 0, 0, g(Yes, No, false, false, "", "ث")},
+ {0x1ee97, 0, 0, 0, g(Yes, No, false, false, "", "خ")},
+ {0x1ee98, 0, 0, 0, g(Yes, No, false, false, "", "ذ")},
+ {0x1ee99, 0, 0, 0, g(Yes, No, false, false, "", "ض")},
+ {0x1ee9a, 0, 0, 0, g(Yes, No, false, false, "", "ظ")},
+ {0x1ee9b, 0, 0, 0, g(Yes, No, false, false, "", "غ")},
+ {0x1ee9c, 0, 0, 0, f(Yes, false, "")},
+ {0x1eea1, 0, 0, 0, g(Yes, No, false, false, "", "ب")},
+ {0x1eea2, 0, 0, 0, g(Yes, No, false, false, "", "ج")},
+ {0x1eea3, 0, 0, 0, g(Yes, No, false, false, "", "د")},
+ {0x1eea4, 0, 0, 0, f(Yes, false, "")},
+ {0x1eea5, 0, 0, 0, g(Yes, No, false, false, "", "و")},
+ {0x1eea6, 0, 0, 0, g(Yes, No, false, false, "", "ز")},
+ {0x1eea7, 0, 0, 0, g(Yes, No, false, false, "", "ح")},
+ {0x1eea8, 0, 0, 0, g(Yes, No, false, false, "", "ط")},
+ {0x1eea9, 0, 0, 0, g(Yes, No, false, false, "", "ي")},
+ {0x1eeaa, 0, 0, 0, f(Yes, false, "")},
+ {0x1eeab, 0, 0, 0, g(Yes, No, false, false, "", "ل")},
+ {0x1eeac, 0, 0, 0, g(Yes, No, false, false, "", "م")},
+ {0x1eead, 0, 0, 0, g(Yes, No, false, false, "", "ن")},
+ {0x1eeae, 0, 0, 0, g(Yes, No, false, false, "", "س")},
+ {0x1eeaf, 0, 0, 0, g(Yes, No, false, false, "", "ع")},
+ {0x1eeb0, 0, 0, 0, g(Yes, No, false, false, "", "ف")},
+ {0x1eeb1, 0, 0, 0, g(Yes, No, false, false, "", "ص")},
+ {0x1eeb2, 0, 0, 0, g(Yes, No, false, false, "", "ق")},
+ {0x1eeb3, 0, 0, 0, g(Yes, No, false, false, "", "ر")},
+ {0x1eeb4, 0, 0, 0, g(Yes, No, false, false, "", "ش")},
+ {0x1eeb5, 0, 0, 0, g(Yes, No, false, false, "", "ت")},
+ {0x1eeb6, 0, 0, 0, g(Yes, No, false, false, "", "ث")},
+ {0x1eeb7, 0, 0, 0, g(Yes, No, false, false, "", "خ")},
+ {0x1eeb8, 0, 0, 0, g(Yes, No, false, false, "", "ذ")},
+ {0x1eeb9, 0, 0, 0, g(Yes, No, false, false, "", "ض")},
+ {0x1eeba, 0, 0, 0, g(Yes, No, false, false, "", "ظ")},
+ {0x1eebb, 0, 0, 0, g(Yes, No, false, false, "", "غ")},
+ {0x1eebc, 0, 0, 0, f(Yes, false, "")},
+ {0x1f100, 0, 0, 0, g(Yes, No, false, false, "", "0.")},
+ {0x1f101, 0, 0, 0, g(Yes, No, false, false, "", "0,")},
+ {0x1f102, 0, 0, 0, g(Yes, No, false, false, "", "1,")},
+ {0x1f103, 0, 0, 0, g(Yes, No, false, false, "", "2,")},
+ {0x1f104, 0, 0, 0, g(Yes, No, false, false, "", "3,")},
+ {0x1f105, 0, 0, 0, g(Yes, No, false, false, "", "4,")},
+ {0x1f106, 0, 0, 0, g(Yes, No, false, false, "", "5,")},
+ {0x1f107, 0, 0, 0, g(Yes, No, false, false, "", "6,")},
+ {0x1f108, 0, 0, 0, g(Yes, No, false, false, "", "7,")},
+ {0x1f109, 0, 0, 0, g(Yes, No, false, false, "", "8,")},
+ {0x1f10a, 0, 0, 0, g(Yes, No, false, false, "", "9,")},
+ {0x1f10b, 0, 0, 0, f(Yes, false, "")},
+ {0x1f110, 0, 0, 0, g(Yes, No, false, false, "", "(A)")},
+ {0x1f111, 0, 0, 0, g(Yes, No, false, false, "", "(B)")},
+ {0x1f112, 0, 0, 0, g(Yes, No, false, false, "", "(C)")},
+ {0x1f113, 0, 0, 0, g(Yes, No, false, false, "", "(D)")},
+ {0x1f114, 0, 0, 0, g(Yes, No, false, false, "", "(E)")},
+ {0x1f115, 0, 0, 0, g(Yes, No, false, false, "", "(F)")},
+ {0x1f116, 0, 0, 0, g(Yes, No, false, false, "", "(G)")},
+ {0x1f117, 0, 0, 0, g(Yes, No, false, false, "", "(H)")},
+ {0x1f118, 0, 0, 0, g(Yes, No, false, false, "", "(I)")},
+ {0x1f119, 0, 0, 0, g(Yes, No, false, false, "", "(J)")},
+ {0x1f11a, 0, 0, 0, g(Yes, No, false, false, "", "(K)")},
+ {0x1f11b, 0, 0, 0, g(Yes, No, false, false, "", "(L)")},
+ {0x1f11c, 0, 0, 0, g(Yes, No, false, false, "", "(M)")},
+ {0x1f11d, 0, 0, 0, g(Yes, No, false, false, "", "(N)")},
+ {0x1f11e, 0, 0, 0, g(Yes, No, false, false, "", "(O)")},
+ {0x1f11f, 0, 0, 0, g(Yes, No, false, false, "", "(P)")},
+ {0x1f120, 0, 0, 0, g(Yes, No, false, false, "", "(Q)")},
+ {0x1f121, 0, 0, 0, g(Yes, No, false, false, "", "(R)")},
+ {0x1f122, 0, 0, 0, g(Yes, No, false, false, "", "(S)")},
+ {0x1f123, 0, 0, 0, g(Yes, No, false, false, "", "(T)")},
+ {0x1f124, 0, 0, 0, g(Yes, No, false, false, "", "(U)")},
+ {0x1f125, 0, 0, 0, g(Yes, No, false, false, "", "(V)")},
+ {0x1f126, 0, 0, 0, g(Yes, No, false, false, "", "(W)")},
+ {0x1f127, 0, 0, 0, g(Yes, No, false, false, "", "(X)")},
+ {0x1f128, 0, 0, 0, g(Yes, No, false, false, "", "(Y)")},
+ {0x1f129, 0, 0, 0, g(Yes, No, false, false, "", "(Z)")},
+ {0x1f12a, 0, 0, 0, g(Yes, No, false, false, "", "〔S〕")},
+ {0x1f12b, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1f12c, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1f12d, 0, 0, 0, g(Yes, No, false, false, "", "CD")},
+ {0x1f12e, 0, 0, 0, g(Yes, No, false, false, "", "WZ")},
+ {0x1f12f, 0, 0, 0, f(Yes, false, "")},
+ {0x1f130, 0, 0, 0, g(Yes, No, false, false, "", "A")},
+ {0x1f131, 0, 0, 0, g(Yes, No, false, false, "", "B")},
+ {0x1f132, 0, 0, 0, g(Yes, No, false, false, "", "C")},
+ {0x1f133, 0, 0, 0, g(Yes, No, false, false, "", "D")},
+ {0x1f134, 0, 0, 0, g(Yes, No, false, false, "", "E")},
+ {0x1f135, 0, 0, 0, g(Yes, No, false, false, "", "F")},
+ {0x1f136, 0, 0, 0, g(Yes, No, false, false, "", "G")},
+ {0x1f137, 0, 0, 0, g(Yes, No, false, false, "", "H")},
+ {0x1f138, 0, 0, 0, g(Yes, No, false, false, "", "I")},
+ {0x1f139, 0, 0, 0, g(Yes, No, false, false, "", "J")},
+ {0x1f13a, 0, 0, 0, g(Yes, No, false, false, "", "K")},
+ {0x1f13b, 0, 0, 0, g(Yes, No, false, false, "", "L")},
+ {0x1f13c, 0, 0, 0, g(Yes, No, false, false, "", "M")},
+ {0x1f13d, 0, 0, 0, g(Yes, No, false, false, "", "N")},
+ {0x1f13e, 0, 0, 0, g(Yes, No, false, false, "", "O")},
+ {0x1f13f, 0, 0, 0, g(Yes, No, false, false, "", "P")},
+ {0x1f140, 0, 0, 0, g(Yes, No, false, false, "", "Q")},
+ {0x1f141, 0, 0, 0, g(Yes, No, false, false, "", "R")},
+ {0x1f142, 0, 0, 0, g(Yes, No, false, false, "", "S")},
+ {0x1f143, 0, 0, 0, g(Yes, No, false, false, "", "T")},
+ {0x1f144, 0, 0, 0, g(Yes, No, false, false, "", "U")},
+ {0x1f145, 0, 0, 0, g(Yes, No, false, false, "", "V")},
+ {0x1f146, 0, 0, 0, g(Yes, No, false, false, "", "W")},
+ {0x1f147, 0, 0, 0, g(Yes, No, false, false, "", "X")},
+ {0x1f148, 0, 0, 0, g(Yes, No, false, false, "", "Y")},
+ {0x1f149, 0, 0, 0, g(Yes, No, false, false, "", "Z")},
+ {0x1f14a, 0, 0, 0, g(Yes, No, false, false, "", "HV")},
+ {0x1f14b, 0, 0, 0, g(Yes, No, false, false, "", "MV")},
+ {0x1f14c, 0, 0, 0, g(Yes, No, false, false, "", "SD")},
+ {0x1f14d, 0, 0, 0, g(Yes, No, false, false, "", "SS")},
+ {0x1f14e, 0, 0, 0, g(Yes, No, false, false, "", "PPV")},
+ {0x1f14f, 0, 0, 0, g(Yes, No, false, false, "", "WC")},
+ {0x1f150, 0, 0, 0, f(Yes, false, "")},
+ {0x1f16a, 0, 0, 0, g(Yes, No, false, false, "", "MC")},
+ {0x1f16b, 0, 0, 0, g(Yes, No, false, false, "", "MD")},
+ {0x1f16c, 0, 0, 0, f(Yes, false, "")},
+ {0x1f190, 0, 0, 0, g(Yes, No, false, false, "", "DJ")},
+ {0x1f191, 0, 0, 0, f(Yes, false, "")},
+ {0x1f200, 0, 0, 0, g(Yes, No, false, false, "", "ほか")},
+ {0x1f201, 0, 0, 0, g(Yes, No, false, false, "", "ココ")},
+ {0x1f202, 0, 0, 0, g(Yes, No, false, false, "", "サ")},
+ {0x1f203, 0, 0, 0, f(Yes, false, "")},
+ {0x1f210, 0, 0, 0, g(Yes, No, false, false, "", "手")},
+ {0x1f211, 0, 0, 0, g(Yes, No, false, false, "", "字")},
+ {0x1f212, 0, 0, 0, g(Yes, No, false, false, "", "双")},
+ {0x1f213, 0, 0, 1, g(Yes, No, false, false, "", "デ")},
+ {0x1f214, 0, 0, 0, g(Yes, No, false, false, "", "二")},
+ {0x1f215, 0, 0, 0, g(Yes, No, false, false, "", "多")},
+ {0x1f216, 0, 0, 0, g(Yes, No, false, false, "", "解")},
+ {0x1f217, 0, 0, 0, g(Yes, No, false, false, "", "天")},
+ {0x1f218, 0, 0, 0, g(Yes, No, false, false, "", "交")},
+ {0x1f219, 0, 0, 0, g(Yes, No, false, false, "", "映")},
+ {0x1f21a, 0, 0, 0, g(Yes, No, false, false, "", "無")},
+ {0x1f21b, 0, 0, 0, g(Yes, No, false, false, "", "料")},
+ {0x1f21c, 0, 0, 0, g(Yes, No, false, false, "", "前")},
+ {0x1f21d, 0, 0, 0, g(Yes, No, false, false, "", "後")},
+ {0x1f21e, 0, 0, 0, g(Yes, No, false, false, "", "再")},
+ {0x1f21f, 0, 0, 0, g(Yes, No, false, false, "", "新")},
+ {0x1f220, 0, 0, 0, g(Yes, No, false, false, "", "初")},
+ {0x1f221, 0, 0, 0, g(Yes, No, false, false, "", "終")},
+ {0x1f222, 0, 0, 0, g(Yes, No, false, false, "", "生")},
+ {0x1f223, 0, 0, 0, g(Yes, No, false, false, "", "販")},
+ {0x1f224, 0, 0, 0, g(Yes, No, false, false, "", "声")},
+ {0x1f225, 0, 0, 0, g(Yes, No, false, false, "", "吹")},
+ {0x1f226, 0, 0, 0, g(Yes, No, false, false, "", "演")},
+ {0x1f227, 0, 0, 0, g(Yes, No, false, false, "", "投")},
+ {0x1f228, 0, 0, 0, g(Yes, No, false, false, "", "捕")},
+ {0x1f229, 0, 0, 0, g(Yes, No, false, false, "", "一")},
+ {0x1f22a, 0, 0, 0, g(Yes, No, false, false, "", "三")},
+ {0x1f22b, 0, 0, 0, g(Yes, No, false, false, "", "遊")},
+ {0x1f22c, 0, 0, 0, g(Yes, No, false, false, "", "左")},
+ {0x1f22d, 0, 0, 0, g(Yes, No, false, false, "", "中")},
+ {0x1f22e, 0, 0, 0, g(Yes, No, false, false, "", "右")},
+ {0x1f22f, 0, 0, 0, g(Yes, No, false, false, "", "指")},
+ {0x1f230, 0, 0, 0, g(Yes, No, false, false, "", "走")},
+ {0x1f231, 0, 0, 0, g(Yes, No, false, false, "", "打")},
+ {0x1f232, 0, 0, 0, g(Yes, No, false, false, "", "禁")},
+ {0x1f233, 0, 0, 0, g(Yes, No, false, false, "", "空")},
+ {0x1f234, 0, 0, 0, g(Yes, No, false, false, "", "合")},
+ {0x1f235, 0, 0, 0, g(Yes, No, false, false, "", "満")},
+ {0x1f236, 0, 0, 0, g(Yes, No, false, false, "", "有")},
+ {0x1f237, 0, 0, 0, g(Yes, No, false, false, "", "月")},
+ {0x1f238, 0, 0, 0, g(Yes, No, false, false, "", "申")},
+ {0x1f239, 0, 0, 0, g(Yes, No, false, false, "", "割")},
+ {0x1f23a, 0, 0, 0, g(Yes, No, false, false, "", "営")},
+ {0x1f23b, 0, 0, 0, g(Yes, No, false, false, "", "配")},
+ {0x1f23c, 0, 0, 0, f(Yes, false, "")},
+ {0x1f240, 0, 0, 0, g(Yes, No, false, false, "", "〔本〕")},
+ {0x1f241, 0, 0, 0, g(Yes, No, false, false, "", "〔三〕")},
+ {0x1f242, 0, 0, 0, g(Yes, No, false, false, "", "〔二〕")},
+ {0x1f243, 0, 0, 0, g(Yes, No, false, false, "", "〔安〕")},
+ {0x1f244, 0, 0, 0, g(Yes, No, false, false, "", "〔点〕")},
+ {0x1f245, 0, 0, 0, g(Yes, No, false, false, "", "〔打〕")},
+ {0x1f246, 0, 0, 0, g(Yes, No, false, false, "", "〔盗〕")},
+ {0x1f247, 0, 0, 0, g(Yes, No, false, false, "", "〔勝〕")},
+ {0x1f248, 0, 0, 0, g(Yes, No, false, false, "", "〔敗〕")},
+ {0x1f249, 0, 0, 0, f(Yes, false, "")},
+ {0x1f250, 0, 0, 0, g(Yes, No, false, false, "", "得")},
+ {0x1f251, 0, 0, 0, g(Yes, No, false, false, "", "可")},
+ {0x1f252, 0, 0, 0, f(Yes, false, "")},
+ {0x2f800, 0, 0, 0, f(No, false, "丽")},
+ {0x2f801, 0, 0, 0, f(No, false, "丸")},
+ {0x2f802, 0, 0, 0, f(No, false, "乁")},
+ {0x2f803, 0, 0, 0, f(No, false, "𠄢")},
+ {0x2f804, 0, 0, 0, f(No, false, "你")},
+ {0x2f805, 0, 0, 0, f(No, false, "侮")},
+ {0x2f806, 0, 0, 0, f(No, false, "侻")},
+ {0x2f807, 0, 0, 0, f(No, false, "倂")},
+ {0x2f808, 0, 0, 0, f(No, false, "偺")},
+ {0x2f809, 0, 0, 0, f(No, false, "備")},
+ {0x2f80a, 0, 0, 0, f(No, false, "僧")},
+ {0x2f80b, 0, 0, 0, f(No, false, "像")},
+ {0x2f80c, 0, 0, 0, f(No, false, "㒞")},
+ {0x2f80d, 0, 0, 0, f(No, false, "𠘺")},
+ {0x2f80e, 0, 0, 0, f(No, false, "免")},
+ {0x2f80f, 0, 0, 0, f(No, false, "兔")},
+ {0x2f810, 0, 0, 0, f(No, false, "兤")},
+ {0x2f811, 0, 0, 0, f(No, false, "具")},
+ {0x2f812, 0, 0, 0, f(No, false, "𠔜")},
+ {0x2f813, 0, 0, 0, f(No, false, "㒹")},
+ {0x2f814, 0, 0, 0, f(No, false, "內")},
+ {0x2f815, 0, 0, 0, f(No, false, "再")},
+ {0x2f816, 0, 0, 0, f(No, false, "𠕋")},
+ {0x2f817, 0, 0, 0, f(No, false, "冗")},
+ {0x2f818, 0, 0, 0, f(No, false, "冤")},
+ {0x2f819, 0, 0, 0, f(No, false, "仌")},
+ {0x2f81a, 0, 0, 0, f(No, false, "冬")},
+ {0x2f81b, 0, 0, 0, f(No, false, "况")},
+ {0x2f81c, 0, 0, 0, f(No, false, "𩇟")},
+ {0x2f81d, 0, 0, 0, f(No, false, "凵")},
+ {0x2f81e, 0, 0, 0, f(No, false, "刃")},
+ {0x2f81f, 0, 0, 0, f(No, false, "㓟")},
+ {0x2f820, 0, 0, 0, f(No, false, "刻")},
+ {0x2f821, 0, 0, 0, f(No, false, "剆")},
+ {0x2f822, 0, 0, 0, f(No, false, "割")},
+ {0x2f823, 0, 0, 0, f(No, false, "剷")},
+ {0x2f824, 0, 0, 0, f(No, false, "㔕")},
+ {0x2f825, 0, 0, 0, f(No, false, "勇")},
+ {0x2f826, 0, 0, 0, f(No, false, "勉")},
+ {0x2f827, 0, 0, 0, f(No, false, "勤")},
+ {0x2f828, 0, 0, 0, f(No, false, "勺")},
+ {0x2f829, 0, 0, 0, f(No, false, "包")},
+ {0x2f82a, 0, 0, 0, f(No, false, "匆")},
+ {0x2f82b, 0, 0, 0, f(No, false, "北")},
+ {0x2f82c, 0, 0, 0, f(No, false, "卉")},
+ {0x2f82d, 0, 0, 0, f(No, false, "卑")},
+ {0x2f82e, 0, 0, 0, f(No, false, "博")},
+ {0x2f82f, 0, 0, 0, f(No, false, "即")},
+ {0x2f830, 0, 0, 0, f(No, false, "卽")},
+ {0x2f831, 0, 0, 0, f(No, false, "卿")},
+ {0x2f834, 0, 0, 0, f(No, false, "𠨬")},
+ {0x2f835, 0, 0, 0, f(No, false, "灰")},
+ {0x2f836, 0, 0, 0, f(No, false, "及")},
+ {0x2f837, 0, 0, 0, f(No, false, "叟")},
+ {0x2f838, 0, 0, 0, f(No, false, "𠭣")},
+ {0x2f839, 0, 0, 0, f(No, false, "叫")},
+ {0x2f83a, 0, 0, 0, f(No, false, "叱")},
+ {0x2f83b, 0, 0, 0, f(No, false, "吆")},
+ {0x2f83c, 0, 0, 0, f(No, false, "咞")},
+ {0x2f83d, 0, 0, 0, f(No, false, "吸")},
+ {0x2f83e, 0, 0, 0, f(No, false, "呈")},
+ {0x2f83f, 0, 0, 0, f(No, false, "周")},
+ {0x2f840, 0, 0, 0, f(No, false, "咢")},
+ {0x2f841, 0, 0, 0, f(No, false, "哶")},
+ {0x2f842, 0, 0, 0, f(No, false, "唐")},
+ {0x2f843, 0, 0, 0, f(No, false, "啓")},
+ {0x2f844, 0, 0, 0, f(No, false, "啣")},
+ {0x2f845, 0, 0, 0, f(No, false, "善")},
+ {0x2f847, 0, 0, 0, f(No, false, "喙")},
+ {0x2f848, 0, 0, 0, f(No, false, "喫")},
+ {0x2f849, 0, 0, 0, f(No, false, "喳")},
+ {0x2f84a, 0, 0, 0, f(No, false, "嗂")},
+ {0x2f84b, 0, 0, 0, f(No, false, "圖")},
+ {0x2f84c, 0, 0, 0, f(No, false, "嘆")},
+ {0x2f84d, 0, 0, 0, f(No, false, "圗")},
+ {0x2f84e, 0, 0, 0, f(No, false, "噑")},
+ {0x2f84f, 0, 0, 0, f(No, false, "噴")},
+ {0x2f850, 0, 0, 0, f(No, false, "切")},
+ {0x2f851, 0, 0, 0, f(No, false, "壮")},
+ {0x2f852, 0, 0, 0, f(No, false, "城")},
+ {0x2f853, 0, 0, 0, f(No, false, "埴")},
+ {0x2f854, 0, 0, 0, f(No, false, "堍")},
+ {0x2f855, 0, 0, 0, f(No, false, "型")},
+ {0x2f856, 0, 0, 0, f(No, false, "堲")},
+ {0x2f857, 0, 0, 0, f(No, false, "報")},
+ {0x2f858, 0, 0, 0, f(No, false, "墬")},
+ {0x2f859, 0, 0, 0, f(No, false, "𡓤")},
+ {0x2f85a, 0, 0, 0, f(No, false, "売")},
+ {0x2f85b, 0, 0, 0, f(No, false, "壷")},
+ {0x2f85c, 0, 0, 0, f(No, false, "夆")},
+ {0x2f85d, 0, 0, 0, f(No, false, "多")},
+ {0x2f85e, 0, 0, 0, f(No, false, "夢")},
+ {0x2f85f, 0, 0, 0, f(No, false, "奢")},
+ {0x2f860, 0, 0, 0, f(No, false, "𡚨")},
+ {0x2f861, 0, 0, 0, f(No, false, "𡛪")},
+ {0x2f862, 0, 0, 0, f(No, false, "姬")},
+ {0x2f863, 0, 0, 0, f(No, false, "娛")},
+ {0x2f864, 0, 0, 0, f(No, false, "娧")},
+ {0x2f865, 0, 0, 0, f(No, false, "姘")},
+ {0x2f866, 0, 0, 0, f(No, false, "婦")},
+ {0x2f867, 0, 0, 0, f(No, false, "㛮")},
+ {0x2f868, 0, 0, 0, f(No, false, "㛼")},
+ {0x2f869, 0, 0, 0, f(No, false, "嬈")},
+ {0x2f86a, 0, 0, 0, f(No, false, "嬾")},
+ {0x2f86c, 0, 0, 0, f(No, false, "𡧈")},
+ {0x2f86d, 0, 0, 0, f(No, false, "寃")},
+ {0x2f86e, 0, 0, 0, f(No, false, "寘")},
+ {0x2f86f, 0, 0, 0, f(No, false, "寧")},
+ {0x2f870, 0, 0, 0, f(No, false, "寳")},
+ {0x2f871, 0, 0, 0, f(No, false, "𡬘")},
+ {0x2f872, 0, 0, 0, f(No, false, "寿")},
+ {0x2f873, 0, 0, 0, f(No, false, "将")},
+ {0x2f874, 0, 0, 0, f(No, false, "当")},
+ {0x2f875, 0, 0, 0, f(No, false, "尢")},
+ {0x2f876, 0, 0, 0, f(No, false, "㞁")},
+ {0x2f877, 0, 0, 0, f(No, false, "屠")},
+ {0x2f878, 0, 0, 0, f(No, false, "屮")},
+ {0x2f879, 0, 0, 0, f(No, false, "峀")},
+ {0x2f87a, 0, 0, 0, f(No, false, "岍")},
+ {0x2f87b, 0, 0, 0, f(No, false, "𡷤")},
+ {0x2f87c, 0, 0, 0, f(No, false, "嵃")},
+ {0x2f87d, 0, 0, 0, f(No, false, "𡷦")},
+ {0x2f87e, 0, 0, 0, f(No, false, "嵮")},
+ {0x2f87f, 0, 0, 0, f(No, false, "嵫")},
+ {0x2f880, 0, 0, 0, f(No, false, "嵼")},
+ {0x2f881, 0, 0, 0, f(No, false, "巡")},
+ {0x2f882, 0, 0, 0, f(No, false, "巢")},
+ {0x2f883, 0, 0, 0, f(No, false, "㠯")},
+ {0x2f884, 0, 0, 0, f(No, false, "巽")},
+ {0x2f885, 0, 0, 0, f(No, false, "帨")},
+ {0x2f886, 0, 0, 0, f(No, false, "帽")},
+ {0x2f887, 0, 0, 0, f(No, false, "幩")},
+ {0x2f888, 0, 0, 0, f(No, false, "㡢")},
+ {0x2f889, 0, 0, 0, f(No, false, "𢆃")},
+ {0x2f88a, 0, 0, 0, f(No, false, "㡼")},
+ {0x2f88b, 0, 0, 0, f(No, false, "庰")},
+ {0x2f88c, 0, 0, 0, f(No, false, "庳")},
+ {0x2f88d, 0, 0, 0, f(No, false, "庶")},
+ {0x2f88e, 0, 0, 0, f(No, false, "廊")},
+ {0x2f88f, 0, 0, 0, f(No, false, "𪎒")},
+ {0x2f890, 0, 0, 0, f(No, false, "廾")},
+ {0x2f891, 0, 0, 0, f(No, false, "𢌱")},
+ {0x2f893, 0, 0, 0, f(No, false, "舁")},
+ {0x2f894, 0, 0, 0, f(No, false, "弢")},
+ {0x2f896, 0, 0, 0, f(No, false, "㣇")},
+ {0x2f897, 0, 0, 0, f(No, false, "𣊸")},
+ {0x2f898, 0, 0, 0, f(No, false, "𦇚")},
+ {0x2f899, 0, 0, 0, f(No, false, "形")},
+ {0x2f89a, 0, 0, 0, f(No, false, "彫")},
+ {0x2f89b, 0, 0, 0, f(No, false, "㣣")},
+ {0x2f89c, 0, 0, 0, f(No, false, "徚")},
+ {0x2f89d, 0, 0, 0, f(No, false, "忍")},
+ {0x2f89e, 0, 0, 0, f(No, false, "志")},
+ {0x2f89f, 0, 0, 0, f(No, false, "忹")},
+ {0x2f8a0, 0, 0, 0, f(No, false, "悁")},
+ {0x2f8a1, 0, 0, 0, f(No, false, "㤺")},
+ {0x2f8a2, 0, 0, 0, f(No, false, "㤜")},
+ {0x2f8a3, 0, 0, 0, f(No, false, "悔")},
+ {0x2f8a4, 0, 0, 0, f(No, false, "𢛔")},
+ {0x2f8a5, 0, 0, 0, f(No, false, "惇")},
+ {0x2f8a6, 0, 0, 0, f(No, false, "慈")},
+ {0x2f8a7, 0, 0, 0, f(No, false, "慌")},
+ {0x2f8a8, 0, 0, 0, f(No, false, "慎")},
+ {0x2f8a9, 0, 0, 0, f(No, false, "慌")},
+ {0x2f8aa, 0, 0, 0, f(No, false, "慺")},
+ {0x2f8ab, 0, 0, 0, f(No, false, "憎")},
+ {0x2f8ac, 0, 0, 0, f(No, false, "憲")},
+ {0x2f8ad, 0, 0, 0, f(No, false, "憤")},
+ {0x2f8ae, 0, 0, 0, f(No, false, "憯")},
+ {0x2f8af, 0, 0, 0, f(No, false, "懞")},
+ {0x2f8b0, 0, 0, 0, f(No, false, "懲")},
+ {0x2f8b1, 0, 0, 0, f(No, false, "懶")},
+ {0x2f8b2, 0, 0, 0, f(No, false, "成")},
+ {0x2f8b3, 0, 0, 0, f(No, false, "戛")},
+ {0x2f8b4, 0, 0, 0, f(No, false, "扝")},
+ {0x2f8b5, 0, 0, 0, f(No, false, "抱")},
+ {0x2f8b6, 0, 0, 0, f(No, false, "拔")},
+ {0x2f8b7, 0, 0, 0, f(No, false, "捐")},
+ {0x2f8b8, 0, 0, 0, f(No, false, "𢬌")},
+ {0x2f8b9, 0, 0, 0, f(No, false, "挽")},
+ {0x2f8ba, 0, 0, 0, f(No, false, "拼")},
+ {0x2f8bb, 0, 0, 0, f(No, false, "捨")},
+ {0x2f8bc, 0, 0, 0, f(No, false, "掃")},
+ {0x2f8bd, 0, 0, 0, f(No, false, "揤")},
+ {0x2f8be, 0, 0, 0, f(No, false, "𢯱")},
+ {0x2f8bf, 0, 0, 0, f(No, false, "搢")},
+ {0x2f8c0, 0, 0, 0, f(No, false, "揅")},
+ {0x2f8c1, 0, 0, 0, f(No, false, "掩")},
+ {0x2f8c2, 0, 0, 0, f(No, false, "㨮")},
+ {0x2f8c3, 0, 0, 0, f(No, false, "摩")},
+ {0x2f8c4, 0, 0, 0, f(No, false, "摾")},
+ {0x2f8c5, 0, 0, 0, f(No, false, "撝")},
+ {0x2f8c6, 0, 0, 0, f(No, false, "摷")},
+ {0x2f8c7, 0, 0, 0, f(No, false, "㩬")},
+ {0x2f8c8, 0, 0, 0, f(No, false, "敏")},
+ {0x2f8c9, 0, 0, 0, f(No, false, "敬")},
+ {0x2f8ca, 0, 0, 0, f(No, false, "𣀊")},
+ {0x2f8cb, 0, 0, 0, f(No, false, "旣")},
+ {0x2f8cc, 0, 0, 0, f(No, false, "書")},
+ {0x2f8cd, 0, 0, 0, f(No, false, "晉")},
+ {0x2f8ce, 0, 0, 0, f(No, false, "㬙")},
+ {0x2f8cf, 0, 0, 0, f(No, false, "暑")},
+ {0x2f8d0, 0, 0, 0, f(No, false, "㬈")},
+ {0x2f8d1, 0, 0, 0, f(No, false, "㫤")},
+ {0x2f8d2, 0, 0, 0, f(No, false, "冒")},
+ {0x2f8d3, 0, 0, 0, f(No, false, "冕")},
+ {0x2f8d4, 0, 0, 0, f(No, false, "最")},
+ {0x2f8d5, 0, 0, 0, f(No, false, "暜")},
+ {0x2f8d6, 0, 0, 0, f(No, false, "肭")},
+ {0x2f8d7, 0, 0, 0, f(No, false, "䏙")},
+ {0x2f8d8, 0, 0, 0, f(No, false, "朗")},
+ {0x2f8d9, 0, 0, 0, f(No, false, "望")},
+ {0x2f8da, 0, 0, 0, f(No, false, "朡")},
+ {0x2f8db, 0, 0, 0, f(No, false, "杞")},
+ {0x2f8dc, 0, 0, 0, f(No, false, "杓")},
+ {0x2f8dd, 0, 0, 0, f(No, false, "𣏃")},
+ {0x2f8de, 0, 0, 0, f(No, false, "㭉")},
+ {0x2f8df, 0, 0, 0, f(No, false, "柺")},
+ {0x2f8e0, 0, 0, 0, f(No, false, "枅")},
+ {0x2f8e1, 0, 0, 0, f(No, false, "桒")},
+ {0x2f8e2, 0, 0, 0, f(No, false, "梅")},
+ {0x2f8e3, 0, 0, 0, f(No, false, "𣑭")},
+ {0x2f8e4, 0, 0, 0, f(No, false, "梎")},
+ {0x2f8e5, 0, 0, 0, f(No, false, "栟")},
+ {0x2f8e6, 0, 0, 0, f(No, false, "椔")},
+ {0x2f8e7, 0, 0, 0, f(No, false, "㮝")},
+ {0x2f8e8, 0, 0, 0, f(No, false, "楂")},
+ {0x2f8e9, 0, 0, 0, f(No, false, "榣")},
+ {0x2f8ea, 0, 0, 0, f(No, false, "槪")},
+ {0x2f8eb, 0, 0, 0, f(No, false, "檨")},
+ {0x2f8ec, 0, 0, 0, f(No, false, "𣚣")},
+ {0x2f8ed, 0, 0, 0, f(No, false, "櫛")},
+ {0x2f8ee, 0, 0, 0, f(No, false, "㰘")},
+ {0x2f8ef, 0, 0, 0, f(No, false, "次")},
+ {0x2f8f0, 0, 0, 0, f(No, false, "𣢧")},
+ {0x2f8f1, 0, 0, 0, f(No, false, "歔")},
+ {0x2f8f2, 0, 0, 0, f(No, false, "㱎")},
+ {0x2f8f3, 0, 0, 0, f(No, false, "歲")},
+ {0x2f8f4, 0, 0, 0, f(No, false, "殟")},
+ {0x2f8f5, 0, 0, 0, f(No, false, "殺")},
+ {0x2f8f6, 0, 0, 0, f(No, false, "殻")},
+ {0x2f8f7, 0, 0, 0, f(No, false, "𣪍")},
+ {0x2f8f8, 0, 0, 0, f(No, false, "𡴋")},
+ {0x2f8f9, 0, 0, 0, f(No, false, "𣫺")},
+ {0x2f8fa, 0, 0, 0, f(No, false, "汎")},
+ {0x2f8fb, 0, 0, 0, f(No, false, "𣲼")},
+ {0x2f8fc, 0, 0, 0, f(No, false, "沿")},
+ {0x2f8fd, 0, 0, 0, f(No, false, "泍")},
+ {0x2f8fe, 0, 0, 0, f(No, false, "汧")},
+ {0x2f8ff, 0, 0, 0, f(No, false, "洖")},
+ {0x2f900, 0, 0, 0, f(No, false, "派")},
+ {0x2f901, 0, 0, 0, f(No, false, "海")},
+ {0x2f902, 0, 0, 0, f(No, false, "流")},
+ {0x2f903, 0, 0, 0, f(No, false, "浩")},
+ {0x2f904, 0, 0, 0, f(No, false, "浸")},
+ {0x2f905, 0, 0, 0, f(No, false, "涅")},
+ {0x2f906, 0, 0, 0, f(No, false, "𣴞")},
+ {0x2f907, 0, 0, 0, f(No, false, "洴")},
+ {0x2f908, 0, 0, 0, f(No, false, "港")},
+ {0x2f909, 0, 0, 0, f(No, false, "湮")},
+ {0x2f90a, 0, 0, 0, f(No, false, "㴳")},
+ {0x2f90b, 0, 0, 0, f(No, false, "滋")},
+ {0x2f90c, 0, 0, 0, f(No, false, "滇")},
+ {0x2f90d, 0, 0, 0, f(No, false, "𣻑")},
+ {0x2f90e, 0, 0, 0, f(No, false, "淹")},
+ {0x2f90f, 0, 0, 0, f(No, false, "潮")},
+ {0x2f910, 0, 0, 0, f(No, false, "𣽞")},
+ {0x2f911, 0, 0, 0, f(No, false, "𣾎")},
+ {0x2f912, 0, 0, 0, f(No, false, "濆")},
+ {0x2f913, 0, 0, 0, f(No, false, "瀹")},
+ {0x2f914, 0, 0, 0, f(No, false, "瀞")},
+ {0x2f915, 0, 0, 0, f(No, false, "瀛")},
+ {0x2f916, 0, 0, 0, f(No, false, "㶖")},
+ {0x2f917, 0, 0, 0, f(No, false, "灊")},
+ {0x2f918, 0, 0, 0, f(No, false, "災")},
+ {0x2f919, 0, 0, 0, f(No, false, "灷")},
+ {0x2f91a, 0, 0, 0, f(No, false, "炭")},
+ {0x2f91b, 0, 0, 0, f(No, false, "𠔥")},
+ {0x2f91c, 0, 0, 0, f(No, false, "煅")},
+ {0x2f91d, 0, 0, 0, f(No, false, "𤉣")},
+ {0x2f91e, 0, 0, 0, f(No, false, "熜")},
+ {0x2f91f, 0, 0, 0, f(No, false, "𤎫")},
+ {0x2f920, 0, 0, 0, f(No, false, "爨")},
+ {0x2f921, 0, 0, 0, f(No, false, "爵")},
+ {0x2f922, 0, 0, 0, f(No, false, "牐")},
+ {0x2f923, 0, 0, 0, f(No, false, "𤘈")},
+ {0x2f924, 0, 0, 0, f(No, false, "犀")},
+ {0x2f925, 0, 0, 0, f(No, false, "犕")},
+ {0x2f926, 0, 0, 0, f(No, false, "𤜵")},
+ {0x2f927, 0, 0, 0, f(No, false, "𤠔")},
+ {0x2f928, 0, 0, 0, f(No, false, "獺")},
+ {0x2f929, 0, 0, 0, f(No, false, "王")},
+ {0x2f92a, 0, 0, 0, f(No, false, "㺬")},
+ {0x2f92b, 0, 0, 0, f(No, false, "玥")},
+ {0x2f92c, 0, 0, 0, f(No, false, "㺸")},
+ {0x2f92e, 0, 0, 0, f(No, false, "瑇")},
+ {0x2f92f, 0, 0, 0, f(No, false, "瑜")},
+ {0x2f930, 0, 0, 0, f(No, false, "瑱")},
+ {0x2f931, 0, 0, 0, f(No, false, "璅")},
+ {0x2f932, 0, 0, 0, f(No, false, "瓊")},
+ {0x2f933, 0, 0, 0, f(No, false, "㼛")},
+ {0x2f934, 0, 0, 0, f(No, false, "甤")},
+ {0x2f935, 0, 0, 0, f(No, false, "𤰶")},
+ {0x2f936, 0, 0, 0, f(No, false, "甾")},
+ {0x2f937, 0, 0, 0, f(No, false, "𤲒")},
+ {0x2f938, 0, 0, 0, f(No, false, "異")},
+ {0x2f939, 0, 0, 0, f(No, false, "𢆟")},
+ {0x2f93a, 0, 0, 0, f(No, false, "瘐")},
+ {0x2f93b, 0, 0, 0, f(No, false, "𤾡")},
+ {0x2f93c, 0, 0, 0, f(No, false, "𤾸")},
+ {0x2f93d, 0, 0, 0, f(No, false, "𥁄")},
+ {0x2f93e, 0, 0, 0, f(No, false, "㿼")},
+ {0x2f93f, 0, 0, 0, f(No, false, "䀈")},
+ {0x2f940, 0, 0, 0, f(No, false, "直")},
+ {0x2f941, 0, 0, 0, f(No, false, "𥃳")},
+ {0x2f942, 0, 0, 0, f(No, false, "𥃲")},
+ {0x2f943, 0, 0, 0, f(No, false, "𥄙")},
+ {0x2f944, 0, 0, 0, f(No, false, "𥄳")},
+ {0x2f945, 0, 0, 0, f(No, false, "眞")},
+ {0x2f946, 0, 0, 0, f(No, false, "真")},
+ {0x2f948, 0, 0, 0, f(No, false, "睊")},
+ {0x2f949, 0, 0, 0, f(No, false, "䀹")},
+ {0x2f94a, 0, 0, 0, f(No, false, "瞋")},
+ {0x2f94b, 0, 0, 0, f(No, false, "䁆")},
+ {0x2f94c, 0, 0, 0, f(No, false, "䂖")},
+ {0x2f94d, 0, 0, 0, f(No, false, "𥐝")},
+ {0x2f94e, 0, 0, 0, f(No, false, "硎")},
+ {0x2f94f, 0, 0, 0, f(No, false, "碌")},
+ {0x2f950, 0, 0, 0, f(No, false, "磌")},
+ {0x2f951, 0, 0, 0, f(No, false, "䃣")},
+ {0x2f952, 0, 0, 0, f(No, false, "𥘦")},
+ {0x2f953, 0, 0, 0, f(No, false, "祖")},
+ {0x2f954, 0, 0, 0, f(No, false, "𥚚")},
+ {0x2f955, 0, 0, 0, f(No, false, "𥛅")},
+ {0x2f956, 0, 0, 0, f(No, false, "福")},
+ {0x2f957, 0, 0, 0, f(No, false, "秫")},
+ {0x2f958, 0, 0, 0, f(No, false, "䄯")},
+ {0x2f959, 0, 0, 0, f(No, false, "穀")},
+ {0x2f95a, 0, 0, 0, f(No, false, "穊")},
+ {0x2f95b, 0, 0, 0, f(No, false, "穏")},
+ {0x2f95c, 0, 0, 0, f(No, false, "𥥼")},
+ {0x2f95d, 0, 0, 0, f(No, false, "𥪧")},
+ {0x2f95f, 0, 0, 0, f(No, false, "竮")},
+ {0x2f960, 0, 0, 0, f(No, false, "䈂")},
+ {0x2f961, 0, 0, 0, f(No, false, "𥮫")},
+ {0x2f962, 0, 0, 0, f(No, false, "篆")},
+ {0x2f963, 0, 0, 0, f(No, false, "築")},
+ {0x2f964, 0, 0, 0, f(No, false, "䈧")},
+ {0x2f965, 0, 0, 0, f(No, false, "𥲀")},
+ {0x2f966, 0, 0, 0, f(No, false, "糒")},
+ {0x2f967, 0, 0, 0, f(No, false, "䊠")},
+ {0x2f968, 0, 0, 0, f(No, false, "糨")},
+ {0x2f969, 0, 0, 0, f(No, false, "糣")},
+ {0x2f96a, 0, 0, 0, f(No, false, "紀")},
+ {0x2f96b, 0, 0, 0, f(No, false, "𥾆")},
+ {0x2f96c, 0, 0, 0, f(No, false, "絣")},
+ {0x2f96d, 0, 0, 0, f(No, false, "䌁")},
+ {0x2f96e, 0, 0, 0, f(No, false, "緇")},
+ {0x2f96f, 0, 0, 0, f(No, false, "縂")},
+ {0x2f970, 0, 0, 0, f(No, false, "繅")},
+ {0x2f971, 0, 0, 0, f(No, false, "䌴")},
+ {0x2f972, 0, 0, 0, f(No, false, "𦈨")},
+ {0x2f973, 0, 0, 0, f(No, false, "𦉇")},
+ {0x2f974, 0, 0, 0, f(No, false, "䍙")},
+ {0x2f975, 0, 0, 0, f(No, false, "𦋙")},
+ {0x2f976, 0, 0, 0, f(No, false, "罺")},
+ {0x2f977, 0, 0, 0, f(No, false, "𦌾")},
+ {0x2f978, 0, 0, 0, f(No, false, "羕")},
+ {0x2f979, 0, 0, 0, f(No, false, "翺")},
+ {0x2f97a, 0, 0, 0, f(No, false, "者")},
+ {0x2f97b, 0, 0, 0, f(No, false, "𦓚")},
+ {0x2f97c, 0, 0, 0, f(No, false, "𦔣")},
+ {0x2f97d, 0, 0, 0, f(No, false, "聠")},
+ {0x2f97e, 0, 0, 0, f(No, false, "𦖨")},
+ {0x2f97f, 0, 0, 0, f(No, false, "聰")},
+ {0x2f980, 0, 0, 0, f(No, false, "𣍟")},
+ {0x2f981, 0, 0, 0, f(No, false, "䏕")},
+ {0x2f982, 0, 0, 0, f(No, false, "育")},
+ {0x2f983, 0, 0, 0, f(No, false, "脃")},
+ {0x2f984, 0, 0, 0, f(No, false, "䐋")},
+ {0x2f985, 0, 0, 0, f(No, false, "脾")},
+ {0x2f986, 0, 0, 0, f(No, false, "媵")},
+ {0x2f987, 0, 0, 0, f(No, false, "𦞧")},
+ {0x2f988, 0, 0, 0, f(No, false, "𦞵")},
+ {0x2f989, 0, 0, 0, f(No, false, "𣎓")},
+ {0x2f98a, 0, 0, 0, f(No, false, "𣎜")},
+ {0x2f98b, 0, 0, 0, f(No, false, "舁")},
+ {0x2f98c, 0, 0, 0, f(No, false, "舄")},
+ {0x2f98d, 0, 0, 0, f(No, false, "辞")},
+ {0x2f98e, 0, 0, 0, f(No, false, "䑫")},
+ {0x2f98f, 0, 0, 0, f(No, false, "芑")},
+ {0x2f990, 0, 0, 0, f(No, false, "芋")},
+ {0x2f991, 0, 0, 0, f(No, false, "芝")},
+ {0x2f992, 0, 0, 0, f(No, false, "劳")},
+ {0x2f993, 0, 0, 0, f(No, false, "花")},
+ {0x2f994, 0, 0, 0, f(No, false, "芳")},
+ {0x2f995, 0, 0, 0, f(No, false, "芽")},
+ {0x2f996, 0, 0, 0, f(No, false, "苦")},
+ {0x2f997, 0, 0, 0, f(No, false, "𦬼")},
+ {0x2f998, 0, 0, 0, f(No, false, "若")},
+ {0x2f999, 0, 0, 0, f(No, false, "茝")},
+ {0x2f99a, 0, 0, 0, f(No, false, "荣")},
+ {0x2f99b, 0, 0, 0, f(No, false, "莭")},
+ {0x2f99c, 0, 0, 0, f(No, false, "茣")},
+ {0x2f99d, 0, 0, 0, f(No, false, "莽")},
+ {0x2f99e, 0, 0, 0, f(No, false, "菧")},
+ {0x2f99f, 0, 0, 0, f(No, false, "著")},
+ {0x2f9a0, 0, 0, 0, f(No, false, "荓")},
+ {0x2f9a1, 0, 0, 0, f(No, false, "菊")},
+ {0x2f9a2, 0, 0, 0, f(No, false, "菌")},
+ {0x2f9a3, 0, 0, 0, f(No, false, "菜")},
+ {0x2f9a4, 0, 0, 0, f(No, false, "𦰶")},
+ {0x2f9a5, 0, 0, 0, f(No, false, "𦵫")},
+ {0x2f9a6, 0, 0, 0, f(No, false, "𦳕")},
+ {0x2f9a7, 0, 0, 0, f(No, false, "䔫")},
+ {0x2f9a8, 0, 0, 0, f(No, false, "蓱")},
+ {0x2f9a9, 0, 0, 0, f(No, false, "蓳")},
+ {0x2f9aa, 0, 0, 0, f(No, false, "蔖")},
+ {0x2f9ab, 0, 0, 0, f(No, false, "𧏊")},
+ {0x2f9ac, 0, 0, 0, f(No, false, "蕤")},
+ {0x2f9ad, 0, 0, 0, f(No, false, "𦼬")},
+ {0x2f9ae, 0, 0, 0, f(No, false, "䕝")},
+ {0x2f9af, 0, 0, 0, f(No, false, "䕡")},
+ {0x2f9b0, 0, 0, 0, f(No, false, "𦾱")},
+ {0x2f9b1, 0, 0, 0, f(No, false, "𧃒")},
+ {0x2f9b2, 0, 0, 0, f(No, false, "䕫")},
+ {0x2f9b3, 0, 0, 0, f(No, false, "虐")},
+ {0x2f9b4, 0, 0, 0, f(No, false, "虜")},
+ {0x2f9b5, 0, 0, 0, f(No, false, "虧")},
+ {0x2f9b6, 0, 0, 0, f(No, false, "虩")},
+ {0x2f9b7, 0, 0, 0, f(No, false, "蚩")},
+ {0x2f9b8, 0, 0, 0, f(No, false, "蚈")},
+ {0x2f9b9, 0, 0, 0, f(No, false, "蜎")},
+ {0x2f9ba, 0, 0, 0, f(No, false, "蛢")},
+ {0x2f9bb, 0, 0, 0, f(No, false, "蝹")},
+ {0x2f9bc, 0, 0, 0, f(No, false, "蜨")},
+ {0x2f9bd, 0, 0, 0, f(No, false, "蝫")},
+ {0x2f9be, 0, 0, 0, f(No, false, "螆")},
+ {0x2f9bf, 0, 0, 0, f(No, false, "䗗")},
+ {0x2f9c0, 0, 0, 0, f(No, false, "蟡")},
+ {0x2f9c1, 0, 0, 0, f(No, false, "蠁")},
+ {0x2f9c2, 0, 0, 0, f(No, false, "䗹")},
+ {0x2f9c3, 0, 0, 0, f(No, false, "衠")},
+ {0x2f9c4, 0, 0, 0, f(No, false, "衣")},
+ {0x2f9c5, 0, 0, 0, f(No, false, "𧙧")},
+ {0x2f9c6, 0, 0, 0, f(No, false, "裗")},
+ {0x2f9c7, 0, 0, 0, f(No, false, "裞")},
+ {0x2f9c8, 0, 0, 0, f(No, false, "䘵")},
+ {0x2f9c9, 0, 0, 0, f(No, false, "裺")},
+ {0x2f9ca, 0, 0, 0, f(No, false, "㒻")},
+ {0x2f9cb, 0, 0, 0, f(No, false, "𧢮")},
+ {0x2f9cc, 0, 0, 0, f(No, false, "𧥦")},
+ {0x2f9cd, 0, 0, 0, f(No, false, "䚾")},
+ {0x2f9ce, 0, 0, 0, f(No, false, "䛇")},
+ {0x2f9cf, 0, 0, 0, f(No, false, "誠")},
+ {0x2f9d0, 0, 0, 0, f(No, false, "諭")},
+ {0x2f9d1, 0, 0, 0, f(No, false, "變")},
+ {0x2f9d2, 0, 0, 0, f(No, false, "豕")},
+ {0x2f9d3, 0, 0, 0, f(No, false, "𧲨")},
+ {0x2f9d4, 0, 0, 0, f(No, false, "貫")},
+ {0x2f9d5, 0, 0, 0, f(No, false, "賁")},
+ {0x2f9d6, 0, 0, 0, f(No, false, "贛")},
+ {0x2f9d7, 0, 0, 0, f(No, false, "起")},
+ {0x2f9d8, 0, 0, 0, f(No, false, "𧼯")},
+ {0x2f9d9, 0, 0, 0, f(No, false, "𠠄")},
+ {0x2f9da, 0, 0, 0, f(No, false, "跋")},
+ {0x2f9db, 0, 0, 0, f(No, false, "趼")},
+ {0x2f9dc, 0, 0, 0, f(No, false, "跰")},
+ {0x2f9dd, 0, 0, 0, f(No, false, "𠣞")},
+ {0x2f9de, 0, 0, 0, f(No, false, "軔")},
+ {0x2f9df, 0, 0, 0, f(No, false, "輸")},
+ {0x2f9e0, 0, 0, 0, f(No, false, "𨗒")},
+ {0x2f9e1, 0, 0, 0, f(No, false, "𨗭")},
+ {0x2f9e2, 0, 0, 0, f(No, false, "邔")},
+ {0x2f9e3, 0, 0, 0, f(No, false, "郱")},
+ {0x2f9e4, 0, 0, 0, f(No, false, "鄑")},
+ {0x2f9e5, 0, 0, 0, f(No, false, "𨜮")},
+ {0x2f9e6, 0, 0, 0, f(No, false, "鄛")},
+ {0x2f9e7, 0, 0, 0, f(No, false, "鈸")},
+ {0x2f9e8, 0, 0, 0, f(No, false, "鋗")},
+ {0x2f9e9, 0, 0, 0, f(No, false, "鋘")},
+ {0x2f9ea, 0, 0, 0, f(No, false, "鉼")},
+ {0x2f9eb, 0, 0, 0, f(No, false, "鏹")},
+ {0x2f9ec, 0, 0, 0, f(No, false, "鐕")},
+ {0x2f9ed, 0, 0, 0, f(No, false, "𨯺")},
+ {0x2f9ee, 0, 0, 0, f(No, false, "開")},
+ {0x2f9ef, 0, 0, 0, f(No, false, "䦕")},
+ {0x2f9f0, 0, 0, 0, f(No, false, "閷")},
+ {0x2f9f1, 0, 0, 0, f(No, false, "𨵷")},
+ {0x2f9f2, 0, 0, 0, f(No, false, "䧦")},
+ {0x2f9f3, 0, 0, 0, f(No, false, "雃")},
+ {0x2f9f4, 0, 0, 0, f(No, false, "嶲")},
+ {0x2f9f5, 0, 0, 0, f(No, false, "霣")},
+ {0x2f9f6, 0, 0, 0, f(No, false, "𩅅")},
+ {0x2f9f7, 0, 0, 0, f(No, false, "𩈚")},
+ {0x2f9f8, 0, 0, 0, f(No, false, "䩮")},
+ {0x2f9f9, 0, 0, 0, f(No, false, "䩶")},
+ {0x2f9fa, 0, 0, 0, f(No, false, "韠")},
+ {0x2f9fb, 0, 0, 0, f(No, false, "𩐊")},
+ {0x2f9fc, 0, 0, 0, f(No, false, "䪲")},
+ {0x2f9fd, 0, 0, 0, f(No, false, "𩒖")},
+ {0x2f9fe, 0, 0, 0, f(No, false, "頋")},
+ {0x2fa00, 0, 0, 0, f(No, false, "頩")},
+ {0x2fa01, 0, 0, 0, f(No, false, "𩖶")},
+ {0x2fa02, 0, 0, 0, f(No, false, "飢")},
+ {0x2fa03, 0, 0, 0, f(No, false, "䬳")},
+ {0x2fa04, 0, 0, 0, f(No, false, "餩")},
+ {0x2fa05, 0, 0, 0, f(No, false, "馧")},
+ {0x2fa06, 0, 0, 0, f(No, false, "駂")},
+ {0x2fa07, 0, 0, 0, f(No, false, "駾")},
+ {0x2fa08, 0, 0, 0, f(No, false, "䯎")},
+ {0x2fa09, 0, 0, 0, f(No, false, "𩬰")},
+ {0x2fa0a, 0, 0, 0, f(No, false, "鬒")},
+ {0x2fa0b, 0, 0, 0, f(No, false, "鱀")},
+ {0x2fa0c, 0, 0, 0, f(No, false, "鳽")},
+ {0x2fa0d, 0, 0, 0, f(No, false, "䳎")},
+ {0x2fa0e, 0, 0, 0, f(No, false, "䳭")},
+ {0x2fa0f, 0, 0, 0, f(No, false, "鵧")},
+ {0x2fa10, 0, 0, 0, f(No, false, "𪃎")},
+ {0x2fa11, 0, 0, 0, f(No, false, "䳸")},
+ {0x2fa12, 0, 0, 0, f(No, false, "𪄅")},
+ {0x2fa13, 0, 0, 0, f(No, false, "𪈎")},
+ {0x2fa14, 0, 0, 0, f(No, false, "𪊑")},
+ {0x2fa15, 0, 0, 0, f(No, false, "麻")},
+ {0x2fa16, 0, 0, 0, f(No, false, "䵖")},
+ {0x2fa17, 0, 0, 0, f(No, false, "黹")},
+ {0x2fa18, 0, 0, 0, f(No, false, "黾")},
+ {0x2fa19, 0, 0, 0, f(No, false, "鼅")},
+ {0x2fa1a, 0, 0, 0, f(No, false, "鼏")},
+ {0x2fa1b, 0, 0, 0, f(No, false, "鼖")},
+ {0x2fa1c, 0, 0, 0, f(No, false, "鼻")},
+ {0x2fa1d, 0, 0, 0, f(No, false, "𪘀")},
+ {0x2fa1e, 0, 0, 0, f(Yes, false, "")},
+}
diff --git a/vendor/golang.org/x/text/unicode/norm/maketables.go b/vendor/golang.org/x/text/unicode/norm/maketables.go
index 8d41816..338c395 100644
--- a/vendor/golang.org/x/text/unicode/norm/maketables.go
+++ b/vendor/golang.org/x/text/unicode/norm/maketables.go
@@ -795,7 +795,7 @@ func makeTables() {
}
fmt.Fprintf(w, "// Total size of tables: %dKB (%d bytes)\n", (size+512)/1024, size)
- gen.WriteGoFile("tables.go", "norm", w.Bytes())
+ gen.WriteVersionedGoFile("tables.go", "norm", w.Bytes())
}
func printChars() {
@@ -972,5 +972,5 @@ func printTestdata() {
}
}
fmt.Fprintln(w, "}")
- gen.WriteGoFile("data_test.go", "norm", w.Bytes())
+ gen.WriteVersionedGoFile("data_test.go", "norm", w.Bytes())
}
diff --git a/vendor/golang.org/x/text/unicode/norm/norm_test.go b/vendor/golang.org/x/text/unicode/norm/norm_test.go
deleted file mode 100644
index 12dacfc..0000000
--- a/vendor/golang.org/x/text/unicode/norm/norm_test.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// 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 norm_test
-
-import (
- "testing"
-)
-
-func TestPlaceHolder(t *testing.T) {
- // Does nothing, just allows the Makefile to be canonical
- // while waiting for the package itself to be written.
-}
diff --git a/vendor/golang.org/x/text/unicode/norm/normalize_test.go b/vendor/golang.org/x/text/unicode/norm/normalize_test.go
index 4f83737..e3c0ac7 100644
--- a/vendor/golang.org/x/text/unicode/norm/normalize_test.go
+++ b/vendor/golang.org/x/text/unicode/norm/normalize_test.go
@@ -720,7 +720,7 @@ var appendTestsNFC = []AppendTest{
}
var appendTestsNFD = []AppendTest{
-// TODO: Move some of the tests here.
+ // TODO: Move some of the tests here.
}
var appendTestsNFKC = []AppendTest{
diff --git a/vendor/golang.org/x/text/unicode/norm/tables.go b/vendor/golang.org/x/text/unicode/norm/tables10.0.0.go
similarity index 99%
rename from vendor/golang.org/x/text/unicode/norm/tables.go
rename to vendor/golang.org/x/text/unicode/norm/tables10.0.0.go
index 316b093..44dd397 100644
--- a/vendor/golang.org/x/text/unicode/norm/tables.go
+++ b/vendor/golang.org/x/text/unicode/norm/tables10.0.0.go
@@ -1,5 +1,7 @@
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+// +build go1.10
+
package norm
const (
diff --git a/vendor/golang.org/x/text/unicode/norm/tables9.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables9.0.0.go
new file mode 100644
index 0000000..a01274a
--- /dev/null
+++ b/vendor/golang.org/x/text/unicode/norm/tables9.0.0.go
@@ -0,0 +1,7633 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+// +build !go1.10
+
+package norm
+
+const (
+ // Version is the Unicode edition from which the tables are derived.
+ Version = "9.0.0"
+
+ // MaxTransformChunkSize indicates the maximum number of bytes that Transform
+ // may need to write atomically for any Form. Making a destination buffer at
+ // least this size ensures that Transform can always make progress and that
+ // the user does not need to grow the buffer on an ErrShortDst.
+ MaxTransformChunkSize = 35 + maxNonStarters*4
+)
+
+var ccc = [55]uint8{
+ 0, 1, 7, 8, 9, 10, 11, 12,
+ 13, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 25, 26, 27, 28,
+ 29, 30, 31, 32, 33, 34, 35, 36,
+ 84, 91, 103, 107, 118, 122, 129, 130,
+ 132, 202, 214, 216, 218, 220, 222, 224,
+ 226, 228, 230, 232, 233, 234, 240,
+}
+
+const (
+ firstMulti = 0x186D
+ firstCCC = 0x2C9E
+ endMulti = 0x2F60
+ firstLeadingCCC = 0x49AE
+ firstCCCZeroExcept = 0x4A78
+ firstStarterWithNLead = 0x4A9F
+ lastDecomp = 0x4AA1
+ maxDecomp = 0x8000
+)
+
+// decomps: 19105 bytes
+var decomps = [...]byte{
+ // Bytes 0 - 3f
+ 0x00, 0x41, 0x20, 0x41, 0x21, 0x41, 0x22, 0x41,
+ 0x23, 0x41, 0x24, 0x41, 0x25, 0x41, 0x26, 0x41,
+ 0x27, 0x41, 0x28, 0x41, 0x29, 0x41, 0x2A, 0x41,
+ 0x2B, 0x41, 0x2C, 0x41, 0x2D, 0x41, 0x2E, 0x41,
+ 0x2F, 0x41, 0x30, 0x41, 0x31, 0x41, 0x32, 0x41,
+ 0x33, 0x41, 0x34, 0x41, 0x35, 0x41, 0x36, 0x41,
+ 0x37, 0x41, 0x38, 0x41, 0x39, 0x41, 0x3A, 0x41,
+ 0x3B, 0x41, 0x3C, 0x41, 0x3D, 0x41, 0x3E, 0x41,
+ // Bytes 40 - 7f
+ 0x3F, 0x41, 0x40, 0x41, 0x41, 0x41, 0x42, 0x41,
+ 0x43, 0x41, 0x44, 0x41, 0x45, 0x41, 0x46, 0x41,
+ 0x47, 0x41, 0x48, 0x41, 0x49, 0x41, 0x4A, 0x41,
+ 0x4B, 0x41, 0x4C, 0x41, 0x4D, 0x41, 0x4E, 0x41,
+ 0x4F, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41,
+ 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41,
+ 0x57, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x41,
+ 0x5B, 0x41, 0x5C, 0x41, 0x5D, 0x41, 0x5E, 0x41,
+ // Bytes 80 - bf
+ 0x5F, 0x41, 0x60, 0x41, 0x61, 0x41, 0x62, 0x41,
+ 0x63, 0x41, 0x64, 0x41, 0x65, 0x41, 0x66, 0x41,
+ 0x67, 0x41, 0x68, 0x41, 0x69, 0x41, 0x6A, 0x41,
+ 0x6B, 0x41, 0x6C, 0x41, 0x6D, 0x41, 0x6E, 0x41,
+ 0x6F, 0x41, 0x70, 0x41, 0x71, 0x41, 0x72, 0x41,
+ 0x73, 0x41, 0x74, 0x41, 0x75, 0x41, 0x76, 0x41,
+ 0x77, 0x41, 0x78, 0x41, 0x79, 0x41, 0x7A, 0x41,
+ 0x7B, 0x41, 0x7C, 0x41, 0x7D, 0x41, 0x7E, 0x42,
+ // Bytes c0 - ff
+ 0xC2, 0xA2, 0x42, 0xC2, 0xA3, 0x42, 0xC2, 0xA5,
+ 0x42, 0xC2, 0xA6, 0x42, 0xC2, 0xAC, 0x42, 0xC2,
+ 0xB7, 0x42, 0xC3, 0x86, 0x42, 0xC3, 0xB0, 0x42,
+ 0xC4, 0xA6, 0x42, 0xC4, 0xA7, 0x42, 0xC4, 0xB1,
+ 0x42, 0xC5, 0x8B, 0x42, 0xC5, 0x93, 0x42, 0xC6,
+ 0x8E, 0x42, 0xC6, 0x90, 0x42, 0xC6, 0xAB, 0x42,
+ 0xC8, 0xA2, 0x42, 0xC8, 0xB7, 0x42, 0xC9, 0x90,
+ 0x42, 0xC9, 0x91, 0x42, 0xC9, 0x92, 0x42, 0xC9,
+ // Bytes 100 - 13f
+ 0x94, 0x42, 0xC9, 0x95, 0x42, 0xC9, 0x99, 0x42,
+ 0xC9, 0x9B, 0x42, 0xC9, 0x9C, 0x42, 0xC9, 0x9F,
+ 0x42, 0xC9, 0xA1, 0x42, 0xC9, 0xA3, 0x42, 0xC9,
+ 0xA5, 0x42, 0xC9, 0xA6, 0x42, 0xC9, 0xA8, 0x42,
+ 0xC9, 0xA9, 0x42, 0xC9, 0xAA, 0x42, 0xC9, 0xAB,
+ 0x42, 0xC9, 0xAD, 0x42, 0xC9, 0xAF, 0x42, 0xC9,
+ 0xB0, 0x42, 0xC9, 0xB1, 0x42, 0xC9, 0xB2, 0x42,
+ 0xC9, 0xB3, 0x42, 0xC9, 0xB4, 0x42, 0xC9, 0xB5,
+ // Bytes 140 - 17f
+ 0x42, 0xC9, 0xB8, 0x42, 0xC9, 0xB9, 0x42, 0xC9,
+ 0xBB, 0x42, 0xCA, 0x81, 0x42, 0xCA, 0x82, 0x42,
+ 0xCA, 0x83, 0x42, 0xCA, 0x89, 0x42, 0xCA, 0x8A,
+ 0x42, 0xCA, 0x8B, 0x42, 0xCA, 0x8C, 0x42, 0xCA,
+ 0x90, 0x42, 0xCA, 0x91, 0x42, 0xCA, 0x92, 0x42,
+ 0xCA, 0x95, 0x42, 0xCA, 0x9D, 0x42, 0xCA, 0x9F,
+ 0x42, 0xCA, 0xB9, 0x42, 0xCE, 0x91, 0x42, 0xCE,
+ 0x92, 0x42, 0xCE, 0x93, 0x42, 0xCE, 0x94, 0x42,
+ // Bytes 180 - 1bf
+ 0xCE, 0x95, 0x42, 0xCE, 0x96, 0x42, 0xCE, 0x97,
+ 0x42, 0xCE, 0x98, 0x42, 0xCE, 0x99, 0x42, 0xCE,
+ 0x9A, 0x42, 0xCE, 0x9B, 0x42, 0xCE, 0x9C, 0x42,
+ 0xCE, 0x9D, 0x42, 0xCE, 0x9E, 0x42, 0xCE, 0x9F,
+ 0x42, 0xCE, 0xA0, 0x42, 0xCE, 0xA1, 0x42, 0xCE,
+ 0xA3, 0x42, 0xCE, 0xA4, 0x42, 0xCE, 0xA5, 0x42,
+ 0xCE, 0xA6, 0x42, 0xCE, 0xA7, 0x42, 0xCE, 0xA8,
+ 0x42, 0xCE, 0xA9, 0x42, 0xCE, 0xB1, 0x42, 0xCE,
+ // Bytes 1c0 - 1ff
+ 0xB2, 0x42, 0xCE, 0xB3, 0x42, 0xCE, 0xB4, 0x42,
+ 0xCE, 0xB5, 0x42, 0xCE, 0xB6, 0x42, 0xCE, 0xB7,
+ 0x42, 0xCE, 0xB8, 0x42, 0xCE, 0xB9, 0x42, 0xCE,
+ 0xBA, 0x42, 0xCE, 0xBB, 0x42, 0xCE, 0xBC, 0x42,
+ 0xCE, 0xBD, 0x42, 0xCE, 0xBE, 0x42, 0xCE, 0xBF,
+ 0x42, 0xCF, 0x80, 0x42, 0xCF, 0x81, 0x42, 0xCF,
+ 0x82, 0x42, 0xCF, 0x83, 0x42, 0xCF, 0x84, 0x42,
+ 0xCF, 0x85, 0x42, 0xCF, 0x86, 0x42, 0xCF, 0x87,
+ // Bytes 200 - 23f
+ 0x42, 0xCF, 0x88, 0x42, 0xCF, 0x89, 0x42, 0xCF,
+ 0x9C, 0x42, 0xCF, 0x9D, 0x42, 0xD0, 0xBD, 0x42,
+ 0xD1, 0x8A, 0x42, 0xD1, 0x8C, 0x42, 0xD7, 0x90,
+ 0x42, 0xD7, 0x91, 0x42, 0xD7, 0x92, 0x42, 0xD7,
+ 0x93, 0x42, 0xD7, 0x94, 0x42, 0xD7, 0x9B, 0x42,
+ 0xD7, 0x9C, 0x42, 0xD7, 0x9D, 0x42, 0xD7, 0xA2,
+ 0x42, 0xD7, 0xA8, 0x42, 0xD7, 0xAA, 0x42, 0xD8,
+ 0xA1, 0x42, 0xD8, 0xA7, 0x42, 0xD8, 0xA8, 0x42,
+ // Bytes 240 - 27f
+ 0xD8, 0xA9, 0x42, 0xD8, 0xAA, 0x42, 0xD8, 0xAB,
+ 0x42, 0xD8, 0xAC, 0x42, 0xD8, 0xAD, 0x42, 0xD8,
+ 0xAE, 0x42, 0xD8, 0xAF, 0x42, 0xD8, 0xB0, 0x42,
+ 0xD8, 0xB1, 0x42, 0xD8, 0xB2, 0x42, 0xD8, 0xB3,
+ 0x42, 0xD8, 0xB4, 0x42, 0xD8, 0xB5, 0x42, 0xD8,
+ 0xB6, 0x42, 0xD8, 0xB7, 0x42, 0xD8, 0xB8, 0x42,
+ 0xD8, 0xB9, 0x42, 0xD8, 0xBA, 0x42, 0xD9, 0x81,
+ 0x42, 0xD9, 0x82, 0x42, 0xD9, 0x83, 0x42, 0xD9,
+ // Bytes 280 - 2bf
+ 0x84, 0x42, 0xD9, 0x85, 0x42, 0xD9, 0x86, 0x42,
+ 0xD9, 0x87, 0x42, 0xD9, 0x88, 0x42, 0xD9, 0x89,
+ 0x42, 0xD9, 0x8A, 0x42, 0xD9, 0xAE, 0x42, 0xD9,
+ 0xAF, 0x42, 0xD9, 0xB1, 0x42, 0xD9, 0xB9, 0x42,
+ 0xD9, 0xBA, 0x42, 0xD9, 0xBB, 0x42, 0xD9, 0xBE,
+ 0x42, 0xD9, 0xBF, 0x42, 0xDA, 0x80, 0x42, 0xDA,
+ 0x83, 0x42, 0xDA, 0x84, 0x42, 0xDA, 0x86, 0x42,
+ 0xDA, 0x87, 0x42, 0xDA, 0x88, 0x42, 0xDA, 0x8C,
+ // Bytes 2c0 - 2ff
+ 0x42, 0xDA, 0x8D, 0x42, 0xDA, 0x8E, 0x42, 0xDA,
+ 0x91, 0x42, 0xDA, 0x98, 0x42, 0xDA, 0xA1, 0x42,
+ 0xDA, 0xA4, 0x42, 0xDA, 0xA6, 0x42, 0xDA, 0xA9,
+ 0x42, 0xDA, 0xAD, 0x42, 0xDA, 0xAF, 0x42, 0xDA,
+ 0xB1, 0x42, 0xDA, 0xB3, 0x42, 0xDA, 0xBA, 0x42,
+ 0xDA, 0xBB, 0x42, 0xDA, 0xBE, 0x42, 0xDB, 0x81,
+ 0x42, 0xDB, 0x85, 0x42, 0xDB, 0x86, 0x42, 0xDB,
+ 0x87, 0x42, 0xDB, 0x88, 0x42, 0xDB, 0x89, 0x42,
+ // Bytes 300 - 33f
+ 0xDB, 0x8B, 0x42, 0xDB, 0x8C, 0x42, 0xDB, 0x90,
+ 0x42, 0xDB, 0x92, 0x43, 0xE0, 0xBC, 0x8B, 0x43,
+ 0xE1, 0x83, 0x9C, 0x43, 0xE1, 0x84, 0x80, 0x43,
+ 0xE1, 0x84, 0x81, 0x43, 0xE1, 0x84, 0x82, 0x43,
+ 0xE1, 0x84, 0x83, 0x43, 0xE1, 0x84, 0x84, 0x43,
+ 0xE1, 0x84, 0x85, 0x43, 0xE1, 0x84, 0x86, 0x43,
+ 0xE1, 0x84, 0x87, 0x43, 0xE1, 0x84, 0x88, 0x43,
+ 0xE1, 0x84, 0x89, 0x43, 0xE1, 0x84, 0x8A, 0x43,
+ // Bytes 340 - 37f
+ 0xE1, 0x84, 0x8B, 0x43, 0xE1, 0x84, 0x8C, 0x43,
+ 0xE1, 0x84, 0x8D, 0x43, 0xE1, 0x84, 0x8E, 0x43,
+ 0xE1, 0x84, 0x8F, 0x43, 0xE1, 0x84, 0x90, 0x43,
+ 0xE1, 0x84, 0x91, 0x43, 0xE1, 0x84, 0x92, 0x43,
+ 0xE1, 0x84, 0x94, 0x43, 0xE1, 0x84, 0x95, 0x43,
+ 0xE1, 0x84, 0x9A, 0x43, 0xE1, 0x84, 0x9C, 0x43,
+ 0xE1, 0x84, 0x9D, 0x43, 0xE1, 0x84, 0x9E, 0x43,
+ 0xE1, 0x84, 0xA0, 0x43, 0xE1, 0x84, 0xA1, 0x43,
+ // Bytes 380 - 3bf
+ 0xE1, 0x84, 0xA2, 0x43, 0xE1, 0x84, 0xA3, 0x43,
+ 0xE1, 0x84, 0xA7, 0x43, 0xE1, 0x84, 0xA9, 0x43,
+ 0xE1, 0x84, 0xAB, 0x43, 0xE1, 0x84, 0xAC, 0x43,
+ 0xE1, 0x84, 0xAD, 0x43, 0xE1, 0x84, 0xAE, 0x43,
+ 0xE1, 0x84, 0xAF, 0x43, 0xE1, 0x84, 0xB2, 0x43,
+ 0xE1, 0x84, 0xB6, 0x43, 0xE1, 0x85, 0x80, 0x43,
+ 0xE1, 0x85, 0x87, 0x43, 0xE1, 0x85, 0x8C, 0x43,
+ 0xE1, 0x85, 0x97, 0x43, 0xE1, 0x85, 0x98, 0x43,
+ // Bytes 3c0 - 3ff
+ 0xE1, 0x85, 0x99, 0x43, 0xE1, 0x85, 0xA0, 0x43,
+ 0xE1, 0x86, 0x84, 0x43, 0xE1, 0x86, 0x85, 0x43,
+ 0xE1, 0x86, 0x88, 0x43, 0xE1, 0x86, 0x91, 0x43,
+ 0xE1, 0x86, 0x92, 0x43, 0xE1, 0x86, 0x94, 0x43,
+ 0xE1, 0x86, 0x9E, 0x43, 0xE1, 0x86, 0xA1, 0x43,
+ 0xE1, 0x87, 0x87, 0x43, 0xE1, 0x87, 0x88, 0x43,
+ 0xE1, 0x87, 0x8C, 0x43, 0xE1, 0x87, 0x8E, 0x43,
+ 0xE1, 0x87, 0x93, 0x43, 0xE1, 0x87, 0x97, 0x43,
+ // Bytes 400 - 43f
+ 0xE1, 0x87, 0x99, 0x43, 0xE1, 0x87, 0x9D, 0x43,
+ 0xE1, 0x87, 0x9F, 0x43, 0xE1, 0x87, 0xB1, 0x43,
+ 0xE1, 0x87, 0xB2, 0x43, 0xE1, 0xB4, 0x82, 0x43,
+ 0xE1, 0xB4, 0x96, 0x43, 0xE1, 0xB4, 0x97, 0x43,
+ 0xE1, 0xB4, 0x9C, 0x43, 0xE1, 0xB4, 0x9D, 0x43,
+ 0xE1, 0xB4, 0xA5, 0x43, 0xE1, 0xB5, 0xBB, 0x43,
+ 0xE1, 0xB6, 0x85, 0x43, 0xE2, 0x80, 0x82, 0x43,
+ 0xE2, 0x80, 0x83, 0x43, 0xE2, 0x80, 0x90, 0x43,
+ // Bytes 440 - 47f
+ 0xE2, 0x80, 0x93, 0x43, 0xE2, 0x80, 0x94, 0x43,
+ 0xE2, 0x82, 0xA9, 0x43, 0xE2, 0x86, 0x90, 0x43,
+ 0xE2, 0x86, 0x91, 0x43, 0xE2, 0x86, 0x92, 0x43,
+ 0xE2, 0x86, 0x93, 0x43, 0xE2, 0x88, 0x82, 0x43,
+ 0xE2, 0x88, 0x87, 0x43, 0xE2, 0x88, 0x91, 0x43,
+ 0xE2, 0x88, 0x92, 0x43, 0xE2, 0x94, 0x82, 0x43,
+ 0xE2, 0x96, 0xA0, 0x43, 0xE2, 0x97, 0x8B, 0x43,
+ 0xE2, 0xA6, 0x85, 0x43, 0xE2, 0xA6, 0x86, 0x43,
+ // Bytes 480 - 4bf
+ 0xE2, 0xB5, 0xA1, 0x43, 0xE3, 0x80, 0x81, 0x43,
+ 0xE3, 0x80, 0x82, 0x43, 0xE3, 0x80, 0x88, 0x43,
+ 0xE3, 0x80, 0x89, 0x43, 0xE3, 0x80, 0x8A, 0x43,
+ 0xE3, 0x80, 0x8B, 0x43, 0xE3, 0x80, 0x8C, 0x43,
+ 0xE3, 0x80, 0x8D, 0x43, 0xE3, 0x80, 0x8E, 0x43,
+ 0xE3, 0x80, 0x8F, 0x43, 0xE3, 0x80, 0x90, 0x43,
+ 0xE3, 0x80, 0x91, 0x43, 0xE3, 0x80, 0x92, 0x43,
+ 0xE3, 0x80, 0x94, 0x43, 0xE3, 0x80, 0x95, 0x43,
+ // Bytes 4c0 - 4ff
+ 0xE3, 0x80, 0x96, 0x43, 0xE3, 0x80, 0x97, 0x43,
+ 0xE3, 0x82, 0xA1, 0x43, 0xE3, 0x82, 0xA2, 0x43,
+ 0xE3, 0x82, 0xA3, 0x43, 0xE3, 0x82, 0xA4, 0x43,
+ 0xE3, 0x82, 0xA5, 0x43, 0xE3, 0x82, 0xA6, 0x43,
+ 0xE3, 0x82, 0xA7, 0x43, 0xE3, 0x82, 0xA8, 0x43,
+ 0xE3, 0x82, 0xA9, 0x43, 0xE3, 0x82, 0xAA, 0x43,
+ 0xE3, 0x82, 0xAB, 0x43, 0xE3, 0x82, 0xAD, 0x43,
+ 0xE3, 0x82, 0xAF, 0x43, 0xE3, 0x82, 0xB1, 0x43,
+ // Bytes 500 - 53f
+ 0xE3, 0x82, 0xB3, 0x43, 0xE3, 0x82, 0xB5, 0x43,
+ 0xE3, 0x82, 0xB7, 0x43, 0xE3, 0x82, 0xB9, 0x43,
+ 0xE3, 0x82, 0xBB, 0x43, 0xE3, 0x82, 0xBD, 0x43,
+ 0xE3, 0x82, 0xBF, 0x43, 0xE3, 0x83, 0x81, 0x43,
+ 0xE3, 0x83, 0x83, 0x43, 0xE3, 0x83, 0x84, 0x43,
+ 0xE3, 0x83, 0x86, 0x43, 0xE3, 0x83, 0x88, 0x43,
+ 0xE3, 0x83, 0x8A, 0x43, 0xE3, 0x83, 0x8B, 0x43,
+ 0xE3, 0x83, 0x8C, 0x43, 0xE3, 0x83, 0x8D, 0x43,
+ // Bytes 540 - 57f
+ 0xE3, 0x83, 0x8E, 0x43, 0xE3, 0x83, 0x8F, 0x43,
+ 0xE3, 0x83, 0x92, 0x43, 0xE3, 0x83, 0x95, 0x43,
+ 0xE3, 0x83, 0x98, 0x43, 0xE3, 0x83, 0x9B, 0x43,
+ 0xE3, 0x83, 0x9E, 0x43, 0xE3, 0x83, 0x9F, 0x43,
+ 0xE3, 0x83, 0xA0, 0x43, 0xE3, 0x83, 0xA1, 0x43,
+ 0xE3, 0x83, 0xA2, 0x43, 0xE3, 0x83, 0xA3, 0x43,
+ 0xE3, 0x83, 0xA4, 0x43, 0xE3, 0x83, 0xA5, 0x43,
+ 0xE3, 0x83, 0xA6, 0x43, 0xE3, 0x83, 0xA7, 0x43,
+ // Bytes 580 - 5bf
+ 0xE3, 0x83, 0xA8, 0x43, 0xE3, 0x83, 0xA9, 0x43,
+ 0xE3, 0x83, 0xAA, 0x43, 0xE3, 0x83, 0xAB, 0x43,
+ 0xE3, 0x83, 0xAC, 0x43, 0xE3, 0x83, 0xAD, 0x43,
+ 0xE3, 0x83, 0xAF, 0x43, 0xE3, 0x83, 0xB0, 0x43,
+ 0xE3, 0x83, 0xB1, 0x43, 0xE3, 0x83, 0xB2, 0x43,
+ 0xE3, 0x83, 0xB3, 0x43, 0xE3, 0x83, 0xBB, 0x43,
+ 0xE3, 0x83, 0xBC, 0x43, 0xE3, 0x92, 0x9E, 0x43,
+ 0xE3, 0x92, 0xB9, 0x43, 0xE3, 0x92, 0xBB, 0x43,
+ // Bytes 5c0 - 5ff
+ 0xE3, 0x93, 0x9F, 0x43, 0xE3, 0x94, 0x95, 0x43,
+ 0xE3, 0x9B, 0xAE, 0x43, 0xE3, 0x9B, 0xBC, 0x43,
+ 0xE3, 0x9E, 0x81, 0x43, 0xE3, 0xA0, 0xAF, 0x43,
+ 0xE3, 0xA1, 0xA2, 0x43, 0xE3, 0xA1, 0xBC, 0x43,
+ 0xE3, 0xA3, 0x87, 0x43, 0xE3, 0xA3, 0xA3, 0x43,
+ 0xE3, 0xA4, 0x9C, 0x43, 0xE3, 0xA4, 0xBA, 0x43,
+ 0xE3, 0xA8, 0xAE, 0x43, 0xE3, 0xA9, 0xAC, 0x43,
+ 0xE3, 0xAB, 0xA4, 0x43, 0xE3, 0xAC, 0x88, 0x43,
+ // Bytes 600 - 63f
+ 0xE3, 0xAC, 0x99, 0x43, 0xE3, 0xAD, 0x89, 0x43,
+ 0xE3, 0xAE, 0x9D, 0x43, 0xE3, 0xB0, 0x98, 0x43,
+ 0xE3, 0xB1, 0x8E, 0x43, 0xE3, 0xB4, 0xB3, 0x43,
+ 0xE3, 0xB6, 0x96, 0x43, 0xE3, 0xBA, 0xAC, 0x43,
+ 0xE3, 0xBA, 0xB8, 0x43, 0xE3, 0xBC, 0x9B, 0x43,
+ 0xE3, 0xBF, 0xBC, 0x43, 0xE4, 0x80, 0x88, 0x43,
+ 0xE4, 0x80, 0x98, 0x43, 0xE4, 0x80, 0xB9, 0x43,
+ 0xE4, 0x81, 0x86, 0x43, 0xE4, 0x82, 0x96, 0x43,
+ // Bytes 640 - 67f
+ 0xE4, 0x83, 0xA3, 0x43, 0xE4, 0x84, 0xAF, 0x43,
+ 0xE4, 0x88, 0x82, 0x43, 0xE4, 0x88, 0xA7, 0x43,
+ 0xE4, 0x8A, 0xA0, 0x43, 0xE4, 0x8C, 0x81, 0x43,
+ 0xE4, 0x8C, 0xB4, 0x43, 0xE4, 0x8D, 0x99, 0x43,
+ 0xE4, 0x8F, 0x95, 0x43, 0xE4, 0x8F, 0x99, 0x43,
+ 0xE4, 0x90, 0x8B, 0x43, 0xE4, 0x91, 0xAB, 0x43,
+ 0xE4, 0x94, 0xAB, 0x43, 0xE4, 0x95, 0x9D, 0x43,
+ 0xE4, 0x95, 0xA1, 0x43, 0xE4, 0x95, 0xAB, 0x43,
+ // Bytes 680 - 6bf
+ 0xE4, 0x97, 0x97, 0x43, 0xE4, 0x97, 0xB9, 0x43,
+ 0xE4, 0x98, 0xB5, 0x43, 0xE4, 0x9A, 0xBE, 0x43,
+ 0xE4, 0x9B, 0x87, 0x43, 0xE4, 0xA6, 0x95, 0x43,
+ 0xE4, 0xA7, 0xA6, 0x43, 0xE4, 0xA9, 0xAE, 0x43,
+ 0xE4, 0xA9, 0xB6, 0x43, 0xE4, 0xAA, 0xB2, 0x43,
+ 0xE4, 0xAC, 0xB3, 0x43, 0xE4, 0xAF, 0x8E, 0x43,
+ 0xE4, 0xB3, 0x8E, 0x43, 0xE4, 0xB3, 0xAD, 0x43,
+ 0xE4, 0xB3, 0xB8, 0x43, 0xE4, 0xB5, 0x96, 0x43,
+ // Bytes 6c0 - 6ff
+ 0xE4, 0xB8, 0x80, 0x43, 0xE4, 0xB8, 0x81, 0x43,
+ 0xE4, 0xB8, 0x83, 0x43, 0xE4, 0xB8, 0x89, 0x43,
+ 0xE4, 0xB8, 0x8A, 0x43, 0xE4, 0xB8, 0x8B, 0x43,
+ 0xE4, 0xB8, 0x8D, 0x43, 0xE4, 0xB8, 0x99, 0x43,
+ 0xE4, 0xB8, 0xA6, 0x43, 0xE4, 0xB8, 0xA8, 0x43,
+ 0xE4, 0xB8, 0xAD, 0x43, 0xE4, 0xB8, 0xB2, 0x43,
+ 0xE4, 0xB8, 0xB6, 0x43, 0xE4, 0xB8, 0xB8, 0x43,
+ 0xE4, 0xB8, 0xB9, 0x43, 0xE4, 0xB8, 0xBD, 0x43,
+ // Bytes 700 - 73f
+ 0xE4, 0xB8, 0xBF, 0x43, 0xE4, 0xB9, 0x81, 0x43,
+ 0xE4, 0xB9, 0x99, 0x43, 0xE4, 0xB9, 0x9D, 0x43,
+ 0xE4, 0xBA, 0x82, 0x43, 0xE4, 0xBA, 0x85, 0x43,
+ 0xE4, 0xBA, 0x86, 0x43, 0xE4, 0xBA, 0x8C, 0x43,
+ 0xE4, 0xBA, 0x94, 0x43, 0xE4, 0xBA, 0xA0, 0x43,
+ 0xE4, 0xBA, 0xA4, 0x43, 0xE4, 0xBA, 0xAE, 0x43,
+ 0xE4, 0xBA, 0xBA, 0x43, 0xE4, 0xBB, 0x80, 0x43,
+ 0xE4, 0xBB, 0x8C, 0x43, 0xE4, 0xBB, 0xA4, 0x43,
+ // Bytes 740 - 77f
+ 0xE4, 0xBC, 0x81, 0x43, 0xE4, 0xBC, 0x91, 0x43,
+ 0xE4, 0xBD, 0xA0, 0x43, 0xE4, 0xBE, 0x80, 0x43,
+ 0xE4, 0xBE, 0x86, 0x43, 0xE4, 0xBE, 0x8B, 0x43,
+ 0xE4, 0xBE, 0xAE, 0x43, 0xE4, 0xBE, 0xBB, 0x43,
+ 0xE4, 0xBE, 0xBF, 0x43, 0xE5, 0x80, 0x82, 0x43,
+ 0xE5, 0x80, 0xAB, 0x43, 0xE5, 0x81, 0xBA, 0x43,
+ 0xE5, 0x82, 0x99, 0x43, 0xE5, 0x83, 0x8F, 0x43,
+ 0xE5, 0x83, 0x9A, 0x43, 0xE5, 0x83, 0xA7, 0x43,
+ // Bytes 780 - 7bf
+ 0xE5, 0x84, 0xAA, 0x43, 0xE5, 0x84, 0xBF, 0x43,
+ 0xE5, 0x85, 0x80, 0x43, 0xE5, 0x85, 0x85, 0x43,
+ 0xE5, 0x85, 0x8D, 0x43, 0xE5, 0x85, 0x94, 0x43,
+ 0xE5, 0x85, 0xA4, 0x43, 0xE5, 0x85, 0xA5, 0x43,
+ 0xE5, 0x85, 0xA7, 0x43, 0xE5, 0x85, 0xA8, 0x43,
+ 0xE5, 0x85, 0xA9, 0x43, 0xE5, 0x85, 0xAB, 0x43,
+ 0xE5, 0x85, 0xAD, 0x43, 0xE5, 0x85, 0xB7, 0x43,
+ 0xE5, 0x86, 0x80, 0x43, 0xE5, 0x86, 0x82, 0x43,
+ // Bytes 7c0 - 7ff
+ 0xE5, 0x86, 0x8D, 0x43, 0xE5, 0x86, 0x92, 0x43,
+ 0xE5, 0x86, 0x95, 0x43, 0xE5, 0x86, 0x96, 0x43,
+ 0xE5, 0x86, 0x97, 0x43, 0xE5, 0x86, 0x99, 0x43,
+ 0xE5, 0x86, 0xA4, 0x43, 0xE5, 0x86, 0xAB, 0x43,
+ 0xE5, 0x86, 0xAC, 0x43, 0xE5, 0x86, 0xB5, 0x43,
+ 0xE5, 0x86, 0xB7, 0x43, 0xE5, 0x87, 0x89, 0x43,
+ 0xE5, 0x87, 0x8C, 0x43, 0xE5, 0x87, 0x9C, 0x43,
+ 0xE5, 0x87, 0x9E, 0x43, 0xE5, 0x87, 0xA0, 0x43,
+ // Bytes 800 - 83f
+ 0xE5, 0x87, 0xB5, 0x43, 0xE5, 0x88, 0x80, 0x43,
+ 0xE5, 0x88, 0x83, 0x43, 0xE5, 0x88, 0x87, 0x43,
+ 0xE5, 0x88, 0x97, 0x43, 0xE5, 0x88, 0x9D, 0x43,
+ 0xE5, 0x88, 0xA9, 0x43, 0xE5, 0x88, 0xBA, 0x43,
+ 0xE5, 0x88, 0xBB, 0x43, 0xE5, 0x89, 0x86, 0x43,
+ 0xE5, 0x89, 0x8D, 0x43, 0xE5, 0x89, 0xB2, 0x43,
+ 0xE5, 0x89, 0xB7, 0x43, 0xE5, 0x8A, 0x89, 0x43,
+ 0xE5, 0x8A, 0x9B, 0x43, 0xE5, 0x8A, 0xA3, 0x43,
+ // Bytes 840 - 87f
+ 0xE5, 0x8A, 0xB3, 0x43, 0xE5, 0x8A, 0xB4, 0x43,
+ 0xE5, 0x8B, 0x87, 0x43, 0xE5, 0x8B, 0x89, 0x43,
+ 0xE5, 0x8B, 0x92, 0x43, 0xE5, 0x8B, 0x9E, 0x43,
+ 0xE5, 0x8B, 0xA4, 0x43, 0xE5, 0x8B, 0xB5, 0x43,
+ 0xE5, 0x8B, 0xB9, 0x43, 0xE5, 0x8B, 0xBA, 0x43,
+ 0xE5, 0x8C, 0x85, 0x43, 0xE5, 0x8C, 0x86, 0x43,
+ 0xE5, 0x8C, 0x95, 0x43, 0xE5, 0x8C, 0x97, 0x43,
+ 0xE5, 0x8C, 0x9A, 0x43, 0xE5, 0x8C, 0xB8, 0x43,
+ // Bytes 880 - 8bf
+ 0xE5, 0x8C, 0xBB, 0x43, 0xE5, 0x8C, 0xBF, 0x43,
+ 0xE5, 0x8D, 0x81, 0x43, 0xE5, 0x8D, 0x84, 0x43,
+ 0xE5, 0x8D, 0x85, 0x43, 0xE5, 0x8D, 0x89, 0x43,
+ 0xE5, 0x8D, 0x91, 0x43, 0xE5, 0x8D, 0x94, 0x43,
+ 0xE5, 0x8D, 0x9A, 0x43, 0xE5, 0x8D, 0x9C, 0x43,
+ 0xE5, 0x8D, 0xA9, 0x43, 0xE5, 0x8D, 0xB0, 0x43,
+ 0xE5, 0x8D, 0xB3, 0x43, 0xE5, 0x8D, 0xB5, 0x43,
+ 0xE5, 0x8D, 0xBD, 0x43, 0xE5, 0x8D, 0xBF, 0x43,
+ // Bytes 8c0 - 8ff
+ 0xE5, 0x8E, 0x82, 0x43, 0xE5, 0x8E, 0xB6, 0x43,
+ 0xE5, 0x8F, 0x83, 0x43, 0xE5, 0x8F, 0x88, 0x43,
+ 0xE5, 0x8F, 0x8A, 0x43, 0xE5, 0x8F, 0x8C, 0x43,
+ 0xE5, 0x8F, 0x9F, 0x43, 0xE5, 0x8F, 0xA3, 0x43,
+ 0xE5, 0x8F, 0xA5, 0x43, 0xE5, 0x8F, 0xAB, 0x43,
+ 0xE5, 0x8F, 0xAF, 0x43, 0xE5, 0x8F, 0xB1, 0x43,
+ 0xE5, 0x8F, 0xB3, 0x43, 0xE5, 0x90, 0x86, 0x43,
+ 0xE5, 0x90, 0x88, 0x43, 0xE5, 0x90, 0x8D, 0x43,
+ // Bytes 900 - 93f
+ 0xE5, 0x90, 0x8F, 0x43, 0xE5, 0x90, 0x9D, 0x43,
+ 0xE5, 0x90, 0xB8, 0x43, 0xE5, 0x90, 0xB9, 0x43,
+ 0xE5, 0x91, 0x82, 0x43, 0xE5, 0x91, 0x88, 0x43,
+ 0xE5, 0x91, 0xA8, 0x43, 0xE5, 0x92, 0x9E, 0x43,
+ 0xE5, 0x92, 0xA2, 0x43, 0xE5, 0x92, 0xBD, 0x43,
+ 0xE5, 0x93, 0xB6, 0x43, 0xE5, 0x94, 0x90, 0x43,
+ 0xE5, 0x95, 0x8F, 0x43, 0xE5, 0x95, 0x93, 0x43,
+ 0xE5, 0x95, 0x95, 0x43, 0xE5, 0x95, 0xA3, 0x43,
+ // Bytes 940 - 97f
+ 0xE5, 0x96, 0x84, 0x43, 0xE5, 0x96, 0x87, 0x43,
+ 0xE5, 0x96, 0x99, 0x43, 0xE5, 0x96, 0x9D, 0x43,
+ 0xE5, 0x96, 0xAB, 0x43, 0xE5, 0x96, 0xB3, 0x43,
+ 0xE5, 0x96, 0xB6, 0x43, 0xE5, 0x97, 0x80, 0x43,
+ 0xE5, 0x97, 0x82, 0x43, 0xE5, 0x97, 0xA2, 0x43,
+ 0xE5, 0x98, 0x86, 0x43, 0xE5, 0x99, 0x91, 0x43,
+ 0xE5, 0x99, 0xA8, 0x43, 0xE5, 0x99, 0xB4, 0x43,
+ 0xE5, 0x9B, 0x97, 0x43, 0xE5, 0x9B, 0x9B, 0x43,
+ // Bytes 980 - 9bf
+ 0xE5, 0x9B, 0xB9, 0x43, 0xE5, 0x9C, 0x96, 0x43,
+ 0xE5, 0x9C, 0x97, 0x43, 0xE5, 0x9C, 0x9F, 0x43,
+ 0xE5, 0x9C, 0xB0, 0x43, 0xE5, 0x9E, 0x8B, 0x43,
+ 0xE5, 0x9F, 0x8E, 0x43, 0xE5, 0x9F, 0xB4, 0x43,
+ 0xE5, 0xA0, 0x8D, 0x43, 0xE5, 0xA0, 0xB1, 0x43,
+ 0xE5, 0xA0, 0xB2, 0x43, 0xE5, 0xA1, 0x80, 0x43,
+ 0xE5, 0xA1, 0x9A, 0x43, 0xE5, 0xA1, 0x9E, 0x43,
+ 0xE5, 0xA2, 0xA8, 0x43, 0xE5, 0xA2, 0xAC, 0x43,
+ // Bytes 9c0 - 9ff
+ 0xE5, 0xA2, 0xB3, 0x43, 0xE5, 0xA3, 0x98, 0x43,
+ 0xE5, 0xA3, 0x9F, 0x43, 0xE5, 0xA3, 0xAB, 0x43,
+ 0xE5, 0xA3, 0xAE, 0x43, 0xE5, 0xA3, 0xB0, 0x43,
+ 0xE5, 0xA3, 0xB2, 0x43, 0xE5, 0xA3, 0xB7, 0x43,
+ 0xE5, 0xA4, 0x82, 0x43, 0xE5, 0xA4, 0x86, 0x43,
+ 0xE5, 0xA4, 0x8A, 0x43, 0xE5, 0xA4, 0x95, 0x43,
+ 0xE5, 0xA4, 0x9A, 0x43, 0xE5, 0xA4, 0x9C, 0x43,
+ 0xE5, 0xA4, 0xA2, 0x43, 0xE5, 0xA4, 0xA7, 0x43,
+ // Bytes a00 - a3f
+ 0xE5, 0xA4, 0xA9, 0x43, 0xE5, 0xA5, 0x84, 0x43,
+ 0xE5, 0xA5, 0x88, 0x43, 0xE5, 0xA5, 0x91, 0x43,
+ 0xE5, 0xA5, 0x94, 0x43, 0xE5, 0xA5, 0xA2, 0x43,
+ 0xE5, 0xA5, 0xB3, 0x43, 0xE5, 0xA7, 0x98, 0x43,
+ 0xE5, 0xA7, 0xAC, 0x43, 0xE5, 0xA8, 0x9B, 0x43,
+ 0xE5, 0xA8, 0xA7, 0x43, 0xE5, 0xA9, 0xA2, 0x43,
+ 0xE5, 0xA9, 0xA6, 0x43, 0xE5, 0xAA, 0xB5, 0x43,
+ 0xE5, 0xAC, 0x88, 0x43, 0xE5, 0xAC, 0xA8, 0x43,
+ // Bytes a40 - a7f
+ 0xE5, 0xAC, 0xBE, 0x43, 0xE5, 0xAD, 0x90, 0x43,
+ 0xE5, 0xAD, 0x97, 0x43, 0xE5, 0xAD, 0xA6, 0x43,
+ 0xE5, 0xAE, 0x80, 0x43, 0xE5, 0xAE, 0x85, 0x43,
+ 0xE5, 0xAE, 0x97, 0x43, 0xE5, 0xAF, 0x83, 0x43,
+ 0xE5, 0xAF, 0x98, 0x43, 0xE5, 0xAF, 0xA7, 0x43,
+ 0xE5, 0xAF, 0xAE, 0x43, 0xE5, 0xAF, 0xB3, 0x43,
+ 0xE5, 0xAF, 0xB8, 0x43, 0xE5, 0xAF, 0xBF, 0x43,
+ 0xE5, 0xB0, 0x86, 0x43, 0xE5, 0xB0, 0x8F, 0x43,
+ // Bytes a80 - abf
+ 0xE5, 0xB0, 0xA2, 0x43, 0xE5, 0xB0, 0xB8, 0x43,
+ 0xE5, 0xB0, 0xBF, 0x43, 0xE5, 0xB1, 0xA0, 0x43,
+ 0xE5, 0xB1, 0xA2, 0x43, 0xE5, 0xB1, 0xA4, 0x43,
+ 0xE5, 0xB1, 0xA5, 0x43, 0xE5, 0xB1, 0xAE, 0x43,
+ 0xE5, 0xB1, 0xB1, 0x43, 0xE5, 0xB2, 0x8D, 0x43,
+ 0xE5, 0xB3, 0x80, 0x43, 0xE5, 0xB4, 0x99, 0x43,
+ 0xE5, 0xB5, 0x83, 0x43, 0xE5, 0xB5, 0x90, 0x43,
+ 0xE5, 0xB5, 0xAB, 0x43, 0xE5, 0xB5, 0xAE, 0x43,
+ // Bytes ac0 - aff
+ 0xE5, 0xB5, 0xBC, 0x43, 0xE5, 0xB6, 0xB2, 0x43,
+ 0xE5, 0xB6, 0xBA, 0x43, 0xE5, 0xB7, 0x9B, 0x43,
+ 0xE5, 0xB7, 0xA1, 0x43, 0xE5, 0xB7, 0xA2, 0x43,
+ 0xE5, 0xB7, 0xA5, 0x43, 0xE5, 0xB7, 0xA6, 0x43,
+ 0xE5, 0xB7, 0xB1, 0x43, 0xE5, 0xB7, 0xBD, 0x43,
+ 0xE5, 0xB7, 0xBE, 0x43, 0xE5, 0xB8, 0xA8, 0x43,
+ 0xE5, 0xB8, 0xBD, 0x43, 0xE5, 0xB9, 0xA9, 0x43,
+ 0xE5, 0xB9, 0xB2, 0x43, 0xE5, 0xB9, 0xB4, 0x43,
+ // Bytes b00 - b3f
+ 0xE5, 0xB9, 0xBA, 0x43, 0xE5, 0xB9, 0xBC, 0x43,
+ 0xE5, 0xB9, 0xBF, 0x43, 0xE5, 0xBA, 0xA6, 0x43,
+ 0xE5, 0xBA, 0xB0, 0x43, 0xE5, 0xBA, 0xB3, 0x43,
+ 0xE5, 0xBA, 0xB6, 0x43, 0xE5, 0xBB, 0x89, 0x43,
+ 0xE5, 0xBB, 0x8A, 0x43, 0xE5, 0xBB, 0x92, 0x43,
+ 0xE5, 0xBB, 0x93, 0x43, 0xE5, 0xBB, 0x99, 0x43,
+ 0xE5, 0xBB, 0xAC, 0x43, 0xE5, 0xBB, 0xB4, 0x43,
+ 0xE5, 0xBB, 0xBE, 0x43, 0xE5, 0xBC, 0x84, 0x43,
+ // Bytes b40 - b7f
+ 0xE5, 0xBC, 0x8B, 0x43, 0xE5, 0xBC, 0x93, 0x43,
+ 0xE5, 0xBC, 0xA2, 0x43, 0xE5, 0xBD, 0x90, 0x43,
+ 0xE5, 0xBD, 0x93, 0x43, 0xE5, 0xBD, 0xA1, 0x43,
+ 0xE5, 0xBD, 0xA2, 0x43, 0xE5, 0xBD, 0xA9, 0x43,
+ 0xE5, 0xBD, 0xAB, 0x43, 0xE5, 0xBD, 0xB3, 0x43,
+ 0xE5, 0xBE, 0x8B, 0x43, 0xE5, 0xBE, 0x8C, 0x43,
+ 0xE5, 0xBE, 0x97, 0x43, 0xE5, 0xBE, 0x9A, 0x43,
+ 0xE5, 0xBE, 0xA9, 0x43, 0xE5, 0xBE, 0xAD, 0x43,
+ // Bytes b80 - bbf
+ 0xE5, 0xBF, 0x83, 0x43, 0xE5, 0xBF, 0x8D, 0x43,
+ 0xE5, 0xBF, 0x97, 0x43, 0xE5, 0xBF, 0xB5, 0x43,
+ 0xE5, 0xBF, 0xB9, 0x43, 0xE6, 0x80, 0x92, 0x43,
+ 0xE6, 0x80, 0x9C, 0x43, 0xE6, 0x81, 0xB5, 0x43,
+ 0xE6, 0x82, 0x81, 0x43, 0xE6, 0x82, 0x94, 0x43,
+ 0xE6, 0x83, 0x87, 0x43, 0xE6, 0x83, 0x98, 0x43,
+ 0xE6, 0x83, 0xA1, 0x43, 0xE6, 0x84, 0x88, 0x43,
+ 0xE6, 0x85, 0x84, 0x43, 0xE6, 0x85, 0x88, 0x43,
+ // Bytes bc0 - bff
+ 0xE6, 0x85, 0x8C, 0x43, 0xE6, 0x85, 0x8E, 0x43,
+ 0xE6, 0x85, 0xA0, 0x43, 0xE6, 0x85, 0xA8, 0x43,
+ 0xE6, 0x85, 0xBA, 0x43, 0xE6, 0x86, 0x8E, 0x43,
+ 0xE6, 0x86, 0x90, 0x43, 0xE6, 0x86, 0xA4, 0x43,
+ 0xE6, 0x86, 0xAF, 0x43, 0xE6, 0x86, 0xB2, 0x43,
+ 0xE6, 0x87, 0x9E, 0x43, 0xE6, 0x87, 0xB2, 0x43,
+ 0xE6, 0x87, 0xB6, 0x43, 0xE6, 0x88, 0x80, 0x43,
+ 0xE6, 0x88, 0x88, 0x43, 0xE6, 0x88, 0x90, 0x43,
+ // Bytes c00 - c3f
+ 0xE6, 0x88, 0x9B, 0x43, 0xE6, 0x88, 0xAE, 0x43,
+ 0xE6, 0x88, 0xB4, 0x43, 0xE6, 0x88, 0xB6, 0x43,
+ 0xE6, 0x89, 0x8B, 0x43, 0xE6, 0x89, 0x93, 0x43,
+ 0xE6, 0x89, 0x9D, 0x43, 0xE6, 0x8A, 0x95, 0x43,
+ 0xE6, 0x8A, 0xB1, 0x43, 0xE6, 0x8B, 0x89, 0x43,
+ 0xE6, 0x8B, 0x8F, 0x43, 0xE6, 0x8B, 0x93, 0x43,
+ 0xE6, 0x8B, 0x94, 0x43, 0xE6, 0x8B, 0xBC, 0x43,
+ 0xE6, 0x8B, 0xBE, 0x43, 0xE6, 0x8C, 0x87, 0x43,
+ // Bytes c40 - c7f
+ 0xE6, 0x8C, 0xBD, 0x43, 0xE6, 0x8D, 0x90, 0x43,
+ 0xE6, 0x8D, 0x95, 0x43, 0xE6, 0x8D, 0xA8, 0x43,
+ 0xE6, 0x8D, 0xBB, 0x43, 0xE6, 0x8E, 0x83, 0x43,
+ 0xE6, 0x8E, 0xA0, 0x43, 0xE6, 0x8E, 0xA9, 0x43,
+ 0xE6, 0x8F, 0x84, 0x43, 0xE6, 0x8F, 0x85, 0x43,
+ 0xE6, 0x8F, 0xA4, 0x43, 0xE6, 0x90, 0x9C, 0x43,
+ 0xE6, 0x90, 0xA2, 0x43, 0xE6, 0x91, 0x92, 0x43,
+ 0xE6, 0x91, 0xA9, 0x43, 0xE6, 0x91, 0xB7, 0x43,
+ // Bytes c80 - cbf
+ 0xE6, 0x91, 0xBE, 0x43, 0xE6, 0x92, 0x9A, 0x43,
+ 0xE6, 0x92, 0x9D, 0x43, 0xE6, 0x93, 0x84, 0x43,
+ 0xE6, 0x94, 0xAF, 0x43, 0xE6, 0x94, 0xB4, 0x43,
+ 0xE6, 0x95, 0x8F, 0x43, 0xE6, 0x95, 0x96, 0x43,
+ 0xE6, 0x95, 0xAC, 0x43, 0xE6, 0x95, 0xB8, 0x43,
+ 0xE6, 0x96, 0x87, 0x43, 0xE6, 0x96, 0x97, 0x43,
+ 0xE6, 0x96, 0x99, 0x43, 0xE6, 0x96, 0xA4, 0x43,
+ 0xE6, 0x96, 0xB0, 0x43, 0xE6, 0x96, 0xB9, 0x43,
+ // Bytes cc0 - cff
+ 0xE6, 0x97, 0x85, 0x43, 0xE6, 0x97, 0xA0, 0x43,
+ 0xE6, 0x97, 0xA2, 0x43, 0xE6, 0x97, 0xA3, 0x43,
+ 0xE6, 0x97, 0xA5, 0x43, 0xE6, 0x98, 0x93, 0x43,
+ 0xE6, 0x98, 0xA0, 0x43, 0xE6, 0x99, 0x89, 0x43,
+ 0xE6, 0x99, 0xB4, 0x43, 0xE6, 0x9A, 0x88, 0x43,
+ 0xE6, 0x9A, 0x91, 0x43, 0xE6, 0x9A, 0x9C, 0x43,
+ 0xE6, 0x9A, 0xB4, 0x43, 0xE6, 0x9B, 0x86, 0x43,
+ 0xE6, 0x9B, 0xB0, 0x43, 0xE6, 0x9B, 0xB4, 0x43,
+ // Bytes d00 - d3f
+ 0xE6, 0x9B, 0xB8, 0x43, 0xE6, 0x9C, 0x80, 0x43,
+ 0xE6, 0x9C, 0x88, 0x43, 0xE6, 0x9C, 0x89, 0x43,
+ 0xE6, 0x9C, 0x97, 0x43, 0xE6, 0x9C, 0x9B, 0x43,
+ 0xE6, 0x9C, 0xA1, 0x43, 0xE6, 0x9C, 0xA8, 0x43,
+ 0xE6, 0x9D, 0x8E, 0x43, 0xE6, 0x9D, 0x93, 0x43,
+ 0xE6, 0x9D, 0x96, 0x43, 0xE6, 0x9D, 0x9E, 0x43,
+ 0xE6, 0x9D, 0xBB, 0x43, 0xE6, 0x9E, 0x85, 0x43,
+ 0xE6, 0x9E, 0x97, 0x43, 0xE6, 0x9F, 0xB3, 0x43,
+ // Bytes d40 - d7f
+ 0xE6, 0x9F, 0xBA, 0x43, 0xE6, 0xA0, 0x97, 0x43,
+ 0xE6, 0xA0, 0x9F, 0x43, 0xE6, 0xA0, 0xAA, 0x43,
+ 0xE6, 0xA1, 0x92, 0x43, 0xE6, 0xA2, 0x81, 0x43,
+ 0xE6, 0xA2, 0x85, 0x43, 0xE6, 0xA2, 0x8E, 0x43,
+ 0xE6, 0xA2, 0xA8, 0x43, 0xE6, 0xA4, 0x94, 0x43,
+ 0xE6, 0xA5, 0x82, 0x43, 0xE6, 0xA6, 0xA3, 0x43,
+ 0xE6, 0xA7, 0xAA, 0x43, 0xE6, 0xA8, 0x82, 0x43,
+ 0xE6, 0xA8, 0x93, 0x43, 0xE6, 0xAA, 0xA8, 0x43,
+ // Bytes d80 - dbf
+ 0xE6, 0xAB, 0x93, 0x43, 0xE6, 0xAB, 0x9B, 0x43,
+ 0xE6, 0xAC, 0x84, 0x43, 0xE6, 0xAC, 0xA0, 0x43,
+ 0xE6, 0xAC, 0xA1, 0x43, 0xE6, 0xAD, 0x94, 0x43,
+ 0xE6, 0xAD, 0xA2, 0x43, 0xE6, 0xAD, 0xA3, 0x43,
+ 0xE6, 0xAD, 0xB2, 0x43, 0xE6, 0xAD, 0xB7, 0x43,
+ 0xE6, 0xAD, 0xB9, 0x43, 0xE6, 0xAE, 0x9F, 0x43,
+ 0xE6, 0xAE, 0xAE, 0x43, 0xE6, 0xAE, 0xB3, 0x43,
+ 0xE6, 0xAE, 0xBA, 0x43, 0xE6, 0xAE, 0xBB, 0x43,
+ // Bytes dc0 - dff
+ 0xE6, 0xAF, 0x8B, 0x43, 0xE6, 0xAF, 0x8D, 0x43,
+ 0xE6, 0xAF, 0x94, 0x43, 0xE6, 0xAF, 0x9B, 0x43,
+ 0xE6, 0xB0, 0x8F, 0x43, 0xE6, 0xB0, 0x94, 0x43,
+ 0xE6, 0xB0, 0xB4, 0x43, 0xE6, 0xB1, 0x8E, 0x43,
+ 0xE6, 0xB1, 0xA7, 0x43, 0xE6, 0xB2, 0x88, 0x43,
+ 0xE6, 0xB2, 0xBF, 0x43, 0xE6, 0xB3, 0x8C, 0x43,
+ 0xE6, 0xB3, 0x8D, 0x43, 0xE6, 0xB3, 0xA5, 0x43,
+ 0xE6, 0xB3, 0xA8, 0x43, 0xE6, 0xB4, 0x96, 0x43,
+ // Bytes e00 - e3f
+ 0xE6, 0xB4, 0x9B, 0x43, 0xE6, 0xB4, 0x9E, 0x43,
+ 0xE6, 0xB4, 0xB4, 0x43, 0xE6, 0xB4, 0xBE, 0x43,
+ 0xE6, 0xB5, 0x81, 0x43, 0xE6, 0xB5, 0xA9, 0x43,
+ 0xE6, 0xB5, 0xAA, 0x43, 0xE6, 0xB5, 0xB7, 0x43,
+ 0xE6, 0xB5, 0xB8, 0x43, 0xE6, 0xB6, 0x85, 0x43,
+ 0xE6, 0xB7, 0x8B, 0x43, 0xE6, 0xB7, 0x9A, 0x43,
+ 0xE6, 0xB7, 0xAA, 0x43, 0xE6, 0xB7, 0xB9, 0x43,
+ 0xE6, 0xB8, 0x9A, 0x43, 0xE6, 0xB8, 0xAF, 0x43,
+ // Bytes e40 - e7f
+ 0xE6, 0xB9, 0xAE, 0x43, 0xE6, 0xBA, 0x80, 0x43,
+ 0xE6, 0xBA, 0x9C, 0x43, 0xE6, 0xBA, 0xBA, 0x43,
+ 0xE6, 0xBB, 0x87, 0x43, 0xE6, 0xBB, 0x8B, 0x43,
+ 0xE6, 0xBB, 0x91, 0x43, 0xE6, 0xBB, 0x9B, 0x43,
+ 0xE6, 0xBC, 0x8F, 0x43, 0xE6, 0xBC, 0x94, 0x43,
+ 0xE6, 0xBC, 0xA2, 0x43, 0xE6, 0xBC, 0xA3, 0x43,
+ 0xE6, 0xBD, 0xAE, 0x43, 0xE6, 0xBF, 0x86, 0x43,
+ 0xE6, 0xBF, 0xAB, 0x43, 0xE6, 0xBF, 0xBE, 0x43,
+ // Bytes e80 - ebf
+ 0xE7, 0x80, 0x9B, 0x43, 0xE7, 0x80, 0x9E, 0x43,
+ 0xE7, 0x80, 0xB9, 0x43, 0xE7, 0x81, 0x8A, 0x43,
+ 0xE7, 0x81, 0xAB, 0x43, 0xE7, 0x81, 0xB0, 0x43,
+ 0xE7, 0x81, 0xB7, 0x43, 0xE7, 0x81, 0xBD, 0x43,
+ 0xE7, 0x82, 0x99, 0x43, 0xE7, 0x82, 0xAD, 0x43,
+ 0xE7, 0x83, 0x88, 0x43, 0xE7, 0x83, 0x99, 0x43,
+ 0xE7, 0x84, 0xA1, 0x43, 0xE7, 0x85, 0x85, 0x43,
+ 0xE7, 0x85, 0x89, 0x43, 0xE7, 0x85, 0xAE, 0x43,
+ // Bytes ec0 - eff
+ 0xE7, 0x86, 0x9C, 0x43, 0xE7, 0x87, 0x8E, 0x43,
+ 0xE7, 0x87, 0x90, 0x43, 0xE7, 0x88, 0x90, 0x43,
+ 0xE7, 0x88, 0x9B, 0x43, 0xE7, 0x88, 0xA8, 0x43,
+ 0xE7, 0x88, 0xAA, 0x43, 0xE7, 0x88, 0xAB, 0x43,
+ 0xE7, 0x88, 0xB5, 0x43, 0xE7, 0x88, 0xB6, 0x43,
+ 0xE7, 0x88, 0xBB, 0x43, 0xE7, 0x88, 0xBF, 0x43,
+ 0xE7, 0x89, 0x87, 0x43, 0xE7, 0x89, 0x90, 0x43,
+ 0xE7, 0x89, 0x99, 0x43, 0xE7, 0x89, 0x9B, 0x43,
+ // Bytes f00 - f3f
+ 0xE7, 0x89, 0xA2, 0x43, 0xE7, 0x89, 0xB9, 0x43,
+ 0xE7, 0x8A, 0x80, 0x43, 0xE7, 0x8A, 0x95, 0x43,
+ 0xE7, 0x8A, 0xAC, 0x43, 0xE7, 0x8A, 0xAF, 0x43,
+ 0xE7, 0x8B, 0x80, 0x43, 0xE7, 0x8B, 0xBC, 0x43,
+ 0xE7, 0x8C, 0xAA, 0x43, 0xE7, 0x8D, 0xB5, 0x43,
+ 0xE7, 0x8D, 0xBA, 0x43, 0xE7, 0x8E, 0x84, 0x43,
+ 0xE7, 0x8E, 0x87, 0x43, 0xE7, 0x8E, 0x89, 0x43,
+ 0xE7, 0x8E, 0x8B, 0x43, 0xE7, 0x8E, 0xA5, 0x43,
+ // Bytes f40 - f7f
+ 0xE7, 0x8E, 0xB2, 0x43, 0xE7, 0x8F, 0x9E, 0x43,
+ 0xE7, 0x90, 0x86, 0x43, 0xE7, 0x90, 0x89, 0x43,
+ 0xE7, 0x90, 0xA2, 0x43, 0xE7, 0x91, 0x87, 0x43,
+ 0xE7, 0x91, 0x9C, 0x43, 0xE7, 0x91, 0xA9, 0x43,
+ 0xE7, 0x91, 0xB1, 0x43, 0xE7, 0x92, 0x85, 0x43,
+ 0xE7, 0x92, 0x89, 0x43, 0xE7, 0x92, 0x98, 0x43,
+ 0xE7, 0x93, 0x8A, 0x43, 0xE7, 0x93, 0x9C, 0x43,
+ 0xE7, 0x93, 0xA6, 0x43, 0xE7, 0x94, 0x86, 0x43,
+ // Bytes f80 - fbf
+ 0xE7, 0x94, 0x98, 0x43, 0xE7, 0x94, 0x9F, 0x43,
+ 0xE7, 0x94, 0xA4, 0x43, 0xE7, 0x94, 0xA8, 0x43,
+ 0xE7, 0x94, 0xB0, 0x43, 0xE7, 0x94, 0xB2, 0x43,
+ 0xE7, 0x94, 0xB3, 0x43, 0xE7, 0x94, 0xB7, 0x43,
+ 0xE7, 0x94, 0xBB, 0x43, 0xE7, 0x94, 0xBE, 0x43,
+ 0xE7, 0x95, 0x99, 0x43, 0xE7, 0x95, 0xA5, 0x43,
+ 0xE7, 0x95, 0xB0, 0x43, 0xE7, 0x96, 0x8B, 0x43,
+ 0xE7, 0x96, 0x92, 0x43, 0xE7, 0x97, 0xA2, 0x43,
+ // Bytes fc0 - fff
+ 0xE7, 0x98, 0x90, 0x43, 0xE7, 0x98, 0x9D, 0x43,
+ 0xE7, 0x98, 0x9F, 0x43, 0xE7, 0x99, 0x82, 0x43,
+ 0xE7, 0x99, 0xA9, 0x43, 0xE7, 0x99, 0xB6, 0x43,
+ 0xE7, 0x99, 0xBD, 0x43, 0xE7, 0x9A, 0xAE, 0x43,
+ 0xE7, 0x9A, 0xBF, 0x43, 0xE7, 0x9B, 0x8A, 0x43,
+ 0xE7, 0x9B, 0x9B, 0x43, 0xE7, 0x9B, 0xA3, 0x43,
+ 0xE7, 0x9B, 0xA7, 0x43, 0xE7, 0x9B, 0xAE, 0x43,
+ 0xE7, 0x9B, 0xB4, 0x43, 0xE7, 0x9C, 0x81, 0x43,
+ // Bytes 1000 - 103f
+ 0xE7, 0x9C, 0x9E, 0x43, 0xE7, 0x9C, 0x9F, 0x43,
+ 0xE7, 0x9D, 0x80, 0x43, 0xE7, 0x9D, 0x8A, 0x43,
+ 0xE7, 0x9E, 0x8B, 0x43, 0xE7, 0x9E, 0xA7, 0x43,
+ 0xE7, 0x9F, 0x9B, 0x43, 0xE7, 0x9F, 0xA2, 0x43,
+ 0xE7, 0x9F, 0xB3, 0x43, 0xE7, 0xA1, 0x8E, 0x43,
+ 0xE7, 0xA1, 0xAB, 0x43, 0xE7, 0xA2, 0x8C, 0x43,
+ 0xE7, 0xA2, 0x91, 0x43, 0xE7, 0xA3, 0x8A, 0x43,
+ 0xE7, 0xA3, 0x8C, 0x43, 0xE7, 0xA3, 0xBB, 0x43,
+ // Bytes 1040 - 107f
+ 0xE7, 0xA4, 0xAA, 0x43, 0xE7, 0xA4, 0xBA, 0x43,
+ 0xE7, 0xA4, 0xBC, 0x43, 0xE7, 0xA4, 0xBE, 0x43,
+ 0xE7, 0xA5, 0x88, 0x43, 0xE7, 0xA5, 0x89, 0x43,
+ 0xE7, 0xA5, 0x90, 0x43, 0xE7, 0xA5, 0x96, 0x43,
+ 0xE7, 0xA5, 0x9D, 0x43, 0xE7, 0xA5, 0x9E, 0x43,
+ 0xE7, 0xA5, 0xA5, 0x43, 0xE7, 0xA5, 0xBF, 0x43,
+ 0xE7, 0xA6, 0x81, 0x43, 0xE7, 0xA6, 0x8D, 0x43,
+ 0xE7, 0xA6, 0x8E, 0x43, 0xE7, 0xA6, 0x8F, 0x43,
+ // Bytes 1080 - 10bf
+ 0xE7, 0xA6, 0xAE, 0x43, 0xE7, 0xA6, 0xB8, 0x43,
+ 0xE7, 0xA6, 0xBE, 0x43, 0xE7, 0xA7, 0x8A, 0x43,
+ 0xE7, 0xA7, 0x98, 0x43, 0xE7, 0xA7, 0xAB, 0x43,
+ 0xE7, 0xA8, 0x9C, 0x43, 0xE7, 0xA9, 0x80, 0x43,
+ 0xE7, 0xA9, 0x8A, 0x43, 0xE7, 0xA9, 0x8F, 0x43,
+ 0xE7, 0xA9, 0xB4, 0x43, 0xE7, 0xA9, 0xBA, 0x43,
+ 0xE7, 0xAA, 0x81, 0x43, 0xE7, 0xAA, 0xB1, 0x43,
+ 0xE7, 0xAB, 0x8B, 0x43, 0xE7, 0xAB, 0xAE, 0x43,
+ // Bytes 10c0 - 10ff
+ 0xE7, 0xAB, 0xB9, 0x43, 0xE7, 0xAC, 0xA0, 0x43,
+ 0xE7, 0xAE, 0x8F, 0x43, 0xE7, 0xAF, 0x80, 0x43,
+ 0xE7, 0xAF, 0x86, 0x43, 0xE7, 0xAF, 0x89, 0x43,
+ 0xE7, 0xB0, 0xBE, 0x43, 0xE7, 0xB1, 0xA0, 0x43,
+ 0xE7, 0xB1, 0xB3, 0x43, 0xE7, 0xB1, 0xBB, 0x43,
+ 0xE7, 0xB2, 0x92, 0x43, 0xE7, 0xB2, 0xBE, 0x43,
+ 0xE7, 0xB3, 0x92, 0x43, 0xE7, 0xB3, 0x96, 0x43,
+ 0xE7, 0xB3, 0xA3, 0x43, 0xE7, 0xB3, 0xA7, 0x43,
+ // Bytes 1100 - 113f
+ 0xE7, 0xB3, 0xA8, 0x43, 0xE7, 0xB3, 0xB8, 0x43,
+ 0xE7, 0xB4, 0x80, 0x43, 0xE7, 0xB4, 0x90, 0x43,
+ 0xE7, 0xB4, 0xA2, 0x43, 0xE7, 0xB4, 0xAF, 0x43,
+ 0xE7, 0xB5, 0x82, 0x43, 0xE7, 0xB5, 0x9B, 0x43,
+ 0xE7, 0xB5, 0xA3, 0x43, 0xE7, 0xB6, 0xA0, 0x43,
+ 0xE7, 0xB6, 0xBE, 0x43, 0xE7, 0xB7, 0x87, 0x43,
+ 0xE7, 0xB7, 0xB4, 0x43, 0xE7, 0xB8, 0x82, 0x43,
+ 0xE7, 0xB8, 0x89, 0x43, 0xE7, 0xB8, 0xB7, 0x43,
+ // Bytes 1140 - 117f
+ 0xE7, 0xB9, 0x81, 0x43, 0xE7, 0xB9, 0x85, 0x43,
+ 0xE7, 0xBC, 0xB6, 0x43, 0xE7, 0xBC, 0xBE, 0x43,
+ 0xE7, 0xBD, 0x91, 0x43, 0xE7, 0xBD, 0xB2, 0x43,
+ 0xE7, 0xBD, 0xB9, 0x43, 0xE7, 0xBD, 0xBA, 0x43,
+ 0xE7, 0xBE, 0x85, 0x43, 0xE7, 0xBE, 0x8A, 0x43,
+ 0xE7, 0xBE, 0x95, 0x43, 0xE7, 0xBE, 0x9A, 0x43,
+ 0xE7, 0xBE, 0xBD, 0x43, 0xE7, 0xBF, 0xBA, 0x43,
+ 0xE8, 0x80, 0x81, 0x43, 0xE8, 0x80, 0x85, 0x43,
+ // Bytes 1180 - 11bf
+ 0xE8, 0x80, 0x8C, 0x43, 0xE8, 0x80, 0x92, 0x43,
+ 0xE8, 0x80, 0xB3, 0x43, 0xE8, 0x81, 0x86, 0x43,
+ 0xE8, 0x81, 0xA0, 0x43, 0xE8, 0x81, 0xAF, 0x43,
+ 0xE8, 0x81, 0xB0, 0x43, 0xE8, 0x81, 0xBE, 0x43,
+ 0xE8, 0x81, 0xBF, 0x43, 0xE8, 0x82, 0x89, 0x43,
+ 0xE8, 0x82, 0x8B, 0x43, 0xE8, 0x82, 0xAD, 0x43,
+ 0xE8, 0x82, 0xB2, 0x43, 0xE8, 0x84, 0x83, 0x43,
+ 0xE8, 0x84, 0xBE, 0x43, 0xE8, 0x87, 0x98, 0x43,
+ // Bytes 11c0 - 11ff
+ 0xE8, 0x87, 0xA3, 0x43, 0xE8, 0x87, 0xA8, 0x43,
+ 0xE8, 0x87, 0xAA, 0x43, 0xE8, 0x87, 0xAD, 0x43,
+ 0xE8, 0x87, 0xB3, 0x43, 0xE8, 0x87, 0xBC, 0x43,
+ 0xE8, 0x88, 0x81, 0x43, 0xE8, 0x88, 0x84, 0x43,
+ 0xE8, 0x88, 0x8C, 0x43, 0xE8, 0x88, 0x98, 0x43,
+ 0xE8, 0x88, 0x9B, 0x43, 0xE8, 0x88, 0x9F, 0x43,
+ 0xE8, 0x89, 0xAE, 0x43, 0xE8, 0x89, 0xAF, 0x43,
+ 0xE8, 0x89, 0xB2, 0x43, 0xE8, 0x89, 0xB8, 0x43,
+ // Bytes 1200 - 123f
+ 0xE8, 0x89, 0xB9, 0x43, 0xE8, 0x8A, 0x8B, 0x43,
+ 0xE8, 0x8A, 0x91, 0x43, 0xE8, 0x8A, 0x9D, 0x43,
+ 0xE8, 0x8A, 0xB1, 0x43, 0xE8, 0x8A, 0xB3, 0x43,
+ 0xE8, 0x8A, 0xBD, 0x43, 0xE8, 0x8B, 0xA5, 0x43,
+ 0xE8, 0x8B, 0xA6, 0x43, 0xE8, 0x8C, 0x9D, 0x43,
+ 0xE8, 0x8C, 0xA3, 0x43, 0xE8, 0x8C, 0xB6, 0x43,
+ 0xE8, 0x8D, 0x92, 0x43, 0xE8, 0x8D, 0x93, 0x43,
+ 0xE8, 0x8D, 0xA3, 0x43, 0xE8, 0x8E, 0xAD, 0x43,
+ // Bytes 1240 - 127f
+ 0xE8, 0x8E, 0xBD, 0x43, 0xE8, 0x8F, 0x89, 0x43,
+ 0xE8, 0x8F, 0x8A, 0x43, 0xE8, 0x8F, 0x8C, 0x43,
+ 0xE8, 0x8F, 0x9C, 0x43, 0xE8, 0x8F, 0xA7, 0x43,
+ 0xE8, 0x8F, 0xAF, 0x43, 0xE8, 0x8F, 0xB1, 0x43,
+ 0xE8, 0x90, 0xBD, 0x43, 0xE8, 0x91, 0x89, 0x43,
+ 0xE8, 0x91, 0x97, 0x43, 0xE8, 0x93, 0xAE, 0x43,
+ 0xE8, 0x93, 0xB1, 0x43, 0xE8, 0x93, 0xB3, 0x43,
+ 0xE8, 0x93, 0xBC, 0x43, 0xE8, 0x94, 0x96, 0x43,
+ // Bytes 1280 - 12bf
+ 0xE8, 0x95, 0xA4, 0x43, 0xE8, 0x97, 0x8D, 0x43,
+ 0xE8, 0x97, 0xBA, 0x43, 0xE8, 0x98, 0x86, 0x43,
+ 0xE8, 0x98, 0x92, 0x43, 0xE8, 0x98, 0xAD, 0x43,
+ 0xE8, 0x98, 0xBF, 0x43, 0xE8, 0x99, 0x8D, 0x43,
+ 0xE8, 0x99, 0x90, 0x43, 0xE8, 0x99, 0x9C, 0x43,
+ 0xE8, 0x99, 0xA7, 0x43, 0xE8, 0x99, 0xA9, 0x43,
+ 0xE8, 0x99, 0xAB, 0x43, 0xE8, 0x9A, 0x88, 0x43,
+ 0xE8, 0x9A, 0xA9, 0x43, 0xE8, 0x9B, 0xA2, 0x43,
+ // Bytes 12c0 - 12ff
+ 0xE8, 0x9C, 0x8E, 0x43, 0xE8, 0x9C, 0xA8, 0x43,
+ 0xE8, 0x9D, 0xAB, 0x43, 0xE8, 0x9D, 0xB9, 0x43,
+ 0xE8, 0x9E, 0x86, 0x43, 0xE8, 0x9E, 0xBA, 0x43,
+ 0xE8, 0x9F, 0xA1, 0x43, 0xE8, 0xA0, 0x81, 0x43,
+ 0xE8, 0xA0, 0x9F, 0x43, 0xE8, 0xA1, 0x80, 0x43,
+ 0xE8, 0xA1, 0x8C, 0x43, 0xE8, 0xA1, 0xA0, 0x43,
+ 0xE8, 0xA1, 0xA3, 0x43, 0xE8, 0xA3, 0x82, 0x43,
+ 0xE8, 0xA3, 0x8F, 0x43, 0xE8, 0xA3, 0x97, 0x43,
+ // Bytes 1300 - 133f
+ 0xE8, 0xA3, 0x9E, 0x43, 0xE8, 0xA3, 0xA1, 0x43,
+ 0xE8, 0xA3, 0xB8, 0x43, 0xE8, 0xA3, 0xBA, 0x43,
+ 0xE8, 0xA4, 0x90, 0x43, 0xE8, 0xA5, 0x81, 0x43,
+ 0xE8, 0xA5, 0xA4, 0x43, 0xE8, 0xA5, 0xBE, 0x43,
+ 0xE8, 0xA6, 0x86, 0x43, 0xE8, 0xA6, 0x8B, 0x43,
+ 0xE8, 0xA6, 0x96, 0x43, 0xE8, 0xA7, 0x92, 0x43,
+ 0xE8, 0xA7, 0xA3, 0x43, 0xE8, 0xA8, 0x80, 0x43,
+ 0xE8, 0xAA, 0xA0, 0x43, 0xE8, 0xAA, 0xAA, 0x43,
+ // Bytes 1340 - 137f
+ 0xE8, 0xAA, 0xBF, 0x43, 0xE8, 0xAB, 0x8B, 0x43,
+ 0xE8, 0xAB, 0x92, 0x43, 0xE8, 0xAB, 0x96, 0x43,
+ 0xE8, 0xAB, 0xAD, 0x43, 0xE8, 0xAB, 0xB8, 0x43,
+ 0xE8, 0xAB, 0xBE, 0x43, 0xE8, 0xAC, 0x81, 0x43,
+ 0xE8, 0xAC, 0xB9, 0x43, 0xE8, 0xAD, 0x98, 0x43,
+ 0xE8, 0xAE, 0x80, 0x43, 0xE8, 0xAE, 0x8A, 0x43,
+ 0xE8, 0xB0, 0xB7, 0x43, 0xE8, 0xB1, 0x86, 0x43,
+ 0xE8, 0xB1, 0x88, 0x43, 0xE8, 0xB1, 0x95, 0x43,
+ // Bytes 1380 - 13bf
+ 0xE8, 0xB1, 0xB8, 0x43, 0xE8, 0xB2, 0x9D, 0x43,
+ 0xE8, 0xB2, 0xA1, 0x43, 0xE8, 0xB2, 0xA9, 0x43,
+ 0xE8, 0xB2, 0xAB, 0x43, 0xE8, 0xB3, 0x81, 0x43,
+ 0xE8, 0xB3, 0x82, 0x43, 0xE8, 0xB3, 0x87, 0x43,
+ 0xE8, 0xB3, 0x88, 0x43, 0xE8, 0xB3, 0x93, 0x43,
+ 0xE8, 0xB4, 0x88, 0x43, 0xE8, 0xB4, 0x9B, 0x43,
+ 0xE8, 0xB5, 0xA4, 0x43, 0xE8, 0xB5, 0xB0, 0x43,
+ 0xE8, 0xB5, 0xB7, 0x43, 0xE8, 0xB6, 0xB3, 0x43,
+ // Bytes 13c0 - 13ff
+ 0xE8, 0xB6, 0xBC, 0x43, 0xE8, 0xB7, 0x8B, 0x43,
+ 0xE8, 0xB7, 0xAF, 0x43, 0xE8, 0xB7, 0xB0, 0x43,
+ 0xE8, 0xBA, 0xAB, 0x43, 0xE8, 0xBB, 0x8A, 0x43,
+ 0xE8, 0xBB, 0x94, 0x43, 0xE8, 0xBC, 0xA6, 0x43,
+ 0xE8, 0xBC, 0xAA, 0x43, 0xE8, 0xBC, 0xB8, 0x43,
+ 0xE8, 0xBC, 0xBB, 0x43, 0xE8, 0xBD, 0xA2, 0x43,
+ 0xE8, 0xBE, 0x9B, 0x43, 0xE8, 0xBE, 0x9E, 0x43,
+ 0xE8, 0xBE, 0xB0, 0x43, 0xE8, 0xBE, 0xB5, 0x43,
+ // Bytes 1400 - 143f
+ 0xE8, 0xBE, 0xB6, 0x43, 0xE9, 0x80, 0xA3, 0x43,
+ 0xE9, 0x80, 0xB8, 0x43, 0xE9, 0x81, 0x8A, 0x43,
+ 0xE9, 0x81, 0xA9, 0x43, 0xE9, 0x81, 0xB2, 0x43,
+ 0xE9, 0x81, 0xBC, 0x43, 0xE9, 0x82, 0x8F, 0x43,
+ 0xE9, 0x82, 0x91, 0x43, 0xE9, 0x82, 0x94, 0x43,
+ 0xE9, 0x83, 0x8E, 0x43, 0xE9, 0x83, 0x9E, 0x43,
+ 0xE9, 0x83, 0xB1, 0x43, 0xE9, 0x83, 0xBD, 0x43,
+ 0xE9, 0x84, 0x91, 0x43, 0xE9, 0x84, 0x9B, 0x43,
+ // Bytes 1440 - 147f
+ 0xE9, 0x85, 0x89, 0x43, 0xE9, 0x85, 0x8D, 0x43,
+ 0xE9, 0x85, 0xAA, 0x43, 0xE9, 0x86, 0x99, 0x43,
+ 0xE9, 0x86, 0xB4, 0x43, 0xE9, 0x87, 0x86, 0x43,
+ 0xE9, 0x87, 0x8C, 0x43, 0xE9, 0x87, 0x8F, 0x43,
+ 0xE9, 0x87, 0x91, 0x43, 0xE9, 0x88, 0xB4, 0x43,
+ 0xE9, 0x88, 0xB8, 0x43, 0xE9, 0x89, 0xB6, 0x43,
+ 0xE9, 0x89, 0xBC, 0x43, 0xE9, 0x8B, 0x97, 0x43,
+ 0xE9, 0x8B, 0x98, 0x43, 0xE9, 0x8C, 0x84, 0x43,
+ // Bytes 1480 - 14bf
+ 0xE9, 0x8D, 0x8A, 0x43, 0xE9, 0x8F, 0xB9, 0x43,
+ 0xE9, 0x90, 0x95, 0x43, 0xE9, 0x95, 0xB7, 0x43,
+ 0xE9, 0x96, 0x80, 0x43, 0xE9, 0x96, 0x8B, 0x43,
+ 0xE9, 0x96, 0xAD, 0x43, 0xE9, 0x96, 0xB7, 0x43,
+ 0xE9, 0x98, 0x9C, 0x43, 0xE9, 0x98, 0xAE, 0x43,
+ 0xE9, 0x99, 0x8B, 0x43, 0xE9, 0x99, 0x8D, 0x43,
+ 0xE9, 0x99, 0xB5, 0x43, 0xE9, 0x99, 0xB8, 0x43,
+ 0xE9, 0x99, 0xBC, 0x43, 0xE9, 0x9A, 0x86, 0x43,
+ // Bytes 14c0 - 14ff
+ 0xE9, 0x9A, 0xA3, 0x43, 0xE9, 0x9A, 0xB6, 0x43,
+ 0xE9, 0x9A, 0xB7, 0x43, 0xE9, 0x9A, 0xB8, 0x43,
+ 0xE9, 0x9A, 0xB9, 0x43, 0xE9, 0x9B, 0x83, 0x43,
+ 0xE9, 0x9B, 0xA2, 0x43, 0xE9, 0x9B, 0xA3, 0x43,
+ 0xE9, 0x9B, 0xA8, 0x43, 0xE9, 0x9B, 0xB6, 0x43,
+ 0xE9, 0x9B, 0xB7, 0x43, 0xE9, 0x9C, 0xA3, 0x43,
+ 0xE9, 0x9C, 0xB2, 0x43, 0xE9, 0x9D, 0x88, 0x43,
+ 0xE9, 0x9D, 0x91, 0x43, 0xE9, 0x9D, 0x96, 0x43,
+ // Bytes 1500 - 153f
+ 0xE9, 0x9D, 0x9E, 0x43, 0xE9, 0x9D, 0xA2, 0x43,
+ 0xE9, 0x9D, 0xA9, 0x43, 0xE9, 0x9F, 0x8B, 0x43,
+ 0xE9, 0x9F, 0x9B, 0x43, 0xE9, 0x9F, 0xA0, 0x43,
+ 0xE9, 0x9F, 0xAD, 0x43, 0xE9, 0x9F, 0xB3, 0x43,
+ 0xE9, 0x9F, 0xBF, 0x43, 0xE9, 0xA0, 0x81, 0x43,
+ 0xE9, 0xA0, 0x85, 0x43, 0xE9, 0xA0, 0x8B, 0x43,
+ 0xE9, 0xA0, 0x98, 0x43, 0xE9, 0xA0, 0xA9, 0x43,
+ 0xE9, 0xA0, 0xBB, 0x43, 0xE9, 0xA1, 0x9E, 0x43,
+ // Bytes 1540 - 157f
+ 0xE9, 0xA2, 0xA8, 0x43, 0xE9, 0xA3, 0x9B, 0x43,
+ 0xE9, 0xA3, 0x9F, 0x43, 0xE9, 0xA3, 0xA2, 0x43,
+ 0xE9, 0xA3, 0xAF, 0x43, 0xE9, 0xA3, 0xBC, 0x43,
+ 0xE9, 0xA4, 0xA8, 0x43, 0xE9, 0xA4, 0xA9, 0x43,
+ 0xE9, 0xA6, 0x96, 0x43, 0xE9, 0xA6, 0x99, 0x43,
+ 0xE9, 0xA6, 0xA7, 0x43, 0xE9, 0xA6, 0xAC, 0x43,
+ 0xE9, 0xA7, 0x82, 0x43, 0xE9, 0xA7, 0xB1, 0x43,
+ 0xE9, 0xA7, 0xBE, 0x43, 0xE9, 0xA9, 0xAA, 0x43,
+ // Bytes 1580 - 15bf
+ 0xE9, 0xAA, 0xA8, 0x43, 0xE9, 0xAB, 0x98, 0x43,
+ 0xE9, 0xAB, 0x9F, 0x43, 0xE9, 0xAC, 0x92, 0x43,
+ 0xE9, 0xAC, 0xA5, 0x43, 0xE9, 0xAC, 0xAF, 0x43,
+ 0xE9, 0xAC, 0xB2, 0x43, 0xE9, 0xAC, 0xBC, 0x43,
+ 0xE9, 0xAD, 0x9A, 0x43, 0xE9, 0xAD, 0xAF, 0x43,
+ 0xE9, 0xB1, 0x80, 0x43, 0xE9, 0xB1, 0x97, 0x43,
+ 0xE9, 0xB3, 0xA5, 0x43, 0xE9, 0xB3, 0xBD, 0x43,
+ 0xE9, 0xB5, 0xA7, 0x43, 0xE9, 0xB6, 0xB4, 0x43,
+ // Bytes 15c0 - 15ff
+ 0xE9, 0xB7, 0xBA, 0x43, 0xE9, 0xB8, 0x9E, 0x43,
+ 0xE9, 0xB9, 0xB5, 0x43, 0xE9, 0xB9, 0xBF, 0x43,
+ 0xE9, 0xBA, 0x97, 0x43, 0xE9, 0xBA, 0x9F, 0x43,
+ 0xE9, 0xBA, 0xA5, 0x43, 0xE9, 0xBA, 0xBB, 0x43,
+ 0xE9, 0xBB, 0x83, 0x43, 0xE9, 0xBB, 0x8D, 0x43,
+ 0xE9, 0xBB, 0x8E, 0x43, 0xE9, 0xBB, 0x91, 0x43,
+ 0xE9, 0xBB, 0xB9, 0x43, 0xE9, 0xBB, 0xBD, 0x43,
+ 0xE9, 0xBB, 0xBE, 0x43, 0xE9, 0xBC, 0x85, 0x43,
+ // Bytes 1600 - 163f
+ 0xE9, 0xBC, 0x8E, 0x43, 0xE9, 0xBC, 0x8F, 0x43,
+ 0xE9, 0xBC, 0x93, 0x43, 0xE9, 0xBC, 0x96, 0x43,
+ 0xE9, 0xBC, 0xA0, 0x43, 0xE9, 0xBC, 0xBB, 0x43,
+ 0xE9, 0xBD, 0x83, 0x43, 0xE9, 0xBD, 0x8A, 0x43,
+ 0xE9, 0xBD, 0x92, 0x43, 0xE9, 0xBE, 0x8D, 0x43,
+ 0xE9, 0xBE, 0x8E, 0x43, 0xE9, 0xBE, 0x9C, 0x43,
+ 0xE9, 0xBE, 0x9F, 0x43, 0xE9, 0xBE, 0xA0, 0x43,
+ 0xEA, 0x9C, 0xA7, 0x43, 0xEA, 0x9D, 0xAF, 0x43,
+ // Bytes 1640 - 167f
+ 0xEA, 0xAC, 0xB7, 0x43, 0xEA, 0xAD, 0x92, 0x44,
+ 0xF0, 0xA0, 0x84, 0xA2, 0x44, 0xF0, 0xA0, 0x94,
+ 0x9C, 0x44, 0xF0, 0xA0, 0x94, 0xA5, 0x44, 0xF0,
+ 0xA0, 0x95, 0x8B, 0x44, 0xF0, 0xA0, 0x98, 0xBA,
+ 0x44, 0xF0, 0xA0, 0xA0, 0x84, 0x44, 0xF0, 0xA0,
+ 0xA3, 0x9E, 0x44, 0xF0, 0xA0, 0xA8, 0xAC, 0x44,
+ 0xF0, 0xA0, 0xAD, 0xA3, 0x44, 0xF0, 0xA1, 0x93,
+ 0xA4, 0x44, 0xF0, 0xA1, 0x9A, 0xA8, 0x44, 0xF0,
+ // Bytes 1680 - 16bf
+ 0xA1, 0x9B, 0xAA, 0x44, 0xF0, 0xA1, 0xA7, 0x88,
+ 0x44, 0xF0, 0xA1, 0xAC, 0x98, 0x44, 0xF0, 0xA1,
+ 0xB4, 0x8B, 0x44, 0xF0, 0xA1, 0xB7, 0xA4, 0x44,
+ 0xF0, 0xA1, 0xB7, 0xA6, 0x44, 0xF0, 0xA2, 0x86,
+ 0x83, 0x44, 0xF0, 0xA2, 0x86, 0x9F, 0x44, 0xF0,
+ 0xA2, 0x8C, 0xB1, 0x44, 0xF0, 0xA2, 0x9B, 0x94,
+ 0x44, 0xF0, 0xA2, 0xA1, 0x84, 0x44, 0xF0, 0xA2,
+ 0xA1, 0x8A, 0x44, 0xF0, 0xA2, 0xAC, 0x8C, 0x44,
+ // Bytes 16c0 - 16ff
+ 0xF0, 0xA2, 0xAF, 0xB1, 0x44, 0xF0, 0xA3, 0x80,
+ 0x8A, 0x44, 0xF0, 0xA3, 0x8A, 0xB8, 0x44, 0xF0,
+ 0xA3, 0x8D, 0x9F, 0x44, 0xF0, 0xA3, 0x8E, 0x93,
+ 0x44, 0xF0, 0xA3, 0x8E, 0x9C, 0x44, 0xF0, 0xA3,
+ 0x8F, 0x83, 0x44, 0xF0, 0xA3, 0x8F, 0x95, 0x44,
+ 0xF0, 0xA3, 0x91, 0xAD, 0x44, 0xF0, 0xA3, 0x9A,
+ 0xA3, 0x44, 0xF0, 0xA3, 0xA2, 0xA7, 0x44, 0xF0,
+ 0xA3, 0xAA, 0x8D, 0x44, 0xF0, 0xA3, 0xAB, 0xBA,
+ // Bytes 1700 - 173f
+ 0x44, 0xF0, 0xA3, 0xB2, 0xBC, 0x44, 0xF0, 0xA3,
+ 0xB4, 0x9E, 0x44, 0xF0, 0xA3, 0xBB, 0x91, 0x44,
+ 0xF0, 0xA3, 0xBD, 0x9E, 0x44, 0xF0, 0xA3, 0xBE,
+ 0x8E, 0x44, 0xF0, 0xA4, 0x89, 0xA3, 0x44, 0xF0,
+ 0xA4, 0x8B, 0xAE, 0x44, 0xF0, 0xA4, 0x8E, 0xAB,
+ 0x44, 0xF0, 0xA4, 0x98, 0x88, 0x44, 0xF0, 0xA4,
+ 0x9C, 0xB5, 0x44, 0xF0, 0xA4, 0xA0, 0x94, 0x44,
+ 0xF0, 0xA4, 0xB0, 0xB6, 0x44, 0xF0, 0xA4, 0xB2,
+ // Bytes 1740 - 177f
+ 0x92, 0x44, 0xF0, 0xA4, 0xBE, 0xA1, 0x44, 0xF0,
+ 0xA4, 0xBE, 0xB8, 0x44, 0xF0, 0xA5, 0x81, 0x84,
+ 0x44, 0xF0, 0xA5, 0x83, 0xB2, 0x44, 0xF0, 0xA5,
+ 0x83, 0xB3, 0x44, 0xF0, 0xA5, 0x84, 0x99, 0x44,
+ 0xF0, 0xA5, 0x84, 0xB3, 0x44, 0xF0, 0xA5, 0x89,
+ 0x89, 0x44, 0xF0, 0xA5, 0x90, 0x9D, 0x44, 0xF0,
+ 0xA5, 0x98, 0xA6, 0x44, 0xF0, 0xA5, 0x9A, 0x9A,
+ 0x44, 0xF0, 0xA5, 0x9B, 0x85, 0x44, 0xF0, 0xA5,
+ // Bytes 1780 - 17bf
+ 0xA5, 0xBC, 0x44, 0xF0, 0xA5, 0xAA, 0xA7, 0x44,
+ 0xF0, 0xA5, 0xAE, 0xAB, 0x44, 0xF0, 0xA5, 0xB2,
+ 0x80, 0x44, 0xF0, 0xA5, 0xB3, 0x90, 0x44, 0xF0,
+ 0xA5, 0xBE, 0x86, 0x44, 0xF0, 0xA6, 0x87, 0x9A,
+ 0x44, 0xF0, 0xA6, 0x88, 0xA8, 0x44, 0xF0, 0xA6,
+ 0x89, 0x87, 0x44, 0xF0, 0xA6, 0x8B, 0x99, 0x44,
+ 0xF0, 0xA6, 0x8C, 0xBE, 0x44, 0xF0, 0xA6, 0x93,
+ 0x9A, 0x44, 0xF0, 0xA6, 0x94, 0xA3, 0x44, 0xF0,
+ // Bytes 17c0 - 17ff
+ 0xA6, 0x96, 0xA8, 0x44, 0xF0, 0xA6, 0x9E, 0xA7,
+ 0x44, 0xF0, 0xA6, 0x9E, 0xB5, 0x44, 0xF0, 0xA6,
+ 0xAC, 0xBC, 0x44, 0xF0, 0xA6, 0xB0, 0xB6, 0x44,
+ 0xF0, 0xA6, 0xB3, 0x95, 0x44, 0xF0, 0xA6, 0xB5,
+ 0xAB, 0x44, 0xF0, 0xA6, 0xBC, 0xAC, 0x44, 0xF0,
+ 0xA6, 0xBE, 0xB1, 0x44, 0xF0, 0xA7, 0x83, 0x92,
+ 0x44, 0xF0, 0xA7, 0x8F, 0x8A, 0x44, 0xF0, 0xA7,
+ 0x99, 0xA7, 0x44, 0xF0, 0xA7, 0xA2, 0xAE, 0x44,
+ // Bytes 1800 - 183f
+ 0xF0, 0xA7, 0xA5, 0xA6, 0x44, 0xF0, 0xA7, 0xB2,
+ 0xA8, 0x44, 0xF0, 0xA7, 0xBB, 0x93, 0x44, 0xF0,
+ 0xA7, 0xBC, 0xAF, 0x44, 0xF0, 0xA8, 0x97, 0x92,
+ 0x44, 0xF0, 0xA8, 0x97, 0xAD, 0x44, 0xF0, 0xA8,
+ 0x9C, 0xAE, 0x44, 0xF0, 0xA8, 0xAF, 0xBA, 0x44,
+ 0xF0, 0xA8, 0xB5, 0xB7, 0x44, 0xF0, 0xA9, 0x85,
+ 0x85, 0x44, 0xF0, 0xA9, 0x87, 0x9F, 0x44, 0xF0,
+ 0xA9, 0x88, 0x9A, 0x44, 0xF0, 0xA9, 0x90, 0x8A,
+ // Bytes 1840 - 187f
+ 0x44, 0xF0, 0xA9, 0x92, 0x96, 0x44, 0xF0, 0xA9,
+ 0x96, 0xB6, 0x44, 0xF0, 0xA9, 0xAC, 0xB0, 0x44,
+ 0xF0, 0xAA, 0x83, 0x8E, 0x44, 0xF0, 0xAA, 0x84,
+ 0x85, 0x44, 0xF0, 0xAA, 0x88, 0x8E, 0x44, 0xF0,
+ 0xAA, 0x8A, 0x91, 0x44, 0xF0, 0xAA, 0x8E, 0x92,
+ 0x44, 0xF0, 0xAA, 0x98, 0x80, 0x42, 0x21, 0x21,
+ 0x42, 0x21, 0x3F, 0x42, 0x2E, 0x2E, 0x42, 0x30,
+ 0x2C, 0x42, 0x30, 0x2E, 0x42, 0x31, 0x2C, 0x42,
+ // Bytes 1880 - 18bf
+ 0x31, 0x2E, 0x42, 0x31, 0x30, 0x42, 0x31, 0x31,
+ 0x42, 0x31, 0x32, 0x42, 0x31, 0x33, 0x42, 0x31,
+ 0x34, 0x42, 0x31, 0x35, 0x42, 0x31, 0x36, 0x42,
+ 0x31, 0x37, 0x42, 0x31, 0x38, 0x42, 0x31, 0x39,
+ 0x42, 0x32, 0x2C, 0x42, 0x32, 0x2E, 0x42, 0x32,
+ 0x30, 0x42, 0x32, 0x31, 0x42, 0x32, 0x32, 0x42,
+ 0x32, 0x33, 0x42, 0x32, 0x34, 0x42, 0x32, 0x35,
+ 0x42, 0x32, 0x36, 0x42, 0x32, 0x37, 0x42, 0x32,
+ // Bytes 18c0 - 18ff
+ 0x38, 0x42, 0x32, 0x39, 0x42, 0x33, 0x2C, 0x42,
+ 0x33, 0x2E, 0x42, 0x33, 0x30, 0x42, 0x33, 0x31,
+ 0x42, 0x33, 0x32, 0x42, 0x33, 0x33, 0x42, 0x33,
+ 0x34, 0x42, 0x33, 0x35, 0x42, 0x33, 0x36, 0x42,
+ 0x33, 0x37, 0x42, 0x33, 0x38, 0x42, 0x33, 0x39,
+ 0x42, 0x34, 0x2C, 0x42, 0x34, 0x2E, 0x42, 0x34,
+ 0x30, 0x42, 0x34, 0x31, 0x42, 0x34, 0x32, 0x42,
+ 0x34, 0x33, 0x42, 0x34, 0x34, 0x42, 0x34, 0x35,
+ // Bytes 1900 - 193f
+ 0x42, 0x34, 0x36, 0x42, 0x34, 0x37, 0x42, 0x34,
+ 0x38, 0x42, 0x34, 0x39, 0x42, 0x35, 0x2C, 0x42,
+ 0x35, 0x2E, 0x42, 0x35, 0x30, 0x42, 0x36, 0x2C,
+ 0x42, 0x36, 0x2E, 0x42, 0x37, 0x2C, 0x42, 0x37,
+ 0x2E, 0x42, 0x38, 0x2C, 0x42, 0x38, 0x2E, 0x42,
+ 0x39, 0x2C, 0x42, 0x39, 0x2E, 0x42, 0x3D, 0x3D,
+ 0x42, 0x3F, 0x21, 0x42, 0x3F, 0x3F, 0x42, 0x41,
+ 0x55, 0x42, 0x42, 0x71, 0x42, 0x43, 0x44, 0x42,
+ // Bytes 1940 - 197f
+ 0x44, 0x4A, 0x42, 0x44, 0x5A, 0x42, 0x44, 0x7A,
+ 0x42, 0x47, 0x42, 0x42, 0x47, 0x79, 0x42, 0x48,
+ 0x50, 0x42, 0x48, 0x56, 0x42, 0x48, 0x67, 0x42,
+ 0x48, 0x7A, 0x42, 0x49, 0x49, 0x42, 0x49, 0x4A,
+ 0x42, 0x49, 0x55, 0x42, 0x49, 0x56, 0x42, 0x49,
+ 0x58, 0x42, 0x4B, 0x42, 0x42, 0x4B, 0x4B, 0x42,
+ 0x4B, 0x4D, 0x42, 0x4C, 0x4A, 0x42, 0x4C, 0x6A,
+ 0x42, 0x4D, 0x42, 0x42, 0x4D, 0x43, 0x42, 0x4D,
+ // Bytes 1980 - 19bf
+ 0x44, 0x42, 0x4D, 0x56, 0x42, 0x4D, 0x57, 0x42,
+ 0x4E, 0x4A, 0x42, 0x4E, 0x6A, 0x42, 0x4E, 0x6F,
+ 0x42, 0x50, 0x48, 0x42, 0x50, 0x52, 0x42, 0x50,
+ 0x61, 0x42, 0x52, 0x73, 0x42, 0x53, 0x44, 0x42,
+ 0x53, 0x4D, 0x42, 0x53, 0x53, 0x42, 0x53, 0x76,
+ 0x42, 0x54, 0x4D, 0x42, 0x56, 0x49, 0x42, 0x57,
+ 0x43, 0x42, 0x57, 0x5A, 0x42, 0x57, 0x62, 0x42,
+ 0x58, 0x49, 0x42, 0x63, 0x63, 0x42, 0x63, 0x64,
+ // Bytes 19c0 - 19ff
+ 0x42, 0x63, 0x6D, 0x42, 0x64, 0x42, 0x42, 0x64,
+ 0x61, 0x42, 0x64, 0x6C, 0x42, 0x64, 0x6D, 0x42,
+ 0x64, 0x7A, 0x42, 0x65, 0x56, 0x42, 0x66, 0x66,
+ 0x42, 0x66, 0x69, 0x42, 0x66, 0x6C, 0x42, 0x66,
+ 0x6D, 0x42, 0x68, 0x61, 0x42, 0x69, 0x69, 0x42,
+ 0x69, 0x6A, 0x42, 0x69, 0x6E, 0x42, 0x69, 0x76,
+ 0x42, 0x69, 0x78, 0x42, 0x6B, 0x41, 0x42, 0x6B,
+ 0x56, 0x42, 0x6B, 0x57, 0x42, 0x6B, 0x67, 0x42,
+ // Bytes 1a00 - 1a3f
+ 0x6B, 0x6C, 0x42, 0x6B, 0x6D, 0x42, 0x6B, 0x74,
+ 0x42, 0x6C, 0x6A, 0x42, 0x6C, 0x6D, 0x42, 0x6C,
+ 0x6E, 0x42, 0x6C, 0x78, 0x42, 0x6D, 0x32, 0x42,
+ 0x6D, 0x33, 0x42, 0x6D, 0x41, 0x42, 0x6D, 0x56,
+ 0x42, 0x6D, 0x57, 0x42, 0x6D, 0x62, 0x42, 0x6D,
+ 0x67, 0x42, 0x6D, 0x6C, 0x42, 0x6D, 0x6D, 0x42,
+ 0x6D, 0x73, 0x42, 0x6E, 0x41, 0x42, 0x6E, 0x46,
+ 0x42, 0x6E, 0x56, 0x42, 0x6E, 0x57, 0x42, 0x6E,
+ // Bytes 1a40 - 1a7f
+ 0x6A, 0x42, 0x6E, 0x6D, 0x42, 0x6E, 0x73, 0x42,
+ 0x6F, 0x56, 0x42, 0x70, 0x41, 0x42, 0x70, 0x46,
+ 0x42, 0x70, 0x56, 0x42, 0x70, 0x57, 0x42, 0x70,
+ 0x63, 0x42, 0x70, 0x73, 0x42, 0x73, 0x72, 0x42,
+ 0x73, 0x74, 0x42, 0x76, 0x69, 0x42, 0x78, 0x69,
+ 0x43, 0x28, 0x31, 0x29, 0x43, 0x28, 0x32, 0x29,
+ 0x43, 0x28, 0x33, 0x29, 0x43, 0x28, 0x34, 0x29,
+ 0x43, 0x28, 0x35, 0x29, 0x43, 0x28, 0x36, 0x29,
+ // Bytes 1a80 - 1abf
+ 0x43, 0x28, 0x37, 0x29, 0x43, 0x28, 0x38, 0x29,
+ 0x43, 0x28, 0x39, 0x29, 0x43, 0x28, 0x41, 0x29,
+ 0x43, 0x28, 0x42, 0x29, 0x43, 0x28, 0x43, 0x29,
+ 0x43, 0x28, 0x44, 0x29, 0x43, 0x28, 0x45, 0x29,
+ 0x43, 0x28, 0x46, 0x29, 0x43, 0x28, 0x47, 0x29,
+ 0x43, 0x28, 0x48, 0x29, 0x43, 0x28, 0x49, 0x29,
+ 0x43, 0x28, 0x4A, 0x29, 0x43, 0x28, 0x4B, 0x29,
+ 0x43, 0x28, 0x4C, 0x29, 0x43, 0x28, 0x4D, 0x29,
+ // Bytes 1ac0 - 1aff
+ 0x43, 0x28, 0x4E, 0x29, 0x43, 0x28, 0x4F, 0x29,
+ 0x43, 0x28, 0x50, 0x29, 0x43, 0x28, 0x51, 0x29,
+ 0x43, 0x28, 0x52, 0x29, 0x43, 0x28, 0x53, 0x29,
+ 0x43, 0x28, 0x54, 0x29, 0x43, 0x28, 0x55, 0x29,
+ 0x43, 0x28, 0x56, 0x29, 0x43, 0x28, 0x57, 0x29,
+ 0x43, 0x28, 0x58, 0x29, 0x43, 0x28, 0x59, 0x29,
+ 0x43, 0x28, 0x5A, 0x29, 0x43, 0x28, 0x61, 0x29,
+ 0x43, 0x28, 0x62, 0x29, 0x43, 0x28, 0x63, 0x29,
+ // Bytes 1b00 - 1b3f
+ 0x43, 0x28, 0x64, 0x29, 0x43, 0x28, 0x65, 0x29,
+ 0x43, 0x28, 0x66, 0x29, 0x43, 0x28, 0x67, 0x29,
+ 0x43, 0x28, 0x68, 0x29, 0x43, 0x28, 0x69, 0x29,
+ 0x43, 0x28, 0x6A, 0x29, 0x43, 0x28, 0x6B, 0x29,
+ 0x43, 0x28, 0x6C, 0x29, 0x43, 0x28, 0x6D, 0x29,
+ 0x43, 0x28, 0x6E, 0x29, 0x43, 0x28, 0x6F, 0x29,
+ 0x43, 0x28, 0x70, 0x29, 0x43, 0x28, 0x71, 0x29,
+ 0x43, 0x28, 0x72, 0x29, 0x43, 0x28, 0x73, 0x29,
+ // Bytes 1b40 - 1b7f
+ 0x43, 0x28, 0x74, 0x29, 0x43, 0x28, 0x75, 0x29,
+ 0x43, 0x28, 0x76, 0x29, 0x43, 0x28, 0x77, 0x29,
+ 0x43, 0x28, 0x78, 0x29, 0x43, 0x28, 0x79, 0x29,
+ 0x43, 0x28, 0x7A, 0x29, 0x43, 0x2E, 0x2E, 0x2E,
+ 0x43, 0x31, 0x30, 0x2E, 0x43, 0x31, 0x31, 0x2E,
+ 0x43, 0x31, 0x32, 0x2E, 0x43, 0x31, 0x33, 0x2E,
+ 0x43, 0x31, 0x34, 0x2E, 0x43, 0x31, 0x35, 0x2E,
+ 0x43, 0x31, 0x36, 0x2E, 0x43, 0x31, 0x37, 0x2E,
+ // Bytes 1b80 - 1bbf
+ 0x43, 0x31, 0x38, 0x2E, 0x43, 0x31, 0x39, 0x2E,
+ 0x43, 0x32, 0x30, 0x2E, 0x43, 0x3A, 0x3A, 0x3D,
+ 0x43, 0x3D, 0x3D, 0x3D, 0x43, 0x43, 0x6F, 0x2E,
+ 0x43, 0x46, 0x41, 0x58, 0x43, 0x47, 0x48, 0x7A,
+ 0x43, 0x47, 0x50, 0x61, 0x43, 0x49, 0x49, 0x49,
+ 0x43, 0x4C, 0x54, 0x44, 0x43, 0x4C, 0xC2, 0xB7,
+ 0x43, 0x4D, 0x48, 0x7A, 0x43, 0x4D, 0x50, 0x61,
+ 0x43, 0x4D, 0xCE, 0xA9, 0x43, 0x50, 0x50, 0x4D,
+ // Bytes 1bc0 - 1bff
+ 0x43, 0x50, 0x50, 0x56, 0x43, 0x50, 0x54, 0x45,
+ 0x43, 0x54, 0x45, 0x4C, 0x43, 0x54, 0x48, 0x7A,
+ 0x43, 0x56, 0x49, 0x49, 0x43, 0x58, 0x49, 0x49,
+ 0x43, 0x61, 0x2F, 0x63, 0x43, 0x61, 0x2F, 0x73,
+ 0x43, 0x61, 0xCA, 0xBE, 0x43, 0x62, 0x61, 0x72,
+ 0x43, 0x63, 0x2F, 0x6F, 0x43, 0x63, 0x2F, 0x75,
+ 0x43, 0x63, 0x61, 0x6C, 0x43, 0x63, 0x6D, 0x32,
+ 0x43, 0x63, 0x6D, 0x33, 0x43, 0x64, 0x6D, 0x32,
+ // Bytes 1c00 - 1c3f
+ 0x43, 0x64, 0x6D, 0x33, 0x43, 0x65, 0x72, 0x67,
+ 0x43, 0x66, 0x66, 0x69, 0x43, 0x66, 0x66, 0x6C,
+ 0x43, 0x67, 0x61, 0x6C, 0x43, 0x68, 0x50, 0x61,
+ 0x43, 0x69, 0x69, 0x69, 0x43, 0x6B, 0x48, 0x7A,
+ 0x43, 0x6B, 0x50, 0x61, 0x43, 0x6B, 0x6D, 0x32,
+ 0x43, 0x6B, 0x6D, 0x33, 0x43, 0x6B, 0xCE, 0xA9,
+ 0x43, 0x6C, 0x6F, 0x67, 0x43, 0x6C, 0xC2, 0xB7,
+ 0x43, 0x6D, 0x69, 0x6C, 0x43, 0x6D, 0x6D, 0x32,
+ // Bytes 1c40 - 1c7f
+ 0x43, 0x6D, 0x6D, 0x33, 0x43, 0x6D, 0x6F, 0x6C,
+ 0x43, 0x72, 0x61, 0x64, 0x43, 0x76, 0x69, 0x69,
+ 0x43, 0x78, 0x69, 0x69, 0x43, 0xC2, 0xB0, 0x43,
+ 0x43, 0xC2, 0xB0, 0x46, 0x43, 0xCA, 0xBC, 0x6E,
+ 0x43, 0xCE, 0xBC, 0x41, 0x43, 0xCE, 0xBC, 0x46,
+ 0x43, 0xCE, 0xBC, 0x56, 0x43, 0xCE, 0xBC, 0x57,
+ 0x43, 0xCE, 0xBC, 0x67, 0x43, 0xCE, 0xBC, 0x6C,
+ 0x43, 0xCE, 0xBC, 0x6D, 0x43, 0xCE, 0xBC, 0x73,
+ // Bytes 1c80 - 1cbf
+ 0x44, 0x28, 0x31, 0x30, 0x29, 0x44, 0x28, 0x31,
+ 0x31, 0x29, 0x44, 0x28, 0x31, 0x32, 0x29, 0x44,
+ 0x28, 0x31, 0x33, 0x29, 0x44, 0x28, 0x31, 0x34,
+ 0x29, 0x44, 0x28, 0x31, 0x35, 0x29, 0x44, 0x28,
+ 0x31, 0x36, 0x29, 0x44, 0x28, 0x31, 0x37, 0x29,
+ 0x44, 0x28, 0x31, 0x38, 0x29, 0x44, 0x28, 0x31,
+ 0x39, 0x29, 0x44, 0x28, 0x32, 0x30, 0x29, 0x44,
+ 0x30, 0xE7, 0x82, 0xB9, 0x44, 0x31, 0xE2, 0x81,
+ // Bytes 1cc0 - 1cff
+ 0x84, 0x44, 0x31, 0xE6, 0x97, 0xA5, 0x44, 0x31,
+ 0xE6, 0x9C, 0x88, 0x44, 0x31, 0xE7, 0x82, 0xB9,
+ 0x44, 0x32, 0xE6, 0x97, 0xA5, 0x44, 0x32, 0xE6,
+ 0x9C, 0x88, 0x44, 0x32, 0xE7, 0x82, 0xB9, 0x44,
+ 0x33, 0xE6, 0x97, 0xA5, 0x44, 0x33, 0xE6, 0x9C,
+ 0x88, 0x44, 0x33, 0xE7, 0x82, 0xB9, 0x44, 0x34,
+ 0xE6, 0x97, 0xA5, 0x44, 0x34, 0xE6, 0x9C, 0x88,
+ 0x44, 0x34, 0xE7, 0x82, 0xB9, 0x44, 0x35, 0xE6,
+ // Bytes 1d00 - 1d3f
+ 0x97, 0xA5, 0x44, 0x35, 0xE6, 0x9C, 0x88, 0x44,
+ 0x35, 0xE7, 0x82, 0xB9, 0x44, 0x36, 0xE6, 0x97,
+ 0xA5, 0x44, 0x36, 0xE6, 0x9C, 0x88, 0x44, 0x36,
+ 0xE7, 0x82, 0xB9, 0x44, 0x37, 0xE6, 0x97, 0xA5,
+ 0x44, 0x37, 0xE6, 0x9C, 0x88, 0x44, 0x37, 0xE7,
+ 0x82, 0xB9, 0x44, 0x38, 0xE6, 0x97, 0xA5, 0x44,
+ 0x38, 0xE6, 0x9C, 0x88, 0x44, 0x38, 0xE7, 0x82,
+ 0xB9, 0x44, 0x39, 0xE6, 0x97, 0xA5, 0x44, 0x39,
+ // Bytes 1d40 - 1d7f
+ 0xE6, 0x9C, 0x88, 0x44, 0x39, 0xE7, 0x82, 0xB9,
+ 0x44, 0x56, 0x49, 0x49, 0x49, 0x44, 0x61, 0x2E,
+ 0x6D, 0x2E, 0x44, 0x6B, 0x63, 0x61, 0x6C, 0x44,
+ 0x70, 0x2E, 0x6D, 0x2E, 0x44, 0x76, 0x69, 0x69,
+ 0x69, 0x44, 0xD5, 0xA5, 0xD6, 0x82, 0x44, 0xD5,
+ 0xB4, 0xD5, 0xA5, 0x44, 0xD5, 0xB4, 0xD5, 0xAB,
+ 0x44, 0xD5, 0xB4, 0xD5, 0xAD, 0x44, 0xD5, 0xB4,
+ 0xD5, 0xB6, 0x44, 0xD5, 0xBE, 0xD5, 0xB6, 0x44,
+ // Bytes 1d80 - 1dbf
+ 0xD7, 0x90, 0xD7, 0x9C, 0x44, 0xD8, 0xA7, 0xD9,
+ 0xB4, 0x44, 0xD8, 0xA8, 0xD8, 0xAC, 0x44, 0xD8,
+ 0xA8, 0xD8, 0xAD, 0x44, 0xD8, 0xA8, 0xD8, 0xAE,
+ 0x44, 0xD8, 0xA8, 0xD8, 0xB1, 0x44, 0xD8, 0xA8,
+ 0xD8, 0xB2, 0x44, 0xD8, 0xA8, 0xD9, 0x85, 0x44,
+ 0xD8, 0xA8, 0xD9, 0x86, 0x44, 0xD8, 0xA8, 0xD9,
+ 0x87, 0x44, 0xD8, 0xA8, 0xD9, 0x89, 0x44, 0xD8,
+ 0xA8, 0xD9, 0x8A, 0x44, 0xD8, 0xAA, 0xD8, 0xAC,
+ // Bytes 1dc0 - 1dff
+ 0x44, 0xD8, 0xAA, 0xD8, 0xAD, 0x44, 0xD8, 0xAA,
+ 0xD8, 0xAE, 0x44, 0xD8, 0xAA, 0xD8, 0xB1, 0x44,
+ 0xD8, 0xAA, 0xD8, 0xB2, 0x44, 0xD8, 0xAA, 0xD9,
+ 0x85, 0x44, 0xD8, 0xAA, 0xD9, 0x86, 0x44, 0xD8,
+ 0xAA, 0xD9, 0x87, 0x44, 0xD8, 0xAA, 0xD9, 0x89,
+ 0x44, 0xD8, 0xAA, 0xD9, 0x8A, 0x44, 0xD8, 0xAB,
+ 0xD8, 0xAC, 0x44, 0xD8, 0xAB, 0xD8, 0xB1, 0x44,
+ 0xD8, 0xAB, 0xD8, 0xB2, 0x44, 0xD8, 0xAB, 0xD9,
+ // Bytes 1e00 - 1e3f
+ 0x85, 0x44, 0xD8, 0xAB, 0xD9, 0x86, 0x44, 0xD8,
+ 0xAB, 0xD9, 0x87, 0x44, 0xD8, 0xAB, 0xD9, 0x89,
+ 0x44, 0xD8, 0xAB, 0xD9, 0x8A, 0x44, 0xD8, 0xAC,
+ 0xD8, 0xAD, 0x44, 0xD8, 0xAC, 0xD9, 0x85, 0x44,
+ 0xD8, 0xAC, 0xD9, 0x89, 0x44, 0xD8, 0xAC, 0xD9,
+ 0x8A, 0x44, 0xD8, 0xAD, 0xD8, 0xAC, 0x44, 0xD8,
+ 0xAD, 0xD9, 0x85, 0x44, 0xD8, 0xAD, 0xD9, 0x89,
+ 0x44, 0xD8, 0xAD, 0xD9, 0x8A, 0x44, 0xD8, 0xAE,
+ // Bytes 1e40 - 1e7f
+ 0xD8, 0xAC, 0x44, 0xD8, 0xAE, 0xD8, 0xAD, 0x44,
+ 0xD8, 0xAE, 0xD9, 0x85, 0x44, 0xD8, 0xAE, 0xD9,
+ 0x89, 0x44, 0xD8, 0xAE, 0xD9, 0x8A, 0x44, 0xD8,
+ 0xB3, 0xD8, 0xAC, 0x44, 0xD8, 0xB3, 0xD8, 0xAD,
+ 0x44, 0xD8, 0xB3, 0xD8, 0xAE, 0x44, 0xD8, 0xB3,
+ 0xD8, 0xB1, 0x44, 0xD8, 0xB3, 0xD9, 0x85, 0x44,
+ 0xD8, 0xB3, 0xD9, 0x87, 0x44, 0xD8, 0xB3, 0xD9,
+ 0x89, 0x44, 0xD8, 0xB3, 0xD9, 0x8A, 0x44, 0xD8,
+ // Bytes 1e80 - 1ebf
+ 0xB4, 0xD8, 0xAC, 0x44, 0xD8, 0xB4, 0xD8, 0xAD,
+ 0x44, 0xD8, 0xB4, 0xD8, 0xAE, 0x44, 0xD8, 0xB4,
+ 0xD8, 0xB1, 0x44, 0xD8, 0xB4, 0xD9, 0x85, 0x44,
+ 0xD8, 0xB4, 0xD9, 0x87, 0x44, 0xD8, 0xB4, 0xD9,
+ 0x89, 0x44, 0xD8, 0xB4, 0xD9, 0x8A, 0x44, 0xD8,
+ 0xB5, 0xD8, 0xAD, 0x44, 0xD8, 0xB5, 0xD8, 0xAE,
+ 0x44, 0xD8, 0xB5, 0xD8, 0xB1, 0x44, 0xD8, 0xB5,
+ 0xD9, 0x85, 0x44, 0xD8, 0xB5, 0xD9, 0x89, 0x44,
+ // Bytes 1ec0 - 1eff
+ 0xD8, 0xB5, 0xD9, 0x8A, 0x44, 0xD8, 0xB6, 0xD8,
+ 0xAC, 0x44, 0xD8, 0xB6, 0xD8, 0xAD, 0x44, 0xD8,
+ 0xB6, 0xD8, 0xAE, 0x44, 0xD8, 0xB6, 0xD8, 0xB1,
+ 0x44, 0xD8, 0xB6, 0xD9, 0x85, 0x44, 0xD8, 0xB6,
+ 0xD9, 0x89, 0x44, 0xD8, 0xB6, 0xD9, 0x8A, 0x44,
+ 0xD8, 0xB7, 0xD8, 0xAD, 0x44, 0xD8, 0xB7, 0xD9,
+ 0x85, 0x44, 0xD8, 0xB7, 0xD9, 0x89, 0x44, 0xD8,
+ 0xB7, 0xD9, 0x8A, 0x44, 0xD8, 0xB8, 0xD9, 0x85,
+ // Bytes 1f00 - 1f3f
+ 0x44, 0xD8, 0xB9, 0xD8, 0xAC, 0x44, 0xD8, 0xB9,
+ 0xD9, 0x85, 0x44, 0xD8, 0xB9, 0xD9, 0x89, 0x44,
+ 0xD8, 0xB9, 0xD9, 0x8A, 0x44, 0xD8, 0xBA, 0xD8,
+ 0xAC, 0x44, 0xD8, 0xBA, 0xD9, 0x85, 0x44, 0xD8,
+ 0xBA, 0xD9, 0x89, 0x44, 0xD8, 0xBA, 0xD9, 0x8A,
+ 0x44, 0xD9, 0x81, 0xD8, 0xAC, 0x44, 0xD9, 0x81,
+ 0xD8, 0xAD, 0x44, 0xD9, 0x81, 0xD8, 0xAE, 0x44,
+ 0xD9, 0x81, 0xD9, 0x85, 0x44, 0xD9, 0x81, 0xD9,
+ // Bytes 1f40 - 1f7f
+ 0x89, 0x44, 0xD9, 0x81, 0xD9, 0x8A, 0x44, 0xD9,
+ 0x82, 0xD8, 0xAD, 0x44, 0xD9, 0x82, 0xD9, 0x85,
+ 0x44, 0xD9, 0x82, 0xD9, 0x89, 0x44, 0xD9, 0x82,
+ 0xD9, 0x8A, 0x44, 0xD9, 0x83, 0xD8, 0xA7, 0x44,
+ 0xD9, 0x83, 0xD8, 0xAC, 0x44, 0xD9, 0x83, 0xD8,
+ 0xAD, 0x44, 0xD9, 0x83, 0xD8, 0xAE, 0x44, 0xD9,
+ 0x83, 0xD9, 0x84, 0x44, 0xD9, 0x83, 0xD9, 0x85,
+ 0x44, 0xD9, 0x83, 0xD9, 0x89, 0x44, 0xD9, 0x83,
+ // Bytes 1f80 - 1fbf
+ 0xD9, 0x8A, 0x44, 0xD9, 0x84, 0xD8, 0xA7, 0x44,
+ 0xD9, 0x84, 0xD8, 0xAC, 0x44, 0xD9, 0x84, 0xD8,
+ 0xAD, 0x44, 0xD9, 0x84, 0xD8, 0xAE, 0x44, 0xD9,
+ 0x84, 0xD9, 0x85, 0x44, 0xD9, 0x84, 0xD9, 0x87,
+ 0x44, 0xD9, 0x84, 0xD9, 0x89, 0x44, 0xD9, 0x84,
+ 0xD9, 0x8A, 0x44, 0xD9, 0x85, 0xD8, 0xA7, 0x44,
+ 0xD9, 0x85, 0xD8, 0xAC, 0x44, 0xD9, 0x85, 0xD8,
+ 0xAD, 0x44, 0xD9, 0x85, 0xD8, 0xAE, 0x44, 0xD9,
+ // Bytes 1fc0 - 1fff
+ 0x85, 0xD9, 0x85, 0x44, 0xD9, 0x85, 0xD9, 0x89,
+ 0x44, 0xD9, 0x85, 0xD9, 0x8A, 0x44, 0xD9, 0x86,
+ 0xD8, 0xAC, 0x44, 0xD9, 0x86, 0xD8, 0xAD, 0x44,
+ 0xD9, 0x86, 0xD8, 0xAE, 0x44, 0xD9, 0x86, 0xD8,
+ 0xB1, 0x44, 0xD9, 0x86, 0xD8, 0xB2, 0x44, 0xD9,
+ 0x86, 0xD9, 0x85, 0x44, 0xD9, 0x86, 0xD9, 0x86,
+ 0x44, 0xD9, 0x86, 0xD9, 0x87, 0x44, 0xD9, 0x86,
+ 0xD9, 0x89, 0x44, 0xD9, 0x86, 0xD9, 0x8A, 0x44,
+ // Bytes 2000 - 203f
+ 0xD9, 0x87, 0xD8, 0xAC, 0x44, 0xD9, 0x87, 0xD9,
+ 0x85, 0x44, 0xD9, 0x87, 0xD9, 0x89, 0x44, 0xD9,
+ 0x87, 0xD9, 0x8A, 0x44, 0xD9, 0x88, 0xD9, 0xB4,
+ 0x44, 0xD9, 0x8A, 0xD8, 0xAC, 0x44, 0xD9, 0x8A,
+ 0xD8, 0xAD, 0x44, 0xD9, 0x8A, 0xD8, 0xAE, 0x44,
+ 0xD9, 0x8A, 0xD8, 0xB1, 0x44, 0xD9, 0x8A, 0xD8,
+ 0xB2, 0x44, 0xD9, 0x8A, 0xD9, 0x85, 0x44, 0xD9,
+ 0x8A, 0xD9, 0x86, 0x44, 0xD9, 0x8A, 0xD9, 0x87,
+ // Bytes 2040 - 207f
+ 0x44, 0xD9, 0x8A, 0xD9, 0x89, 0x44, 0xD9, 0x8A,
+ 0xD9, 0x8A, 0x44, 0xD9, 0x8A, 0xD9, 0xB4, 0x44,
+ 0xDB, 0x87, 0xD9, 0xB4, 0x45, 0x28, 0xE1, 0x84,
+ 0x80, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x82, 0x29,
+ 0x45, 0x28, 0xE1, 0x84, 0x83, 0x29, 0x45, 0x28,
+ 0xE1, 0x84, 0x85, 0x29, 0x45, 0x28, 0xE1, 0x84,
+ 0x86, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x87, 0x29,
+ 0x45, 0x28, 0xE1, 0x84, 0x89, 0x29, 0x45, 0x28,
+ // Bytes 2080 - 20bf
+ 0xE1, 0x84, 0x8B, 0x29, 0x45, 0x28, 0xE1, 0x84,
+ 0x8C, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8E, 0x29,
+ 0x45, 0x28, 0xE1, 0x84, 0x8F, 0x29, 0x45, 0x28,
+ 0xE1, 0x84, 0x90, 0x29, 0x45, 0x28, 0xE1, 0x84,
+ 0x91, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x92, 0x29,
+ 0x45, 0x28, 0xE4, 0xB8, 0x80, 0x29, 0x45, 0x28,
+ 0xE4, 0xB8, 0x83, 0x29, 0x45, 0x28, 0xE4, 0xB8,
+ 0x89, 0x29, 0x45, 0x28, 0xE4, 0xB9, 0x9D, 0x29,
+ // Bytes 20c0 - 20ff
+ 0x45, 0x28, 0xE4, 0xBA, 0x8C, 0x29, 0x45, 0x28,
+ 0xE4, 0xBA, 0x94, 0x29, 0x45, 0x28, 0xE4, 0xBB,
+ 0xA3, 0x29, 0x45, 0x28, 0xE4, 0xBC, 0x81, 0x29,
+ 0x45, 0x28, 0xE4, 0xBC, 0x91, 0x29, 0x45, 0x28,
+ 0xE5, 0x85, 0xAB, 0x29, 0x45, 0x28, 0xE5, 0x85,
+ 0xAD, 0x29, 0x45, 0x28, 0xE5, 0x8A, 0xB4, 0x29,
+ 0x45, 0x28, 0xE5, 0x8D, 0x81, 0x29, 0x45, 0x28,
+ 0xE5, 0x8D, 0x94, 0x29, 0x45, 0x28, 0xE5, 0x90,
+ // Bytes 2100 - 213f
+ 0x8D, 0x29, 0x45, 0x28, 0xE5, 0x91, 0xBC, 0x29,
+ 0x45, 0x28, 0xE5, 0x9B, 0x9B, 0x29, 0x45, 0x28,
+ 0xE5, 0x9C, 0x9F, 0x29, 0x45, 0x28, 0xE5, 0xAD,
+ 0xA6, 0x29, 0x45, 0x28, 0xE6, 0x97, 0xA5, 0x29,
+ 0x45, 0x28, 0xE6, 0x9C, 0x88, 0x29, 0x45, 0x28,
+ 0xE6, 0x9C, 0x89, 0x29, 0x45, 0x28, 0xE6, 0x9C,
+ 0xA8, 0x29, 0x45, 0x28, 0xE6, 0xA0, 0xAA, 0x29,
+ 0x45, 0x28, 0xE6, 0xB0, 0xB4, 0x29, 0x45, 0x28,
+ // Bytes 2140 - 217f
+ 0xE7, 0x81, 0xAB, 0x29, 0x45, 0x28, 0xE7, 0x89,
+ 0xB9, 0x29, 0x45, 0x28, 0xE7, 0x9B, 0xA3, 0x29,
+ 0x45, 0x28, 0xE7, 0xA4, 0xBE, 0x29, 0x45, 0x28,
+ 0xE7, 0xA5, 0x9D, 0x29, 0x45, 0x28, 0xE7, 0xA5,
+ 0xAD, 0x29, 0x45, 0x28, 0xE8, 0x87, 0xAA, 0x29,
+ 0x45, 0x28, 0xE8, 0x87, 0xB3, 0x29, 0x45, 0x28,
+ 0xE8, 0xB2, 0xA1, 0x29, 0x45, 0x28, 0xE8, 0xB3,
+ 0x87, 0x29, 0x45, 0x28, 0xE9, 0x87, 0x91, 0x29,
+ // Bytes 2180 - 21bf
+ 0x45, 0x30, 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31,
+ 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x30, 0xE6,
+ 0x9C, 0x88, 0x45, 0x31, 0x30, 0xE7, 0x82, 0xB9,
+ 0x45, 0x31, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x31,
+ 0x31, 0xE6, 0x9C, 0x88, 0x45, 0x31, 0x31, 0xE7,
+ 0x82, 0xB9, 0x45, 0x31, 0x32, 0xE6, 0x97, 0xA5,
+ 0x45, 0x31, 0x32, 0xE6, 0x9C, 0x88, 0x45, 0x31,
+ 0x32, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x33, 0xE6,
+ // Bytes 21c0 - 21ff
+ 0x97, 0xA5, 0x45, 0x31, 0x33, 0xE7, 0x82, 0xB9,
+ 0x45, 0x31, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x31,
+ 0x34, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x35, 0xE6,
+ 0x97, 0xA5, 0x45, 0x31, 0x35, 0xE7, 0x82, 0xB9,
+ 0x45, 0x31, 0x36, 0xE6, 0x97, 0xA5, 0x45, 0x31,
+ 0x36, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x37, 0xE6,
+ 0x97, 0xA5, 0x45, 0x31, 0x37, 0xE7, 0x82, 0xB9,
+ 0x45, 0x31, 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x31,
+ // Bytes 2200 - 223f
+ 0x38, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x39, 0xE6,
+ 0x97, 0xA5, 0x45, 0x31, 0x39, 0xE7, 0x82, 0xB9,
+ 0x45, 0x31, 0xE2, 0x81, 0x84, 0x32, 0x45, 0x31,
+ 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, 0xE2, 0x81,
+ 0x84, 0x34, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x35,
+ 0x45, 0x31, 0xE2, 0x81, 0x84, 0x36, 0x45, 0x31,
+ 0xE2, 0x81, 0x84, 0x37, 0x45, 0x31, 0xE2, 0x81,
+ 0x84, 0x38, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x39,
+ // Bytes 2240 - 227f
+ 0x45, 0x32, 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x32,
+ 0x30, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x31, 0xE6,
+ 0x97, 0xA5, 0x45, 0x32, 0x31, 0xE7, 0x82, 0xB9,
+ 0x45, 0x32, 0x32, 0xE6, 0x97, 0xA5, 0x45, 0x32,
+ 0x32, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x33, 0xE6,
+ 0x97, 0xA5, 0x45, 0x32, 0x33, 0xE7, 0x82, 0xB9,
+ 0x45, 0x32, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x32,
+ 0x34, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x35, 0xE6,
+ // Bytes 2280 - 22bf
+ 0x97, 0xA5, 0x45, 0x32, 0x36, 0xE6, 0x97, 0xA5,
+ 0x45, 0x32, 0x37, 0xE6, 0x97, 0xA5, 0x45, 0x32,
+ 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x39, 0xE6,
+ 0x97, 0xA5, 0x45, 0x32, 0xE2, 0x81, 0x84, 0x33,
+ 0x45, 0x32, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33,
+ 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x33, 0x31, 0xE6,
+ 0x97, 0xA5, 0x45, 0x33, 0xE2, 0x81, 0x84, 0x34,
+ 0x45, 0x33, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33,
+ // Bytes 22c0 - 22ff
+ 0xE2, 0x81, 0x84, 0x38, 0x45, 0x34, 0xE2, 0x81,
+ 0x84, 0x35, 0x45, 0x35, 0xE2, 0x81, 0x84, 0x36,
+ 0x45, 0x35, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x37,
+ 0xE2, 0x81, 0x84, 0x38, 0x45, 0x41, 0xE2, 0x88,
+ 0x95, 0x6D, 0x45, 0x56, 0xE2, 0x88, 0x95, 0x6D,
+ 0x45, 0x6D, 0xE2, 0x88, 0x95, 0x73, 0x46, 0x31,
+ 0xE2, 0x81, 0x84, 0x31, 0x30, 0x46, 0x43, 0xE2,
+ 0x88, 0x95, 0x6B, 0x67, 0x46, 0x6D, 0xE2, 0x88,
+ // Bytes 2300 - 233f
+ 0x95, 0x73, 0x32, 0x46, 0xD8, 0xA8, 0xD8, 0xAD,
+ 0xD9, 0x8A, 0x46, 0xD8, 0xA8, 0xD8, 0xAE, 0xD9,
+ 0x8A, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x85,
+ 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x89, 0x46,
+ 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8,
+ 0xAA, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD8, 0xAA,
+ 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8,
+ 0xAE, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, 0xAE,
+ // Bytes 2340 - 237f
+ 0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9,
+ 0x8A, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAC,
+ 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAD, 0x46,
+ 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAE, 0x46, 0xD8,
+ 0xAA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAA,
+ 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD8,
+ 0xAD, 0xD9, 0x89, 0x46, 0xD8, 0xAC, 0xD8, 0xAD,
+ 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD8,
+ // Bytes 2380 - 23bf
+ 0xAD, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x89,
+ 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x8A, 0x46,
+ 0xD8, 0xAD, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8,
+ 0xAD, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAD,
+ 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB3, 0xD8,
+ 0xAC, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, 0xD8, 0xAC,
+ 0xD9, 0x89, 0x46, 0xD8, 0xB3, 0xD8, 0xAD, 0xD8,
+ 0xAC, 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x89,
+ // Bytes 23c0 - 23ff
+ 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x8A, 0x46,
+ 0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAC, 0x46, 0xD8,
+ 0xB3, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, 0xB3,
+ 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8,
+ 0xAC, 0xD9, 0x8A, 0x46, 0xD8, 0xB4, 0xD8, 0xAD,
+ 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, 0xD9,
+ 0x8A, 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD8, 0xAE,
+ 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD9, 0x85, 0x46,
+ // Bytes 2400 - 243f
+ 0xD8, 0xB5, 0xD8, 0xAD, 0xD8, 0xAD, 0x46, 0xD8,
+ 0xB5, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB5,
+ 0xD9, 0x84, 0xD9, 0x89, 0x46, 0xD8, 0xB5, 0xD9,
+ 0x84, 0xDB, 0x92, 0x46, 0xD8, 0xB5, 0xD9, 0x85,
+ 0xD9, 0x85, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9,
+ 0x89, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, 0x8A,
+ 0x46, 0xD8, 0xB6, 0xD8, 0xAE, 0xD9, 0x85, 0x46,
+ 0xD8, 0xB7, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8,
+ // Bytes 2440 - 247f
+ 0xB7, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB7,
+ 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB9, 0xD8,
+ 0xAC, 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85,
+ 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9,
+ 0x89, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x8A,
+ 0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x85, 0x46,
+ 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8,
+ 0xBA, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x81,
+ // Bytes 2480 - 24bf
+ 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x81, 0xD9,
+ 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x82, 0xD9, 0x84,
+ 0xDB, 0x92, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD8,
+ 0xAD, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x85,
+ 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x8A, 0x46,
+ 0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9,
+ 0x83, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x84,
+ 0xD8, 0xAC, 0xD8, 0xAC, 0x46, 0xD9, 0x84, 0xD8,
+ // Bytes 24c0 - 24ff
+ 0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAC,
+ 0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9,
+ 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x89,
+ 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x8A, 0x46,
+ 0xD9, 0x84, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9,
+ 0x84, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD9, 0x84,
+ 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8,
+ 0xAC, 0xD8, 0xAD, 0x46, 0xD9, 0x85, 0xD8, 0xAC,
+ // Bytes 2500 - 253f
+ 0xD8, 0xAE, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9,
+ 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, 0x8A,
+ 0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD8, 0xAC, 0x46,
+ 0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9,
+ 0x85, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x85,
+ 0xD8, 0xAE, 0xD8, 0xAC, 0x46, 0xD9, 0x85, 0xD8,
+ 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAE,
+ 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD9, 0x85, 0xD9,
+ // Bytes 2540 - 257f
+ 0x8A, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD8, 0xAD,
+ 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x85, 0x46,
+ 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD9,
+ 0x86, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x86,
+ 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x86, 0xD8,
+ 0xAD, 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD8, 0xAD,
+ 0xD9, 0x8A, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9,
+ 0x89, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, 0x8A,
+ // Bytes 2580 - 25bf
+ 0x46, 0xD9, 0x87, 0xD9, 0x85, 0xD8, 0xAC, 0x46,
+ 0xD9, 0x87, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9,
+ 0x8A, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x8A,
+ 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9,
+ 0x85, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x85,
+ 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8,
+ 0xA7, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAC,
+ 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAD, 0x46,
+ // Bytes 25c0 - 25ff
+ 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAE, 0x46, 0xD9,
+ 0x8A, 0xD9, 0x94, 0xD8, 0xB1, 0x46, 0xD9, 0x8A,
+ 0xD9, 0x94, 0xD8, 0xB2, 0x46, 0xD9, 0x8A, 0xD9,
+ 0x94, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x94,
+ 0xD9, 0x86, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9,
+ 0x87, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x88,
+ 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x89, 0x46,
+ 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x8A, 0x46, 0xD9,
+ // Bytes 2600 - 263f
+ 0x8A, 0xD9, 0x94, 0xDB, 0x86, 0x46, 0xD9, 0x8A,
+ 0xD9, 0x94, 0xDB, 0x87, 0x46, 0xD9, 0x8A, 0xD9,
+ 0x94, 0xDB, 0x88, 0x46, 0xD9, 0x8A, 0xD9, 0x94,
+ 0xDB, 0x90, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB,
+ 0x95, 0x46, 0xE0, 0xB9, 0x8D, 0xE0, 0xB8, 0xB2,
+ 0x46, 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0x99, 0x46,
+ 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0xA1, 0x46, 0xE0,
+ 0xBB, 0x8D, 0xE0, 0xBA, 0xB2, 0x46, 0xE0, 0xBD,
+ // Bytes 2640 - 267f
+ 0x80, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, 0xBD, 0x82,
+ 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x8C, 0xE0,
+ 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x91, 0xE0, 0xBE,
+ 0xB7, 0x46, 0xE0, 0xBD, 0x96, 0xE0, 0xBE, 0xB7,
+ 0x46, 0xE0, 0xBD, 0x9B, 0xE0, 0xBE, 0xB7, 0x46,
+ 0xE0, 0xBE, 0x90, 0xE0, 0xBE, 0xB5, 0x46, 0xE0,
+ 0xBE, 0x92, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE,
+ 0x9C, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA1,
+ // Bytes 2680 - 26bf
+ 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA6, 0xE0,
+ 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xAB, 0xE0, 0xBE,
+ 0xB7, 0x46, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2,
+ 0x46, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x46,
+ 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x46, 0xE2,
+ 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x46, 0xE3, 0x81,
+ 0xBB, 0xE3, 0x81, 0x8B, 0x46, 0xE3, 0x82, 0x88,
+ 0xE3, 0x82, 0x8A, 0x46, 0xE3, 0x82, 0xAD, 0xE3,
+ // Bytes 26c0 - 26ff
+ 0x83, 0xAD, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x82,
+ 0xB3, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0x88,
+ 0x46, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x46,
+ 0xE3, 0x83, 0x8A, 0xE3, 0x83, 0x8E, 0x46, 0xE3,
+ 0x83, 0x9B, 0xE3, 0x83, 0xB3, 0x46, 0xE3, 0x83,
+ 0x9F, 0xE3, 0x83, 0xAA, 0x46, 0xE3, 0x83, 0xAA,
+ 0xE3, 0x83, 0xA9, 0x46, 0xE3, 0x83, 0xAC, 0xE3,
+ 0x83, 0xA0, 0x46, 0xE5, 0xA4, 0xA7, 0xE6, 0xAD,
+ // Bytes 2700 - 273f
+ 0xA3, 0x46, 0xE5, 0xB9, 0xB3, 0xE6, 0x88, 0x90,
+ 0x46, 0xE6, 0x98, 0x8E, 0xE6, 0xB2, 0xBB, 0x46,
+ 0xE6, 0x98, 0xAD, 0xE5, 0x92, 0x8C, 0x47, 0x72,
+ 0x61, 0x64, 0xE2, 0x88, 0x95, 0x73, 0x47, 0xE3,
+ 0x80, 0x94, 0x53, 0xE3, 0x80, 0x95, 0x48, 0x28,
+ 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x29, 0x48,
+ 0x28, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x29,
+ 0x48, 0x28, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1,
+ // Bytes 2740 - 277f
+ 0x29, 0x48, 0x28, 0xE1, 0x84, 0x85, 0xE1, 0x85,
+ 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x86, 0xE1,
+ 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x87,
+ 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84,
+ 0x89, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1,
+ 0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28,
+ 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x29, 0x48,
+ 0x28, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0x29,
+ // Bytes 2780 - 27bf
+ 0x48, 0x28, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1,
+ 0x29, 0x48, 0x28, 0xE1, 0x84, 0x8F, 0xE1, 0x85,
+ 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x90, 0xE1,
+ 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x91,
+ 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84,
+ 0x92, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x72, 0x61,
+ 0x64, 0xE2, 0x88, 0x95, 0x73, 0x32, 0x48, 0xD8,
+ 0xA7, 0xD9, 0x83, 0xD8, 0xA8, 0xD8, 0xB1, 0x48,
+ // Bytes 27c0 - 27ff
+ 0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87,
+ 0x48, 0xD8, 0xB1, 0xD8, 0xB3, 0xD9, 0x88, 0xD9,
+ 0x84, 0x48, 0xD8, 0xB1, 0xDB, 0x8C, 0xD8, 0xA7,
+ 0xD9, 0x84, 0x48, 0xD8, 0xB5, 0xD9, 0x84, 0xD8,
+ 0xB9, 0xD9, 0x85, 0x48, 0xD8, 0xB9, 0xD9, 0x84,
+ 0xD9, 0x8A, 0xD9, 0x87, 0x48, 0xD9, 0x85, 0xD8,
+ 0xAD, 0xD9, 0x85, 0xD8, 0xAF, 0x48, 0xD9, 0x88,
+ 0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x49, 0xE2,
+ // Bytes 2800 - 283f
+ 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2,
+ 0x49, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0xE2,
+ 0x80, 0xB5, 0x49, 0xE2, 0x88, 0xAB, 0xE2, 0x88,
+ 0xAB, 0xE2, 0x88, 0xAB, 0x49, 0xE2, 0x88, 0xAE,
+ 0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x49, 0xE3,
+ 0x80, 0x94, 0xE4, 0xB8, 0x89, 0xE3, 0x80, 0x95,
+ 0x49, 0xE3, 0x80, 0x94, 0xE4, 0xBA, 0x8C, 0xE3,
+ 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5, 0x8B,
+ // Bytes 2840 - 287f
+ 0x9D, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94,
+ 0xE5, 0xAE, 0x89, 0xE3, 0x80, 0x95, 0x49, 0xE3,
+ 0x80, 0x94, 0xE6, 0x89, 0x93, 0xE3, 0x80, 0x95,
+ 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x95, 0x97, 0xE3,
+ 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x9C,
+ 0xAC, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94,
+ 0xE7, 0x82, 0xB9, 0xE3, 0x80, 0x95, 0x49, 0xE3,
+ 0x80, 0x94, 0xE7, 0x9B, 0x97, 0xE3, 0x80, 0x95,
+ // Bytes 2880 - 28bf
+ 0x49, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xBC, 0xE3,
+ 0x83, 0xAB, 0x49, 0xE3, 0x82, 0xA4, 0xE3, 0x83,
+ 0xB3, 0xE3, 0x83, 0x81, 0x49, 0xE3, 0x82, 0xA6,
+ 0xE3, 0x82, 0xA9, 0xE3, 0x83, 0xB3, 0x49, 0xE3,
+ 0x82, 0xAA, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB9,
+ 0x49, 0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xBC, 0xE3,
+ 0x83, 0xA0, 0x49, 0xE3, 0x82, 0xAB, 0xE3, 0x82,
+ 0xA4, 0xE3, 0x83, 0xAA, 0x49, 0xE3, 0x82, 0xB1,
+ // Bytes 28c0 - 28ff
+ 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB9, 0x49, 0xE3,
+ 0x82, 0xB3, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x8A,
+ 0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3,
+ 0x83, 0x81, 0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83,
+ 0xB3, 0xE3, 0x83, 0x88, 0x49, 0xE3, 0x83, 0x86,
+ 0xE3, 0x82, 0x99, 0xE3, 0x82, 0xB7, 0x49, 0xE3,
+ 0x83, 0x88, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB,
+ 0x49, 0xE3, 0x83, 0x8E, 0xE3, 0x83, 0x83, 0xE3,
+ // Bytes 2900 - 293f
+ 0x83, 0x88, 0x49, 0xE3, 0x83, 0x8F, 0xE3, 0x82,
+ 0xA4, 0xE3, 0x83, 0x84, 0x49, 0xE3, 0x83, 0x92,
+ 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49, 0xE3,
+ 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xB3,
+ 0x49, 0xE3, 0x83, 0x95, 0xE3, 0x83, 0xA9, 0xE3,
+ 0x83, 0xB3, 0x49, 0xE3, 0x83, 0x98, 0xE3, 0x82,
+ 0x9A, 0xE3, 0x82, 0xBD, 0x49, 0xE3, 0x83, 0x98,
+ 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x84, 0x49, 0xE3,
+ // Bytes 2940 - 297f
+ 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB,
+ 0x49, 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3,
+ 0x83, 0xB3, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x82,
+ 0xA4, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x9E,
+ 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x8F, 0x49, 0xE3,
+ 0x83, 0x9E, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xAF,
+ 0x49, 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3,
+ 0x83, 0xAB, 0x49, 0xE3, 0x83, 0xA6, 0xE3, 0x82,
+ // Bytes 2980 - 29bf
+ 0xA2, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x83, 0xAF,
+ 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0x4C, 0xE2,
+ 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2,
+ 0xE2, 0x80, 0xB2, 0x4C, 0xE2, 0x88, 0xAB, 0xE2,
+ 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB,
+ 0x4C, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xAB, 0xE3,
+ 0x83, 0x95, 0xE3, 0x82, 0xA1, 0x4C, 0xE3, 0x82,
+ 0xA8, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xAB, 0xE3,
+ // Bytes 29c0 - 29ff
+ 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x82,
+ 0x99, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, 0x4C,
+ 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+ 0xB3, 0xE3, 0x83, 0x9E, 0x4C, 0xE3, 0x82, 0xAB,
+ 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83,
+ 0x88, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xAD,
+ 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, 0xE3,
+ 0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x8B,
+ // Bytes 2a00 - 2a3f
+ 0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAD, 0xE3,
+ 0x83, 0xA5, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC,
+ 0x4C, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3,
+ 0x83, 0xA9, 0xE3, 0x83, 0xA0, 0x4C, 0xE3, 0x82,
+ 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xBC, 0xE3,
+ 0x83, 0x8D, 0x4C, 0xE3, 0x82, 0xB5, 0xE3, 0x82,
+ 0xA4, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C,
+ 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+ // Bytes 2a40 - 2a7f
+ 0xBC, 0xE3, 0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x8F,
+ 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
+ 0x84, 0x4C, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A,
+ 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3,
+ 0x83, 0x95, 0xE3, 0x82, 0xA3, 0xE3, 0x83, 0xBC,
+ 0xE3, 0x83, 0x88, 0x4C, 0xE3, 0x83, 0x98, 0xE3,
+ 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBF,
+ 0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3,
+ // Bytes 2a80 - 2abf
+ 0x83, 0x8B, 0xE3, 0x83, 0x92, 0x4C, 0xE3, 0x83,
+ 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xB3, 0xE3,
+ 0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x9B, 0xE3, 0x82,
+ 0x99, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x88, 0x4C,
+ 0xE3, 0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x82,
+ 0xAF, 0xE3, 0x83, 0xAD, 0x4C, 0xE3, 0x83, 0x9F,
+ 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83,
+ 0xB3, 0x4C, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC,
+ // Bytes 2ac0 - 2aff
+ 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x4C, 0xE3,
+ 0x83, 0xAA, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88,
+ 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, 0xAB, 0xE3,
+ 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC,
+ 0x4C, 0xE6, 0xA0, 0xAA, 0xE5, 0xBC, 0x8F, 0xE4,
+ 0xBC, 0x9A, 0xE7, 0xA4, 0xBE, 0x4E, 0x28, 0xE1,
+ 0x84, 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x92,
+ 0xE1, 0x85, 0xAE, 0x29, 0x4F, 0xD8, 0xAC, 0xD9,
+ // Bytes 2b00 - 2b3f
+ 0x84, 0x20, 0xD8, 0xAC, 0xD9, 0x84, 0xD8, 0xA7,
+ 0xD9, 0x84, 0xD9, 0x87, 0x4F, 0xE3, 0x82, 0xA2,
+ 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83,
+ 0xBC, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xA2,
+ 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x98, 0xE3, 0x82,
+ 0x9A, 0xE3, 0x82, 0xA2, 0x4F, 0xE3, 0x82, 0xAD,
+ 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xAF, 0xE3, 0x83,
+ 0x83, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xB5,
+ // Bytes 2b40 - 2b7f
+ 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x81, 0xE3, 0x83,
+ 0xBC, 0xE3, 0x83, 0xA0, 0x4F, 0xE3, 0x83, 0x8F,
+ 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
+ 0xAC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x98,
+ 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0xBF, 0xE3, 0x83,
+ 0xBC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x9B,
+ 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xA4, 0xE3, 0x83,
+ 0xB3, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x83, 0x9E,
+ // Bytes 2b80 - 2bbf
+ 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB7, 0xE3, 0x83,
+ 0xA7, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xA1,
+ 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+ 0x88, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xAB,
+ 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x95, 0xE3, 0x82,
+ 0x99, 0xE3, 0x83, 0xAB, 0x51, 0x28, 0xE1, 0x84,
+ 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x8C, 0xE1,
+ 0x85, 0xA5, 0xE1, 0x86, 0xAB, 0x29, 0x52, 0xE3,
+ // Bytes 2bc0 - 2bff
+ 0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB,
+ 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+ 0xBC, 0x52, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD,
+ 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+ 0xA9, 0xE3, 0x83, 0xA0, 0x52, 0xE3, 0x82, 0xAD,
+ 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xA1, 0xE3, 0x83,
+ 0xBC, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x52,
+ 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83,
+ // Bytes 2c00 - 2c3f
+ 0xA9, 0xE3, 0x83, 0xA0, 0xE3, 0x83, 0x88, 0xE3,
+ 0x83, 0xB3, 0x52, 0xE3, 0x82, 0xAF, 0xE3, 0x83,
+ 0xAB, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0xE3,
+ 0x82, 0xA4, 0xE3, 0x83, 0xAD, 0x52, 0xE3, 0x83,
+ 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3,
+ 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88,
+ 0x52, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3,
+ 0x82, 0xA2, 0xE3, 0x82, 0xB9, 0xE3, 0x83, 0x88,
+ // Bytes 2c40 - 2c7f
+ 0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83, 0x95, 0xE3,
+ 0x82, 0x99, 0xE3, 0x83, 0x83, 0xE3, 0x82, 0xB7,
+ 0xE3, 0x82, 0xA7, 0xE3, 0x83, 0xAB, 0x52, 0xE3,
+ 0x83, 0x9F, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0x8F,
+ 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
+ 0xAB, 0x52, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xB3,
+ 0xE3, 0x83, 0x88, 0xE3, 0x82, 0xB1, 0xE3, 0x82,
+ 0x99, 0xE3, 0x83, 0xB3, 0x61, 0xD8, 0xB5, 0xD9,
+ // Bytes 2c80 - 2cbf
+ 0x84, 0xD9, 0x89, 0x20, 0xD8, 0xA7, 0xD9, 0x84,
+ 0xD9, 0x84, 0xD9, 0x87, 0x20, 0xD8, 0xB9, 0xD9,
+ 0x84, 0xD9, 0x8A, 0xD9, 0x87, 0x20, 0xD9, 0x88,
+ 0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x06, 0xE0,
+ 0xA7, 0x87, 0xE0, 0xA6, 0xBE, 0x01, 0x06, 0xE0,
+ 0xA7, 0x87, 0xE0, 0xA7, 0x97, 0x01, 0x06, 0xE0,
+ 0xAD, 0x87, 0xE0, 0xAC, 0xBE, 0x01, 0x06, 0xE0,
+ 0xAD, 0x87, 0xE0, 0xAD, 0x96, 0x01, 0x06, 0xE0,
+ // Bytes 2cc0 - 2cff
+ 0xAD, 0x87, 0xE0, 0xAD, 0x97, 0x01, 0x06, 0xE0,
+ 0xAE, 0x92, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0,
+ 0xAF, 0x86, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0,
+ 0xAF, 0x86, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0,
+ 0xAF, 0x87, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0,
+ 0xB2, 0xBF, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0,
+ 0xB3, 0x86, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0,
+ 0xB3, 0x86, 0xE0, 0xB3, 0x96, 0x01, 0x06, 0xE0,
+ // Bytes 2d00 - 2d3f
+ 0xB5, 0x86, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0,
+ 0xB5, 0x86, 0xE0, 0xB5, 0x97, 0x01, 0x06, 0xE0,
+ 0xB5, 0x87, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0,
+ 0xB7, 0x99, 0xE0, 0xB7, 0x9F, 0x01, 0x06, 0xE1,
+ 0x80, 0xA5, 0xE1, 0x80, 0xAE, 0x01, 0x06, 0xE1,
+ 0xAC, 0x85, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+ 0xAC, 0x87, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+ 0xAC, 0x89, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+ // Bytes 2d40 - 2d7f
+ 0xAC, 0x8B, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+ 0xAC, 0x8D, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+ 0xAC, 0x91, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+ 0xAC, 0xBA, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+ 0xAC, 0xBC, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+ 0xAC, 0xBE, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+ 0xAC, 0xBF, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,
+ 0xAD, 0x82, 0xE1, 0xAC, 0xB5, 0x01, 0x08, 0xF0,
+ // Bytes 2d80 - 2dbf
+ 0x91, 0x84, 0xB1, 0xF0, 0x91, 0x84, 0xA7, 0x01,
+ 0x08, 0xF0, 0x91, 0x84, 0xB2, 0xF0, 0x91, 0x84,
+ 0xA7, 0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87, 0xF0,
+ 0x91, 0x8C, 0xBE, 0x01, 0x08, 0xF0, 0x91, 0x8D,
+ 0x87, 0xF0, 0x91, 0x8D, 0x97, 0x01, 0x08, 0xF0,
+ 0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xB0, 0x01,
+ 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92,
+ 0xBA, 0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0,
+ // Bytes 2dc0 - 2dff
+ 0x91, 0x92, 0xBD, 0x01, 0x08, 0xF0, 0x91, 0x96,
+ 0xB8, 0xF0, 0x91, 0x96, 0xAF, 0x01, 0x08, 0xF0,
+ 0x91, 0x96, 0xB9, 0xF0, 0x91, 0x96, 0xAF, 0x01,
+ 0x09, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0xE0,
+ 0xB3, 0x95, 0x02, 0x09, 0xE0, 0xB7, 0x99, 0xE0,
+ 0xB7, 0x8F, 0xE0, 0xB7, 0x8A, 0x12, 0x44, 0x44,
+ 0x5A, 0xCC, 0x8C, 0xC9, 0x44, 0x44, 0x7A, 0xCC,
+ 0x8C, 0xC9, 0x44, 0x64, 0x7A, 0xCC, 0x8C, 0xC9,
+ // Bytes 2e00 - 2e3f
+ 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x93, 0xC9,
+ 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x94, 0xC9,
+ 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x95, 0xB5,
+ 0x46, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x01,
+ 0x46, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x01,
+ 0x46, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, 0x01,
+ 0x46, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, 0x01,
+ 0x46, 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1, 0x01,
+ // Bytes 2e40 - 2e7f
+ 0x46, 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, 0x01,
+ 0x46, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1, 0x01,
+ 0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x01,
+ 0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xAE, 0x01,
+ 0x46, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x01,
+ 0x46, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0x01,
+ 0x46, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, 0x01,
+ 0x46, 0xE1, 0x84, 0x90, 0xE1, 0x85, 0xA1, 0x01,
+ // Bytes 2e80 - 2ebf
+ 0x46, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, 0x01,
+ 0x46, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, 0x01,
+ 0x49, 0xE3, 0x83, 0xA1, 0xE3, 0x82, 0xAB, 0xE3,
+ 0x82, 0x99, 0x0D, 0x4C, 0xE1, 0x84, 0x8C, 0xE1,
+ 0x85, 0xAE, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xB4,
+ 0x01, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99,
+ 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D, 0x4C,
+ 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0xBC, 0xE3, 0x83,
+ // Bytes 2ec0 - 2eff
+ 0x9B, 0xE3, 0x82, 0x9A, 0x0D, 0x4C, 0xE3, 0x83,
+ 0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3,
+ 0x82, 0x99, 0x0D, 0x4F, 0xE1, 0x84, 0x8E, 0xE1,
+ 0x85, 0xA1, 0xE1, 0x86, 0xB7, 0xE1, 0x84, 0x80,
+ 0xE1, 0x85, 0xA9, 0x01, 0x4F, 0xE3, 0x82, 0xA4,
+ 0xE3, 0x83, 0x8B, 0xE3, 0x83, 0xB3, 0xE3, 0x82,
+ 0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3, 0x82,
+ 0xB7, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xB3, 0xE3,
+ // Bytes 2f00 - 2f3f
+ 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3,
+ 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC,
+ 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x0D, 0x4F,
+ 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, 0x83,
+ 0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D,
+ 0x52, 0xE3, 0x82, 0xA8, 0xE3, 0x82, 0xB9, 0xE3,
+ 0x82, 0xAF, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88,
+ 0xE3, 0x82, 0x99, 0x0D, 0x52, 0xE3, 0x83, 0x95,
+ // Bytes 2f40 - 2f7f
+ 0xE3, 0x82, 0xA1, 0xE3, 0x83, 0xA9, 0xE3, 0x83,
+ 0x83, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D,
+ 0x86, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0x01,
+ 0x86, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8F, 0x01,
+ 0x03, 0x3C, 0xCC, 0xB8, 0x05, 0x03, 0x3D, 0xCC,
+ 0xB8, 0x05, 0x03, 0x3E, 0xCC, 0xB8, 0x05, 0x03,
+ 0x41, 0xCC, 0x80, 0xC9, 0x03, 0x41, 0xCC, 0x81,
+ 0xC9, 0x03, 0x41, 0xCC, 0x83, 0xC9, 0x03, 0x41,
+ // Bytes 2f80 - 2fbf
+ 0xCC, 0x84, 0xC9, 0x03, 0x41, 0xCC, 0x89, 0xC9,
+ 0x03, 0x41, 0xCC, 0x8C, 0xC9, 0x03, 0x41, 0xCC,
+ 0x8F, 0xC9, 0x03, 0x41, 0xCC, 0x91, 0xC9, 0x03,
+ 0x41, 0xCC, 0xA5, 0xB5, 0x03, 0x41, 0xCC, 0xA8,
+ 0xA5, 0x03, 0x42, 0xCC, 0x87, 0xC9, 0x03, 0x42,
+ 0xCC, 0xA3, 0xB5, 0x03, 0x42, 0xCC, 0xB1, 0xB5,
+ 0x03, 0x43, 0xCC, 0x81, 0xC9, 0x03, 0x43, 0xCC,
+ 0x82, 0xC9, 0x03, 0x43, 0xCC, 0x87, 0xC9, 0x03,
+ // Bytes 2fc0 - 2fff
+ 0x43, 0xCC, 0x8C, 0xC9, 0x03, 0x44, 0xCC, 0x87,
+ 0xC9, 0x03, 0x44, 0xCC, 0x8C, 0xC9, 0x03, 0x44,
+ 0xCC, 0xA3, 0xB5, 0x03, 0x44, 0xCC, 0xA7, 0xA5,
+ 0x03, 0x44, 0xCC, 0xAD, 0xB5, 0x03, 0x44, 0xCC,
+ 0xB1, 0xB5, 0x03, 0x45, 0xCC, 0x80, 0xC9, 0x03,
+ 0x45, 0xCC, 0x81, 0xC9, 0x03, 0x45, 0xCC, 0x83,
+ 0xC9, 0x03, 0x45, 0xCC, 0x86, 0xC9, 0x03, 0x45,
+ 0xCC, 0x87, 0xC9, 0x03, 0x45, 0xCC, 0x88, 0xC9,
+ // Bytes 3000 - 303f
+ 0x03, 0x45, 0xCC, 0x89, 0xC9, 0x03, 0x45, 0xCC,
+ 0x8C, 0xC9, 0x03, 0x45, 0xCC, 0x8F, 0xC9, 0x03,
+ 0x45, 0xCC, 0x91, 0xC9, 0x03, 0x45, 0xCC, 0xA8,
+ 0xA5, 0x03, 0x45, 0xCC, 0xAD, 0xB5, 0x03, 0x45,
+ 0xCC, 0xB0, 0xB5, 0x03, 0x46, 0xCC, 0x87, 0xC9,
+ 0x03, 0x47, 0xCC, 0x81, 0xC9, 0x03, 0x47, 0xCC,
+ 0x82, 0xC9, 0x03, 0x47, 0xCC, 0x84, 0xC9, 0x03,
+ 0x47, 0xCC, 0x86, 0xC9, 0x03, 0x47, 0xCC, 0x87,
+ // Bytes 3040 - 307f
+ 0xC9, 0x03, 0x47, 0xCC, 0x8C, 0xC9, 0x03, 0x47,
+ 0xCC, 0xA7, 0xA5, 0x03, 0x48, 0xCC, 0x82, 0xC9,
+ 0x03, 0x48, 0xCC, 0x87, 0xC9, 0x03, 0x48, 0xCC,
+ 0x88, 0xC9, 0x03, 0x48, 0xCC, 0x8C, 0xC9, 0x03,
+ 0x48, 0xCC, 0xA3, 0xB5, 0x03, 0x48, 0xCC, 0xA7,
+ 0xA5, 0x03, 0x48, 0xCC, 0xAE, 0xB5, 0x03, 0x49,
+ 0xCC, 0x80, 0xC9, 0x03, 0x49, 0xCC, 0x81, 0xC9,
+ 0x03, 0x49, 0xCC, 0x82, 0xC9, 0x03, 0x49, 0xCC,
+ // Bytes 3080 - 30bf
+ 0x83, 0xC9, 0x03, 0x49, 0xCC, 0x84, 0xC9, 0x03,
+ 0x49, 0xCC, 0x86, 0xC9, 0x03, 0x49, 0xCC, 0x87,
+ 0xC9, 0x03, 0x49, 0xCC, 0x89, 0xC9, 0x03, 0x49,
+ 0xCC, 0x8C, 0xC9, 0x03, 0x49, 0xCC, 0x8F, 0xC9,
+ 0x03, 0x49, 0xCC, 0x91, 0xC9, 0x03, 0x49, 0xCC,
+ 0xA3, 0xB5, 0x03, 0x49, 0xCC, 0xA8, 0xA5, 0x03,
+ 0x49, 0xCC, 0xB0, 0xB5, 0x03, 0x4A, 0xCC, 0x82,
+ 0xC9, 0x03, 0x4B, 0xCC, 0x81, 0xC9, 0x03, 0x4B,
+ // Bytes 30c0 - 30ff
+ 0xCC, 0x8C, 0xC9, 0x03, 0x4B, 0xCC, 0xA3, 0xB5,
+ 0x03, 0x4B, 0xCC, 0xA7, 0xA5, 0x03, 0x4B, 0xCC,
+ 0xB1, 0xB5, 0x03, 0x4C, 0xCC, 0x81, 0xC9, 0x03,
+ 0x4C, 0xCC, 0x8C, 0xC9, 0x03, 0x4C, 0xCC, 0xA7,
+ 0xA5, 0x03, 0x4C, 0xCC, 0xAD, 0xB5, 0x03, 0x4C,
+ 0xCC, 0xB1, 0xB5, 0x03, 0x4D, 0xCC, 0x81, 0xC9,
+ 0x03, 0x4D, 0xCC, 0x87, 0xC9, 0x03, 0x4D, 0xCC,
+ 0xA3, 0xB5, 0x03, 0x4E, 0xCC, 0x80, 0xC9, 0x03,
+ // Bytes 3100 - 313f
+ 0x4E, 0xCC, 0x81, 0xC9, 0x03, 0x4E, 0xCC, 0x83,
+ 0xC9, 0x03, 0x4E, 0xCC, 0x87, 0xC9, 0x03, 0x4E,
+ 0xCC, 0x8C, 0xC9, 0x03, 0x4E, 0xCC, 0xA3, 0xB5,
+ 0x03, 0x4E, 0xCC, 0xA7, 0xA5, 0x03, 0x4E, 0xCC,
+ 0xAD, 0xB5, 0x03, 0x4E, 0xCC, 0xB1, 0xB5, 0x03,
+ 0x4F, 0xCC, 0x80, 0xC9, 0x03, 0x4F, 0xCC, 0x81,
+ 0xC9, 0x03, 0x4F, 0xCC, 0x86, 0xC9, 0x03, 0x4F,
+ 0xCC, 0x89, 0xC9, 0x03, 0x4F, 0xCC, 0x8B, 0xC9,
+ // Bytes 3140 - 317f
+ 0x03, 0x4F, 0xCC, 0x8C, 0xC9, 0x03, 0x4F, 0xCC,
+ 0x8F, 0xC9, 0x03, 0x4F, 0xCC, 0x91, 0xC9, 0x03,
+ 0x50, 0xCC, 0x81, 0xC9, 0x03, 0x50, 0xCC, 0x87,
+ 0xC9, 0x03, 0x52, 0xCC, 0x81, 0xC9, 0x03, 0x52,
+ 0xCC, 0x87, 0xC9, 0x03, 0x52, 0xCC, 0x8C, 0xC9,
+ 0x03, 0x52, 0xCC, 0x8F, 0xC9, 0x03, 0x52, 0xCC,
+ 0x91, 0xC9, 0x03, 0x52, 0xCC, 0xA7, 0xA5, 0x03,
+ 0x52, 0xCC, 0xB1, 0xB5, 0x03, 0x53, 0xCC, 0x82,
+ // Bytes 3180 - 31bf
+ 0xC9, 0x03, 0x53, 0xCC, 0x87, 0xC9, 0x03, 0x53,
+ 0xCC, 0xA6, 0xB5, 0x03, 0x53, 0xCC, 0xA7, 0xA5,
+ 0x03, 0x54, 0xCC, 0x87, 0xC9, 0x03, 0x54, 0xCC,
+ 0x8C, 0xC9, 0x03, 0x54, 0xCC, 0xA3, 0xB5, 0x03,
+ 0x54, 0xCC, 0xA6, 0xB5, 0x03, 0x54, 0xCC, 0xA7,
+ 0xA5, 0x03, 0x54, 0xCC, 0xAD, 0xB5, 0x03, 0x54,
+ 0xCC, 0xB1, 0xB5, 0x03, 0x55, 0xCC, 0x80, 0xC9,
+ 0x03, 0x55, 0xCC, 0x81, 0xC9, 0x03, 0x55, 0xCC,
+ // Bytes 31c0 - 31ff
+ 0x82, 0xC9, 0x03, 0x55, 0xCC, 0x86, 0xC9, 0x03,
+ 0x55, 0xCC, 0x89, 0xC9, 0x03, 0x55, 0xCC, 0x8A,
+ 0xC9, 0x03, 0x55, 0xCC, 0x8B, 0xC9, 0x03, 0x55,
+ 0xCC, 0x8C, 0xC9, 0x03, 0x55, 0xCC, 0x8F, 0xC9,
+ 0x03, 0x55, 0xCC, 0x91, 0xC9, 0x03, 0x55, 0xCC,
+ 0xA3, 0xB5, 0x03, 0x55, 0xCC, 0xA4, 0xB5, 0x03,
+ 0x55, 0xCC, 0xA8, 0xA5, 0x03, 0x55, 0xCC, 0xAD,
+ 0xB5, 0x03, 0x55, 0xCC, 0xB0, 0xB5, 0x03, 0x56,
+ // Bytes 3200 - 323f
+ 0xCC, 0x83, 0xC9, 0x03, 0x56, 0xCC, 0xA3, 0xB5,
+ 0x03, 0x57, 0xCC, 0x80, 0xC9, 0x03, 0x57, 0xCC,
+ 0x81, 0xC9, 0x03, 0x57, 0xCC, 0x82, 0xC9, 0x03,
+ 0x57, 0xCC, 0x87, 0xC9, 0x03, 0x57, 0xCC, 0x88,
+ 0xC9, 0x03, 0x57, 0xCC, 0xA3, 0xB5, 0x03, 0x58,
+ 0xCC, 0x87, 0xC9, 0x03, 0x58, 0xCC, 0x88, 0xC9,
+ 0x03, 0x59, 0xCC, 0x80, 0xC9, 0x03, 0x59, 0xCC,
+ 0x81, 0xC9, 0x03, 0x59, 0xCC, 0x82, 0xC9, 0x03,
+ // Bytes 3240 - 327f
+ 0x59, 0xCC, 0x83, 0xC9, 0x03, 0x59, 0xCC, 0x84,
+ 0xC9, 0x03, 0x59, 0xCC, 0x87, 0xC9, 0x03, 0x59,
+ 0xCC, 0x88, 0xC9, 0x03, 0x59, 0xCC, 0x89, 0xC9,
+ 0x03, 0x59, 0xCC, 0xA3, 0xB5, 0x03, 0x5A, 0xCC,
+ 0x81, 0xC9, 0x03, 0x5A, 0xCC, 0x82, 0xC9, 0x03,
+ 0x5A, 0xCC, 0x87, 0xC9, 0x03, 0x5A, 0xCC, 0x8C,
+ 0xC9, 0x03, 0x5A, 0xCC, 0xA3, 0xB5, 0x03, 0x5A,
+ 0xCC, 0xB1, 0xB5, 0x03, 0x61, 0xCC, 0x80, 0xC9,
+ // Bytes 3280 - 32bf
+ 0x03, 0x61, 0xCC, 0x81, 0xC9, 0x03, 0x61, 0xCC,
+ 0x83, 0xC9, 0x03, 0x61, 0xCC, 0x84, 0xC9, 0x03,
+ 0x61, 0xCC, 0x89, 0xC9, 0x03, 0x61, 0xCC, 0x8C,
+ 0xC9, 0x03, 0x61, 0xCC, 0x8F, 0xC9, 0x03, 0x61,
+ 0xCC, 0x91, 0xC9, 0x03, 0x61, 0xCC, 0xA5, 0xB5,
+ 0x03, 0x61, 0xCC, 0xA8, 0xA5, 0x03, 0x62, 0xCC,
+ 0x87, 0xC9, 0x03, 0x62, 0xCC, 0xA3, 0xB5, 0x03,
+ 0x62, 0xCC, 0xB1, 0xB5, 0x03, 0x63, 0xCC, 0x81,
+ // Bytes 32c0 - 32ff
+ 0xC9, 0x03, 0x63, 0xCC, 0x82, 0xC9, 0x03, 0x63,
+ 0xCC, 0x87, 0xC9, 0x03, 0x63, 0xCC, 0x8C, 0xC9,
+ 0x03, 0x64, 0xCC, 0x87, 0xC9, 0x03, 0x64, 0xCC,
+ 0x8C, 0xC9, 0x03, 0x64, 0xCC, 0xA3, 0xB5, 0x03,
+ 0x64, 0xCC, 0xA7, 0xA5, 0x03, 0x64, 0xCC, 0xAD,
+ 0xB5, 0x03, 0x64, 0xCC, 0xB1, 0xB5, 0x03, 0x65,
+ 0xCC, 0x80, 0xC9, 0x03, 0x65, 0xCC, 0x81, 0xC9,
+ 0x03, 0x65, 0xCC, 0x83, 0xC9, 0x03, 0x65, 0xCC,
+ // Bytes 3300 - 333f
+ 0x86, 0xC9, 0x03, 0x65, 0xCC, 0x87, 0xC9, 0x03,
+ 0x65, 0xCC, 0x88, 0xC9, 0x03, 0x65, 0xCC, 0x89,
+ 0xC9, 0x03, 0x65, 0xCC, 0x8C, 0xC9, 0x03, 0x65,
+ 0xCC, 0x8F, 0xC9, 0x03, 0x65, 0xCC, 0x91, 0xC9,
+ 0x03, 0x65, 0xCC, 0xA8, 0xA5, 0x03, 0x65, 0xCC,
+ 0xAD, 0xB5, 0x03, 0x65, 0xCC, 0xB0, 0xB5, 0x03,
+ 0x66, 0xCC, 0x87, 0xC9, 0x03, 0x67, 0xCC, 0x81,
+ 0xC9, 0x03, 0x67, 0xCC, 0x82, 0xC9, 0x03, 0x67,
+ // Bytes 3340 - 337f
+ 0xCC, 0x84, 0xC9, 0x03, 0x67, 0xCC, 0x86, 0xC9,
+ 0x03, 0x67, 0xCC, 0x87, 0xC9, 0x03, 0x67, 0xCC,
+ 0x8C, 0xC9, 0x03, 0x67, 0xCC, 0xA7, 0xA5, 0x03,
+ 0x68, 0xCC, 0x82, 0xC9, 0x03, 0x68, 0xCC, 0x87,
+ 0xC9, 0x03, 0x68, 0xCC, 0x88, 0xC9, 0x03, 0x68,
+ 0xCC, 0x8C, 0xC9, 0x03, 0x68, 0xCC, 0xA3, 0xB5,
+ 0x03, 0x68, 0xCC, 0xA7, 0xA5, 0x03, 0x68, 0xCC,
+ 0xAE, 0xB5, 0x03, 0x68, 0xCC, 0xB1, 0xB5, 0x03,
+ // Bytes 3380 - 33bf
+ 0x69, 0xCC, 0x80, 0xC9, 0x03, 0x69, 0xCC, 0x81,
+ 0xC9, 0x03, 0x69, 0xCC, 0x82, 0xC9, 0x03, 0x69,
+ 0xCC, 0x83, 0xC9, 0x03, 0x69, 0xCC, 0x84, 0xC9,
+ 0x03, 0x69, 0xCC, 0x86, 0xC9, 0x03, 0x69, 0xCC,
+ 0x89, 0xC9, 0x03, 0x69, 0xCC, 0x8C, 0xC9, 0x03,
+ 0x69, 0xCC, 0x8F, 0xC9, 0x03, 0x69, 0xCC, 0x91,
+ 0xC9, 0x03, 0x69, 0xCC, 0xA3, 0xB5, 0x03, 0x69,
+ 0xCC, 0xA8, 0xA5, 0x03, 0x69, 0xCC, 0xB0, 0xB5,
+ // Bytes 33c0 - 33ff
+ 0x03, 0x6A, 0xCC, 0x82, 0xC9, 0x03, 0x6A, 0xCC,
+ 0x8C, 0xC9, 0x03, 0x6B, 0xCC, 0x81, 0xC9, 0x03,
+ 0x6B, 0xCC, 0x8C, 0xC9, 0x03, 0x6B, 0xCC, 0xA3,
+ 0xB5, 0x03, 0x6B, 0xCC, 0xA7, 0xA5, 0x03, 0x6B,
+ 0xCC, 0xB1, 0xB5, 0x03, 0x6C, 0xCC, 0x81, 0xC9,
+ 0x03, 0x6C, 0xCC, 0x8C, 0xC9, 0x03, 0x6C, 0xCC,
+ 0xA7, 0xA5, 0x03, 0x6C, 0xCC, 0xAD, 0xB5, 0x03,
+ 0x6C, 0xCC, 0xB1, 0xB5, 0x03, 0x6D, 0xCC, 0x81,
+ // Bytes 3400 - 343f
+ 0xC9, 0x03, 0x6D, 0xCC, 0x87, 0xC9, 0x03, 0x6D,
+ 0xCC, 0xA3, 0xB5, 0x03, 0x6E, 0xCC, 0x80, 0xC9,
+ 0x03, 0x6E, 0xCC, 0x81, 0xC9, 0x03, 0x6E, 0xCC,
+ 0x83, 0xC9, 0x03, 0x6E, 0xCC, 0x87, 0xC9, 0x03,
+ 0x6E, 0xCC, 0x8C, 0xC9, 0x03, 0x6E, 0xCC, 0xA3,
+ 0xB5, 0x03, 0x6E, 0xCC, 0xA7, 0xA5, 0x03, 0x6E,
+ 0xCC, 0xAD, 0xB5, 0x03, 0x6E, 0xCC, 0xB1, 0xB5,
+ 0x03, 0x6F, 0xCC, 0x80, 0xC9, 0x03, 0x6F, 0xCC,
+ // Bytes 3440 - 347f
+ 0x81, 0xC9, 0x03, 0x6F, 0xCC, 0x86, 0xC9, 0x03,
+ 0x6F, 0xCC, 0x89, 0xC9, 0x03, 0x6F, 0xCC, 0x8B,
+ 0xC9, 0x03, 0x6F, 0xCC, 0x8C, 0xC9, 0x03, 0x6F,
+ 0xCC, 0x8F, 0xC9, 0x03, 0x6F, 0xCC, 0x91, 0xC9,
+ 0x03, 0x70, 0xCC, 0x81, 0xC9, 0x03, 0x70, 0xCC,
+ 0x87, 0xC9, 0x03, 0x72, 0xCC, 0x81, 0xC9, 0x03,
+ 0x72, 0xCC, 0x87, 0xC9, 0x03, 0x72, 0xCC, 0x8C,
+ 0xC9, 0x03, 0x72, 0xCC, 0x8F, 0xC9, 0x03, 0x72,
+ // Bytes 3480 - 34bf
+ 0xCC, 0x91, 0xC9, 0x03, 0x72, 0xCC, 0xA7, 0xA5,
+ 0x03, 0x72, 0xCC, 0xB1, 0xB5, 0x03, 0x73, 0xCC,
+ 0x82, 0xC9, 0x03, 0x73, 0xCC, 0x87, 0xC9, 0x03,
+ 0x73, 0xCC, 0xA6, 0xB5, 0x03, 0x73, 0xCC, 0xA7,
+ 0xA5, 0x03, 0x74, 0xCC, 0x87, 0xC9, 0x03, 0x74,
+ 0xCC, 0x88, 0xC9, 0x03, 0x74, 0xCC, 0x8C, 0xC9,
+ 0x03, 0x74, 0xCC, 0xA3, 0xB5, 0x03, 0x74, 0xCC,
+ 0xA6, 0xB5, 0x03, 0x74, 0xCC, 0xA7, 0xA5, 0x03,
+ // Bytes 34c0 - 34ff
+ 0x74, 0xCC, 0xAD, 0xB5, 0x03, 0x74, 0xCC, 0xB1,
+ 0xB5, 0x03, 0x75, 0xCC, 0x80, 0xC9, 0x03, 0x75,
+ 0xCC, 0x81, 0xC9, 0x03, 0x75, 0xCC, 0x82, 0xC9,
+ 0x03, 0x75, 0xCC, 0x86, 0xC9, 0x03, 0x75, 0xCC,
+ 0x89, 0xC9, 0x03, 0x75, 0xCC, 0x8A, 0xC9, 0x03,
+ 0x75, 0xCC, 0x8B, 0xC9, 0x03, 0x75, 0xCC, 0x8C,
+ 0xC9, 0x03, 0x75, 0xCC, 0x8F, 0xC9, 0x03, 0x75,
+ 0xCC, 0x91, 0xC9, 0x03, 0x75, 0xCC, 0xA3, 0xB5,
+ // Bytes 3500 - 353f
+ 0x03, 0x75, 0xCC, 0xA4, 0xB5, 0x03, 0x75, 0xCC,
+ 0xA8, 0xA5, 0x03, 0x75, 0xCC, 0xAD, 0xB5, 0x03,
+ 0x75, 0xCC, 0xB0, 0xB5, 0x03, 0x76, 0xCC, 0x83,
+ 0xC9, 0x03, 0x76, 0xCC, 0xA3, 0xB5, 0x03, 0x77,
+ 0xCC, 0x80, 0xC9, 0x03, 0x77, 0xCC, 0x81, 0xC9,
+ 0x03, 0x77, 0xCC, 0x82, 0xC9, 0x03, 0x77, 0xCC,
+ 0x87, 0xC9, 0x03, 0x77, 0xCC, 0x88, 0xC9, 0x03,
+ 0x77, 0xCC, 0x8A, 0xC9, 0x03, 0x77, 0xCC, 0xA3,
+ // Bytes 3540 - 357f
+ 0xB5, 0x03, 0x78, 0xCC, 0x87, 0xC9, 0x03, 0x78,
+ 0xCC, 0x88, 0xC9, 0x03, 0x79, 0xCC, 0x80, 0xC9,
+ 0x03, 0x79, 0xCC, 0x81, 0xC9, 0x03, 0x79, 0xCC,
+ 0x82, 0xC9, 0x03, 0x79, 0xCC, 0x83, 0xC9, 0x03,
+ 0x79, 0xCC, 0x84, 0xC9, 0x03, 0x79, 0xCC, 0x87,
+ 0xC9, 0x03, 0x79, 0xCC, 0x88, 0xC9, 0x03, 0x79,
+ 0xCC, 0x89, 0xC9, 0x03, 0x79, 0xCC, 0x8A, 0xC9,
+ 0x03, 0x79, 0xCC, 0xA3, 0xB5, 0x03, 0x7A, 0xCC,
+ // Bytes 3580 - 35bf
+ 0x81, 0xC9, 0x03, 0x7A, 0xCC, 0x82, 0xC9, 0x03,
+ 0x7A, 0xCC, 0x87, 0xC9, 0x03, 0x7A, 0xCC, 0x8C,
+ 0xC9, 0x03, 0x7A, 0xCC, 0xA3, 0xB5, 0x03, 0x7A,
+ 0xCC, 0xB1, 0xB5, 0x04, 0xC2, 0xA8, 0xCC, 0x80,
+ 0xCA, 0x04, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x04,
+ 0xC2, 0xA8, 0xCD, 0x82, 0xCA, 0x04, 0xC3, 0x86,
+ 0xCC, 0x81, 0xC9, 0x04, 0xC3, 0x86, 0xCC, 0x84,
+ 0xC9, 0x04, 0xC3, 0x98, 0xCC, 0x81, 0xC9, 0x04,
+ // Bytes 35c0 - 35ff
+ 0xC3, 0xA6, 0xCC, 0x81, 0xC9, 0x04, 0xC3, 0xA6,
+ 0xCC, 0x84, 0xC9, 0x04, 0xC3, 0xB8, 0xCC, 0x81,
+ 0xC9, 0x04, 0xC5, 0xBF, 0xCC, 0x87, 0xC9, 0x04,
+ 0xC6, 0xB7, 0xCC, 0x8C, 0xC9, 0x04, 0xCA, 0x92,
+ 0xCC, 0x8C, 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x80,
+ 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x81, 0xC9, 0x04,
+ 0xCE, 0x91, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0x91,
+ 0xCC, 0x86, 0xC9, 0x04, 0xCE, 0x91, 0xCD, 0x85,
+ // Bytes 3600 - 363f
+ 0xD9, 0x04, 0xCE, 0x95, 0xCC, 0x80, 0xC9, 0x04,
+ 0xCE, 0x95, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x97,
+ 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x97, 0xCC, 0x81,
+ 0xC9, 0x04, 0xCE, 0x97, 0xCD, 0x85, 0xD9, 0x04,
+ 0xCE, 0x99, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x99,
+ 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x84,
+ 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x86, 0xC9, 0x04,
+ 0xCE, 0x99, 0xCC, 0x88, 0xC9, 0x04, 0xCE, 0x9F,
+ // Bytes 3640 - 367f
+ 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x9F, 0xCC, 0x81,
+ 0xC9, 0x04, 0xCE, 0xA1, 0xCC, 0x94, 0xC9, 0x04,
+ 0xCE, 0xA5, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xA5,
+ 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x84,
+ 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x86, 0xC9, 0x04,
+ 0xCE, 0xA5, 0xCC, 0x88, 0xC9, 0x04, 0xCE, 0xA9,
+ 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xA9, 0xCC, 0x81,
+ 0xC9, 0x04, 0xCE, 0xA9, 0xCD, 0x85, 0xD9, 0x04,
+ // Bytes 3680 - 36bf
+ 0xCE, 0xB1, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xB1,
+ 0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xB1, 0xCD, 0x85,
+ 0xD9, 0x04, 0xCE, 0xB5, 0xCC, 0x80, 0xC9, 0x04,
+ 0xCE, 0xB5, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xB7,
+ 0xCD, 0x85, 0xD9, 0x04, 0xCE, 0xB9, 0xCC, 0x80,
+ 0xC9, 0x04, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x04,
+ 0xCE, 0xB9, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xB9,
+ 0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xB9, 0xCD, 0x82,
+ // Bytes 36c0 - 36ff
+ 0xC9, 0x04, 0xCE, 0xBF, 0xCC, 0x80, 0xC9, 0x04,
+ 0xCE, 0xBF, 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x81,
+ 0xCC, 0x93, 0xC9, 0x04, 0xCF, 0x81, 0xCC, 0x94,
+ 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x80, 0xC9, 0x04,
+ 0xCF, 0x85, 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x85,
+ 0xCC, 0x84, 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x86,
+ 0xC9, 0x04, 0xCF, 0x85, 0xCD, 0x82, 0xC9, 0x04,
+ 0xCF, 0x89, 0xCD, 0x85, 0xD9, 0x04, 0xCF, 0x92,
+ // Bytes 3700 - 373f
+ 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x92, 0xCC, 0x88,
+ 0xC9, 0x04, 0xD0, 0x86, 0xCC, 0x88, 0xC9, 0x04,
+ 0xD0, 0x90, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x90,
+ 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x93, 0xCC, 0x81,
+ 0xC9, 0x04, 0xD0, 0x95, 0xCC, 0x80, 0xC9, 0x04,
+ 0xD0, 0x95, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x95,
+ 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x96, 0xCC, 0x86,
+ 0xC9, 0x04, 0xD0, 0x96, 0xCC, 0x88, 0xC9, 0x04,
+ // Bytes 3740 - 377f
+ 0xD0, 0x97, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x98,
+ 0xCC, 0x80, 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x84,
+ 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x86, 0xC9, 0x04,
+ 0xD0, 0x98, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x9A,
+ 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0x9E, 0xCC, 0x88,
+ 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x84, 0xC9, 0x04,
+ 0xD0, 0xA3, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xA3,
+ 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x8B,
+ // Bytes 3780 - 37bf
+ 0xC9, 0x04, 0xD0, 0xA7, 0xCC, 0x88, 0xC9, 0x04,
+ 0xD0, 0xAB, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xAD,
+ 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB0, 0xCC, 0x86,
+ 0xC9, 0x04, 0xD0, 0xB0, 0xCC, 0x88, 0xC9, 0x04,
+ 0xD0, 0xB3, 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0xB5,
+ 0xCC, 0x80, 0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x86,
+ 0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x88, 0xC9, 0x04,
+ 0xD0, 0xB6, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB6,
+ // Bytes 37c0 - 37ff
+ 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB7, 0xCC, 0x88,
+ 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x80, 0xC9, 0x04,
+ 0xD0, 0xB8, 0xCC, 0x84, 0xC9, 0x04, 0xD0, 0xB8,
+ 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x88,
+ 0xC9, 0x04, 0xD0, 0xBA, 0xCC, 0x81, 0xC9, 0x04,
+ 0xD0, 0xBE, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x83,
+ 0xCC, 0x84, 0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x86,
+ 0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x88, 0xC9, 0x04,
+ // Bytes 3800 - 383f
+ 0xD1, 0x83, 0xCC, 0x8B, 0xC9, 0x04, 0xD1, 0x87,
+ 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x8B, 0xCC, 0x88,
+ 0xC9, 0x04, 0xD1, 0x8D, 0xCC, 0x88, 0xC9, 0x04,
+ 0xD1, 0x96, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0xB4,
+ 0xCC, 0x8F, 0xC9, 0x04, 0xD1, 0xB5, 0xCC, 0x8F,
+ 0xC9, 0x04, 0xD3, 0x98, 0xCC, 0x88, 0xC9, 0x04,
+ 0xD3, 0x99, 0xCC, 0x88, 0xC9, 0x04, 0xD3, 0xA8,
+ 0xCC, 0x88, 0xC9, 0x04, 0xD3, 0xA9, 0xCC, 0x88,
+ // Bytes 3840 - 387f
+ 0xC9, 0x04, 0xD8, 0xA7, 0xD9, 0x93, 0xC9, 0x04,
+ 0xD8, 0xA7, 0xD9, 0x94, 0xC9, 0x04, 0xD8, 0xA7,
+ 0xD9, 0x95, 0xB5, 0x04, 0xD9, 0x88, 0xD9, 0x94,
+ 0xC9, 0x04, 0xD9, 0x8A, 0xD9, 0x94, 0xC9, 0x04,
+ 0xDB, 0x81, 0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x92,
+ 0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x95, 0xD9, 0x94,
+ 0xC9, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x80, 0xCA,
+ 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05,
+ // Bytes 3880 - 38bf
+ 0x41, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x41,
+ 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x41, 0xCC,
+ 0x86, 0xCC, 0x80, 0xCA, 0x05, 0x41, 0xCC, 0x86,
+ 0xCC, 0x81, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC,
+ 0x83, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x89,
+ 0xCA, 0x05, 0x41, 0xCC, 0x87, 0xCC, 0x84, 0xCA,
+ 0x05, 0x41, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05,
+ 0x41, 0xCC, 0x8A, 0xCC, 0x81, 0xCA, 0x05, 0x41,
+ // Bytes 38c0 - 38ff
+ 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x41, 0xCC,
+ 0xA3, 0xCC, 0x86, 0xCA, 0x05, 0x43, 0xCC, 0xA7,
+ 0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC,
+ 0x80, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x81,
+ 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x83, 0xCA,
+ 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05,
+ 0x45, 0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x45,
+ 0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC,
+ // Bytes 3900 - 393f
+ 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x45, 0xCC, 0xA7,
+ 0xCC, 0x86, 0xCA, 0x05, 0x49, 0xCC, 0x88, 0xCC,
+ 0x81, 0xCA, 0x05, 0x4C, 0xCC, 0xA3, 0xCC, 0x84,
+ 0xCA, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x80, 0xCA,
+ 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05,
+ 0x4F, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x4F,
+ 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x4F, 0xCC,
+ 0x83, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x83,
+ // Bytes 3940 - 397f
+ 0xCC, 0x84, 0xCA, 0x05, 0x4F, 0xCC, 0x83, 0xCC,
+ 0x88, 0xCA, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x80,
+ 0xCA, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x81, 0xCA,
+ 0x05, 0x4F, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05,
+ 0x4F, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x4F,
+ 0xCC, 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x4F, 0xCC,
+ 0x9B, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x9B,
+ 0xCC, 0x83, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC,
+ // Bytes 3980 - 39bf
+ 0x89, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0xA3,
+ 0xB6, 0x05, 0x4F, 0xCC, 0xA3, 0xCC, 0x82, 0xCA,
+ 0x05, 0x4F, 0xCC, 0xA8, 0xCC, 0x84, 0xCA, 0x05,
+ 0x52, 0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x53,
+ 0xCC, 0x81, 0xCC, 0x87, 0xCA, 0x05, 0x53, 0xCC,
+ 0x8C, 0xCC, 0x87, 0xCA, 0x05, 0x53, 0xCC, 0xA3,
+ 0xCC, 0x87, 0xCA, 0x05, 0x55, 0xCC, 0x83, 0xCC,
+ 0x81, 0xCA, 0x05, 0x55, 0xCC, 0x84, 0xCC, 0x88,
+ // Bytes 39c0 - 39ff
+ 0xCA, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x80, 0xCA,
+ 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05,
+ 0x55, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x55,
+ 0xCC, 0x88, 0xCC, 0x8C, 0xCA, 0x05, 0x55, 0xCC,
+ 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x55, 0xCC, 0x9B,
+ 0xCC, 0x81, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC,
+ 0x83, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x89,
+ 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6,
+ // Bytes 3a00 - 3a3f
+ 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05,
+ 0x61, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x61,
+ 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x61, 0xCC,
+ 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x61, 0xCC, 0x86,
+ 0xCC, 0x80, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC,
+ 0x81, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x83,
+ 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x89, 0xCA,
+ 0x05, 0x61, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05,
+ // Bytes 3a40 - 3a7f
+ 0x61, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x61,
+ 0xCC, 0x8A, 0xCC, 0x81, 0xCA, 0x05, 0x61, 0xCC,
+ 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x61, 0xCC, 0xA3,
+ 0xCC, 0x86, 0xCA, 0x05, 0x63, 0xCC, 0xA7, 0xCC,
+ 0x81, 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x80,
+ 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x81, 0xCA,
+ 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05,
+ 0x65, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x65,
+ // Bytes 3a80 - 3abf
+ 0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x65, 0xCC,
+ 0x84, 0xCC, 0x81, 0xCA, 0x05, 0x65, 0xCC, 0xA3,
+ 0xCC, 0x82, 0xCA, 0x05, 0x65, 0xCC, 0xA7, 0xCC,
+ 0x86, 0xCA, 0x05, 0x69, 0xCC, 0x88, 0xCC, 0x81,
+ 0xCA, 0x05, 0x6C, 0xCC, 0xA3, 0xCC, 0x84, 0xCA,
+ 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05,
+ 0x6F, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x6F,
+ 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x6F, 0xCC,
+ // Bytes 3ac0 - 3aff
+ 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x6F, 0xCC, 0x83,
+ 0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC,
+ 0x84, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC, 0x88,
+ 0xCA, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x80, 0xCA,
+ 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05,
+ 0x6F, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05, 0x6F,
+ 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x6F, 0xCC,
+ 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x6F, 0xCC, 0x9B,
+ // Bytes 3b00 - 3b3f
+ 0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC,
+ 0x83, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0x89,
+ 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6,
+ 0x05, 0x6F, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05,
+ 0x6F, 0xCC, 0xA8, 0xCC, 0x84, 0xCA, 0x05, 0x72,
+ 0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x73, 0xCC,
+ 0x81, 0xCC, 0x87, 0xCA, 0x05, 0x73, 0xCC, 0x8C,
+ 0xCC, 0x87, 0xCA, 0x05, 0x73, 0xCC, 0xA3, 0xCC,
+ // Bytes 3b40 - 3b7f
+ 0x87, 0xCA, 0x05, 0x75, 0xCC, 0x83, 0xCC, 0x81,
+ 0xCA, 0x05, 0x75, 0xCC, 0x84, 0xCC, 0x88, 0xCA,
+ 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x80, 0xCA, 0x05,
+ 0x75, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05, 0x75,
+ 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x75, 0xCC,
+ 0x88, 0xCC, 0x8C, 0xCA, 0x05, 0x75, 0xCC, 0x9B,
+ 0xCC, 0x80, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC,
+ 0x81, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x83,
+ // Bytes 3b80 - 3bbf
+ 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x89, 0xCA,
+ 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6, 0x05,
+ 0xE1, 0xBE, 0xBF, 0xCC, 0x80, 0xCA, 0x05, 0xE1,
+ 0xBE, 0xBF, 0xCC, 0x81, 0xCA, 0x05, 0xE1, 0xBE,
+ 0xBF, 0xCD, 0x82, 0xCA, 0x05, 0xE1, 0xBF, 0xBE,
+ 0xCC, 0x80, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCC,
+ 0x81, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCD, 0x82,
+ 0xCA, 0x05, 0xE2, 0x86, 0x90, 0xCC, 0xB8, 0x05,
+ // Bytes 3bc0 - 3bff
+ 0x05, 0xE2, 0x86, 0x92, 0xCC, 0xB8, 0x05, 0x05,
+ 0xE2, 0x86, 0x94, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+ 0x87, 0x90, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87,
+ 0x92, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87, 0x94,
+ 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x83, 0xCC,
+ 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x88, 0xCC, 0xB8,
+ 0x05, 0x05, 0xE2, 0x88, 0x8B, 0xCC, 0xB8, 0x05,
+ 0x05, 0xE2, 0x88, 0xA3, 0xCC, 0xB8, 0x05, 0x05,
+ // Bytes 3c00 - 3c3f
+ 0xE2, 0x88, 0xA5, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+ 0x88, 0xBC, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89,
+ 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x85,
+ 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x88, 0xCC,
+ 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x8D, 0xCC, 0xB8,
+ 0x05, 0x05, 0xE2, 0x89, 0xA1, 0xCC, 0xB8, 0x05,
+ 0x05, 0xE2, 0x89, 0xA4, 0xCC, 0xB8, 0x05, 0x05,
+ 0xE2, 0x89, 0xA5, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+ // Bytes 3c40 - 3c7f
+ 0x89, 0xB2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89,
+ 0xB3, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB6,
+ 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB7, 0xCC,
+ 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBA, 0xCC, 0xB8,
+ 0x05, 0x05, 0xE2, 0x89, 0xBB, 0xCC, 0xB8, 0x05,
+ 0x05, 0xE2, 0x89, 0xBC, 0xCC, 0xB8, 0x05, 0x05,
+ 0xE2, 0x89, 0xBD, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+ 0x8A, 0x82, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A,
+ // Bytes 3c80 - 3cbf
+ 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x86,
+ 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x87, 0xCC,
+ 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x91, 0xCC, 0xB8,
+ 0x05, 0x05, 0xE2, 0x8A, 0x92, 0xCC, 0xB8, 0x05,
+ 0x05, 0xE2, 0x8A, 0xA2, 0xCC, 0xB8, 0x05, 0x05,
+ 0xE2, 0x8A, 0xA8, 0xCC, 0xB8, 0x05, 0x05, 0xE2,
+ 0x8A, 0xA9, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A,
+ 0xAB, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB2,
+ // Bytes 3cc0 - 3cff
+ 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB3, 0xCC,
+ 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB4, 0xCC, 0xB8,
+ 0x05, 0x05, 0xE2, 0x8A, 0xB5, 0xCC, 0xB8, 0x05,
+ 0x06, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+ 0x06, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+ 0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+ 0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+ 0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+ // Bytes 3d00 - 3d3f
+ 0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+ 0x06, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+ 0x06, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+ 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+ 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+ 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCD, 0x82, 0xCA,
+ 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+ 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+ // Bytes 3d40 - 3d7f
+ 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCD, 0x82, 0xCA,
+ 0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+ 0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+ 0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+ 0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+ 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+ 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+ 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCD, 0x82, 0xCA,
+ // Bytes 3d80 - 3dbf
+ 0x06, 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+ 0x06, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+ 0x06, 0xCE, 0xB1, 0xCC, 0x80, 0xCD, 0x85, 0xDA,
+ 0x06, 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x85, 0xDA,
+ 0x06, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+ 0x06, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+ 0x06, 0xCE, 0xB1, 0xCD, 0x82, 0xCD, 0x85, 0xDA,
+ 0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+ // Bytes 3dc0 - 3dff
+ 0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+ 0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+ 0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+ 0x06, 0xCE, 0xB7, 0xCC, 0x80, 0xCD, 0x85, 0xDA,
+ 0x06, 0xCE, 0xB7, 0xCC, 0x81, 0xCD, 0x85, 0xDA,
+ 0x06, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+ 0x06, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+ 0x06, 0xCE, 0xB7, 0xCD, 0x82, 0xCD, 0x85, 0xDA,
+ // Bytes 3e00 - 3e3f
+ 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x80, 0xCA,
+ 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81, 0xCA,
+ 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCD, 0x82, 0xCA,
+ 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+ 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+ 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCD, 0x82, 0xCA,
+ 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+ 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+ // Bytes 3e40 - 3e7f
+ 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCD, 0x82, 0xCA,
+ 0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+ 0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+ 0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+ 0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+ 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x80, 0xCA,
+ 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x81, 0xCA,
+ 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCD, 0x82, 0xCA,
+ // Bytes 3e80 - 3ebf
+ 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+ 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x81, 0xCA,
+ 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCD, 0x82, 0xCA,
+ 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x80, 0xCA,
+ 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x81, 0xCA,
+ 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCD, 0x82, 0xCA,
+ 0x06, 0xCF, 0x89, 0xCC, 0x80, 0xCD, 0x85, 0xDA,
+ 0x06, 0xCF, 0x89, 0xCC, 0x81, 0xCD, 0x85, 0xDA,
+ // Bytes 3ec0 - 3eff
+ 0x06, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x85, 0xDA,
+ 0x06, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x85, 0xDA,
+ 0x06, 0xCF, 0x89, 0xCD, 0x82, 0xCD, 0x85, 0xDA,
+ 0x06, 0xE0, 0xA4, 0xA8, 0xE0, 0xA4, 0xBC, 0x09,
+ 0x06, 0xE0, 0xA4, 0xB0, 0xE0, 0xA4, 0xBC, 0x09,
+ 0x06, 0xE0, 0xA4, 0xB3, 0xE0, 0xA4, 0xBC, 0x09,
+ 0x06, 0xE0, 0xB1, 0x86, 0xE0, 0xB1, 0x96, 0x85,
+ 0x06, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8A, 0x11,
+ // Bytes 3f00 - 3f3f
+ 0x06, 0xE3, 0x81, 0x86, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x81, 0x8B, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x81, 0x8D, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x81, 0x8F, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x81, 0x91, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x81, 0x93, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x81, 0x95, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x81, 0x97, 0xE3, 0x82, 0x99, 0x0D,
+ // Bytes 3f40 - 3f7f
+ 0x06, 0xE3, 0x81, 0x99, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x81, 0x9D, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x81, 0x9F, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x81, 0xA1, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x81, 0xA4, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x81, 0xA6, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x81, 0xA8, 0xE3, 0x82, 0x99, 0x0D,
+ // Bytes 3f80 - 3fbf
+ 0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x9A, 0x0D,
+ 0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x9A, 0x0D,
+ 0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x9A, 0x0D,
+ 0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x9A, 0x0D,
+ // Bytes 3fc0 - 3fff
+ 0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x9A, 0x0D,
+ 0x06, 0xE3, 0x82, 0x9D, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, 0x0D,
+ // Bytes 4000 - 403f
+ 0x06, 0xE3, 0x82, 0xB3, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x82, 0xB9, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x82, 0xBD, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x83, 0x81, 0xE3, 0x82, 0x99, 0x0D,
+ // Bytes 4040 - 407f
+ 0x06, 0xE3, 0x83, 0x84, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0x0D,
+ 0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0x0D,
+ 0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, 0x0D,
+ // Bytes 4080 - 40bf
+ 0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x9A, 0x0D,
+ 0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0x0D,
+ 0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0x0D,
+ 0x06, 0xE3, 0x83, 0xAF, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x83, 0xB0, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x83, 0xB1, 0xE3, 0x82, 0x99, 0x0D,
+ // Bytes 40c0 - 40ff
+ 0x06, 0xE3, 0x83, 0xB2, 0xE3, 0x82, 0x99, 0x0D,
+ 0x06, 0xE3, 0x83, 0xBD, 0xE3, 0x82, 0x99, 0x0D,
+ 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCD,
+ 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC,
+ 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC,
+ 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+ 0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB,
+ 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCD,
+ // Bytes 4100 - 413f
+ 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCD,
+ 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC,
+ 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+ 0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB,
+ 0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCD,
+ 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x94, 0xCC,
+ 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC,
+ 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+ // Bytes 4140 - 417f
+ 0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB,
+ 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCD,
+ 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC,
+ 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC,
+ 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+ 0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB,
+ 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCD,
+ 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCD,
+ // Bytes 4180 - 41bf
+ 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC,
+ 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+ 0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB,
+ 0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCD,
+ 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x94, 0xCC,
+ 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC,
+ 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+ 0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB,
+ // Bytes 41c0 - 41ff
+ 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCD,
+ 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC,
+ 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC,
+ 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE,
+ 0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB,
+ 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCD,
+ 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCD,
+ 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC,
+ // Bytes 4200 - 423f
+ 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCF,
+ 0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB,
+ 0x08, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCD,
+ 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x94, 0xCC,
+ 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC,
+ 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCF,
+ 0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB,
+ 0x08, 0xF0, 0x91, 0x82, 0x99, 0xF0, 0x91, 0x82,
+ // Bytes 4240 - 427f
+ 0xBA, 0x09, 0x08, 0xF0, 0x91, 0x82, 0x9B, 0xF0,
+ 0x91, 0x82, 0xBA, 0x09, 0x08, 0xF0, 0x91, 0x82,
+ 0xA5, 0xF0, 0x91, 0x82, 0xBA, 0x09, 0x42, 0xC2,
+ 0xB4, 0x01, 0x43, 0x20, 0xCC, 0x81, 0xC9, 0x43,
+ 0x20, 0xCC, 0x83, 0xC9, 0x43, 0x20, 0xCC, 0x84,
+ 0xC9, 0x43, 0x20, 0xCC, 0x85, 0xC9, 0x43, 0x20,
+ 0xCC, 0x86, 0xC9, 0x43, 0x20, 0xCC, 0x87, 0xC9,
+ 0x43, 0x20, 0xCC, 0x88, 0xC9, 0x43, 0x20, 0xCC,
+ // Bytes 4280 - 42bf
+ 0x8A, 0xC9, 0x43, 0x20, 0xCC, 0x8B, 0xC9, 0x43,
+ 0x20, 0xCC, 0x93, 0xC9, 0x43, 0x20, 0xCC, 0x94,
+ 0xC9, 0x43, 0x20, 0xCC, 0xA7, 0xA5, 0x43, 0x20,
+ 0xCC, 0xA8, 0xA5, 0x43, 0x20, 0xCC, 0xB3, 0xB5,
+ 0x43, 0x20, 0xCD, 0x82, 0xC9, 0x43, 0x20, 0xCD,
+ 0x85, 0xD9, 0x43, 0x20, 0xD9, 0x8B, 0x59, 0x43,
+ 0x20, 0xD9, 0x8C, 0x5D, 0x43, 0x20, 0xD9, 0x8D,
+ 0x61, 0x43, 0x20, 0xD9, 0x8E, 0x65, 0x43, 0x20,
+ // Bytes 42c0 - 42ff
+ 0xD9, 0x8F, 0x69, 0x43, 0x20, 0xD9, 0x90, 0x6D,
+ 0x43, 0x20, 0xD9, 0x91, 0x71, 0x43, 0x20, 0xD9,
+ 0x92, 0x75, 0x43, 0x41, 0xCC, 0x8A, 0xC9, 0x43,
+ 0x73, 0xCC, 0x87, 0xC9, 0x44, 0x20, 0xE3, 0x82,
+ 0x99, 0x0D, 0x44, 0x20, 0xE3, 0x82, 0x9A, 0x0D,
+ 0x44, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x44, 0xCE,
+ 0x91, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0x95, 0xCC,
+ 0x81, 0xC9, 0x44, 0xCE, 0x97, 0xCC, 0x81, 0xC9,
+ // Bytes 4300 - 433f
+ 0x44, 0xCE, 0x99, 0xCC, 0x81, 0xC9, 0x44, 0xCE,
+ 0x9F, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC,
+ 0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC, 0x88, 0xC9,
+ 0x44, 0xCE, 0xA9, 0xCC, 0x81, 0xC9, 0x44, 0xCE,
+ 0xB1, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xB5, 0xCC,
+ 0x81, 0xC9, 0x44, 0xCE, 0xB7, 0xCC, 0x81, 0xC9,
+ 0x44, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x44, 0xCE,
+ 0xBF, 0xCC, 0x81, 0xC9, 0x44, 0xCF, 0x85, 0xCC,
+ // Bytes 4340 - 437f
+ 0x81, 0xC9, 0x44, 0xCF, 0x89, 0xCC, 0x81, 0xC9,
+ 0x44, 0xD7, 0x90, 0xD6, 0xB7, 0x31, 0x44, 0xD7,
+ 0x90, 0xD6, 0xB8, 0x35, 0x44, 0xD7, 0x90, 0xD6,
+ 0xBC, 0x41, 0x44, 0xD7, 0x91, 0xD6, 0xBC, 0x41,
+ 0x44, 0xD7, 0x91, 0xD6, 0xBF, 0x49, 0x44, 0xD7,
+ 0x92, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x93, 0xD6,
+ 0xBC, 0x41, 0x44, 0xD7, 0x94, 0xD6, 0xBC, 0x41,
+ 0x44, 0xD7, 0x95, 0xD6, 0xB9, 0x39, 0x44, 0xD7,
+ // Bytes 4380 - 43bf
+ 0x95, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x96, 0xD6,
+ 0xBC, 0x41, 0x44, 0xD7, 0x98, 0xD6, 0xBC, 0x41,
+ 0x44, 0xD7, 0x99, 0xD6, 0xB4, 0x25, 0x44, 0xD7,
+ 0x99, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9A, 0xD6,
+ 0xBC, 0x41, 0x44, 0xD7, 0x9B, 0xD6, 0xBC, 0x41,
+ 0x44, 0xD7, 0x9B, 0xD6, 0xBF, 0x49, 0x44, 0xD7,
+ 0x9C, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9E, 0xD6,
+ 0xBC, 0x41, 0x44, 0xD7, 0xA0, 0xD6, 0xBC, 0x41,
+ // Bytes 43c0 - 43ff
+ 0x44, 0xD7, 0xA1, 0xD6, 0xBC, 0x41, 0x44, 0xD7,
+ 0xA3, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6,
+ 0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6, 0xBF, 0x49,
+ 0x44, 0xD7, 0xA6, 0xD6, 0xBC, 0x41, 0x44, 0xD7,
+ 0xA7, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA8, 0xD6,
+ 0xBC, 0x41, 0x44, 0xD7, 0xA9, 0xD6, 0xBC, 0x41,
+ 0x44, 0xD7, 0xA9, 0xD7, 0x81, 0x4D, 0x44, 0xD7,
+ 0xA9, 0xD7, 0x82, 0x51, 0x44, 0xD7, 0xAA, 0xD6,
+ // Bytes 4400 - 443f
+ 0xBC, 0x41, 0x44, 0xD7, 0xB2, 0xD6, 0xB7, 0x31,
+ 0x44, 0xD8, 0xA7, 0xD9, 0x8B, 0x59, 0x44, 0xD8,
+ 0xA7, 0xD9, 0x93, 0xC9, 0x44, 0xD8, 0xA7, 0xD9,
+ 0x94, 0xC9, 0x44, 0xD8, 0xA7, 0xD9, 0x95, 0xB5,
+ 0x44, 0xD8, 0xB0, 0xD9, 0xB0, 0x79, 0x44, 0xD8,
+ 0xB1, 0xD9, 0xB0, 0x79, 0x44, 0xD9, 0x80, 0xD9,
+ 0x8B, 0x59, 0x44, 0xD9, 0x80, 0xD9, 0x8E, 0x65,
+ 0x44, 0xD9, 0x80, 0xD9, 0x8F, 0x69, 0x44, 0xD9,
+ // Bytes 4440 - 447f
+ 0x80, 0xD9, 0x90, 0x6D, 0x44, 0xD9, 0x80, 0xD9,
+ 0x91, 0x71, 0x44, 0xD9, 0x80, 0xD9, 0x92, 0x75,
+ 0x44, 0xD9, 0x87, 0xD9, 0xB0, 0x79, 0x44, 0xD9,
+ 0x88, 0xD9, 0x94, 0xC9, 0x44, 0xD9, 0x89, 0xD9,
+ 0xB0, 0x79, 0x44, 0xD9, 0x8A, 0xD9, 0x94, 0xC9,
+ 0x44, 0xDB, 0x92, 0xD9, 0x94, 0xC9, 0x44, 0xDB,
+ 0x95, 0xD9, 0x94, 0xC9, 0x45, 0x20, 0xCC, 0x88,
+ 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCC,
+ // Bytes 4480 - 44bf
+ 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCD, 0x82,
+ 0xCA, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x80, 0xCA,
+ 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x45,
+ 0x20, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x45, 0x20,
+ 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC,
+ 0x94, 0xCC, 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x94,
+ 0xCD, 0x82, 0xCA, 0x45, 0x20, 0xD9, 0x8C, 0xD9,
+ 0x91, 0x72, 0x45, 0x20, 0xD9, 0x8D, 0xD9, 0x91,
+ // Bytes 44c0 - 44ff
+ 0x72, 0x45, 0x20, 0xD9, 0x8E, 0xD9, 0x91, 0x72,
+ 0x45, 0x20, 0xD9, 0x8F, 0xD9, 0x91, 0x72, 0x45,
+ 0x20, 0xD9, 0x90, 0xD9, 0x91, 0x72, 0x45, 0x20,
+ 0xD9, 0x91, 0xD9, 0xB0, 0x7A, 0x45, 0xE2, 0xAB,
+ 0x9D, 0xCC, 0xB8, 0x05, 0x46, 0xCE, 0xB9, 0xCC,
+ 0x88, 0xCC, 0x81, 0xCA, 0x46, 0xCF, 0x85, 0xCC,
+ 0x88, 0xCC, 0x81, 0xCA, 0x46, 0xD7, 0xA9, 0xD6,
+ 0xBC, 0xD7, 0x81, 0x4E, 0x46, 0xD7, 0xA9, 0xD6,
+ // Bytes 4500 - 453f
+ 0xBC, 0xD7, 0x82, 0x52, 0x46, 0xD9, 0x80, 0xD9,
+ 0x8E, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9,
+ 0x8F, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9,
+ 0x90, 0xD9, 0x91, 0x72, 0x46, 0xE0, 0xA4, 0x95,
+ 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x96,
+ 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x97,
+ 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x9C,
+ 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA1,
+ // Bytes 4540 - 457f
+ 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA2,
+ 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAB,
+ 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAF,
+ 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA1,
+ 0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA2,
+ 0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xAF,
+ 0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x96,
+ 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x97,
+ // Bytes 4580 - 45bf
+ 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x9C,
+ 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xAB,
+ 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB2,
+ 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB8,
+ 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA1,
+ 0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA2,
+ 0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xBE, 0xB2,
+ 0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE0, 0xBE, 0xB3,
+ // Bytes 45c0 - 45ff
+ 0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE3, 0x83, 0x86,
+ 0xE3, 0x82, 0x99, 0x0D, 0x48, 0xF0, 0x9D, 0x85,
+ 0x97, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, 0x48, 0xF0,
+ 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xAD,
+ 0x48, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85,
+ 0xA5, 0xAD, 0x48, 0xF0, 0x9D, 0x86, 0xBA, 0xF0,
+ 0x9D, 0x85, 0xA5, 0xAD, 0x49, 0xE0, 0xBE, 0xB2,
+ 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x49,
+ // Bytes 4600 - 463f
+ 0xE0, 0xBE, 0xB3, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE,
+ 0x80, 0x9E, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0,
+ 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE,
+ 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85,
+ 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0,
+ 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0,
+ 0x9D, 0x85, 0xB0, 0xAE, 0x4C, 0xF0, 0x9D, 0x85,
+ 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85,
+ // Bytes 4640 - 467f
+ 0xB1, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0,
+ 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xB2, 0xAE,
+ 0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85,
+ 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE, 0x4C, 0xF0,
+ 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5, 0xF0,
+ 0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0, 0x9D, 0x86,
+ 0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85,
+ 0xAE, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xBA, 0xF0,
+ // Bytes 4680 - 46bf
+ 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE,
+ 0x83, 0x41, 0xCC, 0x82, 0xC9, 0x83, 0x41, 0xCC,
+ 0x86, 0xC9, 0x83, 0x41, 0xCC, 0x87, 0xC9, 0x83,
+ 0x41, 0xCC, 0x88, 0xC9, 0x83, 0x41, 0xCC, 0x8A,
+ 0xC9, 0x83, 0x41, 0xCC, 0xA3, 0xB5, 0x83, 0x43,
+ 0xCC, 0xA7, 0xA5, 0x83, 0x45, 0xCC, 0x82, 0xC9,
+ 0x83, 0x45, 0xCC, 0x84, 0xC9, 0x83, 0x45, 0xCC,
+ 0xA3, 0xB5, 0x83, 0x45, 0xCC, 0xA7, 0xA5, 0x83,
+ // Bytes 46c0 - 46ff
+ 0x49, 0xCC, 0x88, 0xC9, 0x83, 0x4C, 0xCC, 0xA3,
+ 0xB5, 0x83, 0x4F, 0xCC, 0x82, 0xC9, 0x83, 0x4F,
+ 0xCC, 0x83, 0xC9, 0x83, 0x4F, 0xCC, 0x84, 0xC9,
+ 0x83, 0x4F, 0xCC, 0x87, 0xC9, 0x83, 0x4F, 0xCC,
+ 0x88, 0xC9, 0x83, 0x4F, 0xCC, 0x9B, 0xAD, 0x83,
+ 0x4F, 0xCC, 0xA3, 0xB5, 0x83, 0x4F, 0xCC, 0xA8,
+ 0xA5, 0x83, 0x52, 0xCC, 0xA3, 0xB5, 0x83, 0x53,
+ 0xCC, 0x81, 0xC9, 0x83, 0x53, 0xCC, 0x8C, 0xC9,
+ // Bytes 4700 - 473f
+ 0x83, 0x53, 0xCC, 0xA3, 0xB5, 0x83, 0x55, 0xCC,
+ 0x83, 0xC9, 0x83, 0x55, 0xCC, 0x84, 0xC9, 0x83,
+ 0x55, 0xCC, 0x88, 0xC9, 0x83, 0x55, 0xCC, 0x9B,
+ 0xAD, 0x83, 0x61, 0xCC, 0x82, 0xC9, 0x83, 0x61,
+ 0xCC, 0x86, 0xC9, 0x83, 0x61, 0xCC, 0x87, 0xC9,
+ 0x83, 0x61, 0xCC, 0x88, 0xC9, 0x83, 0x61, 0xCC,
+ 0x8A, 0xC9, 0x83, 0x61, 0xCC, 0xA3, 0xB5, 0x83,
+ 0x63, 0xCC, 0xA7, 0xA5, 0x83, 0x65, 0xCC, 0x82,
+ // Bytes 4740 - 477f
+ 0xC9, 0x83, 0x65, 0xCC, 0x84, 0xC9, 0x83, 0x65,
+ 0xCC, 0xA3, 0xB5, 0x83, 0x65, 0xCC, 0xA7, 0xA5,
+ 0x83, 0x69, 0xCC, 0x88, 0xC9, 0x83, 0x6C, 0xCC,
+ 0xA3, 0xB5, 0x83, 0x6F, 0xCC, 0x82, 0xC9, 0x83,
+ 0x6F, 0xCC, 0x83, 0xC9, 0x83, 0x6F, 0xCC, 0x84,
+ 0xC9, 0x83, 0x6F, 0xCC, 0x87, 0xC9, 0x83, 0x6F,
+ 0xCC, 0x88, 0xC9, 0x83, 0x6F, 0xCC, 0x9B, 0xAD,
+ 0x83, 0x6F, 0xCC, 0xA3, 0xB5, 0x83, 0x6F, 0xCC,
+ // Bytes 4780 - 47bf
+ 0xA8, 0xA5, 0x83, 0x72, 0xCC, 0xA3, 0xB5, 0x83,
+ 0x73, 0xCC, 0x81, 0xC9, 0x83, 0x73, 0xCC, 0x8C,
+ 0xC9, 0x83, 0x73, 0xCC, 0xA3, 0xB5, 0x83, 0x75,
+ 0xCC, 0x83, 0xC9, 0x83, 0x75, 0xCC, 0x84, 0xC9,
+ 0x83, 0x75, 0xCC, 0x88, 0xC9, 0x83, 0x75, 0xCC,
+ 0x9B, 0xAD, 0x84, 0xCE, 0x91, 0xCC, 0x93, 0xC9,
+ 0x84, 0xCE, 0x91, 0xCC, 0x94, 0xC9, 0x84, 0xCE,
+ 0x95, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x95, 0xCC,
+ // Bytes 47c0 - 47ff
+ 0x94, 0xC9, 0x84, 0xCE, 0x97, 0xCC, 0x93, 0xC9,
+ 0x84, 0xCE, 0x97, 0xCC, 0x94, 0xC9, 0x84, 0xCE,
+ 0x99, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x99, 0xCC,
+ 0x94, 0xC9, 0x84, 0xCE, 0x9F, 0xCC, 0x93, 0xC9,
+ 0x84, 0xCE, 0x9F, 0xCC, 0x94, 0xC9, 0x84, 0xCE,
+ 0xA5, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xA9, 0xCC,
+ 0x93, 0xC9, 0x84, 0xCE, 0xA9, 0xCC, 0x94, 0xC9,
+ 0x84, 0xCE, 0xB1, 0xCC, 0x80, 0xC9, 0x84, 0xCE,
+ // Bytes 4800 - 483f
+ 0xB1, 0xCC, 0x81, 0xC9, 0x84, 0xCE, 0xB1, 0xCC,
+ 0x93, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, 0x94, 0xC9,
+ 0x84, 0xCE, 0xB1, 0xCD, 0x82, 0xC9, 0x84, 0xCE,
+ 0xB5, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB5, 0xCC,
+ 0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, 0x80, 0xC9,
+ 0x84, 0xCE, 0xB7, 0xCC, 0x81, 0xC9, 0x84, 0xCE,
+ 0xB7, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB7, 0xCC,
+ 0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCD, 0x82, 0xC9,
+ // Bytes 4840 - 487f
+ 0x84, 0xCE, 0xB9, 0xCC, 0x88, 0xC9, 0x84, 0xCE,
+ 0xB9, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB9, 0xCC,
+ 0x94, 0xC9, 0x84, 0xCE, 0xBF, 0xCC, 0x93, 0xC9,
+ 0x84, 0xCE, 0xBF, 0xCC, 0x94, 0xC9, 0x84, 0xCF,
+ 0x85, 0xCC, 0x88, 0xC9, 0x84, 0xCF, 0x85, 0xCC,
+ 0x93, 0xC9, 0x84, 0xCF, 0x85, 0xCC, 0x94, 0xC9,
+ 0x84, 0xCF, 0x89, 0xCC, 0x80, 0xC9, 0x84, 0xCF,
+ 0x89, 0xCC, 0x81, 0xC9, 0x84, 0xCF, 0x89, 0xCC,
+ // Bytes 4880 - 48bf
+ 0x93, 0xC9, 0x84, 0xCF, 0x89, 0xCC, 0x94, 0xC9,
+ 0x84, 0xCF, 0x89, 0xCD, 0x82, 0xC9, 0x86, 0xCE,
+ 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+ 0x91, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+ 0x91, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+ 0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+ 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+ 0x91, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+ // Bytes 48c0 - 48ff
+ 0x97, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+ 0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+ 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+ 0x97, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+ 0x97, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+ 0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+ 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+ 0xA9, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+ // Bytes 4900 - 493f
+ 0xA9, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+ 0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+ 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+ 0xA9, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+ 0xB1, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+ 0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+ 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+ 0xB1, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+ // Bytes 4940 - 497f
+ 0xB1, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+ 0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+ 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+ 0xB7, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+ 0xB7, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,
+ 0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,
+ 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,
+ 0xB7, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCF,
+ // Bytes 4980 - 49bf
+ 0x89, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCF,
+ 0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCF,
+ 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCF,
+ 0x89, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCF,
+ 0x89, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCF,
+ 0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x42, 0xCC,
+ 0x80, 0xC9, 0x32, 0x42, 0xCC, 0x81, 0xC9, 0x32,
+ 0x42, 0xCC, 0x93, 0xC9, 0x32, 0x43, 0xE1, 0x85,
+ // Bytes 49c0 - 49ff
+ 0xA1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA2, 0x01,
+ 0x00, 0x43, 0xE1, 0x85, 0xA3, 0x01, 0x00, 0x43,
+ 0xE1, 0x85, 0xA4, 0x01, 0x00, 0x43, 0xE1, 0x85,
+ 0xA5, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA6, 0x01,
+ 0x00, 0x43, 0xE1, 0x85, 0xA7, 0x01, 0x00, 0x43,
+ 0xE1, 0x85, 0xA8, 0x01, 0x00, 0x43, 0xE1, 0x85,
+ 0xA9, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAA, 0x01,
+ 0x00, 0x43, 0xE1, 0x85, 0xAB, 0x01, 0x00, 0x43,
+ // Bytes 4a00 - 4a3f
+ 0xE1, 0x85, 0xAC, 0x01, 0x00, 0x43, 0xE1, 0x85,
+ 0xAD, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAE, 0x01,
+ 0x00, 0x43, 0xE1, 0x85, 0xAF, 0x01, 0x00, 0x43,
+ 0xE1, 0x85, 0xB0, 0x01, 0x00, 0x43, 0xE1, 0x85,
+ 0xB1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB2, 0x01,
+ 0x00, 0x43, 0xE1, 0x85, 0xB3, 0x01, 0x00, 0x43,
+ 0xE1, 0x85, 0xB4, 0x01, 0x00, 0x43, 0xE1, 0x85,
+ 0xB5, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAA, 0x01,
+ // Bytes 4a40 - 4a7f
+ 0x00, 0x43, 0xE1, 0x86, 0xAC, 0x01, 0x00, 0x43,
+ 0xE1, 0x86, 0xAD, 0x01, 0x00, 0x43, 0xE1, 0x86,
+ 0xB0, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB1, 0x01,
+ 0x00, 0x43, 0xE1, 0x86, 0xB2, 0x01, 0x00, 0x43,
+ 0xE1, 0x86, 0xB3, 0x01, 0x00, 0x43, 0xE1, 0x86,
+ 0xB4, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB5, 0x01,
+ 0x00, 0x44, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x32,
+ 0x43, 0xE3, 0x82, 0x99, 0x0D, 0x03, 0x43, 0xE3,
+ // Bytes 4a80 - 4abf
+ 0x82, 0x9A, 0x0D, 0x03, 0x46, 0xE0, 0xBD, 0xB1,
+ 0xE0, 0xBD, 0xB2, 0x9E, 0x26, 0x46, 0xE0, 0xBD,
+ 0xB1, 0xE0, 0xBD, 0xB4, 0xA2, 0x26, 0x46, 0xE0,
+ 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x26, 0x00,
+ 0x01,
+}
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *nfcTrie) lookup(s []byte) (v uint16, sz int) {
+ c0 := s[0]
+ switch {
+ case c0 < 0x80: // is ASCII
+ return nfcValues[c0], 1
+ case c0 < 0xC2:
+ return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+ case c0 < 0xE0: // 2-byte UTF-8
+ if len(s) < 2 {
+ return 0, 0
+ }
+ i := nfcIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c1), 2
+ case c0 < 0xF0: // 3-byte UTF-8
+ if len(s) < 3 {
+ return 0, 0
+ }
+ i := nfcIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = nfcIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c2), 3
+ case c0 < 0xF8: // 4-byte UTF-8
+ if len(s) < 4 {
+ return 0, 0
+ }
+ i := nfcIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = nfcIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ o = uint32(i)<<6 + uint32(c2)
+ i = nfcIndex[o]
+ c3 := s[3]
+ if c3 < 0x80 || 0xC0 <= c3 {
+ return 0, 3 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c3), 4
+ }
+ // Illegal rune
+ return 0, 1
+}
+
+// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *nfcTrie) lookupUnsafe(s []byte) uint16 {
+ c0 := s[0]
+ if c0 < 0x80 { // is ASCII
+ return nfcValues[c0]
+ }
+ i := nfcIndex[c0]
+ if c0 < 0xE0 { // 2-byte UTF-8
+ return t.lookupValue(uint32(i), s[1])
+ }
+ i = nfcIndex[uint32(i)<<6+uint32(s[1])]
+ if c0 < 0xF0 { // 3-byte UTF-8
+ return t.lookupValue(uint32(i), s[2])
+ }
+ i = nfcIndex[uint32(i)<<6+uint32(s[2])]
+ if c0 < 0xF8 { // 4-byte UTF-8
+ return t.lookupValue(uint32(i), s[3])
+ }
+ return 0
+}
+
+// lookupString returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *nfcTrie) lookupString(s string) (v uint16, sz int) {
+ c0 := s[0]
+ switch {
+ case c0 < 0x80: // is ASCII
+ return nfcValues[c0], 1
+ case c0 < 0xC2:
+ return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+ case c0 < 0xE0: // 2-byte UTF-8
+ if len(s) < 2 {
+ return 0, 0
+ }
+ i := nfcIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c1), 2
+ case c0 < 0xF0: // 3-byte UTF-8
+ if len(s) < 3 {
+ return 0, 0
+ }
+ i := nfcIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = nfcIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c2), 3
+ case c0 < 0xF8: // 4-byte UTF-8
+ if len(s) < 4 {
+ return 0, 0
+ }
+ i := nfcIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = nfcIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ o = uint32(i)<<6 + uint32(c2)
+ i = nfcIndex[o]
+ c3 := s[3]
+ if c3 < 0x80 || 0xC0 <= c3 {
+ return 0, 3 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c3), 4
+ }
+ // Illegal rune
+ return 0, 1
+}
+
+// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *nfcTrie) lookupStringUnsafe(s string) uint16 {
+ c0 := s[0]
+ if c0 < 0x80 { // is ASCII
+ return nfcValues[c0]
+ }
+ i := nfcIndex[c0]
+ if c0 < 0xE0 { // 2-byte UTF-8
+ return t.lookupValue(uint32(i), s[1])
+ }
+ i = nfcIndex[uint32(i)<<6+uint32(s[1])]
+ if c0 < 0xF0 { // 3-byte UTF-8
+ return t.lookupValue(uint32(i), s[2])
+ }
+ i = nfcIndex[uint32(i)<<6+uint32(s[2])]
+ if c0 < 0xF8 { // 4-byte UTF-8
+ return t.lookupValue(uint32(i), s[3])
+ }
+ return 0
+}
+
+// nfcTrie. Total size: 10332 bytes (10.09 KiB). Checksum: 51cc525b297fc970.
+type nfcTrie struct{}
+
+func newNfcTrie(i int) *nfcTrie {
+ return &nfcTrie{}
+}
+
+// lookupValue determines the type of block n and looks up the value for b.
+func (t *nfcTrie) lookupValue(n uint32, b byte) uint16 {
+ switch {
+ case n < 44:
+ return uint16(nfcValues[n<<6+uint32(b)])
+ default:
+ n -= 44
+ return uint16(nfcSparse.lookup(n, b))
+ }
+}
+
+// nfcValues: 46 blocks, 2944 entries, 5888 bytes
+// The third block is the zero block.
+var nfcValues = [2944]uint16{
+ // Block 0x0, offset 0x0
+ 0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000,
+ // Block 0x1, offset 0x40
+ 0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000,
+ 0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000,
+ 0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000,
+ 0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000,
+ 0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000,
+ 0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000,
+ 0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000,
+ 0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000,
+ 0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000,
+ 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000,
+ // Block 0x2, offset 0x80
+ // Block 0x3, offset 0xc0
+ 0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c,
+ 0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb,
+ 0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104,
+ 0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd,
+ 0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235,
+ 0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285,
+ 0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3,
+ 0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750,
+ 0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f,
+ 0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3,
+ 0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569,
+ // Block 0x4, offset 0x100
+ 0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8,
+ 0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6,
+ 0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5,
+ 0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302,
+ 0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339,
+ 0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352,
+ 0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e,
+ 0x12a: 0x3082, 0x12b: 0x3393, 0x12c: 0x3087, 0x12d: 0x3398, 0x12e: 0x30aa, 0x12f: 0x33b6,
+ 0x130: 0x308c, 0x134: 0x30b4, 0x135: 0x33c0,
+ 0x136: 0x30c8, 0x137: 0x33d9, 0x139: 0x30d2, 0x13a: 0x33e3, 0x13b: 0x30dc,
+ 0x13c: 0x33ed, 0x13d: 0x30d7, 0x13e: 0x33e8,
+ // Block 0x5, offset 0x140
+ 0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118,
+ 0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f,
+ 0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c,
+ 0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483,
+ 0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d,
+ 0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba,
+ 0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796,
+ 0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2,
+ 0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528,
+ 0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267,
+ 0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0xa000,
+ // Block 0x6, offset 0x180
+ 0x184: 0x8100, 0x185: 0x8100,
+ 0x186: 0x8100,
+ 0x18d: 0x2f88, 0x18e: 0x3294, 0x18f: 0x3096, 0x190: 0x33a2, 0x191: 0x3140,
+ 0x192: 0x3451, 0x193: 0x31d6, 0x194: 0x34ec, 0x195: 0x39cf, 0x196: 0x3b5e, 0x197: 0x39c8,
+ 0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50,
+ 0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5,
+ 0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf,
+ 0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd,
+ 0x1b0: 0x33c5, 0x1b4: 0x3028, 0x1b5: 0x3334,
+ 0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46,
+ 0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb,
+ // Block 0x7, offset 0x1c0
+ 0x1c0: 0x2f8d, 0x1c1: 0x3299, 0x1c2: 0x2f92, 0x1c3: 0x329e, 0x1c4: 0x300a, 0x1c5: 0x3316,
+ 0x1c6: 0x300f, 0x1c7: 0x331b, 0x1c8: 0x309b, 0x1c9: 0x33a7, 0x1ca: 0x30a0, 0x1cb: 0x33ac,
+ 0x1cc: 0x3145, 0x1cd: 0x3456, 0x1ce: 0x314a, 0x1cf: 0x345b, 0x1d0: 0x3168, 0x1d1: 0x3479,
+ 0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6,
+ 0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5,
+ 0x1de: 0x305a, 0x1df: 0x3366,
+ 0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b,
+ 0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769,
+ 0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f,
+ // Block 0x8, offset 0x200
+ 0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132,
+ 0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932,
+ 0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932,
+ 0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d,
+ 0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d,
+ 0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d,
+ 0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d,
+ 0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d,
+ 0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101,
+ 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d,
+ 0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132,
+ // Block 0x9, offset 0x240
+ 0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936,
+ 0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132,
+ 0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132,
+ 0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132,
+ 0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135,
+ 0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132,
+ 0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132,
+ 0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132,
+ 0x274: 0x0170,
+ 0x27a: 0x8100,
+ 0x27e: 0x0037,
+ // Block 0xa, offset 0x280
+ 0x284: 0x8100, 0x285: 0x35a1,
+ 0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625,
+ 0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000,
+ 0x295: 0xa000, 0x297: 0xa000,
+ 0x299: 0xa000,
+ 0x29f: 0xa000, 0x2a1: 0xa000,
+ 0x2a5: 0xa000, 0x2a9: 0xa000,
+ 0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9,
+ 0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000,
+ 0x2b7: 0xa000, 0x2b9: 0xa000,
+ 0x2bf: 0xa000,
+ // Block 0xb, offset 0x2c0
+ 0x2c0: 0x3721, 0x2c1: 0x372d, 0x2c3: 0x371b,
+ 0x2c6: 0xa000, 0x2c7: 0x3709,
+ 0x2cc: 0x375d, 0x2cd: 0x3745, 0x2ce: 0x376f, 0x2d0: 0xa000,
+ 0x2d3: 0xa000, 0x2d5: 0xa000, 0x2d6: 0xa000, 0x2d7: 0xa000,
+ 0x2d8: 0xa000, 0x2d9: 0x3751, 0x2da: 0xa000,
+ 0x2de: 0xa000, 0x2e3: 0xa000,
+ 0x2e7: 0xa000,
+ 0x2eb: 0xa000, 0x2ed: 0xa000,
+ 0x2f0: 0xa000, 0x2f3: 0xa000, 0x2f5: 0xa000,
+ 0x2f6: 0xa000, 0x2f7: 0xa000, 0x2f8: 0xa000, 0x2f9: 0x37d5, 0x2fa: 0xa000,
+ 0x2fe: 0xa000,
+ // Block 0xc, offset 0x300
+ 0x301: 0x3733, 0x302: 0x37b7,
+ 0x310: 0x370f, 0x311: 0x3793,
+ 0x312: 0x3715, 0x313: 0x3799, 0x316: 0x3727, 0x317: 0x37ab,
+ 0x318: 0xa000, 0x319: 0xa000, 0x31a: 0x3829, 0x31b: 0x382f, 0x31c: 0x3739, 0x31d: 0x37bd,
+ 0x31e: 0x373f, 0x31f: 0x37c3, 0x322: 0x374b, 0x323: 0x37cf,
+ 0x324: 0x3757, 0x325: 0x37db, 0x326: 0x3763, 0x327: 0x37e7, 0x328: 0xa000, 0x329: 0xa000,
+ 0x32a: 0x3835, 0x32b: 0x383b, 0x32c: 0x378d, 0x32d: 0x3811, 0x32e: 0x3769, 0x32f: 0x37ed,
+ 0x330: 0x3775, 0x331: 0x37f9, 0x332: 0x377b, 0x333: 0x37ff, 0x334: 0x3781, 0x335: 0x3805,
+ 0x338: 0x3787, 0x339: 0x380b,
+ // Block 0xd, offset 0x340
+ 0x351: 0x812d,
+ 0x352: 0x8132, 0x353: 0x8132, 0x354: 0x8132, 0x355: 0x8132, 0x356: 0x812d, 0x357: 0x8132,
+ 0x358: 0x8132, 0x359: 0x8132, 0x35a: 0x812e, 0x35b: 0x812d, 0x35c: 0x8132, 0x35d: 0x8132,
+ 0x35e: 0x8132, 0x35f: 0x8132, 0x360: 0x8132, 0x361: 0x8132, 0x362: 0x812d, 0x363: 0x812d,
+ 0x364: 0x812d, 0x365: 0x812d, 0x366: 0x812d, 0x367: 0x812d, 0x368: 0x8132, 0x369: 0x8132,
+ 0x36a: 0x812d, 0x36b: 0x8132, 0x36c: 0x8132, 0x36d: 0x812e, 0x36e: 0x8131, 0x36f: 0x8132,
+ 0x370: 0x8105, 0x371: 0x8106, 0x372: 0x8107, 0x373: 0x8108, 0x374: 0x8109, 0x375: 0x810a,
+ 0x376: 0x810b, 0x377: 0x810c, 0x378: 0x810d, 0x379: 0x810e, 0x37a: 0x810e, 0x37b: 0x810f,
+ 0x37c: 0x8110, 0x37d: 0x8111, 0x37f: 0x8112,
+ // Block 0xe, offset 0x380
+ 0x388: 0xa000, 0x38a: 0xa000, 0x38b: 0x8116,
+ 0x38c: 0x8117, 0x38d: 0x8118, 0x38e: 0x8119, 0x38f: 0x811a, 0x390: 0x811b, 0x391: 0x811c,
+ 0x392: 0x811d, 0x393: 0x9932, 0x394: 0x9932, 0x395: 0x992d, 0x396: 0x812d, 0x397: 0x8132,
+ 0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x8132, 0x39b: 0x8132, 0x39c: 0x812d, 0x39d: 0x8132,
+ 0x39e: 0x8132, 0x39f: 0x812d,
+ 0x3b0: 0x811e,
+ // Block 0xf, offset 0x3c0
+ 0x3c5: 0xa000,
+ 0x3c6: 0x2d26, 0x3c7: 0xa000, 0x3c8: 0x2d2e, 0x3c9: 0xa000, 0x3ca: 0x2d36, 0x3cb: 0xa000,
+ 0x3cc: 0x2d3e, 0x3cd: 0xa000, 0x3ce: 0x2d46, 0x3d1: 0xa000,
+ 0x3d2: 0x2d4e,
+ 0x3f4: 0x8102, 0x3f5: 0x9900,
+ 0x3fa: 0xa000, 0x3fb: 0x2d56,
+ 0x3fc: 0xa000, 0x3fd: 0x2d5e, 0x3fe: 0xa000, 0x3ff: 0xa000,
+ // Block 0x10, offset 0x400
+ 0x400: 0x2f97, 0x401: 0x32a3, 0x402: 0x2fa1, 0x403: 0x32ad, 0x404: 0x2fa6, 0x405: 0x32b2,
+ 0x406: 0x2fab, 0x407: 0x32b7, 0x408: 0x38cc, 0x409: 0x3a5b, 0x40a: 0x2fc4, 0x40b: 0x32d0,
+ 0x40c: 0x2fce, 0x40d: 0x32da, 0x40e: 0x2fdd, 0x40f: 0x32e9, 0x410: 0x2fd3, 0x411: 0x32df,
+ 0x412: 0x2fd8, 0x413: 0x32e4, 0x414: 0x38ef, 0x415: 0x3a7e, 0x416: 0x38f6, 0x417: 0x3a85,
+ 0x418: 0x3019, 0x419: 0x3325, 0x41a: 0x301e, 0x41b: 0x332a, 0x41c: 0x3904, 0x41d: 0x3a93,
+ 0x41e: 0x3023, 0x41f: 0x332f, 0x420: 0x3032, 0x421: 0x333e, 0x422: 0x3050, 0x423: 0x335c,
+ 0x424: 0x305f, 0x425: 0x336b, 0x426: 0x3055, 0x427: 0x3361, 0x428: 0x3064, 0x429: 0x3370,
+ 0x42a: 0x3069, 0x42b: 0x3375, 0x42c: 0x30af, 0x42d: 0x33bb, 0x42e: 0x390b, 0x42f: 0x3a9a,
+ 0x430: 0x30b9, 0x431: 0x33ca, 0x432: 0x30c3, 0x433: 0x33d4, 0x434: 0x30cd, 0x435: 0x33de,
+ 0x436: 0x46c4, 0x437: 0x4755, 0x438: 0x3912, 0x439: 0x3aa1, 0x43a: 0x30e6, 0x43b: 0x33f7,
+ 0x43c: 0x30e1, 0x43d: 0x33f2, 0x43e: 0x30eb, 0x43f: 0x33fc,
+ // Block 0x11, offset 0x440
+ 0x440: 0x30f0, 0x441: 0x3401, 0x442: 0x30f5, 0x443: 0x3406, 0x444: 0x3109, 0x445: 0x341a,
+ 0x446: 0x3113, 0x447: 0x3424, 0x448: 0x3122, 0x449: 0x3433, 0x44a: 0x311d, 0x44b: 0x342e,
+ 0x44c: 0x3935, 0x44d: 0x3ac4, 0x44e: 0x3943, 0x44f: 0x3ad2, 0x450: 0x394a, 0x451: 0x3ad9,
+ 0x452: 0x3951, 0x453: 0x3ae0, 0x454: 0x314f, 0x455: 0x3460, 0x456: 0x3154, 0x457: 0x3465,
+ 0x458: 0x315e, 0x459: 0x346f, 0x45a: 0x46f1, 0x45b: 0x4782, 0x45c: 0x3997, 0x45d: 0x3b26,
+ 0x45e: 0x3177, 0x45f: 0x3488, 0x460: 0x3181, 0x461: 0x3492, 0x462: 0x4700, 0x463: 0x4791,
+ 0x464: 0x399e, 0x465: 0x3b2d, 0x466: 0x39a5, 0x467: 0x3b34, 0x468: 0x39ac, 0x469: 0x3b3b,
+ 0x46a: 0x3190, 0x46b: 0x34a1, 0x46c: 0x319a, 0x46d: 0x34b0, 0x46e: 0x31ae, 0x46f: 0x34c4,
+ 0x470: 0x31a9, 0x471: 0x34bf, 0x472: 0x31ea, 0x473: 0x3500, 0x474: 0x31f9, 0x475: 0x350f,
+ 0x476: 0x31f4, 0x477: 0x350a, 0x478: 0x39b3, 0x479: 0x3b42, 0x47a: 0x39ba, 0x47b: 0x3b49,
+ 0x47c: 0x31fe, 0x47d: 0x3514, 0x47e: 0x3203, 0x47f: 0x3519,
+ // Block 0x12, offset 0x480
+ 0x480: 0x3208, 0x481: 0x351e, 0x482: 0x320d, 0x483: 0x3523, 0x484: 0x321c, 0x485: 0x3532,
+ 0x486: 0x3217, 0x487: 0x352d, 0x488: 0x3221, 0x489: 0x353c, 0x48a: 0x3226, 0x48b: 0x3541,
+ 0x48c: 0x322b, 0x48d: 0x3546, 0x48e: 0x3249, 0x48f: 0x3564, 0x490: 0x3262, 0x491: 0x3582,
+ 0x492: 0x3271, 0x493: 0x3591, 0x494: 0x3276, 0x495: 0x3596, 0x496: 0x337a, 0x497: 0x34a6,
+ 0x498: 0x3537, 0x499: 0x3573, 0x49b: 0x35d1,
+ 0x4a0: 0x46a1, 0x4a1: 0x4732, 0x4a2: 0x2f83, 0x4a3: 0x328f,
+ 0x4a4: 0x3878, 0x4a5: 0x3a07, 0x4a6: 0x3871, 0x4a7: 0x3a00, 0x4a8: 0x3886, 0x4a9: 0x3a15,
+ 0x4aa: 0x387f, 0x4ab: 0x3a0e, 0x4ac: 0x38be, 0x4ad: 0x3a4d, 0x4ae: 0x3894, 0x4af: 0x3a23,
+ 0x4b0: 0x388d, 0x4b1: 0x3a1c, 0x4b2: 0x38a2, 0x4b3: 0x3a31, 0x4b4: 0x389b, 0x4b5: 0x3a2a,
+ 0x4b6: 0x38c5, 0x4b7: 0x3a54, 0x4b8: 0x46b5, 0x4b9: 0x4746, 0x4ba: 0x3000, 0x4bb: 0x330c,
+ 0x4bc: 0x2fec, 0x4bd: 0x32f8, 0x4be: 0x38da, 0x4bf: 0x3a69,
+ // Block 0x13, offset 0x4c0
+ 0x4c0: 0x38d3, 0x4c1: 0x3a62, 0x4c2: 0x38e8, 0x4c3: 0x3a77, 0x4c4: 0x38e1, 0x4c5: 0x3a70,
+ 0x4c6: 0x38fd, 0x4c7: 0x3a8c, 0x4c8: 0x3091, 0x4c9: 0x339d, 0x4ca: 0x30a5, 0x4cb: 0x33b1,
+ 0x4cc: 0x46e7, 0x4cd: 0x4778, 0x4ce: 0x3136, 0x4cf: 0x3447, 0x4d0: 0x3920, 0x4d1: 0x3aaf,
+ 0x4d2: 0x3919, 0x4d3: 0x3aa8, 0x4d4: 0x392e, 0x4d5: 0x3abd, 0x4d6: 0x3927, 0x4d7: 0x3ab6,
+ 0x4d8: 0x3989, 0x4d9: 0x3b18, 0x4da: 0x396d, 0x4db: 0x3afc, 0x4dc: 0x3966, 0x4dd: 0x3af5,
+ 0x4de: 0x397b, 0x4df: 0x3b0a, 0x4e0: 0x3974, 0x4e1: 0x3b03, 0x4e2: 0x3982, 0x4e3: 0x3b11,
+ 0x4e4: 0x31e5, 0x4e5: 0x34fb, 0x4e6: 0x31c7, 0x4e7: 0x34dd, 0x4e8: 0x39e4, 0x4e9: 0x3b73,
+ 0x4ea: 0x39dd, 0x4eb: 0x3b6c, 0x4ec: 0x39f2, 0x4ed: 0x3b81, 0x4ee: 0x39eb, 0x4ef: 0x3b7a,
+ 0x4f0: 0x39f9, 0x4f1: 0x3b88, 0x4f2: 0x3230, 0x4f3: 0x354b, 0x4f4: 0x3258, 0x4f5: 0x3578,
+ 0x4f6: 0x3253, 0x4f7: 0x356e, 0x4f8: 0x323f, 0x4f9: 0x355a,
+ // Block 0x14, offset 0x500
+ 0x500: 0x4804, 0x501: 0x480a, 0x502: 0x491e, 0x503: 0x4936, 0x504: 0x4926, 0x505: 0x493e,
+ 0x506: 0x492e, 0x507: 0x4946, 0x508: 0x47aa, 0x509: 0x47b0, 0x50a: 0x488e, 0x50b: 0x48a6,
+ 0x50c: 0x4896, 0x50d: 0x48ae, 0x50e: 0x489e, 0x50f: 0x48b6, 0x510: 0x4816, 0x511: 0x481c,
+ 0x512: 0x3db8, 0x513: 0x3dc8, 0x514: 0x3dc0, 0x515: 0x3dd0,
+ 0x518: 0x47b6, 0x519: 0x47bc, 0x51a: 0x3ce8, 0x51b: 0x3cf8, 0x51c: 0x3cf0, 0x51d: 0x3d00,
+ 0x520: 0x482e, 0x521: 0x4834, 0x522: 0x494e, 0x523: 0x4966,
+ 0x524: 0x4956, 0x525: 0x496e, 0x526: 0x495e, 0x527: 0x4976, 0x528: 0x47c2, 0x529: 0x47c8,
+ 0x52a: 0x48be, 0x52b: 0x48d6, 0x52c: 0x48c6, 0x52d: 0x48de, 0x52e: 0x48ce, 0x52f: 0x48e6,
+ 0x530: 0x4846, 0x531: 0x484c, 0x532: 0x3e18, 0x533: 0x3e30, 0x534: 0x3e20, 0x535: 0x3e38,
+ 0x536: 0x3e28, 0x537: 0x3e40, 0x538: 0x47ce, 0x539: 0x47d4, 0x53a: 0x3d18, 0x53b: 0x3d30,
+ 0x53c: 0x3d20, 0x53d: 0x3d38, 0x53e: 0x3d28, 0x53f: 0x3d40,
+ // Block 0x15, offset 0x540
+ 0x540: 0x4852, 0x541: 0x4858, 0x542: 0x3e48, 0x543: 0x3e58, 0x544: 0x3e50, 0x545: 0x3e60,
+ 0x548: 0x47da, 0x549: 0x47e0, 0x54a: 0x3d48, 0x54b: 0x3d58,
+ 0x54c: 0x3d50, 0x54d: 0x3d60, 0x550: 0x4864, 0x551: 0x486a,
+ 0x552: 0x3e80, 0x553: 0x3e98, 0x554: 0x3e88, 0x555: 0x3ea0, 0x556: 0x3e90, 0x557: 0x3ea8,
+ 0x559: 0x47e6, 0x55b: 0x3d68, 0x55d: 0x3d70,
+ 0x55f: 0x3d78, 0x560: 0x487c, 0x561: 0x4882, 0x562: 0x497e, 0x563: 0x4996,
+ 0x564: 0x4986, 0x565: 0x499e, 0x566: 0x498e, 0x567: 0x49a6, 0x568: 0x47ec, 0x569: 0x47f2,
+ 0x56a: 0x48ee, 0x56b: 0x4906, 0x56c: 0x48f6, 0x56d: 0x490e, 0x56e: 0x48fe, 0x56f: 0x4916,
+ 0x570: 0x47f8, 0x571: 0x431e, 0x572: 0x3691, 0x573: 0x4324, 0x574: 0x4822, 0x575: 0x432a,
+ 0x576: 0x36a3, 0x577: 0x4330, 0x578: 0x36c1, 0x579: 0x4336, 0x57a: 0x36d9, 0x57b: 0x433c,
+ 0x57c: 0x4870, 0x57d: 0x4342,
+ // Block 0x16, offset 0x580
+ 0x580: 0x3da0, 0x581: 0x3da8, 0x582: 0x4184, 0x583: 0x41a2, 0x584: 0x418e, 0x585: 0x41ac,
+ 0x586: 0x4198, 0x587: 0x41b6, 0x588: 0x3cd8, 0x589: 0x3ce0, 0x58a: 0x40d0, 0x58b: 0x40ee,
+ 0x58c: 0x40da, 0x58d: 0x40f8, 0x58e: 0x40e4, 0x58f: 0x4102, 0x590: 0x3de8, 0x591: 0x3df0,
+ 0x592: 0x41c0, 0x593: 0x41de, 0x594: 0x41ca, 0x595: 0x41e8, 0x596: 0x41d4, 0x597: 0x41f2,
+ 0x598: 0x3d08, 0x599: 0x3d10, 0x59a: 0x410c, 0x59b: 0x412a, 0x59c: 0x4116, 0x59d: 0x4134,
+ 0x59e: 0x4120, 0x59f: 0x413e, 0x5a0: 0x3ec0, 0x5a1: 0x3ec8, 0x5a2: 0x41fc, 0x5a3: 0x421a,
+ 0x5a4: 0x4206, 0x5a5: 0x4224, 0x5a6: 0x4210, 0x5a7: 0x422e, 0x5a8: 0x3d80, 0x5a9: 0x3d88,
+ 0x5aa: 0x4148, 0x5ab: 0x4166, 0x5ac: 0x4152, 0x5ad: 0x4170, 0x5ae: 0x415c, 0x5af: 0x417a,
+ 0x5b0: 0x3685, 0x5b1: 0x367f, 0x5b2: 0x3d90, 0x5b3: 0x368b, 0x5b4: 0x3d98,
+ 0x5b6: 0x4810, 0x5b7: 0x3db0, 0x5b8: 0x35f5, 0x5b9: 0x35ef, 0x5ba: 0x35e3, 0x5bb: 0x42ee,
+ 0x5bc: 0x35fb, 0x5bd: 0x8100, 0x5be: 0x01d3, 0x5bf: 0xa100,
+ // Block 0x17, offset 0x5c0
+ 0x5c0: 0x8100, 0x5c1: 0x35a7, 0x5c2: 0x3dd8, 0x5c3: 0x369d, 0x5c4: 0x3de0,
+ 0x5c6: 0x483a, 0x5c7: 0x3df8, 0x5c8: 0x3601, 0x5c9: 0x42f4, 0x5ca: 0x360d, 0x5cb: 0x42fa,
+ 0x5cc: 0x3619, 0x5cd: 0x3b8f, 0x5ce: 0x3b96, 0x5cf: 0x3b9d, 0x5d0: 0x36b5, 0x5d1: 0x36af,
+ 0x5d2: 0x3e00, 0x5d3: 0x44e4, 0x5d6: 0x36bb, 0x5d7: 0x3e10,
+ 0x5d8: 0x3631, 0x5d9: 0x362b, 0x5da: 0x361f, 0x5db: 0x4300, 0x5dd: 0x3ba4,
+ 0x5de: 0x3bab, 0x5df: 0x3bb2, 0x5e0: 0x36eb, 0x5e1: 0x36e5, 0x5e2: 0x3e68, 0x5e3: 0x44ec,
+ 0x5e4: 0x36cd, 0x5e5: 0x36d3, 0x5e6: 0x36f1, 0x5e7: 0x3e78, 0x5e8: 0x3661, 0x5e9: 0x365b,
+ 0x5ea: 0x364f, 0x5eb: 0x430c, 0x5ec: 0x3649, 0x5ed: 0x359b, 0x5ee: 0x42e8, 0x5ef: 0x0081,
+ 0x5f2: 0x3eb0, 0x5f3: 0x36f7, 0x5f4: 0x3eb8,
+ 0x5f6: 0x4888, 0x5f7: 0x3ed0, 0x5f8: 0x363d, 0x5f9: 0x4306, 0x5fa: 0x366d, 0x5fb: 0x4318,
+ 0x5fc: 0x3679, 0x5fd: 0x4256, 0x5fe: 0xa100,
+ // Block 0x18, offset 0x600
+ 0x601: 0x3c06, 0x603: 0xa000, 0x604: 0x3c0d, 0x605: 0xa000,
+ 0x607: 0x3c14, 0x608: 0xa000, 0x609: 0x3c1b,
+ 0x60d: 0xa000,
+ 0x620: 0x2f65, 0x621: 0xa000, 0x622: 0x3c29,
+ 0x624: 0xa000, 0x625: 0xa000,
+ 0x62d: 0x3c22, 0x62e: 0x2f60, 0x62f: 0x2f6a,
+ 0x630: 0x3c30, 0x631: 0x3c37, 0x632: 0xa000, 0x633: 0xa000, 0x634: 0x3c3e, 0x635: 0x3c45,
+ 0x636: 0xa000, 0x637: 0xa000, 0x638: 0x3c4c, 0x639: 0x3c53, 0x63a: 0xa000, 0x63b: 0xa000,
+ 0x63c: 0xa000, 0x63d: 0xa000,
+ // Block 0x19, offset 0x640
+ 0x640: 0x3c5a, 0x641: 0x3c61, 0x642: 0xa000, 0x643: 0xa000, 0x644: 0x3c76, 0x645: 0x3c7d,
+ 0x646: 0xa000, 0x647: 0xa000, 0x648: 0x3c84, 0x649: 0x3c8b,
+ 0x651: 0xa000,
+ 0x652: 0xa000,
+ 0x662: 0xa000,
+ 0x668: 0xa000, 0x669: 0xa000,
+ 0x66b: 0xa000, 0x66c: 0x3ca0, 0x66d: 0x3ca7, 0x66e: 0x3cae, 0x66f: 0x3cb5,
+ 0x672: 0xa000, 0x673: 0xa000, 0x674: 0xa000, 0x675: 0xa000,
+ // Block 0x1a, offset 0x680
+ 0x686: 0xa000, 0x68b: 0xa000,
+ 0x68c: 0x3f08, 0x68d: 0xa000, 0x68e: 0x3f10, 0x68f: 0xa000, 0x690: 0x3f18, 0x691: 0xa000,
+ 0x692: 0x3f20, 0x693: 0xa000, 0x694: 0x3f28, 0x695: 0xa000, 0x696: 0x3f30, 0x697: 0xa000,
+ 0x698: 0x3f38, 0x699: 0xa000, 0x69a: 0x3f40, 0x69b: 0xa000, 0x69c: 0x3f48, 0x69d: 0xa000,
+ 0x69e: 0x3f50, 0x69f: 0xa000, 0x6a0: 0x3f58, 0x6a1: 0xa000, 0x6a2: 0x3f60,
+ 0x6a4: 0xa000, 0x6a5: 0x3f68, 0x6a6: 0xa000, 0x6a7: 0x3f70, 0x6a8: 0xa000, 0x6a9: 0x3f78,
+ 0x6af: 0xa000,
+ 0x6b0: 0x3f80, 0x6b1: 0x3f88, 0x6b2: 0xa000, 0x6b3: 0x3f90, 0x6b4: 0x3f98, 0x6b5: 0xa000,
+ 0x6b6: 0x3fa0, 0x6b7: 0x3fa8, 0x6b8: 0xa000, 0x6b9: 0x3fb0, 0x6ba: 0x3fb8, 0x6bb: 0xa000,
+ 0x6bc: 0x3fc0, 0x6bd: 0x3fc8,
+ // Block 0x1b, offset 0x6c0
+ 0x6d4: 0x3f00,
+ 0x6d9: 0x9903, 0x6da: 0x9903, 0x6db: 0x8100, 0x6dc: 0x8100, 0x6dd: 0xa000,
+ 0x6de: 0x3fd0,
+ 0x6e6: 0xa000,
+ 0x6eb: 0xa000, 0x6ec: 0x3fe0, 0x6ed: 0xa000, 0x6ee: 0x3fe8, 0x6ef: 0xa000,
+ 0x6f0: 0x3ff0, 0x6f1: 0xa000, 0x6f2: 0x3ff8, 0x6f3: 0xa000, 0x6f4: 0x4000, 0x6f5: 0xa000,
+ 0x6f6: 0x4008, 0x6f7: 0xa000, 0x6f8: 0x4010, 0x6f9: 0xa000, 0x6fa: 0x4018, 0x6fb: 0xa000,
+ 0x6fc: 0x4020, 0x6fd: 0xa000, 0x6fe: 0x4028, 0x6ff: 0xa000,
+ // Block 0x1c, offset 0x700
+ 0x700: 0x4030, 0x701: 0xa000, 0x702: 0x4038, 0x704: 0xa000, 0x705: 0x4040,
+ 0x706: 0xa000, 0x707: 0x4048, 0x708: 0xa000, 0x709: 0x4050,
+ 0x70f: 0xa000, 0x710: 0x4058, 0x711: 0x4060,
+ 0x712: 0xa000, 0x713: 0x4068, 0x714: 0x4070, 0x715: 0xa000, 0x716: 0x4078, 0x717: 0x4080,
+ 0x718: 0xa000, 0x719: 0x4088, 0x71a: 0x4090, 0x71b: 0xa000, 0x71c: 0x4098, 0x71d: 0x40a0,
+ 0x72f: 0xa000,
+ 0x730: 0xa000, 0x731: 0xa000, 0x732: 0xa000, 0x734: 0x3fd8,
+ 0x737: 0x40a8, 0x738: 0x40b0, 0x739: 0x40b8, 0x73a: 0x40c0,
+ 0x73d: 0xa000, 0x73e: 0x40c8,
+ // Block 0x1d, offset 0x740
+ 0x740: 0x1377, 0x741: 0x0cfb, 0x742: 0x13d3, 0x743: 0x139f, 0x744: 0x0e57, 0x745: 0x06eb,
+ 0x746: 0x08df, 0x747: 0x162b, 0x748: 0x162b, 0x749: 0x0a0b, 0x74a: 0x145f, 0x74b: 0x0943,
+ 0x74c: 0x0a07, 0x74d: 0x0bef, 0x74e: 0x0fcf, 0x74f: 0x115f, 0x750: 0x1297, 0x751: 0x12d3,
+ 0x752: 0x1307, 0x753: 0x141b, 0x754: 0x0d73, 0x755: 0x0dff, 0x756: 0x0eab, 0x757: 0x0f43,
+ 0x758: 0x125f, 0x759: 0x1447, 0x75a: 0x1573, 0x75b: 0x070f, 0x75c: 0x08b3, 0x75d: 0x0d87,
+ 0x75e: 0x0ecf, 0x75f: 0x1293, 0x760: 0x15c3, 0x761: 0x0ab3, 0x762: 0x0e77, 0x763: 0x1283,
+ 0x764: 0x1317, 0x765: 0x0c23, 0x766: 0x11bb, 0x767: 0x12df, 0x768: 0x0b1f, 0x769: 0x0d0f,
+ 0x76a: 0x0e17, 0x76b: 0x0f1b, 0x76c: 0x1427, 0x76d: 0x074f, 0x76e: 0x07e7, 0x76f: 0x0853,
+ 0x770: 0x0c8b, 0x771: 0x0d7f, 0x772: 0x0ecb, 0x773: 0x0fef, 0x774: 0x1177, 0x775: 0x128b,
+ 0x776: 0x12a3, 0x777: 0x13c7, 0x778: 0x14ef, 0x779: 0x15a3, 0x77a: 0x15bf, 0x77b: 0x102b,
+ 0x77c: 0x106b, 0x77d: 0x1123, 0x77e: 0x1243, 0x77f: 0x147b,
+ // Block 0x1e, offset 0x780
+ 0x780: 0x15cb, 0x781: 0x134b, 0x782: 0x09c7, 0x783: 0x0b3b, 0x784: 0x10db, 0x785: 0x119b,
+ 0x786: 0x0eff, 0x787: 0x1033, 0x788: 0x1397, 0x789: 0x14e7, 0x78a: 0x09c3, 0x78b: 0x0a8f,
+ 0x78c: 0x0d77, 0x78d: 0x0e2b, 0x78e: 0x0e5f, 0x78f: 0x1113, 0x790: 0x113b, 0x791: 0x14a7,
+ 0x792: 0x084f, 0x793: 0x11a7, 0x794: 0x07f3, 0x795: 0x07ef, 0x796: 0x1097, 0x797: 0x1127,
+ 0x798: 0x125b, 0x799: 0x14af, 0x79a: 0x1367, 0x79b: 0x0c27, 0x79c: 0x0d73, 0x79d: 0x1357,
+ 0x79e: 0x06f7, 0x79f: 0x0a63, 0x7a0: 0x0b93, 0x7a1: 0x0f2f, 0x7a2: 0x0faf, 0x7a3: 0x0873,
+ 0x7a4: 0x103b, 0x7a5: 0x075f, 0x7a6: 0x0b77, 0x7a7: 0x06d7, 0x7a8: 0x0deb, 0x7a9: 0x0ca3,
+ 0x7aa: 0x110f, 0x7ab: 0x08c7, 0x7ac: 0x09b3, 0x7ad: 0x0ffb, 0x7ae: 0x1263, 0x7af: 0x133b,
+ 0x7b0: 0x0db7, 0x7b1: 0x13f7, 0x7b2: 0x0de3, 0x7b3: 0x0c37, 0x7b4: 0x121b, 0x7b5: 0x0c57,
+ 0x7b6: 0x0fab, 0x7b7: 0x072b, 0x7b8: 0x07a7, 0x7b9: 0x07eb, 0x7ba: 0x0d53, 0x7bb: 0x10fb,
+ 0x7bc: 0x11f3, 0x7bd: 0x1347, 0x7be: 0x145b, 0x7bf: 0x085b,
+ // Block 0x1f, offset 0x7c0
+ 0x7c0: 0x090f, 0x7c1: 0x0a17, 0x7c2: 0x0b2f, 0x7c3: 0x0cbf, 0x7c4: 0x0e7b, 0x7c5: 0x103f,
+ 0x7c6: 0x1497, 0x7c7: 0x157b, 0x7c8: 0x15cf, 0x7c9: 0x15e7, 0x7ca: 0x0837, 0x7cb: 0x0cf3,
+ 0x7cc: 0x0da3, 0x7cd: 0x13eb, 0x7ce: 0x0afb, 0x7cf: 0x0bd7, 0x7d0: 0x0bf3, 0x7d1: 0x0c83,
+ 0x7d2: 0x0e6b, 0x7d3: 0x0eb7, 0x7d4: 0x0f67, 0x7d5: 0x108b, 0x7d6: 0x112f, 0x7d7: 0x1193,
+ 0x7d8: 0x13db, 0x7d9: 0x126b, 0x7da: 0x1403, 0x7db: 0x147f, 0x7dc: 0x080f, 0x7dd: 0x083b,
+ 0x7de: 0x0923, 0x7df: 0x0ea7, 0x7e0: 0x12f3, 0x7e1: 0x133b, 0x7e2: 0x0b1b, 0x7e3: 0x0b8b,
+ 0x7e4: 0x0c4f, 0x7e5: 0x0daf, 0x7e6: 0x10d7, 0x7e7: 0x0f23, 0x7e8: 0x073b, 0x7e9: 0x097f,
+ 0x7ea: 0x0a63, 0x7eb: 0x0ac7, 0x7ec: 0x0b97, 0x7ed: 0x0f3f, 0x7ee: 0x0f5b, 0x7ef: 0x116b,
+ 0x7f0: 0x118b, 0x7f1: 0x1463, 0x7f2: 0x14e3, 0x7f3: 0x14f3, 0x7f4: 0x152f, 0x7f5: 0x0753,
+ 0x7f6: 0x107f, 0x7f7: 0x144f, 0x7f8: 0x14cb, 0x7f9: 0x0baf, 0x7fa: 0x0717, 0x7fb: 0x0777,
+ 0x7fc: 0x0a67, 0x7fd: 0x0a87, 0x7fe: 0x0caf, 0x7ff: 0x0d73,
+ // Block 0x20, offset 0x800
+ 0x800: 0x0ec3, 0x801: 0x0fcb, 0x802: 0x1277, 0x803: 0x1417, 0x804: 0x1623, 0x805: 0x0ce3,
+ 0x806: 0x14a3, 0x807: 0x0833, 0x808: 0x0d2f, 0x809: 0x0d3b, 0x80a: 0x0e0f, 0x80b: 0x0e47,
+ 0x80c: 0x0f4b, 0x80d: 0x0fa7, 0x80e: 0x1027, 0x80f: 0x110b, 0x810: 0x153b, 0x811: 0x07af,
+ 0x812: 0x0c03, 0x813: 0x14b3, 0x814: 0x0767, 0x815: 0x0aab, 0x816: 0x0e2f, 0x817: 0x13df,
+ 0x818: 0x0b67, 0x819: 0x0bb7, 0x81a: 0x0d43, 0x81b: 0x0f2f, 0x81c: 0x14bb, 0x81d: 0x0817,
+ 0x81e: 0x08ff, 0x81f: 0x0a97, 0x820: 0x0cd3, 0x821: 0x0d1f, 0x822: 0x0d5f, 0x823: 0x0df3,
+ 0x824: 0x0f47, 0x825: 0x0fbb, 0x826: 0x1157, 0x827: 0x12f7, 0x828: 0x1303, 0x829: 0x1457,
+ 0x82a: 0x14d7, 0x82b: 0x0883, 0x82c: 0x0e4b, 0x82d: 0x0903, 0x82e: 0x0ec7, 0x82f: 0x0f6b,
+ 0x830: 0x1287, 0x831: 0x14bf, 0x832: 0x15ab, 0x833: 0x15d3, 0x834: 0x0d37, 0x835: 0x0e27,
+ 0x836: 0x11c3, 0x837: 0x10b7, 0x838: 0x10c3, 0x839: 0x10e7, 0x83a: 0x0f17, 0x83b: 0x0e9f,
+ 0x83c: 0x1363, 0x83d: 0x0733, 0x83e: 0x122b, 0x83f: 0x081b,
+ // Block 0x21, offset 0x840
+ 0x840: 0x080b, 0x841: 0x0b0b, 0x842: 0x0c2b, 0x843: 0x10f3, 0x844: 0x0a53, 0x845: 0x0e03,
+ 0x846: 0x0cef, 0x847: 0x13e7, 0x848: 0x12e7, 0x849: 0x14ab, 0x84a: 0x1323, 0x84b: 0x0b27,
+ 0x84c: 0x0787, 0x84d: 0x095b, 0x850: 0x09af,
+ 0x852: 0x0cdf, 0x855: 0x07f7, 0x856: 0x0f1f, 0x857: 0x0fe3,
+ 0x858: 0x1047, 0x859: 0x1063, 0x85a: 0x1067, 0x85b: 0x107b, 0x85c: 0x14fb, 0x85d: 0x10eb,
+ 0x85e: 0x116f, 0x860: 0x128f, 0x862: 0x1353,
+ 0x865: 0x1407, 0x866: 0x1433,
+ 0x86a: 0x154f, 0x86b: 0x1553, 0x86c: 0x1557, 0x86d: 0x15bb, 0x86e: 0x142b, 0x86f: 0x14c7,
+ 0x870: 0x0757, 0x871: 0x077b, 0x872: 0x078f, 0x873: 0x084b, 0x874: 0x0857, 0x875: 0x0897,
+ 0x876: 0x094b, 0x877: 0x0967, 0x878: 0x096f, 0x879: 0x09ab, 0x87a: 0x09b7, 0x87b: 0x0a93,
+ 0x87c: 0x0a9b, 0x87d: 0x0ba3, 0x87e: 0x0bcb, 0x87f: 0x0bd3,
+ // Block 0x22, offset 0x880
+ 0x880: 0x0beb, 0x881: 0x0c97, 0x882: 0x0cc7, 0x883: 0x0ce7, 0x884: 0x0d57, 0x885: 0x0e1b,
+ 0x886: 0x0e37, 0x887: 0x0e67, 0x888: 0x0ebb, 0x889: 0x0edb, 0x88a: 0x0f4f, 0x88b: 0x102f,
+ 0x88c: 0x104b, 0x88d: 0x1053, 0x88e: 0x104f, 0x88f: 0x1057, 0x890: 0x105b, 0x891: 0x105f,
+ 0x892: 0x1073, 0x893: 0x1077, 0x894: 0x109b, 0x895: 0x10af, 0x896: 0x10cb, 0x897: 0x112f,
+ 0x898: 0x1137, 0x899: 0x113f, 0x89a: 0x1153, 0x89b: 0x117b, 0x89c: 0x11cb, 0x89d: 0x11ff,
+ 0x89e: 0x11ff, 0x89f: 0x1267, 0x8a0: 0x130f, 0x8a1: 0x1327, 0x8a2: 0x135b, 0x8a3: 0x135f,
+ 0x8a4: 0x13a3, 0x8a5: 0x13a7, 0x8a6: 0x13ff, 0x8a7: 0x1407, 0x8a8: 0x14db, 0x8a9: 0x151f,
+ 0x8aa: 0x1537, 0x8ab: 0x0b9b, 0x8ac: 0x171e, 0x8ad: 0x11e3,
+ 0x8b0: 0x06df, 0x8b1: 0x07e3, 0x8b2: 0x07a3, 0x8b3: 0x074b, 0x8b4: 0x078b, 0x8b5: 0x07b7,
+ 0x8b6: 0x0847, 0x8b7: 0x0863, 0x8b8: 0x094b, 0x8b9: 0x0937, 0x8ba: 0x0947, 0x8bb: 0x0963,
+ 0x8bc: 0x09af, 0x8bd: 0x09bf, 0x8be: 0x0a03, 0x8bf: 0x0a0f,
+ // Block 0x23, offset 0x8c0
+ 0x8c0: 0x0a2b, 0x8c1: 0x0a3b, 0x8c2: 0x0b23, 0x8c3: 0x0b2b, 0x8c4: 0x0b5b, 0x8c5: 0x0b7b,
+ 0x8c6: 0x0bab, 0x8c7: 0x0bc3, 0x8c8: 0x0bb3, 0x8c9: 0x0bd3, 0x8ca: 0x0bc7, 0x8cb: 0x0beb,
+ 0x8cc: 0x0c07, 0x8cd: 0x0c5f, 0x8ce: 0x0c6b, 0x8cf: 0x0c73, 0x8d0: 0x0c9b, 0x8d1: 0x0cdf,
+ 0x8d2: 0x0d0f, 0x8d3: 0x0d13, 0x8d4: 0x0d27, 0x8d5: 0x0da7, 0x8d6: 0x0db7, 0x8d7: 0x0e0f,
+ 0x8d8: 0x0e5b, 0x8d9: 0x0e53, 0x8da: 0x0e67, 0x8db: 0x0e83, 0x8dc: 0x0ebb, 0x8dd: 0x1013,
+ 0x8de: 0x0edf, 0x8df: 0x0f13, 0x8e0: 0x0f1f, 0x8e1: 0x0f5f, 0x8e2: 0x0f7b, 0x8e3: 0x0f9f,
+ 0x8e4: 0x0fc3, 0x8e5: 0x0fc7, 0x8e6: 0x0fe3, 0x8e7: 0x0fe7, 0x8e8: 0x0ff7, 0x8e9: 0x100b,
+ 0x8ea: 0x1007, 0x8eb: 0x1037, 0x8ec: 0x10b3, 0x8ed: 0x10cb, 0x8ee: 0x10e3, 0x8ef: 0x111b,
+ 0x8f0: 0x112f, 0x8f1: 0x114b, 0x8f2: 0x117b, 0x8f3: 0x122f, 0x8f4: 0x1257, 0x8f5: 0x12cb,
+ 0x8f6: 0x1313, 0x8f7: 0x131f, 0x8f8: 0x1327, 0x8f9: 0x133f, 0x8fa: 0x1353, 0x8fb: 0x1343,
+ 0x8fc: 0x135b, 0x8fd: 0x1357, 0x8fe: 0x134f, 0x8ff: 0x135f,
+ // Block 0x24, offset 0x900
+ 0x900: 0x136b, 0x901: 0x13a7, 0x902: 0x13e3, 0x903: 0x1413, 0x904: 0x144b, 0x905: 0x146b,
+ 0x906: 0x14b7, 0x907: 0x14db, 0x908: 0x14fb, 0x909: 0x150f, 0x90a: 0x151f, 0x90b: 0x152b,
+ 0x90c: 0x1537, 0x90d: 0x158b, 0x90e: 0x162b, 0x90f: 0x16b5, 0x910: 0x16b0, 0x911: 0x16e2,
+ 0x912: 0x0607, 0x913: 0x062f, 0x914: 0x0633, 0x915: 0x1764, 0x916: 0x1791, 0x917: 0x1809,
+ 0x918: 0x1617, 0x919: 0x1627,
+ // Block 0x25, offset 0x940
+ 0x940: 0x06fb, 0x941: 0x06f3, 0x942: 0x0703, 0x943: 0x1647, 0x944: 0x0747, 0x945: 0x0757,
+ 0x946: 0x075b, 0x947: 0x0763, 0x948: 0x076b, 0x949: 0x076f, 0x94a: 0x077b, 0x94b: 0x0773,
+ 0x94c: 0x05b3, 0x94d: 0x165b, 0x94e: 0x078f, 0x94f: 0x0793, 0x950: 0x0797, 0x951: 0x07b3,
+ 0x952: 0x164c, 0x953: 0x05b7, 0x954: 0x079f, 0x955: 0x07bf, 0x956: 0x1656, 0x957: 0x07cf,
+ 0x958: 0x07d7, 0x959: 0x0737, 0x95a: 0x07df, 0x95b: 0x07e3, 0x95c: 0x1831, 0x95d: 0x07ff,
+ 0x95e: 0x0807, 0x95f: 0x05bf, 0x960: 0x081f, 0x961: 0x0823, 0x962: 0x082b, 0x963: 0x082f,
+ 0x964: 0x05c3, 0x965: 0x0847, 0x966: 0x084b, 0x967: 0x0857, 0x968: 0x0863, 0x969: 0x0867,
+ 0x96a: 0x086b, 0x96b: 0x0873, 0x96c: 0x0893, 0x96d: 0x0897, 0x96e: 0x089f, 0x96f: 0x08af,
+ 0x970: 0x08b7, 0x971: 0x08bb, 0x972: 0x08bb, 0x973: 0x08bb, 0x974: 0x166a, 0x975: 0x0e93,
+ 0x976: 0x08cf, 0x977: 0x08d7, 0x978: 0x166f, 0x979: 0x08e3, 0x97a: 0x08eb, 0x97b: 0x08f3,
+ 0x97c: 0x091b, 0x97d: 0x0907, 0x97e: 0x0913, 0x97f: 0x0917,
+ // Block 0x26, offset 0x980
+ 0x980: 0x091f, 0x981: 0x0927, 0x982: 0x092b, 0x983: 0x0933, 0x984: 0x093b, 0x985: 0x093f,
+ 0x986: 0x093f, 0x987: 0x0947, 0x988: 0x094f, 0x989: 0x0953, 0x98a: 0x095f, 0x98b: 0x0983,
+ 0x98c: 0x0967, 0x98d: 0x0987, 0x98e: 0x096b, 0x98f: 0x0973, 0x990: 0x080b, 0x991: 0x09cf,
+ 0x992: 0x0997, 0x993: 0x099b, 0x994: 0x099f, 0x995: 0x0993, 0x996: 0x09a7, 0x997: 0x09a3,
+ 0x998: 0x09bb, 0x999: 0x1674, 0x99a: 0x09d7, 0x99b: 0x09db, 0x99c: 0x09e3, 0x99d: 0x09ef,
+ 0x99e: 0x09f7, 0x99f: 0x0a13, 0x9a0: 0x1679, 0x9a1: 0x167e, 0x9a2: 0x0a1f, 0x9a3: 0x0a23,
+ 0x9a4: 0x0a27, 0x9a5: 0x0a1b, 0x9a6: 0x0a2f, 0x9a7: 0x05c7, 0x9a8: 0x05cb, 0x9a9: 0x0a37,
+ 0x9aa: 0x0a3f, 0x9ab: 0x0a3f, 0x9ac: 0x1683, 0x9ad: 0x0a5b, 0x9ae: 0x0a5f, 0x9af: 0x0a63,
+ 0x9b0: 0x0a6b, 0x9b1: 0x1688, 0x9b2: 0x0a73, 0x9b3: 0x0a77, 0x9b4: 0x0b4f, 0x9b5: 0x0a7f,
+ 0x9b6: 0x05cf, 0x9b7: 0x0a8b, 0x9b8: 0x0a9b, 0x9b9: 0x0aa7, 0x9ba: 0x0aa3, 0x9bb: 0x1692,
+ 0x9bc: 0x0aaf, 0x9bd: 0x1697, 0x9be: 0x0abb, 0x9bf: 0x0ab7,
+ // Block 0x27, offset 0x9c0
+ 0x9c0: 0x0abf, 0x9c1: 0x0acf, 0x9c2: 0x0ad3, 0x9c3: 0x05d3, 0x9c4: 0x0ae3, 0x9c5: 0x0aeb,
+ 0x9c6: 0x0aef, 0x9c7: 0x0af3, 0x9c8: 0x05d7, 0x9c9: 0x169c, 0x9ca: 0x05db, 0x9cb: 0x0b0f,
+ 0x9cc: 0x0b13, 0x9cd: 0x0b17, 0x9ce: 0x0b1f, 0x9cf: 0x1863, 0x9d0: 0x0b37, 0x9d1: 0x16a6,
+ 0x9d2: 0x16a6, 0x9d3: 0x11d7, 0x9d4: 0x0b47, 0x9d5: 0x0b47, 0x9d6: 0x05df, 0x9d7: 0x16c9,
+ 0x9d8: 0x179b, 0x9d9: 0x0b57, 0x9da: 0x0b5f, 0x9db: 0x05e3, 0x9dc: 0x0b73, 0x9dd: 0x0b83,
+ 0x9de: 0x0b87, 0x9df: 0x0b8f, 0x9e0: 0x0b9f, 0x9e1: 0x05eb, 0x9e2: 0x05e7, 0x9e3: 0x0ba3,
+ 0x9e4: 0x16ab, 0x9e5: 0x0ba7, 0x9e6: 0x0bbb, 0x9e7: 0x0bbf, 0x9e8: 0x0bc3, 0x9e9: 0x0bbf,
+ 0x9ea: 0x0bcf, 0x9eb: 0x0bd3, 0x9ec: 0x0be3, 0x9ed: 0x0bdb, 0x9ee: 0x0bdf, 0x9ef: 0x0be7,
+ 0x9f0: 0x0beb, 0x9f1: 0x0bef, 0x9f2: 0x0bfb, 0x9f3: 0x0bff, 0x9f4: 0x0c17, 0x9f5: 0x0c1f,
+ 0x9f6: 0x0c2f, 0x9f7: 0x0c43, 0x9f8: 0x16ba, 0x9f9: 0x0c3f, 0x9fa: 0x0c33, 0x9fb: 0x0c4b,
+ 0x9fc: 0x0c53, 0x9fd: 0x0c67, 0x9fe: 0x16bf, 0x9ff: 0x0c6f,
+ // Block 0x28, offset 0xa00
+ 0xa00: 0x0c63, 0xa01: 0x0c5b, 0xa02: 0x05ef, 0xa03: 0x0c77, 0xa04: 0x0c7f, 0xa05: 0x0c87,
+ 0xa06: 0x0c7b, 0xa07: 0x05f3, 0xa08: 0x0c97, 0xa09: 0x0c9f, 0xa0a: 0x16c4, 0xa0b: 0x0ccb,
+ 0xa0c: 0x0cff, 0xa0d: 0x0cdb, 0xa0e: 0x05ff, 0xa0f: 0x0ce7, 0xa10: 0x05fb, 0xa11: 0x05f7,
+ 0xa12: 0x07c3, 0xa13: 0x07c7, 0xa14: 0x0d03, 0xa15: 0x0ceb, 0xa16: 0x11ab, 0xa17: 0x0663,
+ 0xa18: 0x0d0f, 0xa19: 0x0d13, 0xa1a: 0x0d17, 0xa1b: 0x0d2b, 0xa1c: 0x0d23, 0xa1d: 0x16dd,
+ 0xa1e: 0x0603, 0xa1f: 0x0d3f, 0xa20: 0x0d33, 0xa21: 0x0d4f, 0xa22: 0x0d57, 0xa23: 0x16e7,
+ 0xa24: 0x0d5b, 0xa25: 0x0d47, 0xa26: 0x0d63, 0xa27: 0x0607, 0xa28: 0x0d67, 0xa29: 0x0d6b,
+ 0xa2a: 0x0d6f, 0xa2b: 0x0d7b, 0xa2c: 0x16ec, 0xa2d: 0x0d83, 0xa2e: 0x060b, 0xa2f: 0x0d8f,
+ 0xa30: 0x16f1, 0xa31: 0x0d93, 0xa32: 0x060f, 0xa33: 0x0d9f, 0xa34: 0x0dab, 0xa35: 0x0db7,
+ 0xa36: 0x0dbb, 0xa37: 0x16f6, 0xa38: 0x168d, 0xa39: 0x16fb, 0xa3a: 0x0ddb, 0xa3b: 0x1700,
+ 0xa3c: 0x0de7, 0xa3d: 0x0def, 0xa3e: 0x0ddf, 0xa3f: 0x0dfb,
+ // Block 0x29, offset 0xa40
+ 0xa40: 0x0e0b, 0xa41: 0x0e1b, 0xa42: 0x0e0f, 0xa43: 0x0e13, 0xa44: 0x0e1f, 0xa45: 0x0e23,
+ 0xa46: 0x1705, 0xa47: 0x0e07, 0xa48: 0x0e3b, 0xa49: 0x0e3f, 0xa4a: 0x0613, 0xa4b: 0x0e53,
+ 0xa4c: 0x0e4f, 0xa4d: 0x170a, 0xa4e: 0x0e33, 0xa4f: 0x0e6f, 0xa50: 0x170f, 0xa51: 0x1714,
+ 0xa52: 0x0e73, 0xa53: 0x0e87, 0xa54: 0x0e83, 0xa55: 0x0e7f, 0xa56: 0x0617, 0xa57: 0x0e8b,
+ 0xa58: 0x0e9b, 0xa59: 0x0e97, 0xa5a: 0x0ea3, 0xa5b: 0x1651, 0xa5c: 0x0eb3, 0xa5d: 0x1719,
+ 0xa5e: 0x0ebf, 0xa5f: 0x1723, 0xa60: 0x0ed3, 0xa61: 0x0edf, 0xa62: 0x0ef3, 0xa63: 0x1728,
+ 0xa64: 0x0f07, 0xa65: 0x0f0b, 0xa66: 0x172d, 0xa67: 0x1732, 0xa68: 0x0f27, 0xa69: 0x0f37,
+ 0xa6a: 0x061b, 0xa6b: 0x0f3b, 0xa6c: 0x061f, 0xa6d: 0x061f, 0xa6e: 0x0f53, 0xa6f: 0x0f57,
+ 0xa70: 0x0f5f, 0xa71: 0x0f63, 0xa72: 0x0f6f, 0xa73: 0x0623, 0xa74: 0x0f87, 0xa75: 0x1737,
+ 0xa76: 0x0fa3, 0xa77: 0x173c, 0xa78: 0x0faf, 0xa79: 0x16a1, 0xa7a: 0x0fbf, 0xa7b: 0x1741,
+ 0xa7c: 0x1746, 0xa7d: 0x174b, 0xa7e: 0x0627, 0xa7f: 0x062b,
+ // Block 0x2a, offset 0xa80
+ 0xa80: 0x0ff7, 0xa81: 0x1755, 0xa82: 0x1750, 0xa83: 0x175a, 0xa84: 0x175f, 0xa85: 0x0fff,
+ 0xa86: 0x1003, 0xa87: 0x1003, 0xa88: 0x100b, 0xa89: 0x0633, 0xa8a: 0x100f, 0xa8b: 0x0637,
+ 0xa8c: 0x063b, 0xa8d: 0x1769, 0xa8e: 0x1023, 0xa8f: 0x102b, 0xa90: 0x1037, 0xa91: 0x063f,
+ 0xa92: 0x176e, 0xa93: 0x105b, 0xa94: 0x1773, 0xa95: 0x1778, 0xa96: 0x107b, 0xa97: 0x1093,
+ 0xa98: 0x0643, 0xa99: 0x109b, 0xa9a: 0x109f, 0xa9b: 0x10a3, 0xa9c: 0x177d, 0xa9d: 0x1782,
+ 0xa9e: 0x1782, 0xa9f: 0x10bb, 0xaa0: 0x0647, 0xaa1: 0x1787, 0xaa2: 0x10cf, 0xaa3: 0x10d3,
+ 0xaa4: 0x064b, 0xaa5: 0x178c, 0xaa6: 0x10ef, 0xaa7: 0x064f, 0xaa8: 0x10ff, 0xaa9: 0x10f7,
+ 0xaaa: 0x1107, 0xaab: 0x1796, 0xaac: 0x111f, 0xaad: 0x0653, 0xaae: 0x112b, 0xaaf: 0x1133,
+ 0xab0: 0x1143, 0xab1: 0x0657, 0xab2: 0x17a0, 0xab3: 0x17a5, 0xab4: 0x065b, 0xab5: 0x17aa,
+ 0xab6: 0x115b, 0xab7: 0x17af, 0xab8: 0x1167, 0xab9: 0x1173, 0xaba: 0x117b, 0xabb: 0x17b4,
+ 0xabc: 0x17b9, 0xabd: 0x118f, 0xabe: 0x17be, 0xabf: 0x1197,
+ // Block 0x2b, offset 0xac0
+ 0xac0: 0x16ce, 0xac1: 0x065f, 0xac2: 0x11af, 0xac3: 0x11b3, 0xac4: 0x0667, 0xac5: 0x11b7,
+ 0xac6: 0x0a33, 0xac7: 0x17c3, 0xac8: 0x17c8, 0xac9: 0x16d3, 0xaca: 0x16d8, 0xacb: 0x11d7,
+ 0xacc: 0x11db, 0xacd: 0x13f3, 0xace: 0x066b, 0xacf: 0x1207, 0xad0: 0x1203, 0xad1: 0x120b,
+ 0xad2: 0x083f, 0xad3: 0x120f, 0xad4: 0x1213, 0xad5: 0x1217, 0xad6: 0x121f, 0xad7: 0x17cd,
+ 0xad8: 0x121b, 0xad9: 0x1223, 0xada: 0x1237, 0xadb: 0x123b, 0xadc: 0x1227, 0xadd: 0x123f,
+ 0xade: 0x1253, 0xadf: 0x1267, 0xae0: 0x1233, 0xae1: 0x1247, 0xae2: 0x124b, 0xae3: 0x124f,
+ 0xae4: 0x17d2, 0xae5: 0x17dc, 0xae6: 0x17d7, 0xae7: 0x066f, 0xae8: 0x126f, 0xae9: 0x1273,
+ 0xaea: 0x127b, 0xaeb: 0x17f0, 0xaec: 0x127f, 0xaed: 0x17e1, 0xaee: 0x0673, 0xaef: 0x0677,
+ 0xaf0: 0x17e6, 0xaf1: 0x17eb, 0xaf2: 0x067b, 0xaf3: 0x129f, 0xaf4: 0x12a3, 0xaf5: 0x12a7,
+ 0xaf6: 0x12ab, 0xaf7: 0x12b7, 0xaf8: 0x12b3, 0xaf9: 0x12bf, 0xafa: 0x12bb, 0xafb: 0x12cb,
+ 0xafc: 0x12c3, 0xafd: 0x12c7, 0xafe: 0x12cf, 0xaff: 0x067f,
+ // Block 0x2c, offset 0xb00
+ 0xb00: 0x12d7, 0xb01: 0x12db, 0xb02: 0x0683, 0xb03: 0x12eb, 0xb04: 0x12ef, 0xb05: 0x17f5,
+ 0xb06: 0x12fb, 0xb07: 0x12ff, 0xb08: 0x0687, 0xb09: 0x130b, 0xb0a: 0x05bb, 0xb0b: 0x17fa,
+ 0xb0c: 0x17ff, 0xb0d: 0x068b, 0xb0e: 0x068f, 0xb0f: 0x1337, 0xb10: 0x134f, 0xb11: 0x136b,
+ 0xb12: 0x137b, 0xb13: 0x1804, 0xb14: 0x138f, 0xb15: 0x1393, 0xb16: 0x13ab, 0xb17: 0x13b7,
+ 0xb18: 0x180e, 0xb19: 0x1660, 0xb1a: 0x13c3, 0xb1b: 0x13bf, 0xb1c: 0x13cb, 0xb1d: 0x1665,
+ 0xb1e: 0x13d7, 0xb1f: 0x13e3, 0xb20: 0x1813, 0xb21: 0x1818, 0xb22: 0x1423, 0xb23: 0x142f,
+ 0xb24: 0x1437, 0xb25: 0x181d, 0xb26: 0x143b, 0xb27: 0x1467, 0xb28: 0x1473, 0xb29: 0x1477,
+ 0xb2a: 0x146f, 0xb2b: 0x1483, 0xb2c: 0x1487, 0xb2d: 0x1822, 0xb2e: 0x1493, 0xb2f: 0x0693,
+ 0xb30: 0x149b, 0xb31: 0x1827, 0xb32: 0x0697, 0xb33: 0x14d3, 0xb34: 0x0ac3, 0xb35: 0x14eb,
+ 0xb36: 0x182c, 0xb37: 0x1836, 0xb38: 0x069b, 0xb39: 0x069f, 0xb3a: 0x1513, 0xb3b: 0x183b,
+ 0xb3c: 0x06a3, 0xb3d: 0x1840, 0xb3e: 0x152b, 0xb3f: 0x152b,
+ // Block 0x2d, offset 0xb40
+ 0xb40: 0x1533, 0xb41: 0x1845, 0xb42: 0x154b, 0xb43: 0x06a7, 0xb44: 0x155b, 0xb45: 0x1567,
+ 0xb46: 0x156f, 0xb47: 0x1577, 0xb48: 0x06ab, 0xb49: 0x184a, 0xb4a: 0x158b, 0xb4b: 0x15a7,
+ 0xb4c: 0x15b3, 0xb4d: 0x06af, 0xb4e: 0x06b3, 0xb4f: 0x15b7, 0xb50: 0x184f, 0xb51: 0x06b7,
+ 0xb52: 0x1854, 0xb53: 0x1859, 0xb54: 0x185e, 0xb55: 0x15db, 0xb56: 0x06bb, 0xb57: 0x15ef,
+ 0xb58: 0x15f7, 0xb59: 0x15fb, 0xb5a: 0x1603, 0xb5b: 0x160b, 0xb5c: 0x1613, 0xb5d: 0x1868,
+}
+
+// nfcIndex: 22 blocks, 1408 entries, 1408 bytes
+// Block 0 is the zero block.
+var nfcIndex = [1408]uint8{
+ // Block 0x0, offset 0x0
+ // Block 0x1, offset 0x40
+ // Block 0x2, offset 0x80
+ // Block 0x3, offset 0xc0
+ 0xc2: 0x2c, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x2d, 0xc7: 0x04,
+ 0xc8: 0x05, 0xca: 0x2e, 0xcb: 0x2f, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x30,
+ 0xd0: 0x09, 0xd1: 0x31, 0xd2: 0x32, 0xd3: 0x0a, 0xd6: 0x0b, 0xd7: 0x33,
+ 0xd8: 0x34, 0xd9: 0x0c, 0xdb: 0x35, 0xdc: 0x36, 0xdd: 0x37, 0xdf: 0x38,
+ 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05,
+ 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a,
+ 0xf0: 0x13,
+ // Block 0x4, offset 0x100
+ 0x120: 0x39, 0x121: 0x3a, 0x123: 0x3b, 0x124: 0x3c, 0x125: 0x3d, 0x126: 0x3e, 0x127: 0x3f,
+ 0x128: 0x40, 0x129: 0x41, 0x12a: 0x42, 0x12b: 0x43, 0x12c: 0x3e, 0x12d: 0x44, 0x12e: 0x45, 0x12f: 0x46,
+ 0x131: 0x47, 0x132: 0x48, 0x133: 0x49, 0x134: 0x4a, 0x135: 0x4b, 0x137: 0x4c,
+ 0x138: 0x4d, 0x139: 0x4e, 0x13a: 0x4f, 0x13b: 0x50, 0x13c: 0x51, 0x13d: 0x52, 0x13e: 0x53, 0x13f: 0x54,
+ // Block 0x5, offset 0x140
+ 0x140: 0x55, 0x142: 0x56, 0x144: 0x57, 0x145: 0x58, 0x146: 0x59, 0x147: 0x5a,
+ 0x14d: 0x5b,
+ 0x15c: 0x5c, 0x15f: 0x5d,
+ 0x162: 0x5e, 0x164: 0x5f,
+ 0x168: 0x60, 0x169: 0x61, 0x16a: 0x62, 0x16c: 0x0d, 0x16d: 0x63, 0x16e: 0x64, 0x16f: 0x65,
+ 0x170: 0x66, 0x173: 0x67, 0x177: 0x68,
+ 0x178: 0x0e, 0x179: 0x0f, 0x17a: 0x10, 0x17b: 0x11, 0x17c: 0x12, 0x17d: 0x13, 0x17e: 0x14, 0x17f: 0x15,
+ // Block 0x6, offset 0x180
+ 0x180: 0x69, 0x183: 0x6a, 0x184: 0x6b, 0x186: 0x6c, 0x187: 0x6d,
+ 0x188: 0x6e, 0x189: 0x16, 0x18a: 0x17, 0x18b: 0x6f, 0x18c: 0x70,
+ 0x1ab: 0x71,
+ 0x1b3: 0x72, 0x1b5: 0x73, 0x1b7: 0x74,
+ // Block 0x7, offset 0x1c0
+ 0x1c0: 0x75, 0x1c1: 0x18, 0x1c2: 0x19, 0x1c3: 0x1a, 0x1c4: 0x76, 0x1c5: 0x77,
+ 0x1c9: 0x78, 0x1cc: 0x79, 0x1cd: 0x7a,
+ // Block 0x8, offset 0x200
+ 0x219: 0x7b, 0x21a: 0x7c, 0x21b: 0x7d,
+ 0x220: 0x7e, 0x223: 0x7f, 0x224: 0x80, 0x225: 0x81, 0x226: 0x82, 0x227: 0x83,
+ 0x22a: 0x84, 0x22b: 0x85, 0x22f: 0x86,
+ 0x230: 0x87, 0x231: 0x88, 0x232: 0x89, 0x233: 0x8a, 0x234: 0x8b, 0x235: 0x8c, 0x236: 0x8d, 0x237: 0x87,
+ 0x238: 0x88, 0x239: 0x89, 0x23a: 0x8a, 0x23b: 0x8b, 0x23c: 0x8c, 0x23d: 0x8d, 0x23e: 0x87, 0x23f: 0x88,
+ // Block 0x9, offset 0x240
+ 0x240: 0x89, 0x241: 0x8a, 0x242: 0x8b, 0x243: 0x8c, 0x244: 0x8d, 0x245: 0x87, 0x246: 0x88, 0x247: 0x89,
+ 0x248: 0x8a, 0x249: 0x8b, 0x24a: 0x8c, 0x24b: 0x8d, 0x24c: 0x87, 0x24d: 0x88, 0x24e: 0x89, 0x24f: 0x8a,
+ 0x250: 0x8b, 0x251: 0x8c, 0x252: 0x8d, 0x253: 0x87, 0x254: 0x88, 0x255: 0x89, 0x256: 0x8a, 0x257: 0x8b,
+ 0x258: 0x8c, 0x259: 0x8d, 0x25a: 0x87, 0x25b: 0x88, 0x25c: 0x89, 0x25d: 0x8a, 0x25e: 0x8b, 0x25f: 0x8c,
+ 0x260: 0x8d, 0x261: 0x87, 0x262: 0x88, 0x263: 0x89, 0x264: 0x8a, 0x265: 0x8b, 0x266: 0x8c, 0x267: 0x8d,
+ 0x268: 0x87, 0x269: 0x88, 0x26a: 0x89, 0x26b: 0x8a, 0x26c: 0x8b, 0x26d: 0x8c, 0x26e: 0x8d, 0x26f: 0x87,
+ 0x270: 0x88, 0x271: 0x89, 0x272: 0x8a, 0x273: 0x8b, 0x274: 0x8c, 0x275: 0x8d, 0x276: 0x87, 0x277: 0x88,
+ 0x278: 0x89, 0x279: 0x8a, 0x27a: 0x8b, 0x27b: 0x8c, 0x27c: 0x8d, 0x27d: 0x87, 0x27e: 0x88, 0x27f: 0x89,
+ // Block 0xa, offset 0x280
+ 0x280: 0x8a, 0x281: 0x8b, 0x282: 0x8c, 0x283: 0x8d, 0x284: 0x87, 0x285: 0x88, 0x286: 0x89, 0x287: 0x8a,
+ 0x288: 0x8b, 0x289: 0x8c, 0x28a: 0x8d, 0x28b: 0x87, 0x28c: 0x88, 0x28d: 0x89, 0x28e: 0x8a, 0x28f: 0x8b,
+ 0x290: 0x8c, 0x291: 0x8d, 0x292: 0x87, 0x293: 0x88, 0x294: 0x89, 0x295: 0x8a, 0x296: 0x8b, 0x297: 0x8c,
+ 0x298: 0x8d, 0x299: 0x87, 0x29a: 0x88, 0x29b: 0x89, 0x29c: 0x8a, 0x29d: 0x8b, 0x29e: 0x8c, 0x29f: 0x8d,
+ 0x2a0: 0x87, 0x2a1: 0x88, 0x2a2: 0x89, 0x2a3: 0x8a, 0x2a4: 0x8b, 0x2a5: 0x8c, 0x2a6: 0x8d, 0x2a7: 0x87,
+ 0x2a8: 0x88, 0x2a9: 0x89, 0x2aa: 0x8a, 0x2ab: 0x8b, 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x87, 0x2af: 0x88,
+ 0x2b0: 0x89, 0x2b1: 0x8a, 0x2b2: 0x8b, 0x2b3: 0x8c, 0x2b4: 0x8d, 0x2b5: 0x87, 0x2b6: 0x88, 0x2b7: 0x89,
+ 0x2b8: 0x8a, 0x2b9: 0x8b, 0x2ba: 0x8c, 0x2bb: 0x8d, 0x2bc: 0x87, 0x2bd: 0x88, 0x2be: 0x89, 0x2bf: 0x8a,
+ // Block 0xb, offset 0x2c0
+ 0x2c0: 0x8b, 0x2c1: 0x8c, 0x2c2: 0x8d, 0x2c3: 0x87, 0x2c4: 0x88, 0x2c5: 0x89, 0x2c6: 0x8a, 0x2c7: 0x8b,
+ 0x2c8: 0x8c, 0x2c9: 0x8d, 0x2ca: 0x87, 0x2cb: 0x88, 0x2cc: 0x89, 0x2cd: 0x8a, 0x2ce: 0x8b, 0x2cf: 0x8c,
+ 0x2d0: 0x8d, 0x2d1: 0x87, 0x2d2: 0x88, 0x2d3: 0x89, 0x2d4: 0x8a, 0x2d5: 0x8b, 0x2d6: 0x8c, 0x2d7: 0x8d,
+ 0x2d8: 0x87, 0x2d9: 0x88, 0x2da: 0x89, 0x2db: 0x8a, 0x2dc: 0x8b, 0x2dd: 0x8c, 0x2de: 0x8e,
+ // Block 0xc, offset 0x300
+ 0x324: 0x1b, 0x325: 0x1c, 0x326: 0x1d, 0x327: 0x1e,
+ 0x328: 0x1f, 0x329: 0x20, 0x32a: 0x21, 0x32b: 0x22, 0x32c: 0x8f, 0x32d: 0x90, 0x32e: 0x91,
+ 0x331: 0x92, 0x332: 0x93, 0x333: 0x94, 0x334: 0x95,
+ 0x338: 0x96, 0x339: 0x97, 0x33a: 0x98, 0x33b: 0x99, 0x33e: 0x9a, 0x33f: 0x9b,
+ // Block 0xd, offset 0x340
+ 0x347: 0x9c,
+ 0x34b: 0x9d, 0x34d: 0x9e,
+ 0x368: 0x9f, 0x36b: 0xa0,
+ // Block 0xe, offset 0x380
+ 0x381: 0xa1, 0x382: 0xa2, 0x384: 0xa3, 0x385: 0x82, 0x387: 0xa4,
+ 0x388: 0xa5, 0x38b: 0xa6, 0x38c: 0x3e, 0x38d: 0xa7,
+ 0x391: 0xa8, 0x392: 0xa9, 0x393: 0xaa, 0x396: 0xab, 0x397: 0xac,
+ 0x398: 0x73, 0x39a: 0xad, 0x39c: 0xae,
+ 0x3b0: 0x73,
+ // Block 0xf, offset 0x3c0
+ 0x3eb: 0xaf, 0x3ec: 0xb0,
+ // Block 0x10, offset 0x400
+ 0x432: 0xb1,
+ // Block 0x11, offset 0x440
+ 0x445: 0xb2, 0x446: 0xb3, 0x447: 0xb4,
+ 0x449: 0xb5,
+ // Block 0x12, offset 0x480
+ 0x480: 0xb6,
+ 0x4a3: 0xb7, 0x4a5: 0xb8,
+ // Block 0x13, offset 0x4c0
+ 0x4c8: 0xb9,
+ // Block 0x14, offset 0x500
+ 0x520: 0x23, 0x521: 0x24, 0x522: 0x25, 0x523: 0x26, 0x524: 0x27, 0x525: 0x28, 0x526: 0x29, 0x527: 0x2a,
+ 0x528: 0x2b,
+ // Block 0x15, offset 0x540
+ 0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d,
+ 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11,
+ 0x56f: 0x12,
+}
+
+// nfcSparseOffset: 142 entries, 284 bytes
+var nfcSparseOffset = []uint16{0x0, 0x5, 0x9, 0xb, 0xd, 0x18, 0x28, 0x2a, 0x2f, 0x3a, 0x49, 0x56, 0x5e, 0x62, 0x67, 0x69, 0x7a, 0x82, 0x89, 0x8c, 0x93, 0x97, 0x9b, 0x9d, 0x9f, 0xa8, 0xac, 0xb3, 0xb8, 0xbb, 0xc5, 0xc7, 0xce, 0xd6, 0xd9, 0xdb, 0xdd, 0xdf, 0xe4, 0xf5, 0x101, 0x103, 0x109, 0x10b, 0x10d, 0x10f, 0x111, 0x113, 0x115, 0x118, 0x11b, 0x11d, 0x120, 0x123, 0x127, 0x12c, 0x135, 0x137, 0x13a, 0x13c, 0x147, 0x157, 0x15b, 0x169, 0x16c, 0x172, 0x178, 0x183, 0x187, 0x189, 0x18b, 0x18d, 0x18f, 0x191, 0x197, 0x19b, 0x19d, 0x19f, 0x1a7, 0x1ab, 0x1ae, 0x1b0, 0x1b2, 0x1b4, 0x1b7, 0x1b9, 0x1bb, 0x1bd, 0x1bf, 0x1c5, 0x1c8, 0x1ca, 0x1d1, 0x1d7, 0x1dd, 0x1e5, 0x1eb, 0x1f1, 0x1f7, 0x1fb, 0x209, 0x212, 0x215, 0x218, 0x21a, 0x21d, 0x21f, 0x223, 0x228, 0x22a, 0x22c, 0x231, 0x237, 0x239, 0x23b, 0x23d, 0x243, 0x246, 0x249, 0x251, 0x258, 0x25b, 0x25e, 0x260, 0x268, 0x26b, 0x272, 0x275, 0x27b, 0x27d, 0x280, 0x282, 0x284, 0x286, 0x288, 0x295, 0x29f, 0x2a1, 0x2a3, 0x2a9, 0x2ab, 0x2ae}
+
+// nfcSparseValues: 688 entries, 2752 bytes
+var nfcSparseValues = [688]valueRange{
+ // Block 0x0, offset 0x0
+ {value: 0x0000, lo: 0x04},
+ {value: 0xa100, lo: 0xa8, hi: 0xa8},
+ {value: 0x8100, lo: 0xaf, hi: 0xaf},
+ {value: 0x8100, lo: 0xb4, hi: 0xb4},
+ {value: 0x8100, lo: 0xb8, hi: 0xb8},
+ // Block 0x1, offset 0x5
+ {value: 0x0091, lo: 0x03},
+ {value: 0x46e2, lo: 0xa0, hi: 0xa1},
+ {value: 0x4714, lo: 0xaf, hi: 0xb0},
+ {value: 0xa000, lo: 0xb7, hi: 0xb7},
+ // Block 0x2, offset 0x9
+ {value: 0x0000, lo: 0x01},
+ {value: 0xa000, lo: 0x92, hi: 0x92},
+ // Block 0x3, offset 0xb
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8100, lo: 0x98, hi: 0x9d},
+ // Block 0x4, offset 0xd
+ {value: 0x0006, lo: 0x0a},
+ {value: 0xa000, lo: 0x81, hi: 0x81},
+ {value: 0xa000, lo: 0x85, hi: 0x85},
+ {value: 0xa000, lo: 0x89, hi: 0x89},
+ {value: 0x4840, lo: 0x8a, hi: 0x8a},
+ {value: 0x485e, lo: 0x8b, hi: 0x8b},
+ {value: 0x36c7, lo: 0x8c, hi: 0x8c},
+ {value: 0x36df, lo: 0x8d, hi: 0x8d},
+ {value: 0x4876, lo: 0x8e, hi: 0x8e},
+ {value: 0xa000, lo: 0x92, hi: 0x92},
+ {value: 0x36fd, lo: 0x93, hi: 0x94},
+ // Block 0x5, offset 0x18
+ {value: 0x0000, lo: 0x0f},
+ {value: 0xa000, lo: 0x83, hi: 0x83},
+ {value: 0xa000, lo: 0x87, hi: 0x87},
+ {value: 0xa000, lo: 0x8b, hi: 0x8b},
+ {value: 0xa000, lo: 0x8d, hi: 0x8d},
+ {value: 0x37a5, lo: 0x90, hi: 0x90},
+ {value: 0x37b1, lo: 0x91, hi: 0x91},
+ {value: 0x379f, lo: 0x93, hi: 0x93},
+ {value: 0xa000, lo: 0x96, hi: 0x96},
+ {value: 0x3817, lo: 0x97, hi: 0x97},
+ {value: 0x37e1, lo: 0x9c, hi: 0x9c},
+ {value: 0x37c9, lo: 0x9d, hi: 0x9d},
+ {value: 0x37f3, lo: 0x9e, hi: 0x9e},
+ {value: 0xa000, lo: 0xb4, hi: 0xb5},
+ {value: 0x381d, lo: 0xb6, hi: 0xb6},
+ {value: 0x3823, lo: 0xb7, hi: 0xb7},
+ // Block 0x6, offset 0x28
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8132, lo: 0x83, hi: 0x87},
+ // Block 0x7, offset 0x2a
+ {value: 0x0001, lo: 0x04},
+ {value: 0x8113, lo: 0x81, hi: 0x82},
+ {value: 0x8132, lo: 0x84, hi: 0x84},
+ {value: 0x812d, lo: 0x85, hi: 0x85},
+ {value: 0x810d, lo: 0x87, hi: 0x87},
+ // Block 0x8, offset 0x2f
+ {value: 0x0000, lo: 0x0a},
+ {value: 0x8132, lo: 0x90, hi: 0x97},
+ {value: 0x8119, lo: 0x98, hi: 0x98},
+ {value: 0x811a, lo: 0x99, hi: 0x99},
+ {value: 0x811b, lo: 0x9a, hi: 0x9a},
+ {value: 0x3841, lo: 0xa2, hi: 0xa2},
+ {value: 0x3847, lo: 0xa3, hi: 0xa3},
+ {value: 0x3853, lo: 0xa4, hi: 0xa4},
+ {value: 0x384d, lo: 0xa5, hi: 0xa5},
+ {value: 0x3859, lo: 0xa6, hi: 0xa6},
+ {value: 0xa000, lo: 0xa7, hi: 0xa7},
+ // Block 0x9, offset 0x3a
+ {value: 0x0000, lo: 0x0e},
+ {value: 0x386b, lo: 0x80, hi: 0x80},
+ {value: 0xa000, lo: 0x81, hi: 0x81},
+ {value: 0x385f, lo: 0x82, hi: 0x82},
+ {value: 0xa000, lo: 0x92, hi: 0x92},
+ {value: 0x3865, lo: 0x93, hi: 0x93},
+ {value: 0xa000, lo: 0x95, hi: 0x95},
+ {value: 0x8132, lo: 0x96, hi: 0x9c},
+ {value: 0x8132, lo: 0x9f, hi: 0xa2},
+ {value: 0x812d, lo: 0xa3, hi: 0xa3},
+ {value: 0x8132, lo: 0xa4, hi: 0xa4},
+ {value: 0x8132, lo: 0xa7, hi: 0xa8},
+ {value: 0x812d, lo: 0xaa, hi: 0xaa},
+ {value: 0x8132, lo: 0xab, hi: 0xac},
+ {value: 0x812d, lo: 0xad, hi: 0xad},
+ // Block 0xa, offset 0x49
+ {value: 0x0000, lo: 0x0c},
+ {value: 0x811f, lo: 0x91, hi: 0x91},
+ {value: 0x8132, lo: 0xb0, hi: 0xb0},
+ {value: 0x812d, lo: 0xb1, hi: 0xb1},
+ {value: 0x8132, lo: 0xb2, hi: 0xb3},
+ {value: 0x812d, lo: 0xb4, hi: 0xb4},
+ {value: 0x8132, lo: 0xb5, hi: 0xb6},
+ {value: 0x812d, lo: 0xb7, hi: 0xb9},
+ {value: 0x8132, lo: 0xba, hi: 0xba},
+ {value: 0x812d, lo: 0xbb, hi: 0xbc},
+ {value: 0x8132, lo: 0xbd, hi: 0xbd},
+ {value: 0x812d, lo: 0xbe, hi: 0xbe},
+ {value: 0x8132, lo: 0xbf, hi: 0xbf},
+ // Block 0xb, offset 0x56
+ {value: 0x0005, lo: 0x07},
+ {value: 0x8132, lo: 0x80, hi: 0x80},
+ {value: 0x8132, lo: 0x81, hi: 0x81},
+ {value: 0x812d, lo: 0x82, hi: 0x83},
+ {value: 0x812d, lo: 0x84, hi: 0x85},
+ {value: 0x812d, lo: 0x86, hi: 0x87},
+ {value: 0x812d, lo: 0x88, hi: 0x89},
+ {value: 0x8132, lo: 0x8a, hi: 0x8a},
+ // Block 0xc, offset 0x5e
+ {value: 0x0000, lo: 0x03},
+ {value: 0x8132, lo: 0xab, hi: 0xb1},
+ {value: 0x812d, lo: 0xb2, hi: 0xb2},
+ {value: 0x8132, lo: 0xb3, hi: 0xb3},
+ // Block 0xd, offset 0x62
+ {value: 0x0000, lo: 0x04},
+ {value: 0x8132, lo: 0x96, hi: 0x99},
+ {value: 0x8132, lo: 0x9b, hi: 0xa3},
+ {value: 0x8132, lo: 0xa5, hi: 0xa7},
+ {value: 0x8132, lo: 0xa9, hi: 0xad},
+ // Block 0xe, offset 0x67
+ {value: 0x0000, lo: 0x01},
+ {value: 0x812d, lo: 0x99, hi: 0x9b},
+ // Block 0xf, offset 0x69
+ {value: 0x0000, lo: 0x10},
+ {value: 0x8132, lo: 0x94, hi: 0xa1},
+ {value: 0x812d, lo: 0xa3, hi: 0xa3},
+ {value: 0x8132, lo: 0xa4, hi: 0xa5},
+ {value: 0x812d, lo: 0xa6, hi: 0xa6},
+ {value: 0x8132, lo: 0xa7, hi: 0xa8},
+ {value: 0x812d, lo: 0xa9, hi: 0xa9},
+ {value: 0x8132, lo: 0xaa, hi: 0xac},
+ {value: 0x812d, lo: 0xad, hi: 0xaf},
+ {value: 0x8116, lo: 0xb0, hi: 0xb0},
+ {value: 0x8117, lo: 0xb1, hi: 0xb1},
+ {value: 0x8118, lo: 0xb2, hi: 0xb2},
+ {value: 0x8132, lo: 0xb3, hi: 0xb5},
+ {value: 0x812d, lo: 0xb6, hi: 0xb6},
+ {value: 0x8132, lo: 0xb7, hi: 0xb8},
+ {value: 0x812d, lo: 0xb9, hi: 0xba},
+ {value: 0x8132, lo: 0xbb, hi: 0xbf},
+ // Block 0x10, offset 0x7a
+ {value: 0x0000, lo: 0x07},
+ {value: 0xa000, lo: 0xa8, hi: 0xa8},
+ {value: 0x3ed8, lo: 0xa9, hi: 0xa9},
+ {value: 0xa000, lo: 0xb0, hi: 0xb0},
+ {value: 0x3ee0, lo: 0xb1, hi: 0xb1},
+ {value: 0xa000, lo: 0xb3, hi: 0xb3},
+ {value: 0x3ee8, lo: 0xb4, hi: 0xb4},
+ {value: 0x9902, lo: 0xbc, hi: 0xbc},
+ // Block 0x11, offset 0x82
+ {value: 0x0008, lo: 0x06},
+ {value: 0x8104, lo: 0x8d, hi: 0x8d},
+ {value: 0x8132, lo: 0x91, hi: 0x91},
+ {value: 0x812d, lo: 0x92, hi: 0x92},
+ {value: 0x8132, lo: 0x93, hi: 0x93},
+ {value: 0x8132, lo: 0x94, hi: 0x94},
+ {value: 0x451c, lo: 0x98, hi: 0x9f},
+ // Block 0x12, offset 0x89
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8102, lo: 0xbc, hi: 0xbc},
+ {value: 0x9900, lo: 0xbe, hi: 0xbe},
+ // Block 0x13, offset 0x8c
+ {value: 0x0008, lo: 0x06},
+ {value: 0xa000, lo: 0x87, hi: 0x87},
+ {value: 0x2c9e, lo: 0x8b, hi: 0x8c},
+ {value: 0x8104, lo: 0x8d, hi: 0x8d},
+ {value: 0x9900, lo: 0x97, hi: 0x97},
+ {value: 0x455c, lo: 0x9c, hi: 0x9d},
+ {value: 0x456c, lo: 0x9f, hi: 0x9f},
+ // Block 0x14, offset 0x93
+ {value: 0x0000, lo: 0x03},
+ {value: 0x4594, lo: 0xb3, hi: 0xb3},
+ {value: 0x459c, lo: 0xb6, hi: 0xb6},
+ {value: 0x8102, lo: 0xbc, hi: 0xbc},
+ // Block 0x15, offset 0x97
+ {value: 0x0008, lo: 0x03},
+ {value: 0x8104, lo: 0x8d, hi: 0x8d},
+ {value: 0x4574, lo: 0x99, hi: 0x9b},
+ {value: 0x458c, lo: 0x9e, hi: 0x9e},
+ // Block 0x16, offset 0x9b
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8102, lo: 0xbc, hi: 0xbc},
+ // Block 0x17, offset 0x9d
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8104, lo: 0x8d, hi: 0x8d},
+ // Block 0x18, offset 0x9f
+ {value: 0x0000, lo: 0x08},
+ {value: 0xa000, lo: 0x87, hi: 0x87},
+ {value: 0x2cb6, lo: 0x88, hi: 0x88},
+ {value: 0x2cae, lo: 0x8b, hi: 0x8b},
+ {value: 0x2cbe, lo: 0x8c, hi: 0x8c},
+ {value: 0x8104, lo: 0x8d, hi: 0x8d},
+ {value: 0x9900, lo: 0x96, hi: 0x97},
+ {value: 0x45a4, lo: 0x9c, hi: 0x9c},
+ {value: 0x45ac, lo: 0x9d, hi: 0x9d},
+ // Block 0x19, offset 0xa8
+ {value: 0x0000, lo: 0x03},
+ {value: 0xa000, lo: 0x92, hi: 0x92},
+ {value: 0x2cc6, lo: 0x94, hi: 0x94},
+ {value: 0x9900, lo: 0xbe, hi: 0xbe},
+ // Block 0x1a, offset 0xac
+ {value: 0x0000, lo: 0x06},
+ {value: 0xa000, lo: 0x86, hi: 0x87},
+ {value: 0x2cce, lo: 0x8a, hi: 0x8a},
+ {value: 0x2cde, lo: 0x8b, hi: 0x8b},
+ {value: 0x2cd6, lo: 0x8c, hi: 0x8c},
+ {value: 0x8104, lo: 0x8d, hi: 0x8d},
+ {value: 0x9900, lo: 0x97, hi: 0x97},
+ // Block 0x1b, offset 0xb3
+ {value: 0x1801, lo: 0x04},
+ {value: 0xa000, lo: 0x86, hi: 0x86},
+ {value: 0x3ef0, lo: 0x88, hi: 0x88},
+ {value: 0x8104, lo: 0x8d, hi: 0x8d},
+ {value: 0x8120, lo: 0x95, hi: 0x96},
+ // Block 0x1c, offset 0xb8
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8102, lo: 0xbc, hi: 0xbc},
+ {value: 0xa000, lo: 0xbf, hi: 0xbf},
+ // Block 0x1d, offset 0xbb
+ {value: 0x0000, lo: 0x09},
+ {value: 0x2ce6, lo: 0x80, hi: 0x80},
+ {value: 0x9900, lo: 0x82, hi: 0x82},
+ {value: 0xa000, lo: 0x86, hi: 0x86},
+ {value: 0x2cee, lo: 0x87, hi: 0x87},
+ {value: 0x2cf6, lo: 0x88, hi: 0x88},
+ {value: 0x2f50, lo: 0x8a, hi: 0x8a},
+ {value: 0x2dd8, lo: 0x8b, hi: 0x8b},
+ {value: 0x8104, lo: 0x8d, hi: 0x8d},
+ {value: 0x9900, lo: 0x95, hi: 0x96},
+ // Block 0x1e, offset 0xc5
+ {value: 0x0000, lo: 0x01},
+ {value: 0x9900, lo: 0xbe, hi: 0xbe},
+ // Block 0x1f, offset 0xc7
+ {value: 0x0000, lo: 0x06},
+ {value: 0xa000, lo: 0x86, hi: 0x87},
+ {value: 0x2cfe, lo: 0x8a, hi: 0x8a},
+ {value: 0x2d0e, lo: 0x8b, hi: 0x8b},
+ {value: 0x2d06, lo: 0x8c, hi: 0x8c},
+ {value: 0x8104, lo: 0x8d, hi: 0x8d},
+ {value: 0x9900, lo: 0x97, hi: 0x97},
+ // Block 0x20, offset 0xce
+ {value: 0x6bea, lo: 0x07},
+ {value: 0x9904, lo: 0x8a, hi: 0x8a},
+ {value: 0x9900, lo: 0x8f, hi: 0x8f},
+ {value: 0xa000, lo: 0x99, hi: 0x99},
+ {value: 0x3ef8, lo: 0x9a, hi: 0x9a},
+ {value: 0x2f58, lo: 0x9c, hi: 0x9c},
+ {value: 0x2de3, lo: 0x9d, hi: 0x9d},
+ {value: 0x2d16, lo: 0x9e, hi: 0x9f},
+ // Block 0x21, offset 0xd6
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8122, lo: 0xb8, hi: 0xb9},
+ {value: 0x8104, lo: 0xba, hi: 0xba},
+ // Block 0x22, offset 0xd9
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8123, lo: 0x88, hi: 0x8b},
+ // Block 0x23, offset 0xdb
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8124, lo: 0xb8, hi: 0xb9},
+ // Block 0x24, offset 0xdd
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8125, lo: 0x88, hi: 0x8b},
+ // Block 0x25, offset 0xdf
+ {value: 0x0000, lo: 0x04},
+ {value: 0x812d, lo: 0x98, hi: 0x99},
+ {value: 0x812d, lo: 0xb5, hi: 0xb5},
+ {value: 0x812d, lo: 0xb7, hi: 0xb7},
+ {value: 0x812b, lo: 0xb9, hi: 0xb9},
+ // Block 0x26, offset 0xe4
+ {value: 0x0000, lo: 0x10},
+ {value: 0x2644, lo: 0x83, hi: 0x83},
+ {value: 0x264b, lo: 0x8d, hi: 0x8d},
+ {value: 0x2652, lo: 0x92, hi: 0x92},
+ {value: 0x2659, lo: 0x97, hi: 0x97},
+ {value: 0x2660, lo: 0x9c, hi: 0x9c},
+ {value: 0x263d, lo: 0xa9, hi: 0xa9},
+ {value: 0x8126, lo: 0xb1, hi: 0xb1},
+ {value: 0x8127, lo: 0xb2, hi: 0xb2},
+ {value: 0x4a84, lo: 0xb3, hi: 0xb3},
+ {value: 0x8128, lo: 0xb4, hi: 0xb4},
+ {value: 0x4a8d, lo: 0xb5, hi: 0xb5},
+ {value: 0x45b4, lo: 0xb6, hi: 0xb6},
+ {value: 0x8200, lo: 0xb7, hi: 0xb7},
+ {value: 0x45bc, lo: 0xb8, hi: 0xb8},
+ {value: 0x8200, lo: 0xb9, hi: 0xb9},
+ {value: 0x8127, lo: 0xba, hi: 0xbd},
+ // Block 0x27, offset 0xf5
+ {value: 0x0000, lo: 0x0b},
+ {value: 0x8127, lo: 0x80, hi: 0x80},
+ {value: 0x4a96, lo: 0x81, hi: 0x81},
+ {value: 0x8132, lo: 0x82, hi: 0x83},
+ {value: 0x8104, lo: 0x84, hi: 0x84},
+ {value: 0x8132, lo: 0x86, hi: 0x87},
+ {value: 0x266e, lo: 0x93, hi: 0x93},
+ {value: 0x2675, lo: 0x9d, hi: 0x9d},
+ {value: 0x267c, lo: 0xa2, hi: 0xa2},
+ {value: 0x2683, lo: 0xa7, hi: 0xa7},
+ {value: 0x268a, lo: 0xac, hi: 0xac},
+ {value: 0x2667, lo: 0xb9, hi: 0xb9},
+ // Block 0x28, offset 0x101
+ {value: 0x0000, lo: 0x01},
+ {value: 0x812d, lo: 0x86, hi: 0x86},
+ // Block 0x29, offset 0x103
+ {value: 0x0000, lo: 0x05},
+ {value: 0xa000, lo: 0xa5, hi: 0xa5},
+ {value: 0x2d1e, lo: 0xa6, hi: 0xa6},
+ {value: 0x9900, lo: 0xae, hi: 0xae},
+ {value: 0x8102, lo: 0xb7, hi: 0xb7},
+ {value: 0x8104, lo: 0xb9, hi: 0xba},
+ // Block 0x2a, offset 0x109
+ {value: 0x0000, lo: 0x01},
+ {value: 0x812d, lo: 0x8d, hi: 0x8d},
+ // Block 0x2b, offset 0x10b
+ {value: 0x0000, lo: 0x01},
+ {value: 0xa000, lo: 0x80, hi: 0x92},
+ // Block 0x2c, offset 0x10d
+ {value: 0x0000, lo: 0x01},
+ {value: 0xb900, lo: 0xa1, hi: 0xb5},
+ // Block 0x2d, offset 0x10f
+ {value: 0x0000, lo: 0x01},
+ {value: 0x9900, lo: 0xa8, hi: 0xbf},
+ // Block 0x2e, offset 0x111
+ {value: 0x0000, lo: 0x01},
+ {value: 0x9900, lo: 0x80, hi: 0x82},
+ // Block 0x2f, offset 0x113
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8132, lo: 0x9d, hi: 0x9f},
+ // Block 0x30, offset 0x115
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8104, lo: 0x94, hi: 0x94},
+ {value: 0x8104, lo: 0xb4, hi: 0xb4},
+ // Block 0x31, offset 0x118
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8104, lo: 0x92, hi: 0x92},
+ {value: 0x8132, lo: 0x9d, hi: 0x9d},
+ // Block 0x32, offset 0x11b
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8131, lo: 0xa9, hi: 0xa9},
+ // Block 0x33, offset 0x11d
+ {value: 0x0004, lo: 0x02},
+ {value: 0x812e, lo: 0xb9, hi: 0xba},
+ {value: 0x812d, lo: 0xbb, hi: 0xbb},
+ // Block 0x34, offset 0x120
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8132, lo: 0x97, hi: 0x97},
+ {value: 0x812d, lo: 0x98, hi: 0x98},
+ // Block 0x35, offset 0x123
+ {value: 0x0000, lo: 0x03},
+ {value: 0x8104, lo: 0xa0, hi: 0xa0},
+ {value: 0x8132, lo: 0xb5, hi: 0xbc},
+ {value: 0x812d, lo: 0xbf, hi: 0xbf},
+ // Block 0x36, offset 0x127
+ {value: 0x0000, lo: 0x04},
+ {value: 0x8132, lo: 0xb0, hi: 0xb4},
+ {value: 0x812d, lo: 0xb5, hi: 0xba},
+ {value: 0x8132, lo: 0xbb, hi: 0xbc},
+ {value: 0x812d, lo: 0xbd, hi: 0xbd},
+ // Block 0x37, offset 0x12c
+ {value: 0x0000, lo: 0x08},
+ {value: 0x2d66, lo: 0x80, hi: 0x80},
+ {value: 0x2d6e, lo: 0x81, hi: 0x81},
+ {value: 0xa000, lo: 0x82, hi: 0x82},
+ {value: 0x2d76, lo: 0x83, hi: 0x83},
+ {value: 0x8104, lo: 0x84, hi: 0x84},
+ {value: 0x8132, lo: 0xab, hi: 0xab},
+ {value: 0x812d, lo: 0xac, hi: 0xac},
+ {value: 0x8132, lo: 0xad, hi: 0xb3},
+ // Block 0x38, offset 0x135
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8104, lo: 0xaa, hi: 0xab},
+ // Block 0x39, offset 0x137
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8102, lo: 0xa6, hi: 0xa6},
+ {value: 0x8104, lo: 0xb2, hi: 0xb3},
+ // Block 0x3a, offset 0x13a
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8102, lo: 0xb7, hi: 0xb7},
+ // Block 0x3b, offset 0x13c
+ {value: 0x0000, lo: 0x0a},
+ {value: 0x8132, lo: 0x90, hi: 0x92},
+ {value: 0x8101, lo: 0x94, hi: 0x94},
+ {value: 0x812d, lo: 0x95, hi: 0x99},
+ {value: 0x8132, lo: 0x9a, hi: 0x9b},
+ {value: 0x812d, lo: 0x9c, hi: 0x9f},
+ {value: 0x8132, lo: 0xa0, hi: 0xa0},
+ {value: 0x8101, lo: 0xa2, hi: 0xa8},
+ {value: 0x812d, lo: 0xad, hi: 0xad},
+ {value: 0x8132, lo: 0xb4, hi: 0xb4},
+ {value: 0x8132, lo: 0xb8, hi: 0xb9},
+ // Block 0x3c, offset 0x147
+ {value: 0x0000, lo: 0x0f},
+ {value: 0x8132, lo: 0x80, hi: 0x81},
+ {value: 0x812d, lo: 0x82, hi: 0x82},
+ {value: 0x8132, lo: 0x83, hi: 0x89},
+ {value: 0x812d, lo: 0x8a, hi: 0x8a},
+ {value: 0x8132, lo: 0x8b, hi: 0x8c},
+ {value: 0x8135, lo: 0x8d, hi: 0x8d},
+ {value: 0x812a, lo: 0x8e, hi: 0x8e},
+ {value: 0x812d, lo: 0x8f, hi: 0x8f},
+ {value: 0x8129, lo: 0x90, hi: 0x90},
+ {value: 0x8132, lo: 0x91, hi: 0xb5},
+ {value: 0x8132, lo: 0xbb, hi: 0xbb},
+ {value: 0x8134, lo: 0xbc, hi: 0xbc},
+ {value: 0x812d, lo: 0xbd, hi: 0xbd},
+ {value: 0x8132, lo: 0xbe, hi: 0xbe},
+ {value: 0x812d, lo: 0xbf, hi: 0xbf},
+ // Block 0x3d, offset 0x157
+ {value: 0x0004, lo: 0x03},
+ {value: 0x0433, lo: 0x80, hi: 0x81},
+ {value: 0x8100, lo: 0x97, hi: 0x97},
+ {value: 0x8100, lo: 0xbe, hi: 0xbe},
+ // Block 0x3e, offset 0x15b
+ {value: 0x0000, lo: 0x0d},
+ {value: 0x8132, lo: 0x90, hi: 0x91},
+ {value: 0x8101, lo: 0x92, hi: 0x93},
+ {value: 0x8132, lo: 0x94, hi: 0x97},
+ {value: 0x8101, lo: 0x98, hi: 0x9a},
+ {value: 0x8132, lo: 0x9b, hi: 0x9c},
+ {value: 0x8132, lo: 0xa1, hi: 0xa1},
+ {value: 0x8101, lo: 0xa5, hi: 0xa6},
+ {value: 0x8132, lo: 0xa7, hi: 0xa7},
+ {value: 0x812d, lo: 0xa8, hi: 0xa8},
+ {value: 0x8132, lo: 0xa9, hi: 0xa9},
+ {value: 0x8101, lo: 0xaa, hi: 0xab},
+ {value: 0x812d, lo: 0xac, hi: 0xaf},
+ {value: 0x8132, lo: 0xb0, hi: 0xb0},
+ // Block 0x3f, offset 0x169
+ {value: 0x427b, lo: 0x02},
+ {value: 0x01b8, lo: 0xa6, hi: 0xa6},
+ {value: 0x0057, lo: 0xaa, hi: 0xab},
+ // Block 0x40, offset 0x16c
+ {value: 0x0007, lo: 0x05},
+ {value: 0xa000, lo: 0x90, hi: 0x90},
+ {value: 0xa000, lo: 0x92, hi: 0x92},
+ {value: 0xa000, lo: 0x94, hi: 0x94},
+ {value: 0x3bb9, lo: 0x9a, hi: 0x9b},
+ {value: 0x3bc7, lo: 0xae, hi: 0xae},
+ // Block 0x41, offset 0x172
+ {value: 0x000e, lo: 0x05},
+ {value: 0x3bce, lo: 0x8d, hi: 0x8e},
+ {value: 0x3bd5, lo: 0x8f, hi: 0x8f},
+ {value: 0xa000, lo: 0x90, hi: 0x90},
+ {value: 0xa000, lo: 0x92, hi: 0x92},
+ {value: 0xa000, lo: 0x94, hi: 0x94},
+ // Block 0x42, offset 0x178
+ {value: 0x6408, lo: 0x0a},
+ {value: 0xa000, lo: 0x83, hi: 0x83},
+ {value: 0x3be3, lo: 0x84, hi: 0x84},
+ {value: 0xa000, lo: 0x88, hi: 0x88},
+ {value: 0x3bea, lo: 0x89, hi: 0x89},
+ {value: 0xa000, lo: 0x8b, hi: 0x8b},
+ {value: 0x3bf1, lo: 0x8c, hi: 0x8c},
+ {value: 0xa000, lo: 0xa3, hi: 0xa3},
+ {value: 0x3bf8, lo: 0xa4, hi: 0xa5},
+ {value: 0x3bff, lo: 0xa6, hi: 0xa6},
+ {value: 0xa000, lo: 0xbc, hi: 0xbc},
+ // Block 0x43, offset 0x183
+ {value: 0x0007, lo: 0x03},
+ {value: 0x3c68, lo: 0xa0, hi: 0xa1},
+ {value: 0x3c92, lo: 0xa2, hi: 0xa3},
+ {value: 0x3cbc, lo: 0xaa, hi: 0xad},
+ // Block 0x44, offset 0x187
+ {value: 0x0004, lo: 0x01},
+ {value: 0x048b, lo: 0xa9, hi: 0xaa},
+ // Block 0x45, offset 0x189
+ {value: 0x0000, lo: 0x01},
+ {value: 0x44dd, lo: 0x9c, hi: 0x9c},
+ // Block 0x46, offset 0x18b
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8132, lo: 0xaf, hi: 0xb1},
+ // Block 0x47, offset 0x18d
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8104, lo: 0xbf, hi: 0xbf},
+ // Block 0x48, offset 0x18f
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8132, lo: 0xa0, hi: 0xbf},
+ // Block 0x49, offset 0x191
+ {value: 0x0000, lo: 0x05},
+ {value: 0x812c, lo: 0xaa, hi: 0xaa},
+ {value: 0x8131, lo: 0xab, hi: 0xab},
+ {value: 0x8133, lo: 0xac, hi: 0xac},
+ {value: 0x812e, lo: 0xad, hi: 0xad},
+ {value: 0x812f, lo: 0xae, hi: 0xaf},
+ // Block 0x4a, offset 0x197
+ {value: 0x0000, lo: 0x03},
+ {value: 0x4a9f, lo: 0xb3, hi: 0xb3},
+ {value: 0x4a9f, lo: 0xb5, hi: 0xb6},
+ {value: 0x4a9f, lo: 0xba, hi: 0xbf},
+ // Block 0x4b, offset 0x19b
+ {value: 0x0000, lo: 0x01},
+ {value: 0x4a9f, lo: 0x8f, hi: 0xa3},
+ // Block 0x4c, offset 0x19d
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8100, lo: 0xae, hi: 0xbe},
+ // Block 0x4d, offset 0x19f
+ {value: 0x0000, lo: 0x07},
+ {value: 0x8100, lo: 0x84, hi: 0x84},
+ {value: 0x8100, lo: 0x87, hi: 0x87},
+ {value: 0x8100, lo: 0x90, hi: 0x90},
+ {value: 0x8100, lo: 0x9e, hi: 0x9e},
+ {value: 0x8100, lo: 0xa1, hi: 0xa1},
+ {value: 0x8100, lo: 0xb2, hi: 0xb2},
+ {value: 0x8100, lo: 0xbb, hi: 0xbb},
+ // Block 0x4e, offset 0x1a7
+ {value: 0x0000, lo: 0x03},
+ {value: 0x8100, lo: 0x80, hi: 0x80},
+ {value: 0x8100, lo: 0x8b, hi: 0x8b},
+ {value: 0x8100, lo: 0x8e, hi: 0x8e},
+ // Block 0x4f, offset 0x1ab
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8132, lo: 0xaf, hi: 0xaf},
+ {value: 0x8132, lo: 0xb4, hi: 0xbd},
+ // Block 0x50, offset 0x1ae
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8132, lo: 0x9e, hi: 0x9f},
+ // Block 0x51, offset 0x1b0
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8132, lo: 0xb0, hi: 0xb1},
+ // Block 0x52, offset 0x1b2
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8104, lo: 0x86, hi: 0x86},
+ // Block 0x53, offset 0x1b4
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8104, lo: 0x84, hi: 0x84},
+ {value: 0x8132, lo: 0xa0, hi: 0xb1},
+ // Block 0x54, offset 0x1b7
+ {value: 0x0000, lo: 0x01},
+ {value: 0x812d, lo: 0xab, hi: 0xad},
+ // Block 0x55, offset 0x1b9
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8104, lo: 0x93, hi: 0x93},
+ // Block 0x56, offset 0x1bb
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8102, lo: 0xb3, hi: 0xb3},
+ // Block 0x57, offset 0x1bd
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8104, lo: 0x80, hi: 0x80},
+ // Block 0x58, offset 0x1bf
+ {value: 0x0000, lo: 0x05},
+ {value: 0x8132, lo: 0xb0, hi: 0xb0},
+ {value: 0x8132, lo: 0xb2, hi: 0xb3},
+ {value: 0x812d, lo: 0xb4, hi: 0xb4},
+ {value: 0x8132, lo: 0xb7, hi: 0xb8},
+ {value: 0x8132, lo: 0xbe, hi: 0xbf},
+ // Block 0x59, offset 0x1c5
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8132, lo: 0x81, hi: 0x81},
+ {value: 0x8104, lo: 0xb6, hi: 0xb6},
+ // Block 0x5a, offset 0x1c8
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8104, lo: 0xad, hi: 0xad},
+ // Block 0x5b, offset 0x1ca
+ {value: 0x0000, lo: 0x06},
+ {value: 0xe500, lo: 0x80, hi: 0x80},
+ {value: 0xc600, lo: 0x81, hi: 0x9b},
+ {value: 0xe500, lo: 0x9c, hi: 0x9c},
+ {value: 0xc600, lo: 0x9d, hi: 0xb7},
+ {value: 0xe500, lo: 0xb8, hi: 0xb8},
+ {value: 0xc600, lo: 0xb9, hi: 0xbf},
+ // Block 0x5c, offset 0x1d1
+ {value: 0x0000, lo: 0x05},
+ {value: 0xc600, lo: 0x80, hi: 0x93},
+ {value: 0xe500, lo: 0x94, hi: 0x94},
+ {value: 0xc600, lo: 0x95, hi: 0xaf},
+ {value: 0xe500, lo: 0xb0, hi: 0xb0},
+ {value: 0xc600, lo: 0xb1, hi: 0xbf},
+ // Block 0x5d, offset 0x1d7
+ {value: 0x0000, lo: 0x05},
+ {value: 0xc600, lo: 0x80, hi: 0x8b},
+ {value: 0xe500, lo: 0x8c, hi: 0x8c},
+ {value: 0xc600, lo: 0x8d, hi: 0xa7},
+ {value: 0xe500, lo: 0xa8, hi: 0xa8},
+ {value: 0xc600, lo: 0xa9, hi: 0xbf},
+ // Block 0x5e, offset 0x1dd
+ {value: 0x0000, lo: 0x07},
+ {value: 0xc600, lo: 0x80, hi: 0x83},
+ {value: 0xe500, lo: 0x84, hi: 0x84},
+ {value: 0xc600, lo: 0x85, hi: 0x9f},
+ {value: 0xe500, lo: 0xa0, hi: 0xa0},
+ {value: 0xc600, lo: 0xa1, hi: 0xbb},
+ {value: 0xe500, lo: 0xbc, hi: 0xbc},
+ {value: 0xc600, lo: 0xbd, hi: 0xbf},
+ // Block 0x5f, offset 0x1e5
+ {value: 0x0000, lo: 0x05},
+ {value: 0xc600, lo: 0x80, hi: 0x97},
+ {value: 0xe500, lo: 0x98, hi: 0x98},
+ {value: 0xc600, lo: 0x99, hi: 0xb3},
+ {value: 0xe500, lo: 0xb4, hi: 0xb4},
+ {value: 0xc600, lo: 0xb5, hi: 0xbf},
+ // Block 0x60, offset 0x1eb
+ {value: 0x0000, lo: 0x05},
+ {value: 0xc600, lo: 0x80, hi: 0x8f},
+ {value: 0xe500, lo: 0x90, hi: 0x90},
+ {value: 0xc600, lo: 0x91, hi: 0xab},
+ {value: 0xe500, lo: 0xac, hi: 0xac},
+ {value: 0xc600, lo: 0xad, hi: 0xbf},
+ // Block 0x61, offset 0x1f1
+ {value: 0x0000, lo: 0x05},
+ {value: 0xc600, lo: 0x80, hi: 0x87},
+ {value: 0xe500, lo: 0x88, hi: 0x88},
+ {value: 0xc600, lo: 0x89, hi: 0xa3},
+ {value: 0xe500, lo: 0xa4, hi: 0xa4},
+ {value: 0xc600, lo: 0xa5, hi: 0xbf},
+ // Block 0x62, offset 0x1f7
+ {value: 0x0000, lo: 0x03},
+ {value: 0xc600, lo: 0x80, hi: 0x87},
+ {value: 0xe500, lo: 0x88, hi: 0x88},
+ {value: 0xc600, lo: 0x89, hi: 0xa3},
+ // Block 0x63, offset 0x1fb
+ {value: 0x0006, lo: 0x0d},
+ {value: 0x4390, lo: 0x9d, hi: 0x9d},
+ {value: 0x8115, lo: 0x9e, hi: 0x9e},
+ {value: 0x4402, lo: 0x9f, hi: 0x9f},
+ {value: 0x43f0, lo: 0xaa, hi: 0xab},
+ {value: 0x44f4, lo: 0xac, hi: 0xac},
+ {value: 0x44fc, lo: 0xad, hi: 0xad},
+ {value: 0x4348, lo: 0xae, hi: 0xb1},
+ {value: 0x4366, lo: 0xb2, hi: 0xb4},
+ {value: 0x437e, lo: 0xb5, hi: 0xb6},
+ {value: 0x438a, lo: 0xb8, hi: 0xb8},
+ {value: 0x4396, lo: 0xb9, hi: 0xbb},
+ {value: 0x43ae, lo: 0xbc, hi: 0xbc},
+ {value: 0x43b4, lo: 0xbe, hi: 0xbe},
+ // Block 0x64, offset 0x209
+ {value: 0x0006, lo: 0x08},
+ {value: 0x43ba, lo: 0x80, hi: 0x81},
+ {value: 0x43c6, lo: 0x83, hi: 0x84},
+ {value: 0x43d8, lo: 0x86, hi: 0x89},
+ {value: 0x43fc, lo: 0x8a, hi: 0x8a},
+ {value: 0x4378, lo: 0x8b, hi: 0x8b},
+ {value: 0x4360, lo: 0x8c, hi: 0x8c},
+ {value: 0x43a8, lo: 0x8d, hi: 0x8d},
+ {value: 0x43d2, lo: 0x8e, hi: 0x8e},
+ // Block 0x65, offset 0x212
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8100, lo: 0xa4, hi: 0xa5},
+ {value: 0x8100, lo: 0xb0, hi: 0xb1},
+ // Block 0x66, offset 0x215
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8100, lo: 0x9b, hi: 0x9d},
+ {value: 0x8200, lo: 0x9e, hi: 0xa3},
+ // Block 0x67, offset 0x218
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8100, lo: 0x90, hi: 0x90},
+ // Block 0x68, offset 0x21a
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8100, lo: 0x99, hi: 0x99},
+ {value: 0x8200, lo: 0xb2, hi: 0xb4},
+ // Block 0x69, offset 0x21d
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8100, lo: 0xbc, hi: 0xbd},
+ // Block 0x6a, offset 0x21f
+ {value: 0x0000, lo: 0x03},
+ {value: 0x8132, lo: 0xa0, hi: 0xa6},
+ {value: 0x812d, lo: 0xa7, hi: 0xad},
+ {value: 0x8132, lo: 0xae, hi: 0xaf},
+ // Block 0x6b, offset 0x223
+ {value: 0x0000, lo: 0x04},
+ {value: 0x8100, lo: 0x89, hi: 0x8c},
+ {value: 0x8100, lo: 0xb0, hi: 0xb2},
+ {value: 0x8100, lo: 0xb4, hi: 0xb4},
+ {value: 0x8100, lo: 0xb6, hi: 0xbf},
+ // Block 0x6c, offset 0x228
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8100, lo: 0x81, hi: 0x8c},
+ // Block 0x6d, offset 0x22a
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8100, lo: 0xb5, hi: 0xba},
+ // Block 0x6e, offset 0x22c
+ {value: 0x0000, lo: 0x04},
+ {value: 0x4a9f, lo: 0x9e, hi: 0x9f},
+ {value: 0x4a9f, lo: 0xa3, hi: 0xa3},
+ {value: 0x4a9f, lo: 0xa5, hi: 0xa6},
+ {value: 0x4a9f, lo: 0xaa, hi: 0xaf},
+ // Block 0x6f, offset 0x231
+ {value: 0x0000, lo: 0x05},
+ {value: 0x4a9f, lo: 0x82, hi: 0x87},
+ {value: 0x4a9f, lo: 0x8a, hi: 0x8f},
+ {value: 0x4a9f, lo: 0x92, hi: 0x97},
+ {value: 0x4a9f, lo: 0x9a, hi: 0x9c},
+ {value: 0x8100, lo: 0xa3, hi: 0xa3},
+ // Block 0x70, offset 0x237
+ {value: 0x0000, lo: 0x01},
+ {value: 0x812d, lo: 0xbd, hi: 0xbd},
+ // Block 0x71, offset 0x239
+ {value: 0x0000, lo: 0x01},
+ {value: 0x812d, lo: 0xa0, hi: 0xa0},
+ // Block 0x72, offset 0x23b
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8132, lo: 0xb6, hi: 0xba},
+ // Block 0x73, offset 0x23d
+ {value: 0x002c, lo: 0x05},
+ {value: 0x812d, lo: 0x8d, hi: 0x8d},
+ {value: 0x8132, lo: 0x8f, hi: 0x8f},
+ {value: 0x8132, lo: 0xb8, hi: 0xb8},
+ {value: 0x8101, lo: 0xb9, hi: 0xba},
+ {value: 0x8104, lo: 0xbf, hi: 0xbf},
+ // Block 0x74, offset 0x243
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8132, lo: 0xa5, hi: 0xa5},
+ {value: 0x812d, lo: 0xa6, hi: 0xa6},
+ // Block 0x75, offset 0x246
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8104, lo: 0x86, hi: 0x86},
+ {value: 0x8104, lo: 0xbf, hi: 0xbf},
+ // Block 0x76, offset 0x249
+ {value: 0x17fe, lo: 0x07},
+ {value: 0xa000, lo: 0x99, hi: 0x99},
+ {value: 0x4238, lo: 0x9a, hi: 0x9a},
+ {value: 0xa000, lo: 0x9b, hi: 0x9b},
+ {value: 0x4242, lo: 0x9c, hi: 0x9c},
+ {value: 0xa000, lo: 0xa5, hi: 0xa5},
+ {value: 0x424c, lo: 0xab, hi: 0xab},
+ {value: 0x8104, lo: 0xb9, hi: 0xba},
+ // Block 0x77, offset 0x251
+ {value: 0x0000, lo: 0x06},
+ {value: 0x8132, lo: 0x80, hi: 0x82},
+ {value: 0x9900, lo: 0xa7, hi: 0xa7},
+ {value: 0x2d7e, lo: 0xae, hi: 0xae},
+ {value: 0x2d88, lo: 0xaf, hi: 0xaf},
+ {value: 0xa000, lo: 0xb1, hi: 0xb2},
+ {value: 0x8104, lo: 0xb3, hi: 0xb4},
+ // Block 0x78, offset 0x258
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8104, lo: 0x80, hi: 0x80},
+ {value: 0x8102, lo: 0x8a, hi: 0x8a},
+ // Block 0x79, offset 0x25b
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8104, lo: 0xb5, hi: 0xb5},
+ {value: 0x8102, lo: 0xb6, hi: 0xb6},
+ // Block 0x7a, offset 0x25e
+ {value: 0x0002, lo: 0x01},
+ {value: 0x8102, lo: 0xa9, hi: 0xaa},
+ // Block 0x7b, offset 0x260
+ {value: 0x0000, lo: 0x07},
+ {value: 0xa000, lo: 0x87, hi: 0x87},
+ {value: 0x2d92, lo: 0x8b, hi: 0x8b},
+ {value: 0x2d9c, lo: 0x8c, hi: 0x8c},
+ {value: 0x8104, lo: 0x8d, hi: 0x8d},
+ {value: 0x9900, lo: 0x97, hi: 0x97},
+ {value: 0x8132, lo: 0xa6, hi: 0xac},
+ {value: 0x8132, lo: 0xb0, hi: 0xb4},
+ // Block 0x7c, offset 0x268
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8104, lo: 0x82, hi: 0x82},
+ {value: 0x8102, lo: 0x86, hi: 0x86},
+ // Block 0x7d, offset 0x26b
+ {value: 0x6b5a, lo: 0x06},
+ {value: 0x9900, lo: 0xb0, hi: 0xb0},
+ {value: 0xa000, lo: 0xb9, hi: 0xb9},
+ {value: 0x9900, lo: 0xba, hi: 0xba},
+ {value: 0x2db0, lo: 0xbb, hi: 0xbb},
+ {value: 0x2da6, lo: 0xbc, hi: 0xbd},
+ {value: 0x2dba, lo: 0xbe, hi: 0xbe},
+ // Block 0x7e, offset 0x272
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8104, lo: 0x82, hi: 0x82},
+ {value: 0x8102, lo: 0x83, hi: 0x83},
+ // Block 0x7f, offset 0x275
+ {value: 0x0000, lo: 0x05},
+ {value: 0x9900, lo: 0xaf, hi: 0xaf},
+ {value: 0xa000, lo: 0xb8, hi: 0xb9},
+ {value: 0x2dc4, lo: 0xba, hi: 0xba},
+ {value: 0x2dce, lo: 0xbb, hi: 0xbb},
+ {value: 0x8104, lo: 0xbf, hi: 0xbf},
+ // Block 0x80, offset 0x27b
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8102, lo: 0x80, hi: 0x80},
+ // Block 0x81, offset 0x27d
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8104, lo: 0xb6, hi: 0xb6},
+ {value: 0x8102, lo: 0xb7, hi: 0xb7},
+ // Block 0x82, offset 0x280
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8104, lo: 0xab, hi: 0xab},
+ // Block 0x83, offset 0x282
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8101, lo: 0xb0, hi: 0xb4},
+ // Block 0x84, offset 0x284
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8132, lo: 0xb0, hi: 0xb6},
+ // Block 0x85, offset 0x286
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8101, lo: 0x9e, hi: 0x9e},
+ // Block 0x86, offset 0x288
+ {value: 0x0000, lo: 0x0c},
+ {value: 0x45cc, lo: 0x9e, hi: 0x9e},
+ {value: 0x45d6, lo: 0x9f, hi: 0x9f},
+ {value: 0x460a, lo: 0xa0, hi: 0xa0},
+ {value: 0x4618, lo: 0xa1, hi: 0xa1},
+ {value: 0x4626, lo: 0xa2, hi: 0xa2},
+ {value: 0x4634, lo: 0xa3, hi: 0xa3},
+ {value: 0x4642, lo: 0xa4, hi: 0xa4},
+ {value: 0x812b, lo: 0xa5, hi: 0xa6},
+ {value: 0x8101, lo: 0xa7, hi: 0xa9},
+ {value: 0x8130, lo: 0xad, hi: 0xad},
+ {value: 0x812b, lo: 0xae, hi: 0xb2},
+ {value: 0x812d, lo: 0xbb, hi: 0xbf},
+ // Block 0x87, offset 0x295
+ {value: 0x0000, lo: 0x09},
+ {value: 0x812d, lo: 0x80, hi: 0x82},
+ {value: 0x8132, lo: 0x85, hi: 0x89},
+ {value: 0x812d, lo: 0x8a, hi: 0x8b},
+ {value: 0x8132, lo: 0xaa, hi: 0xad},
+ {value: 0x45e0, lo: 0xbb, hi: 0xbb},
+ {value: 0x45ea, lo: 0xbc, hi: 0xbc},
+ {value: 0x4650, lo: 0xbd, hi: 0xbd},
+ {value: 0x466c, lo: 0xbe, hi: 0xbe},
+ {value: 0x465e, lo: 0xbf, hi: 0xbf},
+ // Block 0x88, offset 0x29f
+ {value: 0x0000, lo: 0x01},
+ {value: 0x467a, lo: 0x80, hi: 0x80},
+ // Block 0x89, offset 0x2a1
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8132, lo: 0x82, hi: 0x84},
+ // Block 0x8a, offset 0x2a3
+ {value: 0x0000, lo: 0x05},
+ {value: 0x8132, lo: 0x80, hi: 0x86},
+ {value: 0x8132, lo: 0x88, hi: 0x98},
+ {value: 0x8132, lo: 0x9b, hi: 0xa1},
+ {value: 0x8132, lo: 0xa3, hi: 0xa4},
+ {value: 0x8132, lo: 0xa6, hi: 0xaa},
+ // Block 0x8b, offset 0x2a9
+ {value: 0x0000, lo: 0x01},
+ {value: 0x812d, lo: 0x90, hi: 0x96},
+ // Block 0x8c, offset 0x2ab
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8132, lo: 0x84, hi: 0x89},
+ {value: 0x8102, lo: 0x8a, hi: 0x8a},
+ // Block 0x8d, offset 0x2ae
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8100, lo: 0x93, hi: 0x93},
+}
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *nfkcTrie) lookup(s []byte) (v uint16, sz int) {
+ c0 := s[0]
+ switch {
+ case c0 < 0x80: // is ASCII
+ return nfkcValues[c0], 1
+ case c0 < 0xC2:
+ return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+ case c0 < 0xE0: // 2-byte UTF-8
+ if len(s) < 2 {
+ return 0, 0
+ }
+ i := nfkcIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c1), 2
+ case c0 < 0xF0: // 3-byte UTF-8
+ if len(s) < 3 {
+ return 0, 0
+ }
+ i := nfkcIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = nfkcIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c2), 3
+ case c0 < 0xF8: // 4-byte UTF-8
+ if len(s) < 4 {
+ return 0, 0
+ }
+ i := nfkcIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = nfkcIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ o = uint32(i)<<6 + uint32(c2)
+ i = nfkcIndex[o]
+ c3 := s[3]
+ if c3 < 0x80 || 0xC0 <= c3 {
+ return 0, 3 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c3), 4
+ }
+ // Illegal rune
+ return 0, 1
+}
+
+// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *nfkcTrie) lookupUnsafe(s []byte) uint16 {
+ c0 := s[0]
+ if c0 < 0x80 { // is ASCII
+ return nfkcValues[c0]
+ }
+ i := nfkcIndex[c0]
+ if c0 < 0xE0 { // 2-byte UTF-8
+ return t.lookupValue(uint32(i), s[1])
+ }
+ i = nfkcIndex[uint32(i)<<6+uint32(s[1])]
+ if c0 < 0xF0 { // 3-byte UTF-8
+ return t.lookupValue(uint32(i), s[2])
+ }
+ i = nfkcIndex[uint32(i)<<6+uint32(s[2])]
+ if c0 < 0xF8 { // 4-byte UTF-8
+ return t.lookupValue(uint32(i), s[3])
+ }
+ return 0
+}
+
+// lookupString returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *nfkcTrie) lookupString(s string) (v uint16, sz int) {
+ c0 := s[0]
+ switch {
+ case c0 < 0x80: // is ASCII
+ return nfkcValues[c0], 1
+ case c0 < 0xC2:
+ return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+ case c0 < 0xE0: // 2-byte UTF-8
+ if len(s) < 2 {
+ return 0, 0
+ }
+ i := nfkcIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c1), 2
+ case c0 < 0xF0: // 3-byte UTF-8
+ if len(s) < 3 {
+ return 0, 0
+ }
+ i := nfkcIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = nfkcIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c2), 3
+ case c0 < 0xF8: // 4-byte UTF-8
+ if len(s) < 4 {
+ return 0, 0
+ }
+ i := nfkcIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = nfkcIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ o = uint32(i)<<6 + uint32(c2)
+ i = nfkcIndex[o]
+ c3 := s[3]
+ if c3 < 0x80 || 0xC0 <= c3 {
+ return 0, 3 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c3), 4
+ }
+ // Illegal rune
+ return 0, 1
+}
+
+// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *nfkcTrie) lookupStringUnsafe(s string) uint16 {
+ c0 := s[0]
+ if c0 < 0x80 { // is ASCII
+ return nfkcValues[c0]
+ }
+ i := nfkcIndex[c0]
+ if c0 < 0xE0 { // 2-byte UTF-8
+ return t.lookupValue(uint32(i), s[1])
+ }
+ i = nfkcIndex[uint32(i)<<6+uint32(s[1])]
+ if c0 < 0xF0 { // 3-byte UTF-8
+ return t.lookupValue(uint32(i), s[2])
+ }
+ i = nfkcIndex[uint32(i)<<6+uint32(s[2])]
+ if c0 < 0xF8 { // 4-byte UTF-8
+ return t.lookupValue(uint32(i), s[3])
+ }
+ return 0
+}
+
+// nfkcTrie. Total size: 16994 bytes (16.60 KiB). Checksum: c3ed54ee046f3c46.
+type nfkcTrie struct{}
+
+func newNfkcTrie(i int) *nfkcTrie {
+ return &nfkcTrie{}
+}
+
+// lookupValue determines the type of block n and looks up the value for b.
+func (t *nfkcTrie) lookupValue(n uint32, b byte) uint16 {
+ switch {
+ case n < 90:
+ return uint16(nfkcValues[n<<6+uint32(b)])
+ default:
+ n -= 90
+ return uint16(nfkcSparse.lookup(n, b))
+ }
+}
+
+// nfkcValues: 92 blocks, 5888 entries, 11776 bytes
+// The third block is the zero block.
+var nfkcValues = [5888]uint16{
+ // Block 0x0, offset 0x0
+ 0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000,
+ // Block 0x1, offset 0x40
+ 0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000,
+ 0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000,
+ 0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000,
+ 0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000,
+ 0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000,
+ 0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000,
+ 0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000,
+ 0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000,
+ 0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000,
+ 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000,
+ // Block 0x2, offset 0x80
+ // Block 0x3, offset 0xc0
+ 0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c,
+ 0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb,
+ 0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104,
+ 0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd,
+ 0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235,
+ 0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285,
+ 0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3,
+ 0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750,
+ 0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f,
+ 0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3,
+ 0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569,
+ // Block 0x4, offset 0x100
+ 0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8,
+ 0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6,
+ 0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5,
+ 0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302,
+ 0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339,
+ 0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352,
+ 0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e,
+ 0x12a: 0x3082, 0x12b: 0x3393, 0x12c: 0x3087, 0x12d: 0x3398, 0x12e: 0x30aa, 0x12f: 0x33b6,
+ 0x130: 0x308c, 0x132: 0x195d, 0x133: 0x19e7, 0x134: 0x30b4, 0x135: 0x33c0,
+ 0x136: 0x30c8, 0x137: 0x33d9, 0x139: 0x30d2, 0x13a: 0x33e3, 0x13b: 0x30dc,
+ 0x13c: 0x33ed, 0x13d: 0x30d7, 0x13e: 0x33e8, 0x13f: 0x1bac,
+ // Block 0x5, offset 0x140
+ 0x140: 0x1c34, 0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118,
+ 0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f, 0x149: 0x1c5c,
+ 0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c,
+ 0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483,
+ 0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d,
+ 0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba,
+ 0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796,
+ 0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2,
+ 0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528,
+ 0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267,
+ 0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0x00a7,
+ // Block 0x6, offset 0x180
+ 0x184: 0x2dee, 0x185: 0x2df4,
+ 0x186: 0x2dfa, 0x187: 0x1972, 0x188: 0x1975, 0x189: 0x1a08, 0x18a: 0x1987, 0x18b: 0x198a,
+ 0x18c: 0x1a3e, 0x18d: 0x2f88, 0x18e: 0x3294, 0x18f: 0x3096, 0x190: 0x33a2, 0x191: 0x3140,
+ 0x192: 0x3451, 0x193: 0x31d6, 0x194: 0x34ec, 0x195: 0x39cf, 0x196: 0x3b5e, 0x197: 0x39c8,
+ 0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50,
+ 0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5,
+ 0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf,
+ 0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd,
+ 0x1b0: 0x33c5, 0x1b1: 0x1942, 0x1b2: 0x1945, 0x1b3: 0x19cf, 0x1b4: 0x3028, 0x1b5: 0x3334,
+ 0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46,
+ 0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb,
+ // Block 0x7, offset 0x1c0
+ 0x1c0: 0x2f8d, 0x1c1: 0x3299, 0x1c2: 0x2f92, 0x1c3: 0x329e, 0x1c4: 0x300a, 0x1c5: 0x3316,
+ 0x1c6: 0x300f, 0x1c7: 0x331b, 0x1c8: 0x309b, 0x1c9: 0x33a7, 0x1ca: 0x30a0, 0x1cb: 0x33ac,
+ 0x1cc: 0x3145, 0x1cd: 0x3456, 0x1ce: 0x314a, 0x1cf: 0x345b, 0x1d0: 0x3168, 0x1d1: 0x3479,
+ 0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6,
+ 0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5,
+ 0x1de: 0x305a, 0x1df: 0x3366,
+ 0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b,
+ 0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769,
+ 0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f,
+ // Block 0x8, offset 0x200
+ 0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132,
+ 0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932,
+ 0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932,
+ 0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d,
+ 0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d,
+ 0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d,
+ 0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d,
+ 0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d,
+ 0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101,
+ 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d,
+ 0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132,
+ // Block 0x9, offset 0x240
+ 0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936,
+ 0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132,
+ 0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132,
+ 0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132,
+ 0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135,
+ 0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132,
+ 0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132,
+ 0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132,
+ 0x274: 0x0170,
+ 0x27a: 0x42a5,
+ 0x27e: 0x0037,
+ // Block 0xa, offset 0x280
+ 0x284: 0x425a, 0x285: 0x447b,
+ 0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625,
+ 0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000,
+ 0x295: 0xa000, 0x297: 0xa000,
+ 0x299: 0xa000,
+ 0x29f: 0xa000, 0x2a1: 0xa000,
+ 0x2a5: 0xa000, 0x2a9: 0xa000,
+ 0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9,
+ 0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000,
+ 0x2b7: 0xa000, 0x2b9: 0xa000,
+ 0x2bf: 0xa000,
+ // Block 0xb, offset 0x2c0
+ 0x2c1: 0xa000, 0x2c5: 0xa000,
+ 0x2c9: 0xa000, 0x2ca: 0x4840, 0x2cb: 0x485e,
+ 0x2cc: 0x36c7, 0x2cd: 0x36df, 0x2ce: 0x4876, 0x2d0: 0x01be, 0x2d1: 0x01d0,
+ 0x2d2: 0x01ac, 0x2d3: 0x430c, 0x2d4: 0x4312, 0x2d5: 0x01fa, 0x2d6: 0x01e8,
+ 0x2f0: 0x01d6, 0x2f1: 0x01eb, 0x2f2: 0x01ee, 0x2f4: 0x0188, 0x2f5: 0x01c7,
+ 0x2f9: 0x01a6,
+ // Block 0xc, offset 0x300
+ 0x300: 0x3721, 0x301: 0x372d, 0x303: 0x371b,
+ 0x306: 0xa000, 0x307: 0x3709,
+ 0x30c: 0x375d, 0x30d: 0x3745, 0x30e: 0x376f, 0x310: 0xa000,
+ 0x313: 0xa000, 0x315: 0xa000, 0x316: 0xa000, 0x317: 0xa000,
+ 0x318: 0xa000, 0x319: 0x3751, 0x31a: 0xa000,
+ 0x31e: 0xa000, 0x323: 0xa000,
+ 0x327: 0xa000,
+ 0x32b: 0xa000, 0x32d: 0xa000,
+ 0x330: 0xa000, 0x333: 0xa000, 0x335: 0xa000,
+ 0x336: 0xa000, 0x337: 0xa000, 0x338: 0xa000, 0x339: 0x37d5, 0x33a: 0xa000,
+ 0x33e: 0xa000,
+ // Block 0xd, offset 0x340
+ 0x341: 0x3733, 0x342: 0x37b7,
+ 0x350: 0x370f, 0x351: 0x3793,
+ 0x352: 0x3715, 0x353: 0x3799, 0x356: 0x3727, 0x357: 0x37ab,
+ 0x358: 0xa000, 0x359: 0xa000, 0x35a: 0x3829, 0x35b: 0x382f, 0x35c: 0x3739, 0x35d: 0x37bd,
+ 0x35e: 0x373f, 0x35f: 0x37c3, 0x362: 0x374b, 0x363: 0x37cf,
+ 0x364: 0x3757, 0x365: 0x37db, 0x366: 0x3763, 0x367: 0x37e7, 0x368: 0xa000, 0x369: 0xa000,
+ 0x36a: 0x3835, 0x36b: 0x383b, 0x36c: 0x378d, 0x36d: 0x3811, 0x36e: 0x3769, 0x36f: 0x37ed,
+ 0x370: 0x3775, 0x371: 0x37f9, 0x372: 0x377b, 0x373: 0x37ff, 0x374: 0x3781, 0x375: 0x3805,
+ 0x378: 0x3787, 0x379: 0x380b,
+ // Block 0xe, offset 0x380
+ 0x387: 0x1d61,
+ 0x391: 0x812d,
+ 0x392: 0x8132, 0x393: 0x8132, 0x394: 0x8132, 0x395: 0x8132, 0x396: 0x812d, 0x397: 0x8132,
+ 0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x812e, 0x39b: 0x812d, 0x39c: 0x8132, 0x39d: 0x8132,
+ 0x39e: 0x8132, 0x39f: 0x8132, 0x3a0: 0x8132, 0x3a1: 0x8132, 0x3a2: 0x812d, 0x3a3: 0x812d,
+ 0x3a4: 0x812d, 0x3a5: 0x812d, 0x3a6: 0x812d, 0x3a7: 0x812d, 0x3a8: 0x8132, 0x3a9: 0x8132,
+ 0x3aa: 0x812d, 0x3ab: 0x8132, 0x3ac: 0x8132, 0x3ad: 0x812e, 0x3ae: 0x8131, 0x3af: 0x8132,
+ 0x3b0: 0x8105, 0x3b1: 0x8106, 0x3b2: 0x8107, 0x3b3: 0x8108, 0x3b4: 0x8109, 0x3b5: 0x810a,
+ 0x3b6: 0x810b, 0x3b7: 0x810c, 0x3b8: 0x810d, 0x3b9: 0x810e, 0x3ba: 0x810e, 0x3bb: 0x810f,
+ 0x3bc: 0x8110, 0x3bd: 0x8111, 0x3bf: 0x8112,
+ // Block 0xf, offset 0x3c0
+ 0x3c8: 0xa000, 0x3ca: 0xa000, 0x3cb: 0x8116,
+ 0x3cc: 0x8117, 0x3cd: 0x8118, 0x3ce: 0x8119, 0x3cf: 0x811a, 0x3d0: 0x811b, 0x3d1: 0x811c,
+ 0x3d2: 0x811d, 0x3d3: 0x9932, 0x3d4: 0x9932, 0x3d5: 0x992d, 0x3d6: 0x812d, 0x3d7: 0x8132,
+ 0x3d8: 0x8132, 0x3d9: 0x8132, 0x3da: 0x8132, 0x3db: 0x8132, 0x3dc: 0x812d, 0x3dd: 0x8132,
+ 0x3de: 0x8132, 0x3df: 0x812d,
+ 0x3f0: 0x811e, 0x3f5: 0x1d84,
+ 0x3f6: 0x2013, 0x3f7: 0x204f, 0x3f8: 0x204a,
+ // Block 0x10, offset 0x400
+ 0x405: 0xa000,
+ 0x406: 0x2d26, 0x407: 0xa000, 0x408: 0x2d2e, 0x409: 0xa000, 0x40a: 0x2d36, 0x40b: 0xa000,
+ 0x40c: 0x2d3e, 0x40d: 0xa000, 0x40e: 0x2d46, 0x411: 0xa000,
+ 0x412: 0x2d4e,
+ 0x434: 0x8102, 0x435: 0x9900,
+ 0x43a: 0xa000, 0x43b: 0x2d56,
+ 0x43c: 0xa000, 0x43d: 0x2d5e, 0x43e: 0xa000, 0x43f: 0xa000,
+ // Block 0x11, offset 0x440
+ 0x440: 0x0069, 0x441: 0x006b, 0x442: 0x006f, 0x443: 0x0083, 0x444: 0x00f5, 0x445: 0x00f8,
+ 0x446: 0x0413, 0x447: 0x0085, 0x448: 0x0089, 0x449: 0x008b, 0x44a: 0x0104, 0x44b: 0x0107,
+ 0x44c: 0x010a, 0x44d: 0x008f, 0x44f: 0x0097, 0x450: 0x009b, 0x451: 0x00e0,
+ 0x452: 0x009f, 0x453: 0x00fe, 0x454: 0x0417, 0x455: 0x041b, 0x456: 0x00a1, 0x457: 0x00a9,
+ 0x458: 0x00ab, 0x459: 0x0423, 0x45a: 0x012b, 0x45b: 0x00ad, 0x45c: 0x0427, 0x45d: 0x01be,
+ 0x45e: 0x01c1, 0x45f: 0x01c4, 0x460: 0x01fa, 0x461: 0x01fd, 0x462: 0x0093, 0x463: 0x00a5,
+ 0x464: 0x00ab, 0x465: 0x00ad, 0x466: 0x01be, 0x467: 0x01c1, 0x468: 0x01eb, 0x469: 0x01fa,
+ 0x46a: 0x01fd,
+ 0x478: 0x020c,
+ // Block 0x12, offset 0x480
+ 0x49b: 0x00fb, 0x49c: 0x0087, 0x49d: 0x0101,
+ 0x49e: 0x00d4, 0x49f: 0x010a, 0x4a0: 0x008d, 0x4a1: 0x010d, 0x4a2: 0x0110, 0x4a3: 0x0116,
+ 0x4a4: 0x011c, 0x4a5: 0x011f, 0x4a6: 0x0122, 0x4a7: 0x042b, 0x4a8: 0x016a, 0x4a9: 0x0128,
+ 0x4aa: 0x042f, 0x4ab: 0x016d, 0x4ac: 0x0131, 0x4ad: 0x012e, 0x4ae: 0x0134, 0x4af: 0x0137,
+ 0x4b0: 0x013a, 0x4b1: 0x013d, 0x4b2: 0x0140, 0x4b3: 0x014c, 0x4b4: 0x014f, 0x4b5: 0x00ec,
+ 0x4b6: 0x0152, 0x4b7: 0x0155, 0x4b8: 0x041f, 0x4b9: 0x0158, 0x4ba: 0x015b, 0x4bb: 0x00b5,
+ 0x4bc: 0x015e, 0x4bd: 0x0161, 0x4be: 0x0164, 0x4bf: 0x01d0,
+ // Block 0x13, offset 0x4c0
+ 0x4c0: 0x2f97, 0x4c1: 0x32a3, 0x4c2: 0x2fa1, 0x4c3: 0x32ad, 0x4c4: 0x2fa6, 0x4c5: 0x32b2,
+ 0x4c6: 0x2fab, 0x4c7: 0x32b7, 0x4c8: 0x38cc, 0x4c9: 0x3a5b, 0x4ca: 0x2fc4, 0x4cb: 0x32d0,
+ 0x4cc: 0x2fce, 0x4cd: 0x32da, 0x4ce: 0x2fdd, 0x4cf: 0x32e9, 0x4d0: 0x2fd3, 0x4d1: 0x32df,
+ 0x4d2: 0x2fd8, 0x4d3: 0x32e4, 0x4d4: 0x38ef, 0x4d5: 0x3a7e, 0x4d6: 0x38f6, 0x4d7: 0x3a85,
+ 0x4d8: 0x3019, 0x4d9: 0x3325, 0x4da: 0x301e, 0x4db: 0x332a, 0x4dc: 0x3904, 0x4dd: 0x3a93,
+ 0x4de: 0x3023, 0x4df: 0x332f, 0x4e0: 0x3032, 0x4e1: 0x333e, 0x4e2: 0x3050, 0x4e3: 0x335c,
+ 0x4e4: 0x305f, 0x4e5: 0x336b, 0x4e6: 0x3055, 0x4e7: 0x3361, 0x4e8: 0x3064, 0x4e9: 0x3370,
+ 0x4ea: 0x3069, 0x4eb: 0x3375, 0x4ec: 0x30af, 0x4ed: 0x33bb, 0x4ee: 0x390b, 0x4ef: 0x3a9a,
+ 0x4f0: 0x30b9, 0x4f1: 0x33ca, 0x4f2: 0x30c3, 0x4f3: 0x33d4, 0x4f4: 0x30cd, 0x4f5: 0x33de,
+ 0x4f6: 0x46c4, 0x4f7: 0x4755, 0x4f8: 0x3912, 0x4f9: 0x3aa1, 0x4fa: 0x30e6, 0x4fb: 0x33f7,
+ 0x4fc: 0x30e1, 0x4fd: 0x33f2, 0x4fe: 0x30eb, 0x4ff: 0x33fc,
+ // Block 0x14, offset 0x500
+ 0x500: 0x30f0, 0x501: 0x3401, 0x502: 0x30f5, 0x503: 0x3406, 0x504: 0x3109, 0x505: 0x341a,
+ 0x506: 0x3113, 0x507: 0x3424, 0x508: 0x3122, 0x509: 0x3433, 0x50a: 0x311d, 0x50b: 0x342e,
+ 0x50c: 0x3935, 0x50d: 0x3ac4, 0x50e: 0x3943, 0x50f: 0x3ad2, 0x510: 0x394a, 0x511: 0x3ad9,
+ 0x512: 0x3951, 0x513: 0x3ae0, 0x514: 0x314f, 0x515: 0x3460, 0x516: 0x3154, 0x517: 0x3465,
+ 0x518: 0x315e, 0x519: 0x346f, 0x51a: 0x46f1, 0x51b: 0x4782, 0x51c: 0x3997, 0x51d: 0x3b26,
+ 0x51e: 0x3177, 0x51f: 0x3488, 0x520: 0x3181, 0x521: 0x3492, 0x522: 0x4700, 0x523: 0x4791,
+ 0x524: 0x399e, 0x525: 0x3b2d, 0x526: 0x39a5, 0x527: 0x3b34, 0x528: 0x39ac, 0x529: 0x3b3b,
+ 0x52a: 0x3190, 0x52b: 0x34a1, 0x52c: 0x319a, 0x52d: 0x34b0, 0x52e: 0x31ae, 0x52f: 0x34c4,
+ 0x530: 0x31a9, 0x531: 0x34bf, 0x532: 0x31ea, 0x533: 0x3500, 0x534: 0x31f9, 0x535: 0x350f,
+ 0x536: 0x31f4, 0x537: 0x350a, 0x538: 0x39b3, 0x539: 0x3b42, 0x53a: 0x39ba, 0x53b: 0x3b49,
+ 0x53c: 0x31fe, 0x53d: 0x3514, 0x53e: 0x3203, 0x53f: 0x3519,
+ // Block 0x15, offset 0x540
+ 0x540: 0x3208, 0x541: 0x351e, 0x542: 0x320d, 0x543: 0x3523, 0x544: 0x321c, 0x545: 0x3532,
+ 0x546: 0x3217, 0x547: 0x352d, 0x548: 0x3221, 0x549: 0x353c, 0x54a: 0x3226, 0x54b: 0x3541,
+ 0x54c: 0x322b, 0x54d: 0x3546, 0x54e: 0x3249, 0x54f: 0x3564, 0x550: 0x3262, 0x551: 0x3582,
+ 0x552: 0x3271, 0x553: 0x3591, 0x554: 0x3276, 0x555: 0x3596, 0x556: 0x337a, 0x557: 0x34a6,
+ 0x558: 0x3537, 0x559: 0x3573, 0x55a: 0x1be0, 0x55b: 0x42d7,
+ 0x560: 0x46a1, 0x561: 0x4732, 0x562: 0x2f83, 0x563: 0x328f,
+ 0x564: 0x3878, 0x565: 0x3a07, 0x566: 0x3871, 0x567: 0x3a00, 0x568: 0x3886, 0x569: 0x3a15,
+ 0x56a: 0x387f, 0x56b: 0x3a0e, 0x56c: 0x38be, 0x56d: 0x3a4d, 0x56e: 0x3894, 0x56f: 0x3a23,
+ 0x570: 0x388d, 0x571: 0x3a1c, 0x572: 0x38a2, 0x573: 0x3a31, 0x574: 0x389b, 0x575: 0x3a2a,
+ 0x576: 0x38c5, 0x577: 0x3a54, 0x578: 0x46b5, 0x579: 0x4746, 0x57a: 0x3000, 0x57b: 0x330c,
+ 0x57c: 0x2fec, 0x57d: 0x32f8, 0x57e: 0x38da, 0x57f: 0x3a69,
+ // Block 0x16, offset 0x580
+ 0x580: 0x38d3, 0x581: 0x3a62, 0x582: 0x38e8, 0x583: 0x3a77, 0x584: 0x38e1, 0x585: 0x3a70,
+ 0x586: 0x38fd, 0x587: 0x3a8c, 0x588: 0x3091, 0x589: 0x339d, 0x58a: 0x30a5, 0x58b: 0x33b1,
+ 0x58c: 0x46e7, 0x58d: 0x4778, 0x58e: 0x3136, 0x58f: 0x3447, 0x590: 0x3920, 0x591: 0x3aaf,
+ 0x592: 0x3919, 0x593: 0x3aa8, 0x594: 0x392e, 0x595: 0x3abd, 0x596: 0x3927, 0x597: 0x3ab6,
+ 0x598: 0x3989, 0x599: 0x3b18, 0x59a: 0x396d, 0x59b: 0x3afc, 0x59c: 0x3966, 0x59d: 0x3af5,
+ 0x59e: 0x397b, 0x59f: 0x3b0a, 0x5a0: 0x3974, 0x5a1: 0x3b03, 0x5a2: 0x3982, 0x5a3: 0x3b11,
+ 0x5a4: 0x31e5, 0x5a5: 0x34fb, 0x5a6: 0x31c7, 0x5a7: 0x34dd, 0x5a8: 0x39e4, 0x5a9: 0x3b73,
+ 0x5aa: 0x39dd, 0x5ab: 0x3b6c, 0x5ac: 0x39f2, 0x5ad: 0x3b81, 0x5ae: 0x39eb, 0x5af: 0x3b7a,
+ 0x5b0: 0x39f9, 0x5b1: 0x3b88, 0x5b2: 0x3230, 0x5b3: 0x354b, 0x5b4: 0x3258, 0x5b5: 0x3578,
+ 0x5b6: 0x3253, 0x5b7: 0x356e, 0x5b8: 0x323f, 0x5b9: 0x355a,
+ // Block 0x17, offset 0x5c0
+ 0x5c0: 0x4804, 0x5c1: 0x480a, 0x5c2: 0x491e, 0x5c3: 0x4936, 0x5c4: 0x4926, 0x5c5: 0x493e,
+ 0x5c6: 0x492e, 0x5c7: 0x4946, 0x5c8: 0x47aa, 0x5c9: 0x47b0, 0x5ca: 0x488e, 0x5cb: 0x48a6,
+ 0x5cc: 0x4896, 0x5cd: 0x48ae, 0x5ce: 0x489e, 0x5cf: 0x48b6, 0x5d0: 0x4816, 0x5d1: 0x481c,
+ 0x5d2: 0x3db8, 0x5d3: 0x3dc8, 0x5d4: 0x3dc0, 0x5d5: 0x3dd0,
+ 0x5d8: 0x47b6, 0x5d9: 0x47bc, 0x5da: 0x3ce8, 0x5db: 0x3cf8, 0x5dc: 0x3cf0, 0x5dd: 0x3d00,
+ 0x5e0: 0x482e, 0x5e1: 0x4834, 0x5e2: 0x494e, 0x5e3: 0x4966,
+ 0x5e4: 0x4956, 0x5e5: 0x496e, 0x5e6: 0x495e, 0x5e7: 0x4976, 0x5e8: 0x47c2, 0x5e9: 0x47c8,
+ 0x5ea: 0x48be, 0x5eb: 0x48d6, 0x5ec: 0x48c6, 0x5ed: 0x48de, 0x5ee: 0x48ce, 0x5ef: 0x48e6,
+ 0x5f0: 0x4846, 0x5f1: 0x484c, 0x5f2: 0x3e18, 0x5f3: 0x3e30, 0x5f4: 0x3e20, 0x5f5: 0x3e38,
+ 0x5f6: 0x3e28, 0x5f7: 0x3e40, 0x5f8: 0x47ce, 0x5f9: 0x47d4, 0x5fa: 0x3d18, 0x5fb: 0x3d30,
+ 0x5fc: 0x3d20, 0x5fd: 0x3d38, 0x5fe: 0x3d28, 0x5ff: 0x3d40,
+ // Block 0x18, offset 0x600
+ 0x600: 0x4852, 0x601: 0x4858, 0x602: 0x3e48, 0x603: 0x3e58, 0x604: 0x3e50, 0x605: 0x3e60,
+ 0x608: 0x47da, 0x609: 0x47e0, 0x60a: 0x3d48, 0x60b: 0x3d58,
+ 0x60c: 0x3d50, 0x60d: 0x3d60, 0x610: 0x4864, 0x611: 0x486a,
+ 0x612: 0x3e80, 0x613: 0x3e98, 0x614: 0x3e88, 0x615: 0x3ea0, 0x616: 0x3e90, 0x617: 0x3ea8,
+ 0x619: 0x47e6, 0x61b: 0x3d68, 0x61d: 0x3d70,
+ 0x61f: 0x3d78, 0x620: 0x487c, 0x621: 0x4882, 0x622: 0x497e, 0x623: 0x4996,
+ 0x624: 0x4986, 0x625: 0x499e, 0x626: 0x498e, 0x627: 0x49a6, 0x628: 0x47ec, 0x629: 0x47f2,
+ 0x62a: 0x48ee, 0x62b: 0x4906, 0x62c: 0x48f6, 0x62d: 0x490e, 0x62e: 0x48fe, 0x62f: 0x4916,
+ 0x630: 0x47f8, 0x631: 0x431e, 0x632: 0x3691, 0x633: 0x4324, 0x634: 0x4822, 0x635: 0x432a,
+ 0x636: 0x36a3, 0x637: 0x4330, 0x638: 0x36c1, 0x639: 0x4336, 0x63a: 0x36d9, 0x63b: 0x433c,
+ 0x63c: 0x4870, 0x63d: 0x4342,
+ // Block 0x19, offset 0x640
+ 0x640: 0x3da0, 0x641: 0x3da8, 0x642: 0x4184, 0x643: 0x41a2, 0x644: 0x418e, 0x645: 0x41ac,
+ 0x646: 0x4198, 0x647: 0x41b6, 0x648: 0x3cd8, 0x649: 0x3ce0, 0x64a: 0x40d0, 0x64b: 0x40ee,
+ 0x64c: 0x40da, 0x64d: 0x40f8, 0x64e: 0x40e4, 0x64f: 0x4102, 0x650: 0x3de8, 0x651: 0x3df0,
+ 0x652: 0x41c0, 0x653: 0x41de, 0x654: 0x41ca, 0x655: 0x41e8, 0x656: 0x41d4, 0x657: 0x41f2,
+ 0x658: 0x3d08, 0x659: 0x3d10, 0x65a: 0x410c, 0x65b: 0x412a, 0x65c: 0x4116, 0x65d: 0x4134,
+ 0x65e: 0x4120, 0x65f: 0x413e, 0x660: 0x3ec0, 0x661: 0x3ec8, 0x662: 0x41fc, 0x663: 0x421a,
+ 0x664: 0x4206, 0x665: 0x4224, 0x666: 0x4210, 0x667: 0x422e, 0x668: 0x3d80, 0x669: 0x3d88,
+ 0x66a: 0x4148, 0x66b: 0x4166, 0x66c: 0x4152, 0x66d: 0x4170, 0x66e: 0x415c, 0x66f: 0x417a,
+ 0x670: 0x3685, 0x671: 0x367f, 0x672: 0x3d90, 0x673: 0x368b, 0x674: 0x3d98,
+ 0x676: 0x4810, 0x677: 0x3db0, 0x678: 0x35f5, 0x679: 0x35ef, 0x67a: 0x35e3, 0x67b: 0x42ee,
+ 0x67c: 0x35fb, 0x67d: 0x4287, 0x67e: 0x01d3, 0x67f: 0x4287,
+ // Block 0x1a, offset 0x680
+ 0x680: 0x42a0, 0x681: 0x4482, 0x682: 0x3dd8, 0x683: 0x369d, 0x684: 0x3de0,
+ 0x686: 0x483a, 0x687: 0x3df8, 0x688: 0x3601, 0x689: 0x42f4, 0x68a: 0x360d, 0x68b: 0x42fa,
+ 0x68c: 0x3619, 0x68d: 0x4489, 0x68e: 0x4490, 0x68f: 0x4497, 0x690: 0x36b5, 0x691: 0x36af,
+ 0x692: 0x3e00, 0x693: 0x44e4, 0x696: 0x36bb, 0x697: 0x3e10,
+ 0x698: 0x3631, 0x699: 0x362b, 0x69a: 0x361f, 0x69b: 0x4300, 0x69d: 0x449e,
+ 0x69e: 0x44a5, 0x69f: 0x44ac, 0x6a0: 0x36eb, 0x6a1: 0x36e5, 0x6a2: 0x3e68, 0x6a3: 0x44ec,
+ 0x6a4: 0x36cd, 0x6a5: 0x36d3, 0x6a6: 0x36f1, 0x6a7: 0x3e78, 0x6a8: 0x3661, 0x6a9: 0x365b,
+ 0x6aa: 0x364f, 0x6ab: 0x430c, 0x6ac: 0x3649, 0x6ad: 0x4474, 0x6ae: 0x447b, 0x6af: 0x0081,
+ 0x6b2: 0x3eb0, 0x6b3: 0x36f7, 0x6b4: 0x3eb8,
+ 0x6b6: 0x4888, 0x6b7: 0x3ed0, 0x6b8: 0x363d, 0x6b9: 0x4306, 0x6ba: 0x366d, 0x6bb: 0x4318,
+ 0x6bc: 0x3679, 0x6bd: 0x425a, 0x6be: 0x428c,
+ // Block 0x1b, offset 0x6c0
+ 0x6c0: 0x1bd8, 0x6c1: 0x1bdc, 0x6c2: 0x0047, 0x6c3: 0x1c54, 0x6c5: 0x1be8,
+ 0x6c6: 0x1bec, 0x6c7: 0x00e9, 0x6c9: 0x1c58, 0x6ca: 0x008f, 0x6cb: 0x0051,
+ 0x6cc: 0x0051, 0x6cd: 0x0051, 0x6ce: 0x0091, 0x6cf: 0x00da, 0x6d0: 0x0053, 0x6d1: 0x0053,
+ 0x6d2: 0x0059, 0x6d3: 0x0099, 0x6d5: 0x005d, 0x6d6: 0x198d,
+ 0x6d9: 0x0061, 0x6da: 0x0063, 0x6db: 0x0065, 0x6dc: 0x0065, 0x6dd: 0x0065,
+ 0x6e0: 0x199f, 0x6e1: 0x1bc8, 0x6e2: 0x19a8,
+ 0x6e4: 0x0075, 0x6e6: 0x01b8, 0x6e8: 0x0075,
+ 0x6ea: 0x0057, 0x6eb: 0x42d2, 0x6ec: 0x0045, 0x6ed: 0x0047, 0x6ef: 0x008b,
+ 0x6f0: 0x004b, 0x6f1: 0x004d, 0x6f3: 0x005b, 0x6f4: 0x009f, 0x6f5: 0x0215,
+ 0x6f6: 0x0218, 0x6f7: 0x021b, 0x6f8: 0x021e, 0x6f9: 0x0093, 0x6fb: 0x1b98,
+ 0x6fc: 0x01e8, 0x6fd: 0x01c1, 0x6fe: 0x0179, 0x6ff: 0x01a0,
+ // Block 0x1c, offset 0x700
+ 0x700: 0x0463, 0x705: 0x0049,
+ 0x706: 0x0089, 0x707: 0x008b, 0x708: 0x0093, 0x709: 0x0095,
+ 0x710: 0x222e, 0x711: 0x223a,
+ 0x712: 0x22ee, 0x713: 0x2216, 0x714: 0x229a, 0x715: 0x2222, 0x716: 0x22a0, 0x717: 0x22b8,
+ 0x718: 0x22c4, 0x719: 0x2228, 0x71a: 0x22ca, 0x71b: 0x2234, 0x71c: 0x22be, 0x71d: 0x22d0,
+ 0x71e: 0x22d6, 0x71f: 0x1cbc, 0x720: 0x0053, 0x721: 0x195a, 0x722: 0x1ba4, 0x723: 0x1963,
+ 0x724: 0x006d, 0x725: 0x19ab, 0x726: 0x1bd0, 0x727: 0x1d48, 0x728: 0x1966, 0x729: 0x0071,
+ 0x72a: 0x19b7, 0x72b: 0x1bd4, 0x72c: 0x0059, 0x72d: 0x0047, 0x72e: 0x0049, 0x72f: 0x005b,
+ 0x730: 0x0093, 0x731: 0x19e4, 0x732: 0x1c18, 0x733: 0x19ed, 0x734: 0x00ad, 0x735: 0x1a62,
+ 0x736: 0x1c4c, 0x737: 0x1d5c, 0x738: 0x19f0, 0x739: 0x00b1, 0x73a: 0x1a65, 0x73b: 0x1c50,
+ 0x73c: 0x0099, 0x73d: 0x0087, 0x73e: 0x0089, 0x73f: 0x009b,
+ // Block 0x1d, offset 0x740
+ 0x741: 0x3c06, 0x743: 0xa000, 0x744: 0x3c0d, 0x745: 0xa000,
+ 0x747: 0x3c14, 0x748: 0xa000, 0x749: 0x3c1b,
+ 0x74d: 0xa000,
+ 0x760: 0x2f65, 0x761: 0xa000, 0x762: 0x3c29,
+ 0x764: 0xa000, 0x765: 0xa000,
+ 0x76d: 0x3c22, 0x76e: 0x2f60, 0x76f: 0x2f6a,
+ 0x770: 0x3c30, 0x771: 0x3c37, 0x772: 0xa000, 0x773: 0xa000, 0x774: 0x3c3e, 0x775: 0x3c45,
+ 0x776: 0xa000, 0x777: 0xa000, 0x778: 0x3c4c, 0x779: 0x3c53, 0x77a: 0xa000, 0x77b: 0xa000,
+ 0x77c: 0xa000, 0x77d: 0xa000,
+ // Block 0x1e, offset 0x780
+ 0x780: 0x3c5a, 0x781: 0x3c61, 0x782: 0xa000, 0x783: 0xa000, 0x784: 0x3c76, 0x785: 0x3c7d,
+ 0x786: 0xa000, 0x787: 0xa000, 0x788: 0x3c84, 0x789: 0x3c8b,
+ 0x791: 0xa000,
+ 0x792: 0xa000,
+ 0x7a2: 0xa000,
+ 0x7a8: 0xa000, 0x7a9: 0xa000,
+ 0x7ab: 0xa000, 0x7ac: 0x3ca0, 0x7ad: 0x3ca7, 0x7ae: 0x3cae, 0x7af: 0x3cb5,
+ 0x7b2: 0xa000, 0x7b3: 0xa000, 0x7b4: 0xa000, 0x7b5: 0xa000,
+ // Block 0x1f, offset 0x7c0
+ 0x7e0: 0x0023, 0x7e1: 0x0025, 0x7e2: 0x0027, 0x7e3: 0x0029,
+ 0x7e4: 0x002b, 0x7e5: 0x002d, 0x7e6: 0x002f, 0x7e7: 0x0031, 0x7e8: 0x0033, 0x7e9: 0x1882,
+ 0x7ea: 0x1885, 0x7eb: 0x1888, 0x7ec: 0x188b, 0x7ed: 0x188e, 0x7ee: 0x1891, 0x7ef: 0x1894,
+ 0x7f0: 0x1897, 0x7f1: 0x189a, 0x7f2: 0x189d, 0x7f3: 0x18a6, 0x7f4: 0x1a68, 0x7f5: 0x1a6c,
+ 0x7f6: 0x1a70, 0x7f7: 0x1a74, 0x7f8: 0x1a78, 0x7f9: 0x1a7c, 0x7fa: 0x1a80, 0x7fb: 0x1a84,
+ 0x7fc: 0x1a88, 0x7fd: 0x1c80, 0x7fe: 0x1c85, 0x7ff: 0x1c8a,
+ // Block 0x20, offset 0x800
+ 0x800: 0x1c8f, 0x801: 0x1c94, 0x802: 0x1c99, 0x803: 0x1c9e, 0x804: 0x1ca3, 0x805: 0x1ca8,
+ 0x806: 0x1cad, 0x807: 0x1cb2, 0x808: 0x187f, 0x809: 0x18a3, 0x80a: 0x18c7, 0x80b: 0x18eb,
+ 0x80c: 0x190f, 0x80d: 0x1918, 0x80e: 0x191e, 0x80f: 0x1924, 0x810: 0x192a, 0x811: 0x1b60,
+ 0x812: 0x1b64, 0x813: 0x1b68, 0x814: 0x1b6c, 0x815: 0x1b70, 0x816: 0x1b74, 0x817: 0x1b78,
+ 0x818: 0x1b7c, 0x819: 0x1b80, 0x81a: 0x1b84, 0x81b: 0x1b88, 0x81c: 0x1af4, 0x81d: 0x1af8,
+ 0x81e: 0x1afc, 0x81f: 0x1b00, 0x820: 0x1b04, 0x821: 0x1b08, 0x822: 0x1b0c, 0x823: 0x1b10,
+ 0x824: 0x1b14, 0x825: 0x1b18, 0x826: 0x1b1c, 0x827: 0x1b20, 0x828: 0x1b24, 0x829: 0x1b28,
+ 0x82a: 0x1b2c, 0x82b: 0x1b30, 0x82c: 0x1b34, 0x82d: 0x1b38, 0x82e: 0x1b3c, 0x82f: 0x1b40,
+ 0x830: 0x1b44, 0x831: 0x1b48, 0x832: 0x1b4c, 0x833: 0x1b50, 0x834: 0x1b54, 0x835: 0x1b58,
+ 0x836: 0x0043, 0x837: 0x0045, 0x838: 0x0047, 0x839: 0x0049, 0x83a: 0x004b, 0x83b: 0x004d,
+ 0x83c: 0x004f, 0x83d: 0x0051, 0x83e: 0x0053, 0x83f: 0x0055,
+ // Block 0x21, offset 0x840
+ 0x840: 0x06bf, 0x841: 0x06e3, 0x842: 0x06ef, 0x843: 0x06ff, 0x844: 0x0707, 0x845: 0x0713,
+ 0x846: 0x071b, 0x847: 0x0723, 0x848: 0x072f, 0x849: 0x0783, 0x84a: 0x079b, 0x84b: 0x07ab,
+ 0x84c: 0x07bb, 0x84d: 0x07cb, 0x84e: 0x07db, 0x84f: 0x07fb, 0x850: 0x07ff, 0x851: 0x0803,
+ 0x852: 0x0837, 0x853: 0x085f, 0x854: 0x086f, 0x855: 0x0877, 0x856: 0x087b, 0x857: 0x0887,
+ 0x858: 0x08a3, 0x859: 0x08a7, 0x85a: 0x08bf, 0x85b: 0x08c3, 0x85c: 0x08cb, 0x85d: 0x08db,
+ 0x85e: 0x0977, 0x85f: 0x098b, 0x860: 0x09cb, 0x861: 0x09df, 0x862: 0x09e7, 0x863: 0x09eb,
+ 0x864: 0x09fb, 0x865: 0x0a17, 0x866: 0x0a43, 0x867: 0x0a4f, 0x868: 0x0a6f, 0x869: 0x0a7b,
+ 0x86a: 0x0a7f, 0x86b: 0x0a83, 0x86c: 0x0a9b, 0x86d: 0x0a9f, 0x86e: 0x0acb, 0x86f: 0x0ad7,
+ 0x870: 0x0adf, 0x871: 0x0ae7, 0x872: 0x0af7, 0x873: 0x0aff, 0x874: 0x0b07, 0x875: 0x0b33,
+ 0x876: 0x0b37, 0x877: 0x0b3f, 0x878: 0x0b43, 0x879: 0x0b4b, 0x87a: 0x0b53, 0x87b: 0x0b63,
+ 0x87c: 0x0b7f, 0x87d: 0x0bf7, 0x87e: 0x0c0b, 0x87f: 0x0c0f,
+ // Block 0x22, offset 0x880
+ 0x880: 0x0c8f, 0x881: 0x0c93, 0x882: 0x0ca7, 0x883: 0x0cab, 0x884: 0x0cb3, 0x885: 0x0cbb,
+ 0x886: 0x0cc3, 0x887: 0x0ccf, 0x888: 0x0cf7, 0x889: 0x0d07, 0x88a: 0x0d1b, 0x88b: 0x0d8b,
+ 0x88c: 0x0d97, 0x88d: 0x0da7, 0x88e: 0x0db3, 0x88f: 0x0dbf, 0x890: 0x0dc7, 0x891: 0x0dcb,
+ 0x892: 0x0dcf, 0x893: 0x0dd3, 0x894: 0x0dd7, 0x895: 0x0e8f, 0x896: 0x0ed7, 0x897: 0x0ee3,
+ 0x898: 0x0ee7, 0x899: 0x0eeb, 0x89a: 0x0eef, 0x89b: 0x0ef7, 0x89c: 0x0efb, 0x89d: 0x0f0f,
+ 0x89e: 0x0f2b, 0x89f: 0x0f33, 0x8a0: 0x0f73, 0x8a1: 0x0f77, 0x8a2: 0x0f7f, 0x8a3: 0x0f83,
+ 0x8a4: 0x0f8b, 0x8a5: 0x0f8f, 0x8a6: 0x0fb3, 0x8a7: 0x0fb7, 0x8a8: 0x0fd3, 0x8a9: 0x0fd7,
+ 0x8aa: 0x0fdb, 0x8ab: 0x0fdf, 0x8ac: 0x0ff3, 0x8ad: 0x1017, 0x8ae: 0x101b, 0x8af: 0x101f,
+ 0x8b0: 0x1043, 0x8b1: 0x1083, 0x8b2: 0x1087, 0x8b3: 0x10a7, 0x8b4: 0x10b7, 0x8b5: 0x10bf,
+ 0x8b6: 0x10df, 0x8b7: 0x1103, 0x8b8: 0x1147, 0x8b9: 0x114f, 0x8ba: 0x1163, 0x8bb: 0x116f,
+ 0x8bc: 0x1177, 0x8bd: 0x117f, 0x8be: 0x1183, 0x8bf: 0x1187,
+ // Block 0x23, offset 0x8c0
+ 0x8c0: 0x119f, 0x8c1: 0x11a3, 0x8c2: 0x11bf, 0x8c3: 0x11c7, 0x8c4: 0x11cf, 0x8c5: 0x11d3,
+ 0x8c6: 0x11df, 0x8c7: 0x11e7, 0x8c8: 0x11eb, 0x8c9: 0x11ef, 0x8ca: 0x11f7, 0x8cb: 0x11fb,
+ 0x8cc: 0x129b, 0x8cd: 0x12af, 0x8ce: 0x12e3, 0x8cf: 0x12e7, 0x8d0: 0x12ef, 0x8d1: 0x131b,
+ 0x8d2: 0x1323, 0x8d3: 0x132b, 0x8d4: 0x1333, 0x8d5: 0x136f, 0x8d6: 0x1373, 0x8d7: 0x137b,
+ 0x8d8: 0x137f, 0x8d9: 0x1383, 0x8da: 0x13af, 0x8db: 0x13b3, 0x8dc: 0x13bb, 0x8dd: 0x13cf,
+ 0x8de: 0x13d3, 0x8df: 0x13ef, 0x8e0: 0x13f7, 0x8e1: 0x13fb, 0x8e2: 0x141f, 0x8e3: 0x143f,
+ 0x8e4: 0x1453, 0x8e5: 0x1457, 0x8e6: 0x145f, 0x8e7: 0x148b, 0x8e8: 0x148f, 0x8e9: 0x149f,
+ 0x8ea: 0x14c3, 0x8eb: 0x14cf, 0x8ec: 0x14df, 0x8ed: 0x14f7, 0x8ee: 0x14ff, 0x8ef: 0x1503,
+ 0x8f0: 0x1507, 0x8f1: 0x150b, 0x8f2: 0x1517, 0x8f3: 0x151b, 0x8f4: 0x1523, 0x8f5: 0x153f,
+ 0x8f6: 0x1543, 0x8f7: 0x1547, 0x8f8: 0x155f, 0x8f9: 0x1563, 0x8fa: 0x156b, 0x8fb: 0x157f,
+ 0x8fc: 0x1583, 0x8fd: 0x1587, 0x8fe: 0x158f, 0x8ff: 0x1593,
+ // Block 0x24, offset 0x900
+ 0x906: 0xa000, 0x90b: 0xa000,
+ 0x90c: 0x3f08, 0x90d: 0xa000, 0x90e: 0x3f10, 0x90f: 0xa000, 0x910: 0x3f18, 0x911: 0xa000,
+ 0x912: 0x3f20, 0x913: 0xa000, 0x914: 0x3f28, 0x915: 0xa000, 0x916: 0x3f30, 0x917: 0xa000,
+ 0x918: 0x3f38, 0x919: 0xa000, 0x91a: 0x3f40, 0x91b: 0xa000, 0x91c: 0x3f48, 0x91d: 0xa000,
+ 0x91e: 0x3f50, 0x91f: 0xa000, 0x920: 0x3f58, 0x921: 0xa000, 0x922: 0x3f60,
+ 0x924: 0xa000, 0x925: 0x3f68, 0x926: 0xa000, 0x927: 0x3f70, 0x928: 0xa000, 0x929: 0x3f78,
+ 0x92f: 0xa000,
+ 0x930: 0x3f80, 0x931: 0x3f88, 0x932: 0xa000, 0x933: 0x3f90, 0x934: 0x3f98, 0x935: 0xa000,
+ 0x936: 0x3fa0, 0x937: 0x3fa8, 0x938: 0xa000, 0x939: 0x3fb0, 0x93a: 0x3fb8, 0x93b: 0xa000,
+ 0x93c: 0x3fc0, 0x93d: 0x3fc8,
+ // Block 0x25, offset 0x940
+ 0x954: 0x3f00,
+ 0x959: 0x9903, 0x95a: 0x9903, 0x95b: 0x42dc, 0x95c: 0x42e2, 0x95d: 0xa000,
+ 0x95e: 0x3fd0, 0x95f: 0x26b4,
+ 0x966: 0xa000,
+ 0x96b: 0xa000, 0x96c: 0x3fe0, 0x96d: 0xa000, 0x96e: 0x3fe8, 0x96f: 0xa000,
+ 0x970: 0x3ff0, 0x971: 0xa000, 0x972: 0x3ff8, 0x973: 0xa000, 0x974: 0x4000, 0x975: 0xa000,
+ 0x976: 0x4008, 0x977: 0xa000, 0x978: 0x4010, 0x979: 0xa000, 0x97a: 0x4018, 0x97b: 0xa000,
+ 0x97c: 0x4020, 0x97d: 0xa000, 0x97e: 0x4028, 0x97f: 0xa000,
+ // Block 0x26, offset 0x980
+ 0x980: 0x4030, 0x981: 0xa000, 0x982: 0x4038, 0x984: 0xa000, 0x985: 0x4040,
+ 0x986: 0xa000, 0x987: 0x4048, 0x988: 0xa000, 0x989: 0x4050,
+ 0x98f: 0xa000, 0x990: 0x4058, 0x991: 0x4060,
+ 0x992: 0xa000, 0x993: 0x4068, 0x994: 0x4070, 0x995: 0xa000, 0x996: 0x4078, 0x997: 0x4080,
+ 0x998: 0xa000, 0x999: 0x4088, 0x99a: 0x4090, 0x99b: 0xa000, 0x99c: 0x4098, 0x99d: 0x40a0,
+ 0x9af: 0xa000,
+ 0x9b0: 0xa000, 0x9b1: 0xa000, 0x9b2: 0xa000, 0x9b4: 0x3fd8,
+ 0x9b7: 0x40a8, 0x9b8: 0x40b0, 0x9b9: 0x40b8, 0x9ba: 0x40c0,
+ 0x9bd: 0xa000, 0x9be: 0x40c8, 0x9bf: 0x26c9,
+ // Block 0x27, offset 0x9c0
+ 0x9c0: 0x0367, 0x9c1: 0x032b, 0x9c2: 0x032f, 0x9c3: 0x0333, 0x9c4: 0x037b, 0x9c5: 0x0337,
+ 0x9c6: 0x033b, 0x9c7: 0x033f, 0x9c8: 0x0343, 0x9c9: 0x0347, 0x9ca: 0x034b, 0x9cb: 0x034f,
+ 0x9cc: 0x0353, 0x9cd: 0x0357, 0x9ce: 0x035b, 0x9cf: 0x49bd, 0x9d0: 0x49c3, 0x9d1: 0x49c9,
+ 0x9d2: 0x49cf, 0x9d3: 0x49d5, 0x9d4: 0x49db, 0x9d5: 0x49e1, 0x9d6: 0x49e7, 0x9d7: 0x49ed,
+ 0x9d8: 0x49f3, 0x9d9: 0x49f9, 0x9da: 0x49ff, 0x9db: 0x4a05, 0x9dc: 0x4a0b, 0x9dd: 0x4a11,
+ 0x9de: 0x4a17, 0x9df: 0x4a1d, 0x9e0: 0x4a23, 0x9e1: 0x4a29, 0x9e2: 0x4a2f, 0x9e3: 0x4a35,
+ 0x9e4: 0x03c3, 0x9e5: 0x035f, 0x9e6: 0x0363, 0x9e7: 0x03e7, 0x9e8: 0x03eb, 0x9e9: 0x03ef,
+ 0x9ea: 0x03f3, 0x9eb: 0x03f7, 0x9ec: 0x03fb, 0x9ed: 0x03ff, 0x9ee: 0x036b, 0x9ef: 0x0403,
+ 0x9f0: 0x0407, 0x9f1: 0x036f, 0x9f2: 0x0373, 0x9f3: 0x0377, 0x9f4: 0x037f, 0x9f5: 0x0383,
+ 0x9f6: 0x0387, 0x9f7: 0x038b, 0x9f8: 0x038f, 0x9f9: 0x0393, 0x9fa: 0x0397, 0x9fb: 0x039b,
+ 0x9fc: 0x039f, 0x9fd: 0x03a3, 0x9fe: 0x03a7, 0x9ff: 0x03ab,
+ // Block 0x28, offset 0xa00
+ 0xa00: 0x03af, 0xa01: 0x03b3, 0xa02: 0x040b, 0xa03: 0x040f, 0xa04: 0x03b7, 0xa05: 0x03bb,
+ 0xa06: 0x03bf, 0xa07: 0x03c7, 0xa08: 0x03cb, 0xa09: 0x03cf, 0xa0a: 0x03d3, 0xa0b: 0x03d7,
+ 0xa0c: 0x03db, 0xa0d: 0x03df, 0xa0e: 0x03e3,
+ 0xa12: 0x06bf, 0xa13: 0x071b, 0xa14: 0x06cb, 0xa15: 0x097b, 0xa16: 0x06cf, 0xa17: 0x06e7,
+ 0xa18: 0x06d3, 0xa19: 0x0f93, 0xa1a: 0x0707, 0xa1b: 0x06db, 0xa1c: 0x06c3, 0xa1d: 0x09ff,
+ 0xa1e: 0x098f, 0xa1f: 0x072f,
+ // Block 0x29, offset 0xa40
+ 0xa40: 0x2054, 0xa41: 0x205a, 0xa42: 0x2060, 0xa43: 0x2066, 0xa44: 0x206c, 0xa45: 0x2072,
+ 0xa46: 0x2078, 0xa47: 0x207e, 0xa48: 0x2084, 0xa49: 0x208a, 0xa4a: 0x2090, 0xa4b: 0x2096,
+ 0xa4c: 0x209c, 0xa4d: 0x20a2, 0xa4e: 0x2726, 0xa4f: 0x272f, 0xa50: 0x2738, 0xa51: 0x2741,
+ 0xa52: 0x274a, 0xa53: 0x2753, 0xa54: 0x275c, 0xa55: 0x2765, 0xa56: 0x276e, 0xa57: 0x2780,
+ 0xa58: 0x2789, 0xa59: 0x2792, 0xa5a: 0x279b, 0xa5b: 0x27a4, 0xa5c: 0x2777, 0xa5d: 0x2bac,
+ 0xa5e: 0x2aed, 0xa60: 0x20a8, 0xa61: 0x20c0, 0xa62: 0x20b4, 0xa63: 0x2108,
+ 0xa64: 0x20c6, 0xa65: 0x20e4, 0xa66: 0x20ae, 0xa67: 0x20de, 0xa68: 0x20ba, 0xa69: 0x20f0,
+ 0xa6a: 0x2120, 0xa6b: 0x213e, 0xa6c: 0x2138, 0xa6d: 0x212c, 0xa6e: 0x217a, 0xa6f: 0x210e,
+ 0xa70: 0x211a, 0xa71: 0x2132, 0xa72: 0x2126, 0xa73: 0x2150, 0xa74: 0x20fc, 0xa75: 0x2144,
+ 0xa76: 0x216e, 0xa77: 0x2156, 0xa78: 0x20ea, 0xa79: 0x20cc, 0xa7a: 0x2102, 0xa7b: 0x2114,
+ 0xa7c: 0x214a, 0xa7d: 0x20d2, 0xa7e: 0x2174, 0xa7f: 0x20f6,
+ // Block 0x2a, offset 0xa80
+ 0xa80: 0x215c, 0xa81: 0x20d8, 0xa82: 0x2162, 0xa83: 0x2168, 0xa84: 0x092f, 0xa85: 0x0b03,
+ 0xa86: 0x0ca7, 0xa87: 0x10c7,
+ 0xa90: 0x1bc4, 0xa91: 0x18a9,
+ 0xa92: 0x18ac, 0xa93: 0x18af, 0xa94: 0x18b2, 0xa95: 0x18b5, 0xa96: 0x18b8, 0xa97: 0x18bb,
+ 0xa98: 0x18be, 0xa99: 0x18c1, 0xa9a: 0x18ca, 0xa9b: 0x18cd, 0xa9c: 0x18d0, 0xa9d: 0x18d3,
+ 0xa9e: 0x18d6, 0xa9f: 0x18d9, 0xaa0: 0x0313, 0xaa1: 0x031b, 0xaa2: 0x031f, 0xaa3: 0x0327,
+ 0xaa4: 0x032b, 0xaa5: 0x032f, 0xaa6: 0x0337, 0xaa7: 0x033f, 0xaa8: 0x0343, 0xaa9: 0x034b,
+ 0xaaa: 0x034f, 0xaab: 0x0353, 0xaac: 0x0357, 0xaad: 0x035b, 0xaae: 0x2e18, 0xaaf: 0x2e20,
+ 0xab0: 0x2e28, 0xab1: 0x2e30, 0xab2: 0x2e38, 0xab3: 0x2e40, 0xab4: 0x2e48, 0xab5: 0x2e50,
+ 0xab6: 0x2e60, 0xab7: 0x2e68, 0xab8: 0x2e70, 0xab9: 0x2e78, 0xaba: 0x2e80, 0xabb: 0x2e88,
+ 0xabc: 0x2ed3, 0xabd: 0x2e9b, 0xabe: 0x2e58,
+ // Block 0x2b, offset 0xac0
+ 0xac0: 0x06bf, 0xac1: 0x071b, 0xac2: 0x06cb, 0xac3: 0x097b, 0xac4: 0x071f, 0xac5: 0x07af,
+ 0xac6: 0x06c7, 0xac7: 0x07ab, 0xac8: 0x070b, 0xac9: 0x0887, 0xaca: 0x0d07, 0xacb: 0x0e8f,
+ 0xacc: 0x0dd7, 0xacd: 0x0d1b, 0xace: 0x145f, 0xacf: 0x098b, 0xad0: 0x0ccf, 0xad1: 0x0d4b,
+ 0xad2: 0x0d0b, 0xad3: 0x104b, 0xad4: 0x08fb, 0xad5: 0x0f03, 0xad6: 0x1387, 0xad7: 0x105f,
+ 0xad8: 0x0843, 0xad9: 0x108f, 0xada: 0x0f9b, 0xadb: 0x0a17, 0xadc: 0x140f, 0xadd: 0x077f,
+ 0xade: 0x08ab, 0xadf: 0x0df7, 0xae0: 0x1527, 0xae1: 0x0743, 0xae2: 0x07d3, 0xae3: 0x0d9b,
+ 0xae4: 0x06cf, 0xae5: 0x06e7, 0xae6: 0x06d3, 0xae7: 0x0adb, 0xae8: 0x08ef, 0xae9: 0x087f,
+ 0xaea: 0x0a57, 0xaeb: 0x0a4b, 0xaec: 0x0feb, 0xaed: 0x073f, 0xaee: 0x139b, 0xaef: 0x089b,
+ 0xaf0: 0x09f3, 0xaf1: 0x18dc, 0xaf2: 0x18df, 0xaf3: 0x18e2, 0xaf4: 0x18e5, 0xaf5: 0x18ee,
+ 0xaf6: 0x18f1, 0xaf7: 0x18f4, 0xaf8: 0x18f7, 0xaf9: 0x18fa, 0xafa: 0x18fd, 0xafb: 0x1900,
+ 0xafc: 0x1903, 0xafd: 0x1906, 0xafe: 0x1909, 0xaff: 0x1912,
+ // Block 0x2c, offset 0xb00
+ 0xb00: 0x1cc6, 0xb01: 0x1cd5, 0xb02: 0x1ce4, 0xb03: 0x1cf3, 0xb04: 0x1d02, 0xb05: 0x1d11,
+ 0xb06: 0x1d20, 0xb07: 0x1d2f, 0xb08: 0x1d3e, 0xb09: 0x218c, 0xb0a: 0x219e, 0xb0b: 0x21b0,
+ 0xb0c: 0x1954, 0xb0d: 0x1c04, 0xb0e: 0x19d2, 0xb0f: 0x1ba8, 0xb10: 0x04cb, 0xb11: 0x04d3,
+ 0xb12: 0x04db, 0xb13: 0x04e3, 0xb14: 0x04eb, 0xb15: 0x04ef, 0xb16: 0x04f3, 0xb17: 0x04f7,
+ 0xb18: 0x04fb, 0xb19: 0x04ff, 0xb1a: 0x0503, 0xb1b: 0x0507, 0xb1c: 0x050b, 0xb1d: 0x050f,
+ 0xb1e: 0x0513, 0xb1f: 0x0517, 0xb20: 0x051b, 0xb21: 0x0523, 0xb22: 0x0527, 0xb23: 0x052b,
+ 0xb24: 0x052f, 0xb25: 0x0533, 0xb26: 0x0537, 0xb27: 0x053b, 0xb28: 0x053f, 0xb29: 0x0543,
+ 0xb2a: 0x0547, 0xb2b: 0x054b, 0xb2c: 0x054f, 0xb2d: 0x0553, 0xb2e: 0x0557, 0xb2f: 0x055b,
+ 0xb30: 0x055f, 0xb31: 0x0563, 0xb32: 0x0567, 0xb33: 0x056f, 0xb34: 0x0577, 0xb35: 0x057f,
+ 0xb36: 0x0583, 0xb37: 0x0587, 0xb38: 0x058b, 0xb39: 0x058f, 0xb3a: 0x0593, 0xb3b: 0x0597,
+ 0xb3c: 0x059b, 0xb3d: 0x059f, 0xb3e: 0x05a3,
+ // Block 0x2d, offset 0xb40
+ 0xb40: 0x2b0c, 0xb41: 0x29a8, 0xb42: 0x2b1c, 0xb43: 0x2880, 0xb44: 0x2ee4, 0xb45: 0x288a,
+ 0xb46: 0x2894, 0xb47: 0x2f28, 0xb48: 0x29b5, 0xb49: 0x289e, 0xb4a: 0x28a8, 0xb4b: 0x28b2,
+ 0xb4c: 0x29dc, 0xb4d: 0x29e9, 0xb4e: 0x29c2, 0xb4f: 0x29cf, 0xb50: 0x2ea9, 0xb51: 0x29f6,
+ 0xb52: 0x2a03, 0xb53: 0x2bbe, 0xb54: 0x26bb, 0xb55: 0x2bd1, 0xb56: 0x2be4, 0xb57: 0x2b2c,
+ 0xb58: 0x2a10, 0xb59: 0x2bf7, 0xb5a: 0x2c0a, 0xb5b: 0x2a1d, 0xb5c: 0x28bc, 0xb5d: 0x28c6,
+ 0xb5e: 0x2eb7, 0xb5f: 0x2a2a, 0xb60: 0x2b3c, 0xb61: 0x2ef5, 0xb62: 0x28d0, 0xb63: 0x28da,
+ 0xb64: 0x2a37, 0xb65: 0x28e4, 0xb66: 0x28ee, 0xb67: 0x26d0, 0xb68: 0x26d7, 0xb69: 0x28f8,
+ 0xb6a: 0x2902, 0xb6b: 0x2c1d, 0xb6c: 0x2a44, 0xb6d: 0x2b4c, 0xb6e: 0x2c30, 0xb6f: 0x2a51,
+ 0xb70: 0x2916, 0xb71: 0x290c, 0xb72: 0x2f3c, 0xb73: 0x2a5e, 0xb74: 0x2c43, 0xb75: 0x2920,
+ 0xb76: 0x2b5c, 0xb77: 0x292a, 0xb78: 0x2a78, 0xb79: 0x2934, 0xb7a: 0x2a85, 0xb7b: 0x2f06,
+ 0xb7c: 0x2a6b, 0xb7d: 0x2b6c, 0xb7e: 0x2a92, 0xb7f: 0x26de,
+ // Block 0x2e, offset 0xb80
+ 0xb80: 0x2f17, 0xb81: 0x293e, 0xb82: 0x2948, 0xb83: 0x2a9f, 0xb84: 0x2952, 0xb85: 0x295c,
+ 0xb86: 0x2966, 0xb87: 0x2b7c, 0xb88: 0x2aac, 0xb89: 0x26e5, 0xb8a: 0x2c56, 0xb8b: 0x2e90,
+ 0xb8c: 0x2b8c, 0xb8d: 0x2ab9, 0xb8e: 0x2ec5, 0xb8f: 0x2970, 0xb90: 0x297a, 0xb91: 0x2ac6,
+ 0xb92: 0x26ec, 0xb93: 0x2ad3, 0xb94: 0x2b9c, 0xb95: 0x26f3, 0xb96: 0x2c69, 0xb97: 0x2984,
+ 0xb98: 0x1cb7, 0xb99: 0x1ccb, 0xb9a: 0x1cda, 0xb9b: 0x1ce9, 0xb9c: 0x1cf8, 0xb9d: 0x1d07,
+ 0xb9e: 0x1d16, 0xb9f: 0x1d25, 0xba0: 0x1d34, 0xba1: 0x1d43, 0xba2: 0x2192, 0xba3: 0x21a4,
+ 0xba4: 0x21b6, 0xba5: 0x21c2, 0xba6: 0x21ce, 0xba7: 0x21da, 0xba8: 0x21e6, 0xba9: 0x21f2,
+ 0xbaa: 0x21fe, 0xbab: 0x220a, 0xbac: 0x2246, 0xbad: 0x2252, 0xbae: 0x225e, 0xbaf: 0x226a,
+ 0xbb0: 0x2276, 0xbb1: 0x1c14, 0xbb2: 0x19c6, 0xbb3: 0x1936, 0xbb4: 0x1be4, 0xbb5: 0x1a47,
+ 0xbb6: 0x1a56, 0xbb7: 0x19cc, 0xbb8: 0x1bfc, 0xbb9: 0x1c00, 0xbba: 0x1960, 0xbbb: 0x2701,
+ 0xbbc: 0x270f, 0xbbd: 0x26fa, 0xbbe: 0x2708, 0xbbf: 0x2ae0,
+ // Block 0x2f, offset 0xbc0
+ 0xbc0: 0x1a4a, 0xbc1: 0x1a32, 0xbc2: 0x1c60, 0xbc3: 0x1a1a, 0xbc4: 0x19f3, 0xbc5: 0x1969,
+ 0xbc6: 0x1978, 0xbc7: 0x1948, 0xbc8: 0x1bf0, 0xbc9: 0x1d52, 0xbca: 0x1a4d, 0xbcb: 0x1a35,
+ 0xbcc: 0x1c64, 0xbcd: 0x1c70, 0xbce: 0x1a26, 0xbcf: 0x19fc, 0xbd0: 0x1957, 0xbd1: 0x1c1c,
+ 0xbd2: 0x1bb0, 0xbd3: 0x1b9c, 0xbd4: 0x1bcc, 0xbd5: 0x1c74, 0xbd6: 0x1a29, 0xbd7: 0x19c9,
+ 0xbd8: 0x19ff, 0xbd9: 0x19de, 0xbda: 0x1a41, 0xbdb: 0x1c78, 0xbdc: 0x1a2c, 0xbdd: 0x19c0,
+ 0xbde: 0x1a02, 0xbdf: 0x1c3c, 0xbe0: 0x1bf4, 0xbe1: 0x1a14, 0xbe2: 0x1c24, 0xbe3: 0x1c40,
+ 0xbe4: 0x1bf8, 0xbe5: 0x1a17, 0xbe6: 0x1c28, 0xbe7: 0x22e8, 0xbe8: 0x22fc, 0xbe9: 0x1996,
+ 0xbea: 0x1c20, 0xbeb: 0x1bb4, 0xbec: 0x1ba0, 0xbed: 0x1c48, 0xbee: 0x2716, 0xbef: 0x27ad,
+ 0xbf0: 0x1a59, 0xbf1: 0x1a44, 0xbf2: 0x1c7c, 0xbf3: 0x1a2f, 0xbf4: 0x1a50, 0xbf5: 0x1a38,
+ 0xbf6: 0x1c68, 0xbf7: 0x1a1d, 0xbf8: 0x19f6, 0xbf9: 0x1981, 0xbfa: 0x1a53, 0xbfb: 0x1a3b,
+ 0xbfc: 0x1c6c, 0xbfd: 0x1a20, 0xbfe: 0x19f9, 0xbff: 0x1984,
+ // Block 0x30, offset 0xc00
+ 0xc00: 0x1c2c, 0xc01: 0x1bb8, 0xc02: 0x1d4d, 0xc03: 0x1939, 0xc04: 0x19ba, 0xc05: 0x19bd,
+ 0xc06: 0x22f5, 0xc07: 0x1b94, 0xc08: 0x19c3, 0xc09: 0x194b, 0xc0a: 0x19e1, 0xc0b: 0x194e,
+ 0xc0c: 0x19ea, 0xc0d: 0x196c, 0xc0e: 0x196f, 0xc0f: 0x1a05, 0xc10: 0x1a0b, 0xc11: 0x1a0e,
+ 0xc12: 0x1c30, 0xc13: 0x1a11, 0xc14: 0x1a23, 0xc15: 0x1c38, 0xc16: 0x1c44, 0xc17: 0x1990,
+ 0xc18: 0x1d57, 0xc19: 0x1bbc, 0xc1a: 0x1993, 0xc1b: 0x1a5c, 0xc1c: 0x19a5, 0xc1d: 0x19b4,
+ 0xc1e: 0x22e2, 0xc1f: 0x22dc, 0xc20: 0x1cc1, 0xc21: 0x1cd0, 0xc22: 0x1cdf, 0xc23: 0x1cee,
+ 0xc24: 0x1cfd, 0xc25: 0x1d0c, 0xc26: 0x1d1b, 0xc27: 0x1d2a, 0xc28: 0x1d39, 0xc29: 0x2186,
+ 0xc2a: 0x2198, 0xc2b: 0x21aa, 0xc2c: 0x21bc, 0xc2d: 0x21c8, 0xc2e: 0x21d4, 0xc2f: 0x21e0,
+ 0xc30: 0x21ec, 0xc31: 0x21f8, 0xc32: 0x2204, 0xc33: 0x2240, 0xc34: 0x224c, 0xc35: 0x2258,
+ 0xc36: 0x2264, 0xc37: 0x2270, 0xc38: 0x227c, 0xc39: 0x2282, 0xc3a: 0x2288, 0xc3b: 0x228e,
+ 0xc3c: 0x2294, 0xc3d: 0x22a6, 0xc3e: 0x22ac, 0xc3f: 0x1c10,
+ // Block 0x31, offset 0xc40
+ 0xc40: 0x1377, 0xc41: 0x0cfb, 0xc42: 0x13d3, 0xc43: 0x139f, 0xc44: 0x0e57, 0xc45: 0x06eb,
+ 0xc46: 0x08df, 0xc47: 0x162b, 0xc48: 0x162b, 0xc49: 0x0a0b, 0xc4a: 0x145f, 0xc4b: 0x0943,
+ 0xc4c: 0x0a07, 0xc4d: 0x0bef, 0xc4e: 0x0fcf, 0xc4f: 0x115f, 0xc50: 0x1297, 0xc51: 0x12d3,
+ 0xc52: 0x1307, 0xc53: 0x141b, 0xc54: 0x0d73, 0xc55: 0x0dff, 0xc56: 0x0eab, 0xc57: 0x0f43,
+ 0xc58: 0x125f, 0xc59: 0x1447, 0xc5a: 0x1573, 0xc5b: 0x070f, 0xc5c: 0x08b3, 0xc5d: 0x0d87,
+ 0xc5e: 0x0ecf, 0xc5f: 0x1293, 0xc60: 0x15c3, 0xc61: 0x0ab3, 0xc62: 0x0e77, 0xc63: 0x1283,
+ 0xc64: 0x1317, 0xc65: 0x0c23, 0xc66: 0x11bb, 0xc67: 0x12df, 0xc68: 0x0b1f, 0xc69: 0x0d0f,
+ 0xc6a: 0x0e17, 0xc6b: 0x0f1b, 0xc6c: 0x1427, 0xc6d: 0x074f, 0xc6e: 0x07e7, 0xc6f: 0x0853,
+ 0xc70: 0x0c8b, 0xc71: 0x0d7f, 0xc72: 0x0ecb, 0xc73: 0x0fef, 0xc74: 0x1177, 0xc75: 0x128b,
+ 0xc76: 0x12a3, 0xc77: 0x13c7, 0xc78: 0x14ef, 0xc79: 0x15a3, 0xc7a: 0x15bf, 0xc7b: 0x102b,
+ 0xc7c: 0x106b, 0xc7d: 0x1123, 0xc7e: 0x1243, 0xc7f: 0x147b,
+ // Block 0x32, offset 0xc80
+ 0xc80: 0x15cb, 0xc81: 0x134b, 0xc82: 0x09c7, 0xc83: 0x0b3b, 0xc84: 0x10db, 0xc85: 0x119b,
+ 0xc86: 0x0eff, 0xc87: 0x1033, 0xc88: 0x1397, 0xc89: 0x14e7, 0xc8a: 0x09c3, 0xc8b: 0x0a8f,
+ 0xc8c: 0x0d77, 0xc8d: 0x0e2b, 0xc8e: 0x0e5f, 0xc8f: 0x1113, 0xc90: 0x113b, 0xc91: 0x14a7,
+ 0xc92: 0x084f, 0xc93: 0x11a7, 0xc94: 0x07f3, 0xc95: 0x07ef, 0xc96: 0x1097, 0xc97: 0x1127,
+ 0xc98: 0x125b, 0xc99: 0x14af, 0xc9a: 0x1367, 0xc9b: 0x0c27, 0xc9c: 0x0d73, 0xc9d: 0x1357,
+ 0xc9e: 0x06f7, 0xc9f: 0x0a63, 0xca0: 0x0b93, 0xca1: 0x0f2f, 0xca2: 0x0faf, 0xca3: 0x0873,
+ 0xca4: 0x103b, 0xca5: 0x075f, 0xca6: 0x0b77, 0xca7: 0x06d7, 0xca8: 0x0deb, 0xca9: 0x0ca3,
+ 0xcaa: 0x110f, 0xcab: 0x08c7, 0xcac: 0x09b3, 0xcad: 0x0ffb, 0xcae: 0x1263, 0xcaf: 0x133b,
+ 0xcb0: 0x0db7, 0xcb1: 0x13f7, 0xcb2: 0x0de3, 0xcb3: 0x0c37, 0xcb4: 0x121b, 0xcb5: 0x0c57,
+ 0xcb6: 0x0fab, 0xcb7: 0x072b, 0xcb8: 0x07a7, 0xcb9: 0x07eb, 0xcba: 0x0d53, 0xcbb: 0x10fb,
+ 0xcbc: 0x11f3, 0xcbd: 0x1347, 0xcbe: 0x145b, 0xcbf: 0x085b,
+ // Block 0x33, offset 0xcc0
+ 0xcc0: 0x090f, 0xcc1: 0x0a17, 0xcc2: 0x0b2f, 0xcc3: 0x0cbf, 0xcc4: 0x0e7b, 0xcc5: 0x103f,
+ 0xcc6: 0x1497, 0xcc7: 0x157b, 0xcc8: 0x15cf, 0xcc9: 0x15e7, 0xcca: 0x0837, 0xccb: 0x0cf3,
+ 0xccc: 0x0da3, 0xccd: 0x13eb, 0xcce: 0x0afb, 0xccf: 0x0bd7, 0xcd0: 0x0bf3, 0xcd1: 0x0c83,
+ 0xcd2: 0x0e6b, 0xcd3: 0x0eb7, 0xcd4: 0x0f67, 0xcd5: 0x108b, 0xcd6: 0x112f, 0xcd7: 0x1193,
+ 0xcd8: 0x13db, 0xcd9: 0x126b, 0xcda: 0x1403, 0xcdb: 0x147f, 0xcdc: 0x080f, 0xcdd: 0x083b,
+ 0xcde: 0x0923, 0xcdf: 0x0ea7, 0xce0: 0x12f3, 0xce1: 0x133b, 0xce2: 0x0b1b, 0xce3: 0x0b8b,
+ 0xce4: 0x0c4f, 0xce5: 0x0daf, 0xce6: 0x10d7, 0xce7: 0x0f23, 0xce8: 0x073b, 0xce9: 0x097f,
+ 0xcea: 0x0a63, 0xceb: 0x0ac7, 0xcec: 0x0b97, 0xced: 0x0f3f, 0xcee: 0x0f5b, 0xcef: 0x116b,
+ 0xcf0: 0x118b, 0xcf1: 0x1463, 0xcf2: 0x14e3, 0xcf3: 0x14f3, 0xcf4: 0x152f, 0xcf5: 0x0753,
+ 0xcf6: 0x107f, 0xcf7: 0x144f, 0xcf8: 0x14cb, 0xcf9: 0x0baf, 0xcfa: 0x0717, 0xcfb: 0x0777,
+ 0xcfc: 0x0a67, 0xcfd: 0x0a87, 0xcfe: 0x0caf, 0xcff: 0x0d73,
+ // Block 0x34, offset 0xd00
+ 0xd00: 0x0ec3, 0xd01: 0x0fcb, 0xd02: 0x1277, 0xd03: 0x1417, 0xd04: 0x1623, 0xd05: 0x0ce3,
+ 0xd06: 0x14a3, 0xd07: 0x0833, 0xd08: 0x0d2f, 0xd09: 0x0d3b, 0xd0a: 0x0e0f, 0xd0b: 0x0e47,
+ 0xd0c: 0x0f4b, 0xd0d: 0x0fa7, 0xd0e: 0x1027, 0xd0f: 0x110b, 0xd10: 0x153b, 0xd11: 0x07af,
+ 0xd12: 0x0c03, 0xd13: 0x14b3, 0xd14: 0x0767, 0xd15: 0x0aab, 0xd16: 0x0e2f, 0xd17: 0x13df,
+ 0xd18: 0x0b67, 0xd19: 0x0bb7, 0xd1a: 0x0d43, 0xd1b: 0x0f2f, 0xd1c: 0x14bb, 0xd1d: 0x0817,
+ 0xd1e: 0x08ff, 0xd1f: 0x0a97, 0xd20: 0x0cd3, 0xd21: 0x0d1f, 0xd22: 0x0d5f, 0xd23: 0x0df3,
+ 0xd24: 0x0f47, 0xd25: 0x0fbb, 0xd26: 0x1157, 0xd27: 0x12f7, 0xd28: 0x1303, 0xd29: 0x1457,
+ 0xd2a: 0x14d7, 0xd2b: 0x0883, 0xd2c: 0x0e4b, 0xd2d: 0x0903, 0xd2e: 0x0ec7, 0xd2f: 0x0f6b,
+ 0xd30: 0x1287, 0xd31: 0x14bf, 0xd32: 0x15ab, 0xd33: 0x15d3, 0xd34: 0x0d37, 0xd35: 0x0e27,
+ 0xd36: 0x11c3, 0xd37: 0x10b7, 0xd38: 0x10c3, 0xd39: 0x10e7, 0xd3a: 0x0f17, 0xd3b: 0x0e9f,
+ 0xd3c: 0x1363, 0xd3d: 0x0733, 0xd3e: 0x122b, 0xd3f: 0x081b,
+ // Block 0x35, offset 0xd40
+ 0xd40: 0x080b, 0xd41: 0x0b0b, 0xd42: 0x0c2b, 0xd43: 0x10f3, 0xd44: 0x0a53, 0xd45: 0x0e03,
+ 0xd46: 0x0cef, 0xd47: 0x13e7, 0xd48: 0x12e7, 0xd49: 0x14ab, 0xd4a: 0x1323, 0xd4b: 0x0b27,
+ 0xd4c: 0x0787, 0xd4d: 0x095b, 0xd50: 0x09af,
+ 0xd52: 0x0cdf, 0xd55: 0x07f7, 0xd56: 0x0f1f, 0xd57: 0x0fe3,
+ 0xd58: 0x1047, 0xd59: 0x1063, 0xd5a: 0x1067, 0xd5b: 0x107b, 0xd5c: 0x14fb, 0xd5d: 0x10eb,
+ 0xd5e: 0x116f, 0xd60: 0x128f, 0xd62: 0x1353,
+ 0xd65: 0x1407, 0xd66: 0x1433,
+ 0xd6a: 0x154f, 0xd6b: 0x1553, 0xd6c: 0x1557, 0xd6d: 0x15bb, 0xd6e: 0x142b, 0xd6f: 0x14c7,
+ 0xd70: 0x0757, 0xd71: 0x077b, 0xd72: 0x078f, 0xd73: 0x084b, 0xd74: 0x0857, 0xd75: 0x0897,
+ 0xd76: 0x094b, 0xd77: 0x0967, 0xd78: 0x096f, 0xd79: 0x09ab, 0xd7a: 0x09b7, 0xd7b: 0x0a93,
+ 0xd7c: 0x0a9b, 0xd7d: 0x0ba3, 0xd7e: 0x0bcb, 0xd7f: 0x0bd3,
+ // Block 0x36, offset 0xd80
+ 0xd80: 0x0beb, 0xd81: 0x0c97, 0xd82: 0x0cc7, 0xd83: 0x0ce7, 0xd84: 0x0d57, 0xd85: 0x0e1b,
+ 0xd86: 0x0e37, 0xd87: 0x0e67, 0xd88: 0x0ebb, 0xd89: 0x0edb, 0xd8a: 0x0f4f, 0xd8b: 0x102f,
+ 0xd8c: 0x104b, 0xd8d: 0x1053, 0xd8e: 0x104f, 0xd8f: 0x1057, 0xd90: 0x105b, 0xd91: 0x105f,
+ 0xd92: 0x1073, 0xd93: 0x1077, 0xd94: 0x109b, 0xd95: 0x10af, 0xd96: 0x10cb, 0xd97: 0x112f,
+ 0xd98: 0x1137, 0xd99: 0x113f, 0xd9a: 0x1153, 0xd9b: 0x117b, 0xd9c: 0x11cb, 0xd9d: 0x11ff,
+ 0xd9e: 0x11ff, 0xd9f: 0x1267, 0xda0: 0x130f, 0xda1: 0x1327, 0xda2: 0x135b, 0xda3: 0x135f,
+ 0xda4: 0x13a3, 0xda5: 0x13a7, 0xda6: 0x13ff, 0xda7: 0x1407, 0xda8: 0x14db, 0xda9: 0x151f,
+ 0xdaa: 0x1537, 0xdab: 0x0b9b, 0xdac: 0x171e, 0xdad: 0x11e3,
+ 0xdb0: 0x06df, 0xdb1: 0x07e3, 0xdb2: 0x07a3, 0xdb3: 0x074b, 0xdb4: 0x078b, 0xdb5: 0x07b7,
+ 0xdb6: 0x0847, 0xdb7: 0x0863, 0xdb8: 0x094b, 0xdb9: 0x0937, 0xdba: 0x0947, 0xdbb: 0x0963,
+ 0xdbc: 0x09af, 0xdbd: 0x09bf, 0xdbe: 0x0a03, 0xdbf: 0x0a0f,
+ // Block 0x37, offset 0xdc0
+ 0xdc0: 0x0a2b, 0xdc1: 0x0a3b, 0xdc2: 0x0b23, 0xdc3: 0x0b2b, 0xdc4: 0x0b5b, 0xdc5: 0x0b7b,
+ 0xdc6: 0x0bab, 0xdc7: 0x0bc3, 0xdc8: 0x0bb3, 0xdc9: 0x0bd3, 0xdca: 0x0bc7, 0xdcb: 0x0beb,
+ 0xdcc: 0x0c07, 0xdcd: 0x0c5f, 0xdce: 0x0c6b, 0xdcf: 0x0c73, 0xdd0: 0x0c9b, 0xdd1: 0x0cdf,
+ 0xdd2: 0x0d0f, 0xdd3: 0x0d13, 0xdd4: 0x0d27, 0xdd5: 0x0da7, 0xdd6: 0x0db7, 0xdd7: 0x0e0f,
+ 0xdd8: 0x0e5b, 0xdd9: 0x0e53, 0xdda: 0x0e67, 0xddb: 0x0e83, 0xddc: 0x0ebb, 0xddd: 0x1013,
+ 0xdde: 0x0edf, 0xddf: 0x0f13, 0xde0: 0x0f1f, 0xde1: 0x0f5f, 0xde2: 0x0f7b, 0xde3: 0x0f9f,
+ 0xde4: 0x0fc3, 0xde5: 0x0fc7, 0xde6: 0x0fe3, 0xde7: 0x0fe7, 0xde8: 0x0ff7, 0xde9: 0x100b,
+ 0xdea: 0x1007, 0xdeb: 0x1037, 0xdec: 0x10b3, 0xded: 0x10cb, 0xdee: 0x10e3, 0xdef: 0x111b,
+ 0xdf0: 0x112f, 0xdf1: 0x114b, 0xdf2: 0x117b, 0xdf3: 0x122f, 0xdf4: 0x1257, 0xdf5: 0x12cb,
+ 0xdf6: 0x1313, 0xdf7: 0x131f, 0xdf8: 0x1327, 0xdf9: 0x133f, 0xdfa: 0x1353, 0xdfb: 0x1343,
+ 0xdfc: 0x135b, 0xdfd: 0x1357, 0xdfe: 0x134f, 0xdff: 0x135f,
+ // Block 0x38, offset 0xe00
+ 0xe00: 0x136b, 0xe01: 0x13a7, 0xe02: 0x13e3, 0xe03: 0x1413, 0xe04: 0x144b, 0xe05: 0x146b,
+ 0xe06: 0x14b7, 0xe07: 0x14db, 0xe08: 0x14fb, 0xe09: 0x150f, 0xe0a: 0x151f, 0xe0b: 0x152b,
+ 0xe0c: 0x1537, 0xe0d: 0x158b, 0xe0e: 0x162b, 0xe0f: 0x16b5, 0xe10: 0x16b0, 0xe11: 0x16e2,
+ 0xe12: 0x0607, 0xe13: 0x062f, 0xe14: 0x0633, 0xe15: 0x1764, 0xe16: 0x1791, 0xe17: 0x1809,
+ 0xe18: 0x1617, 0xe19: 0x1627,
+ // Block 0x39, offset 0xe40
+ 0xe40: 0x19d5, 0xe41: 0x19d8, 0xe42: 0x19db, 0xe43: 0x1c08, 0xe44: 0x1c0c, 0xe45: 0x1a5f,
+ 0xe46: 0x1a5f,
+ 0xe53: 0x1d75, 0xe54: 0x1d66, 0xe55: 0x1d6b, 0xe56: 0x1d7a, 0xe57: 0x1d70,
+ 0xe5d: 0x4390,
+ 0xe5e: 0x8115, 0xe5f: 0x4402, 0xe60: 0x022d, 0xe61: 0x0215, 0xe62: 0x021e, 0xe63: 0x0221,
+ 0xe64: 0x0224, 0xe65: 0x0227, 0xe66: 0x022a, 0xe67: 0x0230, 0xe68: 0x0233, 0xe69: 0x0017,
+ 0xe6a: 0x43f0, 0xe6b: 0x43f6, 0xe6c: 0x44f4, 0xe6d: 0x44fc, 0xe6e: 0x4348, 0xe6f: 0x434e,
+ 0xe70: 0x4354, 0xe71: 0x435a, 0xe72: 0x4366, 0xe73: 0x436c, 0xe74: 0x4372, 0xe75: 0x437e,
+ 0xe76: 0x4384, 0xe78: 0x438a, 0xe79: 0x4396, 0xe7a: 0x439c, 0xe7b: 0x43a2,
+ 0xe7c: 0x43ae, 0xe7e: 0x43b4,
+ // Block 0x3a, offset 0xe80
+ 0xe80: 0x43ba, 0xe81: 0x43c0, 0xe83: 0x43c6, 0xe84: 0x43cc,
+ 0xe86: 0x43d8, 0xe87: 0x43de, 0xe88: 0x43e4, 0xe89: 0x43ea, 0xe8a: 0x43fc, 0xe8b: 0x4378,
+ 0xe8c: 0x4360, 0xe8d: 0x43a8, 0xe8e: 0x43d2, 0xe8f: 0x1d7f, 0xe90: 0x0299, 0xe91: 0x0299,
+ 0xe92: 0x02a2, 0xe93: 0x02a2, 0xe94: 0x02a2, 0xe95: 0x02a2, 0xe96: 0x02a5, 0xe97: 0x02a5,
+ 0xe98: 0x02a5, 0xe99: 0x02a5, 0xe9a: 0x02ab, 0xe9b: 0x02ab, 0xe9c: 0x02ab, 0xe9d: 0x02ab,
+ 0xe9e: 0x029f, 0xe9f: 0x029f, 0xea0: 0x029f, 0xea1: 0x029f, 0xea2: 0x02a8, 0xea3: 0x02a8,
+ 0xea4: 0x02a8, 0xea5: 0x02a8, 0xea6: 0x029c, 0xea7: 0x029c, 0xea8: 0x029c, 0xea9: 0x029c,
+ 0xeaa: 0x02cf, 0xeab: 0x02cf, 0xeac: 0x02cf, 0xead: 0x02cf, 0xeae: 0x02d2, 0xeaf: 0x02d2,
+ 0xeb0: 0x02d2, 0xeb1: 0x02d2, 0xeb2: 0x02b1, 0xeb3: 0x02b1, 0xeb4: 0x02b1, 0xeb5: 0x02b1,
+ 0xeb6: 0x02ae, 0xeb7: 0x02ae, 0xeb8: 0x02ae, 0xeb9: 0x02ae, 0xeba: 0x02b4, 0xebb: 0x02b4,
+ 0xebc: 0x02b4, 0xebd: 0x02b4, 0xebe: 0x02b7, 0xebf: 0x02b7,
+ // Block 0x3b, offset 0xec0
+ 0xec0: 0x02b7, 0xec1: 0x02b7, 0xec2: 0x02c0, 0xec3: 0x02c0, 0xec4: 0x02bd, 0xec5: 0x02bd,
+ 0xec6: 0x02c3, 0xec7: 0x02c3, 0xec8: 0x02ba, 0xec9: 0x02ba, 0xeca: 0x02c9, 0xecb: 0x02c9,
+ 0xecc: 0x02c6, 0xecd: 0x02c6, 0xece: 0x02d5, 0xecf: 0x02d5, 0xed0: 0x02d5, 0xed1: 0x02d5,
+ 0xed2: 0x02db, 0xed3: 0x02db, 0xed4: 0x02db, 0xed5: 0x02db, 0xed6: 0x02e1, 0xed7: 0x02e1,
+ 0xed8: 0x02e1, 0xed9: 0x02e1, 0xeda: 0x02de, 0xedb: 0x02de, 0xedc: 0x02de, 0xedd: 0x02de,
+ 0xede: 0x02e4, 0xedf: 0x02e4, 0xee0: 0x02e7, 0xee1: 0x02e7, 0xee2: 0x02e7, 0xee3: 0x02e7,
+ 0xee4: 0x446e, 0xee5: 0x446e, 0xee6: 0x02ed, 0xee7: 0x02ed, 0xee8: 0x02ed, 0xee9: 0x02ed,
+ 0xeea: 0x02ea, 0xeeb: 0x02ea, 0xeec: 0x02ea, 0xeed: 0x02ea, 0xeee: 0x0308, 0xeef: 0x0308,
+ 0xef0: 0x4468, 0xef1: 0x4468,
+ // Block 0x3c, offset 0xf00
+ 0xf13: 0x02d8, 0xf14: 0x02d8, 0xf15: 0x02d8, 0xf16: 0x02d8, 0xf17: 0x02f6,
+ 0xf18: 0x02f6, 0xf19: 0x02f3, 0xf1a: 0x02f3, 0xf1b: 0x02f9, 0xf1c: 0x02f9, 0xf1d: 0x204f,
+ 0xf1e: 0x02ff, 0xf1f: 0x02ff, 0xf20: 0x02f0, 0xf21: 0x02f0, 0xf22: 0x02fc, 0xf23: 0x02fc,
+ 0xf24: 0x0305, 0xf25: 0x0305, 0xf26: 0x0305, 0xf27: 0x0305, 0xf28: 0x028d, 0xf29: 0x028d,
+ 0xf2a: 0x25aa, 0xf2b: 0x25aa, 0xf2c: 0x261a, 0xf2d: 0x261a, 0xf2e: 0x25e9, 0xf2f: 0x25e9,
+ 0xf30: 0x2605, 0xf31: 0x2605, 0xf32: 0x25fe, 0xf33: 0x25fe, 0xf34: 0x260c, 0xf35: 0x260c,
+ 0xf36: 0x2613, 0xf37: 0x2613, 0xf38: 0x2613, 0xf39: 0x25f0, 0xf3a: 0x25f0, 0xf3b: 0x25f0,
+ 0xf3c: 0x0302, 0xf3d: 0x0302, 0xf3e: 0x0302, 0xf3f: 0x0302,
+ // Block 0x3d, offset 0xf40
+ 0xf40: 0x25b1, 0xf41: 0x25b8, 0xf42: 0x25d4, 0xf43: 0x25f0, 0xf44: 0x25f7, 0xf45: 0x1d89,
+ 0xf46: 0x1d8e, 0xf47: 0x1d93, 0xf48: 0x1da2, 0xf49: 0x1db1, 0xf4a: 0x1db6, 0xf4b: 0x1dbb,
+ 0xf4c: 0x1dc0, 0xf4d: 0x1dc5, 0xf4e: 0x1dd4, 0xf4f: 0x1de3, 0xf50: 0x1de8, 0xf51: 0x1ded,
+ 0xf52: 0x1dfc, 0xf53: 0x1e0b, 0xf54: 0x1e10, 0xf55: 0x1e15, 0xf56: 0x1e1a, 0xf57: 0x1e29,
+ 0xf58: 0x1e2e, 0xf59: 0x1e3d, 0xf5a: 0x1e42, 0xf5b: 0x1e47, 0xf5c: 0x1e56, 0xf5d: 0x1e5b,
+ 0xf5e: 0x1e60, 0xf5f: 0x1e6a, 0xf60: 0x1ea6, 0xf61: 0x1eb5, 0xf62: 0x1ec4, 0xf63: 0x1ec9,
+ 0xf64: 0x1ece, 0xf65: 0x1ed8, 0xf66: 0x1ee7, 0xf67: 0x1eec, 0xf68: 0x1efb, 0xf69: 0x1f00,
+ 0xf6a: 0x1f05, 0xf6b: 0x1f14, 0xf6c: 0x1f19, 0xf6d: 0x1f28, 0xf6e: 0x1f2d, 0xf6f: 0x1f32,
+ 0xf70: 0x1f37, 0xf71: 0x1f3c, 0xf72: 0x1f41, 0xf73: 0x1f46, 0xf74: 0x1f4b, 0xf75: 0x1f50,
+ 0xf76: 0x1f55, 0xf77: 0x1f5a, 0xf78: 0x1f5f, 0xf79: 0x1f64, 0xf7a: 0x1f69, 0xf7b: 0x1f6e,
+ 0xf7c: 0x1f73, 0xf7d: 0x1f78, 0xf7e: 0x1f7d, 0xf7f: 0x1f87,
+ // Block 0x3e, offset 0xf80
+ 0xf80: 0x1f8c, 0xf81: 0x1f91, 0xf82: 0x1f96, 0xf83: 0x1fa0, 0xf84: 0x1fa5, 0xf85: 0x1faf,
+ 0xf86: 0x1fb4, 0xf87: 0x1fb9, 0xf88: 0x1fbe, 0xf89: 0x1fc3, 0xf8a: 0x1fc8, 0xf8b: 0x1fcd,
+ 0xf8c: 0x1fd2, 0xf8d: 0x1fd7, 0xf8e: 0x1fe6, 0xf8f: 0x1ff5, 0xf90: 0x1ffa, 0xf91: 0x1fff,
+ 0xf92: 0x2004, 0xf93: 0x2009, 0xf94: 0x200e, 0xf95: 0x2018, 0xf96: 0x201d, 0xf97: 0x2022,
+ 0xf98: 0x2031, 0xf99: 0x2040, 0xf9a: 0x2045, 0xf9b: 0x4420, 0xf9c: 0x4426, 0xf9d: 0x445c,
+ 0xf9e: 0x44b3, 0xf9f: 0x44ba, 0xfa0: 0x44c1, 0xfa1: 0x44c8, 0xfa2: 0x44cf, 0xfa3: 0x44d6,
+ 0xfa4: 0x25c6, 0xfa5: 0x25cd, 0xfa6: 0x25d4, 0xfa7: 0x25db, 0xfa8: 0x25f0, 0xfa9: 0x25f7,
+ 0xfaa: 0x1d98, 0xfab: 0x1d9d, 0xfac: 0x1da2, 0xfad: 0x1da7, 0xfae: 0x1db1, 0xfaf: 0x1db6,
+ 0xfb0: 0x1dca, 0xfb1: 0x1dcf, 0xfb2: 0x1dd4, 0xfb3: 0x1dd9, 0xfb4: 0x1de3, 0xfb5: 0x1de8,
+ 0xfb6: 0x1df2, 0xfb7: 0x1df7, 0xfb8: 0x1dfc, 0xfb9: 0x1e01, 0xfba: 0x1e0b, 0xfbb: 0x1e10,
+ 0xfbc: 0x1f3c, 0xfbd: 0x1f41, 0xfbe: 0x1f50, 0xfbf: 0x1f55,
+ // Block 0x3f, offset 0xfc0
+ 0xfc0: 0x1f5a, 0xfc1: 0x1f6e, 0xfc2: 0x1f73, 0xfc3: 0x1f78, 0xfc4: 0x1f7d, 0xfc5: 0x1f96,
+ 0xfc6: 0x1fa0, 0xfc7: 0x1fa5, 0xfc8: 0x1faa, 0xfc9: 0x1fbe, 0xfca: 0x1fdc, 0xfcb: 0x1fe1,
+ 0xfcc: 0x1fe6, 0xfcd: 0x1feb, 0xfce: 0x1ff5, 0xfcf: 0x1ffa, 0xfd0: 0x445c, 0xfd1: 0x2027,
+ 0xfd2: 0x202c, 0xfd3: 0x2031, 0xfd4: 0x2036, 0xfd5: 0x2040, 0xfd6: 0x2045, 0xfd7: 0x25b1,
+ 0xfd8: 0x25b8, 0xfd9: 0x25bf, 0xfda: 0x25d4, 0xfdb: 0x25e2, 0xfdc: 0x1d89, 0xfdd: 0x1d8e,
+ 0xfde: 0x1d93, 0xfdf: 0x1da2, 0xfe0: 0x1dac, 0xfe1: 0x1dbb, 0xfe2: 0x1dc0, 0xfe3: 0x1dc5,
+ 0xfe4: 0x1dd4, 0xfe5: 0x1dde, 0xfe6: 0x1dfc, 0xfe7: 0x1e15, 0xfe8: 0x1e1a, 0xfe9: 0x1e29,
+ 0xfea: 0x1e2e, 0xfeb: 0x1e3d, 0xfec: 0x1e47, 0xfed: 0x1e56, 0xfee: 0x1e5b, 0xfef: 0x1e60,
+ 0xff0: 0x1e6a, 0xff1: 0x1ea6, 0xff2: 0x1eab, 0xff3: 0x1eb5, 0xff4: 0x1ec4, 0xff5: 0x1ec9,
+ 0xff6: 0x1ece, 0xff7: 0x1ed8, 0xff8: 0x1ee7, 0xff9: 0x1efb, 0xffa: 0x1f00, 0xffb: 0x1f05,
+ 0xffc: 0x1f14, 0xffd: 0x1f19, 0xffe: 0x1f28, 0xfff: 0x1f2d,
+ // Block 0x40, offset 0x1000
+ 0x1000: 0x1f32, 0x1001: 0x1f37, 0x1002: 0x1f46, 0x1003: 0x1f4b, 0x1004: 0x1f5f, 0x1005: 0x1f64,
+ 0x1006: 0x1f69, 0x1007: 0x1f6e, 0x1008: 0x1f73, 0x1009: 0x1f87, 0x100a: 0x1f8c, 0x100b: 0x1f91,
+ 0x100c: 0x1f96, 0x100d: 0x1f9b, 0x100e: 0x1faf, 0x100f: 0x1fb4, 0x1010: 0x1fb9, 0x1011: 0x1fbe,
+ 0x1012: 0x1fcd, 0x1013: 0x1fd2, 0x1014: 0x1fd7, 0x1015: 0x1fe6, 0x1016: 0x1ff0, 0x1017: 0x1fff,
+ 0x1018: 0x2004, 0x1019: 0x4450, 0x101a: 0x2018, 0x101b: 0x201d, 0x101c: 0x2022, 0x101d: 0x2031,
+ 0x101e: 0x203b, 0x101f: 0x25d4, 0x1020: 0x25e2, 0x1021: 0x1da2, 0x1022: 0x1dac, 0x1023: 0x1dd4,
+ 0x1024: 0x1dde, 0x1025: 0x1dfc, 0x1026: 0x1e06, 0x1027: 0x1e6a, 0x1028: 0x1e6f, 0x1029: 0x1e92,
+ 0x102a: 0x1e97, 0x102b: 0x1f6e, 0x102c: 0x1f73, 0x102d: 0x1f96, 0x102e: 0x1fe6, 0x102f: 0x1ff0,
+ 0x1030: 0x2031, 0x1031: 0x203b, 0x1032: 0x4504, 0x1033: 0x450c, 0x1034: 0x4514, 0x1035: 0x1ef1,
+ 0x1036: 0x1ef6, 0x1037: 0x1f0a, 0x1038: 0x1f0f, 0x1039: 0x1f1e, 0x103a: 0x1f23, 0x103b: 0x1e74,
+ 0x103c: 0x1e79, 0x103d: 0x1e9c, 0x103e: 0x1ea1, 0x103f: 0x1e33,
+ // Block 0x41, offset 0x1040
+ 0x1040: 0x1e38, 0x1041: 0x1e1f, 0x1042: 0x1e24, 0x1043: 0x1e4c, 0x1044: 0x1e51, 0x1045: 0x1eba,
+ 0x1046: 0x1ebf, 0x1047: 0x1edd, 0x1048: 0x1ee2, 0x1049: 0x1e7e, 0x104a: 0x1e83, 0x104b: 0x1e88,
+ 0x104c: 0x1e92, 0x104d: 0x1e8d, 0x104e: 0x1e65, 0x104f: 0x1eb0, 0x1050: 0x1ed3, 0x1051: 0x1ef1,
+ 0x1052: 0x1ef6, 0x1053: 0x1f0a, 0x1054: 0x1f0f, 0x1055: 0x1f1e, 0x1056: 0x1f23, 0x1057: 0x1e74,
+ 0x1058: 0x1e79, 0x1059: 0x1e9c, 0x105a: 0x1ea1, 0x105b: 0x1e33, 0x105c: 0x1e38, 0x105d: 0x1e1f,
+ 0x105e: 0x1e24, 0x105f: 0x1e4c, 0x1060: 0x1e51, 0x1061: 0x1eba, 0x1062: 0x1ebf, 0x1063: 0x1edd,
+ 0x1064: 0x1ee2, 0x1065: 0x1e7e, 0x1066: 0x1e83, 0x1067: 0x1e88, 0x1068: 0x1e92, 0x1069: 0x1e8d,
+ 0x106a: 0x1e65, 0x106b: 0x1eb0, 0x106c: 0x1ed3, 0x106d: 0x1e7e, 0x106e: 0x1e83, 0x106f: 0x1e88,
+ 0x1070: 0x1e92, 0x1071: 0x1e6f, 0x1072: 0x1e97, 0x1073: 0x1eec, 0x1074: 0x1e56, 0x1075: 0x1e5b,
+ 0x1076: 0x1e60, 0x1077: 0x1e7e, 0x1078: 0x1e83, 0x1079: 0x1e88, 0x107a: 0x1eec, 0x107b: 0x1efb,
+ 0x107c: 0x4408, 0x107d: 0x4408,
+ // Block 0x42, offset 0x1080
+ 0x1090: 0x2311, 0x1091: 0x2326,
+ 0x1092: 0x2326, 0x1093: 0x232d, 0x1094: 0x2334, 0x1095: 0x2349, 0x1096: 0x2350, 0x1097: 0x2357,
+ 0x1098: 0x237a, 0x1099: 0x237a, 0x109a: 0x239d, 0x109b: 0x2396, 0x109c: 0x23b2, 0x109d: 0x23a4,
+ 0x109e: 0x23ab, 0x109f: 0x23ce, 0x10a0: 0x23ce, 0x10a1: 0x23c7, 0x10a2: 0x23d5, 0x10a3: 0x23d5,
+ 0x10a4: 0x23ff, 0x10a5: 0x23ff, 0x10a6: 0x241b, 0x10a7: 0x23e3, 0x10a8: 0x23e3, 0x10a9: 0x23dc,
+ 0x10aa: 0x23f1, 0x10ab: 0x23f1, 0x10ac: 0x23f8, 0x10ad: 0x23f8, 0x10ae: 0x2422, 0x10af: 0x2430,
+ 0x10b0: 0x2430, 0x10b1: 0x2437, 0x10b2: 0x2437, 0x10b3: 0x243e, 0x10b4: 0x2445, 0x10b5: 0x244c,
+ 0x10b6: 0x2453, 0x10b7: 0x2453, 0x10b8: 0x245a, 0x10b9: 0x2468, 0x10ba: 0x2476, 0x10bb: 0x246f,
+ 0x10bc: 0x247d, 0x10bd: 0x247d, 0x10be: 0x2492, 0x10bf: 0x2499,
+ // Block 0x43, offset 0x10c0
+ 0x10c0: 0x24ca, 0x10c1: 0x24d8, 0x10c2: 0x24d1, 0x10c3: 0x24b5, 0x10c4: 0x24b5, 0x10c5: 0x24df,
+ 0x10c6: 0x24df, 0x10c7: 0x24e6, 0x10c8: 0x24e6, 0x10c9: 0x2510, 0x10ca: 0x2517, 0x10cb: 0x251e,
+ 0x10cc: 0x24f4, 0x10cd: 0x2502, 0x10ce: 0x2525, 0x10cf: 0x252c,
+ 0x10d2: 0x24fb, 0x10d3: 0x2580, 0x10d4: 0x2587, 0x10d5: 0x255d, 0x10d6: 0x2564, 0x10d7: 0x2548,
+ 0x10d8: 0x2548, 0x10d9: 0x254f, 0x10da: 0x2579, 0x10db: 0x2572, 0x10dc: 0x259c, 0x10dd: 0x259c,
+ 0x10de: 0x230a, 0x10df: 0x231f, 0x10e0: 0x2318, 0x10e1: 0x2342, 0x10e2: 0x233b, 0x10e3: 0x2365,
+ 0x10e4: 0x235e, 0x10e5: 0x2388, 0x10e6: 0x236c, 0x10e7: 0x2381, 0x10e8: 0x23b9, 0x10e9: 0x2406,
+ 0x10ea: 0x23ea, 0x10eb: 0x2429, 0x10ec: 0x24c3, 0x10ed: 0x24ed, 0x10ee: 0x2595, 0x10ef: 0x258e,
+ 0x10f0: 0x25a3, 0x10f1: 0x253a, 0x10f2: 0x24a0, 0x10f3: 0x256b, 0x10f4: 0x2492, 0x10f5: 0x24ca,
+ 0x10f6: 0x2461, 0x10f7: 0x24ae, 0x10f8: 0x2541, 0x10f9: 0x2533, 0x10fa: 0x24bc, 0x10fb: 0x24a7,
+ 0x10fc: 0x24bc, 0x10fd: 0x2541, 0x10fe: 0x2373, 0x10ff: 0x238f,
+ // Block 0x44, offset 0x1100
+ 0x1100: 0x2509, 0x1101: 0x2484, 0x1102: 0x2303, 0x1103: 0x24a7, 0x1104: 0x244c, 0x1105: 0x241b,
+ 0x1106: 0x23c0, 0x1107: 0x2556,
+ 0x1130: 0x2414, 0x1131: 0x248b, 0x1132: 0x27bf, 0x1133: 0x27b6, 0x1134: 0x27ec, 0x1135: 0x27da,
+ 0x1136: 0x27c8, 0x1137: 0x27e3, 0x1138: 0x27f5, 0x1139: 0x240d, 0x113a: 0x2c7c, 0x113b: 0x2afc,
+ 0x113c: 0x27d1,
+ // Block 0x45, offset 0x1140
+ 0x1150: 0x0019, 0x1151: 0x0483,
+ 0x1152: 0x0487, 0x1153: 0x0035, 0x1154: 0x0037, 0x1155: 0x0003, 0x1156: 0x003f, 0x1157: 0x04bf,
+ 0x1158: 0x04c3, 0x1159: 0x1b5c,
+ 0x1160: 0x8132, 0x1161: 0x8132, 0x1162: 0x8132, 0x1163: 0x8132,
+ 0x1164: 0x8132, 0x1165: 0x8132, 0x1166: 0x8132, 0x1167: 0x812d, 0x1168: 0x812d, 0x1169: 0x812d,
+ 0x116a: 0x812d, 0x116b: 0x812d, 0x116c: 0x812d, 0x116d: 0x812d, 0x116e: 0x8132, 0x116f: 0x8132,
+ 0x1170: 0x1873, 0x1171: 0x0443, 0x1172: 0x043f, 0x1173: 0x007f, 0x1174: 0x007f, 0x1175: 0x0011,
+ 0x1176: 0x0013, 0x1177: 0x00b7, 0x1178: 0x00bb, 0x1179: 0x04b7, 0x117a: 0x04bb, 0x117b: 0x04ab,
+ 0x117c: 0x04af, 0x117d: 0x0493, 0x117e: 0x0497, 0x117f: 0x048b,
+ // Block 0x46, offset 0x1180
+ 0x1180: 0x048f, 0x1181: 0x049b, 0x1182: 0x049f, 0x1183: 0x04a3, 0x1184: 0x04a7,
+ 0x1187: 0x0077, 0x1188: 0x007b, 0x1189: 0x4269, 0x118a: 0x4269, 0x118b: 0x4269,
+ 0x118c: 0x4269, 0x118d: 0x007f, 0x118e: 0x007f, 0x118f: 0x007f, 0x1190: 0x0019, 0x1191: 0x0483,
+ 0x1192: 0x001d, 0x1194: 0x0037, 0x1195: 0x0035, 0x1196: 0x003f, 0x1197: 0x0003,
+ 0x1198: 0x0443, 0x1199: 0x0011, 0x119a: 0x0013, 0x119b: 0x00b7, 0x119c: 0x00bb, 0x119d: 0x04b7,
+ 0x119e: 0x04bb, 0x119f: 0x0007, 0x11a0: 0x000d, 0x11a1: 0x0015, 0x11a2: 0x0017, 0x11a3: 0x001b,
+ 0x11a4: 0x0039, 0x11a5: 0x003d, 0x11a6: 0x003b, 0x11a8: 0x0079, 0x11a9: 0x0009,
+ 0x11aa: 0x000b, 0x11ab: 0x0041,
+ 0x11b0: 0x42aa, 0x11b1: 0x442c, 0x11b2: 0x42af, 0x11b4: 0x42b4,
+ 0x11b6: 0x42b9, 0x11b7: 0x4432, 0x11b8: 0x42be, 0x11b9: 0x4438, 0x11ba: 0x42c3, 0x11bb: 0x443e,
+ 0x11bc: 0x42c8, 0x11bd: 0x4444, 0x11be: 0x42cd, 0x11bf: 0x444a,
+ // Block 0x47, offset 0x11c0
+ 0x11c0: 0x0236, 0x11c1: 0x440e, 0x11c2: 0x440e, 0x11c3: 0x4414, 0x11c4: 0x4414, 0x11c5: 0x4456,
+ 0x11c6: 0x4456, 0x11c7: 0x441a, 0x11c8: 0x441a, 0x11c9: 0x4462, 0x11ca: 0x4462, 0x11cb: 0x4462,
+ 0x11cc: 0x4462, 0x11cd: 0x0239, 0x11ce: 0x0239, 0x11cf: 0x023c, 0x11d0: 0x023c, 0x11d1: 0x023c,
+ 0x11d2: 0x023c, 0x11d3: 0x023f, 0x11d4: 0x023f, 0x11d5: 0x0242, 0x11d6: 0x0242, 0x11d7: 0x0242,
+ 0x11d8: 0x0242, 0x11d9: 0x0245, 0x11da: 0x0245, 0x11db: 0x0245, 0x11dc: 0x0245, 0x11dd: 0x0248,
+ 0x11de: 0x0248, 0x11df: 0x0248, 0x11e0: 0x0248, 0x11e1: 0x024b, 0x11e2: 0x024b, 0x11e3: 0x024b,
+ 0x11e4: 0x024b, 0x11e5: 0x024e, 0x11e6: 0x024e, 0x11e7: 0x024e, 0x11e8: 0x024e, 0x11e9: 0x0251,
+ 0x11ea: 0x0251, 0x11eb: 0x0254, 0x11ec: 0x0254, 0x11ed: 0x0257, 0x11ee: 0x0257, 0x11ef: 0x025a,
+ 0x11f0: 0x025a, 0x11f1: 0x025d, 0x11f2: 0x025d, 0x11f3: 0x025d, 0x11f4: 0x025d, 0x11f5: 0x0260,
+ 0x11f6: 0x0260, 0x11f7: 0x0260, 0x11f8: 0x0260, 0x11f9: 0x0263, 0x11fa: 0x0263, 0x11fb: 0x0263,
+ 0x11fc: 0x0263, 0x11fd: 0x0266, 0x11fe: 0x0266, 0x11ff: 0x0266,
+ // Block 0x48, offset 0x1200
+ 0x1200: 0x0266, 0x1201: 0x0269, 0x1202: 0x0269, 0x1203: 0x0269, 0x1204: 0x0269, 0x1205: 0x026c,
+ 0x1206: 0x026c, 0x1207: 0x026c, 0x1208: 0x026c, 0x1209: 0x026f, 0x120a: 0x026f, 0x120b: 0x026f,
+ 0x120c: 0x026f, 0x120d: 0x0272, 0x120e: 0x0272, 0x120f: 0x0272, 0x1210: 0x0272, 0x1211: 0x0275,
+ 0x1212: 0x0275, 0x1213: 0x0275, 0x1214: 0x0275, 0x1215: 0x0278, 0x1216: 0x0278, 0x1217: 0x0278,
+ 0x1218: 0x0278, 0x1219: 0x027b, 0x121a: 0x027b, 0x121b: 0x027b, 0x121c: 0x027b, 0x121d: 0x027e,
+ 0x121e: 0x027e, 0x121f: 0x027e, 0x1220: 0x027e, 0x1221: 0x0281, 0x1222: 0x0281, 0x1223: 0x0281,
+ 0x1224: 0x0281, 0x1225: 0x0284, 0x1226: 0x0284, 0x1227: 0x0284, 0x1228: 0x0284, 0x1229: 0x0287,
+ 0x122a: 0x0287, 0x122b: 0x0287, 0x122c: 0x0287, 0x122d: 0x028a, 0x122e: 0x028a, 0x122f: 0x028d,
+ 0x1230: 0x028d, 0x1231: 0x0290, 0x1232: 0x0290, 0x1233: 0x0290, 0x1234: 0x0290, 0x1235: 0x2e00,
+ 0x1236: 0x2e00, 0x1237: 0x2e08, 0x1238: 0x2e08, 0x1239: 0x2e10, 0x123a: 0x2e10, 0x123b: 0x1f82,
+ 0x123c: 0x1f82,
+ // Block 0x49, offset 0x1240
+ 0x1240: 0x0081, 0x1241: 0x0083, 0x1242: 0x0085, 0x1243: 0x0087, 0x1244: 0x0089, 0x1245: 0x008b,
+ 0x1246: 0x008d, 0x1247: 0x008f, 0x1248: 0x0091, 0x1249: 0x0093, 0x124a: 0x0095, 0x124b: 0x0097,
+ 0x124c: 0x0099, 0x124d: 0x009b, 0x124e: 0x009d, 0x124f: 0x009f, 0x1250: 0x00a1, 0x1251: 0x00a3,
+ 0x1252: 0x00a5, 0x1253: 0x00a7, 0x1254: 0x00a9, 0x1255: 0x00ab, 0x1256: 0x00ad, 0x1257: 0x00af,
+ 0x1258: 0x00b1, 0x1259: 0x00b3, 0x125a: 0x00b5, 0x125b: 0x00b7, 0x125c: 0x00b9, 0x125d: 0x00bb,
+ 0x125e: 0x00bd, 0x125f: 0x0477, 0x1260: 0x047b, 0x1261: 0x0487, 0x1262: 0x049b, 0x1263: 0x049f,
+ 0x1264: 0x0483, 0x1265: 0x05ab, 0x1266: 0x05a3, 0x1267: 0x04c7, 0x1268: 0x04cf, 0x1269: 0x04d7,
+ 0x126a: 0x04df, 0x126b: 0x04e7, 0x126c: 0x056b, 0x126d: 0x0573, 0x126e: 0x057b, 0x126f: 0x051f,
+ 0x1270: 0x05af, 0x1271: 0x04cb, 0x1272: 0x04d3, 0x1273: 0x04db, 0x1274: 0x04e3, 0x1275: 0x04eb,
+ 0x1276: 0x04ef, 0x1277: 0x04f3, 0x1278: 0x04f7, 0x1279: 0x04fb, 0x127a: 0x04ff, 0x127b: 0x0503,
+ 0x127c: 0x0507, 0x127d: 0x050b, 0x127e: 0x050f, 0x127f: 0x0513,
+ // Block 0x4a, offset 0x1280
+ 0x1280: 0x0517, 0x1281: 0x051b, 0x1282: 0x0523, 0x1283: 0x0527, 0x1284: 0x052b, 0x1285: 0x052f,
+ 0x1286: 0x0533, 0x1287: 0x0537, 0x1288: 0x053b, 0x1289: 0x053f, 0x128a: 0x0543, 0x128b: 0x0547,
+ 0x128c: 0x054b, 0x128d: 0x054f, 0x128e: 0x0553, 0x128f: 0x0557, 0x1290: 0x055b, 0x1291: 0x055f,
+ 0x1292: 0x0563, 0x1293: 0x0567, 0x1294: 0x056f, 0x1295: 0x0577, 0x1296: 0x057f, 0x1297: 0x0583,
+ 0x1298: 0x0587, 0x1299: 0x058b, 0x129a: 0x058f, 0x129b: 0x0593, 0x129c: 0x0597, 0x129d: 0x05a7,
+ 0x129e: 0x4a78, 0x129f: 0x4a7e, 0x12a0: 0x03c3, 0x12a1: 0x0313, 0x12a2: 0x0317, 0x12a3: 0x4a3b,
+ 0x12a4: 0x031b, 0x12a5: 0x4a41, 0x12a6: 0x4a47, 0x12a7: 0x031f, 0x12a8: 0x0323, 0x12a9: 0x0327,
+ 0x12aa: 0x4a4d, 0x12ab: 0x4a53, 0x12ac: 0x4a59, 0x12ad: 0x4a5f, 0x12ae: 0x4a65, 0x12af: 0x4a6b,
+ 0x12b0: 0x0367, 0x12b1: 0x032b, 0x12b2: 0x032f, 0x12b3: 0x0333, 0x12b4: 0x037b, 0x12b5: 0x0337,
+ 0x12b6: 0x033b, 0x12b7: 0x033f, 0x12b8: 0x0343, 0x12b9: 0x0347, 0x12ba: 0x034b, 0x12bb: 0x034f,
+ 0x12bc: 0x0353, 0x12bd: 0x0357, 0x12be: 0x035b,
+ // Block 0x4b, offset 0x12c0
+ 0x12c2: 0x49bd, 0x12c3: 0x49c3, 0x12c4: 0x49c9, 0x12c5: 0x49cf,
+ 0x12c6: 0x49d5, 0x12c7: 0x49db, 0x12ca: 0x49e1, 0x12cb: 0x49e7,
+ 0x12cc: 0x49ed, 0x12cd: 0x49f3, 0x12ce: 0x49f9, 0x12cf: 0x49ff,
+ 0x12d2: 0x4a05, 0x12d3: 0x4a0b, 0x12d4: 0x4a11, 0x12d5: 0x4a17, 0x12d6: 0x4a1d, 0x12d7: 0x4a23,
+ 0x12da: 0x4a29, 0x12db: 0x4a2f, 0x12dc: 0x4a35,
+ 0x12e0: 0x00bf, 0x12e1: 0x00c2, 0x12e2: 0x00cb, 0x12e3: 0x4264,
+ 0x12e4: 0x00c8, 0x12e5: 0x00c5, 0x12e6: 0x0447, 0x12e8: 0x046b, 0x12e9: 0x044b,
+ 0x12ea: 0x044f, 0x12eb: 0x0453, 0x12ec: 0x0457, 0x12ed: 0x046f, 0x12ee: 0x0473,
+ // Block 0x4c, offset 0x1300
+ 0x1300: 0x0063, 0x1301: 0x0065, 0x1302: 0x0067, 0x1303: 0x0069, 0x1304: 0x006b, 0x1305: 0x006d,
+ 0x1306: 0x006f, 0x1307: 0x0071, 0x1308: 0x0073, 0x1309: 0x0075, 0x130a: 0x0083, 0x130b: 0x0085,
+ 0x130c: 0x0087, 0x130d: 0x0089, 0x130e: 0x008b, 0x130f: 0x008d, 0x1310: 0x008f, 0x1311: 0x0091,
+ 0x1312: 0x0093, 0x1313: 0x0095, 0x1314: 0x0097, 0x1315: 0x0099, 0x1316: 0x009b, 0x1317: 0x009d,
+ 0x1318: 0x009f, 0x1319: 0x00a1, 0x131a: 0x00a3, 0x131b: 0x00a5, 0x131c: 0x00a7, 0x131d: 0x00a9,
+ 0x131e: 0x00ab, 0x131f: 0x00ad, 0x1320: 0x00af, 0x1321: 0x00b1, 0x1322: 0x00b3, 0x1323: 0x00b5,
+ 0x1324: 0x00dd, 0x1325: 0x00f2, 0x1328: 0x0173, 0x1329: 0x0176,
+ 0x132a: 0x0179, 0x132b: 0x017c, 0x132c: 0x017f, 0x132d: 0x0182, 0x132e: 0x0185, 0x132f: 0x0188,
+ 0x1330: 0x018b, 0x1331: 0x018e, 0x1332: 0x0191, 0x1333: 0x0194, 0x1334: 0x0197, 0x1335: 0x019a,
+ 0x1336: 0x019d, 0x1337: 0x01a0, 0x1338: 0x01a3, 0x1339: 0x0188, 0x133a: 0x01a6, 0x133b: 0x01a9,
+ 0x133c: 0x01ac, 0x133d: 0x01af, 0x133e: 0x01b2, 0x133f: 0x01b5,
+ // Block 0x4d, offset 0x1340
+ 0x1340: 0x01fd, 0x1341: 0x0200, 0x1342: 0x0203, 0x1343: 0x045b, 0x1344: 0x01c7, 0x1345: 0x01d0,
+ 0x1346: 0x01d6, 0x1347: 0x01fa, 0x1348: 0x01eb, 0x1349: 0x01e8, 0x134a: 0x0206, 0x134b: 0x0209,
+ 0x134e: 0x0021, 0x134f: 0x0023, 0x1350: 0x0025, 0x1351: 0x0027,
+ 0x1352: 0x0029, 0x1353: 0x002b, 0x1354: 0x002d, 0x1355: 0x002f, 0x1356: 0x0031, 0x1357: 0x0033,
+ 0x1358: 0x0021, 0x1359: 0x0023, 0x135a: 0x0025, 0x135b: 0x0027, 0x135c: 0x0029, 0x135d: 0x002b,
+ 0x135e: 0x002d, 0x135f: 0x002f, 0x1360: 0x0031, 0x1361: 0x0033, 0x1362: 0x0021, 0x1363: 0x0023,
+ 0x1364: 0x0025, 0x1365: 0x0027, 0x1366: 0x0029, 0x1367: 0x002b, 0x1368: 0x002d, 0x1369: 0x002f,
+ 0x136a: 0x0031, 0x136b: 0x0033, 0x136c: 0x0021, 0x136d: 0x0023, 0x136e: 0x0025, 0x136f: 0x0027,
+ 0x1370: 0x0029, 0x1371: 0x002b, 0x1372: 0x002d, 0x1373: 0x002f, 0x1374: 0x0031, 0x1375: 0x0033,
+ 0x1376: 0x0021, 0x1377: 0x0023, 0x1378: 0x0025, 0x1379: 0x0027, 0x137a: 0x0029, 0x137b: 0x002b,
+ 0x137c: 0x002d, 0x137d: 0x002f, 0x137e: 0x0031, 0x137f: 0x0033,
+ // Block 0x4e, offset 0x1380
+ 0x1380: 0x0239, 0x1381: 0x023c, 0x1382: 0x0248, 0x1383: 0x0251, 0x1385: 0x028a,
+ 0x1386: 0x025a, 0x1387: 0x024b, 0x1388: 0x0269, 0x1389: 0x0290, 0x138a: 0x027b, 0x138b: 0x027e,
+ 0x138c: 0x0281, 0x138d: 0x0284, 0x138e: 0x025d, 0x138f: 0x026f, 0x1390: 0x0275, 0x1391: 0x0263,
+ 0x1392: 0x0278, 0x1393: 0x0257, 0x1394: 0x0260, 0x1395: 0x0242, 0x1396: 0x0245, 0x1397: 0x024e,
+ 0x1398: 0x0254, 0x1399: 0x0266, 0x139a: 0x026c, 0x139b: 0x0272, 0x139c: 0x0293, 0x139d: 0x02e4,
+ 0x139e: 0x02cc, 0x139f: 0x0296, 0x13a1: 0x023c, 0x13a2: 0x0248,
+ 0x13a4: 0x0287, 0x13a7: 0x024b, 0x13a9: 0x0290,
+ 0x13aa: 0x027b, 0x13ab: 0x027e, 0x13ac: 0x0281, 0x13ad: 0x0284, 0x13ae: 0x025d, 0x13af: 0x026f,
+ 0x13b0: 0x0275, 0x13b1: 0x0263, 0x13b2: 0x0278, 0x13b4: 0x0260, 0x13b5: 0x0242,
+ 0x13b6: 0x0245, 0x13b7: 0x024e, 0x13b9: 0x0266, 0x13bb: 0x0272,
+ // Block 0x4f, offset 0x13c0
+ 0x13c2: 0x0248,
+ 0x13c7: 0x024b, 0x13c9: 0x0290, 0x13cb: 0x027e,
+ 0x13cd: 0x0284, 0x13ce: 0x025d, 0x13cf: 0x026f, 0x13d1: 0x0263,
+ 0x13d2: 0x0278, 0x13d4: 0x0260, 0x13d7: 0x024e,
+ 0x13d9: 0x0266, 0x13db: 0x0272, 0x13dd: 0x02e4,
+ 0x13df: 0x0296, 0x13e1: 0x023c, 0x13e2: 0x0248,
+ 0x13e4: 0x0287, 0x13e7: 0x024b, 0x13e8: 0x0269, 0x13e9: 0x0290,
+ 0x13ea: 0x027b, 0x13ec: 0x0281, 0x13ed: 0x0284, 0x13ee: 0x025d, 0x13ef: 0x026f,
+ 0x13f0: 0x0275, 0x13f1: 0x0263, 0x13f2: 0x0278, 0x13f4: 0x0260, 0x13f5: 0x0242,
+ 0x13f6: 0x0245, 0x13f7: 0x024e, 0x13f9: 0x0266, 0x13fa: 0x026c, 0x13fb: 0x0272,
+ 0x13fc: 0x0293, 0x13fe: 0x02cc,
+ // Block 0x50, offset 0x1400
+ 0x1400: 0x0239, 0x1401: 0x023c, 0x1402: 0x0248, 0x1403: 0x0251, 0x1404: 0x0287, 0x1405: 0x028a,
+ 0x1406: 0x025a, 0x1407: 0x024b, 0x1408: 0x0269, 0x1409: 0x0290, 0x140b: 0x027e,
+ 0x140c: 0x0281, 0x140d: 0x0284, 0x140e: 0x025d, 0x140f: 0x026f, 0x1410: 0x0275, 0x1411: 0x0263,
+ 0x1412: 0x0278, 0x1413: 0x0257, 0x1414: 0x0260, 0x1415: 0x0242, 0x1416: 0x0245, 0x1417: 0x024e,
+ 0x1418: 0x0254, 0x1419: 0x0266, 0x141a: 0x026c, 0x141b: 0x0272,
+ 0x1421: 0x023c, 0x1422: 0x0248, 0x1423: 0x0251,
+ 0x1425: 0x028a, 0x1426: 0x025a, 0x1427: 0x024b, 0x1428: 0x0269, 0x1429: 0x0290,
+ 0x142b: 0x027e, 0x142c: 0x0281, 0x142d: 0x0284, 0x142e: 0x025d, 0x142f: 0x026f,
+ 0x1430: 0x0275, 0x1431: 0x0263, 0x1432: 0x0278, 0x1433: 0x0257, 0x1434: 0x0260, 0x1435: 0x0242,
+ 0x1436: 0x0245, 0x1437: 0x024e, 0x1438: 0x0254, 0x1439: 0x0266, 0x143a: 0x026c, 0x143b: 0x0272,
+ // Block 0x51, offset 0x1440
+ 0x1440: 0x1879, 0x1441: 0x1876, 0x1442: 0x187c, 0x1443: 0x18a0, 0x1444: 0x18c4, 0x1445: 0x18e8,
+ 0x1446: 0x190c, 0x1447: 0x1915, 0x1448: 0x191b, 0x1449: 0x1921, 0x144a: 0x1927,
+ 0x1450: 0x1a8c, 0x1451: 0x1a90,
+ 0x1452: 0x1a94, 0x1453: 0x1a98, 0x1454: 0x1a9c, 0x1455: 0x1aa0, 0x1456: 0x1aa4, 0x1457: 0x1aa8,
+ 0x1458: 0x1aac, 0x1459: 0x1ab0, 0x145a: 0x1ab4, 0x145b: 0x1ab8, 0x145c: 0x1abc, 0x145d: 0x1ac0,
+ 0x145e: 0x1ac4, 0x145f: 0x1ac8, 0x1460: 0x1acc, 0x1461: 0x1ad0, 0x1462: 0x1ad4, 0x1463: 0x1ad8,
+ 0x1464: 0x1adc, 0x1465: 0x1ae0, 0x1466: 0x1ae4, 0x1467: 0x1ae8, 0x1468: 0x1aec, 0x1469: 0x1af0,
+ 0x146a: 0x271e, 0x146b: 0x0047, 0x146c: 0x0065, 0x146d: 0x193c, 0x146e: 0x19b1,
+ 0x1470: 0x0043, 0x1471: 0x0045, 0x1472: 0x0047, 0x1473: 0x0049, 0x1474: 0x004b, 0x1475: 0x004d,
+ 0x1476: 0x004f, 0x1477: 0x0051, 0x1478: 0x0053, 0x1479: 0x0055, 0x147a: 0x0057, 0x147b: 0x0059,
+ 0x147c: 0x005b, 0x147d: 0x005d, 0x147e: 0x005f, 0x147f: 0x0061,
+ // Block 0x52, offset 0x1480
+ 0x1480: 0x26ad, 0x1481: 0x26c2, 0x1482: 0x0503,
+ 0x1490: 0x0c0f, 0x1491: 0x0a47,
+ 0x1492: 0x08d3, 0x1493: 0x45c4, 0x1494: 0x071b, 0x1495: 0x09ef, 0x1496: 0x132f, 0x1497: 0x09ff,
+ 0x1498: 0x0727, 0x1499: 0x0cd7, 0x149a: 0x0eaf, 0x149b: 0x0caf, 0x149c: 0x0827, 0x149d: 0x0b6b,
+ 0x149e: 0x07bf, 0x149f: 0x0cb7, 0x14a0: 0x0813, 0x14a1: 0x1117, 0x14a2: 0x0f83, 0x14a3: 0x138b,
+ 0x14a4: 0x09d3, 0x14a5: 0x090b, 0x14a6: 0x0e63, 0x14a7: 0x0c1b, 0x14a8: 0x0c47, 0x14a9: 0x06bf,
+ 0x14aa: 0x06cb, 0x14ab: 0x140b, 0x14ac: 0x0adb, 0x14ad: 0x06e7, 0x14ae: 0x08ef, 0x14af: 0x0c3b,
+ 0x14b0: 0x13b3, 0x14b1: 0x0c13, 0x14b2: 0x106f, 0x14b3: 0x10ab, 0x14b4: 0x08f7, 0x14b5: 0x0e43,
+ 0x14b6: 0x0d0b, 0x14b7: 0x0d07, 0x14b8: 0x0f97, 0x14b9: 0x082b, 0x14ba: 0x0957, 0x14bb: 0x1443,
+ // Block 0x53, offset 0x14c0
+ 0x14c0: 0x06fb, 0x14c1: 0x06f3, 0x14c2: 0x0703, 0x14c3: 0x1647, 0x14c4: 0x0747, 0x14c5: 0x0757,
+ 0x14c6: 0x075b, 0x14c7: 0x0763, 0x14c8: 0x076b, 0x14c9: 0x076f, 0x14ca: 0x077b, 0x14cb: 0x0773,
+ 0x14cc: 0x05b3, 0x14cd: 0x165b, 0x14ce: 0x078f, 0x14cf: 0x0793, 0x14d0: 0x0797, 0x14d1: 0x07b3,
+ 0x14d2: 0x164c, 0x14d3: 0x05b7, 0x14d4: 0x079f, 0x14d5: 0x07bf, 0x14d6: 0x1656, 0x14d7: 0x07cf,
+ 0x14d8: 0x07d7, 0x14d9: 0x0737, 0x14da: 0x07df, 0x14db: 0x07e3, 0x14dc: 0x1831, 0x14dd: 0x07ff,
+ 0x14de: 0x0807, 0x14df: 0x05bf, 0x14e0: 0x081f, 0x14e1: 0x0823, 0x14e2: 0x082b, 0x14e3: 0x082f,
+ 0x14e4: 0x05c3, 0x14e5: 0x0847, 0x14e6: 0x084b, 0x14e7: 0x0857, 0x14e8: 0x0863, 0x14e9: 0x0867,
+ 0x14ea: 0x086b, 0x14eb: 0x0873, 0x14ec: 0x0893, 0x14ed: 0x0897, 0x14ee: 0x089f, 0x14ef: 0x08af,
+ 0x14f0: 0x08b7, 0x14f1: 0x08bb, 0x14f2: 0x08bb, 0x14f3: 0x08bb, 0x14f4: 0x166a, 0x14f5: 0x0e93,
+ 0x14f6: 0x08cf, 0x14f7: 0x08d7, 0x14f8: 0x166f, 0x14f9: 0x08e3, 0x14fa: 0x08eb, 0x14fb: 0x08f3,
+ 0x14fc: 0x091b, 0x14fd: 0x0907, 0x14fe: 0x0913, 0x14ff: 0x0917,
+ // Block 0x54, offset 0x1500
+ 0x1500: 0x091f, 0x1501: 0x0927, 0x1502: 0x092b, 0x1503: 0x0933, 0x1504: 0x093b, 0x1505: 0x093f,
+ 0x1506: 0x093f, 0x1507: 0x0947, 0x1508: 0x094f, 0x1509: 0x0953, 0x150a: 0x095f, 0x150b: 0x0983,
+ 0x150c: 0x0967, 0x150d: 0x0987, 0x150e: 0x096b, 0x150f: 0x0973, 0x1510: 0x080b, 0x1511: 0x09cf,
+ 0x1512: 0x0997, 0x1513: 0x099b, 0x1514: 0x099f, 0x1515: 0x0993, 0x1516: 0x09a7, 0x1517: 0x09a3,
+ 0x1518: 0x09bb, 0x1519: 0x1674, 0x151a: 0x09d7, 0x151b: 0x09db, 0x151c: 0x09e3, 0x151d: 0x09ef,
+ 0x151e: 0x09f7, 0x151f: 0x0a13, 0x1520: 0x1679, 0x1521: 0x167e, 0x1522: 0x0a1f, 0x1523: 0x0a23,
+ 0x1524: 0x0a27, 0x1525: 0x0a1b, 0x1526: 0x0a2f, 0x1527: 0x05c7, 0x1528: 0x05cb, 0x1529: 0x0a37,
+ 0x152a: 0x0a3f, 0x152b: 0x0a3f, 0x152c: 0x1683, 0x152d: 0x0a5b, 0x152e: 0x0a5f, 0x152f: 0x0a63,
+ 0x1530: 0x0a6b, 0x1531: 0x1688, 0x1532: 0x0a73, 0x1533: 0x0a77, 0x1534: 0x0b4f, 0x1535: 0x0a7f,
+ 0x1536: 0x05cf, 0x1537: 0x0a8b, 0x1538: 0x0a9b, 0x1539: 0x0aa7, 0x153a: 0x0aa3, 0x153b: 0x1692,
+ 0x153c: 0x0aaf, 0x153d: 0x1697, 0x153e: 0x0abb, 0x153f: 0x0ab7,
+ // Block 0x55, offset 0x1540
+ 0x1540: 0x0abf, 0x1541: 0x0acf, 0x1542: 0x0ad3, 0x1543: 0x05d3, 0x1544: 0x0ae3, 0x1545: 0x0aeb,
+ 0x1546: 0x0aef, 0x1547: 0x0af3, 0x1548: 0x05d7, 0x1549: 0x169c, 0x154a: 0x05db, 0x154b: 0x0b0f,
+ 0x154c: 0x0b13, 0x154d: 0x0b17, 0x154e: 0x0b1f, 0x154f: 0x1863, 0x1550: 0x0b37, 0x1551: 0x16a6,
+ 0x1552: 0x16a6, 0x1553: 0x11d7, 0x1554: 0x0b47, 0x1555: 0x0b47, 0x1556: 0x05df, 0x1557: 0x16c9,
+ 0x1558: 0x179b, 0x1559: 0x0b57, 0x155a: 0x0b5f, 0x155b: 0x05e3, 0x155c: 0x0b73, 0x155d: 0x0b83,
+ 0x155e: 0x0b87, 0x155f: 0x0b8f, 0x1560: 0x0b9f, 0x1561: 0x05eb, 0x1562: 0x05e7, 0x1563: 0x0ba3,
+ 0x1564: 0x16ab, 0x1565: 0x0ba7, 0x1566: 0x0bbb, 0x1567: 0x0bbf, 0x1568: 0x0bc3, 0x1569: 0x0bbf,
+ 0x156a: 0x0bcf, 0x156b: 0x0bd3, 0x156c: 0x0be3, 0x156d: 0x0bdb, 0x156e: 0x0bdf, 0x156f: 0x0be7,
+ 0x1570: 0x0beb, 0x1571: 0x0bef, 0x1572: 0x0bfb, 0x1573: 0x0bff, 0x1574: 0x0c17, 0x1575: 0x0c1f,
+ 0x1576: 0x0c2f, 0x1577: 0x0c43, 0x1578: 0x16ba, 0x1579: 0x0c3f, 0x157a: 0x0c33, 0x157b: 0x0c4b,
+ 0x157c: 0x0c53, 0x157d: 0x0c67, 0x157e: 0x16bf, 0x157f: 0x0c6f,
+ // Block 0x56, offset 0x1580
+ 0x1580: 0x0c63, 0x1581: 0x0c5b, 0x1582: 0x05ef, 0x1583: 0x0c77, 0x1584: 0x0c7f, 0x1585: 0x0c87,
+ 0x1586: 0x0c7b, 0x1587: 0x05f3, 0x1588: 0x0c97, 0x1589: 0x0c9f, 0x158a: 0x16c4, 0x158b: 0x0ccb,
+ 0x158c: 0x0cff, 0x158d: 0x0cdb, 0x158e: 0x05ff, 0x158f: 0x0ce7, 0x1590: 0x05fb, 0x1591: 0x05f7,
+ 0x1592: 0x07c3, 0x1593: 0x07c7, 0x1594: 0x0d03, 0x1595: 0x0ceb, 0x1596: 0x11ab, 0x1597: 0x0663,
+ 0x1598: 0x0d0f, 0x1599: 0x0d13, 0x159a: 0x0d17, 0x159b: 0x0d2b, 0x159c: 0x0d23, 0x159d: 0x16dd,
+ 0x159e: 0x0603, 0x159f: 0x0d3f, 0x15a0: 0x0d33, 0x15a1: 0x0d4f, 0x15a2: 0x0d57, 0x15a3: 0x16e7,
+ 0x15a4: 0x0d5b, 0x15a5: 0x0d47, 0x15a6: 0x0d63, 0x15a7: 0x0607, 0x15a8: 0x0d67, 0x15a9: 0x0d6b,
+ 0x15aa: 0x0d6f, 0x15ab: 0x0d7b, 0x15ac: 0x16ec, 0x15ad: 0x0d83, 0x15ae: 0x060b, 0x15af: 0x0d8f,
+ 0x15b0: 0x16f1, 0x15b1: 0x0d93, 0x15b2: 0x060f, 0x15b3: 0x0d9f, 0x15b4: 0x0dab, 0x15b5: 0x0db7,
+ 0x15b6: 0x0dbb, 0x15b7: 0x16f6, 0x15b8: 0x168d, 0x15b9: 0x16fb, 0x15ba: 0x0ddb, 0x15bb: 0x1700,
+ 0x15bc: 0x0de7, 0x15bd: 0x0def, 0x15be: 0x0ddf, 0x15bf: 0x0dfb,
+ // Block 0x57, offset 0x15c0
+ 0x15c0: 0x0e0b, 0x15c1: 0x0e1b, 0x15c2: 0x0e0f, 0x15c3: 0x0e13, 0x15c4: 0x0e1f, 0x15c5: 0x0e23,
+ 0x15c6: 0x1705, 0x15c7: 0x0e07, 0x15c8: 0x0e3b, 0x15c9: 0x0e3f, 0x15ca: 0x0613, 0x15cb: 0x0e53,
+ 0x15cc: 0x0e4f, 0x15cd: 0x170a, 0x15ce: 0x0e33, 0x15cf: 0x0e6f, 0x15d0: 0x170f, 0x15d1: 0x1714,
+ 0x15d2: 0x0e73, 0x15d3: 0x0e87, 0x15d4: 0x0e83, 0x15d5: 0x0e7f, 0x15d6: 0x0617, 0x15d7: 0x0e8b,
+ 0x15d8: 0x0e9b, 0x15d9: 0x0e97, 0x15da: 0x0ea3, 0x15db: 0x1651, 0x15dc: 0x0eb3, 0x15dd: 0x1719,
+ 0x15de: 0x0ebf, 0x15df: 0x1723, 0x15e0: 0x0ed3, 0x15e1: 0x0edf, 0x15e2: 0x0ef3, 0x15e3: 0x1728,
+ 0x15e4: 0x0f07, 0x15e5: 0x0f0b, 0x15e6: 0x172d, 0x15e7: 0x1732, 0x15e8: 0x0f27, 0x15e9: 0x0f37,
+ 0x15ea: 0x061b, 0x15eb: 0x0f3b, 0x15ec: 0x061f, 0x15ed: 0x061f, 0x15ee: 0x0f53, 0x15ef: 0x0f57,
+ 0x15f0: 0x0f5f, 0x15f1: 0x0f63, 0x15f2: 0x0f6f, 0x15f3: 0x0623, 0x15f4: 0x0f87, 0x15f5: 0x1737,
+ 0x15f6: 0x0fa3, 0x15f7: 0x173c, 0x15f8: 0x0faf, 0x15f9: 0x16a1, 0x15fa: 0x0fbf, 0x15fb: 0x1741,
+ 0x15fc: 0x1746, 0x15fd: 0x174b, 0x15fe: 0x0627, 0x15ff: 0x062b,
+ // Block 0x58, offset 0x1600
+ 0x1600: 0x0ff7, 0x1601: 0x1755, 0x1602: 0x1750, 0x1603: 0x175a, 0x1604: 0x175f, 0x1605: 0x0fff,
+ 0x1606: 0x1003, 0x1607: 0x1003, 0x1608: 0x100b, 0x1609: 0x0633, 0x160a: 0x100f, 0x160b: 0x0637,
+ 0x160c: 0x063b, 0x160d: 0x1769, 0x160e: 0x1023, 0x160f: 0x102b, 0x1610: 0x1037, 0x1611: 0x063f,
+ 0x1612: 0x176e, 0x1613: 0x105b, 0x1614: 0x1773, 0x1615: 0x1778, 0x1616: 0x107b, 0x1617: 0x1093,
+ 0x1618: 0x0643, 0x1619: 0x109b, 0x161a: 0x109f, 0x161b: 0x10a3, 0x161c: 0x177d, 0x161d: 0x1782,
+ 0x161e: 0x1782, 0x161f: 0x10bb, 0x1620: 0x0647, 0x1621: 0x1787, 0x1622: 0x10cf, 0x1623: 0x10d3,
+ 0x1624: 0x064b, 0x1625: 0x178c, 0x1626: 0x10ef, 0x1627: 0x064f, 0x1628: 0x10ff, 0x1629: 0x10f7,
+ 0x162a: 0x1107, 0x162b: 0x1796, 0x162c: 0x111f, 0x162d: 0x0653, 0x162e: 0x112b, 0x162f: 0x1133,
+ 0x1630: 0x1143, 0x1631: 0x0657, 0x1632: 0x17a0, 0x1633: 0x17a5, 0x1634: 0x065b, 0x1635: 0x17aa,
+ 0x1636: 0x115b, 0x1637: 0x17af, 0x1638: 0x1167, 0x1639: 0x1173, 0x163a: 0x117b, 0x163b: 0x17b4,
+ 0x163c: 0x17b9, 0x163d: 0x118f, 0x163e: 0x17be, 0x163f: 0x1197,
+ // Block 0x59, offset 0x1640
+ 0x1640: 0x16ce, 0x1641: 0x065f, 0x1642: 0x11af, 0x1643: 0x11b3, 0x1644: 0x0667, 0x1645: 0x11b7,
+ 0x1646: 0x0a33, 0x1647: 0x17c3, 0x1648: 0x17c8, 0x1649: 0x16d3, 0x164a: 0x16d8, 0x164b: 0x11d7,
+ 0x164c: 0x11db, 0x164d: 0x13f3, 0x164e: 0x066b, 0x164f: 0x1207, 0x1650: 0x1203, 0x1651: 0x120b,
+ 0x1652: 0x083f, 0x1653: 0x120f, 0x1654: 0x1213, 0x1655: 0x1217, 0x1656: 0x121f, 0x1657: 0x17cd,
+ 0x1658: 0x121b, 0x1659: 0x1223, 0x165a: 0x1237, 0x165b: 0x123b, 0x165c: 0x1227, 0x165d: 0x123f,
+ 0x165e: 0x1253, 0x165f: 0x1267, 0x1660: 0x1233, 0x1661: 0x1247, 0x1662: 0x124b, 0x1663: 0x124f,
+ 0x1664: 0x17d2, 0x1665: 0x17dc, 0x1666: 0x17d7, 0x1667: 0x066f, 0x1668: 0x126f, 0x1669: 0x1273,
+ 0x166a: 0x127b, 0x166b: 0x17f0, 0x166c: 0x127f, 0x166d: 0x17e1, 0x166e: 0x0673, 0x166f: 0x0677,
+ 0x1670: 0x17e6, 0x1671: 0x17eb, 0x1672: 0x067b, 0x1673: 0x129f, 0x1674: 0x12a3, 0x1675: 0x12a7,
+ 0x1676: 0x12ab, 0x1677: 0x12b7, 0x1678: 0x12b3, 0x1679: 0x12bf, 0x167a: 0x12bb, 0x167b: 0x12cb,
+ 0x167c: 0x12c3, 0x167d: 0x12c7, 0x167e: 0x12cf, 0x167f: 0x067f,
+ // Block 0x5a, offset 0x1680
+ 0x1680: 0x12d7, 0x1681: 0x12db, 0x1682: 0x0683, 0x1683: 0x12eb, 0x1684: 0x12ef, 0x1685: 0x17f5,
+ 0x1686: 0x12fb, 0x1687: 0x12ff, 0x1688: 0x0687, 0x1689: 0x130b, 0x168a: 0x05bb, 0x168b: 0x17fa,
+ 0x168c: 0x17ff, 0x168d: 0x068b, 0x168e: 0x068f, 0x168f: 0x1337, 0x1690: 0x134f, 0x1691: 0x136b,
+ 0x1692: 0x137b, 0x1693: 0x1804, 0x1694: 0x138f, 0x1695: 0x1393, 0x1696: 0x13ab, 0x1697: 0x13b7,
+ 0x1698: 0x180e, 0x1699: 0x1660, 0x169a: 0x13c3, 0x169b: 0x13bf, 0x169c: 0x13cb, 0x169d: 0x1665,
+ 0x169e: 0x13d7, 0x169f: 0x13e3, 0x16a0: 0x1813, 0x16a1: 0x1818, 0x16a2: 0x1423, 0x16a3: 0x142f,
+ 0x16a4: 0x1437, 0x16a5: 0x181d, 0x16a6: 0x143b, 0x16a7: 0x1467, 0x16a8: 0x1473, 0x16a9: 0x1477,
+ 0x16aa: 0x146f, 0x16ab: 0x1483, 0x16ac: 0x1487, 0x16ad: 0x1822, 0x16ae: 0x1493, 0x16af: 0x0693,
+ 0x16b0: 0x149b, 0x16b1: 0x1827, 0x16b2: 0x0697, 0x16b3: 0x14d3, 0x16b4: 0x0ac3, 0x16b5: 0x14eb,
+ 0x16b6: 0x182c, 0x16b7: 0x1836, 0x16b8: 0x069b, 0x16b9: 0x069f, 0x16ba: 0x1513, 0x16bb: 0x183b,
+ 0x16bc: 0x06a3, 0x16bd: 0x1840, 0x16be: 0x152b, 0x16bf: 0x152b,
+ // Block 0x5b, offset 0x16c0
+ 0x16c0: 0x1533, 0x16c1: 0x1845, 0x16c2: 0x154b, 0x16c3: 0x06a7, 0x16c4: 0x155b, 0x16c5: 0x1567,
+ 0x16c6: 0x156f, 0x16c7: 0x1577, 0x16c8: 0x06ab, 0x16c9: 0x184a, 0x16ca: 0x158b, 0x16cb: 0x15a7,
+ 0x16cc: 0x15b3, 0x16cd: 0x06af, 0x16ce: 0x06b3, 0x16cf: 0x15b7, 0x16d0: 0x184f, 0x16d1: 0x06b7,
+ 0x16d2: 0x1854, 0x16d3: 0x1859, 0x16d4: 0x185e, 0x16d5: 0x15db, 0x16d6: 0x06bb, 0x16d7: 0x15ef,
+ 0x16d8: 0x15f7, 0x16d9: 0x15fb, 0x16da: 0x1603, 0x16db: 0x160b, 0x16dc: 0x1613, 0x16dd: 0x1868,
+}
+
+// nfkcIndex: 22 blocks, 1408 entries, 1408 bytes
+// Block 0 is the zero block.
+var nfkcIndex = [1408]uint8{
+ // Block 0x0, offset 0x0
+ // Block 0x1, offset 0x40
+ // Block 0x2, offset 0x80
+ // Block 0x3, offset 0xc0
+ 0xc2: 0x5a, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x5b, 0xc7: 0x04,
+ 0xc8: 0x05, 0xca: 0x5c, 0xcb: 0x5d, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x09,
+ 0xd0: 0x0a, 0xd1: 0x5e, 0xd2: 0x5f, 0xd3: 0x0b, 0xd6: 0x0c, 0xd7: 0x60,
+ 0xd8: 0x61, 0xd9: 0x0d, 0xdb: 0x62, 0xdc: 0x63, 0xdd: 0x64, 0xdf: 0x65,
+ 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05,
+ 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a,
+ 0xf0: 0x13,
+ // Block 0x4, offset 0x100
+ 0x120: 0x66, 0x121: 0x67, 0x123: 0x68, 0x124: 0x69, 0x125: 0x6a, 0x126: 0x6b, 0x127: 0x6c,
+ 0x128: 0x6d, 0x129: 0x6e, 0x12a: 0x6f, 0x12b: 0x70, 0x12c: 0x6b, 0x12d: 0x71, 0x12e: 0x72, 0x12f: 0x73,
+ 0x131: 0x74, 0x132: 0x75, 0x133: 0x76, 0x134: 0x77, 0x135: 0x78, 0x137: 0x79,
+ 0x138: 0x7a, 0x139: 0x7b, 0x13a: 0x7c, 0x13b: 0x7d, 0x13c: 0x7e, 0x13d: 0x7f, 0x13e: 0x80, 0x13f: 0x81,
+ // Block 0x5, offset 0x140
+ 0x140: 0x82, 0x142: 0x83, 0x143: 0x84, 0x144: 0x85, 0x145: 0x86, 0x146: 0x87, 0x147: 0x88,
+ 0x14d: 0x89,
+ 0x15c: 0x8a, 0x15f: 0x8b,
+ 0x162: 0x8c, 0x164: 0x8d,
+ 0x168: 0x8e, 0x169: 0x8f, 0x16a: 0x90, 0x16c: 0x0e, 0x16d: 0x91, 0x16e: 0x92, 0x16f: 0x93,
+ 0x170: 0x94, 0x173: 0x95, 0x174: 0x96, 0x175: 0x0f, 0x176: 0x10, 0x177: 0x97,
+ 0x178: 0x11, 0x179: 0x12, 0x17a: 0x13, 0x17b: 0x14, 0x17c: 0x15, 0x17d: 0x16, 0x17e: 0x17, 0x17f: 0x18,
+ // Block 0x6, offset 0x180
+ 0x180: 0x98, 0x181: 0x99, 0x182: 0x9a, 0x183: 0x9b, 0x184: 0x19, 0x185: 0x1a, 0x186: 0x9c, 0x187: 0x9d,
+ 0x188: 0x9e, 0x189: 0x1b, 0x18a: 0x1c, 0x18b: 0x9f, 0x18c: 0xa0,
+ 0x191: 0x1d, 0x192: 0x1e, 0x193: 0xa1,
+ 0x1a8: 0xa2, 0x1a9: 0xa3, 0x1ab: 0xa4,
+ 0x1b1: 0xa5, 0x1b3: 0xa6, 0x1b5: 0xa7, 0x1b7: 0xa8,
+ 0x1ba: 0xa9, 0x1bb: 0xaa, 0x1bc: 0x1f, 0x1bd: 0x20, 0x1be: 0x21, 0x1bf: 0xab,
+ // Block 0x7, offset 0x1c0
+ 0x1c0: 0xac, 0x1c1: 0x22, 0x1c2: 0x23, 0x1c3: 0x24, 0x1c4: 0xad, 0x1c5: 0x25, 0x1c6: 0x26,
+ 0x1c8: 0x27, 0x1c9: 0x28, 0x1ca: 0x29, 0x1cb: 0x2a, 0x1cc: 0x2b, 0x1cd: 0x2c, 0x1ce: 0x2d, 0x1cf: 0x2e,
+ // Block 0x8, offset 0x200
+ 0x219: 0xae, 0x21a: 0xaf, 0x21b: 0xb0, 0x21d: 0xb1, 0x21f: 0xb2,
+ 0x220: 0xb3, 0x223: 0xb4, 0x224: 0xb5, 0x225: 0xb6, 0x226: 0xb7, 0x227: 0xb8,
+ 0x22a: 0xb9, 0x22b: 0xba, 0x22d: 0xbb, 0x22f: 0xbc,
+ 0x230: 0xbd, 0x231: 0xbe, 0x232: 0xbf, 0x233: 0xc0, 0x234: 0xc1, 0x235: 0xc2, 0x236: 0xc3, 0x237: 0xbd,
+ 0x238: 0xbe, 0x239: 0xbf, 0x23a: 0xc0, 0x23b: 0xc1, 0x23c: 0xc2, 0x23d: 0xc3, 0x23e: 0xbd, 0x23f: 0xbe,
+ // Block 0x9, offset 0x240
+ 0x240: 0xbf, 0x241: 0xc0, 0x242: 0xc1, 0x243: 0xc2, 0x244: 0xc3, 0x245: 0xbd, 0x246: 0xbe, 0x247: 0xbf,
+ 0x248: 0xc0, 0x249: 0xc1, 0x24a: 0xc2, 0x24b: 0xc3, 0x24c: 0xbd, 0x24d: 0xbe, 0x24e: 0xbf, 0x24f: 0xc0,
+ 0x250: 0xc1, 0x251: 0xc2, 0x252: 0xc3, 0x253: 0xbd, 0x254: 0xbe, 0x255: 0xbf, 0x256: 0xc0, 0x257: 0xc1,
+ 0x258: 0xc2, 0x259: 0xc3, 0x25a: 0xbd, 0x25b: 0xbe, 0x25c: 0xbf, 0x25d: 0xc0, 0x25e: 0xc1, 0x25f: 0xc2,
+ 0x260: 0xc3, 0x261: 0xbd, 0x262: 0xbe, 0x263: 0xbf, 0x264: 0xc0, 0x265: 0xc1, 0x266: 0xc2, 0x267: 0xc3,
+ 0x268: 0xbd, 0x269: 0xbe, 0x26a: 0xbf, 0x26b: 0xc0, 0x26c: 0xc1, 0x26d: 0xc2, 0x26e: 0xc3, 0x26f: 0xbd,
+ 0x270: 0xbe, 0x271: 0xbf, 0x272: 0xc0, 0x273: 0xc1, 0x274: 0xc2, 0x275: 0xc3, 0x276: 0xbd, 0x277: 0xbe,
+ 0x278: 0xbf, 0x279: 0xc0, 0x27a: 0xc1, 0x27b: 0xc2, 0x27c: 0xc3, 0x27d: 0xbd, 0x27e: 0xbe, 0x27f: 0xbf,
+ // Block 0xa, offset 0x280
+ 0x280: 0xc0, 0x281: 0xc1, 0x282: 0xc2, 0x283: 0xc3, 0x284: 0xbd, 0x285: 0xbe, 0x286: 0xbf, 0x287: 0xc0,
+ 0x288: 0xc1, 0x289: 0xc2, 0x28a: 0xc3, 0x28b: 0xbd, 0x28c: 0xbe, 0x28d: 0xbf, 0x28e: 0xc0, 0x28f: 0xc1,
+ 0x290: 0xc2, 0x291: 0xc3, 0x292: 0xbd, 0x293: 0xbe, 0x294: 0xbf, 0x295: 0xc0, 0x296: 0xc1, 0x297: 0xc2,
+ 0x298: 0xc3, 0x299: 0xbd, 0x29a: 0xbe, 0x29b: 0xbf, 0x29c: 0xc0, 0x29d: 0xc1, 0x29e: 0xc2, 0x29f: 0xc3,
+ 0x2a0: 0xbd, 0x2a1: 0xbe, 0x2a2: 0xbf, 0x2a3: 0xc0, 0x2a4: 0xc1, 0x2a5: 0xc2, 0x2a6: 0xc3, 0x2a7: 0xbd,
+ 0x2a8: 0xbe, 0x2a9: 0xbf, 0x2aa: 0xc0, 0x2ab: 0xc1, 0x2ac: 0xc2, 0x2ad: 0xc3, 0x2ae: 0xbd, 0x2af: 0xbe,
+ 0x2b0: 0xbf, 0x2b1: 0xc0, 0x2b2: 0xc1, 0x2b3: 0xc2, 0x2b4: 0xc3, 0x2b5: 0xbd, 0x2b6: 0xbe, 0x2b7: 0xbf,
+ 0x2b8: 0xc0, 0x2b9: 0xc1, 0x2ba: 0xc2, 0x2bb: 0xc3, 0x2bc: 0xbd, 0x2bd: 0xbe, 0x2be: 0xbf, 0x2bf: 0xc0,
+ // Block 0xb, offset 0x2c0
+ 0x2c0: 0xc1, 0x2c1: 0xc2, 0x2c2: 0xc3, 0x2c3: 0xbd, 0x2c4: 0xbe, 0x2c5: 0xbf, 0x2c6: 0xc0, 0x2c7: 0xc1,
+ 0x2c8: 0xc2, 0x2c9: 0xc3, 0x2ca: 0xbd, 0x2cb: 0xbe, 0x2cc: 0xbf, 0x2cd: 0xc0, 0x2ce: 0xc1, 0x2cf: 0xc2,
+ 0x2d0: 0xc3, 0x2d1: 0xbd, 0x2d2: 0xbe, 0x2d3: 0xbf, 0x2d4: 0xc0, 0x2d5: 0xc1, 0x2d6: 0xc2, 0x2d7: 0xc3,
+ 0x2d8: 0xbd, 0x2d9: 0xbe, 0x2da: 0xbf, 0x2db: 0xc0, 0x2dc: 0xc1, 0x2dd: 0xc2, 0x2de: 0xc4,
+ // Block 0xc, offset 0x300
+ 0x324: 0x2f, 0x325: 0x30, 0x326: 0x31, 0x327: 0x32,
+ 0x328: 0x33, 0x329: 0x34, 0x32a: 0x35, 0x32b: 0x36, 0x32c: 0x37, 0x32d: 0x38, 0x32e: 0x39, 0x32f: 0x3a,
+ 0x330: 0x3b, 0x331: 0x3c, 0x332: 0x3d, 0x333: 0x3e, 0x334: 0x3f, 0x335: 0x40, 0x336: 0x41, 0x337: 0x42,
+ 0x338: 0x43, 0x339: 0x44, 0x33a: 0x45, 0x33b: 0x46, 0x33c: 0xc5, 0x33d: 0x47, 0x33e: 0x48, 0x33f: 0x49,
+ // Block 0xd, offset 0x340
+ 0x347: 0xc6,
+ 0x34b: 0xc7, 0x34d: 0xc8,
+ 0x368: 0xc9, 0x36b: 0xca,
+ // Block 0xe, offset 0x380
+ 0x381: 0xcb, 0x382: 0xcc, 0x384: 0xcd, 0x385: 0xb7, 0x387: 0xce,
+ 0x388: 0xcf, 0x38b: 0xd0, 0x38c: 0x6b, 0x38d: 0xd1,
+ 0x391: 0xd2, 0x392: 0xd3, 0x393: 0xd4, 0x396: 0xd5, 0x397: 0xd6,
+ 0x398: 0xd7, 0x39a: 0xd8, 0x39c: 0xd9,
+ 0x3b0: 0xd7,
+ // Block 0xf, offset 0x3c0
+ 0x3eb: 0xda, 0x3ec: 0xdb,
+ // Block 0x10, offset 0x400
+ 0x432: 0xdc,
+ // Block 0x11, offset 0x440
+ 0x445: 0xdd, 0x446: 0xde, 0x447: 0xdf,
+ 0x449: 0xe0,
+ 0x450: 0xe1, 0x451: 0xe2, 0x452: 0xe3, 0x453: 0xe4, 0x454: 0xe5, 0x455: 0xe6, 0x456: 0xe7, 0x457: 0xe8,
+ 0x458: 0xe9, 0x459: 0xea, 0x45a: 0x4a, 0x45b: 0xeb, 0x45c: 0xec, 0x45d: 0xed, 0x45e: 0xee, 0x45f: 0x4b,
+ // Block 0x12, offset 0x480
+ 0x480: 0xef,
+ 0x4a3: 0xf0, 0x4a5: 0xf1,
+ 0x4b8: 0x4c, 0x4b9: 0x4d, 0x4ba: 0x4e,
+ // Block 0x13, offset 0x4c0
+ 0x4c4: 0x4f, 0x4c5: 0xf2, 0x4c6: 0xf3,
+ 0x4c8: 0x50, 0x4c9: 0xf4,
+ // Block 0x14, offset 0x500
+ 0x520: 0x51, 0x521: 0x52, 0x522: 0x53, 0x523: 0x54, 0x524: 0x55, 0x525: 0x56, 0x526: 0x57, 0x527: 0x58,
+ 0x528: 0x59,
+ // Block 0x15, offset 0x540
+ 0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d,
+ 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11,
+ 0x56f: 0x12,
+}
+
+// nfkcSparseOffset: 155 entries, 310 bytes
+var nfkcSparseOffset = []uint16{0x0, 0xe, 0x12, 0x1b, 0x25, 0x35, 0x37, 0x3c, 0x47, 0x56, 0x63, 0x6b, 0x6f, 0x74, 0x76, 0x87, 0x8f, 0x96, 0x99, 0xa0, 0xa4, 0xa8, 0xaa, 0xac, 0xb5, 0xb9, 0xc0, 0xc5, 0xc8, 0xd2, 0xd4, 0xdb, 0xe3, 0xe7, 0xe9, 0xec, 0xf0, 0xf6, 0x107, 0x113, 0x115, 0x11b, 0x11d, 0x11f, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12c, 0x12f, 0x131, 0x134, 0x137, 0x13b, 0x140, 0x149, 0x14b, 0x14e, 0x150, 0x15b, 0x166, 0x176, 0x184, 0x192, 0x1a2, 0x1b0, 0x1b7, 0x1bd, 0x1cc, 0x1d0, 0x1d2, 0x1d6, 0x1d8, 0x1db, 0x1dd, 0x1e0, 0x1e2, 0x1e5, 0x1e7, 0x1e9, 0x1eb, 0x1f7, 0x201, 0x20b, 0x20e, 0x212, 0x214, 0x216, 0x218, 0x21a, 0x21d, 0x21f, 0x221, 0x223, 0x225, 0x22b, 0x22e, 0x232, 0x234, 0x23b, 0x241, 0x247, 0x24f, 0x255, 0x25b, 0x261, 0x265, 0x267, 0x269, 0x26b, 0x26d, 0x273, 0x276, 0x279, 0x281, 0x288, 0x28b, 0x28e, 0x290, 0x298, 0x29b, 0x2a2, 0x2a5, 0x2ab, 0x2ad, 0x2af, 0x2b2, 0x2b4, 0x2b6, 0x2b8, 0x2ba, 0x2c7, 0x2d1, 0x2d3, 0x2d5, 0x2d9, 0x2de, 0x2ea, 0x2ef, 0x2f8, 0x2fe, 0x303, 0x307, 0x30c, 0x310, 0x320, 0x32e, 0x33c, 0x34a, 0x350, 0x352, 0x355, 0x35f, 0x361}
+
+// nfkcSparseValues: 875 entries, 3500 bytes
+var nfkcSparseValues = [875]valueRange{
+ // Block 0x0, offset 0x0
+ {value: 0x0002, lo: 0x0d},
+ {value: 0x0001, lo: 0xa0, hi: 0xa0},
+ {value: 0x4278, lo: 0xa8, hi: 0xa8},
+ {value: 0x0083, lo: 0xaa, hi: 0xaa},
+ {value: 0x4264, lo: 0xaf, hi: 0xaf},
+ {value: 0x0025, lo: 0xb2, hi: 0xb3},
+ {value: 0x425a, lo: 0xb4, hi: 0xb4},
+ {value: 0x01dc, lo: 0xb5, hi: 0xb5},
+ {value: 0x4291, lo: 0xb8, hi: 0xb8},
+ {value: 0x0023, lo: 0xb9, hi: 0xb9},
+ {value: 0x009f, lo: 0xba, hi: 0xba},
+ {value: 0x221c, lo: 0xbc, hi: 0xbc},
+ {value: 0x2210, lo: 0xbd, hi: 0xbd},
+ {value: 0x22b2, lo: 0xbe, hi: 0xbe},
+ // Block 0x1, offset 0xe
+ {value: 0x0091, lo: 0x03},
+ {value: 0x46e2, lo: 0xa0, hi: 0xa1},
+ {value: 0x4714, lo: 0xaf, hi: 0xb0},
+ {value: 0xa000, lo: 0xb7, hi: 0xb7},
+ // Block 0x2, offset 0x12
+ {value: 0x0003, lo: 0x08},
+ {value: 0xa000, lo: 0x92, hi: 0x92},
+ {value: 0x0091, lo: 0xb0, hi: 0xb0},
+ {value: 0x0119, lo: 0xb1, hi: 0xb1},
+ {value: 0x0095, lo: 0xb2, hi: 0xb2},
+ {value: 0x00a5, lo: 0xb3, hi: 0xb3},
+ {value: 0x0143, lo: 0xb4, hi: 0xb6},
+ {value: 0x00af, lo: 0xb7, hi: 0xb7},
+ {value: 0x00b3, lo: 0xb8, hi: 0xb8},
+ // Block 0x3, offset 0x1b
+ {value: 0x000a, lo: 0x09},
+ {value: 0x426e, lo: 0x98, hi: 0x98},
+ {value: 0x4273, lo: 0x99, hi: 0x9a},
+ {value: 0x4296, lo: 0x9b, hi: 0x9b},
+ {value: 0x425f, lo: 0x9c, hi: 0x9c},
+ {value: 0x4282, lo: 0x9d, hi: 0x9d},
+ {value: 0x0113, lo: 0xa0, hi: 0xa0},
+ {value: 0x0099, lo: 0xa1, hi: 0xa1},
+ {value: 0x00a7, lo: 0xa2, hi: 0xa3},
+ {value: 0x0167, lo: 0xa4, hi: 0xa4},
+ // Block 0x4, offset 0x25
+ {value: 0x0000, lo: 0x0f},
+ {value: 0xa000, lo: 0x83, hi: 0x83},
+ {value: 0xa000, lo: 0x87, hi: 0x87},
+ {value: 0xa000, lo: 0x8b, hi: 0x8b},
+ {value: 0xa000, lo: 0x8d, hi: 0x8d},
+ {value: 0x37a5, lo: 0x90, hi: 0x90},
+ {value: 0x37b1, lo: 0x91, hi: 0x91},
+ {value: 0x379f, lo: 0x93, hi: 0x93},
+ {value: 0xa000, lo: 0x96, hi: 0x96},
+ {value: 0x3817, lo: 0x97, hi: 0x97},
+ {value: 0x37e1, lo: 0x9c, hi: 0x9c},
+ {value: 0x37c9, lo: 0x9d, hi: 0x9d},
+ {value: 0x37f3, lo: 0x9e, hi: 0x9e},
+ {value: 0xa000, lo: 0xb4, hi: 0xb5},
+ {value: 0x381d, lo: 0xb6, hi: 0xb6},
+ {value: 0x3823, lo: 0xb7, hi: 0xb7},
+ // Block 0x5, offset 0x35
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8132, lo: 0x83, hi: 0x87},
+ // Block 0x6, offset 0x37
+ {value: 0x0001, lo: 0x04},
+ {value: 0x8113, lo: 0x81, hi: 0x82},
+ {value: 0x8132, lo: 0x84, hi: 0x84},
+ {value: 0x812d, lo: 0x85, hi: 0x85},
+ {value: 0x810d, lo: 0x87, hi: 0x87},
+ // Block 0x7, offset 0x3c
+ {value: 0x0000, lo: 0x0a},
+ {value: 0x8132, lo: 0x90, hi: 0x97},
+ {value: 0x8119, lo: 0x98, hi: 0x98},
+ {value: 0x811a, lo: 0x99, hi: 0x99},
+ {value: 0x811b, lo: 0x9a, hi: 0x9a},
+ {value: 0x3841, lo: 0xa2, hi: 0xa2},
+ {value: 0x3847, lo: 0xa3, hi: 0xa3},
+ {value: 0x3853, lo: 0xa4, hi: 0xa4},
+ {value: 0x384d, lo: 0xa5, hi: 0xa5},
+ {value: 0x3859, lo: 0xa6, hi: 0xa6},
+ {value: 0xa000, lo: 0xa7, hi: 0xa7},
+ // Block 0x8, offset 0x47
+ {value: 0x0000, lo: 0x0e},
+ {value: 0x386b, lo: 0x80, hi: 0x80},
+ {value: 0xa000, lo: 0x81, hi: 0x81},
+ {value: 0x385f, lo: 0x82, hi: 0x82},
+ {value: 0xa000, lo: 0x92, hi: 0x92},
+ {value: 0x3865, lo: 0x93, hi: 0x93},
+ {value: 0xa000, lo: 0x95, hi: 0x95},
+ {value: 0x8132, lo: 0x96, hi: 0x9c},
+ {value: 0x8132, lo: 0x9f, hi: 0xa2},
+ {value: 0x812d, lo: 0xa3, hi: 0xa3},
+ {value: 0x8132, lo: 0xa4, hi: 0xa4},
+ {value: 0x8132, lo: 0xa7, hi: 0xa8},
+ {value: 0x812d, lo: 0xaa, hi: 0xaa},
+ {value: 0x8132, lo: 0xab, hi: 0xac},
+ {value: 0x812d, lo: 0xad, hi: 0xad},
+ // Block 0x9, offset 0x56
+ {value: 0x0000, lo: 0x0c},
+ {value: 0x811f, lo: 0x91, hi: 0x91},
+ {value: 0x8132, lo: 0xb0, hi: 0xb0},
+ {value: 0x812d, lo: 0xb1, hi: 0xb1},
+ {value: 0x8132, lo: 0xb2, hi: 0xb3},
+ {value: 0x812d, lo: 0xb4, hi: 0xb4},
+ {value: 0x8132, lo: 0xb5, hi: 0xb6},
+ {value: 0x812d, lo: 0xb7, hi: 0xb9},
+ {value: 0x8132, lo: 0xba, hi: 0xba},
+ {value: 0x812d, lo: 0xbb, hi: 0xbc},
+ {value: 0x8132, lo: 0xbd, hi: 0xbd},
+ {value: 0x812d, lo: 0xbe, hi: 0xbe},
+ {value: 0x8132, lo: 0xbf, hi: 0xbf},
+ // Block 0xa, offset 0x63
+ {value: 0x0005, lo: 0x07},
+ {value: 0x8132, lo: 0x80, hi: 0x80},
+ {value: 0x8132, lo: 0x81, hi: 0x81},
+ {value: 0x812d, lo: 0x82, hi: 0x83},
+ {value: 0x812d, lo: 0x84, hi: 0x85},
+ {value: 0x812d, lo: 0x86, hi: 0x87},
+ {value: 0x812d, lo: 0x88, hi: 0x89},
+ {value: 0x8132, lo: 0x8a, hi: 0x8a},
+ // Block 0xb, offset 0x6b
+ {value: 0x0000, lo: 0x03},
+ {value: 0x8132, lo: 0xab, hi: 0xb1},
+ {value: 0x812d, lo: 0xb2, hi: 0xb2},
+ {value: 0x8132, lo: 0xb3, hi: 0xb3},
+ // Block 0xc, offset 0x6f
+ {value: 0x0000, lo: 0x04},
+ {value: 0x8132, lo: 0x96, hi: 0x99},
+ {value: 0x8132, lo: 0x9b, hi: 0xa3},
+ {value: 0x8132, lo: 0xa5, hi: 0xa7},
+ {value: 0x8132, lo: 0xa9, hi: 0xad},
+ // Block 0xd, offset 0x74
+ {value: 0x0000, lo: 0x01},
+ {value: 0x812d, lo: 0x99, hi: 0x9b},
+ // Block 0xe, offset 0x76
+ {value: 0x0000, lo: 0x10},
+ {value: 0x8132, lo: 0x94, hi: 0xa1},
+ {value: 0x812d, lo: 0xa3, hi: 0xa3},
+ {value: 0x8132, lo: 0xa4, hi: 0xa5},
+ {value: 0x812d, lo: 0xa6, hi: 0xa6},
+ {value: 0x8132, lo: 0xa7, hi: 0xa8},
+ {value: 0x812d, lo: 0xa9, hi: 0xa9},
+ {value: 0x8132, lo: 0xaa, hi: 0xac},
+ {value: 0x812d, lo: 0xad, hi: 0xaf},
+ {value: 0x8116, lo: 0xb0, hi: 0xb0},
+ {value: 0x8117, lo: 0xb1, hi: 0xb1},
+ {value: 0x8118, lo: 0xb2, hi: 0xb2},
+ {value: 0x8132, lo: 0xb3, hi: 0xb5},
+ {value: 0x812d, lo: 0xb6, hi: 0xb6},
+ {value: 0x8132, lo: 0xb7, hi: 0xb8},
+ {value: 0x812d, lo: 0xb9, hi: 0xba},
+ {value: 0x8132, lo: 0xbb, hi: 0xbf},
+ // Block 0xf, offset 0x87
+ {value: 0x0000, lo: 0x07},
+ {value: 0xa000, lo: 0xa8, hi: 0xa8},
+ {value: 0x3ed8, lo: 0xa9, hi: 0xa9},
+ {value: 0xa000, lo: 0xb0, hi: 0xb0},
+ {value: 0x3ee0, lo: 0xb1, hi: 0xb1},
+ {value: 0xa000, lo: 0xb3, hi: 0xb3},
+ {value: 0x3ee8, lo: 0xb4, hi: 0xb4},
+ {value: 0x9902, lo: 0xbc, hi: 0xbc},
+ // Block 0x10, offset 0x8f
+ {value: 0x0008, lo: 0x06},
+ {value: 0x8104, lo: 0x8d, hi: 0x8d},
+ {value: 0x8132, lo: 0x91, hi: 0x91},
+ {value: 0x812d, lo: 0x92, hi: 0x92},
+ {value: 0x8132, lo: 0x93, hi: 0x93},
+ {value: 0x8132, lo: 0x94, hi: 0x94},
+ {value: 0x451c, lo: 0x98, hi: 0x9f},
+ // Block 0x11, offset 0x96
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8102, lo: 0xbc, hi: 0xbc},
+ {value: 0x9900, lo: 0xbe, hi: 0xbe},
+ // Block 0x12, offset 0x99
+ {value: 0x0008, lo: 0x06},
+ {value: 0xa000, lo: 0x87, hi: 0x87},
+ {value: 0x2c9e, lo: 0x8b, hi: 0x8c},
+ {value: 0x8104, lo: 0x8d, hi: 0x8d},
+ {value: 0x9900, lo: 0x97, hi: 0x97},
+ {value: 0x455c, lo: 0x9c, hi: 0x9d},
+ {value: 0x456c, lo: 0x9f, hi: 0x9f},
+ // Block 0x13, offset 0xa0
+ {value: 0x0000, lo: 0x03},
+ {value: 0x4594, lo: 0xb3, hi: 0xb3},
+ {value: 0x459c, lo: 0xb6, hi: 0xb6},
+ {value: 0x8102, lo: 0xbc, hi: 0xbc},
+ // Block 0x14, offset 0xa4
+ {value: 0x0008, lo: 0x03},
+ {value: 0x8104, lo: 0x8d, hi: 0x8d},
+ {value: 0x4574, lo: 0x99, hi: 0x9b},
+ {value: 0x458c, lo: 0x9e, hi: 0x9e},
+ // Block 0x15, offset 0xa8
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8102, lo: 0xbc, hi: 0xbc},
+ // Block 0x16, offset 0xaa
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8104, lo: 0x8d, hi: 0x8d},
+ // Block 0x17, offset 0xac
+ {value: 0x0000, lo: 0x08},
+ {value: 0xa000, lo: 0x87, hi: 0x87},
+ {value: 0x2cb6, lo: 0x88, hi: 0x88},
+ {value: 0x2cae, lo: 0x8b, hi: 0x8b},
+ {value: 0x2cbe, lo: 0x8c, hi: 0x8c},
+ {value: 0x8104, lo: 0x8d, hi: 0x8d},
+ {value: 0x9900, lo: 0x96, hi: 0x97},
+ {value: 0x45a4, lo: 0x9c, hi: 0x9c},
+ {value: 0x45ac, lo: 0x9d, hi: 0x9d},
+ // Block 0x18, offset 0xb5
+ {value: 0x0000, lo: 0x03},
+ {value: 0xa000, lo: 0x92, hi: 0x92},
+ {value: 0x2cc6, lo: 0x94, hi: 0x94},
+ {value: 0x9900, lo: 0xbe, hi: 0xbe},
+ // Block 0x19, offset 0xb9
+ {value: 0x0000, lo: 0x06},
+ {value: 0xa000, lo: 0x86, hi: 0x87},
+ {value: 0x2cce, lo: 0x8a, hi: 0x8a},
+ {value: 0x2cde, lo: 0x8b, hi: 0x8b},
+ {value: 0x2cd6, lo: 0x8c, hi: 0x8c},
+ {value: 0x8104, lo: 0x8d, hi: 0x8d},
+ {value: 0x9900, lo: 0x97, hi: 0x97},
+ // Block 0x1a, offset 0xc0
+ {value: 0x1801, lo: 0x04},
+ {value: 0xa000, lo: 0x86, hi: 0x86},
+ {value: 0x3ef0, lo: 0x88, hi: 0x88},
+ {value: 0x8104, lo: 0x8d, hi: 0x8d},
+ {value: 0x8120, lo: 0x95, hi: 0x96},
+ // Block 0x1b, offset 0xc5
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8102, lo: 0xbc, hi: 0xbc},
+ {value: 0xa000, lo: 0xbf, hi: 0xbf},
+ // Block 0x1c, offset 0xc8
+ {value: 0x0000, lo: 0x09},
+ {value: 0x2ce6, lo: 0x80, hi: 0x80},
+ {value: 0x9900, lo: 0x82, hi: 0x82},
+ {value: 0xa000, lo: 0x86, hi: 0x86},
+ {value: 0x2cee, lo: 0x87, hi: 0x87},
+ {value: 0x2cf6, lo: 0x88, hi: 0x88},
+ {value: 0x2f50, lo: 0x8a, hi: 0x8a},
+ {value: 0x2dd8, lo: 0x8b, hi: 0x8b},
+ {value: 0x8104, lo: 0x8d, hi: 0x8d},
+ {value: 0x9900, lo: 0x95, hi: 0x96},
+ // Block 0x1d, offset 0xd2
+ {value: 0x0000, lo: 0x01},
+ {value: 0x9900, lo: 0xbe, hi: 0xbe},
+ // Block 0x1e, offset 0xd4
+ {value: 0x0000, lo: 0x06},
+ {value: 0xa000, lo: 0x86, hi: 0x87},
+ {value: 0x2cfe, lo: 0x8a, hi: 0x8a},
+ {value: 0x2d0e, lo: 0x8b, hi: 0x8b},
+ {value: 0x2d06, lo: 0x8c, hi: 0x8c},
+ {value: 0x8104, lo: 0x8d, hi: 0x8d},
+ {value: 0x9900, lo: 0x97, hi: 0x97},
+ // Block 0x1f, offset 0xdb
+ {value: 0x6bea, lo: 0x07},
+ {value: 0x9904, lo: 0x8a, hi: 0x8a},
+ {value: 0x9900, lo: 0x8f, hi: 0x8f},
+ {value: 0xa000, lo: 0x99, hi: 0x99},
+ {value: 0x3ef8, lo: 0x9a, hi: 0x9a},
+ {value: 0x2f58, lo: 0x9c, hi: 0x9c},
+ {value: 0x2de3, lo: 0x9d, hi: 0x9d},
+ {value: 0x2d16, lo: 0x9e, hi: 0x9f},
+ // Block 0x20, offset 0xe3
+ {value: 0x0000, lo: 0x03},
+ {value: 0x2621, lo: 0xb3, hi: 0xb3},
+ {value: 0x8122, lo: 0xb8, hi: 0xb9},
+ {value: 0x8104, lo: 0xba, hi: 0xba},
+ // Block 0x21, offset 0xe7
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8123, lo: 0x88, hi: 0x8b},
+ // Block 0x22, offset 0xe9
+ {value: 0x0000, lo: 0x02},
+ {value: 0x2636, lo: 0xb3, hi: 0xb3},
+ {value: 0x8124, lo: 0xb8, hi: 0xb9},
+ // Block 0x23, offset 0xec
+ {value: 0x0000, lo: 0x03},
+ {value: 0x8125, lo: 0x88, hi: 0x8b},
+ {value: 0x2628, lo: 0x9c, hi: 0x9c},
+ {value: 0x262f, lo: 0x9d, hi: 0x9d},
+ // Block 0x24, offset 0xf0
+ {value: 0x0000, lo: 0x05},
+ {value: 0x030b, lo: 0x8c, hi: 0x8c},
+ {value: 0x812d, lo: 0x98, hi: 0x99},
+ {value: 0x812d, lo: 0xb5, hi: 0xb5},
+ {value: 0x812d, lo: 0xb7, hi: 0xb7},
+ {value: 0x812b, lo: 0xb9, hi: 0xb9},
+ // Block 0x25, offset 0xf6
+ {value: 0x0000, lo: 0x10},
+ {value: 0x2644, lo: 0x83, hi: 0x83},
+ {value: 0x264b, lo: 0x8d, hi: 0x8d},
+ {value: 0x2652, lo: 0x92, hi: 0x92},
+ {value: 0x2659, lo: 0x97, hi: 0x97},
+ {value: 0x2660, lo: 0x9c, hi: 0x9c},
+ {value: 0x263d, lo: 0xa9, hi: 0xa9},
+ {value: 0x8126, lo: 0xb1, hi: 0xb1},
+ {value: 0x8127, lo: 0xb2, hi: 0xb2},
+ {value: 0x4a84, lo: 0xb3, hi: 0xb3},
+ {value: 0x8128, lo: 0xb4, hi: 0xb4},
+ {value: 0x4a8d, lo: 0xb5, hi: 0xb5},
+ {value: 0x45b4, lo: 0xb6, hi: 0xb6},
+ {value: 0x45f4, lo: 0xb7, hi: 0xb7},
+ {value: 0x45bc, lo: 0xb8, hi: 0xb8},
+ {value: 0x45ff, lo: 0xb9, hi: 0xb9},
+ {value: 0x8127, lo: 0xba, hi: 0xbd},
+ // Block 0x26, offset 0x107
+ {value: 0x0000, lo: 0x0b},
+ {value: 0x8127, lo: 0x80, hi: 0x80},
+ {value: 0x4a96, lo: 0x81, hi: 0x81},
+ {value: 0x8132, lo: 0x82, hi: 0x83},
+ {value: 0x8104, lo: 0x84, hi: 0x84},
+ {value: 0x8132, lo: 0x86, hi: 0x87},
+ {value: 0x266e, lo: 0x93, hi: 0x93},
+ {value: 0x2675, lo: 0x9d, hi: 0x9d},
+ {value: 0x267c, lo: 0xa2, hi: 0xa2},
+ {value: 0x2683, lo: 0xa7, hi: 0xa7},
+ {value: 0x268a, lo: 0xac, hi: 0xac},
+ {value: 0x2667, lo: 0xb9, hi: 0xb9},
+ // Block 0x27, offset 0x113
+ {value: 0x0000, lo: 0x01},
+ {value: 0x812d, lo: 0x86, hi: 0x86},
+ // Block 0x28, offset 0x115
+ {value: 0x0000, lo: 0x05},
+ {value: 0xa000, lo: 0xa5, hi: 0xa5},
+ {value: 0x2d1e, lo: 0xa6, hi: 0xa6},
+ {value: 0x9900, lo: 0xae, hi: 0xae},
+ {value: 0x8102, lo: 0xb7, hi: 0xb7},
+ {value: 0x8104, lo: 0xb9, hi: 0xba},
+ // Block 0x29, offset 0x11b
+ {value: 0x0000, lo: 0x01},
+ {value: 0x812d, lo: 0x8d, hi: 0x8d},
+ // Block 0x2a, offset 0x11d
+ {value: 0x0000, lo: 0x01},
+ {value: 0x030f, lo: 0xbc, hi: 0xbc},
+ // Block 0x2b, offset 0x11f
+ {value: 0x0000, lo: 0x01},
+ {value: 0xa000, lo: 0x80, hi: 0x92},
+ // Block 0x2c, offset 0x121
+ {value: 0x0000, lo: 0x01},
+ {value: 0xb900, lo: 0xa1, hi: 0xb5},
+ // Block 0x2d, offset 0x123
+ {value: 0x0000, lo: 0x01},
+ {value: 0x9900, lo: 0xa8, hi: 0xbf},
+ // Block 0x2e, offset 0x125
+ {value: 0x0000, lo: 0x01},
+ {value: 0x9900, lo: 0x80, hi: 0x82},
+ // Block 0x2f, offset 0x127
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8132, lo: 0x9d, hi: 0x9f},
+ // Block 0x30, offset 0x129
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8104, lo: 0x94, hi: 0x94},
+ {value: 0x8104, lo: 0xb4, hi: 0xb4},
+ // Block 0x31, offset 0x12c
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8104, lo: 0x92, hi: 0x92},
+ {value: 0x8132, lo: 0x9d, hi: 0x9d},
+ // Block 0x32, offset 0x12f
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8131, lo: 0xa9, hi: 0xa9},
+ // Block 0x33, offset 0x131
+ {value: 0x0004, lo: 0x02},
+ {value: 0x812e, lo: 0xb9, hi: 0xba},
+ {value: 0x812d, lo: 0xbb, hi: 0xbb},
+ // Block 0x34, offset 0x134
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8132, lo: 0x97, hi: 0x97},
+ {value: 0x812d, lo: 0x98, hi: 0x98},
+ // Block 0x35, offset 0x137
+ {value: 0x0000, lo: 0x03},
+ {value: 0x8104, lo: 0xa0, hi: 0xa0},
+ {value: 0x8132, lo: 0xb5, hi: 0xbc},
+ {value: 0x812d, lo: 0xbf, hi: 0xbf},
+ // Block 0x36, offset 0x13b
+ {value: 0x0000, lo: 0x04},
+ {value: 0x8132, lo: 0xb0, hi: 0xb4},
+ {value: 0x812d, lo: 0xb5, hi: 0xba},
+ {value: 0x8132, lo: 0xbb, hi: 0xbc},
+ {value: 0x812d, lo: 0xbd, hi: 0xbd},
+ // Block 0x37, offset 0x140
+ {value: 0x0000, lo: 0x08},
+ {value: 0x2d66, lo: 0x80, hi: 0x80},
+ {value: 0x2d6e, lo: 0x81, hi: 0x81},
+ {value: 0xa000, lo: 0x82, hi: 0x82},
+ {value: 0x2d76, lo: 0x83, hi: 0x83},
+ {value: 0x8104, lo: 0x84, hi: 0x84},
+ {value: 0x8132, lo: 0xab, hi: 0xab},
+ {value: 0x812d, lo: 0xac, hi: 0xac},
+ {value: 0x8132, lo: 0xad, hi: 0xb3},
+ // Block 0x38, offset 0x149
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8104, lo: 0xaa, hi: 0xab},
+ // Block 0x39, offset 0x14b
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8102, lo: 0xa6, hi: 0xa6},
+ {value: 0x8104, lo: 0xb2, hi: 0xb3},
+ // Block 0x3a, offset 0x14e
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8102, lo: 0xb7, hi: 0xb7},
+ // Block 0x3b, offset 0x150
+ {value: 0x0000, lo: 0x0a},
+ {value: 0x8132, lo: 0x90, hi: 0x92},
+ {value: 0x8101, lo: 0x94, hi: 0x94},
+ {value: 0x812d, lo: 0x95, hi: 0x99},
+ {value: 0x8132, lo: 0x9a, hi: 0x9b},
+ {value: 0x812d, lo: 0x9c, hi: 0x9f},
+ {value: 0x8132, lo: 0xa0, hi: 0xa0},
+ {value: 0x8101, lo: 0xa2, hi: 0xa8},
+ {value: 0x812d, lo: 0xad, hi: 0xad},
+ {value: 0x8132, lo: 0xb4, hi: 0xb4},
+ {value: 0x8132, lo: 0xb8, hi: 0xb9},
+ // Block 0x3c, offset 0x15b
+ {value: 0x0002, lo: 0x0a},
+ {value: 0x0043, lo: 0xac, hi: 0xac},
+ {value: 0x00d1, lo: 0xad, hi: 0xad},
+ {value: 0x0045, lo: 0xae, hi: 0xae},
+ {value: 0x0049, lo: 0xb0, hi: 0xb1},
+ {value: 0x00e6, lo: 0xb2, hi: 0xb2},
+ {value: 0x004f, lo: 0xb3, hi: 0xba},
+ {value: 0x005f, lo: 0xbc, hi: 0xbc},
+ {value: 0x00ef, lo: 0xbd, hi: 0xbd},
+ {value: 0x0061, lo: 0xbe, hi: 0xbe},
+ {value: 0x0065, lo: 0xbf, hi: 0xbf},
+ // Block 0x3d, offset 0x166
+ {value: 0x0000, lo: 0x0f},
+ {value: 0x8132, lo: 0x80, hi: 0x81},
+ {value: 0x812d, lo: 0x82, hi: 0x82},
+ {value: 0x8132, lo: 0x83, hi: 0x89},
+ {value: 0x812d, lo: 0x8a, hi: 0x8a},
+ {value: 0x8132, lo: 0x8b, hi: 0x8c},
+ {value: 0x8135, lo: 0x8d, hi: 0x8d},
+ {value: 0x812a, lo: 0x8e, hi: 0x8e},
+ {value: 0x812d, lo: 0x8f, hi: 0x8f},
+ {value: 0x8129, lo: 0x90, hi: 0x90},
+ {value: 0x8132, lo: 0x91, hi: 0xb5},
+ {value: 0x8132, lo: 0xbb, hi: 0xbb},
+ {value: 0x8134, lo: 0xbc, hi: 0xbc},
+ {value: 0x812d, lo: 0xbd, hi: 0xbd},
+ {value: 0x8132, lo: 0xbe, hi: 0xbe},
+ {value: 0x812d, lo: 0xbf, hi: 0xbf},
+ // Block 0x3e, offset 0x176
+ {value: 0x0000, lo: 0x0d},
+ {value: 0x0001, lo: 0x80, hi: 0x8a},
+ {value: 0x043b, lo: 0x91, hi: 0x91},
+ {value: 0x429b, lo: 0x97, hi: 0x97},
+ {value: 0x001d, lo: 0xa4, hi: 0xa4},
+ {value: 0x1873, lo: 0xa5, hi: 0xa5},
+ {value: 0x1b5c, lo: 0xa6, hi: 0xa6},
+ {value: 0x0001, lo: 0xaf, hi: 0xaf},
+ {value: 0x2691, lo: 0xb3, hi: 0xb3},
+ {value: 0x27fe, lo: 0xb4, hi: 0xb4},
+ {value: 0x2698, lo: 0xb6, hi: 0xb6},
+ {value: 0x2808, lo: 0xb7, hi: 0xb7},
+ {value: 0x186d, lo: 0xbc, hi: 0xbc},
+ {value: 0x4269, lo: 0xbe, hi: 0xbe},
+ // Block 0x3f, offset 0x184
+ {value: 0x0002, lo: 0x0d},
+ {value: 0x1933, lo: 0x87, hi: 0x87},
+ {value: 0x1930, lo: 0x88, hi: 0x88},
+ {value: 0x1870, lo: 0x89, hi: 0x89},
+ {value: 0x298e, lo: 0x97, hi: 0x97},
+ {value: 0x0001, lo: 0x9f, hi: 0x9f},
+ {value: 0x0021, lo: 0xb0, hi: 0xb0},
+ {value: 0x0093, lo: 0xb1, hi: 0xb1},
+ {value: 0x0029, lo: 0xb4, hi: 0xb9},
+ {value: 0x0017, lo: 0xba, hi: 0xba},
+ {value: 0x0467, lo: 0xbb, hi: 0xbb},
+ {value: 0x003b, lo: 0xbc, hi: 0xbc},
+ {value: 0x0011, lo: 0xbd, hi: 0xbe},
+ {value: 0x009d, lo: 0xbf, hi: 0xbf},
+ // Block 0x40, offset 0x192
+ {value: 0x0002, lo: 0x0f},
+ {value: 0x0021, lo: 0x80, hi: 0x89},
+ {value: 0x0017, lo: 0x8a, hi: 0x8a},
+ {value: 0x0467, lo: 0x8b, hi: 0x8b},
+ {value: 0x003b, lo: 0x8c, hi: 0x8c},
+ {value: 0x0011, lo: 0x8d, hi: 0x8e},
+ {value: 0x0083, lo: 0x90, hi: 0x90},
+ {value: 0x008b, lo: 0x91, hi: 0x91},
+ {value: 0x009f, lo: 0x92, hi: 0x92},
+ {value: 0x00b1, lo: 0x93, hi: 0x93},
+ {value: 0x0104, lo: 0x94, hi: 0x94},
+ {value: 0x0091, lo: 0x95, hi: 0x95},
+ {value: 0x0097, lo: 0x96, hi: 0x99},
+ {value: 0x00a1, lo: 0x9a, hi: 0x9a},
+ {value: 0x00a7, lo: 0x9b, hi: 0x9c},
+ {value: 0x1999, lo: 0xa8, hi: 0xa8},
+ // Block 0x41, offset 0x1a2
+ {value: 0x0000, lo: 0x0d},
+ {value: 0x8132, lo: 0x90, hi: 0x91},
+ {value: 0x8101, lo: 0x92, hi: 0x93},
+ {value: 0x8132, lo: 0x94, hi: 0x97},
+ {value: 0x8101, lo: 0x98, hi: 0x9a},
+ {value: 0x8132, lo: 0x9b, hi: 0x9c},
+ {value: 0x8132, lo: 0xa1, hi: 0xa1},
+ {value: 0x8101, lo: 0xa5, hi: 0xa6},
+ {value: 0x8132, lo: 0xa7, hi: 0xa7},
+ {value: 0x812d, lo: 0xa8, hi: 0xa8},
+ {value: 0x8132, lo: 0xa9, hi: 0xa9},
+ {value: 0x8101, lo: 0xaa, hi: 0xab},
+ {value: 0x812d, lo: 0xac, hi: 0xaf},
+ {value: 0x8132, lo: 0xb0, hi: 0xb0},
+ // Block 0x42, offset 0x1b0
+ {value: 0x0007, lo: 0x06},
+ {value: 0x2180, lo: 0x89, hi: 0x89},
+ {value: 0xa000, lo: 0x90, hi: 0x90},
+ {value: 0xa000, lo: 0x92, hi: 0x92},
+ {value: 0xa000, lo: 0x94, hi: 0x94},
+ {value: 0x3bb9, lo: 0x9a, hi: 0x9b},
+ {value: 0x3bc7, lo: 0xae, hi: 0xae},
+ // Block 0x43, offset 0x1b7
+ {value: 0x000e, lo: 0x05},
+ {value: 0x3bce, lo: 0x8d, hi: 0x8e},
+ {value: 0x3bd5, lo: 0x8f, hi: 0x8f},
+ {value: 0xa000, lo: 0x90, hi: 0x90},
+ {value: 0xa000, lo: 0x92, hi: 0x92},
+ {value: 0xa000, lo: 0x94, hi: 0x94},
+ // Block 0x44, offset 0x1bd
+ {value: 0x0173, lo: 0x0e},
+ {value: 0xa000, lo: 0x83, hi: 0x83},
+ {value: 0x3be3, lo: 0x84, hi: 0x84},
+ {value: 0xa000, lo: 0x88, hi: 0x88},
+ {value: 0x3bea, lo: 0x89, hi: 0x89},
+ {value: 0xa000, lo: 0x8b, hi: 0x8b},
+ {value: 0x3bf1, lo: 0x8c, hi: 0x8c},
+ {value: 0xa000, lo: 0xa3, hi: 0xa3},
+ {value: 0x3bf8, lo: 0xa4, hi: 0xa4},
+ {value: 0xa000, lo: 0xa5, hi: 0xa5},
+ {value: 0x3bff, lo: 0xa6, hi: 0xa6},
+ {value: 0x269f, lo: 0xac, hi: 0xad},
+ {value: 0x26a6, lo: 0xaf, hi: 0xaf},
+ {value: 0x281c, lo: 0xb0, hi: 0xb0},
+ {value: 0xa000, lo: 0xbc, hi: 0xbc},
+ // Block 0x45, offset 0x1cc
+ {value: 0x0007, lo: 0x03},
+ {value: 0x3c68, lo: 0xa0, hi: 0xa1},
+ {value: 0x3c92, lo: 0xa2, hi: 0xa3},
+ {value: 0x3cbc, lo: 0xaa, hi: 0xad},
+ // Block 0x46, offset 0x1d0
+ {value: 0x0004, lo: 0x01},
+ {value: 0x048b, lo: 0xa9, hi: 0xaa},
+ // Block 0x47, offset 0x1d2
+ {value: 0x0002, lo: 0x03},
+ {value: 0x0057, lo: 0x80, hi: 0x8f},
+ {value: 0x0083, lo: 0x90, hi: 0xa9},
+ {value: 0x0021, lo: 0xaa, hi: 0xaa},
+ // Block 0x48, offset 0x1d6
+ {value: 0x0000, lo: 0x01},
+ {value: 0x299b, lo: 0x8c, hi: 0x8c},
+ // Block 0x49, offset 0x1d8
+ {value: 0x0263, lo: 0x02},
+ {value: 0x1b8c, lo: 0xb4, hi: 0xb4},
+ {value: 0x192d, lo: 0xb5, hi: 0xb6},
+ // Block 0x4a, offset 0x1db
+ {value: 0x0000, lo: 0x01},
+ {value: 0x44dd, lo: 0x9c, hi: 0x9c},
+ // Block 0x4b, offset 0x1dd
+ {value: 0x0000, lo: 0x02},
+ {value: 0x0095, lo: 0xbc, hi: 0xbc},
+ {value: 0x006d, lo: 0xbd, hi: 0xbd},
+ // Block 0x4c, offset 0x1e0
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8132, lo: 0xaf, hi: 0xb1},
+ // Block 0x4d, offset 0x1e2
+ {value: 0x0000, lo: 0x02},
+ {value: 0x047f, lo: 0xaf, hi: 0xaf},
+ {value: 0x8104, lo: 0xbf, hi: 0xbf},
+ // Block 0x4e, offset 0x1e5
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8132, lo: 0xa0, hi: 0xbf},
+ // Block 0x4f, offset 0x1e7
+ {value: 0x0000, lo: 0x01},
+ {value: 0x0dc3, lo: 0x9f, hi: 0x9f},
+ // Block 0x50, offset 0x1e9
+ {value: 0x0000, lo: 0x01},
+ {value: 0x162f, lo: 0xb3, hi: 0xb3},
+ // Block 0x51, offset 0x1eb
+ {value: 0x0004, lo: 0x0b},
+ {value: 0x1597, lo: 0x80, hi: 0x82},
+ {value: 0x15af, lo: 0x83, hi: 0x83},
+ {value: 0x15c7, lo: 0x84, hi: 0x85},
+ {value: 0x15d7, lo: 0x86, hi: 0x89},
+ {value: 0x15eb, lo: 0x8a, hi: 0x8c},
+ {value: 0x15ff, lo: 0x8d, hi: 0x8d},
+ {value: 0x1607, lo: 0x8e, hi: 0x8e},
+ {value: 0x160f, lo: 0x8f, hi: 0x90},
+ {value: 0x161b, lo: 0x91, hi: 0x93},
+ {value: 0x162b, lo: 0x94, hi: 0x94},
+ {value: 0x1633, lo: 0x95, hi: 0x95},
+ // Block 0x52, offset 0x1f7
+ {value: 0x0004, lo: 0x09},
+ {value: 0x0001, lo: 0x80, hi: 0x80},
+ {value: 0x812c, lo: 0xaa, hi: 0xaa},
+ {value: 0x8131, lo: 0xab, hi: 0xab},
+ {value: 0x8133, lo: 0xac, hi: 0xac},
+ {value: 0x812e, lo: 0xad, hi: 0xad},
+ {value: 0x812f, lo: 0xae, hi: 0xae},
+ {value: 0x812f, lo: 0xaf, hi: 0xaf},
+ {value: 0x04b3, lo: 0xb6, hi: 0xb6},
+ {value: 0x0887, lo: 0xb8, hi: 0xba},
+ // Block 0x53, offset 0x201
+ {value: 0x0006, lo: 0x09},
+ {value: 0x0313, lo: 0xb1, hi: 0xb1},
+ {value: 0x0317, lo: 0xb2, hi: 0xb2},
+ {value: 0x4a3b, lo: 0xb3, hi: 0xb3},
+ {value: 0x031b, lo: 0xb4, hi: 0xb4},
+ {value: 0x4a41, lo: 0xb5, hi: 0xb6},
+ {value: 0x031f, lo: 0xb7, hi: 0xb7},
+ {value: 0x0323, lo: 0xb8, hi: 0xb8},
+ {value: 0x0327, lo: 0xb9, hi: 0xb9},
+ {value: 0x4a4d, lo: 0xba, hi: 0xbf},
+ // Block 0x54, offset 0x20b
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8132, lo: 0xaf, hi: 0xaf},
+ {value: 0x8132, lo: 0xb4, hi: 0xbd},
+ // Block 0x55, offset 0x20e
+ {value: 0x0000, lo: 0x03},
+ {value: 0x020f, lo: 0x9c, hi: 0x9c},
+ {value: 0x0212, lo: 0x9d, hi: 0x9d},
+ {value: 0x8132, lo: 0x9e, hi: 0x9f},
+ // Block 0x56, offset 0x212
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8132, lo: 0xb0, hi: 0xb1},
+ // Block 0x57, offset 0x214
+ {value: 0x0000, lo: 0x01},
+ {value: 0x163b, lo: 0xb0, hi: 0xb0},
+ // Block 0x58, offset 0x216
+ {value: 0x000c, lo: 0x01},
+ {value: 0x00d7, lo: 0xb8, hi: 0xb9},
+ // Block 0x59, offset 0x218
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8104, lo: 0x86, hi: 0x86},
+ // Block 0x5a, offset 0x21a
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8104, lo: 0x84, hi: 0x84},
+ {value: 0x8132, lo: 0xa0, hi: 0xb1},
+ // Block 0x5b, offset 0x21d
+ {value: 0x0000, lo: 0x01},
+ {value: 0x812d, lo: 0xab, hi: 0xad},
+ // Block 0x5c, offset 0x21f
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8104, lo: 0x93, hi: 0x93},
+ // Block 0x5d, offset 0x221
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8102, lo: 0xb3, hi: 0xb3},
+ // Block 0x5e, offset 0x223
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8104, lo: 0x80, hi: 0x80},
+ // Block 0x5f, offset 0x225
+ {value: 0x0000, lo: 0x05},
+ {value: 0x8132, lo: 0xb0, hi: 0xb0},
+ {value: 0x8132, lo: 0xb2, hi: 0xb3},
+ {value: 0x812d, lo: 0xb4, hi: 0xb4},
+ {value: 0x8132, lo: 0xb7, hi: 0xb8},
+ {value: 0x8132, lo: 0xbe, hi: 0xbf},
+ // Block 0x60, offset 0x22b
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8132, lo: 0x81, hi: 0x81},
+ {value: 0x8104, lo: 0xb6, hi: 0xb6},
+ // Block 0x61, offset 0x22e
+ {value: 0x0008, lo: 0x03},
+ {value: 0x1637, lo: 0x9c, hi: 0x9d},
+ {value: 0x0125, lo: 0x9e, hi: 0x9e},
+ {value: 0x1643, lo: 0x9f, hi: 0x9f},
+ // Block 0x62, offset 0x232
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8104, lo: 0xad, hi: 0xad},
+ // Block 0x63, offset 0x234
+ {value: 0x0000, lo: 0x06},
+ {value: 0xe500, lo: 0x80, hi: 0x80},
+ {value: 0xc600, lo: 0x81, hi: 0x9b},
+ {value: 0xe500, lo: 0x9c, hi: 0x9c},
+ {value: 0xc600, lo: 0x9d, hi: 0xb7},
+ {value: 0xe500, lo: 0xb8, hi: 0xb8},
+ {value: 0xc600, lo: 0xb9, hi: 0xbf},
+ // Block 0x64, offset 0x23b
+ {value: 0x0000, lo: 0x05},
+ {value: 0xc600, lo: 0x80, hi: 0x93},
+ {value: 0xe500, lo: 0x94, hi: 0x94},
+ {value: 0xc600, lo: 0x95, hi: 0xaf},
+ {value: 0xe500, lo: 0xb0, hi: 0xb0},
+ {value: 0xc600, lo: 0xb1, hi: 0xbf},
+ // Block 0x65, offset 0x241
+ {value: 0x0000, lo: 0x05},
+ {value: 0xc600, lo: 0x80, hi: 0x8b},
+ {value: 0xe500, lo: 0x8c, hi: 0x8c},
+ {value: 0xc600, lo: 0x8d, hi: 0xa7},
+ {value: 0xe500, lo: 0xa8, hi: 0xa8},
+ {value: 0xc600, lo: 0xa9, hi: 0xbf},
+ // Block 0x66, offset 0x247
+ {value: 0x0000, lo: 0x07},
+ {value: 0xc600, lo: 0x80, hi: 0x83},
+ {value: 0xe500, lo: 0x84, hi: 0x84},
+ {value: 0xc600, lo: 0x85, hi: 0x9f},
+ {value: 0xe500, lo: 0xa0, hi: 0xa0},
+ {value: 0xc600, lo: 0xa1, hi: 0xbb},
+ {value: 0xe500, lo: 0xbc, hi: 0xbc},
+ {value: 0xc600, lo: 0xbd, hi: 0xbf},
+ // Block 0x67, offset 0x24f
+ {value: 0x0000, lo: 0x05},
+ {value: 0xc600, lo: 0x80, hi: 0x97},
+ {value: 0xe500, lo: 0x98, hi: 0x98},
+ {value: 0xc600, lo: 0x99, hi: 0xb3},
+ {value: 0xe500, lo: 0xb4, hi: 0xb4},
+ {value: 0xc600, lo: 0xb5, hi: 0xbf},
+ // Block 0x68, offset 0x255
+ {value: 0x0000, lo: 0x05},
+ {value: 0xc600, lo: 0x80, hi: 0x8f},
+ {value: 0xe500, lo: 0x90, hi: 0x90},
+ {value: 0xc600, lo: 0x91, hi: 0xab},
+ {value: 0xe500, lo: 0xac, hi: 0xac},
+ {value: 0xc600, lo: 0xad, hi: 0xbf},
+ // Block 0x69, offset 0x25b
+ {value: 0x0000, lo: 0x05},
+ {value: 0xc600, lo: 0x80, hi: 0x87},
+ {value: 0xe500, lo: 0x88, hi: 0x88},
+ {value: 0xc600, lo: 0x89, hi: 0xa3},
+ {value: 0xe500, lo: 0xa4, hi: 0xa4},
+ {value: 0xc600, lo: 0xa5, hi: 0xbf},
+ // Block 0x6a, offset 0x261
+ {value: 0x0000, lo: 0x03},
+ {value: 0xc600, lo: 0x80, hi: 0x87},
+ {value: 0xe500, lo: 0x88, hi: 0x88},
+ {value: 0xc600, lo: 0x89, hi: 0xa3},
+ // Block 0x6b, offset 0x265
+ {value: 0x0002, lo: 0x01},
+ {value: 0x0003, lo: 0x81, hi: 0xbf},
+ // Block 0x6c, offset 0x267
+ {value: 0x0000, lo: 0x01},
+ {value: 0x812d, lo: 0xbd, hi: 0xbd},
+ // Block 0x6d, offset 0x269
+ {value: 0x0000, lo: 0x01},
+ {value: 0x812d, lo: 0xa0, hi: 0xa0},
+ // Block 0x6e, offset 0x26b
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8132, lo: 0xb6, hi: 0xba},
+ // Block 0x6f, offset 0x26d
+ {value: 0x002c, lo: 0x05},
+ {value: 0x812d, lo: 0x8d, hi: 0x8d},
+ {value: 0x8132, lo: 0x8f, hi: 0x8f},
+ {value: 0x8132, lo: 0xb8, hi: 0xb8},
+ {value: 0x8101, lo: 0xb9, hi: 0xba},
+ {value: 0x8104, lo: 0xbf, hi: 0xbf},
+ // Block 0x70, offset 0x273
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8132, lo: 0xa5, hi: 0xa5},
+ {value: 0x812d, lo: 0xa6, hi: 0xa6},
+ // Block 0x71, offset 0x276
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8104, lo: 0x86, hi: 0x86},
+ {value: 0x8104, lo: 0xbf, hi: 0xbf},
+ // Block 0x72, offset 0x279
+ {value: 0x17fe, lo: 0x07},
+ {value: 0xa000, lo: 0x99, hi: 0x99},
+ {value: 0x4238, lo: 0x9a, hi: 0x9a},
+ {value: 0xa000, lo: 0x9b, hi: 0x9b},
+ {value: 0x4242, lo: 0x9c, hi: 0x9c},
+ {value: 0xa000, lo: 0xa5, hi: 0xa5},
+ {value: 0x424c, lo: 0xab, hi: 0xab},
+ {value: 0x8104, lo: 0xb9, hi: 0xba},
+ // Block 0x73, offset 0x281
+ {value: 0x0000, lo: 0x06},
+ {value: 0x8132, lo: 0x80, hi: 0x82},
+ {value: 0x9900, lo: 0xa7, hi: 0xa7},
+ {value: 0x2d7e, lo: 0xae, hi: 0xae},
+ {value: 0x2d88, lo: 0xaf, hi: 0xaf},
+ {value: 0xa000, lo: 0xb1, hi: 0xb2},
+ {value: 0x8104, lo: 0xb3, hi: 0xb4},
+ // Block 0x74, offset 0x288
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8104, lo: 0x80, hi: 0x80},
+ {value: 0x8102, lo: 0x8a, hi: 0x8a},
+ // Block 0x75, offset 0x28b
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8104, lo: 0xb5, hi: 0xb5},
+ {value: 0x8102, lo: 0xb6, hi: 0xb6},
+ // Block 0x76, offset 0x28e
+ {value: 0x0002, lo: 0x01},
+ {value: 0x8102, lo: 0xa9, hi: 0xaa},
+ // Block 0x77, offset 0x290
+ {value: 0x0000, lo: 0x07},
+ {value: 0xa000, lo: 0x87, hi: 0x87},
+ {value: 0x2d92, lo: 0x8b, hi: 0x8b},
+ {value: 0x2d9c, lo: 0x8c, hi: 0x8c},
+ {value: 0x8104, lo: 0x8d, hi: 0x8d},
+ {value: 0x9900, lo: 0x97, hi: 0x97},
+ {value: 0x8132, lo: 0xa6, hi: 0xac},
+ {value: 0x8132, lo: 0xb0, hi: 0xb4},
+ // Block 0x78, offset 0x298
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8104, lo: 0x82, hi: 0x82},
+ {value: 0x8102, lo: 0x86, hi: 0x86},
+ // Block 0x79, offset 0x29b
+ {value: 0x6b5a, lo: 0x06},
+ {value: 0x9900, lo: 0xb0, hi: 0xb0},
+ {value: 0xa000, lo: 0xb9, hi: 0xb9},
+ {value: 0x9900, lo: 0xba, hi: 0xba},
+ {value: 0x2db0, lo: 0xbb, hi: 0xbb},
+ {value: 0x2da6, lo: 0xbc, hi: 0xbd},
+ {value: 0x2dba, lo: 0xbe, hi: 0xbe},
+ // Block 0x7a, offset 0x2a2
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8104, lo: 0x82, hi: 0x82},
+ {value: 0x8102, lo: 0x83, hi: 0x83},
+ // Block 0x7b, offset 0x2a5
+ {value: 0x0000, lo: 0x05},
+ {value: 0x9900, lo: 0xaf, hi: 0xaf},
+ {value: 0xa000, lo: 0xb8, hi: 0xb9},
+ {value: 0x2dc4, lo: 0xba, hi: 0xba},
+ {value: 0x2dce, lo: 0xbb, hi: 0xbb},
+ {value: 0x8104, lo: 0xbf, hi: 0xbf},
+ // Block 0x7c, offset 0x2ab
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8102, lo: 0x80, hi: 0x80},
+ // Block 0x7d, offset 0x2ad
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8104, lo: 0xbf, hi: 0xbf},
+ // Block 0x7e, offset 0x2af
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8104, lo: 0xb6, hi: 0xb6},
+ {value: 0x8102, lo: 0xb7, hi: 0xb7},
+ // Block 0x7f, offset 0x2b2
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8104, lo: 0xab, hi: 0xab},
+ // Block 0x80, offset 0x2b4
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8101, lo: 0xb0, hi: 0xb4},
+ // Block 0x81, offset 0x2b6
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8132, lo: 0xb0, hi: 0xb6},
+ // Block 0x82, offset 0x2b8
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8101, lo: 0x9e, hi: 0x9e},
+ // Block 0x83, offset 0x2ba
+ {value: 0x0000, lo: 0x0c},
+ {value: 0x45cc, lo: 0x9e, hi: 0x9e},
+ {value: 0x45d6, lo: 0x9f, hi: 0x9f},
+ {value: 0x460a, lo: 0xa0, hi: 0xa0},
+ {value: 0x4618, lo: 0xa1, hi: 0xa1},
+ {value: 0x4626, lo: 0xa2, hi: 0xa2},
+ {value: 0x4634, lo: 0xa3, hi: 0xa3},
+ {value: 0x4642, lo: 0xa4, hi: 0xa4},
+ {value: 0x812b, lo: 0xa5, hi: 0xa6},
+ {value: 0x8101, lo: 0xa7, hi: 0xa9},
+ {value: 0x8130, lo: 0xad, hi: 0xad},
+ {value: 0x812b, lo: 0xae, hi: 0xb2},
+ {value: 0x812d, lo: 0xbb, hi: 0xbf},
+ // Block 0x84, offset 0x2c7
+ {value: 0x0000, lo: 0x09},
+ {value: 0x812d, lo: 0x80, hi: 0x82},
+ {value: 0x8132, lo: 0x85, hi: 0x89},
+ {value: 0x812d, lo: 0x8a, hi: 0x8b},
+ {value: 0x8132, lo: 0xaa, hi: 0xad},
+ {value: 0x45e0, lo: 0xbb, hi: 0xbb},
+ {value: 0x45ea, lo: 0xbc, hi: 0xbc},
+ {value: 0x4650, lo: 0xbd, hi: 0xbd},
+ {value: 0x466c, lo: 0xbe, hi: 0xbe},
+ {value: 0x465e, lo: 0xbf, hi: 0xbf},
+ // Block 0x85, offset 0x2d1
+ {value: 0x0000, lo: 0x01},
+ {value: 0x467a, lo: 0x80, hi: 0x80},
+ // Block 0x86, offset 0x2d3
+ {value: 0x0000, lo: 0x01},
+ {value: 0x8132, lo: 0x82, hi: 0x84},
+ // Block 0x87, offset 0x2d5
+ {value: 0x0002, lo: 0x03},
+ {value: 0x0043, lo: 0x80, hi: 0x99},
+ {value: 0x0083, lo: 0x9a, hi: 0xb3},
+ {value: 0x0043, lo: 0xb4, hi: 0xbf},
+ // Block 0x88, offset 0x2d9
+ {value: 0x0002, lo: 0x04},
+ {value: 0x005b, lo: 0x80, hi: 0x8d},
+ {value: 0x0083, lo: 0x8e, hi: 0x94},
+ {value: 0x0093, lo: 0x96, hi: 0xa7},
+ {value: 0x0043, lo: 0xa8, hi: 0xbf},
+ // Block 0x89, offset 0x2de
+ {value: 0x0002, lo: 0x0b},
+ {value: 0x0073, lo: 0x80, hi: 0x81},
+ {value: 0x0083, lo: 0x82, hi: 0x9b},
+ {value: 0x0043, lo: 0x9c, hi: 0x9c},
+ {value: 0x0047, lo: 0x9e, hi: 0x9f},
+ {value: 0x004f, lo: 0xa2, hi: 0xa2},
+ {value: 0x0055, lo: 0xa5, hi: 0xa6},
+ {value: 0x005d, lo: 0xa9, hi: 0xac},
+ {value: 0x0067, lo: 0xae, hi: 0xb5},
+ {value: 0x0083, lo: 0xb6, hi: 0xb9},
+ {value: 0x008d, lo: 0xbb, hi: 0xbb},
+ {value: 0x0091, lo: 0xbd, hi: 0xbf},
+ // Block 0x8a, offset 0x2ea
+ {value: 0x0002, lo: 0x04},
+ {value: 0x0097, lo: 0x80, hi: 0x83},
+ {value: 0x00a1, lo: 0x85, hi: 0x8f},
+ {value: 0x0043, lo: 0x90, hi: 0xa9},
+ {value: 0x0083, lo: 0xaa, hi: 0xbf},
+ // Block 0x8b, offset 0x2ef
+ {value: 0x0002, lo: 0x08},
+ {value: 0x00af, lo: 0x80, hi: 0x83},
+ {value: 0x0043, lo: 0x84, hi: 0x85},
+ {value: 0x0049, lo: 0x87, hi: 0x8a},
+ {value: 0x0055, lo: 0x8d, hi: 0x94},
+ {value: 0x0067, lo: 0x96, hi: 0x9c},
+ {value: 0x0083, lo: 0x9e, hi: 0xb7},
+ {value: 0x0043, lo: 0xb8, hi: 0xb9},
+ {value: 0x0049, lo: 0xbb, hi: 0xbe},
+ // Block 0x8c, offset 0x2f8
+ {value: 0x0002, lo: 0x05},
+ {value: 0x0053, lo: 0x80, hi: 0x84},
+ {value: 0x005f, lo: 0x86, hi: 0x86},
+ {value: 0x0067, lo: 0x8a, hi: 0x90},
+ {value: 0x0083, lo: 0x92, hi: 0xab},
+ {value: 0x0043, lo: 0xac, hi: 0xbf},
+ // Block 0x8d, offset 0x2fe
+ {value: 0x0002, lo: 0x04},
+ {value: 0x006b, lo: 0x80, hi: 0x85},
+ {value: 0x0083, lo: 0x86, hi: 0x9f},
+ {value: 0x0043, lo: 0xa0, hi: 0xb9},
+ {value: 0x0083, lo: 0xba, hi: 0xbf},
+ // Block 0x8e, offset 0x303
+ {value: 0x0002, lo: 0x03},
+ {value: 0x008f, lo: 0x80, hi: 0x93},
+ {value: 0x0043, lo: 0x94, hi: 0xad},
+ {value: 0x0083, lo: 0xae, hi: 0xbf},
+ // Block 0x8f, offset 0x307
+ {value: 0x0002, lo: 0x04},
+ {value: 0x00a7, lo: 0x80, hi: 0x87},
+ {value: 0x0043, lo: 0x88, hi: 0xa1},
+ {value: 0x0083, lo: 0xa2, hi: 0xbb},
+ {value: 0x0043, lo: 0xbc, hi: 0xbf},
+ // Block 0x90, offset 0x30c
+ {value: 0x0002, lo: 0x03},
+ {value: 0x004b, lo: 0x80, hi: 0x95},
+ {value: 0x0083, lo: 0x96, hi: 0xaf},
+ {value: 0x0043, lo: 0xb0, hi: 0xbf},
+ // Block 0x91, offset 0x310
+ {value: 0x0003, lo: 0x0f},
+ {value: 0x01b8, lo: 0x80, hi: 0x80},
+ {value: 0x045f, lo: 0x81, hi: 0x81},
+ {value: 0x01bb, lo: 0x82, hi: 0x9a},
+ {value: 0x045b, lo: 0x9b, hi: 0x9b},
+ {value: 0x01c7, lo: 0x9c, hi: 0x9c},
+ {value: 0x01d0, lo: 0x9d, hi: 0x9d},
+ {value: 0x01d6, lo: 0x9e, hi: 0x9e},
+ {value: 0x01fa, lo: 0x9f, hi: 0x9f},
+ {value: 0x01eb, lo: 0xa0, hi: 0xa0},
+ {value: 0x01e8, lo: 0xa1, hi: 0xa1},
+ {value: 0x0173, lo: 0xa2, hi: 0xb2},
+ {value: 0x0188, lo: 0xb3, hi: 0xb3},
+ {value: 0x01a6, lo: 0xb4, hi: 0xba},
+ {value: 0x045f, lo: 0xbb, hi: 0xbb},
+ {value: 0x01bb, lo: 0xbc, hi: 0xbf},
+ // Block 0x92, offset 0x320
+ {value: 0x0003, lo: 0x0d},
+ {value: 0x01c7, lo: 0x80, hi: 0x94},
+ {value: 0x045b, lo: 0x95, hi: 0x95},
+ {value: 0x01c7, lo: 0x96, hi: 0x96},
+ {value: 0x01d0, lo: 0x97, hi: 0x97},
+ {value: 0x01d6, lo: 0x98, hi: 0x98},
+ {value: 0x01fa, lo: 0x99, hi: 0x99},
+ {value: 0x01eb, lo: 0x9a, hi: 0x9a},
+ {value: 0x01e8, lo: 0x9b, hi: 0x9b},
+ {value: 0x0173, lo: 0x9c, hi: 0xac},
+ {value: 0x0188, lo: 0xad, hi: 0xad},
+ {value: 0x01a6, lo: 0xae, hi: 0xb4},
+ {value: 0x045f, lo: 0xb5, hi: 0xb5},
+ {value: 0x01bb, lo: 0xb6, hi: 0xbf},
+ // Block 0x93, offset 0x32e
+ {value: 0x0003, lo: 0x0d},
+ {value: 0x01d9, lo: 0x80, hi: 0x8e},
+ {value: 0x045b, lo: 0x8f, hi: 0x8f},
+ {value: 0x01c7, lo: 0x90, hi: 0x90},
+ {value: 0x01d0, lo: 0x91, hi: 0x91},
+ {value: 0x01d6, lo: 0x92, hi: 0x92},
+ {value: 0x01fa, lo: 0x93, hi: 0x93},
+ {value: 0x01eb, lo: 0x94, hi: 0x94},
+ {value: 0x01e8, lo: 0x95, hi: 0x95},
+ {value: 0x0173, lo: 0x96, hi: 0xa6},
+ {value: 0x0188, lo: 0xa7, hi: 0xa7},
+ {value: 0x01a6, lo: 0xa8, hi: 0xae},
+ {value: 0x045f, lo: 0xaf, hi: 0xaf},
+ {value: 0x01bb, lo: 0xb0, hi: 0xbf},
+ // Block 0x94, offset 0x33c
+ {value: 0x0003, lo: 0x0d},
+ {value: 0x01eb, lo: 0x80, hi: 0x88},
+ {value: 0x045b, lo: 0x89, hi: 0x89},
+ {value: 0x01c7, lo: 0x8a, hi: 0x8a},
+ {value: 0x01d0, lo: 0x8b, hi: 0x8b},
+ {value: 0x01d6, lo: 0x8c, hi: 0x8c},
+ {value: 0x01fa, lo: 0x8d, hi: 0x8d},
+ {value: 0x01eb, lo: 0x8e, hi: 0x8e},
+ {value: 0x01e8, lo: 0x8f, hi: 0x8f},
+ {value: 0x0173, lo: 0x90, hi: 0xa0},
+ {value: 0x0188, lo: 0xa1, hi: 0xa1},
+ {value: 0x01a6, lo: 0xa2, hi: 0xa8},
+ {value: 0x045f, lo: 0xa9, hi: 0xa9},
+ {value: 0x01bb, lo: 0xaa, hi: 0xbf},
+ // Block 0x95, offset 0x34a
+ {value: 0x0000, lo: 0x05},
+ {value: 0x8132, lo: 0x80, hi: 0x86},
+ {value: 0x8132, lo: 0x88, hi: 0x98},
+ {value: 0x8132, lo: 0x9b, hi: 0xa1},
+ {value: 0x8132, lo: 0xa3, hi: 0xa4},
+ {value: 0x8132, lo: 0xa6, hi: 0xaa},
+ // Block 0x96, offset 0x350
+ {value: 0x0000, lo: 0x01},
+ {value: 0x812d, lo: 0x90, hi: 0x96},
+ // Block 0x97, offset 0x352
+ {value: 0x0000, lo: 0x02},
+ {value: 0x8132, lo: 0x84, hi: 0x89},
+ {value: 0x8102, lo: 0x8a, hi: 0x8a},
+ // Block 0x98, offset 0x355
+ {value: 0x0002, lo: 0x09},
+ {value: 0x0063, lo: 0x80, hi: 0x89},
+ {value: 0x1951, lo: 0x8a, hi: 0x8a},
+ {value: 0x1981, lo: 0x8b, hi: 0x8b},
+ {value: 0x199c, lo: 0x8c, hi: 0x8c},
+ {value: 0x19a2, lo: 0x8d, hi: 0x8d},
+ {value: 0x1bc0, lo: 0x8e, hi: 0x8e},
+ {value: 0x19ae, lo: 0x8f, hi: 0x8f},
+ {value: 0x197b, lo: 0xaa, hi: 0xaa},
+ {value: 0x197e, lo: 0xab, hi: 0xab},
+ // Block 0x99, offset 0x35f
+ {value: 0x0000, lo: 0x01},
+ {value: 0x193f, lo: 0x90, hi: 0x90},
+ // Block 0x9a, offset 0x361
+ {value: 0x0028, lo: 0x09},
+ {value: 0x2862, lo: 0x80, hi: 0x80},
+ {value: 0x2826, lo: 0x81, hi: 0x81},
+ {value: 0x2830, lo: 0x82, hi: 0x82},
+ {value: 0x2844, lo: 0x83, hi: 0x84},
+ {value: 0x284e, lo: 0x85, hi: 0x86},
+ {value: 0x283a, lo: 0x87, hi: 0x87},
+ {value: 0x2858, lo: 0x88, hi: 0x88},
+ {value: 0x0b6f, lo: 0x90, hi: 0x90},
+ {value: 0x08e7, lo: 0x91, hi: 0x91},
+}
+
+// recompMap: 7520 bytes (entries only)
+var recompMap = map[uint32]rune{
+ 0x00410300: 0x00C0,
+ 0x00410301: 0x00C1,
+ 0x00410302: 0x00C2,
+ 0x00410303: 0x00C3,
+ 0x00410308: 0x00C4,
+ 0x0041030A: 0x00C5,
+ 0x00430327: 0x00C7,
+ 0x00450300: 0x00C8,
+ 0x00450301: 0x00C9,
+ 0x00450302: 0x00CA,
+ 0x00450308: 0x00CB,
+ 0x00490300: 0x00CC,
+ 0x00490301: 0x00CD,
+ 0x00490302: 0x00CE,
+ 0x00490308: 0x00CF,
+ 0x004E0303: 0x00D1,
+ 0x004F0300: 0x00D2,
+ 0x004F0301: 0x00D3,
+ 0x004F0302: 0x00D4,
+ 0x004F0303: 0x00D5,
+ 0x004F0308: 0x00D6,
+ 0x00550300: 0x00D9,
+ 0x00550301: 0x00DA,
+ 0x00550302: 0x00DB,
+ 0x00550308: 0x00DC,
+ 0x00590301: 0x00DD,
+ 0x00610300: 0x00E0,
+ 0x00610301: 0x00E1,
+ 0x00610302: 0x00E2,
+ 0x00610303: 0x00E3,
+ 0x00610308: 0x00E4,
+ 0x0061030A: 0x00E5,
+ 0x00630327: 0x00E7,
+ 0x00650300: 0x00E8,
+ 0x00650301: 0x00E9,
+ 0x00650302: 0x00EA,
+ 0x00650308: 0x00EB,
+ 0x00690300: 0x00EC,
+ 0x00690301: 0x00ED,
+ 0x00690302: 0x00EE,
+ 0x00690308: 0x00EF,
+ 0x006E0303: 0x00F1,
+ 0x006F0300: 0x00F2,
+ 0x006F0301: 0x00F3,
+ 0x006F0302: 0x00F4,
+ 0x006F0303: 0x00F5,
+ 0x006F0308: 0x00F6,
+ 0x00750300: 0x00F9,
+ 0x00750301: 0x00FA,
+ 0x00750302: 0x00FB,
+ 0x00750308: 0x00FC,
+ 0x00790301: 0x00FD,
+ 0x00790308: 0x00FF,
+ 0x00410304: 0x0100,
+ 0x00610304: 0x0101,
+ 0x00410306: 0x0102,
+ 0x00610306: 0x0103,
+ 0x00410328: 0x0104,
+ 0x00610328: 0x0105,
+ 0x00430301: 0x0106,
+ 0x00630301: 0x0107,
+ 0x00430302: 0x0108,
+ 0x00630302: 0x0109,
+ 0x00430307: 0x010A,
+ 0x00630307: 0x010B,
+ 0x0043030C: 0x010C,
+ 0x0063030C: 0x010D,
+ 0x0044030C: 0x010E,
+ 0x0064030C: 0x010F,
+ 0x00450304: 0x0112,
+ 0x00650304: 0x0113,
+ 0x00450306: 0x0114,
+ 0x00650306: 0x0115,
+ 0x00450307: 0x0116,
+ 0x00650307: 0x0117,
+ 0x00450328: 0x0118,
+ 0x00650328: 0x0119,
+ 0x0045030C: 0x011A,
+ 0x0065030C: 0x011B,
+ 0x00470302: 0x011C,
+ 0x00670302: 0x011D,
+ 0x00470306: 0x011E,
+ 0x00670306: 0x011F,
+ 0x00470307: 0x0120,
+ 0x00670307: 0x0121,
+ 0x00470327: 0x0122,
+ 0x00670327: 0x0123,
+ 0x00480302: 0x0124,
+ 0x00680302: 0x0125,
+ 0x00490303: 0x0128,
+ 0x00690303: 0x0129,
+ 0x00490304: 0x012A,
+ 0x00690304: 0x012B,
+ 0x00490306: 0x012C,
+ 0x00690306: 0x012D,
+ 0x00490328: 0x012E,
+ 0x00690328: 0x012F,
+ 0x00490307: 0x0130,
+ 0x004A0302: 0x0134,
+ 0x006A0302: 0x0135,
+ 0x004B0327: 0x0136,
+ 0x006B0327: 0x0137,
+ 0x004C0301: 0x0139,
+ 0x006C0301: 0x013A,
+ 0x004C0327: 0x013B,
+ 0x006C0327: 0x013C,
+ 0x004C030C: 0x013D,
+ 0x006C030C: 0x013E,
+ 0x004E0301: 0x0143,
+ 0x006E0301: 0x0144,
+ 0x004E0327: 0x0145,
+ 0x006E0327: 0x0146,
+ 0x004E030C: 0x0147,
+ 0x006E030C: 0x0148,
+ 0x004F0304: 0x014C,
+ 0x006F0304: 0x014D,
+ 0x004F0306: 0x014E,
+ 0x006F0306: 0x014F,
+ 0x004F030B: 0x0150,
+ 0x006F030B: 0x0151,
+ 0x00520301: 0x0154,
+ 0x00720301: 0x0155,
+ 0x00520327: 0x0156,
+ 0x00720327: 0x0157,
+ 0x0052030C: 0x0158,
+ 0x0072030C: 0x0159,
+ 0x00530301: 0x015A,
+ 0x00730301: 0x015B,
+ 0x00530302: 0x015C,
+ 0x00730302: 0x015D,
+ 0x00530327: 0x015E,
+ 0x00730327: 0x015F,
+ 0x0053030C: 0x0160,
+ 0x0073030C: 0x0161,
+ 0x00540327: 0x0162,
+ 0x00740327: 0x0163,
+ 0x0054030C: 0x0164,
+ 0x0074030C: 0x0165,
+ 0x00550303: 0x0168,
+ 0x00750303: 0x0169,
+ 0x00550304: 0x016A,
+ 0x00750304: 0x016B,
+ 0x00550306: 0x016C,
+ 0x00750306: 0x016D,
+ 0x0055030A: 0x016E,
+ 0x0075030A: 0x016F,
+ 0x0055030B: 0x0170,
+ 0x0075030B: 0x0171,
+ 0x00550328: 0x0172,
+ 0x00750328: 0x0173,
+ 0x00570302: 0x0174,
+ 0x00770302: 0x0175,
+ 0x00590302: 0x0176,
+ 0x00790302: 0x0177,
+ 0x00590308: 0x0178,
+ 0x005A0301: 0x0179,
+ 0x007A0301: 0x017A,
+ 0x005A0307: 0x017B,
+ 0x007A0307: 0x017C,
+ 0x005A030C: 0x017D,
+ 0x007A030C: 0x017E,
+ 0x004F031B: 0x01A0,
+ 0x006F031B: 0x01A1,
+ 0x0055031B: 0x01AF,
+ 0x0075031B: 0x01B0,
+ 0x0041030C: 0x01CD,
+ 0x0061030C: 0x01CE,
+ 0x0049030C: 0x01CF,
+ 0x0069030C: 0x01D0,
+ 0x004F030C: 0x01D1,
+ 0x006F030C: 0x01D2,
+ 0x0055030C: 0x01D3,
+ 0x0075030C: 0x01D4,
+ 0x00DC0304: 0x01D5,
+ 0x00FC0304: 0x01D6,
+ 0x00DC0301: 0x01D7,
+ 0x00FC0301: 0x01D8,
+ 0x00DC030C: 0x01D9,
+ 0x00FC030C: 0x01DA,
+ 0x00DC0300: 0x01DB,
+ 0x00FC0300: 0x01DC,
+ 0x00C40304: 0x01DE,
+ 0x00E40304: 0x01DF,
+ 0x02260304: 0x01E0,
+ 0x02270304: 0x01E1,
+ 0x00C60304: 0x01E2,
+ 0x00E60304: 0x01E3,
+ 0x0047030C: 0x01E6,
+ 0x0067030C: 0x01E7,
+ 0x004B030C: 0x01E8,
+ 0x006B030C: 0x01E9,
+ 0x004F0328: 0x01EA,
+ 0x006F0328: 0x01EB,
+ 0x01EA0304: 0x01EC,
+ 0x01EB0304: 0x01ED,
+ 0x01B7030C: 0x01EE,
+ 0x0292030C: 0x01EF,
+ 0x006A030C: 0x01F0,
+ 0x00470301: 0x01F4,
+ 0x00670301: 0x01F5,
+ 0x004E0300: 0x01F8,
+ 0x006E0300: 0x01F9,
+ 0x00C50301: 0x01FA,
+ 0x00E50301: 0x01FB,
+ 0x00C60301: 0x01FC,
+ 0x00E60301: 0x01FD,
+ 0x00D80301: 0x01FE,
+ 0x00F80301: 0x01FF,
+ 0x0041030F: 0x0200,
+ 0x0061030F: 0x0201,
+ 0x00410311: 0x0202,
+ 0x00610311: 0x0203,
+ 0x0045030F: 0x0204,
+ 0x0065030F: 0x0205,
+ 0x00450311: 0x0206,
+ 0x00650311: 0x0207,
+ 0x0049030F: 0x0208,
+ 0x0069030F: 0x0209,
+ 0x00490311: 0x020A,
+ 0x00690311: 0x020B,
+ 0x004F030F: 0x020C,
+ 0x006F030F: 0x020D,
+ 0x004F0311: 0x020E,
+ 0x006F0311: 0x020F,
+ 0x0052030F: 0x0210,
+ 0x0072030F: 0x0211,
+ 0x00520311: 0x0212,
+ 0x00720311: 0x0213,
+ 0x0055030F: 0x0214,
+ 0x0075030F: 0x0215,
+ 0x00550311: 0x0216,
+ 0x00750311: 0x0217,
+ 0x00530326: 0x0218,
+ 0x00730326: 0x0219,
+ 0x00540326: 0x021A,
+ 0x00740326: 0x021B,
+ 0x0048030C: 0x021E,
+ 0x0068030C: 0x021F,
+ 0x00410307: 0x0226,
+ 0x00610307: 0x0227,
+ 0x00450327: 0x0228,
+ 0x00650327: 0x0229,
+ 0x00D60304: 0x022A,
+ 0x00F60304: 0x022B,
+ 0x00D50304: 0x022C,
+ 0x00F50304: 0x022D,
+ 0x004F0307: 0x022E,
+ 0x006F0307: 0x022F,
+ 0x022E0304: 0x0230,
+ 0x022F0304: 0x0231,
+ 0x00590304: 0x0232,
+ 0x00790304: 0x0233,
+ 0x00A80301: 0x0385,
+ 0x03910301: 0x0386,
+ 0x03950301: 0x0388,
+ 0x03970301: 0x0389,
+ 0x03990301: 0x038A,
+ 0x039F0301: 0x038C,
+ 0x03A50301: 0x038E,
+ 0x03A90301: 0x038F,
+ 0x03CA0301: 0x0390,
+ 0x03990308: 0x03AA,
+ 0x03A50308: 0x03AB,
+ 0x03B10301: 0x03AC,
+ 0x03B50301: 0x03AD,
+ 0x03B70301: 0x03AE,
+ 0x03B90301: 0x03AF,
+ 0x03CB0301: 0x03B0,
+ 0x03B90308: 0x03CA,
+ 0x03C50308: 0x03CB,
+ 0x03BF0301: 0x03CC,
+ 0x03C50301: 0x03CD,
+ 0x03C90301: 0x03CE,
+ 0x03D20301: 0x03D3,
+ 0x03D20308: 0x03D4,
+ 0x04150300: 0x0400,
+ 0x04150308: 0x0401,
+ 0x04130301: 0x0403,
+ 0x04060308: 0x0407,
+ 0x041A0301: 0x040C,
+ 0x04180300: 0x040D,
+ 0x04230306: 0x040E,
+ 0x04180306: 0x0419,
+ 0x04380306: 0x0439,
+ 0x04350300: 0x0450,
+ 0x04350308: 0x0451,
+ 0x04330301: 0x0453,
+ 0x04560308: 0x0457,
+ 0x043A0301: 0x045C,
+ 0x04380300: 0x045D,
+ 0x04430306: 0x045E,
+ 0x0474030F: 0x0476,
+ 0x0475030F: 0x0477,
+ 0x04160306: 0x04C1,
+ 0x04360306: 0x04C2,
+ 0x04100306: 0x04D0,
+ 0x04300306: 0x04D1,
+ 0x04100308: 0x04D2,
+ 0x04300308: 0x04D3,
+ 0x04150306: 0x04D6,
+ 0x04350306: 0x04D7,
+ 0x04D80308: 0x04DA,
+ 0x04D90308: 0x04DB,
+ 0x04160308: 0x04DC,
+ 0x04360308: 0x04DD,
+ 0x04170308: 0x04DE,
+ 0x04370308: 0x04DF,
+ 0x04180304: 0x04E2,
+ 0x04380304: 0x04E3,
+ 0x04180308: 0x04E4,
+ 0x04380308: 0x04E5,
+ 0x041E0308: 0x04E6,
+ 0x043E0308: 0x04E7,
+ 0x04E80308: 0x04EA,
+ 0x04E90308: 0x04EB,
+ 0x042D0308: 0x04EC,
+ 0x044D0308: 0x04ED,
+ 0x04230304: 0x04EE,
+ 0x04430304: 0x04EF,
+ 0x04230308: 0x04F0,
+ 0x04430308: 0x04F1,
+ 0x0423030B: 0x04F2,
+ 0x0443030B: 0x04F3,
+ 0x04270308: 0x04F4,
+ 0x04470308: 0x04F5,
+ 0x042B0308: 0x04F8,
+ 0x044B0308: 0x04F9,
+ 0x06270653: 0x0622,
+ 0x06270654: 0x0623,
+ 0x06480654: 0x0624,
+ 0x06270655: 0x0625,
+ 0x064A0654: 0x0626,
+ 0x06D50654: 0x06C0,
+ 0x06C10654: 0x06C2,
+ 0x06D20654: 0x06D3,
+ 0x0928093C: 0x0929,
+ 0x0930093C: 0x0931,
+ 0x0933093C: 0x0934,
+ 0x09C709BE: 0x09CB,
+ 0x09C709D7: 0x09CC,
+ 0x0B470B56: 0x0B48,
+ 0x0B470B3E: 0x0B4B,
+ 0x0B470B57: 0x0B4C,
+ 0x0B920BD7: 0x0B94,
+ 0x0BC60BBE: 0x0BCA,
+ 0x0BC70BBE: 0x0BCB,
+ 0x0BC60BD7: 0x0BCC,
+ 0x0C460C56: 0x0C48,
+ 0x0CBF0CD5: 0x0CC0,
+ 0x0CC60CD5: 0x0CC7,
+ 0x0CC60CD6: 0x0CC8,
+ 0x0CC60CC2: 0x0CCA,
+ 0x0CCA0CD5: 0x0CCB,
+ 0x0D460D3E: 0x0D4A,
+ 0x0D470D3E: 0x0D4B,
+ 0x0D460D57: 0x0D4C,
+ 0x0DD90DCA: 0x0DDA,
+ 0x0DD90DCF: 0x0DDC,
+ 0x0DDC0DCA: 0x0DDD,
+ 0x0DD90DDF: 0x0DDE,
+ 0x1025102E: 0x1026,
+ 0x1B051B35: 0x1B06,
+ 0x1B071B35: 0x1B08,
+ 0x1B091B35: 0x1B0A,
+ 0x1B0B1B35: 0x1B0C,
+ 0x1B0D1B35: 0x1B0E,
+ 0x1B111B35: 0x1B12,
+ 0x1B3A1B35: 0x1B3B,
+ 0x1B3C1B35: 0x1B3D,
+ 0x1B3E1B35: 0x1B40,
+ 0x1B3F1B35: 0x1B41,
+ 0x1B421B35: 0x1B43,
+ 0x00410325: 0x1E00,
+ 0x00610325: 0x1E01,
+ 0x00420307: 0x1E02,
+ 0x00620307: 0x1E03,
+ 0x00420323: 0x1E04,
+ 0x00620323: 0x1E05,
+ 0x00420331: 0x1E06,
+ 0x00620331: 0x1E07,
+ 0x00C70301: 0x1E08,
+ 0x00E70301: 0x1E09,
+ 0x00440307: 0x1E0A,
+ 0x00640307: 0x1E0B,
+ 0x00440323: 0x1E0C,
+ 0x00640323: 0x1E0D,
+ 0x00440331: 0x1E0E,
+ 0x00640331: 0x1E0F,
+ 0x00440327: 0x1E10,
+ 0x00640327: 0x1E11,
+ 0x0044032D: 0x1E12,
+ 0x0064032D: 0x1E13,
+ 0x01120300: 0x1E14,
+ 0x01130300: 0x1E15,
+ 0x01120301: 0x1E16,
+ 0x01130301: 0x1E17,
+ 0x0045032D: 0x1E18,
+ 0x0065032D: 0x1E19,
+ 0x00450330: 0x1E1A,
+ 0x00650330: 0x1E1B,
+ 0x02280306: 0x1E1C,
+ 0x02290306: 0x1E1D,
+ 0x00460307: 0x1E1E,
+ 0x00660307: 0x1E1F,
+ 0x00470304: 0x1E20,
+ 0x00670304: 0x1E21,
+ 0x00480307: 0x1E22,
+ 0x00680307: 0x1E23,
+ 0x00480323: 0x1E24,
+ 0x00680323: 0x1E25,
+ 0x00480308: 0x1E26,
+ 0x00680308: 0x1E27,
+ 0x00480327: 0x1E28,
+ 0x00680327: 0x1E29,
+ 0x0048032E: 0x1E2A,
+ 0x0068032E: 0x1E2B,
+ 0x00490330: 0x1E2C,
+ 0x00690330: 0x1E2D,
+ 0x00CF0301: 0x1E2E,
+ 0x00EF0301: 0x1E2F,
+ 0x004B0301: 0x1E30,
+ 0x006B0301: 0x1E31,
+ 0x004B0323: 0x1E32,
+ 0x006B0323: 0x1E33,
+ 0x004B0331: 0x1E34,
+ 0x006B0331: 0x1E35,
+ 0x004C0323: 0x1E36,
+ 0x006C0323: 0x1E37,
+ 0x1E360304: 0x1E38,
+ 0x1E370304: 0x1E39,
+ 0x004C0331: 0x1E3A,
+ 0x006C0331: 0x1E3B,
+ 0x004C032D: 0x1E3C,
+ 0x006C032D: 0x1E3D,
+ 0x004D0301: 0x1E3E,
+ 0x006D0301: 0x1E3F,
+ 0x004D0307: 0x1E40,
+ 0x006D0307: 0x1E41,
+ 0x004D0323: 0x1E42,
+ 0x006D0323: 0x1E43,
+ 0x004E0307: 0x1E44,
+ 0x006E0307: 0x1E45,
+ 0x004E0323: 0x1E46,
+ 0x006E0323: 0x1E47,
+ 0x004E0331: 0x1E48,
+ 0x006E0331: 0x1E49,
+ 0x004E032D: 0x1E4A,
+ 0x006E032D: 0x1E4B,
+ 0x00D50301: 0x1E4C,
+ 0x00F50301: 0x1E4D,
+ 0x00D50308: 0x1E4E,
+ 0x00F50308: 0x1E4F,
+ 0x014C0300: 0x1E50,
+ 0x014D0300: 0x1E51,
+ 0x014C0301: 0x1E52,
+ 0x014D0301: 0x1E53,
+ 0x00500301: 0x1E54,
+ 0x00700301: 0x1E55,
+ 0x00500307: 0x1E56,
+ 0x00700307: 0x1E57,
+ 0x00520307: 0x1E58,
+ 0x00720307: 0x1E59,
+ 0x00520323: 0x1E5A,
+ 0x00720323: 0x1E5B,
+ 0x1E5A0304: 0x1E5C,
+ 0x1E5B0304: 0x1E5D,
+ 0x00520331: 0x1E5E,
+ 0x00720331: 0x1E5F,
+ 0x00530307: 0x1E60,
+ 0x00730307: 0x1E61,
+ 0x00530323: 0x1E62,
+ 0x00730323: 0x1E63,
+ 0x015A0307: 0x1E64,
+ 0x015B0307: 0x1E65,
+ 0x01600307: 0x1E66,
+ 0x01610307: 0x1E67,
+ 0x1E620307: 0x1E68,
+ 0x1E630307: 0x1E69,
+ 0x00540307: 0x1E6A,
+ 0x00740307: 0x1E6B,
+ 0x00540323: 0x1E6C,
+ 0x00740323: 0x1E6D,
+ 0x00540331: 0x1E6E,
+ 0x00740331: 0x1E6F,
+ 0x0054032D: 0x1E70,
+ 0x0074032D: 0x1E71,
+ 0x00550324: 0x1E72,
+ 0x00750324: 0x1E73,
+ 0x00550330: 0x1E74,
+ 0x00750330: 0x1E75,
+ 0x0055032D: 0x1E76,
+ 0x0075032D: 0x1E77,
+ 0x01680301: 0x1E78,
+ 0x01690301: 0x1E79,
+ 0x016A0308: 0x1E7A,
+ 0x016B0308: 0x1E7B,
+ 0x00560303: 0x1E7C,
+ 0x00760303: 0x1E7D,
+ 0x00560323: 0x1E7E,
+ 0x00760323: 0x1E7F,
+ 0x00570300: 0x1E80,
+ 0x00770300: 0x1E81,
+ 0x00570301: 0x1E82,
+ 0x00770301: 0x1E83,
+ 0x00570308: 0x1E84,
+ 0x00770308: 0x1E85,
+ 0x00570307: 0x1E86,
+ 0x00770307: 0x1E87,
+ 0x00570323: 0x1E88,
+ 0x00770323: 0x1E89,
+ 0x00580307: 0x1E8A,
+ 0x00780307: 0x1E8B,
+ 0x00580308: 0x1E8C,
+ 0x00780308: 0x1E8D,
+ 0x00590307: 0x1E8E,
+ 0x00790307: 0x1E8F,
+ 0x005A0302: 0x1E90,
+ 0x007A0302: 0x1E91,
+ 0x005A0323: 0x1E92,
+ 0x007A0323: 0x1E93,
+ 0x005A0331: 0x1E94,
+ 0x007A0331: 0x1E95,
+ 0x00680331: 0x1E96,
+ 0x00740308: 0x1E97,
+ 0x0077030A: 0x1E98,
+ 0x0079030A: 0x1E99,
+ 0x017F0307: 0x1E9B,
+ 0x00410323: 0x1EA0,
+ 0x00610323: 0x1EA1,
+ 0x00410309: 0x1EA2,
+ 0x00610309: 0x1EA3,
+ 0x00C20301: 0x1EA4,
+ 0x00E20301: 0x1EA5,
+ 0x00C20300: 0x1EA6,
+ 0x00E20300: 0x1EA7,
+ 0x00C20309: 0x1EA8,
+ 0x00E20309: 0x1EA9,
+ 0x00C20303: 0x1EAA,
+ 0x00E20303: 0x1EAB,
+ 0x1EA00302: 0x1EAC,
+ 0x1EA10302: 0x1EAD,
+ 0x01020301: 0x1EAE,
+ 0x01030301: 0x1EAF,
+ 0x01020300: 0x1EB0,
+ 0x01030300: 0x1EB1,
+ 0x01020309: 0x1EB2,
+ 0x01030309: 0x1EB3,
+ 0x01020303: 0x1EB4,
+ 0x01030303: 0x1EB5,
+ 0x1EA00306: 0x1EB6,
+ 0x1EA10306: 0x1EB7,
+ 0x00450323: 0x1EB8,
+ 0x00650323: 0x1EB9,
+ 0x00450309: 0x1EBA,
+ 0x00650309: 0x1EBB,
+ 0x00450303: 0x1EBC,
+ 0x00650303: 0x1EBD,
+ 0x00CA0301: 0x1EBE,
+ 0x00EA0301: 0x1EBF,
+ 0x00CA0300: 0x1EC0,
+ 0x00EA0300: 0x1EC1,
+ 0x00CA0309: 0x1EC2,
+ 0x00EA0309: 0x1EC3,
+ 0x00CA0303: 0x1EC4,
+ 0x00EA0303: 0x1EC5,
+ 0x1EB80302: 0x1EC6,
+ 0x1EB90302: 0x1EC7,
+ 0x00490309: 0x1EC8,
+ 0x00690309: 0x1EC9,
+ 0x00490323: 0x1ECA,
+ 0x00690323: 0x1ECB,
+ 0x004F0323: 0x1ECC,
+ 0x006F0323: 0x1ECD,
+ 0x004F0309: 0x1ECE,
+ 0x006F0309: 0x1ECF,
+ 0x00D40301: 0x1ED0,
+ 0x00F40301: 0x1ED1,
+ 0x00D40300: 0x1ED2,
+ 0x00F40300: 0x1ED3,
+ 0x00D40309: 0x1ED4,
+ 0x00F40309: 0x1ED5,
+ 0x00D40303: 0x1ED6,
+ 0x00F40303: 0x1ED7,
+ 0x1ECC0302: 0x1ED8,
+ 0x1ECD0302: 0x1ED9,
+ 0x01A00301: 0x1EDA,
+ 0x01A10301: 0x1EDB,
+ 0x01A00300: 0x1EDC,
+ 0x01A10300: 0x1EDD,
+ 0x01A00309: 0x1EDE,
+ 0x01A10309: 0x1EDF,
+ 0x01A00303: 0x1EE0,
+ 0x01A10303: 0x1EE1,
+ 0x01A00323: 0x1EE2,
+ 0x01A10323: 0x1EE3,
+ 0x00550323: 0x1EE4,
+ 0x00750323: 0x1EE5,
+ 0x00550309: 0x1EE6,
+ 0x00750309: 0x1EE7,
+ 0x01AF0301: 0x1EE8,
+ 0x01B00301: 0x1EE9,
+ 0x01AF0300: 0x1EEA,
+ 0x01B00300: 0x1EEB,
+ 0x01AF0309: 0x1EEC,
+ 0x01B00309: 0x1EED,
+ 0x01AF0303: 0x1EEE,
+ 0x01B00303: 0x1EEF,
+ 0x01AF0323: 0x1EF0,
+ 0x01B00323: 0x1EF1,
+ 0x00590300: 0x1EF2,
+ 0x00790300: 0x1EF3,
+ 0x00590323: 0x1EF4,
+ 0x00790323: 0x1EF5,
+ 0x00590309: 0x1EF6,
+ 0x00790309: 0x1EF7,
+ 0x00590303: 0x1EF8,
+ 0x00790303: 0x1EF9,
+ 0x03B10313: 0x1F00,
+ 0x03B10314: 0x1F01,
+ 0x1F000300: 0x1F02,
+ 0x1F010300: 0x1F03,
+ 0x1F000301: 0x1F04,
+ 0x1F010301: 0x1F05,
+ 0x1F000342: 0x1F06,
+ 0x1F010342: 0x1F07,
+ 0x03910313: 0x1F08,
+ 0x03910314: 0x1F09,
+ 0x1F080300: 0x1F0A,
+ 0x1F090300: 0x1F0B,
+ 0x1F080301: 0x1F0C,
+ 0x1F090301: 0x1F0D,
+ 0x1F080342: 0x1F0E,
+ 0x1F090342: 0x1F0F,
+ 0x03B50313: 0x1F10,
+ 0x03B50314: 0x1F11,
+ 0x1F100300: 0x1F12,
+ 0x1F110300: 0x1F13,
+ 0x1F100301: 0x1F14,
+ 0x1F110301: 0x1F15,
+ 0x03950313: 0x1F18,
+ 0x03950314: 0x1F19,
+ 0x1F180300: 0x1F1A,
+ 0x1F190300: 0x1F1B,
+ 0x1F180301: 0x1F1C,
+ 0x1F190301: 0x1F1D,
+ 0x03B70313: 0x1F20,
+ 0x03B70314: 0x1F21,
+ 0x1F200300: 0x1F22,
+ 0x1F210300: 0x1F23,
+ 0x1F200301: 0x1F24,
+ 0x1F210301: 0x1F25,
+ 0x1F200342: 0x1F26,
+ 0x1F210342: 0x1F27,
+ 0x03970313: 0x1F28,
+ 0x03970314: 0x1F29,
+ 0x1F280300: 0x1F2A,
+ 0x1F290300: 0x1F2B,
+ 0x1F280301: 0x1F2C,
+ 0x1F290301: 0x1F2D,
+ 0x1F280342: 0x1F2E,
+ 0x1F290342: 0x1F2F,
+ 0x03B90313: 0x1F30,
+ 0x03B90314: 0x1F31,
+ 0x1F300300: 0x1F32,
+ 0x1F310300: 0x1F33,
+ 0x1F300301: 0x1F34,
+ 0x1F310301: 0x1F35,
+ 0x1F300342: 0x1F36,
+ 0x1F310342: 0x1F37,
+ 0x03990313: 0x1F38,
+ 0x03990314: 0x1F39,
+ 0x1F380300: 0x1F3A,
+ 0x1F390300: 0x1F3B,
+ 0x1F380301: 0x1F3C,
+ 0x1F390301: 0x1F3D,
+ 0x1F380342: 0x1F3E,
+ 0x1F390342: 0x1F3F,
+ 0x03BF0313: 0x1F40,
+ 0x03BF0314: 0x1F41,
+ 0x1F400300: 0x1F42,
+ 0x1F410300: 0x1F43,
+ 0x1F400301: 0x1F44,
+ 0x1F410301: 0x1F45,
+ 0x039F0313: 0x1F48,
+ 0x039F0314: 0x1F49,
+ 0x1F480300: 0x1F4A,
+ 0x1F490300: 0x1F4B,
+ 0x1F480301: 0x1F4C,
+ 0x1F490301: 0x1F4D,
+ 0x03C50313: 0x1F50,
+ 0x03C50314: 0x1F51,
+ 0x1F500300: 0x1F52,
+ 0x1F510300: 0x1F53,
+ 0x1F500301: 0x1F54,
+ 0x1F510301: 0x1F55,
+ 0x1F500342: 0x1F56,
+ 0x1F510342: 0x1F57,
+ 0x03A50314: 0x1F59,
+ 0x1F590300: 0x1F5B,
+ 0x1F590301: 0x1F5D,
+ 0x1F590342: 0x1F5F,
+ 0x03C90313: 0x1F60,
+ 0x03C90314: 0x1F61,
+ 0x1F600300: 0x1F62,
+ 0x1F610300: 0x1F63,
+ 0x1F600301: 0x1F64,
+ 0x1F610301: 0x1F65,
+ 0x1F600342: 0x1F66,
+ 0x1F610342: 0x1F67,
+ 0x03A90313: 0x1F68,
+ 0x03A90314: 0x1F69,
+ 0x1F680300: 0x1F6A,
+ 0x1F690300: 0x1F6B,
+ 0x1F680301: 0x1F6C,
+ 0x1F690301: 0x1F6D,
+ 0x1F680342: 0x1F6E,
+ 0x1F690342: 0x1F6F,
+ 0x03B10300: 0x1F70,
+ 0x03B50300: 0x1F72,
+ 0x03B70300: 0x1F74,
+ 0x03B90300: 0x1F76,
+ 0x03BF0300: 0x1F78,
+ 0x03C50300: 0x1F7A,
+ 0x03C90300: 0x1F7C,
+ 0x1F000345: 0x1F80,
+ 0x1F010345: 0x1F81,
+ 0x1F020345: 0x1F82,
+ 0x1F030345: 0x1F83,
+ 0x1F040345: 0x1F84,
+ 0x1F050345: 0x1F85,
+ 0x1F060345: 0x1F86,
+ 0x1F070345: 0x1F87,
+ 0x1F080345: 0x1F88,
+ 0x1F090345: 0x1F89,
+ 0x1F0A0345: 0x1F8A,
+ 0x1F0B0345: 0x1F8B,
+ 0x1F0C0345: 0x1F8C,
+ 0x1F0D0345: 0x1F8D,
+ 0x1F0E0345: 0x1F8E,
+ 0x1F0F0345: 0x1F8F,
+ 0x1F200345: 0x1F90,
+ 0x1F210345: 0x1F91,
+ 0x1F220345: 0x1F92,
+ 0x1F230345: 0x1F93,
+ 0x1F240345: 0x1F94,
+ 0x1F250345: 0x1F95,
+ 0x1F260345: 0x1F96,
+ 0x1F270345: 0x1F97,
+ 0x1F280345: 0x1F98,
+ 0x1F290345: 0x1F99,
+ 0x1F2A0345: 0x1F9A,
+ 0x1F2B0345: 0x1F9B,
+ 0x1F2C0345: 0x1F9C,
+ 0x1F2D0345: 0x1F9D,
+ 0x1F2E0345: 0x1F9E,
+ 0x1F2F0345: 0x1F9F,
+ 0x1F600345: 0x1FA0,
+ 0x1F610345: 0x1FA1,
+ 0x1F620345: 0x1FA2,
+ 0x1F630345: 0x1FA3,
+ 0x1F640345: 0x1FA4,
+ 0x1F650345: 0x1FA5,
+ 0x1F660345: 0x1FA6,
+ 0x1F670345: 0x1FA7,
+ 0x1F680345: 0x1FA8,
+ 0x1F690345: 0x1FA9,
+ 0x1F6A0345: 0x1FAA,
+ 0x1F6B0345: 0x1FAB,
+ 0x1F6C0345: 0x1FAC,
+ 0x1F6D0345: 0x1FAD,
+ 0x1F6E0345: 0x1FAE,
+ 0x1F6F0345: 0x1FAF,
+ 0x03B10306: 0x1FB0,
+ 0x03B10304: 0x1FB1,
+ 0x1F700345: 0x1FB2,
+ 0x03B10345: 0x1FB3,
+ 0x03AC0345: 0x1FB4,
+ 0x03B10342: 0x1FB6,
+ 0x1FB60345: 0x1FB7,
+ 0x03910306: 0x1FB8,
+ 0x03910304: 0x1FB9,
+ 0x03910300: 0x1FBA,
+ 0x03910345: 0x1FBC,
+ 0x00A80342: 0x1FC1,
+ 0x1F740345: 0x1FC2,
+ 0x03B70345: 0x1FC3,
+ 0x03AE0345: 0x1FC4,
+ 0x03B70342: 0x1FC6,
+ 0x1FC60345: 0x1FC7,
+ 0x03950300: 0x1FC8,
+ 0x03970300: 0x1FCA,
+ 0x03970345: 0x1FCC,
+ 0x1FBF0300: 0x1FCD,
+ 0x1FBF0301: 0x1FCE,
+ 0x1FBF0342: 0x1FCF,
+ 0x03B90306: 0x1FD0,
+ 0x03B90304: 0x1FD1,
+ 0x03CA0300: 0x1FD2,
+ 0x03B90342: 0x1FD6,
+ 0x03CA0342: 0x1FD7,
+ 0x03990306: 0x1FD8,
+ 0x03990304: 0x1FD9,
+ 0x03990300: 0x1FDA,
+ 0x1FFE0300: 0x1FDD,
+ 0x1FFE0301: 0x1FDE,
+ 0x1FFE0342: 0x1FDF,
+ 0x03C50306: 0x1FE0,
+ 0x03C50304: 0x1FE1,
+ 0x03CB0300: 0x1FE2,
+ 0x03C10313: 0x1FE4,
+ 0x03C10314: 0x1FE5,
+ 0x03C50342: 0x1FE6,
+ 0x03CB0342: 0x1FE7,
+ 0x03A50306: 0x1FE8,
+ 0x03A50304: 0x1FE9,
+ 0x03A50300: 0x1FEA,
+ 0x03A10314: 0x1FEC,
+ 0x00A80300: 0x1FED,
+ 0x1F7C0345: 0x1FF2,
+ 0x03C90345: 0x1FF3,
+ 0x03CE0345: 0x1FF4,
+ 0x03C90342: 0x1FF6,
+ 0x1FF60345: 0x1FF7,
+ 0x039F0300: 0x1FF8,
+ 0x03A90300: 0x1FFA,
+ 0x03A90345: 0x1FFC,
+ 0x21900338: 0x219A,
+ 0x21920338: 0x219B,
+ 0x21940338: 0x21AE,
+ 0x21D00338: 0x21CD,
+ 0x21D40338: 0x21CE,
+ 0x21D20338: 0x21CF,
+ 0x22030338: 0x2204,
+ 0x22080338: 0x2209,
+ 0x220B0338: 0x220C,
+ 0x22230338: 0x2224,
+ 0x22250338: 0x2226,
+ 0x223C0338: 0x2241,
+ 0x22430338: 0x2244,
+ 0x22450338: 0x2247,
+ 0x22480338: 0x2249,
+ 0x003D0338: 0x2260,
+ 0x22610338: 0x2262,
+ 0x224D0338: 0x226D,
+ 0x003C0338: 0x226E,
+ 0x003E0338: 0x226F,
+ 0x22640338: 0x2270,
+ 0x22650338: 0x2271,
+ 0x22720338: 0x2274,
+ 0x22730338: 0x2275,
+ 0x22760338: 0x2278,
+ 0x22770338: 0x2279,
+ 0x227A0338: 0x2280,
+ 0x227B0338: 0x2281,
+ 0x22820338: 0x2284,
+ 0x22830338: 0x2285,
+ 0x22860338: 0x2288,
+ 0x22870338: 0x2289,
+ 0x22A20338: 0x22AC,
+ 0x22A80338: 0x22AD,
+ 0x22A90338: 0x22AE,
+ 0x22AB0338: 0x22AF,
+ 0x227C0338: 0x22E0,
+ 0x227D0338: 0x22E1,
+ 0x22910338: 0x22E2,
+ 0x22920338: 0x22E3,
+ 0x22B20338: 0x22EA,
+ 0x22B30338: 0x22EB,
+ 0x22B40338: 0x22EC,
+ 0x22B50338: 0x22ED,
+ 0x304B3099: 0x304C,
+ 0x304D3099: 0x304E,
+ 0x304F3099: 0x3050,
+ 0x30513099: 0x3052,
+ 0x30533099: 0x3054,
+ 0x30553099: 0x3056,
+ 0x30573099: 0x3058,
+ 0x30593099: 0x305A,
+ 0x305B3099: 0x305C,
+ 0x305D3099: 0x305E,
+ 0x305F3099: 0x3060,
+ 0x30613099: 0x3062,
+ 0x30643099: 0x3065,
+ 0x30663099: 0x3067,
+ 0x30683099: 0x3069,
+ 0x306F3099: 0x3070,
+ 0x306F309A: 0x3071,
+ 0x30723099: 0x3073,
+ 0x3072309A: 0x3074,
+ 0x30753099: 0x3076,
+ 0x3075309A: 0x3077,
+ 0x30783099: 0x3079,
+ 0x3078309A: 0x307A,
+ 0x307B3099: 0x307C,
+ 0x307B309A: 0x307D,
+ 0x30463099: 0x3094,
+ 0x309D3099: 0x309E,
+ 0x30AB3099: 0x30AC,
+ 0x30AD3099: 0x30AE,
+ 0x30AF3099: 0x30B0,
+ 0x30B13099: 0x30B2,
+ 0x30B33099: 0x30B4,
+ 0x30B53099: 0x30B6,
+ 0x30B73099: 0x30B8,
+ 0x30B93099: 0x30BA,
+ 0x30BB3099: 0x30BC,
+ 0x30BD3099: 0x30BE,
+ 0x30BF3099: 0x30C0,
+ 0x30C13099: 0x30C2,
+ 0x30C43099: 0x30C5,
+ 0x30C63099: 0x30C7,
+ 0x30C83099: 0x30C9,
+ 0x30CF3099: 0x30D0,
+ 0x30CF309A: 0x30D1,
+ 0x30D23099: 0x30D3,
+ 0x30D2309A: 0x30D4,
+ 0x30D53099: 0x30D6,
+ 0x30D5309A: 0x30D7,
+ 0x30D83099: 0x30D9,
+ 0x30D8309A: 0x30DA,
+ 0x30DB3099: 0x30DC,
+ 0x30DB309A: 0x30DD,
+ 0x30A63099: 0x30F4,
+ 0x30EF3099: 0x30F7,
+ 0x30F03099: 0x30F8,
+ 0x30F13099: 0x30F9,
+ 0x30F23099: 0x30FA,
+ 0x30FD3099: 0x30FE,
+ 0x109910BA: 0x1109A,
+ 0x109B10BA: 0x1109C,
+ 0x10A510BA: 0x110AB,
+ 0x11311127: 0x1112E,
+ 0x11321127: 0x1112F,
+ 0x1347133E: 0x1134B,
+ 0x13471357: 0x1134C,
+ 0x14B914BA: 0x114BB,
+ 0x14B914B0: 0x114BC,
+ 0x14B914BD: 0x114BE,
+ 0x15B815AF: 0x115BA,
+ 0x15B915AF: 0x115BB,
+}
+
+// Total size of tables: 53KB (54006 bytes)
diff --git a/vendor/golang.org/x/text/unicode/rangetable/gen.go b/vendor/golang.org/x/text/unicode/rangetable/gen.go
index 6a64e42..5b5f828 100644
--- a/vendor/golang.org/x/text/unicode/rangetable/gen.go
+++ b/vendor/golang.org/x/text/unicode/rangetable/gen.go
@@ -95,7 +95,7 @@ func main() {
fmt.Fprintf(w, "// Total size %d bytes (%d KiB)\n", size, size/1024)
- gen.WriteGoFile("tables.go", "rangetable", w.Bytes())
+ gen.WriteVersionedGoFile("tables.go", "rangetable", w.Bytes())
}
func print(w io.Writer, rt *unicode.RangeTable) {
diff --git a/vendor/golang.org/x/text/unicode/rangetable/tables.go b/vendor/golang.org/x/text/unicode/rangetable/tables10.0.0.go
similarity index 99%
rename from vendor/golang.org/x/text/unicode/rangetable/tables.go
rename to vendor/golang.org/x/text/unicode/rangetable/tables10.0.0.go
index 73179c0..f15a873 100644
--- a/vendor/golang.org/x/text/unicode/rangetable/tables.go
+++ b/vendor/golang.org/x/text/unicode/rangetable/tables10.0.0.go
@@ -1,5 +1,7 @@
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+// +build go1.10
+
package rangetable
//go:generate go run gen.go --versions=4.1.0,5.1.0,5.2.0,5.0.0,6.1.0,6.2.0,6.3.0,6.0.0,7.0.0,8.0.0,9.0.0,10.0.0
diff --git a/vendor/golang.org/x/text/unicode/rangetable/tables9.0.0.go b/vendor/golang.org/x/text/unicode/rangetable/tables9.0.0.go
new file mode 100644
index 0000000..aef876d
--- /dev/null
+++ b/vendor/golang.org/x/text/unicode/rangetable/tables9.0.0.go
@@ -0,0 +1,5737 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+// +build !go1.10
+
+package rangetable
+
+//go:generate go run gen.go --versions=4.1.0,5.1.0,5.2.0,5.0.0,6.1.0,6.2.0,6.3.0,6.0.0,7.0.0,8.0.0,9.0.0
+
+import "unicode"
+
+var assigned = map[string]*unicode.RangeTable{
+ "4.1.0": assigned4_1_0,
+ "5.1.0": assigned5_1_0,
+ "5.2.0": assigned5_2_0,
+ "5.0.0": assigned5_0_0,
+ "6.1.0": assigned6_1_0,
+ "6.2.0": assigned6_2_0,
+ "6.3.0": assigned6_3_0,
+ "6.0.0": assigned6_0_0,
+ "7.0.0": assigned7_0_0,
+ "8.0.0": assigned8_0_0,
+ "9.0.0": assigned9_0_0,
+}
+
+// size 2924 bytes (2 KiB)
+var assigned4_1_0 = &unicode.RangeTable{
+ R16: []unicode.Range16{
+ {0x0000, 0x0241, 1},
+ {0x0250, 0x036f, 1},
+ {0x0374, 0x0375, 1},
+ {0x037a, 0x037e, 4},
+ {0x0384, 0x038a, 1},
+ {0x038c, 0x038e, 2},
+ {0x038f, 0x03a1, 1},
+ {0x03a3, 0x03ce, 1},
+ {0x03d0, 0x0486, 1},
+ {0x0488, 0x04ce, 1},
+ {0x04d0, 0x04f9, 1},
+ {0x0500, 0x050f, 1},
+ {0x0531, 0x0556, 1},
+ {0x0559, 0x055f, 1},
+ {0x0561, 0x0587, 1},
+ {0x0589, 0x058a, 1},
+ {0x0591, 0x05b9, 1},
+ {0x05bb, 0x05c7, 1},
+ {0x05d0, 0x05ea, 1},
+ {0x05f0, 0x05f4, 1},
+ {0x0600, 0x0603, 1},
+ {0x060b, 0x0615, 1},
+ {0x061b, 0x061e, 3},
+ {0x061f, 0x0621, 2},
+ {0x0622, 0x063a, 1},
+ {0x0640, 0x065e, 1},
+ {0x0660, 0x070d, 1},
+ {0x070f, 0x074a, 1},
+ {0x074d, 0x076d, 1},
+ {0x0780, 0x07b1, 1},
+ {0x0901, 0x0939, 1},
+ {0x093c, 0x094d, 1},
+ {0x0950, 0x0954, 1},
+ {0x0958, 0x0970, 1},
+ {0x097d, 0x0981, 4},
+ {0x0982, 0x0983, 1},
+ {0x0985, 0x098c, 1},
+ {0x098f, 0x0990, 1},
+ {0x0993, 0x09a8, 1},
+ {0x09aa, 0x09b0, 1},
+ {0x09b2, 0x09b6, 4},
+ {0x09b7, 0x09b9, 1},
+ {0x09bc, 0x09c4, 1},
+ {0x09c7, 0x09c8, 1},
+ {0x09cb, 0x09ce, 1},
+ {0x09d7, 0x09dc, 5},
+ {0x09dd, 0x09df, 2},
+ {0x09e0, 0x09e3, 1},
+ {0x09e6, 0x09fa, 1},
+ {0x0a01, 0x0a03, 1},
+ {0x0a05, 0x0a0a, 1},
+ {0x0a0f, 0x0a10, 1},
+ {0x0a13, 0x0a28, 1},
+ {0x0a2a, 0x0a30, 1},
+ {0x0a32, 0x0a33, 1},
+ {0x0a35, 0x0a36, 1},
+ {0x0a38, 0x0a39, 1},
+ {0x0a3c, 0x0a3e, 2},
+ {0x0a3f, 0x0a42, 1},
+ {0x0a47, 0x0a48, 1},
+ {0x0a4b, 0x0a4d, 1},
+ {0x0a59, 0x0a5c, 1},
+ {0x0a5e, 0x0a66, 8},
+ {0x0a67, 0x0a74, 1},
+ {0x0a81, 0x0a83, 1},
+ {0x0a85, 0x0a8d, 1},
+ {0x0a8f, 0x0a91, 1},
+ {0x0a93, 0x0aa8, 1},
+ {0x0aaa, 0x0ab0, 1},
+ {0x0ab2, 0x0ab3, 1},
+ {0x0ab5, 0x0ab9, 1},
+ {0x0abc, 0x0ac5, 1},
+ {0x0ac7, 0x0ac9, 1},
+ {0x0acb, 0x0acd, 1},
+ {0x0ad0, 0x0ae0, 16},
+ {0x0ae1, 0x0ae3, 1},
+ {0x0ae6, 0x0aef, 1},
+ {0x0af1, 0x0b01, 16},
+ {0x0b02, 0x0b03, 1},
+ {0x0b05, 0x0b0c, 1},
+ {0x0b0f, 0x0b10, 1},
+ {0x0b13, 0x0b28, 1},
+ {0x0b2a, 0x0b30, 1},
+ {0x0b32, 0x0b33, 1},
+ {0x0b35, 0x0b39, 1},
+ {0x0b3c, 0x0b43, 1},
+ {0x0b47, 0x0b48, 1},
+ {0x0b4b, 0x0b4d, 1},
+ {0x0b56, 0x0b57, 1},
+ {0x0b5c, 0x0b5d, 1},
+ {0x0b5f, 0x0b61, 1},
+ {0x0b66, 0x0b71, 1},
+ {0x0b82, 0x0b83, 1},
+ {0x0b85, 0x0b8a, 1},
+ {0x0b8e, 0x0b90, 1},
+ {0x0b92, 0x0b95, 1},
+ {0x0b99, 0x0b9a, 1},
+ {0x0b9c, 0x0b9e, 2},
+ {0x0b9f, 0x0ba3, 4},
+ {0x0ba4, 0x0ba8, 4},
+ {0x0ba9, 0x0baa, 1},
+ {0x0bae, 0x0bb9, 1},
+ {0x0bbe, 0x0bc2, 1},
+ {0x0bc6, 0x0bc8, 1},
+ {0x0bca, 0x0bcd, 1},
+ {0x0bd7, 0x0be6, 15},
+ {0x0be7, 0x0bfa, 1},
+ {0x0c01, 0x0c03, 1},
+ {0x0c05, 0x0c0c, 1},
+ {0x0c0e, 0x0c10, 1},
+ {0x0c12, 0x0c28, 1},
+ {0x0c2a, 0x0c33, 1},
+ {0x0c35, 0x0c39, 1},
+ {0x0c3e, 0x0c44, 1},
+ {0x0c46, 0x0c48, 1},
+ {0x0c4a, 0x0c4d, 1},
+ {0x0c55, 0x0c56, 1},
+ {0x0c60, 0x0c61, 1},
+ {0x0c66, 0x0c6f, 1},
+ {0x0c82, 0x0c83, 1},
+ {0x0c85, 0x0c8c, 1},
+ {0x0c8e, 0x0c90, 1},
+ {0x0c92, 0x0ca8, 1},
+ {0x0caa, 0x0cb3, 1},
+ {0x0cb5, 0x0cb9, 1},
+ {0x0cbc, 0x0cc4, 1},
+ {0x0cc6, 0x0cc8, 1},
+ {0x0cca, 0x0ccd, 1},
+ {0x0cd5, 0x0cd6, 1},
+ {0x0cde, 0x0ce0, 2},
+ {0x0ce1, 0x0ce6, 5},
+ {0x0ce7, 0x0cef, 1},
+ {0x0d02, 0x0d03, 1},
+ {0x0d05, 0x0d0c, 1},
+ {0x0d0e, 0x0d10, 1},
+ {0x0d12, 0x0d28, 1},
+ {0x0d2a, 0x0d39, 1},
+ {0x0d3e, 0x0d43, 1},
+ {0x0d46, 0x0d48, 1},
+ {0x0d4a, 0x0d4d, 1},
+ {0x0d57, 0x0d60, 9},
+ {0x0d61, 0x0d66, 5},
+ {0x0d67, 0x0d6f, 1},
+ {0x0d82, 0x0d83, 1},
+ {0x0d85, 0x0d96, 1},
+ {0x0d9a, 0x0db1, 1},
+ {0x0db3, 0x0dbb, 1},
+ {0x0dbd, 0x0dc0, 3},
+ {0x0dc1, 0x0dc6, 1},
+ {0x0dca, 0x0dcf, 5},
+ {0x0dd0, 0x0dd4, 1},
+ {0x0dd6, 0x0dd8, 2},
+ {0x0dd9, 0x0ddf, 1},
+ {0x0df2, 0x0df4, 1},
+ {0x0e01, 0x0e3a, 1},
+ {0x0e3f, 0x0e5b, 1},
+ {0x0e81, 0x0e82, 1},
+ {0x0e84, 0x0e87, 3},
+ {0x0e88, 0x0e8a, 2},
+ {0x0e8d, 0x0e94, 7},
+ {0x0e95, 0x0e97, 1},
+ {0x0e99, 0x0e9f, 1},
+ {0x0ea1, 0x0ea3, 1},
+ {0x0ea5, 0x0ea7, 2},
+ {0x0eaa, 0x0eab, 1},
+ {0x0ead, 0x0eb9, 1},
+ {0x0ebb, 0x0ebd, 1},
+ {0x0ec0, 0x0ec4, 1},
+ {0x0ec6, 0x0ec8, 2},
+ {0x0ec9, 0x0ecd, 1},
+ {0x0ed0, 0x0ed9, 1},
+ {0x0edc, 0x0edd, 1},
+ {0x0f00, 0x0f47, 1},
+ {0x0f49, 0x0f6a, 1},
+ {0x0f71, 0x0f8b, 1},
+ {0x0f90, 0x0f97, 1},
+ {0x0f99, 0x0fbc, 1},
+ {0x0fbe, 0x0fcc, 1},
+ {0x0fcf, 0x0fd1, 1},
+ {0x1000, 0x1021, 1},
+ {0x1023, 0x1027, 1},
+ {0x1029, 0x102a, 1},
+ {0x102c, 0x1032, 1},
+ {0x1036, 0x1039, 1},
+ {0x1040, 0x1059, 1},
+ {0x10a0, 0x10c5, 1},
+ {0x10d0, 0x10fc, 1},
+ {0x1100, 0x1159, 1},
+ {0x115f, 0x11a2, 1},
+ {0x11a8, 0x11f9, 1},
+ {0x1200, 0x1248, 1},
+ {0x124a, 0x124d, 1},
+ {0x1250, 0x1256, 1},
+ {0x1258, 0x125a, 2},
+ {0x125b, 0x125d, 1},
+ {0x1260, 0x1288, 1},
+ {0x128a, 0x128d, 1},
+ {0x1290, 0x12b0, 1},
+ {0x12b2, 0x12b5, 1},
+ {0x12b8, 0x12be, 1},
+ {0x12c0, 0x12c2, 2},
+ {0x12c3, 0x12c5, 1},
+ {0x12c8, 0x12d6, 1},
+ {0x12d8, 0x1310, 1},
+ {0x1312, 0x1315, 1},
+ {0x1318, 0x135a, 1},
+ {0x135f, 0x137c, 1},
+ {0x1380, 0x1399, 1},
+ {0x13a0, 0x13f4, 1},
+ {0x1401, 0x1676, 1},
+ {0x1680, 0x169c, 1},
+ {0x16a0, 0x16f0, 1},
+ {0x1700, 0x170c, 1},
+ {0x170e, 0x1714, 1},
+ {0x1720, 0x1736, 1},
+ {0x1740, 0x1753, 1},
+ {0x1760, 0x176c, 1},
+ {0x176e, 0x1770, 1},
+ {0x1772, 0x1773, 1},
+ {0x1780, 0x17dd, 1},
+ {0x17e0, 0x17e9, 1},
+ {0x17f0, 0x17f9, 1},
+ {0x1800, 0x180e, 1},
+ {0x1810, 0x1819, 1},
+ {0x1820, 0x1877, 1},
+ {0x1880, 0x18a9, 1},
+ {0x1900, 0x191c, 1},
+ {0x1920, 0x192b, 1},
+ {0x1930, 0x193b, 1},
+ {0x1940, 0x1944, 4},
+ {0x1945, 0x196d, 1},
+ {0x1970, 0x1974, 1},
+ {0x1980, 0x19a9, 1},
+ {0x19b0, 0x19c9, 1},
+ {0x19d0, 0x19d9, 1},
+ {0x19de, 0x1a1b, 1},
+ {0x1a1e, 0x1a1f, 1},
+ {0x1d00, 0x1dc3, 1},
+ {0x1e00, 0x1e9b, 1},
+ {0x1ea0, 0x1ef9, 1},
+ {0x1f00, 0x1f15, 1},
+ {0x1f18, 0x1f1d, 1},
+ {0x1f20, 0x1f45, 1},
+ {0x1f48, 0x1f4d, 1},
+ {0x1f50, 0x1f57, 1},
+ {0x1f59, 0x1f5f, 2},
+ {0x1f60, 0x1f7d, 1},
+ {0x1f80, 0x1fb4, 1},
+ {0x1fb6, 0x1fc4, 1},
+ {0x1fc6, 0x1fd3, 1},
+ {0x1fd6, 0x1fdb, 1},
+ {0x1fdd, 0x1fef, 1},
+ {0x1ff2, 0x1ff4, 1},
+ {0x1ff6, 0x1ffe, 1},
+ {0x2000, 0x2063, 1},
+ {0x206a, 0x2071, 1},
+ {0x2074, 0x208e, 1},
+ {0x2090, 0x2094, 1},
+ {0x20a0, 0x20b5, 1},
+ {0x20d0, 0x20eb, 1},
+ {0x2100, 0x214c, 1},
+ {0x2153, 0x2183, 1},
+ {0x2190, 0x23db, 1},
+ {0x2400, 0x2426, 1},
+ {0x2440, 0x244a, 1},
+ {0x2460, 0x269c, 1},
+ {0x26a0, 0x26b1, 1},
+ {0x2701, 0x2704, 1},
+ {0x2706, 0x2709, 1},
+ {0x270c, 0x2727, 1},
+ {0x2729, 0x274b, 1},
+ {0x274d, 0x274f, 2},
+ {0x2750, 0x2752, 1},
+ {0x2756, 0x2758, 2},
+ {0x2759, 0x275e, 1},
+ {0x2761, 0x2794, 1},
+ {0x2798, 0x27af, 1},
+ {0x27b1, 0x27be, 1},
+ {0x27c0, 0x27c6, 1},
+ {0x27d0, 0x27eb, 1},
+ {0x27f0, 0x2b13, 1},
+ {0x2c00, 0x2c2e, 1},
+ {0x2c30, 0x2c5e, 1},
+ {0x2c80, 0x2cea, 1},
+ {0x2cf9, 0x2d25, 1},
+ {0x2d30, 0x2d65, 1},
+ {0x2d6f, 0x2d80, 17},
+ {0x2d81, 0x2d96, 1},
+ {0x2da0, 0x2da6, 1},
+ {0x2da8, 0x2dae, 1},
+ {0x2db0, 0x2db6, 1},
+ {0x2db8, 0x2dbe, 1},
+ {0x2dc0, 0x2dc6, 1},
+ {0x2dc8, 0x2dce, 1},
+ {0x2dd0, 0x2dd6, 1},
+ {0x2dd8, 0x2dde, 1},
+ {0x2e00, 0x2e17, 1},
+ {0x2e1c, 0x2e1d, 1},
+ {0x2e80, 0x2e99, 1},
+ {0x2e9b, 0x2ef3, 1},
+ {0x2f00, 0x2fd5, 1},
+ {0x2ff0, 0x2ffb, 1},
+ {0x3000, 0x303f, 1},
+ {0x3041, 0x3096, 1},
+ {0x3099, 0x30ff, 1},
+ {0x3105, 0x312c, 1},
+ {0x3131, 0x318e, 1},
+ {0x3190, 0x31b7, 1},
+ {0x31c0, 0x31cf, 1},
+ {0x31f0, 0x321e, 1},
+ {0x3220, 0x3243, 1},
+ {0x3250, 0x32fe, 1},
+ {0x3300, 0x4db5, 1},
+ {0x4dc0, 0x9fbb, 1},
+ {0xa000, 0xa48c, 1},
+ {0xa490, 0xa4c6, 1},
+ {0xa700, 0xa716, 1},
+ {0xa800, 0xa82b, 1},
+ {0xac00, 0xd7a3, 1},
+ {0xd800, 0xfa2d, 1},
+ {0xfa30, 0xfa6a, 1},
+ {0xfa70, 0xfad9, 1},
+ {0xfb00, 0xfb06, 1},
+ {0xfb13, 0xfb17, 1},
+ {0xfb1d, 0xfb36, 1},
+ {0xfb38, 0xfb3c, 1},
+ {0xfb3e, 0xfb40, 2},
+ {0xfb41, 0xfb43, 2},
+ {0xfb44, 0xfb46, 2},
+ {0xfb47, 0xfbb1, 1},
+ {0xfbd3, 0xfd3f, 1},
+ {0xfd50, 0xfd8f, 1},
+ {0xfd92, 0xfdc7, 1},
+ {0xfdf0, 0xfdfd, 1},
+ {0xfe00, 0xfe19, 1},
+ {0xfe20, 0xfe23, 1},
+ {0xfe30, 0xfe52, 1},
+ {0xfe54, 0xfe66, 1},
+ {0xfe68, 0xfe6b, 1},
+ {0xfe70, 0xfe74, 1},
+ {0xfe76, 0xfefc, 1},
+ {0xfeff, 0xff01, 2},
+ {0xff02, 0xffbe, 1},
+ {0xffc2, 0xffc7, 1},
+ {0xffca, 0xffcf, 1},
+ {0xffd2, 0xffd7, 1},
+ {0xffda, 0xffdc, 1},
+ {0xffe0, 0xffe6, 1},
+ {0xffe8, 0xffee, 1},
+ {0xfff9, 0xfffd, 1},
+ },
+ R32: []unicode.Range32{
+ {0x00010000, 0x0001000b, 1},
+ {0x0001000d, 0x00010026, 1},
+ {0x00010028, 0x0001003a, 1},
+ {0x0001003c, 0x0001003d, 1},
+ {0x0001003f, 0x0001004d, 1},
+ {0x00010050, 0x0001005d, 1},
+ {0x00010080, 0x000100fa, 1},
+ {0x00010100, 0x00010102, 1},
+ {0x00010107, 0x00010133, 1},
+ {0x00010137, 0x0001018a, 1},
+ {0x00010300, 0x0001031e, 1},
+ {0x00010320, 0x00010323, 1},
+ {0x00010330, 0x0001034a, 1},
+ {0x00010380, 0x0001039d, 1},
+ {0x0001039f, 0x000103c3, 1},
+ {0x000103c8, 0x000103d5, 1},
+ {0x00010400, 0x0001049d, 1},
+ {0x000104a0, 0x000104a9, 1},
+ {0x00010800, 0x00010805, 1},
+ {0x00010808, 0x0001080a, 2},
+ {0x0001080b, 0x00010835, 1},
+ {0x00010837, 0x00010838, 1},
+ {0x0001083c, 0x0001083f, 3},
+ {0x00010a00, 0x00010a03, 1},
+ {0x00010a05, 0x00010a06, 1},
+ {0x00010a0c, 0x00010a13, 1},
+ {0x00010a15, 0x00010a17, 1},
+ {0x00010a19, 0x00010a33, 1},
+ {0x00010a38, 0x00010a3a, 1},
+ {0x00010a3f, 0x00010a47, 1},
+ {0x00010a50, 0x00010a58, 1},
+ {0x0001d000, 0x0001d0f5, 1},
+ {0x0001d100, 0x0001d126, 1},
+ {0x0001d12a, 0x0001d1dd, 1},
+ {0x0001d200, 0x0001d245, 1},
+ {0x0001d300, 0x0001d356, 1},
+ {0x0001d400, 0x0001d454, 1},
+ {0x0001d456, 0x0001d49c, 1},
+ {0x0001d49e, 0x0001d49f, 1},
+ {0x0001d4a2, 0x0001d4a5, 3},
+ {0x0001d4a6, 0x0001d4a9, 3},
+ {0x0001d4aa, 0x0001d4ac, 1},
+ {0x0001d4ae, 0x0001d4b9, 1},
+ {0x0001d4bb, 0x0001d4bd, 2},
+ {0x0001d4be, 0x0001d4c3, 1},
+ {0x0001d4c5, 0x0001d505, 1},
+ {0x0001d507, 0x0001d50a, 1},
+ {0x0001d50d, 0x0001d514, 1},
+ {0x0001d516, 0x0001d51c, 1},
+ {0x0001d51e, 0x0001d539, 1},
+ {0x0001d53b, 0x0001d53e, 1},
+ {0x0001d540, 0x0001d544, 1},
+ {0x0001d546, 0x0001d54a, 4},
+ {0x0001d54b, 0x0001d550, 1},
+ {0x0001d552, 0x0001d6a5, 1},
+ {0x0001d6a8, 0x0001d7c9, 1},
+ {0x0001d7ce, 0x0001d7ff, 1},
+ {0x00020000, 0x0002a6d6, 1},
+ {0x0002f800, 0x0002fa1d, 1},
+ {0x000e0001, 0x000e0020, 31},
+ {0x000e0021, 0x000e007f, 1},
+ {0x000e0100, 0x000e01ef, 1},
+ {0x000f0000, 0x000ffffd, 1},
+ {0x00100000, 0x0010fffd, 1},
+ },
+ LatinOffset: 0,
+}
+
+// size 3152 bytes (3 KiB)
+var assigned5_1_0 = &unicode.RangeTable{
+ R16: []unicode.Range16{
+ {0x0000, 0x0377, 1},
+ {0x037a, 0x037e, 1},
+ {0x0384, 0x038a, 1},
+ {0x038c, 0x038e, 2},
+ {0x038f, 0x03a1, 1},
+ {0x03a3, 0x0523, 1},
+ {0x0531, 0x0556, 1},
+ {0x0559, 0x055f, 1},
+ {0x0561, 0x0587, 1},
+ {0x0589, 0x058a, 1},
+ {0x0591, 0x05c7, 1},
+ {0x05d0, 0x05ea, 1},
+ {0x05f0, 0x05f4, 1},
+ {0x0600, 0x0603, 1},
+ {0x0606, 0x061b, 1},
+ {0x061e, 0x061f, 1},
+ {0x0621, 0x065e, 1},
+ {0x0660, 0x070d, 1},
+ {0x070f, 0x074a, 1},
+ {0x074d, 0x07b1, 1},
+ {0x07c0, 0x07fa, 1},
+ {0x0901, 0x0939, 1},
+ {0x093c, 0x094d, 1},
+ {0x0950, 0x0954, 1},
+ {0x0958, 0x0972, 1},
+ {0x097b, 0x097f, 1},
+ {0x0981, 0x0983, 1},
+ {0x0985, 0x098c, 1},
+ {0x098f, 0x0990, 1},
+ {0x0993, 0x09a8, 1},
+ {0x09aa, 0x09b0, 1},
+ {0x09b2, 0x09b6, 4},
+ {0x09b7, 0x09b9, 1},
+ {0x09bc, 0x09c4, 1},
+ {0x09c7, 0x09c8, 1},
+ {0x09cb, 0x09ce, 1},
+ {0x09d7, 0x09dc, 5},
+ {0x09dd, 0x09df, 2},
+ {0x09e0, 0x09e3, 1},
+ {0x09e6, 0x09fa, 1},
+ {0x0a01, 0x0a03, 1},
+ {0x0a05, 0x0a0a, 1},
+ {0x0a0f, 0x0a10, 1},
+ {0x0a13, 0x0a28, 1},
+ {0x0a2a, 0x0a30, 1},
+ {0x0a32, 0x0a33, 1},
+ {0x0a35, 0x0a36, 1},
+ {0x0a38, 0x0a39, 1},
+ {0x0a3c, 0x0a3e, 2},
+ {0x0a3f, 0x0a42, 1},
+ {0x0a47, 0x0a48, 1},
+ {0x0a4b, 0x0a4d, 1},
+ {0x0a51, 0x0a59, 8},
+ {0x0a5a, 0x0a5c, 1},
+ {0x0a5e, 0x0a66, 8},
+ {0x0a67, 0x0a75, 1},
+ {0x0a81, 0x0a83, 1},
+ {0x0a85, 0x0a8d, 1},
+ {0x0a8f, 0x0a91, 1},
+ {0x0a93, 0x0aa8, 1},
+ {0x0aaa, 0x0ab0, 1},
+ {0x0ab2, 0x0ab3, 1},
+ {0x0ab5, 0x0ab9, 1},
+ {0x0abc, 0x0ac5, 1},
+ {0x0ac7, 0x0ac9, 1},
+ {0x0acb, 0x0acd, 1},
+ {0x0ad0, 0x0ae0, 16},
+ {0x0ae1, 0x0ae3, 1},
+ {0x0ae6, 0x0aef, 1},
+ {0x0af1, 0x0b01, 16},
+ {0x0b02, 0x0b03, 1},
+ {0x0b05, 0x0b0c, 1},
+ {0x0b0f, 0x0b10, 1},
+ {0x0b13, 0x0b28, 1},
+ {0x0b2a, 0x0b30, 1},
+ {0x0b32, 0x0b33, 1},
+ {0x0b35, 0x0b39, 1},
+ {0x0b3c, 0x0b44, 1},
+ {0x0b47, 0x0b48, 1},
+ {0x0b4b, 0x0b4d, 1},
+ {0x0b56, 0x0b57, 1},
+ {0x0b5c, 0x0b5d, 1},
+ {0x0b5f, 0x0b63, 1},
+ {0x0b66, 0x0b71, 1},
+ {0x0b82, 0x0b83, 1},
+ {0x0b85, 0x0b8a, 1},
+ {0x0b8e, 0x0b90, 1},
+ {0x0b92, 0x0b95, 1},
+ {0x0b99, 0x0b9a, 1},
+ {0x0b9c, 0x0b9e, 2},
+ {0x0b9f, 0x0ba3, 4},
+ {0x0ba4, 0x0ba8, 4},
+ {0x0ba9, 0x0baa, 1},
+ {0x0bae, 0x0bb9, 1},
+ {0x0bbe, 0x0bc2, 1},
+ {0x0bc6, 0x0bc8, 1},
+ {0x0bca, 0x0bcd, 1},
+ {0x0bd0, 0x0bd7, 7},
+ {0x0be6, 0x0bfa, 1},
+ {0x0c01, 0x0c03, 1},
+ {0x0c05, 0x0c0c, 1},
+ {0x0c0e, 0x0c10, 1},
+ {0x0c12, 0x0c28, 1},
+ {0x0c2a, 0x0c33, 1},
+ {0x0c35, 0x0c39, 1},
+ {0x0c3d, 0x0c44, 1},
+ {0x0c46, 0x0c48, 1},
+ {0x0c4a, 0x0c4d, 1},
+ {0x0c55, 0x0c56, 1},
+ {0x0c58, 0x0c59, 1},
+ {0x0c60, 0x0c63, 1},
+ {0x0c66, 0x0c6f, 1},
+ {0x0c78, 0x0c7f, 1},
+ {0x0c82, 0x0c83, 1},
+ {0x0c85, 0x0c8c, 1},
+ {0x0c8e, 0x0c90, 1},
+ {0x0c92, 0x0ca8, 1},
+ {0x0caa, 0x0cb3, 1},
+ {0x0cb5, 0x0cb9, 1},
+ {0x0cbc, 0x0cc4, 1},
+ {0x0cc6, 0x0cc8, 1},
+ {0x0cca, 0x0ccd, 1},
+ {0x0cd5, 0x0cd6, 1},
+ {0x0cde, 0x0ce0, 2},
+ {0x0ce1, 0x0ce3, 1},
+ {0x0ce6, 0x0cef, 1},
+ {0x0cf1, 0x0cf2, 1},
+ {0x0d02, 0x0d03, 1},
+ {0x0d05, 0x0d0c, 1},
+ {0x0d0e, 0x0d10, 1},
+ {0x0d12, 0x0d28, 1},
+ {0x0d2a, 0x0d39, 1},
+ {0x0d3d, 0x0d44, 1},
+ {0x0d46, 0x0d48, 1},
+ {0x0d4a, 0x0d4d, 1},
+ {0x0d57, 0x0d60, 9},
+ {0x0d61, 0x0d63, 1},
+ {0x0d66, 0x0d75, 1},
+ {0x0d79, 0x0d7f, 1},
+ {0x0d82, 0x0d83, 1},
+ {0x0d85, 0x0d96, 1},
+ {0x0d9a, 0x0db1, 1},
+ {0x0db3, 0x0dbb, 1},
+ {0x0dbd, 0x0dc0, 3},
+ {0x0dc1, 0x0dc6, 1},
+ {0x0dca, 0x0dcf, 5},
+ {0x0dd0, 0x0dd4, 1},
+ {0x0dd6, 0x0dd8, 2},
+ {0x0dd9, 0x0ddf, 1},
+ {0x0df2, 0x0df4, 1},
+ {0x0e01, 0x0e3a, 1},
+ {0x0e3f, 0x0e5b, 1},
+ {0x0e81, 0x0e82, 1},
+ {0x0e84, 0x0e87, 3},
+ {0x0e88, 0x0e8a, 2},
+ {0x0e8d, 0x0e94, 7},
+ {0x0e95, 0x0e97, 1},
+ {0x0e99, 0x0e9f, 1},
+ {0x0ea1, 0x0ea3, 1},
+ {0x0ea5, 0x0ea7, 2},
+ {0x0eaa, 0x0eab, 1},
+ {0x0ead, 0x0eb9, 1},
+ {0x0ebb, 0x0ebd, 1},
+ {0x0ec0, 0x0ec4, 1},
+ {0x0ec6, 0x0ec8, 2},
+ {0x0ec9, 0x0ecd, 1},
+ {0x0ed0, 0x0ed9, 1},
+ {0x0edc, 0x0edd, 1},
+ {0x0f00, 0x0f47, 1},
+ {0x0f49, 0x0f6c, 1},
+ {0x0f71, 0x0f8b, 1},
+ {0x0f90, 0x0f97, 1},
+ {0x0f99, 0x0fbc, 1},
+ {0x0fbe, 0x0fcc, 1},
+ {0x0fce, 0x0fd4, 1},
+ {0x1000, 0x1099, 1},
+ {0x109e, 0x10c5, 1},
+ {0x10d0, 0x10fc, 1},
+ {0x1100, 0x1159, 1},
+ {0x115f, 0x11a2, 1},
+ {0x11a8, 0x11f9, 1},
+ {0x1200, 0x1248, 1},
+ {0x124a, 0x124d, 1},
+ {0x1250, 0x1256, 1},
+ {0x1258, 0x125a, 2},
+ {0x125b, 0x125d, 1},
+ {0x1260, 0x1288, 1},
+ {0x128a, 0x128d, 1},
+ {0x1290, 0x12b0, 1},
+ {0x12b2, 0x12b5, 1},
+ {0x12b8, 0x12be, 1},
+ {0x12c0, 0x12c2, 2},
+ {0x12c3, 0x12c5, 1},
+ {0x12c8, 0x12d6, 1},
+ {0x12d8, 0x1310, 1},
+ {0x1312, 0x1315, 1},
+ {0x1318, 0x135a, 1},
+ {0x135f, 0x137c, 1},
+ {0x1380, 0x1399, 1},
+ {0x13a0, 0x13f4, 1},
+ {0x1401, 0x1676, 1},
+ {0x1680, 0x169c, 1},
+ {0x16a0, 0x16f0, 1},
+ {0x1700, 0x170c, 1},
+ {0x170e, 0x1714, 1},
+ {0x1720, 0x1736, 1},
+ {0x1740, 0x1753, 1},
+ {0x1760, 0x176c, 1},
+ {0x176e, 0x1770, 1},
+ {0x1772, 0x1773, 1},
+ {0x1780, 0x17dd, 1},
+ {0x17e0, 0x17e9, 1},
+ {0x17f0, 0x17f9, 1},
+ {0x1800, 0x180e, 1},
+ {0x1810, 0x1819, 1},
+ {0x1820, 0x1877, 1},
+ {0x1880, 0x18aa, 1},
+ {0x1900, 0x191c, 1},
+ {0x1920, 0x192b, 1},
+ {0x1930, 0x193b, 1},
+ {0x1940, 0x1944, 4},
+ {0x1945, 0x196d, 1},
+ {0x1970, 0x1974, 1},
+ {0x1980, 0x19a9, 1},
+ {0x19b0, 0x19c9, 1},
+ {0x19d0, 0x19d9, 1},
+ {0x19de, 0x1a1b, 1},
+ {0x1a1e, 0x1a1f, 1},
+ {0x1b00, 0x1b4b, 1},
+ {0x1b50, 0x1b7c, 1},
+ {0x1b80, 0x1baa, 1},
+ {0x1bae, 0x1bb9, 1},
+ {0x1c00, 0x1c37, 1},
+ {0x1c3b, 0x1c49, 1},
+ {0x1c4d, 0x1c7f, 1},
+ {0x1d00, 0x1de6, 1},
+ {0x1dfe, 0x1f15, 1},
+ {0x1f18, 0x1f1d, 1},
+ {0x1f20, 0x1f45, 1},
+ {0x1f48, 0x1f4d, 1},
+ {0x1f50, 0x1f57, 1},
+ {0x1f59, 0x1f5f, 2},
+ {0x1f60, 0x1f7d, 1},
+ {0x1f80, 0x1fb4, 1},
+ {0x1fb6, 0x1fc4, 1},
+ {0x1fc6, 0x1fd3, 1},
+ {0x1fd6, 0x1fdb, 1},
+ {0x1fdd, 0x1fef, 1},
+ {0x1ff2, 0x1ff4, 1},
+ {0x1ff6, 0x1ffe, 1},
+ {0x2000, 0x2064, 1},
+ {0x206a, 0x2071, 1},
+ {0x2074, 0x208e, 1},
+ {0x2090, 0x2094, 1},
+ {0x20a0, 0x20b5, 1},
+ {0x20d0, 0x20f0, 1},
+ {0x2100, 0x214f, 1},
+ {0x2153, 0x2188, 1},
+ {0x2190, 0x23e7, 1},
+ {0x2400, 0x2426, 1},
+ {0x2440, 0x244a, 1},
+ {0x2460, 0x269d, 1},
+ {0x26a0, 0x26bc, 1},
+ {0x26c0, 0x26c3, 1},
+ {0x2701, 0x2704, 1},
+ {0x2706, 0x2709, 1},
+ {0x270c, 0x2727, 1},
+ {0x2729, 0x274b, 1},
+ {0x274d, 0x274f, 2},
+ {0x2750, 0x2752, 1},
+ {0x2756, 0x2758, 2},
+ {0x2759, 0x275e, 1},
+ {0x2761, 0x2794, 1},
+ {0x2798, 0x27af, 1},
+ {0x27b1, 0x27be, 1},
+ {0x27c0, 0x27ca, 1},
+ {0x27cc, 0x27d0, 4},
+ {0x27d1, 0x2b4c, 1},
+ {0x2b50, 0x2b54, 1},
+ {0x2c00, 0x2c2e, 1},
+ {0x2c30, 0x2c5e, 1},
+ {0x2c60, 0x2c6f, 1},
+ {0x2c71, 0x2c7d, 1},
+ {0x2c80, 0x2cea, 1},
+ {0x2cf9, 0x2d25, 1},
+ {0x2d30, 0x2d65, 1},
+ {0x2d6f, 0x2d80, 17},
+ {0x2d81, 0x2d96, 1},
+ {0x2da0, 0x2da6, 1},
+ {0x2da8, 0x2dae, 1},
+ {0x2db0, 0x2db6, 1},
+ {0x2db8, 0x2dbe, 1},
+ {0x2dc0, 0x2dc6, 1},
+ {0x2dc8, 0x2dce, 1},
+ {0x2dd0, 0x2dd6, 1},
+ {0x2dd8, 0x2dde, 1},
+ {0x2de0, 0x2e30, 1},
+ {0x2e80, 0x2e99, 1},
+ {0x2e9b, 0x2ef3, 1},
+ {0x2f00, 0x2fd5, 1},
+ {0x2ff0, 0x2ffb, 1},
+ {0x3000, 0x303f, 1},
+ {0x3041, 0x3096, 1},
+ {0x3099, 0x30ff, 1},
+ {0x3105, 0x312d, 1},
+ {0x3131, 0x318e, 1},
+ {0x3190, 0x31b7, 1},
+ {0x31c0, 0x31e3, 1},
+ {0x31f0, 0x321e, 1},
+ {0x3220, 0x3243, 1},
+ {0x3250, 0x32fe, 1},
+ {0x3300, 0x4db5, 1},
+ {0x4dc0, 0x9fc3, 1},
+ {0xa000, 0xa48c, 1},
+ {0xa490, 0xa4c6, 1},
+ {0xa500, 0xa62b, 1},
+ {0xa640, 0xa65f, 1},
+ {0xa662, 0xa673, 1},
+ {0xa67c, 0xa697, 1},
+ {0xa700, 0xa78c, 1},
+ {0xa7fb, 0xa82b, 1},
+ {0xa840, 0xa877, 1},
+ {0xa880, 0xa8c4, 1},
+ {0xa8ce, 0xa8d9, 1},
+ {0xa900, 0xa953, 1},
+ {0xa95f, 0xaa00, 161},
+ {0xaa01, 0xaa36, 1},
+ {0xaa40, 0xaa4d, 1},
+ {0xaa50, 0xaa59, 1},
+ {0xaa5c, 0xaa5f, 1},
+ {0xac00, 0xd7a3, 1},
+ {0xd800, 0xfa2d, 1},
+ {0xfa30, 0xfa6a, 1},
+ {0xfa70, 0xfad9, 1},
+ {0xfb00, 0xfb06, 1},
+ {0xfb13, 0xfb17, 1},
+ {0xfb1d, 0xfb36, 1},
+ {0xfb38, 0xfb3c, 1},
+ {0xfb3e, 0xfb40, 2},
+ {0xfb41, 0xfb43, 2},
+ {0xfb44, 0xfb46, 2},
+ {0xfb47, 0xfbb1, 1},
+ {0xfbd3, 0xfd3f, 1},
+ {0xfd50, 0xfd8f, 1},
+ {0xfd92, 0xfdc7, 1},
+ {0xfdf0, 0xfdfd, 1},
+ {0xfe00, 0xfe19, 1},
+ {0xfe20, 0xfe26, 1},
+ {0xfe30, 0xfe52, 1},
+ {0xfe54, 0xfe66, 1},
+ {0xfe68, 0xfe6b, 1},
+ {0xfe70, 0xfe74, 1},
+ {0xfe76, 0xfefc, 1},
+ {0xfeff, 0xff01, 2},
+ {0xff02, 0xffbe, 1},
+ {0xffc2, 0xffc7, 1},
+ {0xffca, 0xffcf, 1},
+ {0xffd2, 0xffd7, 1},
+ {0xffda, 0xffdc, 1},
+ {0xffe0, 0xffe6, 1},
+ {0xffe8, 0xffee, 1},
+ {0xfff9, 0xfffd, 1},
+ },
+ R32: []unicode.Range32{
+ {0x00010000, 0x0001000b, 1},
+ {0x0001000d, 0x00010026, 1},
+ {0x00010028, 0x0001003a, 1},
+ {0x0001003c, 0x0001003d, 1},
+ {0x0001003f, 0x0001004d, 1},
+ {0x00010050, 0x0001005d, 1},
+ {0x00010080, 0x000100fa, 1},
+ {0x00010100, 0x00010102, 1},
+ {0x00010107, 0x00010133, 1},
+ {0x00010137, 0x0001018a, 1},
+ {0x00010190, 0x0001019b, 1},
+ {0x000101d0, 0x000101fd, 1},
+ {0x00010280, 0x0001029c, 1},
+ {0x000102a0, 0x000102d0, 1},
+ {0x00010300, 0x0001031e, 1},
+ {0x00010320, 0x00010323, 1},
+ {0x00010330, 0x0001034a, 1},
+ {0x00010380, 0x0001039d, 1},
+ {0x0001039f, 0x000103c3, 1},
+ {0x000103c8, 0x000103d5, 1},
+ {0x00010400, 0x0001049d, 1},
+ {0x000104a0, 0x000104a9, 1},
+ {0x00010800, 0x00010805, 1},
+ {0x00010808, 0x0001080a, 2},
+ {0x0001080b, 0x00010835, 1},
+ {0x00010837, 0x00010838, 1},
+ {0x0001083c, 0x0001083f, 3},
+ {0x00010900, 0x00010919, 1},
+ {0x0001091f, 0x00010939, 1},
+ {0x0001093f, 0x00010a00, 193},
+ {0x00010a01, 0x00010a03, 1},
+ {0x00010a05, 0x00010a06, 1},
+ {0x00010a0c, 0x00010a13, 1},
+ {0x00010a15, 0x00010a17, 1},
+ {0x00010a19, 0x00010a33, 1},
+ {0x00010a38, 0x00010a3a, 1},
+ {0x00010a3f, 0x00010a47, 1},
+ {0x00010a50, 0x00010a58, 1},
+ {0x00012000, 0x0001236e, 1},
+ {0x00012400, 0x00012462, 1},
+ {0x00012470, 0x00012473, 1},
+ {0x0001d000, 0x0001d0f5, 1},
+ {0x0001d100, 0x0001d126, 1},
+ {0x0001d129, 0x0001d1dd, 1},
+ {0x0001d200, 0x0001d245, 1},
+ {0x0001d300, 0x0001d356, 1},
+ {0x0001d360, 0x0001d371, 1},
+ {0x0001d400, 0x0001d454, 1},
+ {0x0001d456, 0x0001d49c, 1},
+ {0x0001d49e, 0x0001d49f, 1},
+ {0x0001d4a2, 0x0001d4a5, 3},
+ {0x0001d4a6, 0x0001d4a9, 3},
+ {0x0001d4aa, 0x0001d4ac, 1},
+ {0x0001d4ae, 0x0001d4b9, 1},
+ {0x0001d4bb, 0x0001d4bd, 2},
+ {0x0001d4be, 0x0001d4c3, 1},
+ {0x0001d4c5, 0x0001d505, 1},
+ {0x0001d507, 0x0001d50a, 1},
+ {0x0001d50d, 0x0001d514, 1},
+ {0x0001d516, 0x0001d51c, 1},
+ {0x0001d51e, 0x0001d539, 1},
+ {0x0001d53b, 0x0001d53e, 1},
+ {0x0001d540, 0x0001d544, 1},
+ {0x0001d546, 0x0001d54a, 4},
+ {0x0001d54b, 0x0001d550, 1},
+ {0x0001d552, 0x0001d6a5, 1},
+ {0x0001d6a8, 0x0001d7cb, 1},
+ {0x0001d7ce, 0x0001d7ff, 1},
+ {0x0001f000, 0x0001f02b, 1},
+ {0x0001f030, 0x0001f093, 1},
+ {0x00020000, 0x0002a6d6, 1},
+ {0x0002f800, 0x0002fa1d, 1},
+ {0x000e0001, 0x000e0020, 31},
+ {0x000e0021, 0x000e007f, 1},
+ {0x000e0100, 0x000e01ef, 1},
+ {0x000f0000, 0x000ffffd, 1},
+ {0x00100000, 0x0010fffd, 1},
+ },
+ LatinOffset: 0,
+}
+
+// size 3518 bytes (3 KiB)
+var assigned5_2_0 = &unicode.RangeTable{
+ R16: []unicode.Range16{
+ {0x0000, 0x0377, 1},
+ {0x037a, 0x037e, 1},
+ {0x0384, 0x038a, 1},
+ {0x038c, 0x038e, 2},
+ {0x038f, 0x03a1, 1},
+ {0x03a3, 0x0525, 1},
+ {0x0531, 0x0556, 1},
+ {0x0559, 0x055f, 1},
+ {0x0561, 0x0587, 1},
+ {0x0589, 0x058a, 1},
+ {0x0591, 0x05c7, 1},
+ {0x05d0, 0x05ea, 1},
+ {0x05f0, 0x05f4, 1},
+ {0x0600, 0x0603, 1},
+ {0x0606, 0x061b, 1},
+ {0x061e, 0x061f, 1},
+ {0x0621, 0x065e, 1},
+ {0x0660, 0x070d, 1},
+ {0x070f, 0x074a, 1},
+ {0x074d, 0x07b1, 1},
+ {0x07c0, 0x07fa, 1},
+ {0x0800, 0x082d, 1},
+ {0x0830, 0x083e, 1},
+ {0x0900, 0x0939, 1},
+ {0x093c, 0x094e, 1},
+ {0x0950, 0x0955, 1},
+ {0x0958, 0x0972, 1},
+ {0x0979, 0x097f, 1},
+ {0x0981, 0x0983, 1},
+ {0x0985, 0x098c, 1},
+ {0x098f, 0x0990, 1},
+ {0x0993, 0x09a8, 1},
+ {0x09aa, 0x09b0, 1},
+ {0x09b2, 0x09b6, 4},
+ {0x09b7, 0x09b9, 1},
+ {0x09bc, 0x09c4, 1},
+ {0x09c7, 0x09c8, 1},
+ {0x09cb, 0x09ce, 1},
+ {0x09d7, 0x09dc, 5},
+ {0x09dd, 0x09df, 2},
+ {0x09e0, 0x09e3, 1},
+ {0x09e6, 0x09fb, 1},
+ {0x0a01, 0x0a03, 1},
+ {0x0a05, 0x0a0a, 1},
+ {0x0a0f, 0x0a10, 1},
+ {0x0a13, 0x0a28, 1},
+ {0x0a2a, 0x0a30, 1},
+ {0x0a32, 0x0a33, 1},
+ {0x0a35, 0x0a36, 1},
+ {0x0a38, 0x0a39, 1},
+ {0x0a3c, 0x0a3e, 2},
+ {0x0a3f, 0x0a42, 1},
+ {0x0a47, 0x0a48, 1},
+ {0x0a4b, 0x0a4d, 1},
+ {0x0a51, 0x0a59, 8},
+ {0x0a5a, 0x0a5c, 1},
+ {0x0a5e, 0x0a66, 8},
+ {0x0a67, 0x0a75, 1},
+ {0x0a81, 0x0a83, 1},
+ {0x0a85, 0x0a8d, 1},
+ {0x0a8f, 0x0a91, 1},
+ {0x0a93, 0x0aa8, 1},
+ {0x0aaa, 0x0ab0, 1},
+ {0x0ab2, 0x0ab3, 1},
+ {0x0ab5, 0x0ab9, 1},
+ {0x0abc, 0x0ac5, 1},
+ {0x0ac7, 0x0ac9, 1},
+ {0x0acb, 0x0acd, 1},
+ {0x0ad0, 0x0ae0, 16},
+ {0x0ae1, 0x0ae3, 1},
+ {0x0ae6, 0x0aef, 1},
+ {0x0af1, 0x0b01, 16},
+ {0x0b02, 0x0b03, 1},
+ {0x0b05, 0x0b0c, 1},
+ {0x0b0f, 0x0b10, 1},
+ {0x0b13, 0x0b28, 1},
+ {0x0b2a, 0x0b30, 1},
+ {0x0b32, 0x0b33, 1},
+ {0x0b35, 0x0b39, 1},
+ {0x0b3c, 0x0b44, 1},
+ {0x0b47, 0x0b48, 1},
+ {0x0b4b, 0x0b4d, 1},
+ {0x0b56, 0x0b57, 1},
+ {0x0b5c, 0x0b5d, 1},
+ {0x0b5f, 0x0b63, 1},
+ {0x0b66, 0x0b71, 1},
+ {0x0b82, 0x0b83, 1},
+ {0x0b85, 0x0b8a, 1},
+ {0x0b8e, 0x0b90, 1},
+ {0x0b92, 0x0b95, 1},
+ {0x0b99, 0x0b9a, 1},
+ {0x0b9c, 0x0b9e, 2},
+ {0x0b9f, 0x0ba3, 4},
+ {0x0ba4, 0x0ba8, 4},
+ {0x0ba9, 0x0baa, 1},
+ {0x0bae, 0x0bb9, 1},
+ {0x0bbe, 0x0bc2, 1},
+ {0x0bc6, 0x0bc8, 1},
+ {0x0bca, 0x0bcd, 1},
+ {0x0bd0, 0x0bd7, 7},
+ {0x0be6, 0x0bfa, 1},
+ {0x0c01, 0x0c03, 1},
+ {0x0c05, 0x0c0c, 1},
+ {0x0c0e, 0x0c10, 1},
+ {0x0c12, 0x0c28, 1},
+ {0x0c2a, 0x0c33, 1},
+ {0x0c35, 0x0c39, 1},
+ {0x0c3d, 0x0c44, 1},
+ {0x0c46, 0x0c48, 1},
+ {0x0c4a, 0x0c4d, 1},
+ {0x0c55, 0x0c56, 1},
+ {0x0c58, 0x0c59, 1},
+ {0x0c60, 0x0c63, 1},
+ {0x0c66, 0x0c6f, 1},
+ {0x0c78, 0x0c7f, 1},
+ {0x0c82, 0x0c83, 1},
+ {0x0c85, 0x0c8c, 1},
+ {0x0c8e, 0x0c90, 1},
+ {0x0c92, 0x0ca8, 1},
+ {0x0caa, 0x0cb3, 1},
+ {0x0cb5, 0x0cb9, 1},
+ {0x0cbc, 0x0cc4, 1},
+ {0x0cc6, 0x0cc8, 1},
+ {0x0cca, 0x0ccd, 1},
+ {0x0cd5, 0x0cd6, 1},
+ {0x0cde, 0x0ce0, 2},
+ {0x0ce1, 0x0ce3, 1},
+ {0x0ce6, 0x0cef, 1},
+ {0x0cf1, 0x0cf2, 1},
+ {0x0d02, 0x0d03, 1},
+ {0x0d05, 0x0d0c, 1},
+ {0x0d0e, 0x0d10, 1},
+ {0x0d12, 0x0d28, 1},
+ {0x0d2a, 0x0d39, 1},
+ {0x0d3d, 0x0d44, 1},
+ {0x0d46, 0x0d48, 1},
+ {0x0d4a, 0x0d4d, 1},
+ {0x0d57, 0x0d60, 9},
+ {0x0d61, 0x0d63, 1},
+ {0x0d66, 0x0d75, 1},
+ {0x0d79, 0x0d7f, 1},
+ {0x0d82, 0x0d83, 1},
+ {0x0d85, 0x0d96, 1},
+ {0x0d9a, 0x0db1, 1},
+ {0x0db3, 0x0dbb, 1},
+ {0x0dbd, 0x0dc0, 3},
+ {0x0dc1, 0x0dc6, 1},
+ {0x0dca, 0x0dcf, 5},
+ {0x0dd0, 0x0dd4, 1},
+ {0x0dd6, 0x0dd8, 2},
+ {0x0dd9, 0x0ddf, 1},
+ {0x0df2, 0x0df4, 1},
+ {0x0e01, 0x0e3a, 1},
+ {0x0e3f, 0x0e5b, 1},
+ {0x0e81, 0x0e82, 1},
+ {0x0e84, 0x0e87, 3},
+ {0x0e88, 0x0e8a, 2},
+ {0x0e8d, 0x0e94, 7},
+ {0x0e95, 0x0e97, 1},
+ {0x0e99, 0x0e9f, 1},
+ {0x0ea1, 0x0ea3, 1},
+ {0x0ea5, 0x0ea7, 2},
+ {0x0eaa, 0x0eab, 1},
+ {0x0ead, 0x0eb9, 1},
+ {0x0ebb, 0x0ebd, 1},
+ {0x0ec0, 0x0ec4, 1},
+ {0x0ec6, 0x0ec8, 2},
+ {0x0ec9, 0x0ecd, 1},
+ {0x0ed0, 0x0ed9, 1},
+ {0x0edc, 0x0edd, 1},
+ {0x0f00, 0x0f47, 1},
+ {0x0f49, 0x0f6c, 1},
+ {0x0f71, 0x0f8b, 1},
+ {0x0f90, 0x0f97, 1},
+ {0x0f99, 0x0fbc, 1},
+ {0x0fbe, 0x0fcc, 1},
+ {0x0fce, 0x0fd8, 1},
+ {0x1000, 0x10c5, 1},
+ {0x10d0, 0x10fc, 1},
+ {0x1100, 0x1248, 1},
+ {0x124a, 0x124d, 1},
+ {0x1250, 0x1256, 1},
+ {0x1258, 0x125a, 2},
+ {0x125b, 0x125d, 1},
+ {0x1260, 0x1288, 1},
+ {0x128a, 0x128d, 1},
+ {0x1290, 0x12b0, 1},
+ {0x12b2, 0x12b5, 1},
+ {0x12b8, 0x12be, 1},
+ {0x12c0, 0x12c2, 2},
+ {0x12c3, 0x12c5, 1},
+ {0x12c8, 0x12d6, 1},
+ {0x12d8, 0x1310, 1},
+ {0x1312, 0x1315, 1},
+ {0x1318, 0x135a, 1},
+ {0x135f, 0x137c, 1},
+ {0x1380, 0x1399, 1},
+ {0x13a0, 0x13f4, 1},
+ {0x1400, 0x169c, 1},
+ {0x16a0, 0x16f0, 1},
+ {0x1700, 0x170c, 1},
+ {0x170e, 0x1714, 1},
+ {0x1720, 0x1736, 1},
+ {0x1740, 0x1753, 1},
+ {0x1760, 0x176c, 1},
+ {0x176e, 0x1770, 1},
+ {0x1772, 0x1773, 1},
+ {0x1780, 0x17dd, 1},
+ {0x17e0, 0x17e9, 1},
+ {0x17f0, 0x17f9, 1},
+ {0x1800, 0x180e, 1},
+ {0x1810, 0x1819, 1},
+ {0x1820, 0x1877, 1},
+ {0x1880, 0x18aa, 1},
+ {0x18b0, 0x18f5, 1},
+ {0x1900, 0x191c, 1},
+ {0x1920, 0x192b, 1},
+ {0x1930, 0x193b, 1},
+ {0x1940, 0x1944, 4},
+ {0x1945, 0x196d, 1},
+ {0x1970, 0x1974, 1},
+ {0x1980, 0x19ab, 1},
+ {0x19b0, 0x19c9, 1},
+ {0x19d0, 0x19da, 1},
+ {0x19de, 0x1a1b, 1},
+ {0x1a1e, 0x1a5e, 1},
+ {0x1a60, 0x1a7c, 1},
+ {0x1a7f, 0x1a89, 1},
+ {0x1a90, 0x1a99, 1},
+ {0x1aa0, 0x1aad, 1},
+ {0x1b00, 0x1b4b, 1},
+ {0x1b50, 0x1b7c, 1},
+ {0x1b80, 0x1baa, 1},
+ {0x1bae, 0x1bb9, 1},
+ {0x1c00, 0x1c37, 1},
+ {0x1c3b, 0x1c49, 1},
+ {0x1c4d, 0x1c7f, 1},
+ {0x1cd0, 0x1cf2, 1},
+ {0x1d00, 0x1de6, 1},
+ {0x1dfd, 0x1f15, 1},
+ {0x1f18, 0x1f1d, 1},
+ {0x1f20, 0x1f45, 1},
+ {0x1f48, 0x1f4d, 1},
+ {0x1f50, 0x1f57, 1},
+ {0x1f59, 0x1f5f, 2},
+ {0x1f60, 0x1f7d, 1},
+ {0x1f80, 0x1fb4, 1},
+ {0x1fb6, 0x1fc4, 1},
+ {0x1fc6, 0x1fd3, 1},
+ {0x1fd6, 0x1fdb, 1},
+ {0x1fdd, 0x1fef, 1},
+ {0x1ff2, 0x1ff4, 1},
+ {0x1ff6, 0x1ffe, 1},
+ {0x2000, 0x2064, 1},
+ {0x206a, 0x2071, 1},
+ {0x2074, 0x208e, 1},
+ {0x2090, 0x2094, 1},
+ {0x20a0, 0x20b8, 1},
+ {0x20d0, 0x20f0, 1},
+ {0x2100, 0x2189, 1},
+ {0x2190, 0x23e8, 1},
+ {0x2400, 0x2426, 1},
+ {0x2440, 0x244a, 1},
+ {0x2460, 0x26cd, 1},
+ {0x26cf, 0x26e1, 1},
+ {0x26e3, 0x26e8, 5},
+ {0x26e9, 0x26ff, 1},
+ {0x2701, 0x2704, 1},
+ {0x2706, 0x2709, 1},
+ {0x270c, 0x2727, 1},
+ {0x2729, 0x274b, 1},
+ {0x274d, 0x274f, 2},
+ {0x2750, 0x2752, 1},
+ {0x2756, 0x275e, 1},
+ {0x2761, 0x2794, 1},
+ {0x2798, 0x27af, 1},
+ {0x27b1, 0x27be, 1},
+ {0x27c0, 0x27ca, 1},
+ {0x27cc, 0x27d0, 4},
+ {0x27d1, 0x2b4c, 1},
+ {0x2b50, 0x2b59, 1},
+ {0x2c00, 0x2c2e, 1},
+ {0x2c30, 0x2c5e, 1},
+ {0x2c60, 0x2cf1, 1},
+ {0x2cf9, 0x2d25, 1},
+ {0x2d30, 0x2d65, 1},
+ {0x2d6f, 0x2d80, 17},
+ {0x2d81, 0x2d96, 1},
+ {0x2da0, 0x2da6, 1},
+ {0x2da8, 0x2dae, 1},
+ {0x2db0, 0x2db6, 1},
+ {0x2db8, 0x2dbe, 1},
+ {0x2dc0, 0x2dc6, 1},
+ {0x2dc8, 0x2dce, 1},
+ {0x2dd0, 0x2dd6, 1},
+ {0x2dd8, 0x2dde, 1},
+ {0x2de0, 0x2e31, 1},
+ {0x2e80, 0x2e99, 1},
+ {0x2e9b, 0x2ef3, 1},
+ {0x2f00, 0x2fd5, 1},
+ {0x2ff0, 0x2ffb, 1},
+ {0x3000, 0x303f, 1},
+ {0x3041, 0x3096, 1},
+ {0x3099, 0x30ff, 1},
+ {0x3105, 0x312d, 1},
+ {0x3131, 0x318e, 1},
+ {0x3190, 0x31b7, 1},
+ {0x31c0, 0x31e3, 1},
+ {0x31f0, 0x321e, 1},
+ {0x3220, 0x32fe, 1},
+ {0x3300, 0x4db5, 1},
+ {0x4dc0, 0x9fcb, 1},
+ {0xa000, 0xa48c, 1},
+ {0xa490, 0xa4c6, 1},
+ {0xa4d0, 0xa62b, 1},
+ {0xa640, 0xa65f, 1},
+ {0xa662, 0xa673, 1},
+ {0xa67c, 0xa697, 1},
+ {0xa6a0, 0xa6f7, 1},
+ {0xa700, 0xa78c, 1},
+ {0xa7fb, 0xa82b, 1},
+ {0xa830, 0xa839, 1},
+ {0xa840, 0xa877, 1},
+ {0xa880, 0xa8c4, 1},
+ {0xa8ce, 0xa8d9, 1},
+ {0xa8e0, 0xa8fb, 1},
+ {0xa900, 0xa953, 1},
+ {0xa95f, 0xa97c, 1},
+ {0xa980, 0xa9cd, 1},
+ {0xa9cf, 0xa9d9, 1},
+ {0xa9de, 0xa9df, 1},
+ {0xaa00, 0xaa36, 1},
+ {0xaa40, 0xaa4d, 1},
+ {0xaa50, 0xaa59, 1},
+ {0xaa5c, 0xaa7b, 1},
+ {0xaa80, 0xaac2, 1},
+ {0xaadb, 0xaadf, 1},
+ {0xabc0, 0xabed, 1},
+ {0xabf0, 0xabf9, 1},
+ {0xac00, 0xd7a3, 1},
+ {0xd7b0, 0xd7c6, 1},
+ {0xd7cb, 0xd7fb, 1},
+ {0xd800, 0xfa2d, 1},
+ {0xfa30, 0xfa6d, 1},
+ {0xfa70, 0xfad9, 1},
+ {0xfb00, 0xfb06, 1},
+ {0xfb13, 0xfb17, 1},
+ {0xfb1d, 0xfb36, 1},
+ {0xfb38, 0xfb3c, 1},
+ {0xfb3e, 0xfb40, 2},
+ {0xfb41, 0xfb43, 2},
+ {0xfb44, 0xfb46, 2},
+ {0xfb47, 0xfbb1, 1},
+ {0xfbd3, 0xfd3f, 1},
+ {0xfd50, 0xfd8f, 1},
+ {0xfd92, 0xfdc7, 1},
+ {0xfdf0, 0xfdfd, 1},
+ {0xfe00, 0xfe19, 1},
+ {0xfe20, 0xfe26, 1},
+ {0xfe30, 0xfe52, 1},
+ {0xfe54, 0xfe66, 1},
+ {0xfe68, 0xfe6b, 1},
+ {0xfe70, 0xfe74, 1},
+ {0xfe76, 0xfefc, 1},
+ {0xfeff, 0xff01, 2},
+ {0xff02, 0xffbe, 1},
+ {0xffc2, 0xffc7, 1},
+ {0xffca, 0xffcf, 1},
+ {0xffd2, 0xffd7, 1},
+ {0xffda, 0xffdc, 1},
+ {0xffe0, 0xffe6, 1},
+ {0xffe8, 0xffee, 1},
+ {0xfff9, 0xfffd, 1},
+ },
+ R32: []unicode.Range32{
+ {0x00010000, 0x0001000b, 1},
+ {0x0001000d, 0x00010026, 1},
+ {0x00010028, 0x0001003a, 1},
+ {0x0001003c, 0x0001003d, 1},
+ {0x0001003f, 0x0001004d, 1},
+ {0x00010050, 0x0001005d, 1},
+ {0x00010080, 0x000100fa, 1},
+ {0x00010100, 0x00010102, 1},
+ {0x00010107, 0x00010133, 1},
+ {0x00010137, 0x0001018a, 1},
+ {0x00010190, 0x0001019b, 1},
+ {0x000101d0, 0x000101fd, 1},
+ {0x00010280, 0x0001029c, 1},
+ {0x000102a0, 0x000102d0, 1},
+ {0x00010300, 0x0001031e, 1},
+ {0x00010320, 0x00010323, 1},
+ {0x00010330, 0x0001034a, 1},
+ {0x00010380, 0x0001039d, 1},
+ {0x0001039f, 0x000103c3, 1},
+ {0x000103c8, 0x000103d5, 1},
+ {0x00010400, 0x0001049d, 1},
+ {0x000104a0, 0x000104a9, 1},
+ {0x00010800, 0x00010805, 1},
+ {0x00010808, 0x0001080a, 2},
+ {0x0001080b, 0x00010835, 1},
+ {0x00010837, 0x00010838, 1},
+ {0x0001083c, 0x0001083f, 3},
+ {0x00010840, 0x00010855, 1},
+ {0x00010857, 0x0001085f, 1},
+ {0x00010900, 0x0001091b, 1},
+ {0x0001091f, 0x00010939, 1},
+ {0x0001093f, 0x00010a00, 193},
+ {0x00010a01, 0x00010a03, 1},
+ {0x00010a05, 0x00010a06, 1},
+ {0x00010a0c, 0x00010a13, 1},
+ {0x00010a15, 0x00010a17, 1},
+ {0x00010a19, 0x00010a33, 1},
+ {0x00010a38, 0x00010a3a, 1},
+ {0x00010a3f, 0x00010a47, 1},
+ {0x00010a50, 0x00010a58, 1},
+ {0x00010a60, 0x00010a7f, 1},
+ {0x00010b00, 0x00010b35, 1},
+ {0x00010b39, 0x00010b55, 1},
+ {0x00010b58, 0x00010b72, 1},
+ {0x00010b78, 0x00010b7f, 1},
+ {0x00010c00, 0x00010c48, 1},
+ {0x00010e60, 0x00010e7e, 1},
+ {0x00011080, 0x000110c1, 1},
+ {0x00012000, 0x0001236e, 1},
+ {0x00012400, 0x00012462, 1},
+ {0x00012470, 0x00012473, 1},
+ {0x00013000, 0x0001342e, 1},
+ {0x0001d000, 0x0001d0f5, 1},
+ {0x0001d100, 0x0001d126, 1},
+ {0x0001d129, 0x0001d1dd, 1},
+ {0x0001d200, 0x0001d245, 1},
+ {0x0001d300, 0x0001d356, 1},
+ {0x0001d360, 0x0001d371, 1},
+ {0x0001d400, 0x0001d454, 1},
+ {0x0001d456, 0x0001d49c, 1},
+ {0x0001d49e, 0x0001d49f, 1},
+ {0x0001d4a2, 0x0001d4a5, 3},
+ {0x0001d4a6, 0x0001d4a9, 3},
+ {0x0001d4aa, 0x0001d4ac, 1},
+ {0x0001d4ae, 0x0001d4b9, 1},
+ {0x0001d4bb, 0x0001d4bd, 2},
+ {0x0001d4be, 0x0001d4c3, 1},
+ {0x0001d4c5, 0x0001d505, 1},
+ {0x0001d507, 0x0001d50a, 1},
+ {0x0001d50d, 0x0001d514, 1},
+ {0x0001d516, 0x0001d51c, 1},
+ {0x0001d51e, 0x0001d539, 1},
+ {0x0001d53b, 0x0001d53e, 1},
+ {0x0001d540, 0x0001d544, 1},
+ {0x0001d546, 0x0001d54a, 4},
+ {0x0001d54b, 0x0001d550, 1},
+ {0x0001d552, 0x0001d6a5, 1},
+ {0x0001d6a8, 0x0001d7cb, 1},
+ {0x0001d7ce, 0x0001d7ff, 1},
+ {0x0001f000, 0x0001f02b, 1},
+ {0x0001f030, 0x0001f093, 1},
+ {0x0001f100, 0x0001f10a, 1},
+ {0x0001f110, 0x0001f12e, 1},
+ {0x0001f131, 0x0001f13d, 12},
+ {0x0001f13f, 0x0001f142, 3},
+ {0x0001f146, 0x0001f14a, 4},
+ {0x0001f14b, 0x0001f14e, 1},
+ {0x0001f157, 0x0001f15f, 8},
+ {0x0001f179, 0x0001f17b, 2},
+ {0x0001f17c, 0x0001f17f, 3},
+ {0x0001f18a, 0x0001f18d, 1},
+ {0x0001f190, 0x0001f200, 112},
+ {0x0001f210, 0x0001f231, 1},
+ {0x0001f240, 0x0001f248, 1},
+ {0x00020000, 0x0002a6d6, 1},
+ {0x0002a700, 0x0002b734, 1},
+ {0x0002f800, 0x0002fa1d, 1},
+ {0x000e0001, 0x000e0020, 31},
+ {0x000e0021, 0x000e007f, 1},
+ {0x000e0100, 0x000e01ef, 1},
+ {0x000f0000, 0x000ffffd, 1},
+ {0x00100000, 0x0010fffd, 1},
+ },
+ LatinOffset: 0,
+}
+
+// size 3026 bytes (2 KiB)
+var assigned5_0_0 = &unicode.RangeTable{
+ R16: []unicode.Range16{
+ {0x0000, 0x036f, 1},
+ {0x0374, 0x0375, 1},
+ {0x037a, 0x037e, 1},
+ {0x0384, 0x038a, 1},
+ {0x038c, 0x038e, 2},
+ {0x038f, 0x03a1, 1},
+ {0x03a3, 0x03ce, 1},
+ {0x03d0, 0x0486, 1},
+ {0x0488, 0x0513, 1},
+ {0x0531, 0x0556, 1},
+ {0x0559, 0x055f, 1},
+ {0x0561, 0x0587, 1},
+ {0x0589, 0x058a, 1},
+ {0x0591, 0x05c7, 1},
+ {0x05d0, 0x05ea, 1},
+ {0x05f0, 0x05f4, 1},
+ {0x0600, 0x0603, 1},
+ {0x060b, 0x0615, 1},
+ {0x061b, 0x061e, 3},
+ {0x061f, 0x0621, 2},
+ {0x0622, 0x063a, 1},
+ {0x0640, 0x065e, 1},
+ {0x0660, 0x070d, 1},
+ {0x070f, 0x074a, 1},
+ {0x074d, 0x076d, 1},
+ {0x0780, 0x07b1, 1},
+ {0x07c0, 0x07fa, 1},
+ {0x0901, 0x0939, 1},
+ {0x093c, 0x094d, 1},
+ {0x0950, 0x0954, 1},
+ {0x0958, 0x0970, 1},
+ {0x097b, 0x097f, 1},
+ {0x0981, 0x0983, 1},
+ {0x0985, 0x098c, 1},
+ {0x098f, 0x0990, 1},
+ {0x0993, 0x09a8, 1},
+ {0x09aa, 0x09b0, 1},
+ {0x09b2, 0x09b6, 4},
+ {0x09b7, 0x09b9, 1},
+ {0x09bc, 0x09c4, 1},
+ {0x09c7, 0x09c8, 1},
+ {0x09cb, 0x09ce, 1},
+ {0x09d7, 0x09dc, 5},
+ {0x09dd, 0x09df, 2},
+ {0x09e0, 0x09e3, 1},
+ {0x09e6, 0x09fa, 1},
+ {0x0a01, 0x0a03, 1},
+ {0x0a05, 0x0a0a, 1},
+ {0x0a0f, 0x0a10, 1},
+ {0x0a13, 0x0a28, 1},
+ {0x0a2a, 0x0a30, 1},
+ {0x0a32, 0x0a33, 1},
+ {0x0a35, 0x0a36, 1},
+ {0x0a38, 0x0a39, 1},
+ {0x0a3c, 0x0a3e, 2},
+ {0x0a3f, 0x0a42, 1},
+ {0x0a47, 0x0a48, 1},
+ {0x0a4b, 0x0a4d, 1},
+ {0x0a59, 0x0a5c, 1},
+ {0x0a5e, 0x0a66, 8},
+ {0x0a67, 0x0a74, 1},
+ {0x0a81, 0x0a83, 1},
+ {0x0a85, 0x0a8d, 1},
+ {0x0a8f, 0x0a91, 1},
+ {0x0a93, 0x0aa8, 1},
+ {0x0aaa, 0x0ab0, 1},
+ {0x0ab2, 0x0ab3, 1},
+ {0x0ab5, 0x0ab9, 1},
+ {0x0abc, 0x0ac5, 1},
+ {0x0ac7, 0x0ac9, 1},
+ {0x0acb, 0x0acd, 1},
+ {0x0ad0, 0x0ae0, 16},
+ {0x0ae1, 0x0ae3, 1},
+ {0x0ae6, 0x0aef, 1},
+ {0x0af1, 0x0b01, 16},
+ {0x0b02, 0x0b03, 1},
+ {0x0b05, 0x0b0c, 1},
+ {0x0b0f, 0x0b10, 1},
+ {0x0b13, 0x0b28, 1},
+ {0x0b2a, 0x0b30, 1},
+ {0x0b32, 0x0b33, 1},
+ {0x0b35, 0x0b39, 1},
+ {0x0b3c, 0x0b43, 1},
+ {0x0b47, 0x0b48, 1},
+ {0x0b4b, 0x0b4d, 1},
+ {0x0b56, 0x0b57, 1},
+ {0x0b5c, 0x0b5d, 1},
+ {0x0b5f, 0x0b61, 1},
+ {0x0b66, 0x0b71, 1},
+ {0x0b82, 0x0b83, 1},
+ {0x0b85, 0x0b8a, 1},
+ {0x0b8e, 0x0b90, 1},
+ {0x0b92, 0x0b95, 1},
+ {0x0b99, 0x0b9a, 1},
+ {0x0b9c, 0x0b9e, 2},
+ {0x0b9f, 0x0ba3, 4},
+ {0x0ba4, 0x0ba8, 4},
+ {0x0ba9, 0x0baa, 1},
+ {0x0bae, 0x0bb9, 1},
+ {0x0bbe, 0x0bc2, 1},
+ {0x0bc6, 0x0bc8, 1},
+ {0x0bca, 0x0bcd, 1},
+ {0x0bd7, 0x0be6, 15},
+ {0x0be7, 0x0bfa, 1},
+ {0x0c01, 0x0c03, 1},
+ {0x0c05, 0x0c0c, 1},
+ {0x0c0e, 0x0c10, 1},
+ {0x0c12, 0x0c28, 1},
+ {0x0c2a, 0x0c33, 1},
+ {0x0c35, 0x0c39, 1},
+ {0x0c3e, 0x0c44, 1},
+ {0x0c46, 0x0c48, 1},
+ {0x0c4a, 0x0c4d, 1},
+ {0x0c55, 0x0c56, 1},
+ {0x0c60, 0x0c61, 1},
+ {0x0c66, 0x0c6f, 1},
+ {0x0c82, 0x0c83, 1},
+ {0x0c85, 0x0c8c, 1},
+ {0x0c8e, 0x0c90, 1},
+ {0x0c92, 0x0ca8, 1},
+ {0x0caa, 0x0cb3, 1},
+ {0x0cb5, 0x0cb9, 1},
+ {0x0cbc, 0x0cc4, 1},
+ {0x0cc6, 0x0cc8, 1},
+ {0x0cca, 0x0ccd, 1},
+ {0x0cd5, 0x0cd6, 1},
+ {0x0cde, 0x0ce0, 2},
+ {0x0ce1, 0x0ce3, 1},
+ {0x0ce6, 0x0cef, 1},
+ {0x0cf1, 0x0cf2, 1},
+ {0x0d02, 0x0d03, 1},
+ {0x0d05, 0x0d0c, 1},
+ {0x0d0e, 0x0d10, 1},
+ {0x0d12, 0x0d28, 1},
+ {0x0d2a, 0x0d39, 1},
+ {0x0d3e, 0x0d43, 1},
+ {0x0d46, 0x0d48, 1},
+ {0x0d4a, 0x0d4d, 1},
+ {0x0d57, 0x0d60, 9},
+ {0x0d61, 0x0d66, 5},
+ {0x0d67, 0x0d6f, 1},
+ {0x0d82, 0x0d83, 1},
+ {0x0d85, 0x0d96, 1},
+ {0x0d9a, 0x0db1, 1},
+ {0x0db3, 0x0dbb, 1},
+ {0x0dbd, 0x0dc0, 3},
+ {0x0dc1, 0x0dc6, 1},
+ {0x0dca, 0x0dcf, 5},
+ {0x0dd0, 0x0dd4, 1},
+ {0x0dd6, 0x0dd8, 2},
+ {0x0dd9, 0x0ddf, 1},
+ {0x0df2, 0x0df4, 1},
+ {0x0e01, 0x0e3a, 1},
+ {0x0e3f, 0x0e5b, 1},
+ {0x0e81, 0x0e82, 1},
+ {0x0e84, 0x0e87, 3},
+ {0x0e88, 0x0e8a, 2},
+ {0x0e8d, 0x0e94, 7},
+ {0x0e95, 0x0e97, 1},
+ {0x0e99, 0x0e9f, 1},
+ {0x0ea1, 0x0ea3, 1},
+ {0x0ea5, 0x0ea7, 2},
+ {0x0eaa, 0x0eab, 1},
+ {0x0ead, 0x0eb9, 1},
+ {0x0ebb, 0x0ebd, 1},
+ {0x0ec0, 0x0ec4, 1},
+ {0x0ec6, 0x0ec8, 2},
+ {0x0ec9, 0x0ecd, 1},
+ {0x0ed0, 0x0ed9, 1},
+ {0x0edc, 0x0edd, 1},
+ {0x0f00, 0x0f47, 1},
+ {0x0f49, 0x0f6a, 1},
+ {0x0f71, 0x0f8b, 1},
+ {0x0f90, 0x0f97, 1},
+ {0x0f99, 0x0fbc, 1},
+ {0x0fbe, 0x0fcc, 1},
+ {0x0fcf, 0x0fd1, 1},
+ {0x1000, 0x1021, 1},
+ {0x1023, 0x1027, 1},
+ {0x1029, 0x102a, 1},
+ {0x102c, 0x1032, 1},
+ {0x1036, 0x1039, 1},
+ {0x1040, 0x1059, 1},
+ {0x10a0, 0x10c5, 1},
+ {0x10d0, 0x10fc, 1},
+ {0x1100, 0x1159, 1},
+ {0x115f, 0x11a2, 1},
+ {0x11a8, 0x11f9, 1},
+ {0x1200, 0x1248, 1},
+ {0x124a, 0x124d, 1},
+ {0x1250, 0x1256, 1},
+ {0x1258, 0x125a, 2},
+ {0x125b, 0x125d, 1},
+ {0x1260, 0x1288, 1},
+ {0x128a, 0x128d, 1},
+ {0x1290, 0x12b0, 1},
+ {0x12b2, 0x12b5, 1},
+ {0x12b8, 0x12be, 1},
+ {0x12c0, 0x12c2, 2},
+ {0x12c3, 0x12c5, 1},
+ {0x12c8, 0x12d6, 1},
+ {0x12d8, 0x1310, 1},
+ {0x1312, 0x1315, 1},
+ {0x1318, 0x135a, 1},
+ {0x135f, 0x137c, 1},
+ {0x1380, 0x1399, 1},
+ {0x13a0, 0x13f4, 1},
+ {0x1401, 0x1676, 1},
+ {0x1680, 0x169c, 1},
+ {0x16a0, 0x16f0, 1},
+ {0x1700, 0x170c, 1},
+ {0x170e, 0x1714, 1},
+ {0x1720, 0x1736, 1},
+ {0x1740, 0x1753, 1},
+ {0x1760, 0x176c, 1},
+ {0x176e, 0x1770, 1},
+ {0x1772, 0x1773, 1},
+ {0x1780, 0x17dd, 1},
+ {0x17e0, 0x17e9, 1},
+ {0x17f0, 0x17f9, 1},
+ {0x1800, 0x180e, 1},
+ {0x1810, 0x1819, 1},
+ {0x1820, 0x1877, 1},
+ {0x1880, 0x18a9, 1},
+ {0x1900, 0x191c, 1},
+ {0x1920, 0x192b, 1},
+ {0x1930, 0x193b, 1},
+ {0x1940, 0x1944, 4},
+ {0x1945, 0x196d, 1},
+ {0x1970, 0x1974, 1},
+ {0x1980, 0x19a9, 1},
+ {0x19b0, 0x19c9, 1},
+ {0x19d0, 0x19d9, 1},
+ {0x19de, 0x1a1b, 1},
+ {0x1a1e, 0x1a1f, 1},
+ {0x1b00, 0x1b4b, 1},
+ {0x1b50, 0x1b7c, 1},
+ {0x1d00, 0x1dca, 1},
+ {0x1dfe, 0x1e9b, 1},
+ {0x1ea0, 0x1ef9, 1},
+ {0x1f00, 0x1f15, 1},
+ {0x1f18, 0x1f1d, 1},
+ {0x1f20, 0x1f45, 1},
+ {0x1f48, 0x1f4d, 1},
+ {0x1f50, 0x1f57, 1},
+ {0x1f59, 0x1f5f, 2},
+ {0x1f60, 0x1f7d, 1},
+ {0x1f80, 0x1fb4, 1},
+ {0x1fb6, 0x1fc4, 1},
+ {0x1fc6, 0x1fd3, 1},
+ {0x1fd6, 0x1fdb, 1},
+ {0x1fdd, 0x1fef, 1},
+ {0x1ff2, 0x1ff4, 1},
+ {0x1ff6, 0x1ffe, 1},
+ {0x2000, 0x2063, 1},
+ {0x206a, 0x2071, 1},
+ {0x2074, 0x208e, 1},
+ {0x2090, 0x2094, 1},
+ {0x20a0, 0x20b5, 1},
+ {0x20d0, 0x20ef, 1},
+ {0x2100, 0x214e, 1},
+ {0x2153, 0x2184, 1},
+ {0x2190, 0x23e7, 1},
+ {0x2400, 0x2426, 1},
+ {0x2440, 0x244a, 1},
+ {0x2460, 0x269c, 1},
+ {0x26a0, 0x26b2, 1},
+ {0x2701, 0x2704, 1},
+ {0x2706, 0x2709, 1},
+ {0x270c, 0x2727, 1},
+ {0x2729, 0x274b, 1},
+ {0x274d, 0x274f, 2},
+ {0x2750, 0x2752, 1},
+ {0x2756, 0x2758, 2},
+ {0x2759, 0x275e, 1},
+ {0x2761, 0x2794, 1},
+ {0x2798, 0x27af, 1},
+ {0x27b1, 0x27be, 1},
+ {0x27c0, 0x27ca, 1},
+ {0x27d0, 0x27eb, 1},
+ {0x27f0, 0x2b1a, 1},
+ {0x2b20, 0x2b23, 1},
+ {0x2c00, 0x2c2e, 1},
+ {0x2c30, 0x2c5e, 1},
+ {0x2c60, 0x2c6c, 1},
+ {0x2c74, 0x2c77, 1},
+ {0x2c80, 0x2cea, 1},
+ {0x2cf9, 0x2d25, 1},
+ {0x2d30, 0x2d65, 1},
+ {0x2d6f, 0x2d80, 17},
+ {0x2d81, 0x2d96, 1},
+ {0x2da0, 0x2da6, 1},
+ {0x2da8, 0x2dae, 1},
+ {0x2db0, 0x2db6, 1},
+ {0x2db8, 0x2dbe, 1},
+ {0x2dc0, 0x2dc6, 1},
+ {0x2dc8, 0x2dce, 1},
+ {0x2dd0, 0x2dd6, 1},
+ {0x2dd8, 0x2dde, 1},
+ {0x2e00, 0x2e17, 1},
+ {0x2e1c, 0x2e1d, 1},
+ {0x2e80, 0x2e99, 1},
+ {0x2e9b, 0x2ef3, 1},
+ {0x2f00, 0x2fd5, 1},
+ {0x2ff0, 0x2ffb, 1},
+ {0x3000, 0x303f, 1},
+ {0x3041, 0x3096, 1},
+ {0x3099, 0x30ff, 1},
+ {0x3105, 0x312c, 1},
+ {0x3131, 0x318e, 1},
+ {0x3190, 0x31b7, 1},
+ {0x31c0, 0x31cf, 1},
+ {0x31f0, 0x321e, 1},
+ {0x3220, 0x3243, 1},
+ {0x3250, 0x32fe, 1},
+ {0x3300, 0x4db5, 1},
+ {0x4dc0, 0x9fbb, 1},
+ {0xa000, 0xa48c, 1},
+ {0xa490, 0xa4c6, 1},
+ {0xa700, 0xa71a, 1},
+ {0xa720, 0xa721, 1},
+ {0xa800, 0xa82b, 1},
+ {0xa840, 0xa877, 1},
+ {0xac00, 0xd7a3, 1},
+ {0xd800, 0xfa2d, 1},
+ {0xfa30, 0xfa6a, 1},
+ {0xfa70, 0xfad9, 1},
+ {0xfb00, 0xfb06, 1},
+ {0xfb13, 0xfb17, 1},
+ {0xfb1d, 0xfb36, 1},
+ {0xfb38, 0xfb3c, 1},
+ {0xfb3e, 0xfb40, 2},
+ {0xfb41, 0xfb43, 2},
+ {0xfb44, 0xfb46, 2},
+ {0xfb47, 0xfbb1, 1},
+ {0xfbd3, 0xfd3f, 1},
+ {0xfd50, 0xfd8f, 1},
+ {0xfd92, 0xfdc7, 1},
+ {0xfdf0, 0xfdfd, 1},
+ {0xfe00, 0xfe19, 1},
+ {0xfe20, 0xfe23, 1},
+ {0xfe30, 0xfe52, 1},
+ {0xfe54, 0xfe66, 1},
+ {0xfe68, 0xfe6b, 1},
+ {0xfe70, 0xfe74, 1},
+ {0xfe76, 0xfefc, 1},
+ {0xfeff, 0xff01, 2},
+ {0xff02, 0xffbe, 1},
+ {0xffc2, 0xffc7, 1},
+ {0xffca, 0xffcf, 1},
+ {0xffd2, 0xffd7, 1},
+ {0xffda, 0xffdc, 1},
+ {0xffe0, 0xffe6, 1},
+ {0xffe8, 0xffee, 1},
+ {0xfff9, 0xfffd, 1},
+ },
+ R32: []unicode.Range32{
+ {0x00010000, 0x0001000b, 1},
+ {0x0001000d, 0x00010026, 1},
+ {0x00010028, 0x0001003a, 1},
+ {0x0001003c, 0x0001003d, 1},
+ {0x0001003f, 0x0001004d, 1},
+ {0x00010050, 0x0001005d, 1},
+ {0x00010080, 0x000100fa, 1},
+ {0x00010100, 0x00010102, 1},
+ {0x00010107, 0x00010133, 1},
+ {0x00010137, 0x0001018a, 1},
+ {0x00010300, 0x0001031e, 1},
+ {0x00010320, 0x00010323, 1},
+ {0x00010330, 0x0001034a, 1},
+ {0x00010380, 0x0001039d, 1},
+ {0x0001039f, 0x000103c3, 1},
+ {0x000103c8, 0x000103d5, 1},
+ {0x00010400, 0x0001049d, 1},
+ {0x000104a0, 0x000104a9, 1},
+ {0x00010800, 0x00010805, 1},
+ {0x00010808, 0x0001080a, 2},
+ {0x0001080b, 0x00010835, 1},
+ {0x00010837, 0x00010838, 1},
+ {0x0001083c, 0x0001083f, 3},
+ {0x00010900, 0x00010919, 1},
+ {0x0001091f, 0x00010a00, 225},
+ {0x00010a01, 0x00010a03, 1},
+ {0x00010a05, 0x00010a06, 1},
+ {0x00010a0c, 0x00010a13, 1},
+ {0x00010a15, 0x00010a17, 1},
+ {0x00010a19, 0x00010a33, 1},
+ {0x00010a38, 0x00010a3a, 1},
+ {0x00010a3f, 0x00010a47, 1},
+ {0x00010a50, 0x00010a58, 1},
+ {0x00012000, 0x0001236e, 1},
+ {0x00012400, 0x00012462, 1},
+ {0x00012470, 0x00012473, 1},
+ {0x0001d000, 0x0001d0f5, 1},
+ {0x0001d100, 0x0001d126, 1},
+ {0x0001d12a, 0x0001d1dd, 1},
+ {0x0001d200, 0x0001d245, 1},
+ {0x0001d300, 0x0001d356, 1},
+ {0x0001d360, 0x0001d371, 1},
+ {0x0001d400, 0x0001d454, 1},
+ {0x0001d456, 0x0001d49c, 1},
+ {0x0001d49e, 0x0001d49f, 1},
+ {0x0001d4a2, 0x0001d4a5, 3},
+ {0x0001d4a6, 0x0001d4a9, 3},
+ {0x0001d4aa, 0x0001d4ac, 1},
+ {0x0001d4ae, 0x0001d4b9, 1},
+ {0x0001d4bb, 0x0001d4bd, 2},
+ {0x0001d4be, 0x0001d4c3, 1},
+ {0x0001d4c5, 0x0001d505, 1},
+ {0x0001d507, 0x0001d50a, 1},
+ {0x0001d50d, 0x0001d514, 1},
+ {0x0001d516, 0x0001d51c, 1},
+ {0x0001d51e, 0x0001d539, 1},
+ {0x0001d53b, 0x0001d53e, 1},
+ {0x0001d540, 0x0001d544, 1},
+ {0x0001d546, 0x0001d54a, 4},
+ {0x0001d54b, 0x0001d550, 1},
+ {0x0001d552, 0x0001d6a5, 1},
+ {0x0001d6a8, 0x0001d7cb, 1},
+ {0x0001d7ce, 0x0001d7ff, 1},
+ {0x00020000, 0x0002a6d6, 1},
+ {0x0002f800, 0x0002fa1d, 1},
+ {0x000e0001, 0x000e0020, 31},
+ {0x000e0021, 0x000e007f, 1},
+ {0x000e0100, 0x000e01ef, 1},
+ {0x000f0000, 0x000ffffd, 1},
+ {0x00100000, 0x0010fffd, 1},
+ },
+ LatinOffset: 0,
+}
+
+// size 4160 bytes (4 KiB)
+var assigned6_1_0 = &unicode.RangeTable{
+ R16: []unicode.Range16{
+ {0x0000, 0x0377, 1},
+ {0x037a, 0x037e, 1},
+ {0x0384, 0x038a, 1},
+ {0x038c, 0x038e, 2},
+ {0x038f, 0x03a1, 1},
+ {0x03a3, 0x0527, 1},
+ {0x0531, 0x0556, 1},
+ {0x0559, 0x055f, 1},
+ {0x0561, 0x0587, 1},
+ {0x0589, 0x058a, 1},
+ {0x058f, 0x0591, 2},
+ {0x0592, 0x05c7, 1},
+ {0x05d0, 0x05ea, 1},
+ {0x05f0, 0x05f4, 1},
+ {0x0600, 0x0604, 1},
+ {0x0606, 0x061b, 1},
+ {0x061e, 0x070d, 1},
+ {0x070f, 0x074a, 1},
+ {0x074d, 0x07b1, 1},
+ {0x07c0, 0x07fa, 1},
+ {0x0800, 0x082d, 1},
+ {0x0830, 0x083e, 1},
+ {0x0840, 0x085b, 1},
+ {0x085e, 0x08a0, 66},
+ {0x08a2, 0x08ac, 1},
+ {0x08e4, 0x08fe, 1},
+ {0x0900, 0x0977, 1},
+ {0x0979, 0x097f, 1},
+ {0x0981, 0x0983, 1},
+ {0x0985, 0x098c, 1},
+ {0x098f, 0x0990, 1},
+ {0x0993, 0x09a8, 1},
+ {0x09aa, 0x09b0, 1},
+ {0x09b2, 0x09b6, 4},
+ {0x09b7, 0x09b9, 1},
+ {0x09bc, 0x09c4, 1},
+ {0x09c7, 0x09c8, 1},
+ {0x09cb, 0x09ce, 1},
+ {0x09d7, 0x09dc, 5},
+ {0x09dd, 0x09df, 2},
+ {0x09e0, 0x09e3, 1},
+ {0x09e6, 0x09fb, 1},
+ {0x0a01, 0x0a03, 1},
+ {0x0a05, 0x0a0a, 1},
+ {0x0a0f, 0x0a10, 1},
+ {0x0a13, 0x0a28, 1},
+ {0x0a2a, 0x0a30, 1},
+ {0x0a32, 0x0a33, 1},
+ {0x0a35, 0x0a36, 1},
+ {0x0a38, 0x0a39, 1},
+ {0x0a3c, 0x0a3e, 2},
+ {0x0a3f, 0x0a42, 1},
+ {0x0a47, 0x0a48, 1},
+ {0x0a4b, 0x0a4d, 1},
+ {0x0a51, 0x0a59, 8},
+ {0x0a5a, 0x0a5c, 1},
+ {0x0a5e, 0x0a66, 8},
+ {0x0a67, 0x0a75, 1},
+ {0x0a81, 0x0a83, 1},
+ {0x0a85, 0x0a8d, 1},
+ {0x0a8f, 0x0a91, 1},
+ {0x0a93, 0x0aa8, 1},
+ {0x0aaa, 0x0ab0, 1},
+ {0x0ab2, 0x0ab3, 1},
+ {0x0ab5, 0x0ab9, 1},
+ {0x0abc, 0x0ac5, 1},
+ {0x0ac7, 0x0ac9, 1},
+ {0x0acb, 0x0acd, 1},
+ {0x0ad0, 0x0ae0, 16},
+ {0x0ae1, 0x0ae3, 1},
+ {0x0ae6, 0x0af1, 1},
+ {0x0b01, 0x0b03, 1},
+ {0x0b05, 0x0b0c, 1},
+ {0x0b0f, 0x0b10, 1},
+ {0x0b13, 0x0b28, 1},
+ {0x0b2a, 0x0b30, 1},
+ {0x0b32, 0x0b33, 1},
+ {0x0b35, 0x0b39, 1},
+ {0x0b3c, 0x0b44, 1},
+ {0x0b47, 0x0b48, 1},
+ {0x0b4b, 0x0b4d, 1},
+ {0x0b56, 0x0b57, 1},
+ {0x0b5c, 0x0b5d, 1},
+ {0x0b5f, 0x0b63, 1},
+ {0x0b66, 0x0b77, 1},
+ {0x0b82, 0x0b83, 1},
+ {0x0b85, 0x0b8a, 1},
+ {0x0b8e, 0x0b90, 1},
+ {0x0b92, 0x0b95, 1},
+ {0x0b99, 0x0b9a, 1},
+ {0x0b9c, 0x0b9e, 2},
+ {0x0b9f, 0x0ba3, 4},
+ {0x0ba4, 0x0ba8, 4},
+ {0x0ba9, 0x0baa, 1},
+ {0x0bae, 0x0bb9, 1},
+ {0x0bbe, 0x0bc2, 1},
+ {0x0bc6, 0x0bc8, 1},
+ {0x0bca, 0x0bcd, 1},
+ {0x0bd0, 0x0bd7, 7},
+ {0x0be6, 0x0bfa, 1},
+ {0x0c01, 0x0c03, 1},
+ {0x0c05, 0x0c0c, 1},
+ {0x0c0e, 0x0c10, 1},
+ {0x0c12, 0x0c28, 1},
+ {0x0c2a, 0x0c33, 1},
+ {0x0c35, 0x0c39, 1},
+ {0x0c3d, 0x0c44, 1},
+ {0x0c46, 0x0c48, 1},
+ {0x0c4a, 0x0c4d, 1},
+ {0x0c55, 0x0c56, 1},
+ {0x0c58, 0x0c59, 1},
+ {0x0c60, 0x0c63, 1},
+ {0x0c66, 0x0c6f, 1},
+ {0x0c78, 0x0c7f, 1},
+ {0x0c82, 0x0c83, 1},
+ {0x0c85, 0x0c8c, 1},
+ {0x0c8e, 0x0c90, 1},
+ {0x0c92, 0x0ca8, 1},
+ {0x0caa, 0x0cb3, 1},
+ {0x0cb5, 0x0cb9, 1},
+ {0x0cbc, 0x0cc4, 1},
+ {0x0cc6, 0x0cc8, 1},
+ {0x0cca, 0x0ccd, 1},
+ {0x0cd5, 0x0cd6, 1},
+ {0x0cde, 0x0ce0, 2},
+ {0x0ce1, 0x0ce3, 1},
+ {0x0ce6, 0x0cef, 1},
+ {0x0cf1, 0x0cf2, 1},
+ {0x0d02, 0x0d03, 1},
+ {0x0d05, 0x0d0c, 1},
+ {0x0d0e, 0x0d10, 1},
+ {0x0d12, 0x0d3a, 1},
+ {0x0d3d, 0x0d44, 1},
+ {0x0d46, 0x0d48, 1},
+ {0x0d4a, 0x0d4e, 1},
+ {0x0d57, 0x0d60, 9},
+ {0x0d61, 0x0d63, 1},
+ {0x0d66, 0x0d75, 1},
+ {0x0d79, 0x0d7f, 1},
+ {0x0d82, 0x0d83, 1},
+ {0x0d85, 0x0d96, 1},
+ {0x0d9a, 0x0db1, 1},
+ {0x0db3, 0x0dbb, 1},
+ {0x0dbd, 0x0dc0, 3},
+ {0x0dc1, 0x0dc6, 1},
+ {0x0dca, 0x0dcf, 5},
+ {0x0dd0, 0x0dd4, 1},
+ {0x0dd6, 0x0dd8, 2},
+ {0x0dd9, 0x0ddf, 1},
+ {0x0df2, 0x0df4, 1},
+ {0x0e01, 0x0e3a, 1},
+ {0x0e3f, 0x0e5b, 1},
+ {0x0e81, 0x0e82, 1},
+ {0x0e84, 0x0e87, 3},
+ {0x0e88, 0x0e8a, 2},
+ {0x0e8d, 0x0e94, 7},
+ {0x0e95, 0x0e97, 1},
+ {0x0e99, 0x0e9f, 1},
+ {0x0ea1, 0x0ea3, 1},
+ {0x0ea5, 0x0ea7, 2},
+ {0x0eaa, 0x0eab, 1},
+ {0x0ead, 0x0eb9, 1},
+ {0x0ebb, 0x0ebd, 1},
+ {0x0ec0, 0x0ec4, 1},
+ {0x0ec6, 0x0ec8, 2},
+ {0x0ec9, 0x0ecd, 1},
+ {0x0ed0, 0x0ed9, 1},
+ {0x0edc, 0x0edf, 1},
+ {0x0f00, 0x0f47, 1},
+ {0x0f49, 0x0f6c, 1},
+ {0x0f71, 0x0f97, 1},
+ {0x0f99, 0x0fbc, 1},
+ {0x0fbe, 0x0fcc, 1},
+ {0x0fce, 0x0fda, 1},
+ {0x1000, 0x10c5, 1},
+ {0x10c7, 0x10cd, 6},
+ {0x10d0, 0x1248, 1},
+ {0x124a, 0x124d, 1},
+ {0x1250, 0x1256, 1},
+ {0x1258, 0x125a, 2},
+ {0x125b, 0x125d, 1},
+ {0x1260, 0x1288, 1},
+ {0x128a, 0x128d, 1},
+ {0x1290, 0x12b0, 1},
+ {0x12b2, 0x12b5, 1},
+ {0x12b8, 0x12be, 1},
+ {0x12c0, 0x12c2, 2},
+ {0x12c3, 0x12c5, 1},
+ {0x12c8, 0x12d6, 1},
+ {0x12d8, 0x1310, 1},
+ {0x1312, 0x1315, 1},
+ {0x1318, 0x135a, 1},
+ {0x135d, 0x137c, 1},
+ {0x1380, 0x1399, 1},
+ {0x13a0, 0x13f4, 1},
+ {0x1400, 0x169c, 1},
+ {0x16a0, 0x16f0, 1},
+ {0x1700, 0x170c, 1},
+ {0x170e, 0x1714, 1},
+ {0x1720, 0x1736, 1},
+ {0x1740, 0x1753, 1},
+ {0x1760, 0x176c, 1},
+ {0x176e, 0x1770, 1},
+ {0x1772, 0x1773, 1},
+ {0x1780, 0x17dd, 1},
+ {0x17e0, 0x17e9, 1},
+ {0x17f0, 0x17f9, 1},
+ {0x1800, 0x180e, 1},
+ {0x1810, 0x1819, 1},
+ {0x1820, 0x1877, 1},
+ {0x1880, 0x18aa, 1},
+ {0x18b0, 0x18f5, 1},
+ {0x1900, 0x191c, 1},
+ {0x1920, 0x192b, 1},
+ {0x1930, 0x193b, 1},
+ {0x1940, 0x1944, 4},
+ {0x1945, 0x196d, 1},
+ {0x1970, 0x1974, 1},
+ {0x1980, 0x19ab, 1},
+ {0x19b0, 0x19c9, 1},
+ {0x19d0, 0x19da, 1},
+ {0x19de, 0x1a1b, 1},
+ {0x1a1e, 0x1a5e, 1},
+ {0x1a60, 0x1a7c, 1},
+ {0x1a7f, 0x1a89, 1},
+ {0x1a90, 0x1a99, 1},
+ {0x1aa0, 0x1aad, 1},
+ {0x1b00, 0x1b4b, 1},
+ {0x1b50, 0x1b7c, 1},
+ {0x1b80, 0x1bf3, 1},
+ {0x1bfc, 0x1c37, 1},
+ {0x1c3b, 0x1c49, 1},
+ {0x1c4d, 0x1c7f, 1},
+ {0x1cc0, 0x1cc7, 1},
+ {0x1cd0, 0x1cf6, 1},
+ {0x1d00, 0x1de6, 1},
+ {0x1dfc, 0x1f15, 1},
+ {0x1f18, 0x1f1d, 1},
+ {0x1f20, 0x1f45, 1},
+ {0x1f48, 0x1f4d, 1},
+ {0x1f50, 0x1f57, 1},
+ {0x1f59, 0x1f5f, 2},
+ {0x1f60, 0x1f7d, 1},
+ {0x1f80, 0x1fb4, 1},
+ {0x1fb6, 0x1fc4, 1},
+ {0x1fc6, 0x1fd3, 1},
+ {0x1fd6, 0x1fdb, 1},
+ {0x1fdd, 0x1fef, 1},
+ {0x1ff2, 0x1ff4, 1},
+ {0x1ff6, 0x1ffe, 1},
+ {0x2000, 0x2064, 1},
+ {0x206a, 0x2071, 1},
+ {0x2074, 0x208e, 1},
+ {0x2090, 0x209c, 1},
+ {0x20a0, 0x20b9, 1},
+ {0x20d0, 0x20f0, 1},
+ {0x2100, 0x2189, 1},
+ {0x2190, 0x23f3, 1},
+ {0x2400, 0x2426, 1},
+ {0x2440, 0x244a, 1},
+ {0x2460, 0x26ff, 1},
+ {0x2701, 0x2b4c, 1},
+ {0x2b50, 0x2b59, 1},
+ {0x2c00, 0x2c2e, 1},
+ {0x2c30, 0x2c5e, 1},
+ {0x2c60, 0x2cf3, 1},
+ {0x2cf9, 0x2d25, 1},
+ {0x2d27, 0x2d2d, 6},
+ {0x2d30, 0x2d67, 1},
+ {0x2d6f, 0x2d70, 1},
+ {0x2d7f, 0x2d96, 1},
+ {0x2da0, 0x2da6, 1},
+ {0x2da8, 0x2dae, 1},
+ {0x2db0, 0x2db6, 1},
+ {0x2db8, 0x2dbe, 1},
+ {0x2dc0, 0x2dc6, 1},
+ {0x2dc8, 0x2dce, 1},
+ {0x2dd0, 0x2dd6, 1},
+ {0x2dd8, 0x2dde, 1},
+ {0x2de0, 0x2e3b, 1},
+ {0x2e80, 0x2e99, 1},
+ {0x2e9b, 0x2ef3, 1},
+ {0x2f00, 0x2fd5, 1},
+ {0x2ff0, 0x2ffb, 1},
+ {0x3000, 0x303f, 1},
+ {0x3041, 0x3096, 1},
+ {0x3099, 0x30ff, 1},
+ {0x3105, 0x312d, 1},
+ {0x3131, 0x318e, 1},
+ {0x3190, 0x31ba, 1},
+ {0x31c0, 0x31e3, 1},
+ {0x31f0, 0x321e, 1},
+ {0x3220, 0x32fe, 1},
+ {0x3300, 0x4db5, 1},
+ {0x4dc0, 0x9fcc, 1},
+ {0xa000, 0xa48c, 1},
+ {0xa490, 0xa4c6, 1},
+ {0xa4d0, 0xa62b, 1},
+ {0xa640, 0xa697, 1},
+ {0xa69f, 0xa6f7, 1},
+ {0xa700, 0xa78e, 1},
+ {0xa790, 0xa793, 1},
+ {0xa7a0, 0xa7aa, 1},
+ {0xa7f8, 0xa82b, 1},
+ {0xa830, 0xa839, 1},
+ {0xa840, 0xa877, 1},
+ {0xa880, 0xa8c4, 1},
+ {0xa8ce, 0xa8d9, 1},
+ {0xa8e0, 0xa8fb, 1},
+ {0xa900, 0xa953, 1},
+ {0xa95f, 0xa97c, 1},
+ {0xa980, 0xa9cd, 1},
+ {0xa9cf, 0xa9d9, 1},
+ {0xa9de, 0xa9df, 1},
+ {0xaa00, 0xaa36, 1},
+ {0xaa40, 0xaa4d, 1},
+ {0xaa50, 0xaa59, 1},
+ {0xaa5c, 0xaa7b, 1},
+ {0xaa80, 0xaac2, 1},
+ {0xaadb, 0xaaf6, 1},
+ {0xab01, 0xab06, 1},
+ {0xab09, 0xab0e, 1},
+ {0xab11, 0xab16, 1},
+ {0xab20, 0xab26, 1},
+ {0xab28, 0xab2e, 1},
+ {0xabc0, 0xabed, 1},
+ {0xabf0, 0xabf9, 1},
+ {0xac00, 0xd7a3, 1},
+ {0xd7b0, 0xd7c6, 1},
+ {0xd7cb, 0xd7fb, 1},
+ {0xd800, 0xfa6d, 1},
+ {0xfa70, 0xfad9, 1},
+ {0xfb00, 0xfb06, 1},
+ {0xfb13, 0xfb17, 1},
+ {0xfb1d, 0xfb36, 1},
+ {0xfb38, 0xfb3c, 1},
+ {0xfb3e, 0xfb40, 2},
+ {0xfb41, 0xfb43, 2},
+ {0xfb44, 0xfb46, 2},
+ {0xfb47, 0xfbc1, 1},
+ {0xfbd3, 0xfd3f, 1},
+ {0xfd50, 0xfd8f, 1},
+ {0xfd92, 0xfdc7, 1},
+ {0xfdf0, 0xfdfd, 1},
+ {0xfe00, 0xfe19, 1},
+ {0xfe20, 0xfe26, 1},
+ {0xfe30, 0xfe52, 1},
+ {0xfe54, 0xfe66, 1},
+ {0xfe68, 0xfe6b, 1},
+ {0xfe70, 0xfe74, 1},
+ {0xfe76, 0xfefc, 1},
+ {0xfeff, 0xff01, 2},
+ {0xff02, 0xffbe, 1},
+ {0xffc2, 0xffc7, 1},
+ {0xffca, 0xffcf, 1},
+ {0xffd2, 0xffd7, 1},
+ {0xffda, 0xffdc, 1},
+ {0xffe0, 0xffe6, 1},
+ {0xffe8, 0xffee, 1},
+ {0xfff9, 0xfffd, 1},
+ },
+ R32: []unicode.Range32{
+ {0x00010000, 0x0001000b, 1},
+ {0x0001000d, 0x00010026, 1},
+ {0x00010028, 0x0001003a, 1},
+ {0x0001003c, 0x0001003d, 1},
+ {0x0001003f, 0x0001004d, 1},
+ {0x00010050, 0x0001005d, 1},
+ {0x00010080, 0x000100fa, 1},
+ {0x00010100, 0x00010102, 1},
+ {0x00010107, 0x00010133, 1},
+ {0x00010137, 0x0001018a, 1},
+ {0x00010190, 0x0001019b, 1},
+ {0x000101d0, 0x000101fd, 1},
+ {0x00010280, 0x0001029c, 1},
+ {0x000102a0, 0x000102d0, 1},
+ {0x00010300, 0x0001031e, 1},
+ {0x00010320, 0x00010323, 1},
+ {0x00010330, 0x0001034a, 1},
+ {0x00010380, 0x0001039d, 1},
+ {0x0001039f, 0x000103c3, 1},
+ {0x000103c8, 0x000103d5, 1},
+ {0x00010400, 0x0001049d, 1},
+ {0x000104a0, 0x000104a9, 1},
+ {0x00010800, 0x00010805, 1},
+ {0x00010808, 0x0001080a, 2},
+ {0x0001080b, 0x00010835, 1},
+ {0x00010837, 0x00010838, 1},
+ {0x0001083c, 0x0001083f, 3},
+ {0x00010840, 0x00010855, 1},
+ {0x00010857, 0x0001085f, 1},
+ {0x00010900, 0x0001091b, 1},
+ {0x0001091f, 0x00010939, 1},
+ {0x0001093f, 0x00010980, 65},
+ {0x00010981, 0x000109b7, 1},
+ {0x000109be, 0x000109bf, 1},
+ {0x00010a00, 0x00010a03, 1},
+ {0x00010a05, 0x00010a06, 1},
+ {0x00010a0c, 0x00010a13, 1},
+ {0x00010a15, 0x00010a17, 1},
+ {0x00010a19, 0x00010a33, 1},
+ {0x00010a38, 0x00010a3a, 1},
+ {0x00010a3f, 0x00010a47, 1},
+ {0x00010a50, 0x00010a58, 1},
+ {0x00010a60, 0x00010a7f, 1},
+ {0x00010b00, 0x00010b35, 1},
+ {0x00010b39, 0x00010b55, 1},
+ {0x00010b58, 0x00010b72, 1},
+ {0x00010b78, 0x00010b7f, 1},
+ {0x00010c00, 0x00010c48, 1},
+ {0x00010e60, 0x00010e7e, 1},
+ {0x00011000, 0x0001104d, 1},
+ {0x00011052, 0x0001106f, 1},
+ {0x00011080, 0x000110c1, 1},
+ {0x000110d0, 0x000110e8, 1},
+ {0x000110f0, 0x000110f9, 1},
+ {0x00011100, 0x00011134, 1},
+ {0x00011136, 0x00011143, 1},
+ {0x00011180, 0x000111c8, 1},
+ {0x000111d0, 0x000111d9, 1},
+ {0x00011680, 0x000116b7, 1},
+ {0x000116c0, 0x000116c9, 1},
+ {0x00012000, 0x0001236e, 1},
+ {0x00012400, 0x00012462, 1},
+ {0x00012470, 0x00012473, 1},
+ {0x00013000, 0x0001342e, 1},
+ {0x00016800, 0x00016a38, 1},
+ {0x00016f00, 0x00016f44, 1},
+ {0x00016f50, 0x00016f7e, 1},
+ {0x00016f8f, 0x00016f9f, 1},
+ {0x0001b000, 0x0001b001, 1},
+ {0x0001d000, 0x0001d0f5, 1},
+ {0x0001d100, 0x0001d126, 1},
+ {0x0001d129, 0x0001d1dd, 1},
+ {0x0001d200, 0x0001d245, 1},
+ {0x0001d300, 0x0001d356, 1},
+ {0x0001d360, 0x0001d371, 1},
+ {0x0001d400, 0x0001d454, 1},
+ {0x0001d456, 0x0001d49c, 1},
+ {0x0001d49e, 0x0001d49f, 1},
+ {0x0001d4a2, 0x0001d4a5, 3},
+ {0x0001d4a6, 0x0001d4a9, 3},
+ {0x0001d4aa, 0x0001d4ac, 1},
+ {0x0001d4ae, 0x0001d4b9, 1},
+ {0x0001d4bb, 0x0001d4bd, 2},
+ {0x0001d4be, 0x0001d4c3, 1},
+ {0x0001d4c5, 0x0001d505, 1},
+ {0x0001d507, 0x0001d50a, 1},
+ {0x0001d50d, 0x0001d514, 1},
+ {0x0001d516, 0x0001d51c, 1},
+ {0x0001d51e, 0x0001d539, 1},
+ {0x0001d53b, 0x0001d53e, 1},
+ {0x0001d540, 0x0001d544, 1},
+ {0x0001d546, 0x0001d54a, 4},
+ {0x0001d54b, 0x0001d550, 1},
+ {0x0001d552, 0x0001d6a5, 1},
+ {0x0001d6a8, 0x0001d7cb, 1},
+ {0x0001d7ce, 0x0001d7ff, 1},
+ {0x0001ee00, 0x0001ee03, 1},
+ {0x0001ee05, 0x0001ee1f, 1},
+ {0x0001ee21, 0x0001ee22, 1},
+ {0x0001ee24, 0x0001ee27, 3},
+ {0x0001ee29, 0x0001ee32, 1},
+ {0x0001ee34, 0x0001ee37, 1},
+ {0x0001ee39, 0x0001ee3b, 2},
+ {0x0001ee42, 0x0001ee47, 5},
+ {0x0001ee49, 0x0001ee4d, 2},
+ {0x0001ee4e, 0x0001ee4f, 1},
+ {0x0001ee51, 0x0001ee52, 1},
+ {0x0001ee54, 0x0001ee57, 3},
+ {0x0001ee59, 0x0001ee61, 2},
+ {0x0001ee62, 0x0001ee64, 2},
+ {0x0001ee67, 0x0001ee6a, 1},
+ {0x0001ee6c, 0x0001ee72, 1},
+ {0x0001ee74, 0x0001ee77, 1},
+ {0x0001ee79, 0x0001ee7c, 1},
+ {0x0001ee7e, 0x0001ee80, 2},
+ {0x0001ee81, 0x0001ee89, 1},
+ {0x0001ee8b, 0x0001ee9b, 1},
+ {0x0001eea1, 0x0001eea3, 1},
+ {0x0001eea5, 0x0001eea9, 1},
+ {0x0001eeab, 0x0001eebb, 1},
+ {0x0001eef0, 0x0001eef1, 1},
+ {0x0001f000, 0x0001f02b, 1},
+ {0x0001f030, 0x0001f093, 1},
+ {0x0001f0a0, 0x0001f0ae, 1},
+ {0x0001f0b1, 0x0001f0be, 1},
+ {0x0001f0c1, 0x0001f0cf, 1},
+ {0x0001f0d1, 0x0001f0df, 1},
+ {0x0001f100, 0x0001f10a, 1},
+ {0x0001f110, 0x0001f12e, 1},
+ {0x0001f130, 0x0001f16b, 1},
+ {0x0001f170, 0x0001f19a, 1},
+ {0x0001f1e6, 0x0001f202, 1},
+ {0x0001f210, 0x0001f23a, 1},
+ {0x0001f240, 0x0001f248, 1},
+ {0x0001f250, 0x0001f251, 1},
+ {0x0001f300, 0x0001f320, 1},
+ {0x0001f330, 0x0001f335, 1},
+ {0x0001f337, 0x0001f37c, 1},
+ {0x0001f380, 0x0001f393, 1},
+ {0x0001f3a0, 0x0001f3c4, 1},
+ {0x0001f3c6, 0x0001f3ca, 1},
+ {0x0001f3e0, 0x0001f3f0, 1},
+ {0x0001f400, 0x0001f43e, 1},
+ {0x0001f440, 0x0001f442, 2},
+ {0x0001f443, 0x0001f4f7, 1},
+ {0x0001f4f9, 0x0001f4fc, 1},
+ {0x0001f500, 0x0001f53d, 1},
+ {0x0001f540, 0x0001f543, 1},
+ {0x0001f550, 0x0001f567, 1},
+ {0x0001f5fb, 0x0001f640, 1},
+ {0x0001f645, 0x0001f64f, 1},
+ {0x0001f680, 0x0001f6c5, 1},
+ {0x0001f700, 0x0001f773, 1},
+ {0x00020000, 0x0002a6d6, 1},
+ {0x0002a700, 0x0002b734, 1},
+ {0x0002b740, 0x0002b81d, 1},
+ {0x0002f800, 0x0002fa1d, 1},
+ {0x000e0001, 0x000e0020, 31},
+ {0x000e0021, 0x000e007f, 1},
+ {0x000e0100, 0x000e01ef, 1},
+ {0x000f0000, 0x000ffffd, 1},
+ {0x00100000, 0x0010fffd, 1},
+ },
+ LatinOffset: 0,
+}
+
+// size 4160 bytes (4 KiB)
+var assigned6_2_0 = &unicode.RangeTable{
+ R16: []unicode.Range16{
+ {0x0000, 0x0377, 1},
+ {0x037a, 0x037e, 1},
+ {0x0384, 0x038a, 1},
+ {0x038c, 0x038e, 2},
+ {0x038f, 0x03a1, 1},
+ {0x03a3, 0x0527, 1},
+ {0x0531, 0x0556, 1},
+ {0x0559, 0x055f, 1},
+ {0x0561, 0x0587, 1},
+ {0x0589, 0x058a, 1},
+ {0x058f, 0x0591, 2},
+ {0x0592, 0x05c7, 1},
+ {0x05d0, 0x05ea, 1},
+ {0x05f0, 0x05f4, 1},
+ {0x0600, 0x0604, 1},
+ {0x0606, 0x061b, 1},
+ {0x061e, 0x070d, 1},
+ {0x070f, 0x074a, 1},
+ {0x074d, 0x07b1, 1},
+ {0x07c0, 0x07fa, 1},
+ {0x0800, 0x082d, 1},
+ {0x0830, 0x083e, 1},
+ {0x0840, 0x085b, 1},
+ {0x085e, 0x08a0, 66},
+ {0x08a2, 0x08ac, 1},
+ {0x08e4, 0x08fe, 1},
+ {0x0900, 0x0977, 1},
+ {0x0979, 0x097f, 1},
+ {0x0981, 0x0983, 1},
+ {0x0985, 0x098c, 1},
+ {0x098f, 0x0990, 1},
+ {0x0993, 0x09a8, 1},
+ {0x09aa, 0x09b0, 1},
+ {0x09b2, 0x09b6, 4},
+ {0x09b7, 0x09b9, 1},
+ {0x09bc, 0x09c4, 1},
+ {0x09c7, 0x09c8, 1},
+ {0x09cb, 0x09ce, 1},
+ {0x09d7, 0x09dc, 5},
+ {0x09dd, 0x09df, 2},
+ {0x09e0, 0x09e3, 1},
+ {0x09e6, 0x09fb, 1},
+ {0x0a01, 0x0a03, 1},
+ {0x0a05, 0x0a0a, 1},
+ {0x0a0f, 0x0a10, 1},
+ {0x0a13, 0x0a28, 1},
+ {0x0a2a, 0x0a30, 1},
+ {0x0a32, 0x0a33, 1},
+ {0x0a35, 0x0a36, 1},
+ {0x0a38, 0x0a39, 1},
+ {0x0a3c, 0x0a3e, 2},
+ {0x0a3f, 0x0a42, 1},
+ {0x0a47, 0x0a48, 1},
+ {0x0a4b, 0x0a4d, 1},
+ {0x0a51, 0x0a59, 8},
+ {0x0a5a, 0x0a5c, 1},
+ {0x0a5e, 0x0a66, 8},
+ {0x0a67, 0x0a75, 1},
+ {0x0a81, 0x0a83, 1},
+ {0x0a85, 0x0a8d, 1},
+ {0x0a8f, 0x0a91, 1},
+ {0x0a93, 0x0aa8, 1},
+ {0x0aaa, 0x0ab0, 1},
+ {0x0ab2, 0x0ab3, 1},
+ {0x0ab5, 0x0ab9, 1},
+ {0x0abc, 0x0ac5, 1},
+ {0x0ac7, 0x0ac9, 1},
+ {0x0acb, 0x0acd, 1},
+ {0x0ad0, 0x0ae0, 16},
+ {0x0ae1, 0x0ae3, 1},
+ {0x0ae6, 0x0af1, 1},
+ {0x0b01, 0x0b03, 1},
+ {0x0b05, 0x0b0c, 1},
+ {0x0b0f, 0x0b10, 1},
+ {0x0b13, 0x0b28, 1},
+ {0x0b2a, 0x0b30, 1},
+ {0x0b32, 0x0b33, 1},
+ {0x0b35, 0x0b39, 1},
+ {0x0b3c, 0x0b44, 1},
+ {0x0b47, 0x0b48, 1},
+ {0x0b4b, 0x0b4d, 1},
+ {0x0b56, 0x0b57, 1},
+ {0x0b5c, 0x0b5d, 1},
+ {0x0b5f, 0x0b63, 1},
+ {0x0b66, 0x0b77, 1},
+ {0x0b82, 0x0b83, 1},
+ {0x0b85, 0x0b8a, 1},
+ {0x0b8e, 0x0b90, 1},
+ {0x0b92, 0x0b95, 1},
+ {0x0b99, 0x0b9a, 1},
+ {0x0b9c, 0x0b9e, 2},
+ {0x0b9f, 0x0ba3, 4},
+ {0x0ba4, 0x0ba8, 4},
+ {0x0ba9, 0x0baa, 1},
+ {0x0bae, 0x0bb9, 1},
+ {0x0bbe, 0x0bc2, 1},
+ {0x0bc6, 0x0bc8, 1},
+ {0x0bca, 0x0bcd, 1},
+ {0x0bd0, 0x0bd7, 7},
+ {0x0be6, 0x0bfa, 1},
+ {0x0c01, 0x0c03, 1},
+ {0x0c05, 0x0c0c, 1},
+ {0x0c0e, 0x0c10, 1},
+ {0x0c12, 0x0c28, 1},
+ {0x0c2a, 0x0c33, 1},
+ {0x0c35, 0x0c39, 1},
+ {0x0c3d, 0x0c44, 1},
+ {0x0c46, 0x0c48, 1},
+ {0x0c4a, 0x0c4d, 1},
+ {0x0c55, 0x0c56, 1},
+ {0x0c58, 0x0c59, 1},
+ {0x0c60, 0x0c63, 1},
+ {0x0c66, 0x0c6f, 1},
+ {0x0c78, 0x0c7f, 1},
+ {0x0c82, 0x0c83, 1},
+ {0x0c85, 0x0c8c, 1},
+ {0x0c8e, 0x0c90, 1},
+ {0x0c92, 0x0ca8, 1},
+ {0x0caa, 0x0cb3, 1},
+ {0x0cb5, 0x0cb9, 1},
+ {0x0cbc, 0x0cc4, 1},
+ {0x0cc6, 0x0cc8, 1},
+ {0x0cca, 0x0ccd, 1},
+ {0x0cd5, 0x0cd6, 1},
+ {0x0cde, 0x0ce0, 2},
+ {0x0ce1, 0x0ce3, 1},
+ {0x0ce6, 0x0cef, 1},
+ {0x0cf1, 0x0cf2, 1},
+ {0x0d02, 0x0d03, 1},
+ {0x0d05, 0x0d0c, 1},
+ {0x0d0e, 0x0d10, 1},
+ {0x0d12, 0x0d3a, 1},
+ {0x0d3d, 0x0d44, 1},
+ {0x0d46, 0x0d48, 1},
+ {0x0d4a, 0x0d4e, 1},
+ {0x0d57, 0x0d60, 9},
+ {0x0d61, 0x0d63, 1},
+ {0x0d66, 0x0d75, 1},
+ {0x0d79, 0x0d7f, 1},
+ {0x0d82, 0x0d83, 1},
+ {0x0d85, 0x0d96, 1},
+ {0x0d9a, 0x0db1, 1},
+ {0x0db3, 0x0dbb, 1},
+ {0x0dbd, 0x0dc0, 3},
+ {0x0dc1, 0x0dc6, 1},
+ {0x0dca, 0x0dcf, 5},
+ {0x0dd0, 0x0dd4, 1},
+ {0x0dd6, 0x0dd8, 2},
+ {0x0dd9, 0x0ddf, 1},
+ {0x0df2, 0x0df4, 1},
+ {0x0e01, 0x0e3a, 1},
+ {0x0e3f, 0x0e5b, 1},
+ {0x0e81, 0x0e82, 1},
+ {0x0e84, 0x0e87, 3},
+ {0x0e88, 0x0e8a, 2},
+ {0x0e8d, 0x0e94, 7},
+ {0x0e95, 0x0e97, 1},
+ {0x0e99, 0x0e9f, 1},
+ {0x0ea1, 0x0ea3, 1},
+ {0x0ea5, 0x0ea7, 2},
+ {0x0eaa, 0x0eab, 1},
+ {0x0ead, 0x0eb9, 1},
+ {0x0ebb, 0x0ebd, 1},
+ {0x0ec0, 0x0ec4, 1},
+ {0x0ec6, 0x0ec8, 2},
+ {0x0ec9, 0x0ecd, 1},
+ {0x0ed0, 0x0ed9, 1},
+ {0x0edc, 0x0edf, 1},
+ {0x0f00, 0x0f47, 1},
+ {0x0f49, 0x0f6c, 1},
+ {0x0f71, 0x0f97, 1},
+ {0x0f99, 0x0fbc, 1},
+ {0x0fbe, 0x0fcc, 1},
+ {0x0fce, 0x0fda, 1},
+ {0x1000, 0x10c5, 1},
+ {0x10c7, 0x10cd, 6},
+ {0x10d0, 0x1248, 1},
+ {0x124a, 0x124d, 1},
+ {0x1250, 0x1256, 1},
+ {0x1258, 0x125a, 2},
+ {0x125b, 0x125d, 1},
+ {0x1260, 0x1288, 1},
+ {0x128a, 0x128d, 1},
+ {0x1290, 0x12b0, 1},
+ {0x12b2, 0x12b5, 1},
+ {0x12b8, 0x12be, 1},
+ {0x12c0, 0x12c2, 2},
+ {0x12c3, 0x12c5, 1},
+ {0x12c8, 0x12d6, 1},
+ {0x12d8, 0x1310, 1},
+ {0x1312, 0x1315, 1},
+ {0x1318, 0x135a, 1},
+ {0x135d, 0x137c, 1},
+ {0x1380, 0x1399, 1},
+ {0x13a0, 0x13f4, 1},
+ {0x1400, 0x169c, 1},
+ {0x16a0, 0x16f0, 1},
+ {0x1700, 0x170c, 1},
+ {0x170e, 0x1714, 1},
+ {0x1720, 0x1736, 1},
+ {0x1740, 0x1753, 1},
+ {0x1760, 0x176c, 1},
+ {0x176e, 0x1770, 1},
+ {0x1772, 0x1773, 1},
+ {0x1780, 0x17dd, 1},
+ {0x17e0, 0x17e9, 1},
+ {0x17f0, 0x17f9, 1},
+ {0x1800, 0x180e, 1},
+ {0x1810, 0x1819, 1},
+ {0x1820, 0x1877, 1},
+ {0x1880, 0x18aa, 1},
+ {0x18b0, 0x18f5, 1},
+ {0x1900, 0x191c, 1},
+ {0x1920, 0x192b, 1},
+ {0x1930, 0x193b, 1},
+ {0x1940, 0x1944, 4},
+ {0x1945, 0x196d, 1},
+ {0x1970, 0x1974, 1},
+ {0x1980, 0x19ab, 1},
+ {0x19b0, 0x19c9, 1},
+ {0x19d0, 0x19da, 1},
+ {0x19de, 0x1a1b, 1},
+ {0x1a1e, 0x1a5e, 1},
+ {0x1a60, 0x1a7c, 1},
+ {0x1a7f, 0x1a89, 1},
+ {0x1a90, 0x1a99, 1},
+ {0x1aa0, 0x1aad, 1},
+ {0x1b00, 0x1b4b, 1},
+ {0x1b50, 0x1b7c, 1},
+ {0x1b80, 0x1bf3, 1},
+ {0x1bfc, 0x1c37, 1},
+ {0x1c3b, 0x1c49, 1},
+ {0x1c4d, 0x1c7f, 1},
+ {0x1cc0, 0x1cc7, 1},
+ {0x1cd0, 0x1cf6, 1},
+ {0x1d00, 0x1de6, 1},
+ {0x1dfc, 0x1f15, 1},
+ {0x1f18, 0x1f1d, 1},
+ {0x1f20, 0x1f45, 1},
+ {0x1f48, 0x1f4d, 1},
+ {0x1f50, 0x1f57, 1},
+ {0x1f59, 0x1f5f, 2},
+ {0x1f60, 0x1f7d, 1},
+ {0x1f80, 0x1fb4, 1},
+ {0x1fb6, 0x1fc4, 1},
+ {0x1fc6, 0x1fd3, 1},
+ {0x1fd6, 0x1fdb, 1},
+ {0x1fdd, 0x1fef, 1},
+ {0x1ff2, 0x1ff4, 1},
+ {0x1ff6, 0x1ffe, 1},
+ {0x2000, 0x2064, 1},
+ {0x206a, 0x2071, 1},
+ {0x2074, 0x208e, 1},
+ {0x2090, 0x209c, 1},
+ {0x20a0, 0x20ba, 1},
+ {0x20d0, 0x20f0, 1},
+ {0x2100, 0x2189, 1},
+ {0x2190, 0x23f3, 1},
+ {0x2400, 0x2426, 1},
+ {0x2440, 0x244a, 1},
+ {0x2460, 0x26ff, 1},
+ {0x2701, 0x2b4c, 1},
+ {0x2b50, 0x2b59, 1},
+ {0x2c00, 0x2c2e, 1},
+ {0x2c30, 0x2c5e, 1},
+ {0x2c60, 0x2cf3, 1},
+ {0x2cf9, 0x2d25, 1},
+ {0x2d27, 0x2d2d, 6},
+ {0x2d30, 0x2d67, 1},
+ {0x2d6f, 0x2d70, 1},
+ {0x2d7f, 0x2d96, 1},
+ {0x2da0, 0x2da6, 1},
+ {0x2da8, 0x2dae, 1},
+ {0x2db0, 0x2db6, 1},
+ {0x2db8, 0x2dbe, 1},
+ {0x2dc0, 0x2dc6, 1},
+ {0x2dc8, 0x2dce, 1},
+ {0x2dd0, 0x2dd6, 1},
+ {0x2dd8, 0x2dde, 1},
+ {0x2de0, 0x2e3b, 1},
+ {0x2e80, 0x2e99, 1},
+ {0x2e9b, 0x2ef3, 1},
+ {0x2f00, 0x2fd5, 1},
+ {0x2ff0, 0x2ffb, 1},
+ {0x3000, 0x303f, 1},
+ {0x3041, 0x3096, 1},
+ {0x3099, 0x30ff, 1},
+ {0x3105, 0x312d, 1},
+ {0x3131, 0x318e, 1},
+ {0x3190, 0x31ba, 1},
+ {0x31c0, 0x31e3, 1},
+ {0x31f0, 0x321e, 1},
+ {0x3220, 0x32fe, 1},
+ {0x3300, 0x4db5, 1},
+ {0x4dc0, 0x9fcc, 1},
+ {0xa000, 0xa48c, 1},
+ {0xa490, 0xa4c6, 1},
+ {0xa4d0, 0xa62b, 1},
+ {0xa640, 0xa697, 1},
+ {0xa69f, 0xa6f7, 1},
+ {0xa700, 0xa78e, 1},
+ {0xa790, 0xa793, 1},
+ {0xa7a0, 0xa7aa, 1},
+ {0xa7f8, 0xa82b, 1},
+ {0xa830, 0xa839, 1},
+ {0xa840, 0xa877, 1},
+ {0xa880, 0xa8c4, 1},
+ {0xa8ce, 0xa8d9, 1},
+ {0xa8e0, 0xa8fb, 1},
+ {0xa900, 0xa953, 1},
+ {0xa95f, 0xa97c, 1},
+ {0xa980, 0xa9cd, 1},
+ {0xa9cf, 0xa9d9, 1},
+ {0xa9de, 0xa9df, 1},
+ {0xaa00, 0xaa36, 1},
+ {0xaa40, 0xaa4d, 1},
+ {0xaa50, 0xaa59, 1},
+ {0xaa5c, 0xaa7b, 1},
+ {0xaa80, 0xaac2, 1},
+ {0xaadb, 0xaaf6, 1},
+ {0xab01, 0xab06, 1},
+ {0xab09, 0xab0e, 1},
+ {0xab11, 0xab16, 1},
+ {0xab20, 0xab26, 1},
+ {0xab28, 0xab2e, 1},
+ {0xabc0, 0xabed, 1},
+ {0xabf0, 0xabf9, 1},
+ {0xac00, 0xd7a3, 1},
+ {0xd7b0, 0xd7c6, 1},
+ {0xd7cb, 0xd7fb, 1},
+ {0xd800, 0xfa6d, 1},
+ {0xfa70, 0xfad9, 1},
+ {0xfb00, 0xfb06, 1},
+ {0xfb13, 0xfb17, 1},
+ {0xfb1d, 0xfb36, 1},
+ {0xfb38, 0xfb3c, 1},
+ {0xfb3e, 0xfb40, 2},
+ {0xfb41, 0xfb43, 2},
+ {0xfb44, 0xfb46, 2},
+ {0xfb47, 0xfbc1, 1},
+ {0xfbd3, 0xfd3f, 1},
+ {0xfd50, 0xfd8f, 1},
+ {0xfd92, 0xfdc7, 1},
+ {0xfdf0, 0xfdfd, 1},
+ {0xfe00, 0xfe19, 1},
+ {0xfe20, 0xfe26, 1},
+ {0xfe30, 0xfe52, 1},
+ {0xfe54, 0xfe66, 1},
+ {0xfe68, 0xfe6b, 1},
+ {0xfe70, 0xfe74, 1},
+ {0xfe76, 0xfefc, 1},
+ {0xfeff, 0xff01, 2},
+ {0xff02, 0xffbe, 1},
+ {0xffc2, 0xffc7, 1},
+ {0xffca, 0xffcf, 1},
+ {0xffd2, 0xffd7, 1},
+ {0xffda, 0xffdc, 1},
+ {0xffe0, 0xffe6, 1},
+ {0xffe8, 0xffee, 1},
+ {0xfff9, 0xfffd, 1},
+ },
+ R32: []unicode.Range32{
+ {0x00010000, 0x0001000b, 1},
+ {0x0001000d, 0x00010026, 1},
+ {0x00010028, 0x0001003a, 1},
+ {0x0001003c, 0x0001003d, 1},
+ {0x0001003f, 0x0001004d, 1},
+ {0x00010050, 0x0001005d, 1},
+ {0x00010080, 0x000100fa, 1},
+ {0x00010100, 0x00010102, 1},
+ {0x00010107, 0x00010133, 1},
+ {0x00010137, 0x0001018a, 1},
+ {0x00010190, 0x0001019b, 1},
+ {0x000101d0, 0x000101fd, 1},
+ {0x00010280, 0x0001029c, 1},
+ {0x000102a0, 0x000102d0, 1},
+ {0x00010300, 0x0001031e, 1},
+ {0x00010320, 0x00010323, 1},
+ {0x00010330, 0x0001034a, 1},
+ {0x00010380, 0x0001039d, 1},
+ {0x0001039f, 0x000103c3, 1},
+ {0x000103c8, 0x000103d5, 1},
+ {0x00010400, 0x0001049d, 1},
+ {0x000104a0, 0x000104a9, 1},
+ {0x00010800, 0x00010805, 1},
+ {0x00010808, 0x0001080a, 2},
+ {0x0001080b, 0x00010835, 1},
+ {0x00010837, 0x00010838, 1},
+ {0x0001083c, 0x0001083f, 3},
+ {0x00010840, 0x00010855, 1},
+ {0x00010857, 0x0001085f, 1},
+ {0x00010900, 0x0001091b, 1},
+ {0x0001091f, 0x00010939, 1},
+ {0x0001093f, 0x00010980, 65},
+ {0x00010981, 0x000109b7, 1},
+ {0x000109be, 0x000109bf, 1},
+ {0x00010a00, 0x00010a03, 1},
+ {0x00010a05, 0x00010a06, 1},
+ {0x00010a0c, 0x00010a13, 1},
+ {0x00010a15, 0x00010a17, 1},
+ {0x00010a19, 0x00010a33, 1},
+ {0x00010a38, 0x00010a3a, 1},
+ {0x00010a3f, 0x00010a47, 1},
+ {0x00010a50, 0x00010a58, 1},
+ {0x00010a60, 0x00010a7f, 1},
+ {0x00010b00, 0x00010b35, 1},
+ {0x00010b39, 0x00010b55, 1},
+ {0x00010b58, 0x00010b72, 1},
+ {0x00010b78, 0x00010b7f, 1},
+ {0x00010c00, 0x00010c48, 1},
+ {0x00010e60, 0x00010e7e, 1},
+ {0x00011000, 0x0001104d, 1},
+ {0x00011052, 0x0001106f, 1},
+ {0x00011080, 0x000110c1, 1},
+ {0x000110d0, 0x000110e8, 1},
+ {0x000110f0, 0x000110f9, 1},
+ {0x00011100, 0x00011134, 1},
+ {0x00011136, 0x00011143, 1},
+ {0x00011180, 0x000111c8, 1},
+ {0x000111d0, 0x000111d9, 1},
+ {0x00011680, 0x000116b7, 1},
+ {0x000116c0, 0x000116c9, 1},
+ {0x00012000, 0x0001236e, 1},
+ {0x00012400, 0x00012462, 1},
+ {0x00012470, 0x00012473, 1},
+ {0x00013000, 0x0001342e, 1},
+ {0x00016800, 0x00016a38, 1},
+ {0x00016f00, 0x00016f44, 1},
+ {0x00016f50, 0x00016f7e, 1},
+ {0x00016f8f, 0x00016f9f, 1},
+ {0x0001b000, 0x0001b001, 1},
+ {0x0001d000, 0x0001d0f5, 1},
+ {0x0001d100, 0x0001d126, 1},
+ {0x0001d129, 0x0001d1dd, 1},
+ {0x0001d200, 0x0001d245, 1},
+ {0x0001d300, 0x0001d356, 1},
+ {0x0001d360, 0x0001d371, 1},
+ {0x0001d400, 0x0001d454, 1},
+ {0x0001d456, 0x0001d49c, 1},
+ {0x0001d49e, 0x0001d49f, 1},
+ {0x0001d4a2, 0x0001d4a5, 3},
+ {0x0001d4a6, 0x0001d4a9, 3},
+ {0x0001d4aa, 0x0001d4ac, 1},
+ {0x0001d4ae, 0x0001d4b9, 1},
+ {0x0001d4bb, 0x0001d4bd, 2},
+ {0x0001d4be, 0x0001d4c3, 1},
+ {0x0001d4c5, 0x0001d505, 1},
+ {0x0001d507, 0x0001d50a, 1},
+ {0x0001d50d, 0x0001d514, 1},
+ {0x0001d516, 0x0001d51c, 1},
+ {0x0001d51e, 0x0001d539, 1},
+ {0x0001d53b, 0x0001d53e, 1},
+ {0x0001d540, 0x0001d544, 1},
+ {0x0001d546, 0x0001d54a, 4},
+ {0x0001d54b, 0x0001d550, 1},
+ {0x0001d552, 0x0001d6a5, 1},
+ {0x0001d6a8, 0x0001d7cb, 1},
+ {0x0001d7ce, 0x0001d7ff, 1},
+ {0x0001ee00, 0x0001ee03, 1},
+ {0x0001ee05, 0x0001ee1f, 1},
+ {0x0001ee21, 0x0001ee22, 1},
+ {0x0001ee24, 0x0001ee27, 3},
+ {0x0001ee29, 0x0001ee32, 1},
+ {0x0001ee34, 0x0001ee37, 1},
+ {0x0001ee39, 0x0001ee3b, 2},
+ {0x0001ee42, 0x0001ee47, 5},
+ {0x0001ee49, 0x0001ee4d, 2},
+ {0x0001ee4e, 0x0001ee4f, 1},
+ {0x0001ee51, 0x0001ee52, 1},
+ {0x0001ee54, 0x0001ee57, 3},
+ {0x0001ee59, 0x0001ee61, 2},
+ {0x0001ee62, 0x0001ee64, 2},
+ {0x0001ee67, 0x0001ee6a, 1},
+ {0x0001ee6c, 0x0001ee72, 1},
+ {0x0001ee74, 0x0001ee77, 1},
+ {0x0001ee79, 0x0001ee7c, 1},
+ {0x0001ee7e, 0x0001ee80, 2},
+ {0x0001ee81, 0x0001ee89, 1},
+ {0x0001ee8b, 0x0001ee9b, 1},
+ {0x0001eea1, 0x0001eea3, 1},
+ {0x0001eea5, 0x0001eea9, 1},
+ {0x0001eeab, 0x0001eebb, 1},
+ {0x0001eef0, 0x0001eef1, 1},
+ {0x0001f000, 0x0001f02b, 1},
+ {0x0001f030, 0x0001f093, 1},
+ {0x0001f0a0, 0x0001f0ae, 1},
+ {0x0001f0b1, 0x0001f0be, 1},
+ {0x0001f0c1, 0x0001f0cf, 1},
+ {0x0001f0d1, 0x0001f0df, 1},
+ {0x0001f100, 0x0001f10a, 1},
+ {0x0001f110, 0x0001f12e, 1},
+ {0x0001f130, 0x0001f16b, 1},
+ {0x0001f170, 0x0001f19a, 1},
+ {0x0001f1e6, 0x0001f202, 1},
+ {0x0001f210, 0x0001f23a, 1},
+ {0x0001f240, 0x0001f248, 1},
+ {0x0001f250, 0x0001f251, 1},
+ {0x0001f300, 0x0001f320, 1},
+ {0x0001f330, 0x0001f335, 1},
+ {0x0001f337, 0x0001f37c, 1},
+ {0x0001f380, 0x0001f393, 1},
+ {0x0001f3a0, 0x0001f3c4, 1},
+ {0x0001f3c6, 0x0001f3ca, 1},
+ {0x0001f3e0, 0x0001f3f0, 1},
+ {0x0001f400, 0x0001f43e, 1},
+ {0x0001f440, 0x0001f442, 2},
+ {0x0001f443, 0x0001f4f7, 1},
+ {0x0001f4f9, 0x0001f4fc, 1},
+ {0x0001f500, 0x0001f53d, 1},
+ {0x0001f540, 0x0001f543, 1},
+ {0x0001f550, 0x0001f567, 1},
+ {0x0001f5fb, 0x0001f640, 1},
+ {0x0001f645, 0x0001f64f, 1},
+ {0x0001f680, 0x0001f6c5, 1},
+ {0x0001f700, 0x0001f773, 1},
+ {0x00020000, 0x0002a6d6, 1},
+ {0x0002a700, 0x0002b734, 1},
+ {0x0002b740, 0x0002b81d, 1},
+ {0x0002f800, 0x0002fa1d, 1},
+ {0x000e0001, 0x000e0020, 31},
+ {0x000e0021, 0x000e007f, 1},
+ {0x000e0100, 0x000e01ef, 1},
+ {0x000f0000, 0x000ffffd, 1},
+ {0x00100000, 0x0010fffd, 1},
+ },
+ LatinOffset: 0,
+}
+
+// size 4160 bytes (4 KiB)
+var assigned6_3_0 = &unicode.RangeTable{
+ R16: []unicode.Range16{
+ {0x0000, 0x0377, 1},
+ {0x037a, 0x037e, 1},
+ {0x0384, 0x038a, 1},
+ {0x038c, 0x038e, 2},
+ {0x038f, 0x03a1, 1},
+ {0x03a3, 0x0527, 1},
+ {0x0531, 0x0556, 1},
+ {0x0559, 0x055f, 1},
+ {0x0561, 0x0587, 1},
+ {0x0589, 0x058a, 1},
+ {0x058f, 0x0591, 2},
+ {0x0592, 0x05c7, 1},
+ {0x05d0, 0x05ea, 1},
+ {0x05f0, 0x05f4, 1},
+ {0x0600, 0x0604, 1},
+ {0x0606, 0x061c, 1},
+ {0x061e, 0x070d, 1},
+ {0x070f, 0x074a, 1},
+ {0x074d, 0x07b1, 1},
+ {0x07c0, 0x07fa, 1},
+ {0x0800, 0x082d, 1},
+ {0x0830, 0x083e, 1},
+ {0x0840, 0x085b, 1},
+ {0x085e, 0x08a0, 66},
+ {0x08a2, 0x08ac, 1},
+ {0x08e4, 0x08fe, 1},
+ {0x0900, 0x0977, 1},
+ {0x0979, 0x097f, 1},
+ {0x0981, 0x0983, 1},
+ {0x0985, 0x098c, 1},
+ {0x098f, 0x0990, 1},
+ {0x0993, 0x09a8, 1},
+ {0x09aa, 0x09b0, 1},
+ {0x09b2, 0x09b6, 4},
+ {0x09b7, 0x09b9, 1},
+ {0x09bc, 0x09c4, 1},
+ {0x09c7, 0x09c8, 1},
+ {0x09cb, 0x09ce, 1},
+ {0x09d7, 0x09dc, 5},
+ {0x09dd, 0x09df, 2},
+ {0x09e0, 0x09e3, 1},
+ {0x09e6, 0x09fb, 1},
+ {0x0a01, 0x0a03, 1},
+ {0x0a05, 0x0a0a, 1},
+ {0x0a0f, 0x0a10, 1},
+ {0x0a13, 0x0a28, 1},
+ {0x0a2a, 0x0a30, 1},
+ {0x0a32, 0x0a33, 1},
+ {0x0a35, 0x0a36, 1},
+ {0x0a38, 0x0a39, 1},
+ {0x0a3c, 0x0a3e, 2},
+ {0x0a3f, 0x0a42, 1},
+ {0x0a47, 0x0a48, 1},
+ {0x0a4b, 0x0a4d, 1},
+ {0x0a51, 0x0a59, 8},
+ {0x0a5a, 0x0a5c, 1},
+ {0x0a5e, 0x0a66, 8},
+ {0x0a67, 0x0a75, 1},
+ {0x0a81, 0x0a83, 1},
+ {0x0a85, 0x0a8d, 1},
+ {0x0a8f, 0x0a91, 1},
+ {0x0a93, 0x0aa8, 1},
+ {0x0aaa, 0x0ab0, 1},
+ {0x0ab2, 0x0ab3, 1},
+ {0x0ab5, 0x0ab9, 1},
+ {0x0abc, 0x0ac5, 1},
+ {0x0ac7, 0x0ac9, 1},
+ {0x0acb, 0x0acd, 1},
+ {0x0ad0, 0x0ae0, 16},
+ {0x0ae1, 0x0ae3, 1},
+ {0x0ae6, 0x0af1, 1},
+ {0x0b01, 0x0b03, 1},
+ {0x0b05, 0x0b0c, 1},
+ {0x0b0f, 0x0b10, 1},
+ {0x0b13, 0x0b28, 1},
+ {0x0b2a, 0x0b30, 1},
+ {0x0b32, 0x0b33, 1},
+ {0x0b35, 0x0b39, 1},
+ {0x0b3c, 0x0b44, 1},
+ {0x0b47, 0x0b48, 1},
+ {0x0b4b, 0x0b4d, 1},
+ {0x0b56, 0x0b57, 1},
+ {0x0b5c, 0x0b5d, 1},
+ {0x0b5f, 0x0b63, 1},
+ {0x0b66, 0x0b77, 1},
+ {0x0b82, 0x0b83, 1},
+ {0x0b85, 0x0b8a, 1},
+ {0x0b8e, 0x0b90, 1},
+ {0x0b92, 0x0b95, 1},
+ {0x0b99, 0x0b9a, 1},
+ {0x0b9c, 0x0b9e, 2},
+ {0x0b9f, 0x0ba3, 4},
+ {0x0ba4, 0x0ba8, 4},
+ {0x0ba9, 0x0baa, 1},
+ {0x0bae, 0x0bb9, 1},
+ {0x0bbe, 0x0bc2, 1},
+ {0x0bc6, 0x0bc8, 1},
+ {0x0bca, 0x0bcd, 1},
+ {0x0bd0, 0x0bd7, 7},
+ {0x0be6, 0x0bfa, 1},
+ {0x0c01, 0x0c03, 1},
+ {0x0c05, 0x0c0c, 1},
+ {0x0c0e, 0x0c10, 1},
+ {0x0c12, 0x0c28, 1},
+ {0x0c2a, 0x0c33, 1},
+ {0x0c35, 0x0c39, 1},
+ {0x0c3d, 0x0c44, 1},
+ {0x0c46, 0x0c48, 1},
+ {0x0c4a, 0x0c4d, 1},
+ {0x0c55, 0x0c56, 1},
+ {0x0c58, 0x0c59, 1},
+ {0x0c60, 0x0c63, 1},
+ {0x0c66, 0x0c6f, 1},
+ {0x0c78, 0x0c7f, 1},
+ {0x0c82, 0x0c83, 1},
+ {0x0c85, 0x0c8c, 1},
+ {0x0c8e, 0x0c90, 1},
+ {0x0c92, 0x0ca8, 1},
+ {0x0caa, 0x0cb3, 1},
+ {0x0cb5, 0x0cb9, 1},
+ {0x0cbc, 0x0cc4, 1},
+ {0x0cc6, 0x0cc8, 1},
+ {0x0cca, 0x0ccd, 1},
+ {0x0cd5, 0x0cd6, 1},
+ {0x0cde, 0x0ce0, 2},
+ {0x0ce1, 0x0ce3, 1},
+ {0x0ce6, 0x0cef, 1},
+ {0x0cf1, 0x0cf2, 1},
+ {0x0d02, 0x0d03, 1},
+ {0x0d05, 0x0d0c, 1},
+ {0x0d0e, 0x0d10, 1},
+ {0x0d12, 0x0d3a, 1},
+ {0x0d3d, 0x0d44, 1},
+ {0x0d46, 0x0d48, 1},
+ {0x0d4a, 0x0d4e, 1},
+ {0x0d57, 0x0d60, 9},
+ {0x0d61, 0x0d63, 1},
+ {0x0d66, 0x0d75, 1},
+ {0x0d79, 0x0d7f, 1},
+ {0x0d82, 0x0d83, 1},
+ {0x0d85, 0x0d96, 1},
+ {0x0d9a, 0x0db1, 1},
+ {0x0db3, 0x0dbb, 1},
+ {0x0dbd, 0x0dc0, 3},
+ {0x0dc1, 0x0dc6, 1},
+ {0x0dca, 0x0dcf, 5},
+ {0x0dd0, 0x0dd4, 1},
+ {0x0dd6, 0x0dd8, 2},
+ {0x0dd9, 0x0ddf, 1},
+ {0x0df2, 0x0df4, 1},
+ {0x0e01, 0x0e3a, 1},
+ {0x0e3f, 0x0e5b, 1},
+ {0x0e81, 0x0e82, 1},
+ {0x0e84, 0x0e87, 3},
+ {0x0e88, 0x0e8a, 2},
+ {0x0e8d, 0x0e94, 7},
+ {0x0e95, 0x0e97, 1},
+ {0x0e99, 0x0e9f, 1},
+ {0x0ea1, 0x0ea3, 1},
+ {0x0ea5, 0x0ea7, 2},
+ {0x0eaa, 0x0eab, 1},
+ {0x0ead, 0x0eb9, 1},
+ {0x0ebb, 0x0ebd, 1},
+ {0x0ec0, 0x0ec4, 1},
+ {0x0ec6, 0x0ec8, 2},
+ {0x0ec9, 0x0ecd, 1},
+ {0x0ed0, 0x0ed9, 1},
+ {0x0edc, 0x0edf, 1},
+ {0x0f00, 0x0f47, 1},
+ {0x0f49, 0x0f6c, 1},
+ {0x0f71, 0x0f97, 1},
+ {0x0f99, 0x0fbc, 1},
+ {0x0fbe, 0x0fcc, 1},
+ {0x0fce, 0x0fda, 1},
+ {0x1000, 0x10c5, 1},
+ {0x10c7, 0x10cd, 6},
+ {0x10d0, 0x1248, 1},
+ {0x124a, 0x124d, 1},
+ {0x1250, 0x1256, 1},
+ {0x1258, 0x125a, 2},
+ {0x125b, 0x125d, 1},
+ {0x1260, 0x1288, 1},
+ {0x128a, 0x128d, 1},
+ {0x1290, 0x12b0, 1},
+ {0x12b2, 0x12b5, 1},
+ {0x12b8, 0x12be, 1},
+ {0x12c0, 0x12c2, 2},
+ {0x12c3, 0x12c5, 1},
+ {0x12c8, 0x12d6, 1},
+ {0x12d8, 0x1310, 1},
+ {0x1312, 0x1315, 1},
+ {0x1318, 0x135a, 1},
+ {0x135d, 0x137c, 1},
+ {0x1380, 0x1399, 1},
+ {0x13a0, 0x13f4, 1},
+ {0x1400, 0x169c, 1},
+ {0x16a0, 0x16f0, 1},
+ {0x1700, 0x170c, 1},
+ {0x170e, 0x1714, 1},
+ {0x1720, 0x1736, 1},
+ {0x1740, 0x1753, 1},
+ {0x1760, 0x176c, 1},
+ {0x176e, 0x1770, 1},
+ {0x1772, 0x1773, 1},
+ {0x1780, 0x17dd, 1},
+ {0x17e0, 0x17e9, 1},
+ {0x17f0, 0x17f9, 1},
+ {0x1800, 0x180e, 1},
+ {0x1810, 0x1819, 1},
+ {0x1820, 0x1877, 1},
+ {0x1880, 0x18aa, 1},
+ {0x18b0, 0x18f5, 1},
+ {0x1900, 0x191c, 1},
+ {0x1920, 0x192b, 1},
+ {0x1930, 0x193b, 1},
+ {0x1940, 0x1944, 4},
+ {0x1945, 0x196d, 1},
+ {0x1970, 0x1974, 1},
+ {0x1980, 0x19ab, 1},
+ {0x19b0, 0x19c9, 1},
+ {0x19d0, 0x19da, 1},
+ {0x19de, 0x1a1b, 1},
+ {0x1a1e, 0x1a5e, 1},
+ {0x1a60, 0x1a7c, 1},
+ {0x1a7f, 0x1a89, 1},
+ {0x1a90, 0x1a99, 1},
+ {0x1aa0, 0x1aad, 1},
+ {0x1b00, 0x1b4b, 1},
+ {0x1b50, 0x1b7c, 1},
+ {0x1b80, 0x1bf3, 1},
+ {0x1bfc, 0x1c37, 1},
+ {0x1c3b, 0x1c49, 1},
+ {0x1c4d, 0x1c7f, 1},
+ {0x1cc0, 0x1cc7, 1},
+ {0x1cd0, 0x1cf6, 1},
+ {0x1d00, 0x1de6, 1},
+ {0x1dfc, 0x1f15, 1},
+ {0x1f18, 0x1f1d, 1},
+ {0x1f20, 0x1f45, 1},
+ {0x1f48, 0x1f4d, 1},
+ {0x1f50, 0x1f57, 1},
+ {0x1f59, 0x1f5f, 2},
+ {0x1f60, 0x1f7d, 1},
+ {0x1f80, 0x1fb4, 1},
+ {0x1fb6, 0x1fc4, 1},
+ {0x1fc6, 0x1fd3, 1},
+ {0x1fd6, 0x1fdb, 1},
+ {0x1fdd, 0x1fef, 1},
+ {0x1ff2, 0x1ff4, 1},
+ {0x1ff6, 0x1ffe, 1},
+ {0x2000, 0x2064, 1},
+ {0x2066, 0x2071, 1},
+ {0x2074, 0x208e, 1},
+ {0x2090, 0x209c, 1},
+ {0x20a0, 0x20ba, 1},
+ {0x20d0, 0x20f0, 1},
+ {0x2100, 0x2189, 1},
+ {0x2190, 0x23f3, 1},
+ {0x2400, 0x2426, 1},
+ {0x2440, 0x244a, 1},
+ {0x2460, 0x26ff, 1},
+ {0x2701, 0x2b4c, 1},
+ {0x2b50, 0x2b59, 1},
+ {0x2c00, 0x2c2e, 1},
+ {0x2c30, 0x2c5e, 1},
+ {0x2c60, 0x2cf3, 1},
+ {0x2cf9, 0x2d25, 1},
+ {0x2d27, 0x2d2d, 6},
+ {0x2d30, 0x2d67, 1},
+ {0x2d6f, 0x2d70, 1},
+ {0x2d7f, 0x2d96, 1},
+ {0x2da0, 0x2da6, 1},
+ {0x2da8, 0x2dae, 1},
+ {0x2db0, 0x2db6, 1},
+ {0x2db8, 0x2dbe, 1},
+ {0x2dc0, 0x2dc6, 1},
+ {0x2dc8, 0x2dce, 1},
+ {0x2dd0, 0x2dd6, 1},
+ {0x2dd8, 0x2dde, 1},
+ {0x2de0, 0x2e3b, 1},
+ {0x2e80, 0x2e99, 1},
+ {0x2e9b, 0x2ef3, 1},
+ {0x2f00, 0x2fd5, 1},
+ {0x2ff0, 0x2ffb, 1},
+ {0x3000, 0x303f, 1},
+ {0x3041, 0x3096, 1},
+ {0x3099, 0x30ff, 1},
+ {0x3105, 0x312d, 1},
+ {0x3131, 0x318e, 1},
+ {0x3190, 0x31ba, 1},
+ {0x31c0, 0x31e3, 1},
+ {0x31f0, 0x321e, 1},
+ {0x3220, 0x32fe, 1},
+ {0x3300, 0x4db5, 1},
+ {0x4dc0, 0x9fcc, 1},
+ {0xa000, 0xa48c, 1},
+ {0xa490, 0xa4c6, 1},
+ {0xa4d0, 0xa62b, 1},
+ {0xa640, 0xa697, 1},
+ {0xa69f, 0xa6f7, 1},
+ {0xa700, 0xa78e, 1},
+ {0xa790, 0xa793, 1},
+ {0xa7a0, 0xa7aa, 1},
+ {0xa7f8, 0xa82b, 1},
+ {0xa830, 0xa839, 1},
+ {0xa840, 0xa877, 1},
+ {0xa880, 0xa8c4, 1},
+ {0xa8ce, 0xa8d9, 1},
+ {0xa8e0, 0xa8fb, 1},
+ {0xa900, 0xa953, 1},
+ {0xa95f, 0xa97c, 1},
+ {0xa980, 0xa9cd, 1},
+ {0xa9cf, 0xa9d9, 1},
+ {0xa9de, 0xa9df, 1},
+ {0xaa00, 0xaa36, 1},
+ {0xaa40, 0xaa4d, 1},
+ {0xaa50, 0xaa59, 1},
+ {0xaa5c, 0xaa7b, 1},
+ {0xaa80, 0xaac2, 1},
+ {0xaadb, 0xaaf6, 1},
+ {0xab01, 0xab06, 1},
+ {0xab09, 0xab0e, 1},
+ {0xab11, 0xab16, 1},
+ {0xab20, 0xab26, 1},
+ {0xab28, 0xab2e, 1},
+ {0xabc0, 0xabed, 1},
+ {0xabf0, 0xabf9, 1},
+ {0xac00, 0xd7a3, 1},
+ {0xd7b0, 0xd7c6, 1},
+ {0xd7cb, 0xd7fb, 1},
+ {0xd800, 0xfa6d, 1},
+ {0xfa70, 0xfad9, 1},
+ {0xfb00, 0xfb06, 1},
+ {0xfb13, 0xfb17, 1},
+ {0xfb1d, 0xfb36, 1},
+ {0xfb38, 0xfb3c, 1},
+ {0xfb3e, 0xfb40, 2},
+ {0xfb41, 0xfb43, 2},
+ {0xfb44, 0xfb46, 2},
+ {0xfb47, 0xfbc1, 1},
+ {0xfbd3, 0xfd3f, 1},
+ {0xfd50, 0xfd8f, 1},
+ {0xfd92, 0xfdc7, 1},
+ {0xfdf0, 0xfdfd, 1},
+ {0xfe00, 0xfe19, 1},
+ {0xfe20, 0xfe26, 1},
+ {0xfe30, 0xfe52, 1},
+ {0xfe54, 0xfe66, 1},
+ {0xfe68, 0xfe6b, 1},
+ {0xfe70, 0xfe74, 1},
+ {0xfe76, 0xfefc, 1},
+ {0xfeff, 0xff01, 2},
+ {0xff02, 0xffbe, 1},
+ {0xffc2, 0xffc7, 1},
+ {0xffca, 0xffcf, 1},
+ {0xffd2, 0xffd7, 1},
+ {0xffda, 0xffdc, 1},
+ {0xffe0, 0xffe6, 1},
+ {0xffe8, 0xffee, 1},
+ {0xfff9, 0xfffd, 1},
+ },
+ R32: []unicode.Range32{
+ {0x00010000, 0x0001000b, 1},
+ {0x0001000d, 0x00010026, 1},
+ {0x00010028, 0x0001003a, 1},
+ {0x0001003c, 0x0001003d, 1},
+ {0x0001003f, 0x0001004d, 1},
+ {0x00010050, 0x0001005d, 1},
+ {0x00010080, 0x000100fa, 1},
+ {0x00010100, 0x00010102, 1},
+ {0x00010107, 0x00010133, 1},
+ {0x00010137, 0x0001018a, 1},
+ {0x00010190, 0x0001019b, 1},
+ {0x000101d0, 0x000101fd, 1},
+ {0x00010280, 0x0001029c, 1},
+ {0x000102a0, 0x000102d0, 1},
+ {0x00010300, 0x0001031e, 1},
+ {0x00010320, 0x00010323, 1},
+ {0x00010330, 0x0001034a, 1},
+ {0x00010380, 0x0001039d, 1},
+ {0x0001039f, 0x000103c3, 1},
+ {0x000103c8, 0x000103d5, 1},
+ {0x00010400, 0x0001049d, 1},
+ {0x000104a0, 0x000104a9, 1},
+ {0x00010800, 0x00010805, 1},
+ {0x00010808, 0x0001080a, 2},
+ {0x0001080b, 0x00010835, 1},
+ {0x00010837, 0x00010838, 1},
+ {0x0001083c, 0x0001083f, 3},
+ {0x00010840, 0x00010855, 1},
+ {0x00010857, 0x0001085f, 1},
+ {0x00010900, 0x0001091b, 1},
+ {0x0001091f, 0x00010939, 1},
+ {0x0001093f, 0x00010980, 65},
+ {0x00010981, 0x000109b7, 1},
+ {0x000109be, 0x000109bf, 1},
+ {0x00010a00, 0x00010a03, 1},
+ {0x00010a05, 0x00010a06, 1},
+ {0x00010a0c, 0x00010a13, 1},
+ {0x00010a15, 0x00010a17, 1},
+ {0x00010a19, 0x00010a33, 1},
+ {0x00010a38, 0x00010a3a, 1},
+ {0x00010a3f, 0x00010a47, 1},
+ {0x00010a50, 0x00010a58, 1},
+ {0x00010a60, 0x00010a7f, 1},
+ {0x00010b00, 0x00010b35, 1},
+ {0x00010b39, 0x00010b55, 1},
+ {0x00010b58, 0x00010b72, 1},
+ {0x00010b78, 0x00010b7f, 1},
+ {0x00010c00, 0x00010c48, 1},
+ {0x00010e60, 0x00010e7e, 1},
+ {0x00011000, 0x0001104d, 1},
+ {0x00011052, 0x0001106f, 1},
+ {0x00011080, 0x000110c1, 1},
+ {0x000110d0, 0x000110e8, 1},
+ {0x000110f0, 0x000110f9, 1},
+ {0x00011100, 0x00011134, 1},
+ {0x00011136, 0x00011143, 1},
+ {0x00011180, 0x000111c8, 1},
+ {0x000111d0, 0x000111d9, 1},
+ {0x00011680, 0x000116b7, 1},
+ {0x000116c0, 0x000116c9, 1},
+ {0x00012000, 0x0001236e, 1},
+ {0x00012400, 0x00012462, 1},
+ {0x00012470, 0x00012473, 1},
+ {0x00013000, 0x0001342e, 1},
+ {0x00016800, 0x00016a38, 1},
+ {0x00016f00, 0x00016f44, 1},
+ {0x00016f50, 0x00016f7e, 1},
+ {0x00016f8f, 0x00016f9f, 1},
+ {0x0001b000, 0x0001b001, 1},
+ {0x0001d000, 0x0001d0f5, 1},
+ {0x0001d100, 0x0001d126, 1},
+ {0x0001d129, 0x0001d1dd, 1},
+ {0x0001d200, 0x0001d245, 1},
+ {0x0001d300, 0x0001d356, 1},
+ {0x0001d360, 0x0001d371, 1},
+ {0x0001d400, 0x0001d454, 1},
+ {0x0001d456, 0x0001d49c, 1},
+ {0x0001d49e, 0x0001d49f, 1},
+ {0x0001d4a2, 0x0001d4a5, 3},
+ {0x0001d4a6, 0x0001d4a9, 3},
+ {0x0001d4aa, 0x0001d4ac, 1},
+ {0x0001d4ae, 0x0001d4b9, 1},
+ {0x0001d4bb, 0x0001d4bd, 2},
+ {0x0001d4be, 0x0001d4c3, 1},
+ {0x0001d4c5, 0x0001d505, 1},
+ {0x0001d507, 0x0001d50a, 1},
+ {0x0001d50d, 0x0001d514, 1},
+ {0x0001d516, 0x0001d51c, 1},
+ {0x0001d51e, 0x0001d539, 1},
+ {0x0001d53b, 0x0001d53e, 1},
+ {0x0001d540, 0x0001d544, 1},
+ {0x0001d546, 0x0001d54a, 4},
+ {0x0001d54b, 0x0001d550, 1},
+ {0x0001d552, 0x0001d6a5, 1},
+ {0x0001d6a8, 0x0001d7cb, 1},
+ {0x0001d7ce, 0x0001d7ff, 1},
+ {0x0001ee00, 0x0001ee03, 1},
+ {0x0001ee05, 0x0001ee1f, 1},
+ {0x0001ee21, 0x0001ee22, 1},
+ {0x0001ee24, 0x0001ee27, 3},
+ {0x0001ee29, 0x0001ee32, 1},
+ {0x0001ee34, 0x0001ee37, 1},
+ {0x0001ee39, 0x0001ee3b, 2},
+ {0x0001ee42, 0x0001ee47, 5},
+ {0x0001ee49, 0x0001ee4d, 2},
+ {0x0001ee4e, 0x0001ee4f, 1},
+ {0x0001ee51, 0x0001ee52, 1},
+ {0x0001ee54, 0x0001ee57, 3},
+ {0x0001ee59, 0x0001ee61, 2},
+ {0x0001ee62, 0x0001ee64, 2},
+ {0x0001ee67, 0x0001ee6a, 1},
+ {0x0001ee6c, 0x0001ee72, 1},
+ {0x0001ee74, 0x0001ee77, 1},
+ {0x0001ee79, 0x0001ee7c, 1},
+ {0x0001ee7e, 0x0001ee80, 2},
+ {0x0001ee81, 0x0001ee89, 1},
+ {0x0001ee8b, 0x0001ee9b, 1},
+ {0x0001eea1, 0x0001eea3, 1},
+ {0x0001eea5, 0x0001eea9, 1},
+ {0x0001eeab, 0x0001eebb, 1},
+ {0x0001eef0, 0x0001eef1, 1},
+ {0x0001f000, 0x0001f02b, 1},
+ {0x0001f030, 0x0001f093, 1},
+ {0x0001f0a0, 0x0001f0ae, 1},
+ {0x0001f0b1, 0x0001f0be, 1},
+ {0x0001f0c1, 0x0001f0cf, 1},
+ {0x0001f0d1, 0x0001f0df, 1},
+ {0x0001f100, 0x0001f10a, 1},
+ {0x0001f110, 0x0001f12e, 1},
+ {0x0001f130, 0x0001f16b, 1},
+ {0x0001f170, 0x0001f19a, 1},
+ {0x0001f1e6, 0x0001f202, 1},
+ {0x0001f210, 0x0001f23a, 1},
+ {0x0001f240, 0x0001f248, 1},
+ {0x0001f250, 0x0001f251, 1},
+ {0x0001f300, 0x0001f320, 1},
+ {0x0001f330, 0x0001f335, 1},
+ {0x0001f337, 0x0001f37c, 1},
+ {0x0001f380, 0x0001f393, 1},
+ {0x0001f3a0, 0x0001f3c4, 1},
+ {0x0001f3c6, 0x0001f3ca, 1},
+ {0x0001f3e0, 0x0001f3f0, 1},
+ {0x0001f400, 0x0001f43e, 1},
+ {0x0001f440, 0x0001f442, 2},
+ {0x0001f443, 0x0001f4f7, 1},
+ {0x0001f4f9, 0x0001f4fc, 1},
+ {0x0001f500, 0x0001f53d, 1},
+ {0x0001f540, 0x0001f543, 1},
+ {0x0001f550, 0x0001f567, 1},
+ {0x0001f5fb, 0x0001f640, 1},
+ {0x0001f645, 0x0001f64f, 1},
+ {0x0001f680, 0x0001f6c5, 1},
+ {0x0001f700, 0x0001f773, 1},
+ {0x00020000, 0x0002a6d6, 1},
+ {0x0002a700, 0x0002b734, 1},
+ {0x0002b740, 0x0002b81d, 1},
+ {0x0002f800, 0x0002fa1d, 1},
+ {0x000e0001, 0x000e0020, 31},
+ {0x000e0021, 0x000e007f, 1},
+ {0x000e0100, 0x000e01ef, 1},
+ {0x000f0000, 0x000ffffd, 1},
+ {0x00100000, 0x0010fffd, 1},
+ },
+ LatinOffset: 0,
+}
+
+// size 3812 bytes (3 KiB)
+var assigned6_0_0 = &unicode.RangeTable{
+ R16: []unicode.Range16{
+ {0x0000, 0x0377, 1},
+ {0x037a, 0x037e, 1},
+ {0x0384, 0x038a, 1},
+ {0x038c, 0x038e, 2},
+ {0x038f, 0x03a1, 1},
+ {0x03a3, 0x0527, 1},
+ {0x0531, 0x0556, 1},
+ {0x0559, 0x055f, 1},
+ {0x0561, 0x0587, 1},
+ {0x0589, 0x058a, 1},
+ {0x0591, 0x05c7, 1},
+ {0x05d0, 0x05ea, 1},
+ {0x05f0, 0x05f4, 1},
+ {0x0600, 0x0603, 1},
+ {0x0606, 0x061b, 1},
+ {0x061e, 0x070d, 1},
+ {0x070f, 0x074a, 1},
+ {0x074d, 0x07b1, 1},
+ {0x07c0, 0x07fa, 1},
+ {0x0800, 0x082d, 1},
+ {0x0830, 0x083e, 1},
+ {0x0840, 0x085b, 1},
+ {0x085e, 0x0900, 162},
+ {0x0901, 0x0977, 1},
+ {0x0979, 0x097f, 1},
+ {0x0981, 0x0983, 1},
+ {0x0985, 0x098c, 1},
+ {0x098f, 0x0990, 1},
+ {0x0993, 0x09a8, 1},
+ {0x09aa, 0x09b0, 1},
+ {0x09b2, 0x09b6, 4},
+ {0x09b7, 0x09b9, 1},
+ {0x09bc, 0x09c4, 1},
+ {0x09c7, 0x09c8, 1},
+ {0x09cb, 0x09ce, 1},
+ {0x09d7, 0x09dc, 5},
+ {0x09dd, 0x09df, 2},
+ {0x09e0, 0x09e3, 1},
+ {0x09e6, 0x09fb, 1},
+ {0x0a01, 0x0a03, 1},
+ {0x0a05, 0x0a0a, 1},
+ {0x0a0f, 0x0a10, 1},
+ {0x0a13, 0x0a28, 1},
+ {0x0a2a, 0x0a30, 1},
+ {0x0a32, 0x0a33, 1},
+ {0x0a35, 0x0a36, 1},
+ {0x0a38, 0x0a39, 1},
+ {0x0a3c, 0x0a3e, 2},
+ {0x0a3f, 0x0a42, 1},
+ {0x0a47, 0x0a48, 1},
+ {0x0a4b, 0x0a4d, 1},
+ {0x0a51, 0x0a59, 8},
+ {0x0a5a, 0x0a5c, 1},
+ {0x0a5e, 0x0a66, 8},
+ {0x0a67, 0x0a75, 1},
+ {0x0a81, 0x0a83, 1},
+ {0x0a85, 0x0a8d, 1},
+ {0x0a8f, 0x0a91, 1},
+ {0x0a93, 0x0aa8, 1},
+ {0x0aaa, 0x0ab0, 1},
+ {0x0ab2, 0x0ab3, 1},
+ {0x0ab5, 0x0ab9, 1},
+ {0x0abc, 0x0ac5, 1},
+ {0x0ac7, 0x0ac9, 1},
+ {0x0acb, 0x0acd, 1},
+ {0x0ad0, 0x0ae0, 16},
+ {0x0ae1, 0x0ae3, 1},
+ {0x0ae6, 0x0aef, 1},
+ {0x0af1, 0x0b01, 16},
+ {0x0b02, 0x0b03, 1},
+ {0x0b05, 0x0b0c, 1},
+ {0x0b0f, 0x0b10, 1},
+ {0x0b13, 0x0b28, 1},
+ {0x0b2a, 0x0b30, 1},
+ {0x0b32, 0x0b33, 1},
+ {0x0b35, 0x0b39, 1},
+ {0x0b3c, 0x0b44, 1},
+ {0x0b47, 0x0b48, 1},
+ {0x0b4b, 0x0b4d, 1},
+ {0x0b56, 0x0b57, 1},
+ {0x0b5c, 0x0b5d, 1},
+ {0x0b5f, 0x0b63, 1},
+ {0x0b66, 0x0b77, 1},
+ {0x0b82, 0x0b83, 1},
+ {0x0b85, 0x0b8a, 1},
+ {0x0b8e, 0x0b90, 1},
+ {0x0b92, 0x0b95, 1},
+ {0x0b99, 0x0b9a, 1},
+ {0x0b9c, 0x0b9e, 2},
+ {0x0b9f, 0x0ba3, 4},
+ {0x0ba4, 0x0ba8, 4},
+ {0x0ba9, 0x0baa, 1},
+ {0x0bae, 0x0bb9, 1},
+ {0x0bbe, 0x0bc2, 1},
+ {0x0bc6, 0x0bc8, 1},
+ {0x0bca, 0x0bcd, 1},
+ {0x0bd0, 0x0bd7, 7},
+ {0x0be6, 0x0bfa, 1},
+ {0x0c01, 0x0c03, 1},
+ {0x0c05, 0x0c0c, 1},
+ {0x0c0e, 0x0c10, 1},
+ {0x0c12, 0x0c28, 1},
+ {0x0c2a, 0x0c33, 1},
+ {0x0c35, 0x0c39, 1},
+ {0x0c3d, 0x0c44, 1},
+ {0x0c46, 0x0c48, 1},
+ {0x0c4a, 0x0c4d, 1},
+ {0x0c55, 0x0c56, 1},
+ {0x0c58, 0x0c59, 1},
+ {0x0c60, 0x0c63, 1},
+ {0x0c66, 0x0c6f, 1},
+ {0x0c78, 0x0c7f, 1},
+ {0x0c82, 0x0c83, 1},
+ {0x0c85, 0x0c8c, 1},
+ {0x0c8e, 0x0c90, 1},
+ {0x0c92, 0x0ca8, 1},
+ {0x0caa, 0x0cb3, 1},
+ {0x0cb5, 0x0cb9, 1},
+ {0x0cbc, 0x0cc4, 1},
+ {0x0cc6, 0x0cc8, 1},
+ {0x0cca, 0x0ccd, 1},
+ {0x0cd5, 0x0cd6, 1},
+ {0x0cde, 0x0ce0, 2},
+ {0x0ce1, 0x0ce3, 1},
+ {0x0ce6, 0x0cef, 1},
+ {0x0cf1, 0x0cf2, 1},
+ {0x0d02, 0x0d03, 1},
+ {0x0d05, 0x0d0c, 1},
+ {0x0d0e, 0x0d10, 1},
+ {0x0d12, 0x0d3a, 1},
+ {0x0d3d, 0x0d44, 1},
+ {0x0d46, 0x0d48, 1},
+ {0x0d4a, 0x0d4e, 1},
+ {0x0d57, 0x0d60, 9},
+ {0x0d61, 0x0d63, 1},
+ {0x0d66, 0x0d75, 1},
+ {0x0d79, 0x0d7f, 1},
+ {0x0d82, 0x0d83, 1},
+ {0x0d85, 0x0d96, 1},
+ {0x0d9a, 0x0db1, 1},
+ {0x0db3, 0x0dbb, 1},
+ {0x0dbd, 0x0dc0, 3},
+ {0x0dc1, 0x0dc6, 1},
+ {0x0dca, 0x0dcf, 5},
+ {0x0dd0, 0x0dd4, 1},
+ {0x0dd6, 0x0dd8, 2},
+ {0x0dd9, 0x0ddf, 1},
+ {0x0df2, 0x0df4, 1},
+ {0x0e01, 0x0e3a, 1},
+ {0x0e3f, 0x0e5b, 1},
+ {0x0e81, 0x0e82, 1},
+ {0x0e84, 0x0e87, 3},
+ {0x0e88, 0x0e8a, 2},
+ {0x0e8d, 0x0e94, 7},
+ {0x0e95, 0x0e97, 1},
+ {0x0e99, 0x0e9f, 1},
+ {0x0ea1, 0x0ea3, 1},
+ {0x0ea5, 0x0ea7, 2},
+ {0x0eaa, 0x0eab, 1},
+ {0x0ead, 0x0eb9, 1},
+ {0x0ebb, 0x0ebd, 1},
+ {0x0ec0, 0x0ec4, 1},
+ {0x0ec6, 0x0ec8, 2},
+ {0x0ec9, 0x0ecd, 1},
+ {0x0ed0, 0x0ed9, 1},
+ {0x0edc, 0x0edd, 1},
+ {0x0f00, 0x0f47, 1},
+ {0x0f49, 0x0f6c, 1},
+ {0x0f71, 0x0f97, 1},
+ {0x0f99, 0x0fbc, 1},
+ {0x0fbe, 0x0fcc, 1},
+ {0x0fce, 0x0fda, 1},
+ {0x1000, 0x10c5, 1},
+ {0x10d0, 0x10fc, 1},
+ {0x1100, 0x1248, 1},
+ {0x124a, 0x124d, 1},
+ {0x1250, 0x1256, 1},
+ {0x1258, 0x125a, 2},
+ {0x125b, 0x125d, 1},
+ {0x1260, 0x1288, 1},
+ {0x128a, 0x128d, 1},
+ {0x1290, 0x12b0, 1},
+ {0x12b2, 0x12b5, 1},
+ {0x12b8, 0x12be, 1},
+ {0x12c0, 0x12c2, 2},
+ {0x12c3, 0x12c5, 1},
+ {0x12c8, 0x12d6, 1},
+ {0x12d8, 0x1310, 1},
+ {0x1312, 0x1315, 1},
+ {0x1318, 0x135a, 1},
+ {0x135d, 0x137c, 1},
+ {0x1380, 0x1399, 1},
+ {0x13a0, 0x13f4, 1},
+ {0x1400, 0x169c, 1},
+ {0x16a0, 0x16f0, 1},
+ {0x1700, 0x170c, 1},
+ {0x170e, 0x1714, 1},
+ {0x1720, 0x1736, 1},
+ {0x1740, 0x1753, 1},
+ {0x1760, 0x176c, 1},
+ {0x176e, 0x1770, 1},
+ {0x1772, 0x1773, 1},
+ {0x1780, 0x17dd, 1},
+ {0x17e0, 0x17e9, 1},
+ {0x17f0, 0x17f9, 1},
+ {0x1800, 0x180e, 1},
+ {0x1810, 0x1819, 1},
+ {0x1820, 0x1877, 1},
+ {0x1880, 0x18aa, 1},
+ {0x18b0, 0x18f5, 1},
+ {0x1900, 0x191c, 1},
+ {0x1920, 0x192b, 1},
+ {0x1930, 0x193b, 1},
+ {0x1940, 0x1944, 4},
+ {0x1945, 0x196d, 1},
+ {0x1970, 0x1974, 1},
+ {0x1980, 0x19ab, 1},
+ {0x19b0, 0x19c9, 1},
+ {0x19d0, 0x19da, 1},
+ {0x19de, 0x1a1b, 1},
+ {0x1a1e, 0x1a5e, 1},
+ {0x1a60, 0x1a7c, 1},
+ {0x1a7f, 0x1a89, 1},
+ {0x1a90, 0x1a99, 1},
+ {0x1aa0, 0x1aad, 1},
+ {0x1b00, 0x1b4b, 1},
+ {0x1b50, 0x1b7c, 1},
+ {0x1b80, 0x1baa, 1},
+ {0x1bae, 0x1bb9, 1},
+ {0x1bc0, 0x1bf3, 1},
+ {0x1bfc, 0x1c37, 1},
+ {0x1c3b, 0x1c49, 1},
+ {0x1c4d, 0x1c7f, 1},
+ {0x1cd0, 0x1cf2, 1},
+ {0x1d00, 0x1de6, 1},
+ {0x1dfc, 0x1f15, 1},
+ {0x1f18, 0x1f1d, 1},
+ {0x1f20, 0x1f45, 1},
+ {0x1f48, 0x1f4d, 1},
+ {0x1f50, 0x1f57, 1},
+ {0x1f59, 0x1f5f, 2},
+ {0x1f60, 0x1f7d, 1},
+ {0x1f80, 0x1fb4, 1},
+ {0x1fb6, 0x1fc4, 1},
+ {0x1fc6, 0x1fd3, 1},
+ {0x1fd6, 0x1fdb, 1},
+ {0x1fdd, 0x1fef, 1},
+ {0x1ff2, 0x1ff4, 1},
+ {0x1ff6, 0x1ffe, 1},
+ {0x2000, 0x2064, 1},
+ {0x206a, 0x2071, 1},
+ {0x2074, 0x208e, 1},
+ {0x2090, 0x209c, 1},
+ {0x20a0, 0x20b9, 1},
+ {0x20d0, 0x20f0, 1},
+ {0x2100, 0x2189, 1},
+ {0x2190, 0x23f3, 1},
+ {0x2400, 0x2426, 1},
+ {0x2440, 0x244a, 1},
+ {0x2460, 0x26ff, 1},
+ {0x2701, 0x27ca, 1},
+ {0x27cc, 0x27ce, 2},
+ {0x27cf, 0x2b4c, 1},
+ {0x2b50, 0x2b59, 1},
+ {0x2c00, 0x2c2e, 1},
+ {0x2c30, 0x2c5e, 1},
+ {0x2c60, 0x2cf1, 1},
+ {0x2cf9, 0x2d25, 1},
+ {0x2d30, 0x2d65, 1},
+ {0x2d6f, 0x2d70, 1},
+ {0x2d7f, 0x2d96, 1},
+ {0x2da0, 0x2da6, 1},
+ {0x2da8, 0x2dae, 1},
+ {0x2db0, 0x2db6, 1},
+ {0x2db8, 0x2dbe, 1},
+ {0x2dc0, 0x2dc6, 1},
+ {0x2dc8, 0x2dce, 1},
+ {0x2dd0, 0x2dd6, 1},
+ {0x2dd8, 0x2dde, 1},
+ {0x2de0, 0x2e31, 1},
+ {0x2e80, 0x2e99, 1},
+ {0x2e9b, 0x2ef3, 1},
+ {0x2f00, 0x2fd5, 1},
+ {0x2ff0, 0x2ffb, 1},
+ {0x3000, 0x303f, 1},
+ {0x3041, 0x3096, 1},
+ {0x3099, 0x30ff, 1},
+ {0x3105, 0x312d, 1},
+ {0x3131, 0x318e, 1},
+ {0x3190, 0x31ba, 1},
+ {0x31c0, 0x31e3, 1},
+ {0x31f0, 0x321e, 1},
+ {0x3220, 0x32fe, 1},
+ {0x3300, 0x4db5, 1},
+ {0x4dc0, 0x9fcb, 1},
+ {0xa000, 0xa48c, 1},
+ {0xa490, 0xa4c6, 1},
+ {0xa4d0, 0xa62b, 1},
+ {0xa640, 0xa673, 1},
+ {0xa67c, 0xa697, 1},
+ {0xa6a0, 0xa6f7, 1},
+ {0xa700, 0xa78e, 1},
+ {0xa790, 0xa791, 1},
+ {0xa7a0, 0xa7a9, 1},
+ {0xa7fa, 0xa82b, 1},
+ {0xa830, 0xa839, 1},
+ {0xa840, 0xa877, 1},
+ {0xa880, 0xa8c4, 1},
+ {0xa8ce, 0xa8d9, 1},
+ {0xa8e0, 0xa8fb, 1},
+ {0xa900, 0xa953, 1},
+ {0xa95f, 0xa97c, 1},
+ {0xa980, 0xa9cd, 1},
+ {0xa9cf, 0xa9d9, 1},
+ {0xa9de, 0xa9df, 1},
+ {0xaa00, 0xaa36, 1},
+ {0xaa40, 0xaa4d, 1},
+ {0xaa50, 0xaa59, 1},
+ {0xaa5c, 0xaa7b, 1},
+ {0xaa80, 0xaac2, 1},
+ {0xaadb, 0xaadf, 1},
+ {0xab01, 0xab06, 1},
+ {0xab09, 0xab0e, 1},
+ {0xab11, 0xab16, 1},
+ {0xab20, 0xab26, 1},
+ {0xab28, 0xab2e, 1},
+ {0xabc0, 0xabed, 1},
+ {0xabf0, 0xabf9, 1},
+ {0xac00, 0xd7a3, 1},
+ {0xd7b0, 0xd7c6, 1},
+ {0xd7cb, 0xd7fb, 1},
+ {0xd800, 0xfa2d, 1},
+ {0xfa30, 0xfa6d, 1},
+ {0xfa70, 0xfad9, 1},
+ {0xfb00, 0xfb06, 1},
+ {0xfb13, 0xfb17, 1},
+ {0xfb1d, 0xfb36, 1},
+ {0xfb38, 0xfb3c, 1},
+ {0xfb3e, 0xfb40, 2},
+ {0xfb41, 0xfb43, 2},
+ {0xfb44, 0xfb46, 2},
+ {0xfb47, 0xfbc1, 1},
+ {0xfbd3, 0xfd3f, 1},
+ {0xfd50, 0xfd8f, 1},
+ {0xfd92, 0xfdc7, 1},
+ {0xfdf0, 0xfdfd, 1},
+ {0xfe00, 0xfe19, 1},
+ {0xfe20, 0xfe26, 1},
+ {0xfe30, 0xfe52, 1},
+ {0xfe54, 0xfe66, 1},
+ {0xfe68, 0xfe6b, 1},
+ {0xfe70, 0xfe74, 1},
+ {0xfe76, 0xfefc, 1},
+ {0xfeff, 0xff01, 2},
+ {0xff02, 0xffbe, 1},
+ {0xffc2, 0xffc7, 1},
+ {0xffca, 0xffcf, 1},
+ {0xffd2, 0xffd7, 1},
+ {0xffda, 0xffdc, 1},
+ {0xffe0, 0xffe6, 1},
+ {0xffe8, 0xffee, 1},
+ {0xfff9, 0xfffd, 1},
+ },
+ R32: []unicode.Range32{
+ {0x00010000, 0x0001000b, 1},
+ {0x0001000d, 0x00010026, 1},
+ {0x00010028, 0x0001003a, 1},
+ {0x0001003c, 0x0001003d, 1},
+ {0x0001003f, 0x0001004d, 1},
+ {0x00010050, 0x0001005d, 1},
+ {0x00010080, 0x000100fa, 1},
+ {0x00010100, 0x00010102, 1},
+ {0x00010107, 0x00010133, 1},
+ {0x00010137, 0x0001018a, 1},
+ {0x00010190, 0x0001019b, 1},
+ {0x000101d0, 0x000101fd, 1},
+ {0x00010280, 0x0001029c, 1},
+ {0x000102a0, 0x000102d0, 1},
+ {0x00010300, 0x0001031e, 1},
+ {0x00010320, 0x00010323, 1},
+ {0x00010330, 0x0001034a, 1},
+ {0x00010380, 0x0001039d, 1},
+ {0x0001039f, 0x000103c3, 1},
+ {0x000103c8, 0x000103d5, 1},
+ {0x00010400, 0x0001049d, 1},
+ {0x000104a0, 0x000104a9, 1},
+ {0x00010800, 0x00010805, 1},
+ {0x00010808, 0x0001080a, 2},
+ {0x0001080b, 0x00010835, 1},
+ {0x00010837, 0x00010838, 1},
+ {0x0001083c, 0x0001083f, 3},
+ {0x00010840, 0x00010855, 1},
+ {0x00010857, 0x0001085f, 1},
+ {0x00010900, 0x0001091b, 1},
+ {0x0001091f, 0x00010939, 1},
+ {0x0001093f, 0x00010a00, 193},
+ {0x00010a01, 0x00010a03, 1},
+ {0x00010a05, 0x00010a06, 1},
+ {0x00010a0c, 0x00010a13, 1},
+ {0x00010a15, 0x00010a17, 1},
+ {0x00010a19, 0x00010a33, 1},
+ {0x00010a38, 0x00010a3a, 1},
+ {0x00010a3f, 0x00010a47, 1},
+ {0x00010a50, 0x00010a58, 1},
+ {0x00010a60, 0x00010a7f, 1},
+ {0x00010b00, 0x00010b35, 1},
+ {0x00010b39, 0x00010b55, 1},
+ {0x00010b58, 0x00010b72, 1},
+ {0x00010b78, 0x00010b7f, 1},
+ {0x00010c00, 0x00010c48, 1},
+ {0x00010e60, 0x00010e7e, 1},
+ {0x00011000, 0x0001104d, 1},
+ {0x00011052, 0x0001106f, 1},
+ {0x00011080, 0x000110c1, 1},
+ {0x00012000, 0x0001236e, 1},
+ {0x00012400, 0x00012462, 1},
+ {0x00012470, 0x00012473, 1},
+ {0x00013000, 0x0001342e, 1},
+ {0x00016800, 0x00016a38, 1},
+ {0x0001b000, 0x0001b001, 1},
+ {0x0001d000, 0x0001d0f5, 1},
+ {0x0001d100, 0x0001d126, 1},
+ {0x0001d129, 0x0001d1dd, 1},
+ {0x0001d200, 0x0001d245, 1},
+ {0x0001d300, 0x0001d356, 1},
+ {0x0001d360, 0x0001d371, 1},
+ {0x0001d400, 0x0001d454, 1},
+ {0x0001d456, 0x0001d49c, 1},
+ {0x0001d49e, 0x0001d49f, 1},
+ {0x0001d4a2, 0x0001d4a5, 3},
+ {0x0001d4a6, 0x0001d4a9, 3},
+ {0x0001d4aa, 0x0001d4ac, 1},
+ {0x0001d4ae, 0x0001d4b9, 1},
+ {0x0001d4bb, 0x0001d4bd, 2},
+ {0x0001d4be, 0x0001d4c3, 1},
+ {0x0001d4c5, 0x0001d505, 1},
+ {0x0001d507, 0x0001d50a, 1},
+ {0x0001d50d, 0x0001d514, 1},
+ {0x0001d516, 0x0001d51c, 1},
+ {0x0001d51e, 0x0001d539, 1},
+ {0x0001d53b, 0x0001d53e, 1},
+ {0x0001d540, 0x0001d544, 1},
+ {0x0001d546, 0x0001d54a, 4},
+ {0x0001d54b, 0x0001d550, 1},
+ {0x0001d552, 0x0001d6a5, 1},
+ {0x0001d6a8, 0x0001d7cb, 1},
+ {0x0001d7ce, 0x0001d7ff, 1},
+ {0x0001f000, 0x0001f02b, 1},
+ {0x0001f030, 0x0001f093, 1},
+ {0x0001f0a0, 0x0001f0ae, 1},
+ {0x0001f0b1, 0x0001f0be, 1},
+ {0x0001f0c1, 0x0001f0cf, 1},
+ {0x0001f0d1, 0x0001f0df, 1},
+ {0x0001f100, 0x0001f10a, 1},
+ {0x0001f110, 0x0001f12e, 1},
+ {0x0001f130, 0x0001f169, 1},
+ {0x0001f170, 0x0001f19a, 1},
+ {0x0001f1e6, 0x0001f202, 1},
+ {0x0001f210, 0x0001f23a, 1},
+ {0x0001f240, 0x0001f248, 1},
+ {0x0001f250, 0x0001f251, 1},
+ {0x0001f300, 0x0001f320, 1},
+ {0x0001f330, 0x0001f335, 1},
+ {0x0001f337, 0x0001f37c, 1},
+ {0x0001f380, 0x0001f393, 1},
+ {0x0001f3a0, 0x0001f3c4, 1},
+ {0x0001f3c6, 0x0001f3ca, 1},
+ {0x0001f3e0, 0x0001f3f0, 1},
+ {0x0001f400, 0x0001f43e, 1},
+ {0x0001f440, 0x0001f442, 2},
+ {0x0001f443, 0x0001f4f7, 1},
+ {0x0001f4f9, 0x0001f4fc, 1},
+ {0x0001f500, 0x0001f53d, 1},
+ {0x0001f550, 0x0001f567, 1},
+ {0x0001f5fb, 0x0001f5ff, 1},
+ {0x0001f601, 0x0001f610, 1},
+ {0x0001f612, 0x0001f614, 1},
+ {0x0001f616, 0x0001f61c, 2},
+ {0x0001f61d, 0x0001f61e, 1},
+ {0x0001f620, 0x0001f625, 1},
+ {0x0001f628, 0x0001f62b, 1},
+ {0x0001f62d, 0x0001f630, 3},
+ {0x0001f631, 0x0001f633, 1},
+ {0x0001f635, 0x0001f640, 1},
+ {0x0001f645, 0x0001f64f, 1},
+ {0x0001f680, 0x0001f6c5, 1},
+ {0x0001f700, 0x0001f773, 1},
+ {0x00020000, 0x0002a6d6, 1},
+ {0x0002a700, 0x0002b734, 1},
+ {0x0002b740, 0x0002b81d, 1},
+ {0x0002f800, 0x0002fa1d, 1},
+ {0x000e0001, 0x000e0020, 31},
+ {0x000e0021, 0x000e007f, 1},
+ {0x000e0100, 0x000e01ef, 1},
+ {0x000f0000, 0x000ffffd, 1},
+ {0x00100000, 0x0010fffd, 1},
+ },
+ LatinOffset: 0,
+}
+
+// size 4898 bytes (4 KiB)
+var assigned7_0_0 = &unicode.RangeTable{
+ R16: []unicode.Range16{
+ {0x0000, 0x0377, 1},
+ {0x037a, 0x037f, 1},
+ {0x0384, 0x038a, 1},
+ {0x038c, 0x038e, 2},
+ {0x038f, 0x03a1, 1},
+ {0x03a3, 0x052f, 1},
+ {0x0531, 0x0556, 1},
+ {0x0559, 0x055f, 1},
+ {0x0561, 0x0587, 1},
+ {0x0589, 0x058a, 1},
+ {0x058d, 0x058f, 1},
+ {0x0591, 0x05c7, 1},
+ {0x05d0, 0x05ea, 1},
+ {0x05f0, 0x05f4, 1},
+ {0x0600, 0x061c, 1},
+ {0x061e, 0x070d, 1},
+ {0x070f, 0x074a, 1},
+ {0x074d, 0x07b1, 1},
+ {0x07c0, 0x07fa, 1},
+ {0x0800, 0x082d, 1},
+ {0x0830, 0x083e, 1},
+ {0x0840, 0x085b, 1},
+ {0x085e, 0x08a0, 66},
+ {0x08a1, 0x08b2, 1},
+ {0x08e4, 0x0983, 1},
+ {0x0985, 0x098c, 1},
+ {0x098f, 0x0990, 1},
+ {0x0993, 0x09a8, 1},
+ {0x09aa, 0x09b0, 1},
+ {0x09b2, 0x09b6, 4},
+ {0x09b7, 0x09b9, 1},
+ {0x09bc, 0x09c4, 1},
+ {0x09c7, 0x09c8, 1},
+ {0x09cb, 0x09ce, 1},
+ {0x09d7, 0x09dc, 5},
+ {0x09dd, 0x09df, 2},
+ {0x09e0, 0x09e3, 1},
+ {0x09e6, 0x09fb, 1},
+ {0x0a01, 0x0a03, 1},
+ {0x0a05, 0x0a0a, 1},
+ {0x0a0f, 0x0a10, 1},
+ {0x0a13, 0x0a28, 1},
+ {0x0a2a, 0x0a30, 1},
+ {0x0a32, 0x0a33, 1},
+ {0x0a35, 0x0a36, 1},
+ {0x0a38, 0x0a39, 1},
+ {0x0a3c, 0x0a3e, 2},
+ {0x0a3f, 0x0a42, 1},
+ {0x0a47, 0x0a48, 1},
+ {0x0a4b, 0x0a4d, 1},
+ {0x0a51, 0x0a59, 8},
+ {0x0a5a, 0x0a5c, 1},
+ {0x0a5e, 0x0a66, 8},
+ {0x0a67, 0x0a75, 1},
+ {0x0a81, 0x0a83, 1},
+ {0x0a85, 0x0a8d, 1},
+ {0x0a8f, 0x0a91, 1},
+ {0x0a93, 0x0aa8, 1},
+ {0x0aaa, 0x0ab0, 1},
+ {0x0ab2, 0x0ab3, 1},
+ {0x0ab5, 0x0ab9, 1},
+ {0x0abc, 0x0ac5, 1},
+ {0x0ac7, 0x0ac9, 1},
+ {0x0acb, 0x0acd, 1},
+ {0x0ad0, 0x0ae0, 16},
+ {0x0ae1, 0x0ae3, 1},
+ {0x0ae6, 0x0af1, 1},
+ {0x0b01, 0x0b03, 1},
+ {0x0b05, 0x0b0c, 1},
+ {0x0b0f, 0x0b10, 1},
+ {0x0b13, 0x0b28, 1},
+ {0x0b2a, 0x0b30, 1},
+ {0x0b32, 0x0b33, 1},
+ {0x0b35, 0x0b39, 1},
+ {0x0b3c, 0x0b44, 1},
+ {0x0b47, 0x0b48, 1},
+ {0x0b4b, 0x0b4d, 1},
+ {0x0b56, 0x0b57, 1},
+ {0x0b5c, 0x0b5d, 1},
+ {0x0b5f, 0x0b63, 1},
+ {0x0b66, 0x0b77, 1},
+ {0x0b82, 0x0b83, 1},
+ {0x0b85, 0x0b8a, 1},
+ {0x0b8e, 0x0b90, 1},
+ {0x0b92, 0x0b95, 1},
+ {0x0b99, 0x0b9a, 1},
+ {0x0b9c, 0x0b9e, 2},
+ {0x0b9f, 0x0ba3, 4},
+ {0x0ba4, 0x0ba8, 4},
+ {0x0ba9, 0x0baa, 1},
+ {0x0bae, 0x0bb9, 1},
+ {0x0bbe, 0x0bc2, 1},
+ {0x0bc6, 0x0bc8, 1},
+ {0x0bca, 0x0bcd, 1},
+ {0x0bd0, 0x0bd7, 7},
+ {0x0be6, 0x0bfa, 1},
+ {0x0c00, 0x0c03, 1},
+ {0x0c05, 0x0c0c, 1},
+ {0x0c0e, 0x0c10, 1},
+ {0x0c12, 0x0c28, 1},
+ {0x0c2a, 0x0c39, 1},
+ {0x0c3d, 0x0c44, 1},
+ {0x0c46, 0x0c48, 1},
+ {0x0c4a, 0x0c4d, 1},
+ {0x0c55, 0x0c56, 1},
+ {0x0c58, 0x0c59, 1},
+ {0x0c60, 0x0c63, 1},
+ {0x0c66, 0x0c6f, 1},
+ {0x0c78, 0x0c7f, 1},
+ {0x0c81, 0x0c83, 1},
+ {0x0c85, 0x0c8c, 1},
+ {0x0c8e, 0x0c90, 1},
+ {0x0c92, 0x0ca8, 1},
+ {0x0caa, 0x0cb3, 1},
+ {0x0cb5, 0x0cb9, 1},
+ {0x0cbc, 0x0cc4, 1},
+ {0x0cc6, 0x0cc8, 1},
+ {0x0cca, 0x0ccd, 1},
+ {0x0cd5, 0x0cd6, 1},
+ {0x0cde, 0x0ce0, 2},
+ {0x0ce1, 0x0ce3, 1},
+ {0x0ce6, 0x0cef, 1},
+ {0x0cf1, 0x0cf2, 1},
+ {0x0d01, 0x0d03, 1},
+ {0x0d05, 0x0d0c, 1},
+ {0x0d0e, 0x0d10, 1},
+ {0x0d12, 0x0d3a, 1},
+ {0x0d3d, 0x0d44, 1},
+ {0x0d46, 0x0d48, 1},
+ {0x0d4a, 0x0d4e, 1},
+ {0x0d57, 0x0d60, 9},
+ {0x0d61, 0x0d63, 1},
+ {0x0d66, 0x0d75, 1},
+ {0x0d79, 0x0d7f, 1},
+ {0x0d82, 0x0d83, 1},
+ {0x0d85, 0x0d96, 1},
+ {0x0d9a, 0x0db1, 1},
+ {0x0db3, 0x0dbb, 1},
+ {0x0dbd, 0x0dc0, 3},
+ {0x0dc1, 0x0dc6, 1},
+ {0x0dca, 0x0dcf, 5},
+ {0x0dd0, 0x0dd4, 1},
+ {0x0dd6, 0x0dd8, 2},
+ {0x0dd9, 0x0ddf, 1},
+ {0x0de6, 0x0def, 1},
+ {0x0df2, 0x0df4, 1},
+ {0x0e01, 0x0e3a, 1},
+ {0x0e3f, 0x0e5b, 1},
+ {0x0e81, 0x0e82, 1},
+ {0x0e84, 0x0e87, 3},
+ {0x0e88, 0x0e8a, 2},
+ {0x0e8d, 0x0e94, 7},
+ {0x0e95, 0x0e97, 1},
+ {0x0e99, 0x0e9f, 1},
+ {0x0ea1, 0x0ea3, 1},
+ {0x0ea5, 0x0ea7, 2},
+ {0x0eaa, 0x0eab, 1},
+ {0x0ead, 0x0eb9, 1},
+ {0x0ebb, 0x0ebd, 1},
+ {0x0ec0, 0x0ec4, 1},
+ {0x0ec6, 0x0ec8, 2},
+ {0x0ec9, 0x0ecd, 1},
+ {0x0ed0, 0x0ed9, 1},
+ {0x0edc, 0x0edf, 1},
+ {0x0f00, 0x0f47, 1},
+ {0x0f49, 0x0f6c, 1},
+ {0x0f71, 0x0f97, 1},
+ {0x0f99, 0x0fbc, 1},
+ {0x0fbe, 0x0fcc, 1},
+ {0x0fce, 0x0fda, 1},
+ {0x1000, 0x10c5, 1},
+ {0x10c7, 0x10cd, 6},
+ {0x10d0, 0x1248, 1},
+ {0x124a, 0x124d, 1},
+ {0x1250, 0x1256, 1},
+ {0x1258, 0x125a, 2},
+ {0x125b, 0x125d, 1},
+ {0x1260, 0x1288, 1},
+ {0x128a, 0x128d, 1},
+ {0x1290, 0x12b0, 1},
+ {0x12b2, 0x12b5, 1},
+ {0x12b8, 0x12be, 1},
+ {0x12c0, 0x12c2, 2},
+ {0x12c3, 0x12c5, 1},
+ {0x12c8, 0x12d6, 1},
+ {0x12d8, 0x1310, 1},
+ {0x1312, 0x1315, 1},
+ {0x1318, 0x135a, 1},
+ {0x135d, 0x137c, 1},
+ {0x1380, 0x1399, 1},
+ {0x13a0, 0x13f4, 1},
+ {0x1400, 0x169c, 1},
+ {0x16a0, 0x16f8, 1},
+ {0x1700, 0x170c, 1},
+ {0x170e, 0x1714, 1},
+ {0x1720, 0x1736, 1},
+ {0x1740, 0x1753, 1},
+ {0x1760, 0x176c, 1},
+ {0x176e, 0x1770, 1},
+ {0x1772, 0x1773, 1},
+ {0x1780, 0x17dd, 1},
+ {0x17e0, 0x17e9, 1},
+ {0x17f0, 0x17f9, 1},
+ {0x1800, 0x180e, 1},
+ {0x1810, 0x1819, 1},
+ {0x1820, 0x1877, 1},
+ {0x1880, 0x18aa, 1},
+ {0x18b0, 0x18f5, 1},
+ {0x1900, 0x191e, 1},
+ {0x1920, 0x192b, 1},
+ {0x1930, 0x193b, 1},
+ {0x1940, 0x1944, 4},
+ {0x1945, 0x196d, 1},
+ {0x1970, 0x1974, 1},
+ {0x1980, 0x19ab, 1},
+ {0x19b0, 0x19c9, 1},
+ {0x19d0, 0x19da, 1},
+ {0x19de, 0x1a1b, 1},
+ {0x1a1e, 0x1a5e, 1},
+ {0x1a60, 0x1a7c, 1},
+ {0x1a7f, 0x1a89, 1},
+ {0x1a90, 0x1a99, 1},
+ {0x1aa0, 0x1aad, 1},
+ {0x1ab0, 0x1abe, 1},
+ {0x1b00, 0x1b4b, 1},
+ {0x1b50, 0x1b7c, 1},
+ {0x1b80, 0x1bf3, 1},
+ {0x1bfc, 0x1c37, 1},
+ {0x1c3b, 0x1c49, 1},
+ {0x1c4d, 0x1c7f, 1},
+ {0x1cc0, 0x1cc7, 1},
+ {0x1cd0, 0x1cf6, 1},
+ {0x1cf8, 0x1cf9, 1},
+ {0x1d00, 0x1df5, 1},
+ {0x1dfc, 0x1f15, 1},
+ {0x1f18, 0x1f1d, 1},
+ {0x1f20, 0x1f45, 1},
+ {0x1f48, 0x1f4d, 1},
+ {0x1f50, 0x1f57, 1},
+ {0x1f59, 0x1f5f, 2},
+ {0x1f60, 0x1f7d, 1},
+ {0x1f80, 0x1fb4, 1},
+ {0x1fb6, 0x1fc4, 1},
+ {0x1fc6, 0x1fd3, 1},
+ {0x1fd6, 0x1fdb, 1},
+ {0x1fdd, 0x1fef, 1},
+ {0x1ff2, 0x1ff4, 1},
+ {0x1ff6, 0x1ffe, 1},
+ {0x2000, 0x2064, 1},
+ {0x2066, 0x2071, 1},
+ {0x2074, 0x208e, 1},
+ {0x2090, 0x209c, 1},
+ {0x20a0, 0x20bd, 1},
+ {0x20d0, 0x20f0, 1},
+ {0x2100, 0x2189, 1},
+ {0x2190, 0x23fa, 1},
+ {0x2400, 0x2426, 1},
+ {0x2440, 0x244a, 1},
+ {0x2460, 0x2b73, 1},
+ {0x2b76, 0x2b95, 1},
+ {0x2b98, 0x2bb9, 1},
+ {0x2bbd, 0x2bc8, 1},
+ {0x2bca, 0x2bd1, 1},
+ {0x2c00, 0x2c2e, 1},
+ {0x2c30, 0x2c5e, 1},
+ {0x2c60, 0x2cf3, 1},
+ {0x2cf9, 0x2d25, 1},
+ {0x2d27, 0x2d2d, 6},
+ {0x2d30, 0x2d67, 1},
+ {0x2d6f, 0x2d70, 1},
+ {0x2d7f, 0x2d96, 1},
+ {0x2da0, 0x2da6, 1},
+ {0x2da8, 0x2dae, 1},
+ {0x2db0, 0x2db6, 1},
+ {0x2db8, 0x2dbe, 1},
+ {0x2dc0, 0x2dc6, 1},
+ {0x2dc8, 0x2dce, 1},
+ {0x2dd0, 0x2dd6, 1},
+ {0x2dd8, 0x2dde, 1},
+ {0x2de0, 0x2e42, 1},
+ {0x2e80, 0x2e99, 1},
+ {0x2e9b, 0x2ef3, 1},
+ {0x2f00, 0x2fd5, 1},
+ {0x2ff0, 0x2ffb, 1},
+ {0x3000, 0x303f, 1},
+ {0x3041, 0x3096, 1},
+ {0x3099, 0x30ff, 1},
+ {0x3105, 0x312d, 1},
+ {0x3131, 0x318e, 1},
+ {0x3190, 0x31ba, 1},
+ {0x31c0, 0x31e3, 1},
+ {0x31f0, 0x321e, 1},
+ {0x3220, 0x32fe, 1},
+ {0x3300, 0x4db5, 1},
+ {0x4dc0, 0x9fcc, 1},
+ {0xa000, 0xa48c, 1},
+ {0xa490, 0xa4c6, 1},
+ {0xa4d0, 0xa62b, 1},
+ {0xa640, 0xa69d, 1},
+ {0xa69f, 0xa6f7, 1},
+ {0xa700, 0xa78e, 1},
+ {0xa790, 0xa7ad, 1},
+ {0xa7b0, 0xa7b1, 1},
+ {0xa7f7, 0xa82b, 1},
+ {0xa830, 0xa839, 1},
+ {0xa840, 0xa877, 1},
+ {0xa880, 0xa8c4, 1},
+ {0xa8ce, 0xa8d9, 1},
+ {0xa8e0, 0xa8fb, 1},
+ {0xa900, 0xa953, 1},
+ {0xa95f, 0xa97c, 1},
+ {0xa980, 0xa9cd, 1},
+ {0xa9cf, 0xa9d9, 1},
+ {0xa9de, 0xa9fe, 1},
+ {0xaa00, 0xaa36, 1},
+ {0xaa40, 0xaa4d, 1},
+ {0xaa50, 0xaa59, 1},
+ {0xaa5c, 0xaac2, 1},
+ {0xaadb, 0xaaf6, 1},
+ {0xab01, 0xab06, 1},
+ {0xab09, 0xab0e, 1},
+ {0xab11, 0xab16, 1},
+ {0xab20, 0xab26, 1},
+ {0xab28, 0xab2e, 1},
+ {0xab30, 0xab5f, 1},
+ {0xab64, 0xab65, 1},
+ {0xabc0, 0xabed, 1},
+ {0xabf0, 0xabf9, 1},
+ {0xac00, 0xd7a3, 1},
+ {0xd7b0, 0xd7c6, 1},
+ {0xd7cb, 0xd7fb, 1},
+ {0xd800, 0xfa6d, 1},
+ {0xfa70, 0xfad9, 1},
+ {0xfb00, 0xfb06, 1},
+ {0xfb13, 0xfb17, 1},
+ {0xfb1d, 0xfb36, 1},
+ {0xfb38, 0xfb3c, 1},
+ {0xfb3e, 0xfb40, 2},
+ {0xfb41, 0xfb43, 2},
+ {0xfb44, 0xfb46, 2},
+ {0xfb47, 0xfbc1, 1},
+ {0xfbd3, 0xfd3f, 1},
+ {0xfd50, 0xfd8f, 1},
+ {0xfd92, 0xfdc7, 1},
+ {0xfdf0, 0xfdfd, 1},
+ {0xfe00, 0xfe19, 1},
+ {0xfe20, 0xfe2d, 1},
+ {0xfe30, 0xfe52, 1},
+ {0xfe54, 0xfe66, 1},
+ {0xfe68, 0xfe6b, 1},
+ {0xfe70, 0xfe74, 1},
+ {0xfe76, 0xfefc, 1},
+ {0xfeff, 0xff01, 2},
+ {0xff02, 0xffbe, 1},
+ {0xffc2, 0xffc7, 1},
+ {0xffca, 0xffcf, 1},
+ {0xffd2, 0xffd7, 1},
+ {0xffda, 0xffdc, 1},
+ {0xffe0, 0xffe6, 1},
+ {0xffe8, 0xffee, 1},
+ {0xfff9, 0xfffd, 1},
+ },
+ R32: []unicode.Range32{
+ {0x00010000, 0x0001000b, 1},
+ {0x0001000d, 0x00010026, 1},
+ {0x00010028, 0x0001003a, 1},
+ {0x0001003c, 0x0001003d, 1},
+ {0x0001003f, 0x0001004d, 1},
+ {0x00010050, 0x0001005d, 1},
+ {0x00010080, 0x000100fa, 1},
+ {0x00010100, 0x00010102, 1},
+ {0x00010107, 0x00010133, 1},
+ {0x00010137, 0x0001018c, 1},
+ {0x00010190, 0x0001019b, 1},
+ {0x000101a0, 0x000101d0, 48},
+ {0x000101d1, 0x000101fd, 1},
+ {0x00010280, 0x0001029c, 1},
+ {0x000102a0, 0x000102d0, 1},
+ {0x000102e0, 0x000102fb, 1},
+ {0x00010300, 0x00010323, 1},
+ {0x00010330, 0x0001034a, 1},
+ {0x00010350, 0x0001037a, 1},
+ {0x00010380, 0x0001039d, 1},
+ {0x0001039f, 0x000103c3, 1},
+ {0x000103c8, 0x000103d5, 1},
+ {0x00010400, 0x0001049d, 1},
+ {0x000104a0, 0x000104a9, 1},
+ {0x00010500, 0x00010527, 1},
+ {0x00010530, 0x00010563, 1},
+ {0x0001056f, 0x00010600, 145},
+ {0x00010601, 0x00010736, 1},
+ {0x00010740, 0x00010755, 1},
+ {0x00010760, 0x00010767, 1},
+ {0x00010800, 0x00010805, 1},
+ {0x00010808, 0x0001080a, 2},
+ {0x0001080b, 0x00010835, 1},
+ {0x00010837, 0x00010838, 1},
+ {0x0001083c, 0x0001083f, 3},
+ {0x00010840, 0x00010855, 1},
+ {0x00010857, 0x0001089e, 1},
+ {0x000108a7, 0x000108af, 1},
+ {0x00010900, 0x0001091b, 1},
+ {0x0001091f, 0x00010939, 1},
+ {0x0001093f, 0x00010980, 65},
+ {0x00010981, 0x000109b7, 1},
+ {0x000109be, 0x000109bf, 1},
+ {0x00010a00, 0x00010a03, 1},
+ {0x00010a05, 0x00010a06, 1},
+ {0x00010a0c, 0x00010a13, 1},
+ {0x00010a15, 0x00010a17, 1},
+ {0x00010a19, 0x00010a33, 1},
+ {0x00010a38, 0x00010a3a, 1},
+ {0x00010a3f, 0x00010a47, 1},
+ {0x00010a50, 0x00010a58, 1},
+ {0x00010a60, 0x00010a9f, 1},
+ {0x00010ac0, 0x00010ae6, 1},
+ {0x00010aeb, 0x00010af6, 1},
+ {0x00010b00, 0x00010b35, 1},
+ {0x00010b39, 0x00010b55, 1},
+ {0x00010b58, 0x00010b72, 1},
+ {0x00010b78, 0x00010b91, 1},
+ {0x00010b99, 0x00010b9c, 1},
+ {0x00010ba9, 0x00010baf, 1},
+ {0x00010c00, 0x00010c48, 1},
+ {0x00010e60, 0x00010e7e, 1},
+ {0x00011000, 0x0001104d, 1},
+ {0x00011052, 0x0001106f, 1},
+ {0x0001107f, 0x000110c1, 1},
+ {0x000110d0, 0x000110e8, 1},
+ {0x000110f0, 0x000110f9, 1},
+ {0x00011100, 0x00011134, 1},
+ {0x00011136, 0x00011143, 1},
+ {0x00011150, 0x00011176, 1},
+ {0x00011180, 0x000111c8, 1},
+ {0x000111cd, 0x000111d0, 3},
+ {0x000111d1, 0x000111da, 1},
+ {0x000111e1, 0x000111f4, 1},
+ {0x00011200, 0x00011211, 1},
+ {0x00011213, 0x0001123d, 1},
+ {0x000112b0, 0x000112ea, 1},
+ {0x000112f0, 0x000112f9, 1},
+ {0x00011301, 0x00011303, 1},
+ {0x00011305, 0x0001130c, 1},
+ {0x0001130f, 0x00011310, 1},
+ {0x00011313, 0x00011328, 1},
+ {0x0001132a, 0x00011330, 1},
+ {0x00011332, 0x00011333, 1},
+ {0x00011335, 0x00011339, 1},
+ {0x0001133c, 0x00011344, 1},
+ {0x00011347, 0x00011348, 1},
+ {0x0001134b, 0x0001134d, 1},
+ {0x00011357, 0x0001135d, 6},
+ {0x0001135e, 0x00011363, 1},
+ {0x00011366, 0x0001136c, 1},
+ {0x00011370, 0x00011374, 1},
+ {0x00011480, 0x000114c7, 1},
+ {0x000114d0, 0x000114d9, 1},
+ {0x00011580, 0x000115b5, 1},
+ {0x000115b8, 0x000115c9, 1},
+ {0x00011600, 0x00011644, 1},
+ {0x00011650, 0x00011659, 1},
+ {0x00011680, 0x000116b7, 1},
+ {0x000116c0, 0x000116c9, 1},
+ {0x000118a0, 0x000118f2, 1},
+ {0x000118ff, 0x00011ac0, 449},
+ {0x00011ac1, 0x00011af8, 1},
+ {0x00012000, 0x00012398, 1},
+ {0x00012400, 0x0001246e, 1},
+ {0x00012470, 0x00012474, 1},
+ {0x00013000, 0x0001342e, 1},
+ {0x00016800, 0x00016a38, 1},
+ {0x00016a40, 0x00016a5e, 1},
+ {0x00016a60, 0x00016a69, 1},
+ {0x00016a6e, 0x00016a6f, 1},
+ {0x00016ad0, 0x00016aed, 1},
+ {0x00016af0, 0x00016af5, 1},
+ {0x00016b00, 0x00016b45, 1},
+ {0x00016b50, 0x00016b59, 1},
+ {0x00016b5b, 0x00016b61, 1},
+ {0x00016b63, 0x00016b77, 1},
+ {0x00016b7d, 0x00016b8f, 1},
+ {0x00016f00, 0x00016f44, 1},
+ {0x00016f50, 0x00016f7e, 1},
+ {0x00016f8f, 0x00016f9f, 1},
+ {0x0001b000, 0x0001b001, 1},
+ {0x0001bc00, 0x0001bc6a, 1},
+ {0x0001bc70, 0x0001bc7c, 1},
+ {0x0001bc80, 0x0001bc88, 1},
+ {0x0001bc90, 0x0001bc99, 1},
+ {0x0001bc9c, 0x0001bca3, 1},
+ {0x0001d000, 0x0001d0f5, 1},
+ {0x0001d100, 0x0001d126, 1},
+ {0x0001d129, 0x0001d1dd, 1},
+ {0x0001d200, 0x0001d245, 1},
+ {0x0001d300, 0x0001d356, 1},
+ {0x0001d360, 0x0001d371, 1},
+ {0x0001d400, 0x0001d454, 1},
+ {0x0001d456, 0x0001d49c, 1},
+ {0x0001d49e, 0x0001d49f, 1},
+ {0x0001d4a2, 0x0001d4a5, 3},
+ {0x0001d4a6, 0x0001d4a9, 3},
+ {0x0001d4aa, 0x0001d4ac, 1},
+ {0x0001d4ae, 0x0001d4b9, 1},
+ {0x0001d4bb, 0x0001d4bd, 2},
+ {0x0001d4be, 0x0001d4c3, 1},
+ {0x0001d4c5, 0x0001d505, 1},
+ {0x0001d507, 0x0001d50a, 1},
+ {0x0001d50d, 0x0001d514, 1},
+ {0x0001d516, 0x0001d51c, 1},
+ {0x0001d51e, 0x0001d539, 1},
+ {0x0001d53b, 0x0001d53e, 1},
+ {0x0001d540, 0x0001d544, 1},
+ {0x0001d546, 0x0001d54a, 4},
+ {0x0001d54b, 0x0001d550, 1},
+ {0x0001d552, 0x0001d6a5, 1},
+ {0x0001d6a8, 0x0001d7cb, 1},
+ {0x0001d7ce, 0x0001d7ff, 1},
+ {0x0001e800, 0x0001e8c4, 1},
+ {0x0001e8c7, 0x0001e8d6, 1},
+ {0x0001ee00, 0x0001ee03, 1},
+ {0x0001ee05, 0x0001ee1f, 1},
+ {0x0001ee21, 0x0001ee22, 1},
+ {0x0001ee24, 0x0001ee27, 3},
+ {0x0001ee29, 0x0001ee32, 1},
+ {0x0001ee34, 0x0001ee37, 1},
+ {0x0001ee39, 0x0001ee3b, 2},
+ {0x0001ee42, 0x0001ee47, 5},
+ {0x0001ee49, 0x0001ee4d, 2},
+ {0x0001ee4e, 0x0001ee4f, 1},
+ {0x0001ee51, 0x0001ee52, 1},
+ {0x0001ee54, 0x0001ee57, 3},
+ {0x0001ee59, 0x0001ee61, 2},
+ {0x0001ee62, 0x0001ee64, 2},
+ {0x0001ee67, 0x0001ee6a, 1},
+ {0x0001ee6c, 0x0001ee72, 1},
+ {0x0001ee74, 0x0001ee77, 1},
+ {0x0001ee79, 0x0001ee7c, 1},
+ {0x0001ee7e, 0x0001ee80, 2},
+ {0x0001ee81, 0x0001ee89, 1},
+ {0x0001ee8b, 0x0001ee9b, 1},
+ {0x0001eea1, 0x0001eea3, 1},
+ {0x0001eea5, 0x0001eea9, 1},
+ {0x0001eeab, 0x0001eebb, 1},
+ {0x0001eef0, 0x0001eef1, 1},
+ {0x0001f000, 0x0001f02b, 1},
+ {0x0001f030, 0x0001f093, 1},
+ {0x0001f0a0, 0x0001f0ae, 1},
+ {0x0001f0b1, 0x0001f0bf, 1},
+ {0x0001f0c1, 0x0001f0cf, 1},
+ {0x0001f0d1, 0x0001f0f5, 1},
+ {0x0001f100, 0x0001f10c, 1},
+ {0x0001f110, 0x0001f12e, 1},
+ {0x0001f130, 0x0001f16b, 1},
+ {0x0001f170, 0x0001f19a, 1},
+ {0x0001f1e6, 0x0001f202, 1},
+ {0x0001f210, 0x0001f23a, 1},
+ {0x0001f240, 0x0001f248, 1},
+ {0x0001f250, 0x0001f251, 1},
+ {0x0001f300, 0x0001f32c, 1},
+ {0x0001f330, 0x0001f37d, 1},
+ {0x0001f380, 0x0001f3ce, 1},
+ {0x0001f3d4, 0x0001f3f7, 1},
+ {0x0001f400, 0x0001f4fe, 1},
+ {0x0001f500, 0x0001f54a, 1},
+ {0x0001f550, 0x0001f579, 1},
+ {0x0001f57b, 0x0001f5a3, 1},
+ {0x0001f5a5, 0x0001f642, 1},
+ {0x0001f645, 0x0001f6cf, 1},
+ {0x0001f6e0, 0x0001f6ec, 1},
+ {0x0001f6f0, 0x0001f6f3, 1},
+ {0x0001f700, 0x0001f773, 1},
+ {0x0001f780, 0x0001f7d4, 1},
+ {0x0001f800, 0x0001f80b, 1},
+ {0x0001f810, 0x0001f847, 1},
+ {0x0001f850, 0x0001f859, 1},
+ {0x0001f860, 0x0001f887, 1},
+ {0x0001f890, 0x0001f8ad, 1},
+ {0x00020000, 0x0002a6d6, 1},
+ {0x0002a700, 0x0002b734, 1},
+ {0x0002b740, 0x0002b81d, 1},
+ {0x0002f800, 0x0002fa1d, 1},
+ {0x000e0001, 0x000e0020, 31},
+ {0x000e0021, 0x000e007f, 1},
+ {0x000e0100, 0x000e01ef, 1},
+ {0x000f0000, 0x000ffffd, 1},
+ {0x00100000, 0x0010fffd, 1},
+ },
+ LatinOffset: 0,
+}
+
+// size 5048 bytes (4 KiB)
+var assigned8_0_0 = &unicode.RangeTable{
+ R16: []unicode.Range16{
+ {0x0000, 0x0377, 1},
+ {0x037a, 0x037f, 1},
+ {0x0384, 0x038a, 1},
+ {0x038c, 0x038e, 2},
+ {0x038f, 0x03a1, 1},
+ {0x03a3, 0x052f, 1},
+ {0x0531, 0x0556, 1},
+ {0x0559, 0x055f, 1},
+ {0x0561, 0x0587, 1},
+ {0x0589, 0x058a, 1},
+ {0x058d, 0x058f, 1},
+ {0x0591, 0x05c7, 1},
+ {0x05d0, 0x05ea, 1},
+ {0x05f0, 0x05f4, 1},
+ {0x0600, 0x061c, 1},
+ {0x061e, 0x070d, 1},
+ {0x070f, 0x074a, 1},
+ {0x074d, 0x07b1, 1},
+ {0x07c0, 0x07fa, 1},
+ {0x0800, 0x082d, 1},
+ {0x0830, 0x083e, 1},
+ {0x0840, 0x085b, 1},
+ {0x085e, 0x08a0, 66},
+ {0x08a1, 0x08b4, 1},
+ {0x08e3, 0x0983, 1},
+ {0x0985, 0x098c, 1},
+ {0x098f, 0x0990, 1},
+ {0x0993, 0x09a8, 1},
+ {0x09aa, 0x09b0, 1},
+ {0x09b2, 0x09b6, 4},
+ {0x09b7, 0x09b9, 1},
+ {0x09bc, 0x09c4, 1},
+ {0x09c7, 0x09c8, 1},
+ {0x09cb, 0x09ce, 1},
+ {0x09d7, 0x09dc, 5},
+ {0x09dd, 0x09df, 2},
+ {0x09e0, 0x09e3, 1},
+ {0x09e6, 0x09fb, 1},
+ {0x0a01, 0x0a03, 1},
+ {0x0a05, 0x0a0a, 1},
+ {0x0a0f, 0x0a10, 1},
+ {0x0a13, 0x0a28, 1},
+ {0x0a2a, 0x0a30, 1},
+ {0x0a32, 0x0a33, 1},
+ {0x0a35, 0x0a36, 1},
+ {0x0a38, 0x0a39, 1},
+ {0x0a3c, 0x0a3e, 2},
+ {0x0a3f, 0x0a42, 1},
+ {0x0a47, 0x0a48, 1},
+ {0x0a4b, 0x0a4d, 1},
+ {0x0a51, 0x0a59, 8},
+ {0x0a5a, 0x0a5c, 1},
+ {0x0a5e, 0x0a66, 8},
+ {0x0a67, 0x0a75, 1},
+ {0x0a81, 0x0a83, 1},
+ {0x0a85, 0x0a8d, 1},
+ {0x0a8f, 0x0a91, 1},
+ {0x0a93, 0x0aa8, 1},
+ {0x0aaa, 0x0ab0, 1},
+ {0x0ab2, 0x0ab3, 1},
+ {0x0ab5, 0x0ab9, 1},
+ {0x0abc, 0x0ac5, 1},
+ {0x0ac7, 0x0ac9, 1},
+ {0x0acb, 0x0acd, 1},
+ {0x0ad0, 0x0ae0, 16},
+ {0x0ae1, 0x0ae3, 1},
+ {0x0ae6, 0x0af1, 1},
+ {0x0af9, 0x0b01, 8},
+ {0x0b02, 0x0b03, 1},
+ {0x0b05, 0x0b0c, 1},
+ {0x0b0f, 0x0b10, 1},
+ {0x0b13, 0x0b28, 1},
+ {0x0b2a, 0x0b30, 1},
+ {0x0b32, 0x0b33, 1},
+ {0x0b35, 0x0b39, 1},
+ {0x0b3c, 0x0b44, 1},
+ {0x0b47, 0x0b48, 1},
+ {0x0b4b, 0x0b4d, 1},
+ {0x0b56, 0x0b57, 1},
+ {0x0b5c, 0x0b5d, 1},
+ {0x0b5f, 0x0b63, 1},
+ {0x0b66, 0x0b77, 1},
+ {0x0b82, 0x0b83, 1},
+ {0x0b85, 0x0b8a, 1},
+ {0x0b8e, 0x0b90, 1},
+ {0x0b92, 0x0b95, 1},
+ {0x0b99, 0x0b9a, 1},
+ {0x0b9c, 0x0b9e, 2},
+ {0x0b9f, 0x0ba3, 4},
+ {0x0ba4, 0x0ba8, 4},
+ {0x0ba9, 0x0baa, 1},
+ {0x0bae, 0x0bb9, 1},
+ {0x0bbe, 0x0bc2, 1},
+ {0x0bc6, 0x0bc8, 1},
+ {0x0bca, 0x0bcd, 1},
+ {0x0bd0, 0x0bd7, 7},
+ {0x0be6, 0x0bfa, 1},
+ {0x0c00, 0x0c03, 1},
+ {0x0c05, 0x0c0c, 1},
+ {0x0c0e, 0x0c10, 1},
+ {0x0c12, 0x0c28, 1},
+ {0x0c2a, 0x0c39, 1},
+ {0x0c3d, 0x0c44, 1},
+ {0x0c46, 0x0c48, 1},
+ {0x0c4a, 0x0c4d, 1},
+ {0x0c55, 0x0c56, 1},
+ {0x0c58, 0x0c5a, 1},
+ {0x0c60, 0x0c63, 1},
+ {0x0c66, 0x0c6f, 1},
+ {0x0c78, 0x0c7f, 1},
+ {0x0c81, 0x0c83, 1},
+ {0x0c85, 0x0c8c, 1},
+ {0x0c8e, 0x0c90, 1},
+ {0x0c92, 0x0ca8, 1},
+ {0x0caa, 0x0cb3, 1},
+ {0x0cb5, 0x0cb9, 1},
+ {0x0cbc, 0x0cc4, 1},
+ {0x0cc6, 0x0cc8, 1},
+ {0x0cca, 0x0ccd, 1},
+ {0x0cd5, 0x0cd6, 1},
+ {0x0cde, 0x0ce0, 2},
+ {0x0ce1, 0x0ce3, 1},
+ {0x0ce6, 0x0cef, 1},
+ {0x0cf1, 0x0cf2, 1},
+ {0x0d01, 0x0d03, 1},
+ {0x0d05, 0x0d0c, 1},
+ {0x0d0e, 0x0d10, 1},
+ {0x0d12, 0x0d3a, 1},
+ {0x0d3d, 0x0d44, 1},
+ {0x0d46, 0x0d48, 1},
+ {0x0d4a, 0x0d4e, 1},
+ {0x0d57, 0x0d5f, 8},
+ {0x0d60, 0x0d63, 1},
+ {0x0d66, 0x0d75, 1},
+ {0x0d79, 0x0d7f, 1},
+ {0x0d82, 0x0d83, 1},
+ {0x0d85, 0x0d96, 1},
+ {0x0d9a, 0x0db1, 1},
+ {0x0db3, 0x0dbb, 1},
+ {0x0dbd, 0x0dc0, 3},
+ {0x0dc1, 0x0dc6, 1},
+ {0x0dca, 0x0dcf, 5},
+ {0x0dd0, 0x0dd4, 1},
+ {0x0dd6, 0x0dd8, 2},
+ {0x0dd9, 0x0ddf, 1},
+ {0x0de6, 0x0def, 1},
+ {0x0df2, 0x0df4, 1},
+ {0x0e01, 0x0e3a, 1},
+ {0x0e3f, 0x0e5b, 1},
+ {0x0e81, 0x0e82, 1},
+ {0x0e84, 0x0e87, 3},
+ {0x0e88, 0x0e8a, 2},
+ {0x0e8d, 0x0e94, 7},
+ {0x0e95, 0x0e97, 1},
+ {0x0e99, 0x0e9f, 1},
+ {0x0ea1, 0x0ea3, 1},
+ {0x0ea5, 0x0ea7, 2},
+ {0x0eaa, 0x0eab, 1},
+ {0x0ead, 0x0eb9, 1},
+ {0x0ebb, 0x0ebd, 1},
+ {0x0ec0, 0x0ec4, 1},
+ {0x0ec6, 0x0ec8, 2},
+ {0x0ec9, 0x0ecd, 1},
+ {0x0ed0, 0x0ed9, 1},
+ {0x0edc, 0x0edf, 1},
+ {0x0f00, 0x0f47, 1},
+ {0x0f49, 0x0f6c, 1},
+ {0x0f71, 0x0f97, 1},
+ {0x0f99, 0x0fbc, 1},
+ {0x0fbe, 0x0fcc, 1},
+ {0x0fce, 0x0fda, 1},
+ {0x1000, 0x10c5, 1},
+ {0x10c7, 0x10cd, 6},
+ {0x10d0, 0x1248, 1},
+ {0x124a, 0x124d, 1},
+ {0x1250, 0x1256, 1},
+ {0x1258, 0x125a, 2},
+ {0x125b, 0x125d, 1},
+ {0x1260, 0x1288, 1},
+ {0x128a, 0x128d, 1},
+ {0x1290, 0x12b0, 1},
+ {0x12b2, 0x12b5, 1},
+ {0x12b8, 0x12be, 1},
+ {0x12c0, 0x12c2, 2},
+ {0x12c3, 0x12c5, 1},
+ {0x12c8, 0x12d6, 1},
+ {0x12d8, 0x1310, 1},
+ {0x1312, 0x1315, 1},
+ {0x1318, 0x135a, 1},
+ {0x135d, 0x137c, 1},
+ {0x1380, 0x1399, 1},
+ {0x13a0, 0x13f5, 1},
+ {0x13f8, 0x13fd, 1},
+ {0x1400, 0x169c, 1},
+ {0x16a0, 0x16f8, 1},
+ {0x1700, 0x170c, 1},
+ {0x170e, 0x1714, 1},
+ {0x1720, 0x1736, 1},
+ {0x1740, 0x1753, 1},
+ {0x1760, 0x176c, 1},
+ {0x176e, 0x1770, 1},
+ {0x1772, 0x1773, 1},
+ {0x1780, 0x17dd, 1},
+ {0x17e0, 0x17e9, 1},
+ {0x17f0, 0x17f9, 1},
+ {0x1800, 0x180e, 1},
+ {0x1810, 0x1819, 1},
+ {0x1820, 0x1877, 1},
+ {0x1880, 0x18aa, 1},
+ {0x18b0, 0x18f5, 1},
+ {0x1900, 0x191e, 1},
+ {0x1920, 0x192b, 1},
+ {0x1930, 0x193b, 1},
+ {0x1940, 0x1944, 4},
+ {0x1945, 0x196d, 1},
+ {0x1970, 0x1974, 1},
+ {0x1980, 0x19ab, 1},
+ {0x19b0, 0x19c9, 1},
+ {0x19d0, 0x19da, 1},
+ {0x19de, 0x1a1b, 1},
+ {0x1a1e, 0x1a5e, 1},
+ {0x1a60, 0x1a7c, 1},
+ {0x1a7f, 0x1a89, 1},
+ {0x1a90, 0x1a99, 1},
+ {0x1aa0, 0x1aad, 1},
+ {0x1ab0, 0x1abe, 1},
+ {0x1b00, 0x1b4b, 1},
+ {0x1b50, 0x1b7c, 1},
+ {0x1b80, 0x1bf3, 1},
+ {0x1bfc, 0x1c37, 1},
+ {0x1c3b, 0x1c49, 1},
+ {0x1c4d, 0x1c7f, 1},
+ {0x1cc0, 0x1cc7, 1},
+ {0x1cd0, 0x1cf6, 1},
+ {0x1cf8, 0x1cf9, 1},
+ {0x1d00, 0x1df5, 1},
+ {0x1dfc, 0x1f15, 1},
+ {0x1f18, 0x1f1d, 1},
+ {0x1f20, 0x1f45, 1},
+ {0x1f48, 0x1f4d, 1},
+ {0x1f50, 0x1f57, 1},
+ {0x1f59, 0x1f5f, 2},
+ {0x1f60, 0x1f7d, 1},
+ {0x1f80, 0x1fb4, 1},
+ {0x1fb6, 0x1fc4, 1},
+ {0x1fc6, 0x1fd3, 1},
+ {0x1fd6, 0x1fdb, 1},
+ {0x1fdd, 0x1fef, 1},
+ {0x1ff2, 0x1ff4, 1},
+ {0x1ff6, 0x1ffe, 1},
+ {0x2000, 0x2064, 1},
+ {0x2066, 0x2071, 1},
+ {0x2074, 0x208e, 1},
+ {0x2090, 0x209c, 1},
+ {0x20a0, 0x20be, 1},
+ {0x20d0, 0x20f0, 1},
+ {0x2100, 0x218b, 1},
+ {0x2190, 0x23fa, 1},
+ {0x2400, 0x2426, 1},
+ {0x2440, 0x244a, 1},
+ {0x2460, 0x2b73, 1},
+ {0x2b76, 0x2b95, 1},
+ {0x2b98, 0x2bb9, 1},
+ {0x2bbd, 0x2bc8, 1},
+ {0x2bca, 0x2bd1, 1},
+ {0x2bec, 0x2bef, 1},
+ {0x2c00, 0x2c2e, 1},
+ {0x2c30, 0x2c5e, 1},
+ {0x2c60, 0x2cf3, 1},
+ {0x2cf9, 0x2d25, 1},
+ {0x2d27, 0x2d2d, 6},
+ {0x2d30, 0x2d67, 1},
+ {0x2d6f, 0x2d70, 1},
+ {0x2d7f, 0x2d96, 1},
+ {0x2da0, 0x2da6, 1},
+ {0x2da8, 0x2dae, 1},
+ {0x2db0, 0x2db6, 1},
+ {0x2db8, 0x2dbe, 1},
+ {0x2dc0, 0x2dc6, 1},
+ {0x2dc8, 0x2dce, 1},
+ {0x2dd0, 0x2dd6, 1},
+ {0x2dd8, 0x2dde, 1},
+ {0x2de0, 0x2e42, 1},
+ {0x2e80, 0x2e99, 1},
+ {0x2e9b, 0x2ef3, 1},
+ {0x2f00, 0x2fd5, 1},
+ {0x2ff0, 0x2ffb, 1},
+ {0x3000, 0x303f, 1},
+ {0x3041, 0x3096, 1},
+ {0x3099, 0x30ff, 1},
+ {0x3105, 0x312d, 1},
+ {0x3131, 0x318e, 1},
+ {0x3190, 0x31ba, 1},
+ {0x31c0, 0x31e3, 1},
+ {0x31f0, 0x321e, 1},
+ {0x3220, 0x32fe, 1},
+ {0x3300, 0x4db5, 1},
+ {0x4dc0, 0x9fd5, 1},
+ {0xa000, 0xa48c, 1},
+ {0xa490, 0xa4c6, 1},
+ {0xa4d0, 0xa62b, 1},
+ {0xa640, 0xa6f7, 1},
+ {0xa700, 0xa7ad, 1},
+ {0xa7b0, 0xa7b7, 1},
+ {0xa7f7, 0xa82b, 1},
+ {0xa830, 0xa839, 1},
+ {0xa840, 0xa877, 1},
+ {0xa880, 0xa8c4, 1},
+ {0xa8ce, 0xa8d9, 1},
+ {0xa8e0, 0xa8fd, 1},
+ {0xa900, 0xa953, 1},
+ {0xa95f, 0xa97c, 1},
+ {0xa980, 0xa9cd, 1},
+ {0xa9cf, 0xa9d9, 1},
+ {0xa9de, 0xa9fe, 1},
+ {0xaa00, 0xaa36, 1},
+ {0xaa40, 0xaa4d, 1},
+ {0xaa50, 0xaa59, 1},
+ {0xaa5c, 0xaac2, 1},
+ {0xaadb, 0xaaf6, 1},
+ {0xab01, 0xab06, 1},
+ {0xab09, 0xab0e, 1},
+ {0xab11, 0xab16, 1},
+ {0xab20, 0xab26, 1},
+ {0xab28, 0xab2e, 1},
+ {0xab30, 0xab65, 1},
+ {0xab70, 0xabed, 1},
+ {0xabf0, 0xabf9, 1},
+ {0xac00, 0xd7a3, 1},
+ {0xd7b0, 0xd7c6, 1},
+ {0xd7cb, 0xd7fb, 1},
+ {0xd800, 0xfa6d, 1},
+ {0xfa70, 0xfad9, 1},
+ {0xfb00, 0xfb06, 1},
+ {0xfb13, 0xfb17, 1},
+ {0xfb1d, 0xfb36, 1},
+ {0xfb38, 0xfb3c, 1},
+ {0xfb3e, 0xfb40, 2},
+ {0xfb41, 0xfb43, 2},
+ {0xfb44, 0xfb46, 2},
+ {0xfb47, 0xfbc1, 1},
+ {0xfbd3, 0xfd3f, 1},
+ {0xfd50, 0xfd8f, 1},
+ {0xfd92, 0xfdc7, 1},
+ {0xfdf0, 0xfdfd, 1},
+ {0xfe00, 0xfe19, 1},
+ {0xfe20, 0xfe52, 1},
+ {0xfe54, 0xfe66, 1},
+ {0xfe68, 0xfe6b, 1},
+ {0xfe70, 0xfe74, 1},
+ {0xfe76, 0xfefc, 1},
+ {0xfeff, 0xff01, 2},
+ {0xff02, 0xffbe, 1},
+ {0xffc2, 0xffc7, 1},
+ {0xffca, 0xffcf, 1},
+ {0xffd2, 0xffd7, 1},
+ {0xffda, 0xffdc, 1},
+ {0xffe0, 0xffe6, 1},
+ {0xffe8, 0xffee, 1},
+ {0xfff9, 0xfffd, 1},
+ },
+ R32: []unicode.Range32{
+ {0x00010000, 0x0001000b, 1},
+ {0x0001000d, 0x00010026, 1},
+ {0x00010028, 0x0001003a, 1},
+ {0x0001003c, 0x0001003d, 1},
+ {0x0001003f, 0x0001004d, 1},
+ {0x00010050, 0x0001005d, 1},
+ {0x00010080, 0x000100fa, 1},
+ {0x00010100, 0x00010102, 1},
+ {0x00010107, 0x00010133, 1},
+ {0x00010137, 0x0001018c, 1},
+ {0x00010190, 0x0001019b, 1},
+ {0x000101a0, 0x000101d0, 48},
+ {0x000101d1, 0x000101fd, 1},
+ {0x00010280, 0x0001029c, 1},
+ {0x000102a0, 0x000102d0, 1},
+ {0x000102e0, 0x000102fb, 1},
+ {0x00010300, 0x00010323, 1},
+ {0x00010330, 0x0001034a, 1},
+ {0x00010350, 0x0001037a, 1},
+ {0x00010380, 0x0001039d, 1},
+ {0x0001039f, 0x000103c3, 1},
+ {0x000103c8, 0x000103d5, 1},
+ {0x00010400, 0x0001049d, 1},
+ {0x000104a0, 0x000104a9, 1},
+ {0x00010500, 0x00010527, 1},
+ {0x00010530, 0x00010563, 1},
+ {0x0001056f, 0x00010600, 145},
+ {0x00010601, 0x00010736, 1},
+ {0x00010740, 0x00010755, 1},
+ {0x00010760, 0x00010767, 1},
+ {0x00010800, 0x00010805, 1},
+ {0x00010808, 0x0001080a, 2},
+ {0x0001080b, 0x00010835, 1},
+ {0x00010837, 0x00010838, 1},
+ {0x0001083c, 0x0001083f, 3},
+ {0x00010840, 0x00010855, 1},
+ {0x00010857, 0x0001089e, 1},
+ {0x000108a7, 0x000108af, 1},
+ {0x000108e0, 0x000108f2, 1},
+ {0x000108f4, 0x000108f5, 1},
+ {0x000108fb, 0x0001091b, 1},
+ {0x0001091f, 0x00010939, 1},
+ {0x0001093f, 0x00010980, 65},
+ {0x00010981, 0x000109b7, 1},
+ {0x000109bc, 0x000109cf, 1},
+ {0x000109d2, 0x00010a03, 1},
+ {0x00010a05, 0x00010a06, 1},
+ {0x00010a0c, 0x00010a13, 1},
+ {0x00010a15, 0x00010a17, 1},
+ {0x00010a19, 0x00010a33, 1},
+ {0x00010a38, 0x00010a3a, 1},
+ {0x00010a3f, 0x00010a47, 1},
+ {0x00010a50, 0x00010a58, 1},
+ {0x00010a60, 0x00010a9f, 1},
+ {0x00010ac0, 0x00010ae6, 1},
+ {0x00010aeb, 0x00010af6, 1},
+ {0x00010b00, 0x00010b35, 1},
+ {0x00010b39, 0x00010b55, 1},
+ {0x00010b58, 0x00010b72, 1},
+ {0x00010b78, 0x00010b91, 1},
+ {0x00010b99, 0x00010b9c, 1},
+ {0x00010ba9, 0x00010baf, 1},
+ {0x00010c00, 0x00010c48, 1},
+ {0x00010c80, 0x00010cb2, 1},
+ {0x00010cc0, 0x00010cf2, 1},
+ {0x00010cfa, 0x00010cff, 1},
+ {0x00010e60, 0x00010e7e, 1},
+ {0x00011000, 0x0001104d, 1},
+ {0x00011052, 0x0001106f, 1},
+ {0x0001107f, 0x000110c1, 1},
+ {0x000110d0, 0x000110e8, 1},
+ {0x000110f0, 0x000110f9, 1},
+ {0x00011100, 0x00011134, 1},
+ {0x00011136, 0x00011143, 1},
+ {0x00011150, 0x00011176, 1},
+ {0x00011180, 0x000111cd, 1},
+ {0x000111d0, 0x000111df, 1},
+ {0x000111e1, 0x000111f4, 1},
+ {0x00011200, 0x00011211, 1},
+ {0x00011213, 0x0001123d, 1},
+ {0x00011280, 0x00011286, 1},
+ {0x00011288, 0x0001128a, 2},
+ {0x0001128b, 0x0001128d, 1},
+ {0x0001128f, 0x0001129d, 1},
+ {0x0001129f, 0x000112a9, 1},
+ {0x000112b0, 0x000112ea, 1},
+ {0x000112f0, 0x000112f9, 1},
+ {0x00011300, 0x00011303, 1},
+ {0x00011305, 0x0001130c, 1},
+ {0x0001130f, 0x00011310, 1},
+ {0x00011313, 0x00011328, 1},
+ {0x0001132a, 0x00011330, 1},
+ {0x00011332, 0x00011333, 1},
+ {0x00011335, 0x00011339, 1},
+ {0x0001133c, 0x00011344, 1},
+ {0x00011347, 0x00011348, 1},
+ {0x0001134b, 0x0001134d, 1},
+ {0x00011350, 0x00011357, 7},
+ {0x0001135d, 0x00011363, 1},
+ {0x00011366, 0x0001136c, 1},
+ {0x00011370, 0x00011374, 1},
+ {0x00011480, 0x000114c7, 1},
+ {0x000114d0, 0x000114d9, 1},
+ {0x00011580, 0x000115b5, 1},
+ {0x000115b8, 0x000115dd, 1},
+ {0x00011600, 0x00011644, 1},
+ {0x00011650, 0x00011659, 1},
+ {0x00011680, 0x000116b7, 1},
+ {0x000116c0, 0x000116c9, 1},
+ {0x00011700, 0x00011719, 1},
+ {0x0001171d, 0x0001172b, 1},
+ {0x00011730, 0x0001173f, 1},
+ {0x000118a0, 0x000118f2, 1},
+ {0x000118ff, 0x00011ac0, 449},
+ {0x00011ac1, 0x00011af8, 1},
+ {0x00012000, 0x00012399, 1},
+ {0x00012400, 0x0001246e, 1},
+ {0x00012470, 0x00012474, 1},
+ {0x00012480, 0x00012543, 1},
+ {0x00013000, 0x0001342e, 1},
+ {0x00014400, 0x00014646, 1},
+ {0x00016800, 0x00016a38, 1},
+ {0x00016a40, 0x00016a5e, 1},
+ {0x00016a60, 0x00016a69, 1},
+ {0x00016a6e, 0x00016a6f, 1},
+ {0x00016ad0, 0x00016aed, 1},
+ {0x00016af0, 0x00016af5, 1},
+ {0x00016b00, 0x00016b45, 1},
+ {0x00016b50, 0x00016b59, 1},
+ {0x00016b5b, 0x00016b61, 1},
+ {0x00016b63, 0x00016b77, 1},
+ {0x00016b7d, 0x00016b8f, 1},
+ {0x00016f00, 0x00016f44, 1},
+ {0x00016f50, 0x00016f7e, 1},
+ {0x00016f8f, 0x00016f9f, 1},
+ {0x0001b000, 0x0001b001, 1},
+ {0x0001bc00, 0x0001bc6a, 1},
+ {0x0001bc70, 0x0001bc7c, 1},
+ {0x0001bc80, 0x0001bc88, 1},
+ {0x0001bc90, 0x0001bc99, 1},
+ {0x0001bc9c, 0x0001bca3, 1},
+ {0x0001d000, 0x0001d0f5, 1},
+ {0x0001d100, 0x0001d126, 1},
+ {0x0001d129, 0x0001d1e8, 1},
+ {0x0001d200, 0x0001d245, 1},
+ {0x0001d300, 0x0001d356, 1},
+ {0x0001d360, 0x0001d371, 1},
+ {0x0001d400, 0x0001d454, 1},
+ {0x0001d456, 0x0001d49c, 1},
+ {0x0001d49e, 0x0001d49f, 1},
+ {0x0001d4a2, 0x0001d4a5, 3},
+ {0x0001d4a6, 0x0001d4a9, 3},
+ {0x0001d4aa, 0x0001d4ac, 1},
+ {0x0001d4ae, 0x0001d4b9, 1},
+ {0x0001d4bb, 0x0001d4bd, 2},
+ {0x0001d4be, 0x0001d4c3, 1},
+ {0x0001d4c5, 0x0001d505, 1},
+ {0x0001d507, 0x0001d50a, 1},
+ {0x0001d50d, 0x0001d514, 1},
+ {0x0001d516, 0x0001d51c, 1},
+ {0x0001d51e, 0x0001d539, 1},
+ {0x0001d53b, 0x0001d53e, 1},
+ {0x0001d540, 0x0001d544, 1},
+ {0x0001d546, 0x0001d54a, 4},
+ {0x0001d54b, 0x0001d550, 1},
+ {0x0001d552, 0x0001d6a5, 1},
+ {0x0001d6a8, 0x0001d7cb, 1},
+ {0x0001d7ce, 0x0001da8b, 1},
+ {0x0001da9b, 0x0001da9f, 1},
+ {0x0001daa1, 0x0001daaf, 1},
+ {0x0001e800, 0x0001e8c4, 1},
+ {0x0001e8c7, 0x0001e8d6, 1},
+ {0x0001ee00, 0x0001ee03, 1},
+ {0x0001ee05, 0x0001ee1f, 1},
+ {0x0001ee21, 0x0001ee22, 1},
+ {0x0001ee24, 0x0001ee27, 3},
+ {0x0001ee29, 0x0001ee32, 1},
+ {0x0001ee34, 0x0001ee37, 1},
+ {0x0001ee39, 0x0001ee3b, 2},
+ {0x0001ee42, 0x0001ee47, 5},
+ {0x0001ee49, 0x0001ee4d, 2},
+ {0x0001ee4e, 0x0001ee4f, 1},
+ {0x0001ee51, 0x0001ee52, 1},
+ {0x0001ee54, 0x0001ee57, 3},
+ {0x0001ee59, 0x0001ee61, 2},
+ {0x0001ee62, 0x0001ee64, 2},
+ {0x0001ee67, 0x0001ee6a, 1},
+ {0x0001ee6c, 0x0001ee72, 1},
+ {0x0001ee74, 0x0001ee77, 1},
+ {0x0001ee79, 0x0001ee7c, 1},
+ {0x0001ee7e, 0x0001ee80, 2},
+ {0x0001ee81, 0x0001ee89, 1},
+ {0x0001ee8b, 0x0001ee9b, 1},
+ {0x0001eea1, 0x0001eea3, 1},
+ {0x0001eea5, 0x0001eea9, 1},
+ {0x0001eeab, 0x0001eebb, 1},
+ {0x0001eef0, 0x0001eef1, 1},
+ {0x0001f000, 0x0001f02b, 1},
+ {0x0001f030, 0x0001f093, 1},
+ {0x0001f0a0, 0x0001f0ae, 1},
+ {0x0001f0b1, 0x0001f0bf, 1},
+ {0x0001f0c1, 0x0001f0cf, 1},
+ {0x0001f0d1, 0x0001f0f5, 1},
+ {0x0001f100, 0x0001f10c, 1},
+ {0x0001f110, 0x0001f12e, 1},
+ {0x0001f130, 0x0001f16b, 1},
+ {0x0001f170, 0x0001f19a, 1},
+ {0x0001f1e6, 0x0001f202, 1},
+ {0x0001f210, 0x0001f23a, 1},
+ {0x0001f240, 0x0001f248, 1},
+ {0x0001f250, 0x0001f251, 1},
+ {0x0001f300, 0x0001f579, 1},
+ {0x0001f57b, 0x0001f5a3, 1},
+ {0x0001f5a5, 0x0001f6d0, 1},
+ {0x0001f6e0, 0x0001f6ec, 1},
+ {0x0001f6f0, 0x0001f6f3, 1},
+ {0x0001f700, 0x0001f773, 1},
+ {0x0001f780, 0x0001f7d4, 1},
+ {0x0001f800, 0x0001f80b, 1},
+ {0x0001f810, 0x0001f847, 1},
+ {0x0001f850, 0x0001f859, 1},
+ {0x0001f860, 0x0001f887, 1},
+ {0x0001f890, 0x0001f8ad, 1},
+ {0x0001f910, 0x0001f918, 1},
+ {0x0001f980, 0x0001f984, 1},
+ {0x0001f9c0, 0x00020000, 1600},
+ {0x00020001, 0x0002a6d6, 1},
+ {0x0002a700, 0x0002b734, 1},
+ {0x0002b740, 0x0002b81d, 1},
+ {0x0002b820, 0x0002cea1, 1},
+ {0x0002f800, 0x0002fa1d, 1},
+ {0x000e0001, 0x000e0020, 31},
+ {0x000e0021, 0x000e007f, 1},
+ {0x000e0100, 0x000e01ef, 1},
+ {0x000f0000, 0x000ffffd, 1},
+ {0x00100000, 0x0010fffd, 1},
+ },
+ LatinOffset: 0,
+}
+
+// size 5348 bytes (5 KiB)
+var assigned9_0_0 = &unicode.RangeTable{
+ R16: []unicode.Range16{
+ {0x0000, 0x0377, 1},
+ {0x037a, 0x037f, 1},
+ {0x0384, 0x038a, 1},
+ {0x038c, 0x038e, 2},
+ {0x038f, 0x03a1, 1},
+ {0x03a3, 0x052f, 1},
+ {0x0531, 0x0556, 1},
+ {0x0559, 0x055f, 1},
+ {0x0561, 0x0587, 1},
+ {0x0589, 0x058a, 1},
+ {0x058d, 0x058f, 1},
+ {0x0591, 0x05c7, 1},
+ {0x05d0, 0x05ea, 1},
+ {0x05f0, 0x05f4, 1},
+ {0x0600, 0x061c, 1},
+ {0x061e, 0x070d, 1},
+ {0x070f, 0x074a, 1},
+ {0x074d, 0x07b1, 1},
+ {0x07c0, 0x07fa, 1},
+ {0x0800, 0x082d, 1},
+ {0x0830, 0x083e, 1},
+ {0x0840, 0x085b, 1},
+ {0x085e, 0x08a0, 66},
+ {0x08a1, 0x08b4, 1},
+ {0x08b6, 0x08bd, 1},
+ {0x08d4, 0x0983, 1},
+ {0x0985, 0x098c, 1},
+ {0x098f, 0x0990, 1},
+ {0x0993, 0x09a8, 1},
+ {0x09aa, 0x09b0, 1},
+ {0x09b2, 0x09b6, 4},
+ {0x09b7, 0x09b9, 1},
+ {0x09bc, 0x09c4, 1},
+ {0x09c7, 0x09c8, 1},
+ {0x09cb, 0x09ce, 1},
+ {0x09d7, 0x09dc, 5},
+ {0x09dd, 0x09df, 2},
+ {0x09e0, 0x09e3, 1},
+ {0x09e6, 0x09fb, 1},
+ {0x0a01, 0x0a03, 1},
+ {0x0a05, 0x0a0a, 1},
+ {0x0a0f, 0x0a10, 1},
+ {0x0a13, 0x0a28, 1},
+ {0x0a2a, 0x0a30, 1},
+ {0x0a32, 0x0a33, 1},
+ {0x0a35, 0x0a36, 1},
+ {0x0a38, 0x0a39, 1},
+ {0x0a3c, 0x0a3e, 2},
+ {0x0a3f, 0x0a42, 1},
+ {0x0a47, 0x0a48, 1},
+ {0x0a4b, 0x0a4d, 1},
+ {0x0a51, 0x0a59, 8},
+ {0x0a5a, 0x0a5c, 1},
+ {0x0a5e, 0x0a66, 8},
+ {0x0a67, 0x0a75, 1},
+ {0x0a81, 0x0a83, 1},
+ {0x0a85, 0x0a8d, 1},
+ {0x0a8f, 0x0a91, 1},
+ {0x0a93, 0x0aa8, 1},
+ {0x0aaa, 0x0ab0, 1},
+ {0x0ab2, 0x0ab3, 1},
+ {0x0ab5, 0x0ab9, 1},
+ {0x0abc, 0x0ac5, 1},
+ {0x0ac7, 0x0ac9, 1},
+ {0x0acb, 0x0acd, 1},
+ {0x0ad0, 0x0ae0, 16},
+ {0x0ae1, 0x0ae3, 1},
+ {0x0ae6, 0x0af1, 1},
+ {0x0af9, 0x0b01, 8},
+ {0x0b02, 0x0b03, 1},
+ {0x0b05, 0x0b0c, 1},
+ {0x0b0f, 0x0b10, 1},
+ {0x0b13, 0x0b28, 1},
+ {0x0b2a, 0x0b30, 1},
+ {0x0b32, 0x0b33, 1},
+ {0x0b35, 0x0b39, 1},
+ {0x0b3c, 0x0b44, 1},
+ {0x0b47, 0x0b48, 1},
+ {0x0b4b, 0x0b4d, 1},
+ {0x0b56, 0x0b57, 1},
+ {0x0b5c, 0x0b5d, 1},
+ {0x0b5f, 0x0b63, 1},
+ {0x0b66, 0x0b77, 1},
+ {0x0b82, 0x0b83, 1},
+ {0x0b85, 0x0b8a, 1},
+ {0x0b8e, 0x0b90, 1},
+ {0x0b92, 0x0b95, 1},
+ {0x0b99, 0x0b9a, 1},
+ {0x0b9c, 0x0b9e, 2},
+ {0x0b9f, 0x0ba3, 4},
+ {0x0ba4, 0x0ba8, 4},
+ {0x0ba9, 0x0baa, 1},
+ {0x0bae, 0x0bb9, 1},
+ {0x0bbe, 0x0bc2, 1},
+ {0x0bc6, 0x0bc8, 1},
+ {0x0bca, 0x0bcd, 1},
+ {0x0bd0, 0x0bd7, 7},
+ {0x0be6, 0x0bfa, 1},
+ {0x0c00, 0x0c03, 1},
+ {0x0c05, 0x0c0c, 1},
+ {0x0c0e, 0x0c10, 1},
+ {0x0c12, 0x0c28, 1},
+ {0x0c2a, 0x0c39, 1},
+ {0x0c3d, 0x0c44, 1},
+ {0x0c46, 0x0c48, 1},
+ {0x0c4a, 0x0c4d, 1},
+ {0x0c55, 0x0c56, 1},
+ {0x0c58, 0x0c5a, 1},
+ {0x0c60, 0x0c63, 1},
+ {0x0c66, 0x0c6f, 1},
+ {0x0c78, 0x0c83, 1},
+ {0x0c85, 0x0c8c, 1},
+ {0x0c8e, 0x0c90, 1},
+ {0x0c92, 0x0ca8, 1},
+ {0x0caa, 0x0cb3, 1},
+ {0x0cb5, 0x0cb9, 1},
+ {0x0cbc, 0x0cc4, 1},
+ {0x0cc6, 0x0cc8, 1},
+ {0x0cca, 0x0ccd, 1},
+ {0x0cd5, 0x0cd6, 1},
+ {0x0cde, 0x0ce0, 2},
+ {0x0ce1, 0x0ce3, 1},
+ {0x0ce6, 0x0cef, 1},
+ {0x0cf1, 0x0cf2, 1},
+ {0x0d01, 0x0d03, 1},
+ {0x0d05, 0x0d0c, 1},
+ {0x0d0e, 0x0d10, 1},
+ {0x0d12, 0x0d3a, 1},
+ {0x0d3d, 0x0d44, 1},
+ {0x0d46, 0x0d48, 1},
+ {0x0d4a, 0x0d4f, 1},
+ {0x0d54, 0x0d63, 1},
+ {0x0d66, 0x0d7f, 1},
+ {0x0d82, 0x0d83, 1},
+ {0x0d85, 0x0d96, 1},
+ {0x0d9a, 0x0db1, 1},
+ {0x0db3, 0x0dbb, 1},
+ {0x0dbd, 0x0dc0, 3},
+ {0x0dc1, 0x0dc6, 1},
+ {0x0dca, 0x0dcf, 5},
+ {0x0dd0, 0x0dd4, 1},
+ {0x0dd6, 0x0dd8, 2},
+ {0x0dd9, 0x0ddf, 1},
+ {0x0de6, 0x0def, 1},
+ {0x0df2, 0x0df4, 1},
+ {0x0e01, 0x0e3a, 1},
+ {0x0e3f, 0x0e5b, 1},
+ {0x0e81, 0x0e82, 1},
+ {0x0e84, 0x0e87, 3},
+ {0x0e88, 0x0e8a, 2},
+ {0x0e8d, 0x0e94, 7},
+ {0x0e95, 0x0e97, 1},
+ {0x0e99, 0x0e9f, 1},
+ {0x0ea1, 0x0ea3, 1},
+ {0x0ea5, 0x0ea7, 2},
+ {0x0eaa, 0x0eab, 1},
+ {0x0ead, 0x0eb9, 1},
+ {0x0ebb, 0x0ebd, 1},
+ {0x0ec0, 0x0ec4, 1},
+ {0x0ec6, 0x0ec8, 2},
+ {0x0ec9, 0x0ecd, 1},
+ {0x0ed0, 0x0ed9, 1},
+ {0x0edc, 0x0edf, 1},
+ {0x0f00, 0x0f47, 1},
+ {0x0f49, 0x0f6c, 1},
+ {0x0f71, 0x0f97, 1},
+ {0x0f99, 0x0fbc, 1},
+ {0x0fbe, 0x0fcc, 1},
+ {0x0fce, 0x0fda, 1},
+ {0x1000, 0x10c5, 1},
+ {0x10c7, 0x10cd, 6},
+ {0x10d0, 0x1248, 1},
+ {0x124a, 0x124d, 1},
+ {0x1250, 0x1256, 1},
+ {0x1258, 0x125a, 2},
+ {0x125b, 0x125d, 1},
+ {0x1260, 0x1288, 1},
+ {0x128a, 0x128d, 1},
+ {0x1290, 0x12b0, 1},
+ {0x12b2, 0x12b5, 1},
+ {0x12b8, 0x12be, 1},
+ {0x12c0, 0x12c2, 2},
+ {0x12c3, 0x12c5, 1},
+ {0x12c8, 0x12d6, 1},
+ {0x12d8, 0x1310, 1},
+ {0x1312, 0x1315, 1},
+ {0x1318, 0x135a, 1},
+ {0x135d, 0x137c, 1},
+ {0x1380, 0x1399, 1},
+ {0x13a0, 0x13f5, 1},
+ {0x13f8, 0x13fd, 1},
+ {0x1400, 0x169c, 1},
+ {0x16a0, 0x16f8, 1},
+ {0x1700, 0x170c, 1},
+ {0x170e, 0x1714, 1},
+ {0x1720, 0x1736, 1},
+ {0x1740, 0x1753, 1},
+ {0x1760, 0x176c, 1},
+ {0x176e, 0x1770, 1},
+ {0x1772, 0x1773, 1},
+ {0x1780, 0x17dd, 1},
+ {0x17e0, 0x17e9, 1},
+ {0x17f0, 0x17f9, 1},
+ {0x1800, 0x180e, 1},
+ {0x1810, 0x1819, 1},
+ {0x1820, 0x1877, 1},
+ {0x1880, 0x18aa, 1},
+ {0x18b0, 0x18f5, 1},
+ {0x1900, 0x191e, 1},
+ {0x1920, 0x192b, 1},
+ {0x1930, 0x193b, 1},
+ {0x1940, 0x1944, 4},
+ {0x1945, 0x196d, 1},
+ {0x1970, 0x1974, 1},
+ {0x1980, 0x19ab, 1},
+ {0x19b0, 0x19c9, 1},
+ {0x19d0, 0x19da, 1},
+ {0x19de, 0x1a1b, 1},
+ {0x1a1e, 0x1a5e, 1},
+ {0x1a60, 0x1a7c, 1},
+ {0x1a7f, 0x1a89, 1},
+ {0x1a90, 0x1a99, 1},
+ {0x1aa0, 0x1aad, 1},
+ {0x1ab0, 0x1abe, 1},
+ {0x1b00, 0x1b4b, 1},
+ {0x1b50, 0x1b7c, 1},
+ {0x1b80, 0x1bf3, 1},
+ {0x1bfc, 0x1c37, 1},
+ {0x1c3b, 0x1c49, 1},
+ {0x1c4d, 0x1c88, 1},
+ {0x1cc0, 0x1cc7, 1},
+ {0x1cd0, 0x1cf6, 1},
+ {0x1cf8, 0x1cf9, 1},
+ {0x1d00, 0x1df5, 1},
+ {0x1dfb, 0x1f15, 1},
+ {0x1f18, 0x1f1d, 1},
+ {0x1f20, 0x1f45, 1},
+ {0x1f48, 0x1f4d, 1},
+ {0x1f50, 0x1f57, 1},
+ {0x1f59, 0x1f5f, 2},
+ {0x1f60, 0x1f7d, 1},
+ {0x1f80, 0x1fb4, 1},
+ {0x1fb6, 0x1fc4, 1},
+ {0x1fc6, 0x1fd3, 1},
+ {0x1fd6, 0x1fdb, 1},
+ {0x1fdd, 0x1fef, 1},
+ {0x1ff2, 0x1ff4, 1},
+ {0x1ff6, 0x1ffe, 1},
+ {0x2000, 0x2064, 1},
+ {0x2066, 0x2071, 1},
+ {0x2074, 0x208e, 1},
+ {0x2090, 0x209c, 1},
+ {0x20a0, 0x20be, 1},
+ {0x20d0, 0x20f0, 1},
+ {0x2100, 0x218b, 1},
+ {0x2190, 0x23fe, 1},
+ {0x2400, 0x2426, 1},
+ {0x2440, 0x244a, 1},
+ {0x2460, 0x2b73, 1},
+ {0x2b76, 0x2b95, 1},
+ {0x2b98, 0x2bb9, 1},
+ {0x2bbd, 0x2bc8, 1},
+ {0x2bca, 0x2bd1, 1},
+ {0x2bec, 0x2bef, 1},
+ {0x2c00, 0x2c2e, 1},
+ {0x2c30, 0x2c5e, 1},
+ {0x2c60, 0x2cf3, 1},
+ {0x2cf9, 0x2d25, 1},
+ {0x2d27, 0x2d2d, 6},
+ {0x2d30, 0x2d67, 1},
+ {0x2d6f, 0x2d70, 1},
+ {0x2d7f, 0x2d96, 1},
+ {0x2da0, 0x2da6, 1},
+ {0x2da8, 0x2dae, 1},
+ {0x2db0, 0x2db6, 1},
+ {0x2db8, 0x2dbe, 1},
+ {0x2dc0, 0x2dc6, 1},
+ {0x2dc8, 0x2dce, 1},
+ {0x2dd0, 0x2dd6, 1},
+ {0x2dd8, 0x2dde, 1},
+ {0x2de0, 0x2e44, 1},
+ {0x2e80, 0x2e99, 1},
+ {0x2e9b, 0x2ef3, 1},
+ {0x2f00, 0x2fd5, 1},
+ {0x2ff0, 0x2ffb, 1},
+ {0x3000, 0x303f, 1},
+ {0x3041, 0x3096, 1},
+ {0x3099, 0x30ff, 1},
+ {0x3105, 0x312d, 1},
+ {0x3131, 0x318e, 1},
+ {0x3190, 0x31ba, 1},
+ {0x31c0, 0x31e3, 1},
+ {0x31f0, 0x321e, 1},
+ {0x3220, 0x32fe, 1},
+ {0x3300, 0x4db5, 1},
+ {0x4dc0, 0x9fd5, 1},
+ {0xa000, 0xa48c, 1},
+ {0xa490, 0xa4c6, 1},
+ {0xa4d0, 0xa62b, 1},
+ {0xa640, 0xa6f7, 1},
+ {0xa700, 0xa7ae, 1},
+ {0xa7b0, 0xa7b7, 1},
+ {0xa7f7, 0xa82b, 1},
+ {0xa830, 0xa839, 1},
+ {0xa840, 0xa877, 1},
+ {0xa880, 0xa8c5, 1},
+ {0xa8ce, 0xa8d9, 1},
+ {0xa8e0, 0xa8fd, 1},
+ {0xa900, 0xa953, 1},
+ {0xa95f, 0xa97c, 1},
+ {0xa980, 0xa9cd, 1},
+ {0xa9cf, 0xa9d9, 1},
+ {0xa9de, 0xa9fe, 1},
+ {0xaa00, 0xaa36, 1},
+ {0xaa40, 0xaa4d, 1},
+ {0xaa50, 0xaa59, 1},
+ {0xaa5c, 0xaac2, 1},
+ {0xaadb, 0xaaf6, 1},
+ {0xab01, 0xab06, 1},
+ {0xab09, 0xab0e, 1},
+ {0xab11, 0xab16, 1},
+ {0xab20, 0xab26, 1},
+ {0xab28, 0xab2e, 1},
+ {0xab30, 0xab65, 1},
+ {0xab70, 0xabed, 1},
+ {0xabf0, 0xabf9, 1},
+ {0xac00, 0xd7a3, 1},
+ {0xd7b0, 0xd7c6, 1},
+ {0xd7cb, 0xd7fb, 1},
+ {0xd800, 0xfa6d, 1},
+ {0xfa70, 0xfad9, 1},
+ {0xfb00, 0xfb06, 1},
+ {0xfb13, 0xfb17, 1},
+ {0xfb1d, 0xfb36, 1},
+ {0xfb38, 0xfb3c, 1},
+ {0xfb3e, 0xfb40, 2},
+ {0xfb41, 0xfb43, 2},
+ {0xfb44, 0xfb46, 2},
+ {0xfb47, 0xfbc1, 1},
+ {0xfbd3, 0xfd3f, 1},
+ {0xfd50, 0xfd8f, 1},
+ {0xfd92, 0xfdc7, 1},
+ {0xfdf0, 0xfdfd, 1},
+ {0xfe00, 0xfe19, 1},
+ {0xfe20, 0xfe52, 1},
+ {0xfe54, 0xfe66, 1},
+ {0xfe68, 0xfe6b, 1},
+ {0xfe70, 0xfe74, 1},
+ {0xfe76, 0xfefc, 1},
+ {0xfeff, 0xff01, 2},
+ {0xff02, 0xffbe, 1},
+ {0xffc2, 0xffc7, 1},
+ {0xffca, 0xffcf, 1},
+ {0xffd2, 0xffd7, 1},
+ {0xffda, 0xffdc, 1},
+ {0xffe0, 0xffe6, 1},
+ {0xffe8, 0xffee, 1},
+ {0xfff9, 0xfffd, 1},
+ },
+ R32: []unicode.Range32{
+ {0x00010000, 0x0001000b, 1},
+ {0x0001000d, 0x00010026, 1},
+ {0x00010028, 0x0001003a, 1},
+ {0x0001003c, 0x0001003d, 1},
+ {0x0001003f, 0x0001004d, 1},
+ {0x00010050, 0x0001005d, 1},
+ {0x00010080, 0x000100fa, 1},
+ {0x00010100, 0x00010102, 1},
+ {0x00010107, 0x00010133, 1},
+ {0x00010137, 0x0001018e, 1},
+ {0x00010190, 0x0001019b, 1},
+ {0x000101a0, 0x000101d0, 48},
+ {0x000101d1, 0x000101fd, 1},
+ {0x00010280, 0x0001029c, 1},
+ {0x000102a0, 0x000102d0, 1},
+ {0x000102e0, 0x000102fb, 1},
+ {0x00010300, 0x00010323, 1},
+ {0x00010330, 0x0001034a, 1},
+ {0x00010350, 0x0001037a, 1},
+ {0x00010380, 0x0001039d, 1},
+ {0x0001039f, 0x000103c3, 1},
+ {0x000103c8, 0x000103d5, 1},
+ {0x00010400, 0x0001049d, 1},
+ {0x000104a0, 0x000104a9, 1},
+ {0x000104b0, 0x000104d3, 1},
+ {0x000104d8, 0x000104fb, 1},
+ {0x00010500, 0x00010527, 1},
+ {0x00010530, 0x00010563, 1},
+ {0x0001056f, 0x00010600, 145},
+ {0x00010601, 0x00010736, 1},
+ {0x00010740, 0x00010755, 1},
+ {0x00010760, 0x00010767, 1},
+ {0x00010800, 0x00010805, 1},
+ {0x00010808, 0x0001080a, 2},
+ {0x0001080b, 0x00010835, 1},
+ {0x00010837, 0x00010838, 1},
+ {0x0001083c, 0x0001083f, 3},
+ {0x00010840, 0x00010855, 1},
+ {0x00010857, 0x0001089e, 1},
+ {0x000108a7, 0x000108af, 1},
+ {0x000108e0, 0x000108f2, 1},
+ {0x000108f4, 0x000108f5, 1},
+ {0x000108fb, 0x0001091b, 1},
+ {0x0001091f, 0x00010939, 1},
+ {0x0001093f, 0x00010980, 65},
+ {0x00010981, 0x000109b7, 1},
+ {0x000109bc, 0x000109cf, 1},
+ {0x000109d2, 0x00010a03, 1},
+ {0x00010a05, 0x00010a06, 1},
+ {0x00010a0c, 0x00010a13, 1},
+ {0x00010a15, 0x00010a17, 1},
+ {0x00010a19, 0x00010a33, 1},
+ {0x00010a38, 0x00010a3a, 1},
+ {0x00010a3f, 0x00010a47, 1},
+ {0x00010a50, 0x00010a58, 1},
+ {0x00010a60, 0x00010a9f, 1},
+ {0x00010ac0, 0x00010ae6, 1},
+ {0x00010aeb, 0x00010af6, 1},
+ {0x00010b00, 0x00010b35, 1},
+ {0x00010b39, 0x00010b55, 1},
+ {0x00010b58, 0x00010b72, 1},
+ {0x00010b78, 0x00010b91, 1},
+ {0x00010b99, 0x00010b9c, 1},
+ {0x00010ba9, 0x00010baf, 1},
+ {0x00010c00, 0x00010c48, 1},
+ {0x00010c80, 0x00010cb2, 1},
+ {0x00010cc0, 0x00010cf2, 1},
+ {0x00010cfa, 0x00010cff, 1},
+ {0x00010e60, 0x00010e7e, 1},
+ {0x00011000, 0x0001104d, 1},
+ {0x00011052, 0x0001106f, 1},
+ {0x0001107f, 0x000110c1, 1},
+ {0x000110d0, 0x000110e8, 1},
+ {0x000110f0, 0x000110f9, 1},
+ {0x00011100, 0x00011134, 1},
+ {0x00011136, 0x00011143, 1},
+ {0x00011150, 0x00011176, 1},
+ {0x00011180, 0x000111cd, 1},
+ {0x000111d0, 0x000111df, 1},
+ {0x000111e1, 0x000111f4, 1},
+ {0x00011200, 0x00011211, 1},
+ {0x00011213, 0x0001123e, 1},
+ {0x00011280, 0x00011286, 1},
+ {0x00011288, 0x0001128a, 2},
+ {0x0001128b, 0x0001128d, 1},
+ {0x0001128f, 0x0001129d, 1},
+ {0x0001129f, 0x000112a9, 1},
+ {0x000112b0, 0x000112ea, 1},
+ {0x000112f0, 0x000112f9, 1},
+ {0x00011300, 0x00011303, 1},
+ {0x00011305, 0x0001130c, 1},
+ {0x0001130f, 0x00011310, 1},
+ {0x00011313, 0x00011328, 1},
+ {0x0001132a, 0x00011330, 1},
+ {0x00011332, 0x00011333, 1},
+ {0x00011335, 0x00011339, 1},
+ {0x0001133c, 0x00011344, 1},
+ {0x00011347, 0x00011348, 1},
+ {0x0001134b, 0x0001134d, 1},
+ {0x00011350, 0x00011357, 7},
+ {0x0001135d, 0x00011363, 1},
+ {0x00011366, 0x0001136c, 1},
+ {0x00011370, 0x00011374, 1},
+ {0x00011400, 0x00011459, 1},
+ {0x0001145b, 0x0001145d, 2},
+ {0x00011480, 0x000114c7, 1},
+ {0x000114d0, 0x000114d9, 1},
+ {0x00011580, 0x000115b5, 1},
+ {0x000115b8, 0x000115dd, 1},
+ {0x00011600, 0x00011644, 1},
+ {0x00011650, 0x00011659, 1},
+ {0x00011660, 0x0001166c, 1},
+ {0x00011680, 0x000116b7, 1},
+ {0x000116c0, 0x000116c9, 1},
+ {0x00011700, 0x00011719, 1},
+ {0x0001171d, 0x0001172b, 1},
+ {0x00011730, 0x0001173f, 1},
+ {0x000118a0, 0x000118f2, 1},
+ {0x000118ff, 0x00011ac0, 449},
+ {0x00011ac1, 0x00011af8, 1},
+ {0x00011c00, 0x00011c08, 1},
+ {0x00011c0a, 0x00011c36, 1},
+ {0x00011c38, 0x00011c45, 1},
+ {0x00011c50, 0x00011c6c, 1},
+ {0x00011c70, 0x00011c8f, 1},
+ {0x00011c92, 0x00011ca7, 1},
+ {0x00011ca9, 0x00011cb6, 1},
+ {0x00012000, 0x00012399, 1},
+ {0x00012400, 0x0001246e, 1},
+ {0x00012470, 0x00012474, 1},
+ {0x00012480, 0x00012543, 1},
+ {0x00013000, 0x0001342e, 1},
+ {0x00014400, 0x00014646, 1},
+ {0x00016800, 0x00016a38, 1},
+ {0x00016a40, 0x00016a5e, 1},
+ {0x00016a60, 0x00016a69, 1},
+ {0x00016a6e, 0x00016a6f, 1},
+ {0x00016ad0, 0x00016aed, 1},
+ {0x00016af0, 0x00016af5, 1},
+ {0x00016b00, 0x00016b45, 1},
+ {0x00016b50, 0x00016b59, 1},
+ {0x00016b5b, 0x00016b61, 1},
+ {0x00016b63, 0x00016b77, 1},
+ {0x00016b7d, 0x00016b8f, 1},
+ {0x00016f00, 0x00016f44, 1},
+ {0x00016f50, 0x00016f7e, 1},
+ {0x00016f8f, 0x00016f9f, 1},
+ {0x00016fe0, 0x00017000, 32},
+ {0x00017001, 0x000187ec, 1},
+ {0x00018800, 0x00018af2, 1},
+ {0x0001b000, 0x0001b001, 1},
+ {0x0001bc00, 0x0001bc6a, 1},
+ {0x0001bc70, 0x0001bc7c, 1},
+ {0x0001bc80, 0x0001bc88, 1},
+ {0x0001bc90, 0x0001bc99, 1},
+ {0x0001bc9c, 0x0001bca3, 1},
+ {0x0001d000, 0x0001d0f5, 1},
+ {0x0001d100, 0x0001d126, 1},
+ {0x0001d129, 0x0001d1e8, 1},
+ {0x0001d200, 0x0001d245, 1},
+ {0x0001d300, 0x0001d356, 1},
+ {0x0001d360, 0x0001d371, 1},
+ {0x0001d400, 0x0001d454, 1},
+ {0x0001d456, 0x0001d49c, 1},
+ {0x0001d49e, 0x0001d49f, 1},
+ {0x0001d4a2, 0x0001d4a5, 3},
+ {0x0001d4a6, 0x0001d4a9, 3},
+ {0x0001d4aa, 0x0001d4ac, 1},
+ {0x0001d4ae, 0x0001d4b9, 1},
+ {0x0001d4bb, 0x0001d4bd, 2},
+ {0x0001d4be, 0x0001d4c3, 1},
+ {0x0001d4c5, 0x0001d505, 1},
+ {0x0001d507, 0x0001d50a, 1},
+ {0x0001d50d, 0x0001d514, 1},
+ {0x0001d516, 0x0001d51c, 1},
+ {0x0001d51e, 0x0001d539, 1},
+ {0x0001d53b, 0x0001d53e, 1},
+ {0x0001d540, 0x0001d544, 1},
+ {0x0001d546, 0x0001d54a, 4},
+ {0x0001d54b, 0x0001d550, 1},
+ {0x0001d552, 0x0001d6a5, 1},
+ {0x0001d6a8, 0x0001d7cb, 1},
+ {0x0001d7ce, 0x0001da8b, 1},
+ {0x0001da9b, 0x0001da9f, 1},
+ {0x0001daa1, 0x0001daaf, 1},
+ {0x0001e000, 0x0001e006, 1},
+ {0x0001e008, 0x0001e018, 1},
+ {0x0001e01b, 0x0001e021, 1},
+ {0x0001e023, 0x0001e024, 1},
+ {0x0001e026, 0x0001e02a, 1},
+ {0x0001e800, 0x0001e8c4, 1},
+ {0x0001e8c7, 0x0001e8d6, 1},
+ {0x0001e900, 0x0001e94a, 1},
+ {0x0001e950, 0x0001e959, 1},
+ {0x0001e95e, 0x0001e95f, 1},
+ {0x0001ee00, 0x0001ee03, 1},
+ {0x0001ee05, 0x0001ee1f, 1},
+ {0x0001ee21, 0x0001ee22, 1},
+ {0x0001ee24, 0x0001ee27, 3},
+ {0x0001ee29, 0x0001ee32, 1},
+ {0x0001ee34, 0x0001ee37, 1},
+ {0x0001ee39, 0x0001ee3b, 2},
+ {0x0001ee42, 0x0001ee47, 5},
+ {0x0001ee49, 0x0001ee4d, 2},
+ {0x0001ee4e, 0x0001ee4f, 1},
+ {0x0001ee51, 0x0001ee52, 1},
+ {0x0001ee54, 0x0001ee57, 3},
+ {0x0001ee59, 0x0001ee61, 2},
+ {0x0001ee62, 0x0001ee64, 2},
+ {0x0001ee67, 0x0001ee6a, 1},
+ {0x0001ee6c, 0x0001ee72, 1},
+ {0x0001ee74, 0x0001ee77, 1},
+ {0x0001ee79, 0x0001ee7c, 1},
+ {0x0001ee7e, 0x0001ee80, 2},
+ {0x0001ee81, 0x0001ee89, 1},
+ {0x0001ee8b, 0x0001ee9b, 1},
+ {0x0001eea1, 0x0001eea3, 1},
+ {0x0001eea5, 0x0001eea9, 1},
+ {0x0001eeab, 0x0001eebb, 1},
+ {0x0001eef0, 0x0001eef1, 1},
+ {0x0001f000, 0x0001f02b, 1},
+ {0x0001f030, 0x0001f093, 1},
+ {0x0001f0a0, 0x0001f0ae, 1},
+ {0x0001f0b1, 0x0001f0bf, 1},
+ {0x0001f0c1, 0x0001f0cf, 1},
+ {0x0001f0d1, 0x0001f0f5, 1},
+ {0x0001f100, 0x0001f10c, 1},
+ {0x0001f110, 0x0001f12e, 1},
+ {0x0001f130, 0x0001f16b, 1},
+ {0x0001f170, 0x0001f1ac, 1},
+ {0x0001f1e6, 0x0001f202, 1},
+ {0x0001f210, 0x0001f23b, 1},
+ {0x0001f240, 0x0001f248, 1},
+ {0x0001f250, 0x0001f251, 1},
+ {0x0001f300, 0x0001f6d2, 1},
+ {0x0001f6e0, 0x0001f6ec, 1},
+ {0x0001f6f0, 0x0001f6f6, 1},
+ {0x0001f700, 0x0001f773, 1},
+ {0x0001f780, 0x0001f7d4, 1},
+ {0x0001f800, 0x0001f80b, 1},
+ {0x0001f810, 0x0001f847, 1},
+ {0x0001f850, 0x0001f859, 1},
+ {0x0001f860, 0x0001f887, 1},
+ {0x0001f890, 0x0001f8ad, 1},
+ {0x0001f910, 0x0001f91e, 1},
+ {0x0001f920, 0x0001f927, 1},
+ {0x0001f930, 0x0001f933, 3},
+ {0x0001f934, 0x0001f93e, 1},
+ {0x0001f940, 0x0001f94b, 1},
+ {0x0001f950, 0x0001f95e, 1},
+ {0x0001f980, 0x0001f991, 1},
+ {0x0001f9c0, 0x00020000, 1600},
+ {0x00020001, 0x0002a6d6, 1},
+ {0x0002a700, 0x0002b734, 1},
+ {0x0002b740, 0x0002b81d, 1},
+ {0x0002b820, 0x0002cea1, 1},
+ {0x0002f800, 0x0002fa1d, 1},
+ {0x000e0001, 0x000e0020, 31},
+ {0x000e0021, 0x000e007f, 1},
+ {0x000e0100, 0x000e01ef, 1},
+ {0x000f0000, 0x000ffffd, 1},
+ {0x00100000, 0x0010fffd, 1},
+ },
+ LatinOffset: 0,
+}
+
+// Total size 44206 bytes (43 KiB)
diff --git a/vendor/google.golang.org/grpc/.travis.yml b/vendor/google.golang.org/grpc/.travis.yml
index 413881a..13af539 100644
--- a/vendor/google.golang.org/grpc/.travis.yml
+++ b/vendor/google.golang.org/grpc/.travis.yml
@@ -9,13 +9,15 @@ go:
matrix:
include:
- go: 1.9.x
- env: ARCH=386
+ env: RUN386=1
go_import_path: google.golang.org/grpc
before_install:
- - if [[ "$TRAVIS_GO_VERSION" = 1.9* && "$ARCH" != "386" ]]; then ./vet.sh -install || exit 1; fi
+ - if [[ "$TRAVIS_GO_VERSION" = 1.9* && "$GOARCH" != "386" ]]; then ./vet.sh -install || exit 1; fi
script:
- - if [[ "$TRAVIS_GO_VERSION" = 1.9* && "$ARCH" != "386" ]]; then ./vet.sh || exit 1; fi
- - make test testrace
+ - if [[ -n "$RUN386" ]]; then export GOARCH=386; fi
+ - if [[ "$TRAVIS_GO_VERSION" = 1.9* && "$GOARCH" != "386" ]]; then ./vet.sh || exit 1; fi
+ - make test || exit 1
+ - if [[ "$GOARCH" != "386" ]]; then make testrace; fi
diff --git a/vendor/google.golang.org/grpc/CONTRIBUTING.md b/vendor/google.golang.org/grpc/CONTRIBUTING.md
index a5c6e06..8ec6c95 100644
--- a/vendor/google.golang.org/grpc/CONTRIBUTING.md
+++ b/vendor/google.golang.org/grpc/CONTRIBUTING.md
@@ -7,7 +7,7 @@ If you are new to github, please start by reading [Pull Request howto](https://h
## Legal requirements
In order to protect both you and ourselves, you will need to sign the
-[Contributor License Agreement](https://cla.developers.google.com/clas).
+[Contributor License Agreement](https://identity.linuxfoundation.org/projects/cncf).
## Guidelines for Pull Requests
How to get your contributions merged smoothly and quickly.
diff --git a/vendor/google.golang.org/grpc/Makefile b/vendor/google.golang.org/grpc/Makefile
index eb284c2..c445343 100644
--- a/vendor/google.golang.org/grpc/Makefile
+++ b/vendor/google.golang.org/grpc/Makefile
@@ -23,10 +23,10 @@ proto:
go generate google.golang.org/grpc/...
test: testdeps
- go test -v -cpu 1,4 google.golang.org/grpc/...
+ go test -cpu 1,4 -timeout 5m google.golang.org/grpc/...
testrace: testdeps
- go test -v -race -cpu 1,4 google.golang.org/grpc/...
+ go test -race -cpu 1,4 -timeout 7m google.golang.org/grpc/...
clean:
go clean -i google.golang.org/grpc/...
diff --git a/vendor/google.golang.org/grpc/README.md b/vendor/google.golang.org/grpc/README.md
index f1f789c..118327b 100644
--- a/vendor/google.golang.org/grpc/README.md
+++ b/vendor/google.golang.org/grpc/README.md
@@ -1,6 +1,6 @@
# gRPC-Go
-[![Build Status](https://travis-ci.org/grpc/grpc-go.svg)](https://travis-ci.org/grpc/grpc-go) [![GoDoc](https://godoc.org/google.golang.org/grpc?status.svg)](https://godoc.org/google.golang.org/grpc)
+[![Build Status](https://travis-ci.org/grpc/grpc-go.svg)](https://travis-ci.org/grpc/grpc-go) [![GoDoc](https://godoc.org/google.golang.org/grpc?status.svg)](https://godoc.org/google.golang.org/grpc) [![GoReportCard](https://goreportcard.com/badge/grpc/grpc-go)](https://goreportcard.com/report/github.com/grpc/grpc-go)
The Go implementation of [gRPC](https://grpc.io/): A high performance, open source, general RPC framework that puts mobile and HTTP/2 first. For more information see the [gRPC Quick Start: Go](https://grpc.io/docs/quickstart/go.html) guide.
@@ -16,7 +16,8 @@ $ go get -u google.golang.org/grpc
Prerequisites
-------------
-This requires Go 1.6 or later.
+This requires Go 1.6 or later. Go 1.7 will be required as of the next gRPC-Go
+release (1.8).
Constraints
-----------
diff --git a/vendor/google.golang.org/grpc/backoff.go b/vendor/google.golang.org/grpc/backoff.go
index 090fbe8..c40facc 100644
--- a/vendor/google.golang.org/grpc/backoff.go
+++ b/vendor/google.golang.org/grpc/backoff.go
@@ -25,14 +25,12 @@ import (
// DefaultBackoffConfig uses values specified for backoff in
// https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md.
-var (
- DefaultBackoffConfig = BackoffConfig{
- MaxDelay: 120 * time.Second,
- baseDelay: 1.0 * time.Second,
- factor: 1.6,
- jitter: 0.2,
- }
-)
+var DefaultBackoffConfig = BackoffConfig{
+ MaxDelay: 120 * time.Second,
+ baseDelay: 1.0 * time.Second,
+ factor: 1.6,
+ jitter: 0.2,
+}
// backoffStrategy defines the methodology for backing off after a grpc
// connection failure.
diff --git a/vendor/google.golang.org/grpc/balancer.go b/vendor/google.golang.org/grpc/balancer.go
index 0fec7b6..300da6c 100644
--- a/vendor/google.golang.org/grpc/balancer.go
+++ b/vendor/google.golang.org/grpc/balancer.go
@@ -28,6 +28,7 @@ import (
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/grpclog"
"google.golang.org/grpc/naming"
+ "google.golang.org/grpc/status"
)
// Address represents a server the client connects to.
@@ -310,7 +311,7 @@ func (rr *roundRobin) Get(ctx context.Context, opts BalancerGetOptions) (addr Ad
if !opts.BlockingWait {
if len(rr.addrs) == 0 {
rr.mu.Unlock()
- err = Errorf(codes.Unavailable, "there is no address available")
+ err = status.Errorf(codes.Unavailable, "there is no address available")
return
}
// Returns the next addr on rr.addrs for failfast RPCs.
@@ -403,6 +404,6 @@ type pickFirst struct {
*roundRobin
}
-func pickFirstBalancer(r naming.Resolver) Balancer {
+func pickFirstBalancerV1(r naming.Resolver) Balancer {
return &pickFirst{&roundRobin{r: r}}
}
diff --git a/vendor/google.golang.org/grpc/balancer/balancer.go b/vendor/google.golang.org/grpc/balancer/balancer.go
new file mode 100644
index 0000000..219a294
--- /dev/null
+++ b/vendor/google.golang.org/grpc/balancer/balancer.go
@@ -0,0 +1,223 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// Package balancer defines APIs for load balancing in gRPC.
+// All APIs in this package are experimental.
+package balancer
+
+import (
+ "errors"
+ "net"
+ "strings"
+
+ "golang.org/x/net/context"
+ "google.golang.org/grpc/connectivity"
+ "google.golang.org/grpc/credentials"
+ "google.golang.org/grpc/resolver"
+)
+
+var (
+ // m is a map from name to balancer builder.
+ m = make(map[string]Builder)
+)
+
+// Register registers the balancer builder to the balancer map.
+// b.Name (lowercased) will be used as the name registered with
+// this builder.
+func Register(b Builder) {
+ m[strings.ToLower(b.Name())] = b
+}
+
+// Get returns the resolver builder registered with the given name.
+// Note that the compare is done in a case-insenstive fashion.
+// If no builder is register with the name, nil will be returned.
+func Get(name string) Builder {
+ if b, ok := m[strings.ToLower(name)]; ok {
+ return b
+ }
+ return nil
+}
+
+// SubConn represents a gRPC sub connection.
+// Each sub connection contains a list of addresses. gRPC will
+// try to connect to them (in sequence), and stop trying the
+// remainder once one connection is successful.
+//
+// The reconnect backoff will be applied on the list, not a single address.
+// For example, try_on_all_addresses -> backoff -> try_on_all_addresses.
+//
+// All SubConns start in IDLE, and will not try to connect. To trigger
+// the connecting, Balancers must call Connect.
+// When the connection encounters an error, it will reconnect immediately.
+// When the connection becomes IDLE, it will not reconnect unless Connect is
+// called.
+//
+// This interface is to be implemented by gRPC. Users should not need a
+// brand new implementation of this interface. For the situations like
+// testing, the new implementation should embed this interface. This allows
+// gRPC to add new methods to this interface.
+type SubConn interface {
+ // UpdateAddresses updates the addresses used in this SubConn.
+ // gRPC checks if currently-connected address is still in the new list.
+ // If it's in the list, the connection will be kept.
+ // If it's not in the list, the connection will gracefully closed, and
+ // a new connection will be created.
+ //
+ // This will trigger a state transition for the SubConn.
+ UpdateAddresses([]resolver.Address)
+ // Connect starts the connecting for this SubConn.
+ Connect()
+}
+
+// NewSubConnOptions contains options to create new SubConn.
+type NewSubConnOptions struct{}
+
+// ClientConn represents a gRPC ClientConn.
+//
+// This interface is to be implemented by gRPC. Users should not need a
+// brand new implementation of this interface. For the situations like
+// testing, the new implementation should embed this interface. This allows
+// gRPC to add new methods to this interface.
+type ClientConn interface {
+ // NewSubConn is called by balancer to create a new SubConn.
+ // It doesn't block and wait for the connections to be established.
+ // Behaviors of the SubConn can be controlled by options.
+ NewSubConn([]resolver.Address, NewSubConnOptions) (SubConn, error)
+ // RemoveSubConn removes the SubConn from ClientConn.
+ // The SubConn will be shutdown.
+ RemoveSubConn(SubConn)
+
+ // UpdateBalancerState is called by balancer to nofity gRPC that some internal
+ // state in balancer has changed.
+ //
+ // gRPC will update the connectivity state of the ClientConn, and will call pick
+ // on the new picker to pick new SubConn.
+ UpdateBalancerState(s connectivity.State, p Picker)
+
+ // ResolveNow is called by balancer to notify gRPC to do a name resolving.
+ ResolveNow(resolver.ResolveNowOption)
+
+ // Target returns the dial target for this ClientConn.
+ Target() string
+}
+
+// BuildOptions contains additional information for Build.
+type BuildOptions struct {
+ // DialCreds is the transport credential the Balancer implementation can
+ // use to dial to a remote load balancer server. The Balancer implementations
+ // can ignore this if it does not need to talk to another party securely.
+ DialCreds credentials.TransportCredentials
+ // Dialer is the custom dialer the Balancer implementation can use to dial
+ // to a remote load balancer server. The Balancer implementations
+ // can ignore this if it doesn't need to talk to remote balancer.
+ Dialer func(context.Context, string) (net.Conn, error)
+}
+
+// Builder creates a balancer.
+type Builder interface {
+ // Build creates a new balancer with the ClientConn.
+ Build(cc ClientConn, opts BuildOptions) Balancer
+ // Name returns the name of balancers built by this builder.
+ // It will be used to pick balancers (for example in service config).
+ Name() string
+}
+
+// PickOptions contains addition information for the Pick operation.
+type PickOptions struct{}
+
+// DoneInfo contains additional information for done.
+type DoneInfo struct {
+ // Err is the rpc error the RPC finished with. It could be nil.
+ Err error
+ // BytesSent indicates if any bytes have been sent to the server.
+ BytesSent bool
+ // BytesReceived indicates if any byte has been received from the server.
+ BytesReceived bool
+}
+
+var (
+ // ErrNoSubConnAvailable indicates no SubConn is available for pick().
+ // gRPC will block the RPC until a new picker is available via UpdateBalancerState().
+ ErrNoSubConnAvailable = errors.New("no SubConn is available")
+ // ErrTransientFailure indicates all SubConns are in TransientFailure.
+ // WaitForReady RPCs will block, non-WaitForReady RPCs will fail.
+ ErrTransientFailure = errors.New("all SubConns are in TransientFailure")
+)
+
+// Picker is used by gRPC to pick a SubConn to send an RPC.
+// Balancer is expected to generate a new picker from its snapshot everytime its
+// internal state has changed.
+//
+// The pickers used by gRPC can be updated by ClientConn.UpdateBalancerState().
+type Picker interface {
+ // Pick returns the SubConn to be used to send the RPC.
+ // The returned SubConn must be one returned by NewSubConn().
+ //
+ // This functions is expected to return:
+ // - a SubConn that is known to be READY;
+ // - ErrNoSubConnAvailable if no SubConn is available, but progress is being
+ // made (for example, some SubConn is in CONNECTING mode);
+ // - other errors if no active connecting is happening (for example, all SubConn
+ // are in TRANSIENT_FAILURE mode).
+ //
+ // If a SubConn is returned:
+ // - If it is READY, gRPC will send the RPC on it;
+ // - If it is not ready, or becomes not ready after it's returned, gRPC will block
+ // until UpdateBalancerState() is called and will call pick on the new picker.
+ //
+ // If the returned error is not nil:
+ // - If the error is ErrNoSubConnAvailable, gRPC will block until UpdateBalancerState()
+ // - If the error is ErrTransientFailure:
+ // - If the RPC is wait-for-ready, gRPC will block until UpdateBalancerState()
+ // is called to pick again;
+ // - Otherwise, RPC will fail with unavailable error.
+ // - Else (error is other non-nil error):
+ // - The RPC will fail with unavailable error.
+ //
+ // The returned done() function will be called once the rpc has finished, with the
+ // final status of that RPC.
+ // done may be nil if balancer doesn't care about the RPC status.
+ Pick(ctx context.Context, opts PickOptions) (conn SubConn, done func(DoneInfo), err error)
+}
+
+// Balancer takes input from gRPC, manages SubConns, and collects and aggregates
+// the connectivity states.
+//
+// It also generates and updates the Picker used by gRPC to pick SubConns for RPCs.
+//
+// HandleSubConnectionStateChange, HandleResolvedAddrs and Close are guaranteed
+// to be called synchronously from the same goroutine.
+// There's no guarantee on picker.Pick, it may be called anytime.
+type Balancer interface {
+ // HandleSubConnStateChange is called by gRPC when the connectivity state
+ // of sc has changed.
+ // Balancer is expected to aggregate all the state of SubConn and report
+ // that back to gRPC.
+ // Balancer should also generate and update Pickers when its internal state has
+ // been changed by the new state.
+ HandleSubConnStateChange(sc SubConn, state connectivity.State)
+ // HandleResolvedAddrs is called by gRPC to send updated resolved addresses to
+ // balancers.
+ // Balancer can create new SubConn or remove SubConn with the addresses.
+ // An empty address slice and a non-nil error will be passed if the resolver returns
+ // non-nil error to gRPC.
+ HandleResolvedAddrs([]resolver.Address, error)
+ // Close closes the balancer. The balancer is not required to call
+ // ClientConn.RemoveSubConn for its existing SubConns.
+ Close()
+}
diff --git a/vendor/google.golang.org/grpc/balancer/base/balancer.go b/vendor/google.golang.org/grpc/balancer/base/balancer.go
new file mode 100644
index 0000000..1e962b7
--- /dev/null
+++ b/vendor/google.golang.org/grpc/balancer/base/balancer.go
@@ -0,0 +1,209 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package base
+
+import (
+ "golang.org/x/net/context"
+ "google.golang.org/grpc/balancer"
+ "google.golang.org/grpc/connectivity"
+ "google.golang.org/grpc/grpclog"
+ "google.golang.org/grpc/resolver"
+)
+
+type baseBuilder struct {
+ name string
+ pickerBuilder PickerBuilder
+}
+
+func (bb *baseBuilder) Build(cc balancer.ClientConn, opt balancer.BuildOptions) balancer.Balancer {
+ return &baseBalancer{
+ cc: cc,
+ pickerBuilder: bb.pickerBuilder,
+
+ subConns: make(map[resolver.Address]balancer.SubConn),
+ scStates: make(map[balancer.SubConn]connectivity.State),
+ csEvltr: &connectivityStateEvaluator{},
+ // Initialize picker to a picker that always return
+ // ErrNoSubConnAvailable, because when state of a SubConn changes, we
+ // may call UpdateBalancerState with this picker.
+ picker: NewErrPicker(balancer.ErrNoSubConnAvailable),
+ }
+}
+
+func (bb *baseBuilder) Name() string {
+ return bb.name
+}
+
+type baseBalancer struct {
+ cc balancer.ClientConn
+ pickerBuilder PickerBuilder
+
+ csEvltr *connectivityStateEvaluator
+ state connectivity.State
+
+ subConns map[resolver.Address]balancer.SubConn
+ scStates map[balancer.SubConn]connectivity.State
+ picker balancer.Picker
+}
+
+func (b *baseBalancer) HandleResolvedAddrs(addrs []resolver.Address, err error) {
+ if err != nil {
+ grpclog.Infof("base.baseBalancer: HandleResolvedAddrs called with error %v", err)
+ return
+ }
+ grpclog.Infoln("base.baseBalancer: got new resolved addresses: ", addrs)
+ // addrsSet is the set converted from addrs, it's used for quick lookup of an address.
+ addrsSet := make(map[resolver.Address]struct{})
+ for _, a := range addrs {
+ addrsSet[a] = struct{}{}
+ if _, ok := b.subConns[a]; !ok {
+ // a is a new address (not existing in b.subConns).
+ sc, err := b.cc.NewSubConn([]resolver.Address{a}, balancer.NewSubConnOptions{})
+ if err != nil {
+ grpclog.Warningf("base.baseBalancer: failed to create new SubConn: %v", err)
+ continue
+ }
+ b.subConns[a] = sc
+ b.scStates[sc] = connectivity.Idle
+ sc.Connect()
+ }
+ }
+ for a, sc := range b.subConns {
+ // a was removed by resolver.
+ if _, ok := addrsSet[a]; !ok {
+ b.cc.RemoveSubConn(sc)
+ delete(b.subConns, a)
+ // Keep the state of this sc in b.scStates until sc's state becomes Shutdown.
+ // The entry will be deleted in HandleSubConnStateChange.
+ }
+ }
+}
+
+// regeneratePicker takes a snapshot of the balancer, and generates a picker
+// from it. The picker is
+// - errPicker with ErrTransientFailure if the balancer is in TransientFailure,
+// - built by the pickerBuilder with all READY SubConns otherwise.
+func (b *baseBalancer) regeneratePicker() {
+ if b.state == connectivity.TransientFailure {
+ b.picker = NewErrPicker(balancer.ErrTransientFailure)
+ return
+ }
+ readySCs := make(map[resolver.Address]balancer.SubConn)
+
+ // Filter out all ready SCs from full subConn map.
+ for addr, sc := range b.subConns {
+ if st, ok := b.scStates[sc]; ok && st == connectivity.Ready {
+ readySCs[addr] = sc
+ }
+ }
+ b.picker = b.pickerBuilder.Build(readySCs)
+}
+
+func (b *baseBalancer) HandleSubConnStateChange(sc balancer.SubConn, s connectivity.State) {
+ grpclog.Infof("base.baseBalancer: handle SubConn state change: %p, %v", sc, s)
+ oldS, ok := b.scStates[sc]
+ if !ok {
+ grpclog.Infof("base.baseBalancer: got state changes for an unknown SubConn: %p, %v", sc, s)
+ return
+ }
+ b.scStates[sc] = s
+ switch s {
+ case connectivity.Idle:
+ sc.Connect()
+ case connectivity.Shutdown:
+ // When an address was removed by resolver, b called RemoveSubConn but
+ // kept the sc's state in scStates. Remove state for this sc here.
+ delete(b.scStates, sc)
+ }
+
+ oldAggrState := b.state
+ b.state = b.csEvltr.recordTransition(oldS, s)
+
+ // Regenerate picker when one of the following happens:
+ // - this sc became ready from not-ready
+ // - this sc became not-ready from ready
+ // - the aggregated state of balancer became TransientFailure from non-TransientFailure
+ // - the aggregated state of balancer became non-TransientFailure from TransientFailure
+ if (s == connectivity.Ready) != (oldS == connectivity.Ready) ||
+ (b.state == connectivity.TransientFailure) != (oldAggrState == connectivity.TransientFailure) {
+ b.regeneratePicker()
+ }
+
+ b.cc.UpdateBalancerState(b.state, b.picker)
+ return
+}
+
+// Close is a nop because base balancer doesn't have internal state to clean up,
+// and it doesn't need to call RemoveSubConn for the SubConns.
+func (b *baseBalancer) Close() {
+}
+
+// NewErrPicker returns a picker that always returns err on Pick().
+func NewErrPicker(err error) balancer.Picker {
+ return &errPicker{err: err}
+}
+
+type errPicker struct {
+ err error // Pick() always returns this err.
+}
+
+func (p *errPicker) Pick(ctx context.Context, opts balancer.PickOptions) (balancer.SubConn, func(balancer.DoneInfo), error) {
+ return nil, nil, p.err
+}
+
+// connectivityStateEvaluator gets updated by addrConns when their
+// states transition, based on which it evaluates the state of
+// ClientConn.
+type connectivityStateEvaluator struct {
+ numReady uint64 // Number of addrConns in ready state.
+ numConnecting uint64 // Number of addrConns in connecting state.
+ numTransientFailure uint64 // Number of addrConns in transientFailure.
+}
+
+// recordTransition records state change happening in every subConn and based on
+// that it evaluates what aggregated state should be.
+// It can only transition between Ready, Connecting and TransientFailure. Other states,
+// Idle and Shutdown are transitioned into by ClientConn; in the beginning of the connection
+// before any subConn is created ClientConn is in idle state. In the end when ClientConn
+// closes it is in Shutdown state.
+//
+// recordTransition should only be called synchronously from the same goroutine.
+func (cse *connectivityStateEvaluator) recordTransition(oldState, newState connectivity.State) connectivity.State {
+ // Update counters.
+ for idx, state := range []connectivity.State{oldState, newState} {
+ updateVal := 2*uint64(idx) - 1 // -1 for oldState and +1 for new.
+ switch state {
+ case connectivity.Ready:
+ cse.numReady += updateVal
+ case connectivity.Connecting:
+ cse.numConnecting += updateVal
+ case connectivity.TransientFailure:
+ cse.numTransientFailure += updateVal
+ }
+ }
+
+ // Evaluate.
+ if cse.numReady > 0 {
+ return connectivity.Ready
+ }
+ if cse.numConnecting > 0 {
+ return connectivity.Connecting
+ }
+ return connectivity.TransientFailure
+}
diff --git a/vendor/google.golang.org/grpc/balancer/base/base.go b/vendor/google.golang.org/grpc/balancer/base/base.go
new file mode 100644
index 0000000..012ace2
--- /dev/null
+++ b/vendor/google.golang.org/grpc/balancer/base/base.go
@@ -0,0 +1,52 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// Package base defines a balancer base that can be used to build balancers with
+// different picking algorithms.
+//
+// The base balancer creates a new SubConn for each resolved address. The
+// provided picker will only be notified about READY SubConns.
+//
+// This package is the base of round_robin balancer, its purpose is to be used
+// to build round_robin like balancers with complex picking algorithms.
+// Balancers with more complicated logic should try to implement a balancer
+// builder from scratch.
+//
+// All APIs in this package are experimental.
+package base
+
+import (
+ "google.golang.org/grpc/balancer"
+ "google.golang.org/grpc/resolver"
+)
+
+// PickerBuilder creates balancer.Picker.
+type PickerBuilder interface {
+ // Build takes a slice of ready SubConns, and returns a picker that will be
+ // used by gRPC to pick a SubConn.
+ Build(readySCs map[resolver.Address]balancer.SubConn) balancer.Picker
+}
+
+// NewBalancerBuilder returns a balancer builder. The balancers
+// built by this builder will use the picker builder to build pickers.
+func NewBalancerBuilder(name string, pb PickerBuilder) balancer.Builder {
+ return &baseBuilder{
+ name: name,
+ pickerBuilder: pb,
+ }
+}
diff --git a/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go b/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go
new file mode 100644
index 0000000..2eda0a1
--- /dev/null
+++ b/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go
@@ -0,0 +1,79 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// Package roundrobin defines a roundrobin balancer. Roundrobin balancer is
+// installed as one of the default balancers in gRPC, users don't need to
+// explicitly install this balancer.
+package roundrobin
+
+import (
+ "sync"
+
+ "golang.org/x/net/context"
+ "google.golang.org/grpc/balancer"
+ "google.golang.org/grpc/balancer/base"
+ "google.golang.org/grpc/grpclog"
+ "google.golang.org/grpc/resolver"
+)
+
+// Name is the name of round_robin balancer.
+const Name = "round_robin"
+
+// newBuilder creates a new roundrobin balancer builder.
+func newBuilder() balancer.Builder {
+ return base.NewBalancerBuilder(Name, &rrPickerBuilder{})
+}
+
+func init() {
+ balancer.Register(newBuilder())
+}
+
+type rrPickerBuilder struct{}
+
+func (*rrPickerBuilder) Build(readySCs map[resolver.Address]balancer.SubConn) balancer.Picker {
+ grpclog.Infof("roundrobinPicker: newPicker called with readySCs: %v", readySCs)
+ var scs []balancer.SubConn
+ for _, sc := range readySCs {
+ scs = append(scs, sc)
+ }
+ return &rrPicker{
+ subConns: scs,
+ }
+}
+
+type rrPicker struct {
+ // subConns is the snapshot of the roundrobin balancer when this picker was
+ // created. The slice is immutable. Each Get() will do a round robin
+ // selection from it and return the selected SubConn.
+ subConns []balancer.SubConn
+
+ mu sync.Mutex
+ next int
+}
+
+func (p *rrPicker) Pick(ctx context.Context, opts balancer.PickOptions) (balancer.SubConn, func(balancer.DoneInfo), error) {
+ if len(p.subConns) <= 0 {
+ return nil, nil, balancer.ErrNoSubConnAvailable
+ }
+
+ p.mu.Lock()
+ sc := p.subConns[p.next]
+ p.next = (p.next + 1) % len(p.subConns)
+ p.mu.Unlock()
+ return sc, nil, nil
+}
diff --git a/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin_test.go b/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin_test.go
new file mode 100644
index 0000000..59cac4b
--- /dev/null
+++ b/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin_test.go
@@ -0,0 +1,477 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package roundrobin_test
+
+import (
+ "fmt"
+ "net"
+ "sync"
+ "testing"
+ "time"
+
+ "golang.org/x/net/context"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/balancer/roundrobin"
+ "google.golang.org/grpc/codes"
+ _ "google.golang.org/grpc/grpclog/glogger"
+ "google.golang.org/grpc/peer"
+ "google.golang.org/grpc/resolver"
+ "google.golang.org/grpc/resolver/manual"
+ "google.golang.org/grpc/status"
+ testpb "google.golang.org/grpc/test/grpc_testing"
+ "google.golang.org/grpc/test/leakcheck"
+)
+
+type testServer struct {
+ testpb.TestServiceServer
+}
+
+func (s *testServer) EmptyCall(ctx context.Context, in *testpb.Empty) (*testpb.Empty, error) {
+ return &testpb.Empty{}, nil
+}
+
+func (s *testServer) FullDuplexCall(stream testpb.TestService_FullDuplexCallServer) error {
+ return nil
+}
+
+type test struct {
+ servers []*grpc.Server
+ addresses []string
+}
+
+func (t *test) cleanup() {
+ for _, s := range t.servers {
+ s.Stop()
+ }
+}
+
+func startTestServers(count int) (_ *test, err error) {
+ t := &test{}
+
+ defer func() {
+ if err != nil {
+ for _, s := range t.servers {
+ s.Stop()
+ }
+ }
+ }()
+ for i := 0; i < count; i++ {
+ lis, err := net.Listen("tcp", "localhost:0")
+ if err != nil {
+ return nil, fmt.Errorf("Failed to listen %v", err)
+ }
+
+ s := grpc.NewServer()
+ testpb.RegisterTestServiceServer(s, &testServer{})
+ t.servers = append(t.servers, s)
+ t.addresses = append(t.addresses, lis.Addr().String())
+
+ go func(s *grpc.Server, l net.Listener) {
+ s.Serve(l)
+ }(s, lis)
+ }
+
+ return t, nil
+}
+
+func TestOneBackend(t *testing.T) {
+ defer leakcheck.Check(t)
+ r, cleanup := manual.GenerateAndRegisterManualResolver()
+ defer cleanup()
+
+ test, err := startTestServers(1)
+ if err != nil {
+ t.Fatalf("failed to start servers: %v", err)
+ }
+ defer test.cleanup()
+
+ cc, err := grpc.Dial(r.Scheme()+":///test.server", grpc.WithInsecure(), grpc.WithBalancerName(roundrobin.Name))
+ if err != nil {
+ t.Fatalf("failed to dial: %v", err)
+ }
+ defer cc.Close()
+ testc := testpb.NewTestServiceClient(cc)
+ // The first RPC should fail because there's no address.
+ ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond)
+ defer cancel()
+ if _, err := testc.EmptyCall(ctx, &testpb.Empty{}); err == nil || status.Code(err) != codes.DeadlineExceeded {
+ t.Fatalf("EmptyCall() = _, %v, want _, DeadlineExceeded", err)
+ }
+
+ r.NewAddress([]resolver.Address{{Addr: test.addresses[0]}})
+ // The second RPC should succeed.
+ if _, err := testc.EmptyCall(context.Background(), &testpb.Empty{}); err != nil {
+ t.Fatalf("EmptyCall() = _, %v, want _, ", err)
+ }
+}
+
+func TestBackendsRoundRobin(t *testing.T) {
+ defer leakcheck.Check(t)
+ r, cleanup := manual.GenerateAndRegisterManualResolver()
+ defer cleanup()
+
+ backendCount := 5
+ test, err := startTestServers(backendCount)
+ if err != nil {
+ t.Fatalf("failed to start servers: %v", err)
+ }
+ defer test.cleanup()
+
+ cc, err := grpc.Dial(r.Scheme()+":///test.server", grpc.WithInsecure(), grpc.WithBalancerName(roundrobin.Name))
+ if err != nil {
+ t.Fatalf("failed to dial: %v", err)
+ }
+ defer cc.Close()
+ testc := testpb.NewTestServiceClient(cc)
+ // The first RPC should fail because there's no address.
+ ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond)
+ defer cancel()
+ if _, err := testc.EmptyCall(ctx, &testpb.Empty{}); err == nil || status.Code(err) != codes.DeadlineExceeded {
+ t.Fatalf("EmptyCall() = _, %v, want _, DeadlineExceeded", err)
+ }
+
+ var resolvedAddrs []resolver.Address
+ for i := 0; i < backendCount; i++ {
+ resolvedAddrs = append(resolvedAddrs, resolver.Address{Addr: test.addresses[i]})
+ }
+
+ r.NewAddress(resolvedAddrs)
+ var p peer.Peer
+ // Make sure connections to all servers are up.
+ for si := 0; si < backendCount; si++ {
+ var connected bool
+ for i := 0; i < 1000; i++ {
+ if _, err := testc.EmptyCall(context.Background(), &testpb.Empty{}, grpc.Peer(&p)); err != nil {
+ t.Fatalf("EmptyCall() = _, %v, want _, ", err)
+ }
+ if p.Addr.String() == test.addresses[si] {
+ connected = true
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !connected {
+ t.Fatalf("Connection to %v was not up after more than 1 second", test.addresses[si])
+ }
+ }
+
+ for i := 0; i < 3*backendCount; i++ {
+ if _, err := testc.EmptyCall(context.Background(), &testpb.Empty{}, grpc.Peer(&p)); err != nil {
+ t.Fatalf("EmptyCall() = _, %v, want _, ", err)
+ }
+ if p.Addr.String() != test.addresses[i%backendCount] {
+ t.Fatalf("Index %d: want peer %v, got peer %v", i, test.addresses[i%backendCount], p.Addr.String())
+ }
+ }
+}
+
+func TestAddressesRemoved(t *testing.T) {
+ defer leakcheck.Check(t)
+ r, cleanup := manual.GenerateAndRegisterManualResolver()
+ defer cleanup()
+
+ test, err := startTestServers(1)
+ if err != nil {
+ t.Fatalf("failed to start servers: %v", err)
+ }
+ defer test.cleanup()
+
+ cc, err := grpc.Dial(r.Scheme()+":///test.server", grpc.WithInsecure(), grpc.WithBalancerName(roundrobin.Name))
+ if err != nil {
+ t.Fatalf("failed to dial: %v", err)
+ }
+ defer cc.Close()
+ testc := testpb.NewTestServiceClient(cc)
+ // The first RPC should fail because there's no address.
+ ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond)
+ defer cancel()
+ if _, err := testc.EmptyCall(ctx, &testpb.Empty{}); err == nil || status.Code(err) != codes.DeadlineExceeded {
+ t.Fatalf("EmptyCall() = _, %v, want _, DeadlineExceeded", err)
+ }
+
+ r.NewAddress([]resolver.Address{{Addr: test.addresses[0]}})
+ // The second RPC should succeed.
+ if _, err := testc.EmptyCall(context.Background(), &testpb.Empty{}); err != nil {
+ t.Fatalf("EmptyCall() = _, %v, want _, ", err)
+ }
+
+ r.NewAddress([]resolver.Address{})
+ for i := 0; i < 1000; i++ {
+ ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)
+ defer cancel()
+ if _, err := testc.EmptyCall(ctx, &testpb.Empty{}, grpc.FailFast(false)); status.Code(err) == codes.DeadlineExceeded {
+ return
+ }
+ time.Sleep(time.Millisecond)
+ }
+ t.Fatalf("No RPC failed after removing all addresses, want RPC to fail with DeadlineExceeded")
+}
+
+func TestCloseWithPendingRPC(t *testing.T) {
+ defer leakcheck.Check(t)
+ r, cleanup := manual.GenerateAndRegisterManualResolver()
+ defer cleanup()
+
+ test, err := startTestServers(1)
+ if err != nil {
+ t.Fatalf("failed to start servers: %v", err)
+ }
+ defer test.cleanup()
+
+ cc, err := grpc.Dial(r.Scheme()+":///test.server", grpc.WithInsecure(), grpc.WithBalancerName(roundrobin.Name))
+ if err != nil {
+ t.Fatalf("failed to dial: %v", err)
+ }
+ testc := testpb.NewTestServiceClient(cc)
+
+ var wg sync.WaitGroup
+ for i := 0; i < 3; i++ {
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ // This RPC blocks until cc is closed.
+ ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+ if _, err := testc.EmptyCall(ctx, &testpb.Empty{}); status.Code(err) == codes.DeadlineExceeded {
+ t.Errorf("RPC failed because of deadline after cc is closed; want error the client connection is closing")
+ }
+ cancel()
+ }()
+ }
+ cc.Close()
+ wg.Wait()
+}
+
+func TestNewAddressWhileBlocking(t *testing.T) {
+ defer leakcheck.Check(t)
+ r, cleanup := manual.GenerateAndRegisterManualResolver()
+ defer cleanup()
+
+ test, err := startTestServers(1)
+ if err != nil {
+ t.Fatalf("failed to start servers: %v", err)
+ }
+ defer test.cleanup()
+
+ cc, err := grpc.Dial(r.Scheme()+":///test.server", grpc.WithInsecure(), grpc.WithBalancerName(roundrobin.Name))
+ if err != nil {
+ t.Fatalf("failed to dial: %v", err)
+ }
+ defer cc.Close()
+ testc := testpb.NewTestServiceClient(cc)
+ // The first RPC should fail because there's no address.
+ ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond)
+ defer cancel()
+ if _, err := testc.EmptyCall(ctx, &testpb.Empty{}); err == nil || status.Code(err) != codes.DeadlineExceeded {
+ t.Fatalf("EmptyCall() = _, %v, want _, DeadlineExceeded", err)
+ }
+
+ r.NewAddress([]resolver.Address{{Addr: test.addresses[0]}})
+ // The second RPC should succeed.
+ ctx, cancel = context.WithTimeout(context.Background(), 2*time.Second)
+ defer cancel()
+ if _, err := testc.EmptyCall(ctx, &testpb.Empty{}); err != nil {
+ t.Fatalf("EmptyCall() = _, %v, want _, nil", err)
+ }
+
+ r.NewAddress([]resolver.Address{})
+
+ var wg sync.WaitGroup
+ for i := 0; i < 3; i++ {
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ // This RPC blocks until NewAddress is called.
+ testc.EmptyCall(context.Background(), &testpb.Empty{})
+ }()
+ }
+ time.Sleep(50 * time.Millisecond)
+ r.NewAddress([]resolver.Address{{Addr: test.addresses[0]}})
+ wg.Wait()
+}
+
+func TestOneServerDown(t *testing.T) {
+ defer leakcheck.Check(t)
+ r, cleanup := manual.GenerateAndRegisterManualResolver()
+ defer cleanup()
+
+ backendCount := 3
+ test, err := startTestServers(backendCount)
+ if err != nil {
+ t.Fatalf("failed to start servers: %v", err)
+ }
+ defer test.cleanup()
+
+ cc, err := grpc.Dial(r.Scheme()+":///test.server", grpc.WithInsecure(), grpc.WithBalancerName(roundrobin.Name), grpc.WithWaitForHandshake())
+ if err != nil {
+ t.Fatalf("failed to dial: %v", err)
+ }
+ defer cc.Close()
+ testc := testpb.NewTestServiceClient(cc)
+ // The first RPC should fail because there's no address.
+ ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond)
+ defer cancel()
+ if _, err := testc.EmptyCall(ctx, &testpb.Empty{}); err == nil || status.Code(err) != codes.DeadlineExceeded {
+ t.Fatalf("EmptyCall() = _, %v, want _, DeadlineExceeded", err)
+ }
+
+ var resolvedAddrs []resolver.Address
+ for i := 0; i < backendCount; i++ {
+ resolvedAddrs = append(resolvedAddrs, resolver.Address{Addr: test.addresses[i]})
+ }
+
+ r.NewAddress(resolvedAddrs)
+ var p peer.Peer
+ // Make sure connections to all servers are up.
+ for si := 0; si < backendCount; si++ {
+ var connected bool
+ for i := 0; i < 1000; i++ {
+ if _, err := testc.EmptyCall(context.Background(), &testpb.Empty{}, grpc.Peer(&p)); err != nil {
+ t.Fatalf("EmptyCall() = _, %v, want _, ", err)
+ }
+ if p.Addr.String() == test.addresses[si] {
+ connected = true
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !connected {
+ t.Fatalf("Connection to %v was not up after more than 1 second", test.addresses[si])
+ }
+ }
+
+ for i := 0; i < 3*backendCount; i++ {
+ if _, err := testc.EmptyCall(context.Background(), &testpb.Empty{}, grpc.Peer(&p)); err != nil {
+ t.Fatalf("EmptyCall() = _, %v, want _, ", err)
+ }
+ if p.Addr.String() != test.addresses[i%backendCount] {
+ t.Fatalf("Index %d: want peer %v, got peer %v", i, test.addresses[i%backendCount], p.Addr.String())
+ }
+ }
+
+ // Stop one server, RPCs should roundrobin among the remaining servers.
+ backendCount--
+ test.servers[backendCount].Stop()
+ // Loop until see server[backendCount-1] twice without seeing server[backendCount].
+ var targetSeen int
+ for i := 0; i < 1000; i++ {
+ if _, err := testc.EmptyCall(context.Background(), &testpb.Empty{}, grpc.Peer(&p)); err != nil {
+ targetSeen = 0
+ t.Logf("EmptyCall() = _, %v, want _, ", err)
+ // Due to a race, this RPC could possibly get the connection that
+ // was closing, and this RPC may fail. Keep trying when this
+ // happens.
+ continue
+ }
+ switch p.Addr.String() {
+ case test.addresses[backendCount-1]:
+ targetSeen++
+ case test.addresses[backendCount]:
+ // Reset targetSeen if peer is server[backendCount].
+ targetSeen = 0
+ }
+ // Break to make sure the last picked address is server[-1], so the following for loop won't be flaky.
+ if targetSeen >= 2 {
+ break
+ }
+ }
+ if targetSeen != 2 {
+ t.Fatal("Failed to see server[backendCount-1] twice without seeing server[backendCount]")
+ }
+ for i := 0; i < 3*backendCount; i++ {
+ if _, err := testc.EmptyCall(context.Background(), &testpb.Empty{}, grpc.Peer(&p)); err != nil {
+ t.Fatalf("EmptyCall() = _, %v, want _, ", err)
+ }
+ if p.Addr.String() != test.addresses[i%backendCount] {
+ t.Errorf("Index %d: want peer %v, got peer %v", i, test.addresses[i%backendCount], p.Addr.String())
+ }
+ }
+}
+
+func TestAllServersDown(t *testing.T) {
+ defer leakcheck.Check(t)
+ r, cleanup := manual.GenerateAndRegisterManualResolver()
+ defer cleanup()
+
+ backendCount := 3
+ test, err := startTestServers(backendCount)
+ if err != nil {
+ t.Fatalf("failed to start servers: %v", err)
+ }
+ defer test.cleanup()
+
+ cc, err := grpc.Dial(r.Scheme()+":///test.server", grpc.WithInsecure(), grpc.WithBalancerName(roundrobin.Name), grpc.WithWaitForHandshake())
+ if err != nil {
+ t.Fatalf("failed to dial: %v", err)
+ }
+ defer cc.Close()
+ testc := testpb.NewTestServiceClient(cc)
+ // The first RPC should fail because there's no address.
+ ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond)
+ defer cancel()
+ if _, err := testc.EmptyCall(ctx, &testpb.Empty{}); err == nil || status.Code(err) != codes.DeadlineExceeded {
+ t.Fatalf("EmptyCall() = _, %v, want _, DeadlineExceeded", err)
+ }
+
+ var resolvedAddrs []resolver.Address
+ for i := 0; i < backendCount; i++ {
+ resolvedAddrs = append(resolvedAddrs, resolver.Address{Addr: test.addresses[i]})
+ }
+
+ r.NewAddress(resolvedAddrs)
+ var p peer.Peer
+ // Make sure connections to all servers are up.
+ for si := 0; si < backendCount; si++ {
+ var connected bool
+ for i := 0; i < 1000; i++ {
+ if _, err := testc.EmptyCall(context.Background(), &testpb.Empty{}, grpc.Peer(&p)); err != nil {
+ t.Fatalf("EmptyCall() = _, %v, want _, ", err)
+ }
+ if p.Addr.String() == test.addresses[si] {
+ connected = true
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !connected {
+ t.Fatalf("Connection to %v was not up after more than 1 second", test.addresses[si])
+ }
+ }
+
+ for i := 0; i < 3*backendCount; i++ {
+ if _, err := testc.EmptyCall(context.Background(), &testpb.Empty{}, grpc.Peer(&p)); err != nil {
+ t.Fatalf("EmptyCall() = _, %v, want _, ", err)
+ }
+ if p.Addr.String() != test.addresses[i%backendCount] {
+ t.Fatalf("Index %d: want peer %v, got peer %v", i, test.addresses[i%backendCount], p.Addr.String())
+ }
+ }
+
+ // All servers are stopped, failfast RPC should fail with unavailable.
+ for i := 0; i < backendCount; i++ {
+ test.servers[i].Stop()
+ }
+ time.Sleep(100 * time.Millisecond)
+ for i := 0; i < 1000; i++ {
+ if _, err := testc.EmptyCall(context.Background(), &testpb.Empty{}); status.Code(err) == codes.Unavailable {
+ return
+ }
+ time.Sleep(time.Millisecond)
+ }
+ t.Fatalf("Failfast RPCs didn't fail with Unavailable after all servers are stopped")
+}
diff --git a/vendor/google.golang.org/grpc/balancer_conn_wrappers.go b/vendor/google.golang.org/grpc/balancer_conn_wrappers.go
new file mode 100644
index 0000000..db6f0ae
--- /dev/null
+++ b/vendor/google.golang.org/grpc/balancer_conn_wrappers.go
@@ -0,0 +1,300 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package grpc
+
+import (
+ "fmt"
+ "sync"
+
+ "google.golang.org/grpc/balancer"
+ "google.golang.org/grpc/connectivity"
+ "google.golang.org/grpc/grpclog"
+ "google.golang.org/grpc/resolver"
+)
+
+// scStateUpdate contains the subConn and the new state it changed to.
+type scStateUpdate struct {
+ sc balancer.SubConn
+ state connectivity.State
+}
+
+// scStateUpdateBuffer is an unbounded channel for scStateChangeTuple.
+// TODO make a general purpose buffer that uses interface{}.
+type scStateUpdateBuffer struct {
+ c chan *scStateUpdate
+ mu sync.Mutex
+ backlog []*scStateUpdate
+}
+
+func newSCStateUpdateBuffer() *scStateUpdateBuffer {
+ return &scStateUpdateBuffer{
+ c: make(chan *scStateUpdate, 1),
+ }
+}
+
+func (b *scStateUpdateBuffer) put(t *scStateUpdate) {
+ b.mu.Lock()
+ defer b.mu.Unlock()
+ if len(b.backlog) == 0 {
+ select {
+ case b.c <- t:
+ return
+ default:
+ }
+ }
+ b.backlog = append(b.backlog, t)
+}
+
+func (b *scStateUpdateBuffer) load() {
+ b.mu.Lock()
+ defer b.mu.Unlock()
+ if len(b.backlog) > 0 {
+ select {
+ case b.c <- b.backlog[0]:
+ b.backlog[0] = nil
+ b.backlog = b.backlog[1:]
+ default:
+ }
+ }
+}
+
+// get returns the channel that the scStateUpdate will be sent to.
+//
+// Upon receiving, the caller should call load to send another
+// scStateChangeTuple onto the channel if there is any.
+func (b *scStateUpdateBuffer) get() <-chan *scStateUpdate {
+ return b.c
+}
+
+// resolverUpdate contains the new resolved addresses or error if there's
+// any.
+type resolverUpdate struct {
+ addrs []resolver.Address
+ err error
+}
+
+// ccBalancerWrapper is a wrapper on top of cc for balancers.
+// It implements balancer.ClientConn interface.
+type ccBalancerWrapper struct {
+ cc *ClientConn
+ balancer balancer.Balancer
+ stateChangeQueue *scStateUpdateBuffer
+ resolverUpdateCh chan *resolverUpdate
+ done chan struct{}
+
+ mu sync.Mutex
+ subConns map[*acBalancerWrapper]struct{}
+}
+
+func newCCBalancerWrapper(cc *ClientConn, b balancer.Builder, bopts balancer.BuildOptions) *ccBalancerWrapper {
+ ccb := &ccBalancerWrapper{
+ cc: cc,
+ stateChangeQueue: newSCStateUpdateBuffer(),
+ resolverUpdateCh: make(chan *resolverUpdate, 1),
+ done: make(chan struct{}),
+ subConns: make(map[*acBalancerWrapper]struct{}),
+ }
+ go ccb.watcher()
+ ccb.balancer = b.Build(ccb, bopts)
+ return ccb
+}
+
+// watcher balancer functions sequencially, so the balancer can be implemeneted
+// lock-free.
+func (ccb *ccBalancerWrapper) watcher() {
+ for {
+ select {
+ case t := <-ccb.stateChangeQueue.get():
+ ccb.stateChangeQueue.load()
+ select {
+ case <-ccb.done:
+ ccb.balancer.Close()
+ return
+ default:
+ }
+ ccb.balancer.HandleSubConnStateChange(t.sc, t.state)
+ case t := <-ccb.resolverUpdateCh:
+ select {
+ case <-ccb.done:
+ ccb.balancer.Close()
+ return
+ default:
+ }
+ ccb.balancer.HandleResolvedAddrs(t.addrs, t.err)
+ case <-ccb.done:
+ }
+
+ select {
+ case <-ccb.done:
+ ccb.balancer.Close()
+ ccb.mu.Lock()
+ scs := ccb.subConns
+ ccb.subConns = nil
+ ccb.mu.Unlock()
+ for acbw := range scs {
+ ccb.cc.removeAddrConn(acbw.getAddrConn(), errConnDrain)
+ }
+ return
+ default:
+ }
+ }
+}
+
+func (ccb *ccBalancerWrapper) close() {
+ close(ccb.done)
+}
+
+func (ccb *ccBalancerWrapper) handleSubConnStateChange(sc balancer.SubConn, s connectivity.State) {
+ // When updating addresses for a SubConn, if the address in use is not in
+ // the new addresses, the old ac will be tearDown() and a new ac will be
+ // created. tearDown() generates a state change with Shutdown state, we
+ // don't want the balancer to receive this state change. So before
+ // tearDown() on the old ac, ac.acbw (acWrapper) will be set to nil, and
+ // this function will be called with (nil, Shutdown). We don't need to call
+ // balancer method in this case.
+ if sc == nil {
+ return
+ }
+ ccb.stateChangeQueue.put(&scStateUpdate{
+ sc: sc,
+ state: s,
+ })
+}
+
+func (ccb *ccBalancerWrapper) handleResolvedAddrs(addrs []resolver.Address, err error) {
+ select {
+ case <-ccb.resolverUpdateCh:
+ default:
+ }
+ ccb.resolverUpdateCh <- &resolverUpdate{
+ addrs: addrs,
+ err: err,
+ }
+}
+
+func (ccb *ccBalancerWrapper) NewSubConn(addrs []resolver.Address, opts balancer.NewSubConnOptions) (balancer.SubConn, error) {
+ if len(addrs) <= 0 {
+ return nil, fmt.Errorf("grpc: cannot create SubConn with empty address list")
+ }
+ ccb.mu.Lock()
+ defer ccb.mu.Unlock()
+ if ccb.subConns == nil {
+ return nil, fmt.Errorf("grpc: ClientConn balancer wrapper was closed")
+ }
+ ac, err := ccb.cc.newAddrConn(addrs)
+ if err != nil {
+ return nil, err
+ }
+ acbw := &acBalancerWrapper{ac: ac}
+ acbw.ac.mu.Lock()
+ ac.acbw = acbw
+ acbw.ac.mu.Unlock()
+ ccb.subConns[acbw] = struct{}{}
+ return acbw, nil
+}
+
+func (ccb *ccBalancerWrapper) RemoveSubConn(sc balancer.SubConn) {
+ acbw, ok := sc.(*acBalancerWrapper)
+ if !ok {
+ return
+ }
+ ccb.mu.Lock()
+ defer ccb.mu.Unlock()
+ if ccb.subConns == nil {
+ return
+ }
+ delete(ccb.subConns, acbw)
+ ccb.cc.removeAddrConn(acbw.getAddrConn(), errConnDrain)
+}
+
+func (ccb *ccBalancerWrapper) UpdateBalancerState(s connectivity.State, p balancer.Picker) {
+ ccb.mu.Lock()
+ defer ccb.mu.Unlock()
+ if ccb.subConns == nil {
+ return
+ }
+ ccb.cc.csMgr.updateState(s)
+ ccb.cc.blockingpicker.updatePicker(p)
+}
+
+func (ccb *ccBalancerWrapper) ResolveNow(o resolver.ResolveNowOption) {
+ ccb.cc.resolveNow(o)
+}
+
+func (ccb *ccBalancerWrapper) Target() string {
+ return ccb.cc.target
+}
+
+// acBalancerWrapper is a wrapper on top of ac for balancers.
+// It implements balancer.SubConn interface.
+type acBalancerWrapper struct {
+ mu sync.Mutex
+ ac *addrConn
+}
+
+func (acbw *acBalancerWrapper) UpdateAddresses(addrs []resolver.Address) {
+ acbw.mu.Lock()
+ defer acbw.mu.Unlock()
+ if len(addrs) <= 0 {
+ acbw.ac.tearDown(errConnDrain)
+ return
+ }
+ if !acbw.ac.tryUpdateAddrs(addrs) {
+ cc := acbw.ac.cc
+ acbw.ac.mu.Lock()
+ // Set old ac.acbw to nil so the Shutdown state update will be ignored
+ // by balancer.
+ //
+ // TODO(bar) the state transition could be wrong when tearDown() old ac
+ // and creating new ac, fix the transition.
+ acbw.ac.acbw = nil
+ acbw.ac.mu.Unlock()
+ acState := acbw.ac.getState()
+ acbw.ac.tearDown(errConnDrain)
+
+ if acState == connectivity.Shutdown {
+ return
+ }
+
+ ac, err := cc.newAddrConn(addrs)
+ if err != nil {
+ grpclog.Warningf("acBalancerWrapper: UpdateAddresses: failed to newAddrConn: %v", err)
+ return
+ }
+ acbw.ac = ac
+ ac.mu.Lock()
+ ac.acbw = acbw
+ ac.mu.Unlock()
+ if acState != connectivity.Idle {
+ ac.connect()
+ }
+ }
+}
+
+func (acbw *acBalancerWrapper) Connect() {
+ acbw.mu.Lock()
+ defer acbw.mu.Unlock()
+ acbw.ac.connect()
+}
+
+func (acbw *acBalancerWrapper) getAddrConn() *addrConn {
+ acbw.mu.Lock()
+ defer acbw.mu.Unlock()
+ return acbw.ac
+}
diff --git a/vendor/google.golang.org/grpc/balancer_switching_test.go b/vendor/google.golang.org/grpc/balancer_switching_test.go
new file mode 100644
index 0000000..0d8b2a5
--- /dev/null
+++ b/vendor/google.golang.org/grpc/balancer_switching_test.go
@@ -0,0 +1,443 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package grpc
+
+import (
+ "fmt"
+ "math"
+ "testing"
+ "time"
+
+ "golang.org/x/net/context"
+ "google.golang.org/grpc/balancer/roundrobin"
+ _ "google.golang.org/grpc/grpclog/glogger"
+ "google.golang.org/grpc/resolver"
+ "google.golang.org/grpc/resolver/manual"
+ "google.golang.org/grpc/test/leakcheck"
+)
+
+func checkPickFirst(cc *ClientConn, servers []*server) error {
+ var (
+ req = "port"
+ reply string
+ err error
+ )
+ connected := false
+ for i := 0; i < 5000; i++ {
+ if err = Invoke(context.Background(), "/foo/bar", &req, &reply, cc); errorDesc(err) == servers[0].port {
+ if connected {
+ // connected is set to false if peer is not server[0]. So if
+ // connected is true here, this is the second time we saw
+ // server[0] in a row. Break because pickfirst is in effect.
+ break
+ }
+ connected = true
+ } else {
+ connected = false
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !connected {
+ return fmt.Errorf("pickfirst is not in effect after 5 second, EmptyCall() = _, %v, want _, %v", err, servers[0].port)
+ }
+ // The following RPCs should all succeed with the first server.
+ for i := 0; i < 3; i++ {
+ err = Invoke(context.Background(), "/foo/bar", &req, &reply, cc)
+ if errorDesc(err) != servers[0].port {
+ return fmt.Errorf("Index %d: want peer %v, got peer %v", i, servers[0].port, err)
+ }
+ }
+ return nil
+}
+
+func checkRoundRobin(cc *ClientConn, servers []*server) error {
+ var (
+ req = "port"
+ reply string
+ err error
+ )
+
+ // Make sure connections to all servers are up.
+ for i := 0; i < 2; i++ {
+ // Do this check twice, otherwise the first RPC's transport may still be
+ // picked by the closing pickfirst balancer, and the test becomes flaky.
+ for _, s := range servers {
+ var up bool
+ for i := 0; i < 5000; i++ {
+ if err = Invoke(context.Background(), "/foo/bar", &req, &reply, cc); errorDesc(err) == s.port {
+ up = true
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !up {
+ return fmt.Errorf("server %v is not up within 5 second", s.port)
+ }
+ }
+ }
+
+ serverCount := len(servers)
+ for i := 0; i < 3*serverCount; i++ {
+ err = Invoke(context.Background(), "/foo/bar", &req, &reply, cc)
+ if errorDesc(err) != servers[i%serverCount].port {
+ return fmt.Errorf("Index %d: want peer %v, got peer %v", i, servers[i%serverCount].port, err)
+ }
+ }
+ return nil
+}
+
+func TestSwitchBalancer(t *testing.T) {
+ defer leakcheck.Check(t)
+ r, rcleanup := manual.GenerateAndRegisterManualResolver()
+ defer rcleanup()
+
+ numServers := 2
+ servers, _, scleanup := startServers(t, numServers, math.MaxInt32)
+ defer scleanup()
+
+ cc, err := Dial(r.Scheme()+":///test.server", WithInsecure(), WithCodec(testCodec{}))
+ if err != nil {
+ t.Fatalf("failed to dial: %v", err)
+ }
+ defer cc.Close()
+ r.NewAddress([]resolver.Address{{Addr: servers[0].addr}, {Addr: servers[1].addr}})
+ // The default balancer is pickfirst.
+ if err := checkPickFirst(cc, servers); err != nil {
+ t.Fatalf("check pickfirst returned non-nil error: %v", err)
+ }
+ // Switch to roundrobin.
+ cc.handleServiceConfig(`{"loadBalancingPolicy": "round_robin"}`)
+ if err := checkRoundRobin(cc, servers); err != nil {
+ t.Fatalf("check roundrobin returned non-nil error: %v", err)
+ }
+ // Switch to pickfirst.
+ cc.handleServiceConfig(`{"loadBalancingPolicy": "pick_first"}`)
+ if err := checkPickFirst(cc, servers); err != nil {
+ t.Fatalf("check pickfirst returned non-nil error: %v", err)
+ }
+}
+
+// Test that balancer specified by dial option will not be overridden.
+func TestBalancerDialOption(t *testing.T) {
+ defer leakcheck.Check(t)
+ r, rcleanup := manual.GenerateAndRegisterManualResolver()
+ defer rcleanup()
+
+ numServers := 2
+ servers, _, scleanup := startServers(t, numServers, math.MaxInt32)
+ defer scleanup()
+
+ cc, err := Dial(r.Scheme()+":///test.server", WithInsecure(), WithCodec(testCodec{}), WithBalancerName(roundrobin.Name))
+ if err != nil {
+ t.Fatalf("failed to dial: %v", err)
+ }
+ defer cc.Close()
+ r.NewAddress([]resolver.Address{{Addr: servers[0].addr}, {Addr: servers[1].addr}})
+ // The init balancer is roundrobin.
+ if err := checkRoundRobin(cc, servers); err != nil {
+ t.Fatalf("check roundrobin returned non-nil error: %v", err)
+ }
+ // Switch to pickfirst.
+ cc.handleServiceConfig(`{"loadBalancingPolicy": "pick_first"}`)
+ // Balancer is still roundrobin.
+ if err := checkRoundRobin(cc, servers); err != nil {
+ t.Fatalf("check roundrobin returned non-nil error: %v", err)
+ }
+}
+
+// First addr update contains grpclb.
+func TestSwitchBalancerGRPCLBFirst(t *testing.T) {
+ defer leakcheck.Check(t)
+ r, rcleanup := manual.GenerateAndRegisterManualResolver()
+ defer rcleanup()
+
+ cc, err := Dial(r.Scheme()+":///test.server", WithInsecure(), WithCodec(testCodec{}))
+ if err != nil {
+ t.Fatalf("failed to dial: %v", err)
+ }
+ defer cc.Close()
+
+ // ClientConn will switch balancer to grpclb when receives an address of
+ // type GRPCLB.
+ r.NewAddress([]resolver.Address{{Addr: "backend"}, {Addr: "grpclb", Type: resolver.GRPCLB}})
+ var isGRPCLB bool
+ for i := 0; i < 5000; i++ {
+ cc.mu.Lock()
+ isGRPCLB = cc.curBalancerName == "grpclb"
+ cc.mu.Unlock()
+ if isGRPCLB {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !isGRPCLB {
+ t.Fatalf("after 5 second, cc.balancer is of type %v, not grpclb", cc.curBalancerName)
+ }
+
+ // New update containing new backend and new grpclb. Should not switch
+ // balancer.
+ r.NewAddress([]resolver.Address{{Addr: "backend2"}, {Addr: "grpclb2", Type: resolver.GRPCLB}})
+ for i := 0; i < 200; i++ {
+ cc.mu.Lock()
+ isGRPCLB = cc.curBalancerName == "grpclb"
+ cc.mu.Unlock()
+ if !isGRPCLB {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !isGRPCLB {
+ t.Fatalf("within 200 ms, cc.balancer switched to !grpclb, want grpclb")
+ }
+
+ var isPickFirst bool
+ // Switch balancer to pickfirst.
+ r.NewAddress([]resolver.Address{{Addr: "backend"}})
+ for i := 0; i < 5000; i++ {
+ cc.mu.Lock()
+ isPickFirst = cc.curBalancerName == PickFirstBalancerName
+ cc.mu.Unlock()
+ if isPickFirst {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !isPickFirst {
+ t.Fatalf("after 5 second, cc.balancer is of type %v, not pick_first", cc.curBalancerName)
+ }
+}
+
+// First addr update does not contain grpclb.
+func TestSwitchBalancerGRPCLBSecond(t *testing.T) {
+ defer leakcheck.Check(t)
+ r, rcleanup := manual.GenerateAndRegisterManualResolver()
+ defer rcleanup()
+
+ cc, err := Dial(r.Scheme()+":///test.server", WithInsecure(), WithCodec(testCodec{}))
+ if err != nil {
+ t.Fatalf("failed to dial: %v", err)
+ }
+ defer cc.Close()
+
+ r.NewAddress([]resolver.Address{{Addr: "backend"}})
+ var isPickFirst bool
+ for i := 0; i < 5000; i++ {
+ cc.mu.Lock()
+ isPickFirst = cc.curBalancerName == PickFirstBalancerName
+ cc.mu.Unlock()
+ if isPickFirst {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !isPickFirst {
+ t.Fatalf("after 5 second, cc.balancer is of type %v, not pick_first", cc.curBalancerName)
+ }
+
+ // ClientConn will switch balancer to grpclb when receives an address of
+ // type GRPCLB.
+ r.NewAddress([]resolver.Address{{Addr: "backend"}, {Addr: "grpclb", Type: resolver.GRPCLB}})
+ var isGRPCLB bool
+ for i := 0; i < 5000; i++ {
+ cc.mu.Lock()
+ isGRPCLB = cc.curBalancerName == "grpclb"
+ cc.mu.Unlock()
+ if isGRPCLB {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !isGRPCLB {
+ t.Fatalf("after 5 second, cc.balancer is of type %v, not grpclb", cc.curBalancerName)
+ }
+
+ // New update containing new backend and new grpclb. Should not switch
+ // balancer.
+ r.NewAddress([]resolver.Address{{Addr: "backend2"}, {Addr: "grpclb2", Type: resolver.GRPCLB}})
+ for i := 0; i < 200; i++ {
+ cc.mu.Lock()
+ isGRPCLB = cc.curBalancerName == "grpclb"
+ cc.mu.Unlock()
+ if !isGRPCLB {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !isGRPCLB {
+ t.Fatalf("within 200 ms, cc.balancer switched to !grpclb, want grpclb")
+ }
+
+ // Switch balancer back.
+ r.NewAddress([]resolver.Address{{Addr: "backend"}})
+ for i := 0; i < 5000; i++ {
+ cc.mu.Lock()
+ isPickFirst = cc.curBalancerName == PickFirstBalancerName
+ cc.mu.Unlock()
+ if isPickFirst {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !isPickFirst {
+ t.Fatalf("after 5 second, cc.balancer is of type %v, not pick_first", cc.curBalancerName)
+ }
+}
+
+// Test that if the current balancer is roundrobin, after switching to grpclb,
+// when the resolved address doesn't contain grpclb addresses, balancer will be
+// switched back to roundrobin.
+func TestSwitchBalancerGRPCLBRoundRobin(t *testing.T) {
+ defer leakcheck.Check(t)
+ r, rcleanup := manual.GenerateAndRegisterManualResolver()
+ defer rcleanup()
+
+ cc, err := Dial(r.Scheme()+":///test.server", WithInsecure(), WithCodec(testCodec{}))
+ if err != nil {
+ t.Fatalf("failed to dial: %v", err)
+ }
+ defer cc.Close()
+
+ r.NewServiceConfig(`{"loadBalancingPolicy": "round_robin"}`)
+
+ r.NewAddress([]resolver.Address{{Addr: "backend"}})
+ var isRoundRobin bool
+ for i := 0; i < 5000; i++ {
+ cc.mu.Lock()
+ isRoundRobin = cc.curBalancerName == "round_robin"
+ cc.mu.Unlock()
+ if isRoundRobin {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !isRoundRobin {
+ t.Fatalf("after 5 second, cc.balancer is of type %v, not round_robin", cc.curBalancerName)
+ }
+
+ // ClientConn will switch balancer to grpclb when receives an address of
+ // type GRPCLB.
+ r.NewAddress([]resolver.Address{{Addr: "grpclb", Type: resolver.GRPCLB}})
+ var isGRPCLB bool
+ for i := 0; i < 5000; i++ {
+ cc.mu.Lock()
+ isGRPCLB = cc.curBalancerName == "grpclb"
+ cc.mu.Unlock()
+ if isGRPCLB {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !isGRPCLB {
+ t.Fatalf("after 5 second, cc.balancer is of type %v, not grpclb", cc.curBalancerName)
+ }
+
+ // Switch balancer back.
+ r.NewAddress([]resolver.Address{{Addr: "backend"}})
+ for i := 0; i < 5000; i++ {
+ cc.mu.Lock()
+ isRoundRobin = cc.curBalancerName == "round_robin"
+ cc.mu.Unlock()
+ if isRoundRobin {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !isRoundRobin {
+ t.Fatalf("after 5 second, cc.balancer is of type %v, not round_robin", cc.curBalancerName)
+ }
+}
+
+// Test that if resolved address list contains grpclb, the balancer option in
+// service config won't take effect. But when there's no grpclb address in a new
+// resolved address list, balancer will be switched to the new one.
+func TestSwitchBalancerGRPCLBServiceConfig(t *testing.T) {
+ defer leakcheck.Check(t)
+ r, rcleanup := manual.GenerateAndRegisterManualResolver()
+ defer rcleanup()
+
+ cc, err := Dial(r.Scheme()+":///test.server", WithInsecure(), WithCodec(testCodec{}))
+ if err != nil {
+ t.Fatalf("failed to dial: %v", err)
+ }
+ defer cc.Close()
+
+ r.NewAddress([]resolver.Address{{Addr: "backend"}})
+ var isPickFirst bool
+ for i := 0; i < 5000; i++ {
+ cc.mu.Lock()
+ isPickFirst = cc.curBalancerName == PickFirstBalancerName
+ cc.mu.Unlock()
+ if isPickFirst {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !isPickFirst {
+ t.Fatalf("after 5 second, cc.balancer is of type %v, not pick_first", cc.curBalancerName)
+ }
+
+ // ClientConn will switch balancer to grpclb when receives an address of
+ // type GRPCLB.
+ r.NewAddress([]resolver.Address{{Addr: "grpclb", Type: resolver.GRPCLB}})
+ var isGRPCLB bool
+ for i := 0; i < 5000; i++ {
+ cc.mu.Lock()
+ isGRPCLB = cc.curBalancerName == "grpclb"
+ cc.mu.Unlock()
+ if isGRPCLB {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !isGRPCLB {
+ t.Fatalf("after 5 second, cc.balancer is of type %v, not grpclb", cc.curBalancerName)
+ }
+
+ r.NewServiceConfig(`{"loadBalancingPolicy": "round_robin"}`)
+ var isRoundRobin bool
+ for i := 0; i < 200; i++ {
+ cc.mu.Lock()
+ isRoundRobin = cc.curBalancerName == "round_robin"
+ cc.mu.Unlock()
+ if isRoundRobin {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ // Balancer should NOT switch to round_robin because resolved list contains
+ // grpclb.
+ if isRoundRobin {
+ t.Fatalf("within 200 ms, cc.balancer switched to round_robin, want grpclb")
+ }
+
+ // Switch balancer back.
+ r.NewAddress([]resolver.Address{{Addr: "backend"}})
+ for i := 0; i < 5000; i++ {
+ cc.mu.Lock()
+ isRoundRobin = cc.curBalancerName == "round_robin"
+ cc.mu.Unlock()
+ if isRoundRobin {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !isRoundRobin {
+ t.Fatalf("after 5 second, cc.balancer is of type %v, not round_robin", cc.curBalancerName)
+ }
+}
diff --git a/vendor/google.golang.org/grpc/balancer_test.go b/vendor/google.golang.org/grpc/balancer_test.go
index 86fc196..3e0fa19 100644
--- a/vendor/google.golang.org/grpc/balancer_test.go
+++ b/vendor/google.golang.org/grpc/balancer_test.go
@@ -28,7 +28,15 @@ import (
"golang.org/x/net/context"
"google.golang.org/grpc/codes"
+ _ "google.golang.org/grpc/grpclog/glogger"
"google.golang.org/grpc/naming"
+ "google.golang.org/grpc/status"
+ "google.golang.org/grpc/test/leakcheck"
+
+ // V1 balancer tests use passthrough resolver instead of dns.
+ // TODO(bar) remove this when removing v1 balaner entirely.
+
+ _ "google.golang.org/grpc/resolver/passthrough"
)
type testWatcher struct {
@@ -56,6 +64,7 @@ func (w *testWatcher) Next() (updates []*naming.Update, err error) {
}
func (w *testWatcher) Close() {
+ close(w.side)
}
// Inject naming resolution updates to the testWatcher.
@@ -89,7 +98,7 @@ func (r *testNameResolver) Resolve(target string) (naming.Watcher, error) {
return r.w, nil
}
-func startServers(t *testing.T, numServers int, maxStreams uint32) ([]*server, *testNameResolver) {
+func startServers(t *testing.T, numServers int, maxStreams uint32) ([]*server, *testNameResolver, func()) {
var servers []*server
for i := 0; i < numServers; i++ {
s := newTestServer()
@@ -100,21 +109,28 @@ func startServers(t *testing.T, numServers int, maxStreams uint32) ([]*server, *
// Point to server[0]
addr := "localhost:" + servers[0].port
return servers, &testNameResolver{
- addr: addr,
- }
+ addr: addr,
+ }, func() {
+ for i := 0; i < numServers; i++ {
+ servers[i].stop()
+ }
+ }
}
func TestNameDiscovery(t *testing.T) {
+ defer leakcheck.Check(t)
// Start 2 servers on 2 ports.
numServers := 2
- servers, r := startServers(t, numServers, math.MaxUint32)
- cc, err := Dial("foo.bar.com", WithBalancer(RoundRobin(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
+ servers, r, cleanup := startServers(t, numServers, math.MaxUint32)
+ defer cleanup()
+ cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(RoundRobin(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
if err != nil {
t.Fatalf("Failed to create ClientConn: %v", err)
}
+ defer cc.Close()
req := "port"
var reply string
- if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || ErrorDesc(err) != servers[0].port {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || errorDesc(err) != servers[0].port {
t.Fatalf("grpc.Invoke(_, _, _, _, _) = %v, want %s", err, servers[0].port)
}
// Inject the name resolution change to remove servers[0] and add servers[1].
@@ -130,23 +146,22 @@ func TestNameDiscovery(t *testing.T) {
r.w.inject(updates)
// Loop until the rpcs in flight talks to servers[1].
for {
- if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && ErrorDesc(err) == servers[1].port {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && errorDesc(err) == servers[1].port {
break
}
time.Sleep(10 * time.Millisecond)
}
- cc.Close()
- for i := 0; i < numServers; i++ {
- servers[i].stop()
- }
}
func TestEmptyAddrs(t *testing.T) {
- servers, r := startServers(t, 1, math.MaxUint32)
- cc, err := Dial("foo.bar.com", WithBalancer(RoundRobin(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
+ defer leakcheck.Check(t)
+ servers, r, cleanup := startServers(t, 1, math.MaxUint32)
+ defer cleanup()
+ cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(RoundRobin(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
if err != nil {
t.Fatalf("Failed to create ClientConn: %v", err)
}
+ defer cc.Close()
var reply string
if err := Invoke(context.Background(), "/foo/bar", &expectedRequest, &reply, cc); err != nil || reply != expectedResponse {
t.Fatalf("grpc.Invoke(_, _, _, _, _) = %v, reply = %q, want %q, ", err, reply, expectedResponse)
@@ -168,18 +183,19 @@ func TestEmptyAddrs(t *testing.T) {
}
cancel()
}
- cc.Close()
- servers[0].stop()
}
func TestRoundRobin(t *testing.T) {
+ defer leakcheck.Check(t)
// Start 3 servers on 3 ports.
numServers := 3
- servers, r := startServers(t, numServers, math.MaxUint32)
- cc, err := Dial("foo.bar.com", WithBalancer(RoundRobin(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
+ servers, r, cleanup := startServers(t, numServers, math.MaxUint32)
+ defer cleanup()
+ cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(RoundRobin(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
if err != nil {
t.Fatalf("Failed to create ClientConn: %v", err)
}
+ defer cc.Close()
// Add servers[1] to the service discovery.
u := &naming.Update{
Op: naming.Add,
@@ -190,7 +206,7 @@ func TestRoundRobin(t *testing.T) {
var reply string
// Loop until servers[1] is up
for {
- if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && ErrorDesc(err) == servers[1].port {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && errorDesc(err) == servers[1].port {
break
}
time.Sleep(10 * time.Millisecond)
@@ -203,29 +219,28 @@ func TestRoundRobin(t *testing.T) {
r.w.inject([]*naming.Update{u})
// Loop until both servers[2] are up.
for {
- if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && ErrorDesc(err) == servers[2].port {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && errorDesc(err) == servers[2].port {
break
}
time.Sleep(10 * time.Millisecond)
}
// Check the incoming RPCs served in a round-robin manner.
for i := 0; i < 10; i++ {
- if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || ErrorDesc(err) != servers[i%numServers].port {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || errorDesc(err) != servers[i%numServers].port {
t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", i, err, servers[i%numServers].port)
}
}
- cc.Close()
- for i := 0; i < numServers; i++ {
- servers[i].stop()
- }
}
func TestCloseWithPendingRPC(t *testing.T) {
- servers, r := startServers(t, 1, math.MaxUint32)
- cc, err := Dial("foo.bar.com", WithBalancer(RoundRobin(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
+ defer leakcheck.Check(t)
+ servers, r, cleanup := startServers(t, 1, math.MaxUint32)
+ defer cleanup()
+ cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(RoundRobin(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
if err != nil {
t.Fatalf("Failed to create ClientConn: %v", err)
}
+ defer cc.Close()
var reply string
if err := Invoke(context.Background(), "/foo/bar", &expectedRequest, &reply, cc, FailFast(false)); err != nil {
t.Fatalf("grpc.Invoke(_, _, _, _, _) = %v, want %s", err, servers[0].port)
@@ -239,7 +254,7 @@ func TestCloseWithPendingRPC(t *testing.T) {
// Loop until the above update applies.
for {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond)
- if err := Invoke(ctx, "/foo/bar", &expectedRequest, &reply, cc, FailFast(false)); Code(err) == codes.DeadlineExceeded {
+ if err := Invoke(ctx, "/foo/bar", &expectedRequest, &reply, cc, FailFast(false)); status.Code(err) == codes.DeadlineExceeded {
cancel()
break
}
@@ -267,15 +282,17 @@ func TestCloseWithPendingRPC(t *testing.T) {
time.Sleep(5 * time.Millisecond)
cc.Close()
wg.Wait()
- servers[0].stop()
}
func TestGetOnWaitChannel(t *testing.T) {
- servers, r := startServers(t, 1, math.MaxUint32)
- cc, err := Dial("foo.bar.com", WithBalancer(RoundRobin(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
+ defer leakcheck.Check(t)
+ servers, r, cleanup := startServers(t, 1, math.MaxUint32)
+ defer cleanup()
+ cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(RoundRobin(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
if err != nil {
t.Fatalf("Failed to create ClientConn: %v", err)
}
+ defer cc.Close()
// Remove all servers so that all upcoming RPCs will block on waitCh.
updates := []*naming.Update{{
Op: naming.Delete,
@@ -285,7 +302,7 @@ func TestGetOnWaitChannel(t *testing.T) {
for {
var reply string
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond)
- if err := Invoke(ctx, "/foo/bar", &expectedRequest, &reply, cc, FailFast(false)); Code(err) == codes.DeadlineExceeded {
+ if err := Invoke(ctx, "/foo/bar", &expectedRequest, &reply, cc, FailFast(false)); status.Code(err) == codes.DeadlineExceeded {
cancel()
break
}
@@ -309,18 +326,19 @@ func TestGetOnWaitChannel(t *testing.T) {
r.w.inject(updates)
// Wait until the above RPC succeeds.
wg.Wait()
- cc.Close()
- servers[0].stop()
}
func TestOneServerDown(t *testing.T) {
+ defer leakcheck.Check(t)
// Start 2 servers.
numServers := 2
- servers, r := startServers(t, numServers, math.MaxUint32)
- cc, err := Dial("foo.bar.com", WithBalancer(RoundRobin(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
+ servers, r, cleanup := startServers(t, numServers, math.MaxUint32)
+ defer cleanup()
+ cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(RoundRobin(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}), WithWaitForHandshake())
if err != nil {
t.Fatalf("Failed to create ClientConn: %v", err)
}
+ defer cc.Close()
// Add servers[1] to the service discovery.
var updates []*naming.Update
updates = append(updates, &naming.Update{
@@ -332,7 +350,7 @@ func TestOneServerDown(t *testing.T) {
var reply string
// Loop until servers[1] is up
for {
- if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && ErrorDesc(err) == servers[1].port {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && errorDesc(err) == servers[1].port {
break
}
time.Sleep(10 * time.Millisecond)
@@ -361,20 +379,19 @@ func TestOneServerDown(t *testing.T) {
}()
}
wg.Wait()
- cc.Close()
- for i := 0; i < numServers; i++ {
- servers[i].stop()
- }
}
func TestOneAddressRemoval(t *testing.T) {
+ defer leakcheck.Check(t)
// Start 2 servers.
numServers := 2
- servers, r := startServers(t, numServers, math.MaxUint32)
- cc, err := Dial("foo.bar.com", WithBalancer(RoundRobin(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
+ servers, r, cleanup := startServers(t, numServers, math.MaxUint32)
+ defer cleanup()
+ cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(RoundRobin(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
if err != nil {
t.Fatalf("Failed to create ClientConn: %v", err)
}
+ defer cc.Close()
// Add servers[1] to the service discovery.
var updates []*naming.Update
updates = append(updates, &naming.Update{
@@ -386,7 +403,7 @@ func TestOneAddressRemoval(t *testing.T) {
var reply string
// Loop until servers[1] is up
for {
- if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && ErrorDesc(err) == servers[1].port {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && errorDesc(err) == servers[1].port {
break
}
time.Sleep(10 * time.Millisecond)
@@ -423,33 +440,30 @@ func TestOneAddressRemoval(t *testing.T) {
}()
}
wg.Wait()
- cc.Close()
- for i := 0; i < numServers; i++ {
- servers[i].stop()
- }
}
func checkServerUp(t *testing.T, currentServer *server) {
req := "port"
port := currentServer.port
- cc, err := Dial("localhost:"+port, WithBlock(), WithInsecure(), WithCodec(testCodec{}))
+ cc, err := Dial("passthrough:///localhost:"+port, WithBlock(), WithInsecure(), WithCodec(testCodec{}))
if err != nil {
t.Fatalf("Failed to create ClientConn: %v", err)
}
+ defer cc.Close()
var reply string
for {
- if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && ErrorDesc(err) == port {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && errorDesc(err) == port {
break
}
time.Sleep(10 * time.Millisecond)
}
- cc.Close()
}
func TestPickFirstEmptyAddrs(t *testing.T) {
- servers, r := startServers(t, 1, math.MaxUint32)
- defer servers[0].stop()
- cc, err := Dial("foo.bar.com", WithBalancer(pickFirstBalancer(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
+ defer leakcheck.Check(t)
+ servers, r, cleanup := startServers(t, 1, math.MaxUint32)
+ defer cleanup()
+ cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(pickFirstBalancerV1(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
if err != nil {
t.Fatalf("Failed to create ClientConn: %v", err)
}
@@ -478,12 +492,14 @@ func TestPickFirstEmptyAddrs(t *testing.T) {
}
func TestPickFirstCloseWithPendingRPC(t *testing.T) {
- servers, r := startServers(t, 1, math.MaxUint32)
- defer servers[0].stop()
- cc, err := Dial("foo.bar.com", WithBalancer(pickFirstBalancer(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
+ defer leakcheck.Check(t)
+ servers, r, cleanup := startServers(t, 1, math.MaxUint32)
+ defer cleanup()
+ cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(pickFirstBalancerV1(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
if err != nil {
t.Fatalf("Failed to create ClientConn: %v", err)
}
+ defer cc.Close()
var reply string
if err := Invoke(context.Background(), "/foo/bar", &expectedRequest, &reply, cc, FailFast(false)); err != nil {
t.Fatalf("grpc.Invoke(_, _, _, _, _) = %v, want %s", err, servers[0].port)
@@ -497,7 +513,7 @@ func TestPickFirstCloseWithPendingRPC(t *testing.T) {
// Loop until the above update applies.
for {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond)
- if err := Invoke(ctx, "/foo/bar", &expectedRequest, &reply, cc, FailFast(false)); Code(err) == codes.DeadlineExceeded {
+ if err := Invoke(ctx, "/foo/bar", &expectedRequest, &reply, cc, FailFast(false)); status.Code(err) == codes.DeadlineExceeded {
cancel()
break
}
@@ -528,13 +544,12 @@ func TestPickFirstCloseWithPendingRPC(t *testing.T) {
}
func TestPickFirstOrderAllServerUp(t *testing.T) {
+ defer leakcheck.Check(t)
// Start 3 servers on 3 ports.
numServers := 3
- servers, r := startServers(t, numServers, math.MaxUint32)
- for i := 0; i < numServers; i++ {
- defer servers[i].stop()
- }
- cc, err := Dial("foo.bar.com", WithBalancer(pickFirstBalancer(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
+ servers, r, cleanup := startServers(t, numServers, math.MaxUint32)
+ defer cleanup()
+ cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(pickFirstBalancerV1(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
if err != nil {
t.Fatalf("Failed to create ClientConn: %v", err)
}
@@ -561,7 +576,7 @@ func TestPickFirstOrderAllServerUp(t *testing.T) {
req := "port"
var reply string
for i := 0; i < 20; i++ {
- if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || ErrorDesc(err) != servers[0].port {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || errorDesc(err) != servers[0].port {
t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 0, err, servers[0].port)
}
time.Sleep(10 * time.Millisecond)
@@ -576,13 +591,13 @@ func TestPickFirstOrderAllServerUp(t *testing.T) {
r.w.inject([]*naming.Update{u})
// Loop until it changes to server[1]
for {
- if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && ErrorDesc(err) == servers[1].port {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && errorDesc(err) == servers[1].port {
break
}
time.Sleep(10 * time.Millisecond)
}
for i := 0; i < 20; i++ {
- if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || ErrorDesc(err) != servers[1].port {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || errorDesc(err) != servers[1].port {
t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 1, err, servers[1].port)
}
time.Sleep(10 * time.Millisecond)
@@ -596,7 +611,7 @@ func TestPickFirstOrderAllServerUp(t *testing.T) {
}
r.w.inject([]*naming.Update{u})
for i := 0; i < 20; i++ {
- if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || ErrorDesc(err) != servers[1].port {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || errorDesc(err) != servers[1].port {
t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 1, err, servers[1].port)
}
time.Sleep(10 * time.Millisecond)
@@ -609,13 +624,13 @@ func TestPickFirstOrderAllServerUp(t *testing.T) {
}
r.w.inject([]*naming.Update{u})
for {
- if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && ErrorDesc(err) == servers[2].port {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && errorDesc(err) == servers[2].port {
break
}
time.Sleep(1 * time.Second)
}
for i := 0; i < 20; i++ {
- if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || ErrorDesc(err) != servers[2].port {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || errorDesc(err) != servers[2].port {
t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 2, err, servers[2].port)
}
time.Sleep(10 * time.Millisecond)
@@ -628,27 +643,26 @@ func TestPickFirstOrderAllServerUp(t *testing.T) {
}
r.w.inject([]*naming.Update{u})
for {
- if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && ErrorDesc(err) == servers[0].port {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && errorDesc(err) == servers[0].port {
break
}
time.Sleep(1 * time.Second)
}
for i := 0; i < 20; i++ {
- if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || ErrorDesc(err) != servers[0].port {
- t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 2, err, servers[2].port)
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || errorDesc(err) != servers[0].port {
+ t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 0, err, servers[0].port)
}
time.Sleep(10 * time.Millisecond)
}
}
func TestPickFirstOrderOneServerDown(t *testing.T) {
+ defer leakcheck.Check(t)
// Start 3 servers on 3 ports.
numServers := 3
- servers, r := startServers(t, numServers, math.MaxUint32)
- for i := 0; i < numServers; i++ {
- defer servers[i].stop()
- }
- cc, err := Dial("foo.bar.com", WithBalancer(pickFirstBalancer(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
+ servers, r, cleanup := startServers(t, numServers, math.MaxUint32)
+ defer cleanup()
+ cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(pickFirstBalancerV1(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}), WithWaitForHandshake())
if err != nil {
t.Fatalf("Failed to create ClientConn: %v", err)
}
@@ -675,7 +689,7 @@ func TestPickFirstOrderOneServerDown(t *testing.T) {
req := "port"
var reply string
for i := 0; i < 20; i++ {
- if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || ErrorDesc(err) != servers[0].port {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || errorDesc(err) != servers[0].port {
t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 0, err, servers[0].port)
}
time.Sleep(10 * time.Millisecond)
@@ -686,13 +700,13 @@ func TestPickFirstOrderOneServerDown(t *testing.T) {
servers[0].stop()
// Loop until it changes to server[1]
for {
- if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && ErrorDesc(err) == servers[1].port {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && errorDesc(err) == servers[1].port {
break
}
time.Sleep(10 * time.Millisecond)
}
for i := 0; i < 20; i++ {
- if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || ErrorDesc(err) != servers[1].port {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || errorDesc(err) != servers[1].port {
t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 1, err, servers[1].port)
}
time.Sleep(10 * time.Millisecond)
@@ -702,11 +716,12 @@ func TestPickFirstOrderOneServerDown(t *testing.T) {
p, _ := strconv.Atoi(servers[0].port)
servers[0] = newTestServer()
go servers[0].start(t, p, math.MaxUint32)
+ defer servers[0].stop()
servers[0].wait(t, 2*time.Second)
checkServerUp(t, servers[0])
for i := 0; i < 20; i++ {
- if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || ErrorDesc(err) != servers[1].port {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || errorDesc(err) != servers[1].port {
t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 1, err, servers[1].port)
}
time.Sleep(10 * time.Millisecond)
@@ -719,13 +734,13 @@ func TestPickFirstOrderOneServerDown(t *testing.T) {
}
r.w.inject([]*naming.Update{u})
for {
- if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && ErrorDesc(err) == servers[0].port {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && errorDesc(err) == servers[0].port {
break
}
time.Sleep(1 * time.Second)
}
for i := 0; i < 20; i++ {
- if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || ErrorDesc(err) != servers[0].port {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || errorDesc(err) != servers[0].port {
t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 0, err, servers[0].port)
}
time.Sleep(10 * time.Millisecond)
@@ -733,13 +748,12 @@ func TestPickFirstOrderOneServerDown(t *testing.T) {
}
func TestPickFirstOneAddressRemoval(t *testing.T) {
+ defer leakcheck.Check(t)
// Start 2 servers.
numServers := 2
- servers, r := startServers(t, numServers, math.MaxUint32)
- for i := 0; i < numServers; i++ {
- defer servers[i].stop()
- }
- cc, err := Dial("localhost:"+servers[0].port, WithBalancer(pickFirstBalancer(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
+ servers, r, cleanup := startServers(t, numServers, math.MaxUint32)
+ defer cleanup()
+ cc, err := Dial("passthrough:///localhost:"+servers[0].port, WithBalancer(pickFirstBalancerV1(r)), WithBlock(), WithInsecure(), WithCodec(testCodec{}))
if err != nil {
t.Fatalf("Failed to create ClientConn: %v", err)
}
diff --git a/vendor/google.golang.org/grpc/balancer_v1_wrapper.go b/vendor/google.golang.org/grpc/balancer_v1_wrapper.go
new file mode 100644
index 0000000..faabf87
--- /dev/null
+++ b/vendor/google.golang.org/grpc/balancer_v1_wrapper.go
@@ -0,0 +1,375 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package grpc
+
+import (
+ "strings"
+ "sync"
+
+ "golang.org/x/net/context"
+ "google.golang.org/grpc/balancer"
+ "google.golang.org/grpc/codes"
+ "google.golang.org/grpc/connectivity"
+ "google.golang.org/grpc/grpclog"
+ "google.golang.org/grpc/resolver"
+ "google.golang.org/grpc/status"
+)
+
+type balancerWrapperBuilder struct {
+ b Balancer // The v1 balancer.
+}
+
+func (bwb *balancerWrapperBuilder) Build(cc balancer.ClientConn, opts balancer.BuildOptions) balancer.Balancer {
+ targetAddr := cc.Target()
+ targetSplitted := strings.Split(targetAddr, ":///")
+ if len(targetSplitted) >= 2 {
+ targetAddr = targetSplitted[1]
+ }
+
+ bwb.b.Start(targetAddr, BalancerConfig{
+ DialCreds: opts.DialCreds,
+ Dialer: opts.Dialer,
+ })
+ _, pickfirst := bwb.b.(*pickFirst)
+ bw := &balancerWrapper{
+ balancer: bwb.b,
+ pickfirst: pickfirst,
+ cc: cc,
+ targetAddr: targetAddr,
+ startCh: make(chan struct{}),
+ conns: make(map[resolver.Address]balancer.SubConn),
+ connSt: make(map[balancer.SubConn]*scState),
+ csEvltr: &connectivityStateEvaluator{},
+ state: connectivity.Idle,
+ }
+ cc.UpdateBalancerState(connectivity.Idle, bw)
+ go bw.lbWatcher()
+ return bw
+}
+
+func (bwb *balancerWrapperBuilder) Name() string {
+ return "wrapper"
+}
+
+type scState struct {
+ addr Address // The v1 address type.
+ s connectivity.State
+ down func(error)
+}
+
+type balancerWrapper struct {
+ balancer Balancer // The v1 balancer.
+ pickfirst bool
+
+ cc balancer.ClientConn
+ targetAddr string // Target without the scheme.
+
+ // To aggregate the connectivity state.
+ csEvltr *connectivityStateEvaluator
+ state connectivity.State
+
+ mu sync.Mutex
+ conns map[resolver.Address]balancer.SubConn
+ connSt map[balancer.SubConn]*scState
+ // This channel is closed when handling the first resolver result.
+ // lbWatcher blocks until this is closed, to avoid race between
+ // - NewSubConn is created, cc wants to notify balancer of state changes;
+ // - Build hasn't return, cc doesn't have access to balancer.
+ startCh chan struct{}
+}
+
+// lbWatcher watches the Notify channel of the balancer and manages
+// connections accordingly.
+func (bw *balancerWrapper) lbWatcher() {
+ <-bw.startCh
+ notifyCh := bw.balancer.Notify()
+ if notifyCh == nil {
+ // There's no resolver in the balancer. Connect directly.
+ a := resolver.Address{
+ Addr: bw.targetAddr,
+ Type: resolver.Backend,
+ }
+ sc, err := bw.cc.NewSubConn([]resolver.Address{a}, balancer.NewSubConnOptions{})
+ if err != nil {
+ grpclog.Warningf("Error creating connection to %v. Err: %v", a, err)
+ } else {
+ bw.mu.Lock()
+ bw.conns[a] = sc
+ bw.connSt[sc] = &scState{
+ addr: Address{Addr: bw.targetAddr},
+ s: connectivity.Idle,
+ }
+ bw.mu.Unlock()
+ sc.Connect()
+ }
+ return
+ }
+
+ for addrs := range notifyCh {
+ grpclog.Infof("balancerWrapper: got update addr from Notify: %v\n", addrs)
+ if bw.pickfirst {
+ var (
+ oldA resolver.Address
+ oldSC balancer.SubConn
+ )
+ bw.mu.Lock()
+ for oldA, oldSC = range bw.conns {
+ break
+ }
+ bw.mu.Unlock()
+ if len(addrs) <= 0 {
+ if oldSC != nil {
+ // Teardown old sc.
+ bw.mu.Lock()
+ delete(bw.conns, oldA)
+ delete(bw.connSt, oldSC)
+ bw.mu.Unlock()
+ bw.cc.RemoveSubConn(oldSC)
+ }
+ continue
+ }
+
+ var newAddrs []resolver.Address
+ for _, a := range addrs {
+ newAddr := resolver.Address{
+ Addr: a.Addr,
+ Type: resolver.Backend, // All addresses from balancer are all backends.
+ ServerName: "",
+ Metadata: a.Metadata,
+ }
+ newAddrs = append(newAddrs, newAddr)
+ }
+ if oldSC == nil {
+ // Create new sc.
+ sc, err := bw.cc.NewSubConn(newAddrs, balancer.NewSubConnOptions{})
+ if err != nil {
+ grpclog.Warningf("Error creating connection to %v. Err: %v", newAddrs, err)
+ } else {
+ bw.mu.Lock()
+ // For pickfirst, there should be only one SubConn, so the
+ // address doesn't matter. All states updating (up and down)
+ // and picking should all happen on that only SubConn.
+ bw.conns[resolver.Address{}] = sc
+ bw.connSt[sc] = &scState{
+ addr: addrs[0], // Use the first address.
+ s: connectivity.Idle,
+ }
+ bw.mu.Unlock()
+ sc.Connect()
+ }
+ } else {
+ bw.mu.Lock()
+ bw.connSt[oldSC].addr = addrs[0]
+ bw.mu.Unlock()
+ oldSC.UpdateAddresses(newAddrs)
+ }
+ } else {
+ var (
+ add []resolver.Address // Addresses need to setup connections.
+ del []balancer.SubConn // Connections need to tear down.
+ )
+ resAddrs := make(map[resolver.Address]Address)
+ for _, a := range addrs {
+ resAddrs[resolver.Address{
+ Addr: a.Addr,
+ Type: resolver.Backend, // All addresses from balancer are all backends.
+ ServerName: "",
+ Metadata: a.Metadata,
+ }] = a
+ }
+ bw.mu.Lock()
+ for a := range resAddrs {
+ if _, ok := bw.conns[a]; !ok {
+ add = append(add, a)
+ }
+ }
+ for a, c := range bw.conns {
+ if _, ok := resAddrs[a]; !ok {
+ del = append(del, c)
+ delete(bw.conns, a)
+ // Keep the state of this sc in bw.connSt until its state becomes Shutdown.
+ }
+ }
+ bw.mu.Unlock()
+ for _, a := range add {
+ sc, err := bw.cc.NewSubConn([]resolver.Address{a}, balancer.NewSubConnOptions{})
+ if err != nil {
+ grpclog.Warningf("Error creating connection to %v. Err: %v", a, err)
+ } else {
+ bw.mu.Lock()
+ bw.conns[a] = sc
+ bw.connSt[sc] = &scState{
+ addr: resAddrs[a],
+ s: connectivity.Idle,
+ }
+ bw.mu.Unlock()
+ sc.Connect()
+ }
+ }
+ for _, c := range del {
+ bw.cc.RemoveSubConn(c)
+ }
+ }
+ }
+}
+
+func (bw *balancerWrapper) HandleSubConnStateChange(sc balancer.SubConn, s connectivity.State) {
+ bw.mu.Lock()
+ defer bw.mu.Unlock()
+ scSt, ok := bw.connSt[sc]
+ if !ok {
+ return
+ }
+ if s == connectivity.Idle {
+ sc.Connect()
+ }
+ oldS := scSt.s
+ scSt.s = s
+ if oldS != connectivity.Ready && s == connectivity.Ready {
+ scSt.down = bw.balancer.Up(scSt.addr)
+ } else if oldS == connectivity.Ready && s != connectivity.Ready {
+ if scSt.down != nil {
+ scSt.down(errConnClosing)
+ }
+ }
+ sa := bw.csEvltr.recordTransition(oldS, s)
+ if bw.state != sa {
+ bw.state = sa
+ }
+ bw.cc.UpdateBalancerState(bw.state, bw)
+ if s == connectivity.Shutdown {
+ // Remove state for this sc.
+ delete(bw.connSt, sc)
+ }
+ return
+}
+
+func (bw *balancerWrapper) HandleResolvedAddrs([]resolver.Address, error) {
+ bw.mu.Lock()
+ defer bw.mu.Unlock()
+ select {
+ case <-bw.startCh:
+ default:
+ close(bw.startCh)
+ }
+ // There should be a resolver inside the balancer.
+ // All updates here, if any, are ignored.
+ return
+}
+
+func (bw *balancerWrapper) Close() {
+ bw.mu.Lock()
+ defer bw.mu.Unlock()
+ select {
+ case <-bw.startCh:
+ default:
+ close(bw.startCh)
+ }
+ bw.balancer.Close()
+ return
+}
+
+// The picker is the balancerWrapper itself.
+// Pick should never return ErrNoSubConnAvailable.
+// It either blocks or returns error, consistent with v1 balancer Get().
+func (bw *balancerWrapper) Pick(ctx context.Context, opts balancer.PickOptions) (balancer.SubConn, func(balancer.DoneInfo), error) {
+ failfast := true // Default failfast is true.
+ if ss, ok := rpcInfoFromContext(ctx); ok {
+ failfast = ss.failfast
+ }
+ a, p, err := bw.balancer.Get(ctx, BalancerGetOptions{BlockingWait: !failfast})
+ if err != nil {
+ return nil, nil, err
+ }
+ var done func(balancer.DoneInfo)
+ if p != nil {
+ done = func(i balancer.DoneInfo) { p() }
+ }
+ var sc balancer.SubConn
+ bw.mu.Lock()
+ defer bw.mu.Unlock()
+ if bw.pickfirst {
+ // Get the first sc in conns.
+ for _, sc = range bw.conns {
+ break
+ }
+ } else {
+ var ok bool
+ sc, ok = bw.conns[resolver.Address{
+ Addr: a.Addr,
+ Type: resolver.Backend,
+ ServerName: "",
+ Metadata: a.Metadata,
+ }]
+ if !ok && failfast {
+ return nil, nil, status.Errorf(codes.Unavailable, "there is no connection available")
+ }
+ if s, ok := bw.connSt[sc]; failfast && (!ok || s.s != connectivity.Ready) {
+ // If the returned sc is not ready and RPC is failfast,
+ // return error, and this RPC will fail.
+ return nil, nil, status.Errorf(codes.Unavailable, "there is no connection available")
+ }
+ }
+
+ return sc, done, nil
+}
+
+// connectivityStateEvaluator gets updated by addrConns when their
+// states transition, based on which it evaluates the state of
+// ClientConn.
+type connectivityStateEvaluator struct {
+ mu sync.Mutex
+ numReady uint64 // Number of addrConns in ready state.
+ numConnecting uint64 // Number of addrConns in connecting state.
+ numTransientFailure uint64 // Number of addrConns in transientFailure.
+}
+
+// recordTransition records state change happening in every subConn and based on
+// that it evaluates what aggregated state should be.
+// It can only transition between Ready, Connecting and TransientFailure. Other states,
+// Idle and Shutdown are transitioned into by ClientConn; in the beginning of the connection
+// before any subConn is created ClientConn is in idle state. In the end when ClientConn
+// closes it is in Shutdown state.
+// TODO Note that in later releases, a ClientConn with no activity will be put into an Idle state.
+func (cse *connectivityStateEvaluator) recordTransition(oldState, newState connectivity.State) connectivity.State {
+ cse.mu.Lock()
+ defer cse.mu.Unlock()
+
+ // Update counters.
+ for idx, state := range []connectivity.State{oldState, newState} {
+ updateVal := 2*uint64(idx) - 1 // -1 for oldState and +1 for new.
+ switch state {
+ case connectivity.Ready:
+ cse.numReady += updateVal
+ case connectivity.Connecting:
+ cse.numConnecting += updateVal
+ case connectivity.TransientFailure:
+ cse.numTransientFailure += updateVal
+ }
+ }
+
+ // Evaluate.
+ if cse.numReady > 0 {
+ return connectivity.Ready
+ }
+ if cse.numConnecting > 0 {
+ return connectivity.Connecting
+ }
+ return connectivity.TransientFailure
+}
diff --git a/vendor/google.golang.org/grpc/call.go b/vendor/google.golang.org/grpc/call.go
index 438758f..13cf8b1 100644
--- a/vendor/google.golang.org/grpc/call.go
+++ b/vendor/google.golang.org/grpc/call.go
@@ -19,13 +19,14 @@
package grpc
import (
- "bytes"
"io"
"time"
"golang.org/x/net/context"
"golang.org/x/net/trace"
+ "google.golang.org/grpc/balancer"
"google.golang.org/grpc/codes"
+ "google.golang.org/grpc/encoding"
"google.golang.org/grpc/peer"
"google.golang.org/grpc/stats"
"google.golang.org/grpc/status"
@@ -59,9 +60,19 @@ func recvResponse(ctx context.Context, dopts dialOptions, t transport.ClientTran
}
for {
if c.maxReceiveMessageSize == nil {
- return Errorf(codes.Internal, "callInfo maxReceiveMessageSize field uninitialized(nil)")
+ return status.Errorf(codes.Internal, "callInfo maxReceiveMessageSize field uninitialized(nil)")
}
- if err = recv(p, dopts.codec, stream, dopts.dc, reply, *c.maxReceiveMessageSize, inPayload); err != nil {
+
+ // Set dc if it exists and matches the message compression type used,
+ // otherwise set comp if a registered compressor exists for it.
+ var comp encoding.Compressor
+ var dc Decompressor
+ if rc := stream.RecvCompress(); dopts.dc != nil && dopts.dc.Type() == rc {
+ dc = dopts.dc
+ } else if rc != "" && rc != encoding.Identity {
+ comp = encoding.GetCompressor(rc)
+ }
+ if err = recv(p, dopts.codec, stream, dc, reply, *c.maxReceiveMessageSize, inPayload, comp); err != nil {
if err == io.EOF {
break
}
@@ -88,26 +99,33 @@ func sendRequest(ctx context.Context, dopts dialOptions, compressor Compressor,
}
}()
var (
- cbuf *bytes.Buffer
outPayload *stats.OutPayload
)
- if compressor != nil {
- cbuf = new(bytes.Buffer)
- }
if dopts.copts.StatsHandler != nil {
outPayload = &stats.OutPayload{
Client: true,
}
}
- hdr, data, err := encode(dopts.codec, args, compressor, cbuf, outPayload)
+ // Set comp and clear compressor if a registered compressor matches the type
+ // specified via UseCompressor. (And error if a matching compressor is not
+ // registered.)
+ var comp encoding.Compressor
+ if ct := c.compressorType; ct != "" && ct != encoding.Identity {
+ compressor = nil // Disable the legacy compressor.
+ comp = encoding.GetCompressor(ct)
+ if comp == nil {
+ return status.Errorf(codes.Internal, "grpc: Compressor is not installed for grpc-encoding %q", ct)
+ }
+ }
+ hdr, data, err := encode(dopts.codec, args, compressor, outPayload, comp)
if err != nil {
return err
}
if c.maxSendMessageSize == nil {
- return Errorf(codes.Internal, "callInfo maxSendMessageSize field uninitialized(nil)")
+ return status.Errorf(codes.Internal, "callInfo maxSendMessageSize field uninitialized(nil)")
}
if len(data) > *c.maxSendMessageSize {
- return Errorf(codes.ResourceExhausted, "grpc: trying to send message larger than max (%d vs. %d)", len(data), *c.maxSendMessageSize)
+ return status.Errorf(codes.ResourceExhausted, "grpc: trying to send message larger than max (%d vs. %d)", len(data), *c.maxSendMessageSize)
}
err = t.Write(stream, hdr, data, opts)
if err == nil && outPayload != nil {
@@ -124,18 +142,25 @@ func sendRequest(ctx context.Context, dopts dialOptions, compressor Compressor,
return nil
}
-// Invoke sends the RPC request on the wire and returns after response is received.
-// Invoke is called by generated code. Also users can call Invoke directly when it
-// is really needed in their use cases.
-func Invoke(ctx context.Context, method string, args, reply interface{}, cc *ClientConn, opts ...CallOption) error {
+// Invoke sends the RPC request on the wire and returns after response is
+// received. This is typically called by generated code.
+func (cc *ClientConn) Invoke(ctx context.Context, method string, args, reply interface{}, opts ...CallOption) error {
if cc.dopts.unaryInt != nil {
return cc.dopts.unaryInt(ctx, method, args, reply, cc, invoke, opts...)
}
return invoke(ctx, method, args, reply, cc, opts...)
}
+// Invoke sends the RPC request on the wire and returns after response is
+// received. This is typically called by generated code.
+//
+// DEPRECATED: Use ClientConn.Invoke instead.
+func Invoke(ctx context.Context, method string, args, reply interface{}, cc *ClientConn, opts ...CallOption) error {
+ return cc.Invoke(ctx, method, args, reply, opts...)
+}
+
func invoke(ctx context.Context, method string, args, reply interface{}, cc *ClientConn, opts ...CallOption) (e error) {
- c := defaultCallInfo
+ c := defaultCallInfo()
mc := cc.GetMethodConfig(method)
if mc.WaitForReady != nil {
c.failFast = !*mc.WaitForReady
@@ -149,13 +174,13 @@ func invoke(ctx context.Context, method string, args, reply interface{}, cc *Cli
opts = append(cc.dopts.callOptions, opts...)
for _, o := range opts {
- if err := o.before(&c); err != nil {
+ if err := o.before(c); err != nil {
return toRPCErr(err)
}
}
defer func() {
for _, o := range opts {
- o.after(&c)
+ o.after(c)
}
}()
@@ -178,7 +203,7 @@ func invoke(ctx context.Context, method string, args, reply interface{}, cc *Cli
}
}()
}
- ctx = newContextWithRPCInfo(ctx)
+ ctx = newContextWithRPCInfo(ctx, c.failFast)
sh := cc.dopts.copts.StatsHandler
if sh != nil {
ctx = sh.TagRPC(ctx, &stats.RPCTagInfo{FullMethodName: method, FailFast: c.failFast})
@@ -201,60 +226,45 @@ func invoke(ctx context.Context, method string, args, reply interface{}, cc *Cli
Last: true,
Delay: false,
}
+ callHdr := &transport.CallHdr{
+ Host: cc.authority,
+ Method: method,
+ }
+ if c.creds != nil {
+ callHdr.Creds = c.creds
+ }
+ if c.compressorType != "" {
+ callHdr.SendCompress = c.compressorType
+ } else if cc.dopts.cp != nil {
+ callHdr.SendCompress = cc.dopts.cp.Type()
+ }
+ firstAttempt := true
+
for {
- var (
- err error
- t transport.ClientTransport
- stream *transport.Stream
- // Record the put handler from Balancer.Get(...). It is called once the
- // RPC has completed or failed.
- put func()
- )
- // TODO(zhaoq): Need a formal spec of fail-fast.
- callHdr := &transport.CallHdr{
- Host: cc.authority,
- Method: method,
- }
- if cc.dopts.cp != nil {
- callHdr.SendCompress = cc.dopts.cp.Type()
- }
- if c.creds != nil {
- callHdr.Creds = c.creds
+ // Check to make sure the context has expired. This will prevent us from
+ // looping forever if an error occurs for wait-for-ready RPCs where no data
+ // is sent on the wire.
+ select {
+ case <-ctx.Done():
+ return toRPCErr(ctx.Err())
+ default:
}
- gopts := BalancerGetOptions{
- BlockingWait: !c.failFast,
- }
- t, put, err = cc.getTransport(ctx, gopts)
+ // Record the done handler from Balancer.Get(...). It is called once the
+ // RPC has completed or failed.
+ t, done, err := cc.getTransport(ctx, c.failFast)
if err != nil {
- // TODO(zhaoq): Probably revisit the error handling.
- if _, ok := status.FromError(err); ok {
- return err
- }
- if err == errConnClosing || err == errConnUnavailable {
- if c.failFast {
- return Errorf(codes.Unavailable, "%v", err)
- }
- continue
- }
- // All the other errors are treated as Internal errors.
- return Errorf(codes.Internal, "%v", err)
+ return err
}
- if c.traceInfo.tr != nil {
- c.traceInfo.tr.LazyLog(&payload{sent: true, msg: args}, true)
- }
- stream, err = t.NewStream(ctx, callHdr)
+ stream, err := t.NewStream(ctx, callHdr)
if err != nil {
- if put != nil {
- if _, ok := err.(transport.ConnectionError); ok {
- // If error is connection error, transport was sending data on wire,
- // and we are not sure if anything has been sent on wire.
- // If error is not connection error, we are sure nothing has been sent.
- updateRPCInfoInContext(ctx, rpcInfo{bytesSent: true, bytesReceived: false})
- }
- put()
+ if done != nil {
+ done(balancer.DoneInfo{Err: err})
}
- if _, ok := err.(transport.ConnectionError); (ok || err == transport.ErrStreamDrain) && !c.failFast {
+ // In the event of any error from NewStream, we never attempted to write
+ // anything to the wire, so we can retry indefinitely for non-fail-fast
+ // RPCs.
+ if !c.failFast {
continue
}
return toRPCErr(err)
@@ -262,34 +272,51 @@ func invoke(ctx context.Context, method string, args, reply interface{}, cc *Cli
if peer, ok := peer.FromContext(stream.Context()); ok {
c.peer = peer
}
- err = sendRequest(ctx, cc.dopts, cc.dopts.cp, &c, callHdr, stream, t, args, topts)
+ if c.traceInfo.tr != nil {
+ c.traceInfo.tr.LazyLog(&payload{sent: true, msg: args}, true)
+ }
+ err = sendRequest(ctx, cc.dopts, cc.dopts.cp, c, callHdr, stream, t, args, topts)
if err != nil {
- if put != nil {
- updateRPCInfoInContext(ctx, rpcInfo{
- bytesSent: stream.BytesSent(),
- bytesReceived: stream.BytesReceived(),
+ if done != nil {
+ done(balancer.DoneInfo{
+ Err: err,
+ BytesSent: true,
+ BytesReceived: stream.BytesReceived(),
})
- put()
}
// Retry a non-failfast RPC when
- // i) there is a connection error; or
- // ii) the server started to drain before this RPC was initiated.
- if _, ok := err.(transport.ConnectionError); (ok || err == transport.ErrStreamDrain) && !c.failFast {
- continue
+ // i) the server started to drain before this RPC was initiated.
+ // ii) the server refused the stream.
+ if !c.failFast && stream.Unprocessed() {
+ // In this case, the server did not receive the data, but we still
+ // created wire traffic, so we should not retry indefinitely.
+ if firstAttempt {
+ // TODO: Add a field to header for grpc-transparent-retry-attempts
+ firstAttempt = false
+ continue
+ }
+ // Otherwise, give up and return an error anyway.
}
return toRPCErr(err)
}
- err = recvResponse(ctx, cc.dopts, t, &c, stream, reply)
+ err = recvResponse(ctx, cc.dopts, t, c, stream, reply)
if err != nil {
- if put != nil {
- updateRPCInfoInContext(ctx, rpcInfo{
- bytesSent: stream.BytesSent(),
- bytesReceived: stream.BytesReceived(),
+ if done != nil {
+ done(balancer.DoneInfo{
+ Err: err,
+ BytesSent: true,
+ BytesReceived: stream.BytesReceived(),
})
- put()
}
- if _, ok := err.(transport.ConnectionError); (ok || err == transport.ErrStreamDrain) && !c.failFast {
- continue
+ if !c.failFast && stream.Unprocessed() {
+ // In these cases, the server did not receive the data, but we still
+ // created wire traffic, so we should not retry indefinitely.
+ if firstAttempt {
+ // TODO: Add a field to header for grpc-transparent-retry-attempts
+ firstAttempt = false
+ continue
+ }
+ // Otherwise, give up and return an error anyway.
}
return toRPCErr(err)
}
@@ -297,13 +324,23 @@ func invoke(ctx context.Context, method string, args, reply interface{}, cc *Cli
c.traceInfo.tr.LazyLog(&payload{sent: false, msg: reply}, true)
}
t.CloseStream(stream, nil)
- if put != nil {
- updateRPCInfoInContext(ctx, rpcInfo{
- bytesSent: stream.BytesSent(),
- bytesReceived: stream.BytesReceived(),
+ err = stream.Status().Err()
+ if done != nil {
+ done(balancer.DoneInfo{
+ Err: err,
+ BytesSent: true,
+ BytesReceived: stream.BytesReceived(),
})
- put()
}
- return stream.Status().Err()
+ if !c.failFast && stream.Unprocessed() {
+ // In these cases, the server did not receive the data, but we still
+ // created wire traffic, so we should not retry indefinitely.
+ if firstAttempt {
+ // TODO: Add a field to header for grpc-transparent-retry-attempts
+ firstAttempt = false
+ continue
+ }
+ }
+ return err
}
}
diff --git a/vendor/google.golang.org/grpc/call_test.go b/vendor/google.golang.org/grpc/call_test.go
index f311309..b95ade8 100644
--- a/vendor/google.golang.org/grpc/call_test.go
+++ b/vendor/google.golang.org/grpc/call_test.go
@@ -32,6 +32,7 @@ import (
"golang.org/x/net/context"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
+ "google.golang.org/grpc/test/leakcheck"
"google.golang.org/grpc/transport"
)
@@ -116,6 +117,7 @@ func (h *testStreamHandler) handleStream(t *testing.T, s *transport.Stream) {
type server struct {
lis net.Listener
port string
+ addr string
startedErr chan error // sent nil or an error after server starts
mu sync.Mutex
conns map[transport.ServerTransport]bool
@@ -137,7 +139,8 @@ func (s *server) start(t *testing.T, port int, maxStreams uint32) {
s.startedErr <- fmt.Errorf("failed to listen: %v", err)
return
}
- _, p, err := net.SplitHostPort(s.lis.Addr().String())
+ s.addr = s.lis.Addr().String()
+ _, p, err := net.SplitHostPort(s.addr)
if err != nil {
s.startedErr <- fmt.Errorf("failed to parse listener address: %v", err)
return
@@ -211,6 +214,7 @@ func setUp(t *testing.T, port int, maxStreams uint32) (*server, *ClientConn) {
}
func TestInvoke(t *testing.T) {
+ defer leakcheck.Check(t)
server, cc := setUp(t, 0, math.MaxUint32)
var reply string
if err := Invoke(context.Background(), "/foo/bar", &expectedRequest, &reply, cc); err != nil || reply != expectedResponse {
@@ -221,6 +225,7 @@ func TestInvoke(t *testing.T) {
}
func TestInvokeLargeErr(t *testing.T) {
+ defer leakcheck.Check(t)
server, cc := setUp(t, 0, math.MaxUint32)
var reply string
req := "hello"
@@ -228,7 +233,7 @@ func TestInvokeLargeErr(t *testing.T) {
if _, ok := status.FromError(err); !ok {
t.Fatalf("grpc.Invoke(_, _, _, _, _) receives non rpc error.")
}
- if Code(err) != codes.Internal || len(ErrorDesc(err)) != sizeLargeErr {
+ if status.Code(err) != codes.Internal || len(errorDesc(err)) != sizeLargeErr {
t.Fatalf("grpc.Invoke(_, _, _, _, _) = %v, want an error of code %d and desc size %d", err, codes.Internal, sizeLargeErr)
}
cc.Close()
@@ -237,6 +242,7 @@ func TestInvokeLargeErr(t *testing.T) {
// TestInvokeErrorSpecialChars checks that error messages don't get mangled.
func TestInvokeErrorSpecialChars(t *testing.T) {
+ defer leakcheck.Check(t)
server, cc := setUp(t, 0, math.MaxUint32)
var reply string
req := "weird error"
@@ -244,7 +250,7 @@ func TestInvokeErrorSpecialChars(t *testing.T) {
if _, ok := status.FromError(err); !ok {
t.Fatalf("grpc.Invoke(_, _, _, _, _) receives non rpc error.")
}
- if got, want := ErrorDesc(err), weirdError; got != want {
+ if got, want := errorDesc(err), weirdError; got != want {
t.Fatalf("grpc.Invoke(_, _, _, _, _) error = %q, want %q", got, want)
}
cc.Close()
@@ -253,6 +259,7 @@ func TestInvokeErrorSpecialChars(t *testing.T) {
// TestInvokeCancel checks that an Invoke with a canceled context is not sent.
func TestInvokeCancel(t *testing.T) {
+ defer leakcheck.Check(t)
server, cc := setUp(t, 0, math.MaxUint32)
var reply string
req := "canceled"
@@ -271,6 +278,7 @@ func TestInvokeCancel(t *testing.T) {
// TestInvokeCancelClosedNonFail checks that a canceled non-failfast RPC
// on a closed client will terminate.
func TestInvokeCancelClosedNonFailFast(t *testing.T) {
+ defer leakcheck.Check(t)
server, cc := setUp(t, 0, math.MaxUint32)
var reply string
cc.Close()
diff --git a/vendor/google.golang.org/grpc/clientconn.go b/vendor/google.golang.org/grpc/clientconn.go
index 98ec57a..1d079eb 100644
--- a/vendor/google.golang.org/grpc/clientconn.go
+++ b/vendor/google.golang.org/grpc/clientconn.go
@@ -20,18 +20,25 @@ package grpc
import (
"errors"
+ "fmt"
"math"
"net"
+ "reflect"
"strings"
"sync"
"time"
"golang.org/x/net/context"
"golang.org/x/net/trace"
+ "google.golang.org/grpc/balancer"
+ _ "google.golang.org/grpc/balancer/roundrobin" // To register roundrobin.
"google.golang.org/grpc/connectivity"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/grpclog"
"google.golang.org/grpc/keepalive"
+ "google.golang.org/grpc/resolver"
+ _ "google.golang.org/grpc/resolver/dns" // To register dns resolver.
+ _ "google.golang.org/grpc/resolver/passthrough" // To register passthrough resolver.
"google.golang.org/grpc/stats"
"google.golang.org/grpc/transport"
)
@@ -44,7 +51,20 @@ var (
// underlying connections within the specified timeout.
// DEPRECATED: Please use context.DeadlineExceeded instead.
ErrClientConnTimeout = errors.New("grpc: timed out when dialing")
+ // errConnDrain indicates that the connection starts to be drained and does not accept any new RPCs.
+ errConnDrain = errors.New("grpc: the connection is drained")
+ // errConnClosing indicates that the connection is closing.
+ errConnClosing = errors.New("grpc: the connection is closing")
+ // errConnUnavailable indicates that the connection is unavailable.
+ errConnUnavailable = errors.New("grpc: the connection is unavailable")
+ // errBalancerClosed indicates that the balancer is closed.
+ errBalancerClosed = errors.New("grpc: balancer is closed")
+ // minimum time to give a connection to complete
+ minConnectTimeout = 20 * time.Second
+)
+// The following errors are returned from Dial and DialContext
+var (
// errNoTransportSecurity indicates that there is no transport security
// being set for ClientConn. Users should either set one or explicitly
// call WithInsecure DialOption to disable security.
@@ -58,16 +78,6 @@ var (
errCredentialsConflict = errors.New("grpc: transport credentials are set for an insecure connection (grpc.WithTransportCredentials() and grpc.WithInsecure() are both called)")
// errNetworkIO indicates that the connection is down due to some network I/O error.
errNetworkIO = errors.New("grpc: failed with network I/O error")
- // errConnDrain indicates that the connection starts to be drained and does not accept any new RPCs.
- errConnDrain = errors.New("grpc: the connection is drained")
- // errConnClosing indicates that the connection is closing.
- errConnClosing = errors.New("grpc: the connection is closing")
- // errConnUnavailable indicates that the connection is unavailable.
- errConnUnavailable = errors.New("grpc: the connection is unavailable")
- // errBalancerClosed indicates that the balancer is closed.
- errBalancerClosed = errors.New("grpc: balancer is closed")
- // minimum time to give a connection to complete
- minConnectTimeout = 20 * time.Second
)
// dialOptions configure a Dial call. dialOptions are set by the DialOption
@@ -79,13 +89,20 @@ type dialOptions struct {
cp Compressor
dc Decompressor
bs backoffStrategy
- balancer Balancer
block bool
insecure bool
timeout time.Duration
scChan <-chan ServiceConfig
copts transport.ConnectOptions
callOptions []CallOption
+ // This is used by v1 balancer dial option WithBalancer to support v1
+ // balancer, and also by WithBalancerName dial option.
+ balancerBuilder balancer.Builder
+ // This is to support grpclb.
+ resolverBuilder resolver.Builder
+ // Custom user options for resolver.Build.
+ resolverBuildUserOptions interface{}
+ waitForHandshake bool
}
const (
@@ -96,6 +113,31 @@ const (
// DialOption configures how we set up the connection.
type DialOption func(*dialOptions)
+// WithWaitForHandshake blocks until the initial settings frame is received from the
+// server before assigning RPCs to the connection.
+// Experimental API.
+func WithWaitForHandshake() DialOption {
+ return func(o *dialOptions) {
+ o.waitForHandshake = true
+ }
+}
+
+// WithWriteBufferSize lets you set the size of write buffer, this determines how much data can be batched
+// before doing a write on the wire.
+func WithWriteBufferSize(s int) DialOption {
+ return func(o *dialOptions) {
+ o.copts.WriteBufferSize = s
+ }
+}
+
+// WithReadBufferSize lets you set the size of read buffer, this determines how much data can be read at most
+// for each read syscall.
+func WithReadBufferSize(s int) DialOption {
+ return func(o *dialOptions) {
+ o.copts.ReadBufferSize = s
+ }
+}
+
// WithInitialWindowSize returns a DialOption which sets the value for initial window size on a stream.
// The lower bound for window size is 64K and any value smaller than that will be ignored.
func WithInitialWindowSize(s int32) DialOption {
@@ -131,30 +173,80 @@ func WithCodec(c Codec) DialOption {
}
}
-// WithCompressor returns a DialOption which sets a CompressorGenerator for generating message
-// compressor.
+// WithCompressor returns a DialOption which sets a Compressor to use for
+// message compression. It has lower priority than the compressor set by
+// the UseCompressor CallOption.
+//
+// Deprecated: use UseCompressor instead.
func WithCompressor(cp Compressor) DialOption {
return func(o *dialOptions) {
o.cp = cp
}
}
-// WithDecompressor returns a DialOption which sets a DecompressorGenerator for generating
-// message decompressor.
+// WithDecompressor returns a DialOption which sets a Decompressor to use for
+// incoming message decompression. If incoming response messages are encoded
+// using the decompressor's Type(), it will be used. Otherwise, the message
+// encoding will be used to look up the compressor registered via
+// encoding.RegisterCompressor, which will then be used to decompress the
+// message. If no compressor is registered for the encoding, an Unimplemented
+// status error will be returned.
+//
+// Deprecated: use encoding.RegisterCompressor instead.
func WithDecompressor(dc Decompressor) DialOption {
return func(o *dialOptions) {
o.dc = dc
}
}
-// WithBalancer returns a DialOption which sets a load balancer.
+// WithBalancer returns a DialOption which sets a load balancer with the v1 API.
+// Name resolver will be ignored if this DialOption is specified.
+//
+// Deprecated: use the new balancer APIs in balancer package and WithBalancerName.
func WithBalancer(b Balancer) DialOption {
return func(o *dialOptions) {
- o.balancer = b
+ o.balancerBuilder = &balancerWrapperBuilder{
+ b: b,
+ }
+ }
+}
+
+// WithBalancerName sets the balancer that the ClientConn will be initialized
+// with. Balancer registered with balancerName will be used. This function
+// panics if no balancer was registered by balancerName.
+//
+// The balancer cannot be overridden by balancer option specified by service
+// config.
+//
+// This is an EXPERIMENTAL API.
+func WithBalancerName(balancerName string) DialOption {
+ builder := balancer.Get(balancerName)
+ if builder == nil {
+ panic(fmt.Sprintf("grpc.WithBalancerName: no balancer is registered for name %v", balancerName))
+ }
+ return func(o *dialOptions) {
+ o.balancerBuilder = builder
+ }
+}
+
+// withResolverBuilder is only for grpclb.
+func withResolverBuilder(b resolver.Builder) DialOption {
+ return func(o *dialOptions) {
+ o.resolverBuilder = b
+ }
+}
+
+// WithResolverUserOptions returns a DialOption which sets the UserOptions
+// field of resolver's BuildOption.
+func WithResolverUserOptions(userOpt interface{}) DialOption {
+ return func(o *dialOptions) {
+ o.resolverBuildUserOptions = userOpt
}
}
// WithServiceConfig returns a DialOption which has a channel to read the service configuration.
+// DEPRECATED: service config should be received through name resolver, as specified here.
+// https://github.com/grpc/grpc/blob/master/doc/service_config.md
func WithServiceConfig(c <-chan ServiceConfig) DialOption {
return func(o *dialOptions) {
o.scChan = c
@@ -179,7 +271,7 @@ func WithBackoffConfig(b BackoffConfig) DialOption {
return withBackoff(b)
}
-// withBackoff sets the backoff strategy used for retries after a
+// withBackoff sets the backoff strategy used for connectRetryNum after a
// failed connection attempt.
//
// This can be exported if arbitrary backoff strategies are allowed by gRPC.
@@ -231,18 +323,23 @@ func WithTimeout(d time.Duration) DialOption {
}
}
+func withContextDialer(f func(context.Context, string) (net.Conn, error)) DialOption {
+ return func(o *dialOptions) {
+ o.copts.Dialer = f
+ }
+}
+
// WithDialer returns a DialOption that specifies a function to use for dialing network addresses.
// If FailOnNonTempDialError() is set to true, and an error is returned by f, gRPC checks the error's
// Temporary() method to decide if it should try to reconnect to the network address.
func WithDialer(f func(string, time.Duration) (net.Conn, error)) DialOption {
- return func(o *dialOptions) {
- o.copts.Dialer = func(ctx context.Context, addr string) (net.Conn, error) {
+ return withContextDialer(
+ func(ctx context.Context, addr string) (net.Conn, error) {
if deadline, ok := ctx.Deadline(); ok {
return f(addr, deadline.Sub(time.Now()))
}
return f(addr, 0)
- }
- }
+ })
}
// WithStatsHandler returns a DialOption that specifies the stats handler
@@ -271,7 +368,7 @@ func WithUserAgent(s string) DialOption {
}
}
-// WithKeepaliveParams returns a DialOption that specifies keepalive paramaters for the client transport.
+// WithKeepaliveParams returns a DialOption that specifies keepalive parameters for the client transport.
func WithKeepaliveParams(kp keepalive.ClientParameters) DialOption {
return func(o *dialOptions) {
o.copts.KeepaliveParams = kp
@@ -314,14 +411,31 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
cc := &ClientConn{
target: target,
csMgr: &connectivityStateManager{},
- conns: make(map[Address]*addrConn),
+ conns: make(map[*addrConn]struct{}),
+
+ blockingpicker: newPickerWrapper(),
}
- cc.csEvltr = &connectivityStateEvaluator{csMgr: cc.csMgr}
cc.ctx, cc.cancel = context.WithCancel(context.Background())
for _, opt := range opts {
opt(&cc.dopts)
}
+
+ if !cc.dopts.insecure {
+ if cc.dopts.copts.TransportCredentials == nil {
+ return nil, errNoTransportSecurity
+ }
+ } else {
+ if cc.dopts.copts.TransportCredentials != nil {
+ return nil, errCredentialsConflict
+ }
+ for _, cd := range cc.dopts.copts.PerRPCCredentials {
+ if cd.RequireTransportSecurity() {
+ return nil, errTransportCredentialsMissing
+ }
+ }
+ }
+
cc.mkp = cc.dopts.copts.KeepaliveParams
if cc.dopts.copts.Dialer == nil {
@@ -375,59 +489,18 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
if cc.dopts.bs == nil {
cc.dopts.bs = DefaultBackoffConfig
}
+ cc.parsedTarget = parseTarget(cc.target)
creds := cc.dopts.copts.TransportCredentials
if creds != nil && creds.Info().ServerName != "" {
cc.authority = creds.Info().ServerName
} else if cc.dopts.insecure && cc.dopts.copts.Authority != "" {
cc.authority = cc.dopts.copts.Authority
} else {
- cc.authority = target
- }
- waitC := make(chan error, 1)
- go func() {
- defer close(waitC)
- if cc.dopts.balancer == nil && cc.sc.LB != nil {
- cc.dopts.balancer = cc.sc.LB
- }
- if cc.dopts.balancer != nil {
- var credsClone credentials.TransportCredentials
- if creds != nil {
- credsClone = creds.Clone()
- }
- config := BalancerConfig{
- DialCreds: credsClone,
- Dialer: cc.dopts.copts.Dialer,
- }
- if err := cc.dopts.balancer.Start(target, config); err != nil {
- waitC <- err
- return
- }
- ch := cc.dopts.balancer.Notify()
- if ch != nil {
- if cc.dopts.block {
- doneChan := make(chan struct{})
- go cc.lbWatcher(doneChan)
- <-doneChan
- } else {
- go cc.lbWatcher(nil)
- }
- return
- }
- }
- // No balancer, or no resolver within the balancer. Connect directly.
- if err := cc.resetAddrConn([]Address{{Addr: target}}, cc.dopts.block, nil); err != nil {
- waitC <- err
- return
- }
- }()
- select {
- case <-ctx.Done():
- return nil, ctx.Err()
- case err := <-waitC:
- if err != nil {
- return nil, err
- }
+ // Use endpoint from "scheme://authority/endpoint" as the default
+ // authority for ClientConn.
+ cc.authority = cc.parsedTarget.Endpoint
}
+
if cc.dopts.scChan != nil && !scSet {
// Blocking wait for the initial service config.
select {
@@ -443,55 +516,44 @@ func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *
go cc.scWatcher()
}
- return cc, nil
-}
+ var credsClone credentials.TransportCredentials
+ if creds := cc.dopts.copts.TransportCredentials; creds != nil {
+ credsClone = creds.Clone()
+ }
+ cc.balancerBuildOpts = balancer.BuildOptions{
+ DialCreds: credsClone,
+ Dialer: cc.dopts.copts.Dialer,
+ }
-// connectivityStateEvaluator gets updated by addrConns when their
-// states transition, based on which it evaluates the state of
-// ClientConn.
-// Note: This code will eventually sit in the balancer in the new design.
-type connectivityStateEvaluator struct {
- csMgr *connectivityStateManager
- mu sync.Mutex
- numReady uint64 // Number of addrConns in ready state.
- numConnecting uint64 // Number of addrConns in connecting state.
- numTransientFailure uint64 // Number of addrConns in transientFailure.
-}
+ // Build the resolver.
+ cc.resolverWrapper, err = newCCResolverWrapper(cc)
+ if err != nil {
+ return nil, fmt.Errorf("failed to build resolver: %v", err)
+ }
+ // Start the resolver wrapper goroutine after resolverWrapper is created.
+ //
+ // If the goroutine is started before resolverWrapper is ready, the
+ // following may happen: The goroutine sends updates to cc. cc forwards
+ // those to balancer. Balancer creates new addrConn. addrConn fails to
+ // connect, and calls resolveNow(). resolveNow() tries to use the non-ready
+ // resolverWrapper.
+ cc.resolverWrapper.start()
-// recordTransition records state change happening in every addrConn and based on
-// that it evaluates what state the ClientConn is in.
-// It can only transition between connectivity.Ready, connectivity.Connecting and connectivity.TransientFailure. Other states,
-// Idle and connectivity.Shutdown are transitioned into by ClientConn; in the begining of the connection
-// before any addrConn is created ClientConn is in idle state. In the end when ClientConn
-// closes it is in connectivity.Shutdown state.
-// TODO Note that in later releases, a ClientConn with no activity will be put into an Idle state.
-func (cse *connectivityStateEvaluator) recordTransition(oldState, newState connectivity.State) {
- cse.mu.Lock()
- defer cse.mu.Unlock()
-
- // Update counters.
- for idx, state := range []connectivity.State{oldState, newState} {
- updateVal := 2*uint64(idx) - 1 // -1 for oldState and +1 for new.
- switch state {
- case connectivity.Ready:
- cse.numReady += updateVal
- case connectivity.Connecting:
- cse.numConnecting += updateVal
- case connectivity.TransientFailure:
- cse.numTransientFailure += updateVal
+ // A blocking dial blocks until the clientConn is ready.
+ if cc.dopts.block {
+ for {
+ s := cc.GetState()
+ if s == connectivity.Ready {
+ break
+ }
+ if !cc.WaitForStateChange(ctx, s) {
+ // ctx got timeout or canceled.
+ return nil, ctx.Err()
+ }
}
}
- // Evaluate.
- if cse.numReady > 0 {
- cse.csMgr.updateState(connectivity.Ready)
- return
- }
- if cse.numConnecting > 0 {
- cse.csMgr.updateState(connectivity.Connecting)
- return
- }
- cse.csMgr.updateState(connectivity.TransientFailure)
+ return cc, nil
}
// connectivityStateManager keeps the connectivity.State of ClientConn.
@@ -542,17 +604,26 @@ type ClientConn struct {
ctx context.Context
cancel context.CancelFunc
- target string
- authority string
- dopts dialOptions
- csMgr *connectivityStateManager
- csEvltr *connectivityStateEvaluator // This will eventually be part of balancer.
+ target string
+ parsedTarget resolver.Target
+ authority string
+ dopts dialOptions
+ csMgr *connectivityStateManager
+
+ balancerBuildOpts balancer.BuildOptions
+ resolverWrapper *ccResolverWrapper
+ blockingpicker *pickerWrapper
mu sync.RWMutex
sc ServiceConfig
- conns map[Address]*addrConn
+ scRaw string
+ conns map[*addrConn]struct{}
// Keepalive parameter can be updated if a GoAway is received.
- mkp keepalive.ClientParameters
+ mkp keepalive.ClientParameters
+ curBalancerName string
+ preBalancerName string // previous balancer name.
+ curAddresses []resolver.Address
+ balancerWrapper *ccBalancerWrapper
}
// WaitForStateChange waits until the connectivity.State of ClientConn changes from sourceState or
@@ -577,84 +648,6 @@ func (cc *ClientConn) GetState() connectivity.State {
return cc.csMgr.getState()
}
-// lbWatcher watches the Notify channel of the balancer in cc and manages
-// connections accordingly. If doneChan is not nil, it is closed after the
-// first successfull connection is made.
-func (cc *ClientConn) lbWatcher(doneChan chan struct{}) {
- defer func() {
- // In case channel from cc.dopts.balancer.Notify() gets closed before a
- // successful connection gets established, don't forget to notify the
- // caller.
- if doneChan != nil {
- close(doneChan)
- }
- }()
-
- _, isPickFirst := cc.dopts.balancer.(*pickFirst)
- for addrs := range cc.dopts.balancer.Notify() {
- if isPickFirst {
- if len(addrs) == 0 {
- // No address can be connected, should teardown current addrconn if exists
- cc.mu.Lock()
- if len(cc.conns) != 0 {
- cc.pickFirstAddrConnTearDown()
- }
- cc.mu.Unlock()
- } else {
- cc.resetAddrConn(addrs, true, nil)
- if doneChan != nil {
- close(doneChan)
- doneChan = nil
- }
- }
- } else {
- // Not pickFirst, create a new addrConn for each address.
- var (
- add []Address // Addresses need to setup connections.
- del []*addrConn // Connections need to tear down.
- )
- cc.mu.Lock()
- for _, a := range addrs {
- if _, ok := cc.conns[a]; !ok {
- add = append(add, a)
- }
- }
- for k, c := range cc.conns {
- var keep bool
- for _, a := range addrs {
- if k == a {
- keep = true
- break
- }
- }
- if !keep {
- del = append(del, c)
- delete(cc.conns, k)
- }
- }
- cc.mu.Unlock()
- for _, a := range add {
- var err error
- if doneChan != nil {
- err = cc.resetAddrConn([]Address{a}, true, nil)
- if err == nil {
- close(doneChan)
- doneChan = nil
- }
- } else {
- err = cc.resetAddrConn([]Address{a}, false, nil)
- }
- if err != nil {
- grpclog.Warningf("Error creating connection to %v. Err: %v", a, err)
- }
- }
- for _, c := range del {
- c.tearDown(errConnDrain)
- }
- }
- }
-}
-
func (cc *ClientConn) scWatcher() {
for {
select {
@@ -666,6 +659,7 @@ func (cc *ClientConn) scWatcher() {
// TODO: load balance policy runtime change is ignored.
// We may revist this decision in the future.
cc.sc = sc
+ cc.scRaw = ""
cc.mu.Unlock()
case <-cc.ctx.Done():
return
@@ -673,153 +667,209 @@ func (cc *ClientConn) scWatcher() {
}
}
-// pickFirstUpdateAddresses checks whether current address in the updating list, Update the list if true.
-// It is only used when the balancer is pick first.
-func (cc *ClientConn) pickFirstUpdateAddresses(addrs []Address) bool {
- if len(cc.conns) == 0 {
- // No addrconn. Should go resetting addrconn.
- return false
- }
- var currentAc *addrConn
- for _, currentAc = range cc.conns {
- break
- }
- var addrInNewSlice bool
- for _, addr := range addrs {
- if strings.Compare(addr.Addr, currentAc.curAddr.Addr) == 0 {
- addrInNewSlice = true
- break
- }
- }
- if addrInNewSlice {
- cc.conns = make(map[Address]*addrConn)
- for _, addr := range addrs {
- cc.conns[addr] = currentAc
- }
- currentAc.addrs = addrs
- return true
- }
- return false
-}
-
-// pickFirstAddrConnTearDown() should be called after lock.
-func (cc *ClientConn) pickFirstAddrConnTearDown() {
- if len(cc.conns) == 0 {
+func (cc *ClientConn) handleResolvedAddrs(addrs []resolver.Address, err error) {
+ cc.mu.Lock()
+ defer cc.mu.Unlock()
+ if cc.conns == nil {
+ // cc was closed.
return
}
- var currentAc *addrConn
- for _, currentAc = range cc.conns {
- break
+
+ if reflect.DeepEqual(cc.curAddresses, addrs) {
+ return
}
- for k := range cc.conns {
- delete(cc.conns, k)
+
+ cc.curAddresses = addrs
+
+ if cc.dopts.balancerBuilder == nil {
+ // Only look at balancer types and switch balancer if balancer dial
+ // option is not set.
+ var isGRPCLB bool
+ for _, a := range addrs {
+ if a.Type == resolver.GRPCLB {
+ isGRPCLB = true
+ break
+ }
+ }
+ var newBalancerName string
+ if isGRPCLB {
+ newBalancerName = grpclbName
+ } else {
+ // Address list doesn't contain grpclb address. Try to pick a
+ // non-grpclb balancer.
+ newBalancerName = cc.curBalancerName
+ // If current balancer is grpclb, switch to the previous one.
+ if newBalancerName == grpclbName {
+ newBalancerName = cc.preBalancerName
+ }
+ // The following could be true in two cases:
+ // - the first time handling resolved addresses
+ // (curBalancerName="")
+ // - the first time handling non-grpclb addresses
+ // (curBalancerName="grpclb", preBalancerName="")
+ if newBalancerName == "" {
+ newBalancerName = PickFirstBalancerName
+ }
+ }
+ cc.switchBalancer(newBalancerName)
+ } else if cc.balancerWrapper == nil {
+ // Balancer dial option was set, and this is the first time handling
+ // resolved addresses. Build a balancer with dopts.balancerBuilder.
+ cc.balancerWrapper = newCCBalancerWrapper(cc, cc.dopts.balancerBuilder, cc.balancerBuildOpts)
}
- currentAc.tearDown(errConnDrain)
+
+ cc.balancerWrapper.handleResolvedAddrs(addrs, nil)
}
-// resetAddrConn creates an addrConn for addr and adds it to cc.conns.
-// If there is an old addrConn for addr, it will be torn down, using tearDownErr as the reason.
-// If tearDownErr is nil, errConnDrain will be used instead.
+// switchBalancer starts the switching from current balancer to the balancer
+// with the given name.
//
-// We should never need to replace an addrConn with a new one. This function is only used
-// as newAddrConn to create new addrConn.
-// TODO rename this function and clean up the code.
-func (cc *ClientConn) resetAddrConn(addrs []Address, block bool, tearDownErr error) error {
- // if current transport in addrs, just change lists to update order and new addresses
- // not work for roundrobin
- cc.mu.Lock()
- if _, isPickFirst := cc.dopts.balancer.(*pickFirst); isPickFirst {
- // If Current address in use in the updating list, just update the list.
- // Otherwise, teardown current addrconn and create a new one.
- if cc.pickFirstUpdateAddresses(addrs) {
- cc.mu.Unlock()
- return nil
- }
- cc.pickFirstAddrConnTearDown()
+// It will NOT send the current address list to the new balancer. If needed,
+// caller of this function should send address list to the new balancer after
+// this function returns.
+//
+// Caller must hold cc.mu.
+func (cc *ClientConn) switchBalancer(name string) {
+ if cc.conns == nil {
+ return
}
- cc.mu.Unlock()
+ if strings.ToLower(cc.curBalancerName) == strings.ToLower(name) {
+ return
+ }
+
+ grpclog.Infof("ClientConn switching balancer to %q", name)
+ if cc.dopts.balancerBuilder != nil {
+ grpclog.Infoln("ignoring balancer switching: Balancer DialOption used instead")
+ return
+ }
+ // TODO(bar switching) change this to two steps: drain and close.
+ // Keep track of sc in wrapper.
+ if cc.balancerWrapper != nil {
+ cc.balancerWrapper.close()
+ }
+
+ builder := balancer.Get(name)
+ if builder == nil {
+ grpclog.Infof("failed to get balancer builder for: %v, using pick_first instead", name)
+ builder = newPickfirstBuilder()
+ }
+ cc.preBalancerName = cc.curBalancerName
+ cc.curBalancerName = builder.Name()
+ cc.balancerWrapper = newCCBalancerWrapper(cc, builder, cc.balancerBuildOpts)
+}
+
+func (cc *ClientConn) handleSubConnStateChange(sc balancer.SubConn, s connectivity.State) {
+ cc.mu.Lock()
+ if cc.conns == nil {
+ cc.mu.Unlock()
+ return
+ }
+ // TODO(bar switching) send updates to all balancer wrappers when balancer
+ // gracefully switching is supported.
+ cc.balancerWrapper.handleSubConnStateChange(sc, s)
+ cc.mu.Unlock()
+}
+
+// newAddrConn creates an addrConn for addrs and adds it to cc.conns.
+//
+// Caller needs to make sure len(addrs) > 0.
+func (cc *ClientConn) newAddrConn(addrs []resolver.Address) (*addrConn, error) {
ac := &addrConn{
cc: cc,
addrs: addrs,
dopts: cc.dopts,
}
ac.ctx, ac.cancel = context.WithCancel(cc.ctx)
- ac.csEvltr = cc.csEvltr
- if EnableTracing {
- ac.events = trace.NewEventLog("grpc.ClientConn", ac.addrs[0].Addr)
- }
- if !ac.dopts.insecure {
- if ac.dopts.copts.TransportCredentials == nil {
- return errNoTransportSecurity
- }
- } else {
- if ac.dopts.copts.TransportCredentials != nil {
- return errCredentialsConflict
- }
- for _, cd := range ac.dopts.copts.PerRPCCredentials {
- if cd.RequireTransportSecurity() {
- return errTransportCredentialsMissing
- }
- }
- }
// Track ac in cc. This needs to be done before any getTransport(...) is called.
cc.mu.Lock()
if cc.conns == nil {
cc.mu.Unlock()
- return ErrClientConnClosing
- }
- stale := cc.conns[ac.addrs[0]]
- for _, a := range ac.addrs {
- cc.conns[a] = ac
+ return nil, ErrClientConnClosing
}
+ cc.conns[ac] = struct{}{}
cc.mu.Unlock()
- if stale != nil {
- // There is an addrConn alive on ac.addr already. This could be due to
- // a buggy Balancer that reports duplicated Addresses.
- if tearDownErr == nil {
- // tearDownErr is nil if resetAddrConn is called by
- // 1) Dial
- // 2) lbWatcher
- // In both cases, the stale ac should drain, not close.
- stale.tearDown(errConnDrain)
- } else {
- stale.tearDown(tearDownErr)
- }
+ return ac, nil
+}
+
+// removeAddrConn removes the addrConn in the subConn from clientConn.
+// It also tears down the ac with the given error.
+func (cc *ClientConn) removeAddrConn(ac *addrConn, err error) {
+ cc.mu.Lock()
+ if cc.conns == nil {
+ cc.mu.Unlock()
+ return
}
- if block {
- if err := ac.resetTransport(false); err != nil {
+ delete(cc.conns, ac)
+ cc.mu.Unlock()
+ ac.tearDown(err)
+}
+
+// connect starts to creating transport and also starts the transport monitor
+// goroutine for this ac.
+// It does nothing if the ac is not IDLE.
+// TODO(bar) Move this to the addrConn section.
+// This was part of resetAddrConn, keep it here to make the diff look clean.
+func (ac *addrConn) connect() error {
+ ac.mu.Lock()
+ if ac.state == connectivity.Shutdown {
+ ac.mu.Unlock()
+ return errConnClosing
+ }
+ if ac.state != connectivity.Idle {
+ ac.mu.Unlock()
+ return nil
+ }
+ ac.state = connectivity.Connecting
+ ac.cc.handleSubConnStateChange(ac.acbw, ac.state)
+ ac.mu.Unlock()
+
+ // Start a goroutine connecting to the server asynchronously.
+ go func() {
+ if err := ac.resetTransport(); err != nil {
+ grpclog.Warningf("Failed to dial %s: %v; please retry.", ac.addrs[0].Addr, err)
if err != errConnClosing {
- // Tear down ac and delete it from cc.conns.
- cc.mu.Lock()
- delete(cc.conns, ac.addrs[0])
- cc.mu.Unlock()
+ // Keep this ac in cc.conns, to get the reason it's torn down.
ac.tearDown(err)
}
- if e, ok := err.(transport.ConnectionError); ok && !e.Temporary() {
- return e.Origin()
- }
- return err
+ return
}
- // Start to monitor the error status of transport.
- go ac.transportMonitor()
- } else {
- // Start a goroutine connecting to the server asynchronously.
- go func() {
- if err := ac.resetTransport(false); err != nil {
- grpclog.Warningf("Failed to dial %s: %v; please retry.", ac.addrs[0].Addr, err)
- if err != errConnClosing {
- // Keep this ac in cc.conns, to get the reason it's torn down.
- ac.tearDown(err)
- }
- return
- }
- ac.transportMonitor()
- }()
- }
+ ac.transportMonitor()
+ }()
return nil
}
+// tryUpdateAddrs tries to update ac.addrs with the new addresses list.
+//
+// It checks whether current connected address of ac is in the new addrs list.
+// - If true, it updates ac.addrs and returns true. The ac will keep using
+// the existing connection.
+// - If false, it does nothing and returns false.
+func (ac *addrConn) tryUpdateAddrs(addrs []resolver.Address) bool {
+ ac.mu.Lock()
+ defer ac.mu.Unlock()
+ grpclog.Infof("addrConn: tryUpdateAddrs curAddr: %v, addrs: %v", ac.curAddr, addrs)
+ if ac.state == connectivity.Shutdown {
+ ac.addrs = addrs
+ return true
+ }
+
+ var curAddrFound bool
+ for _, a := range addrs {
+ if reflect.DeepEqual(ac.curAddr, a) {
+ curAddrFound = true
+ break
+ }
+ }
+ grpclog.Infof("addrConn: tryUpdateAddrs curAddrFound: %v", curAddrFound)
+ if curAddrFound {
+ ac.addrs = addrs
+ ac.reconnectIdx = 0 // Start reconnecting from beginning in the new list.
+ }
+
+ return curAddrFound
+}
+
// GetMethodConfig gets the method config of the input method.
// If there's an exact match for input method (i.e. /service/method), we return
// the corresponding MethodConfig.
@@ -839,58 +889,49 @@ func (cc *ClientConn) GetMethodConfig(method string) MethodConfig {
return m
}
-func (cc *ClientConn) getTransport(ctx context.Context, opts BalancerGetOptions) (transport.ClientTransport, func(), error) {
- var (
- ac *addrConn
- ok bool
- put func()
- )
- if cc.dopts.balancer == nil {
- // If balancer is nil, there should be only one addrConn available.
- cc.mu.RLock()
- if cc.conns == nil {
- cc.mu.RUnlock()
- return nil, nil, toRPCErr(ErrClientConnClosing)
- }
- for _, ac = range cc.conns {
- // Break after the first iteration to get the first addrConn.
- ok = true
- break
- }
- cc.mu.RUnlock()
- } else {
- var (
- addr Address
- err error
- )
- addr, put, err = cc.dopts.balancer.Get(ctx, opts)
- if err != nil {
- return nil, nil, toRPCErr(err)
- }
- cc.mu.RLock()
- if cc.conns == nil {
- cc.mu.RUnlock()
- return nil, nil, toRPCErr(ErrClientConnClosing)
- }
- ac, ok = cc.conns[addr]
- cc.mu.RUnlock()
- }
- if !ok {
- if put != nil {
- updateRPCInfoInContext(ctx, rpcInfo{bytesSent: false, bytesReceived: false})
- put()
- }
- return nil, nil, errConnClosing
- }
- t, err := ac.wait(ctx, cc.dopts.balancer != nil, !opts.BlockingWait)
+func (cc *ClientConn) getTransport(ctx context.Context, failfast bool) (transport.ClientTransport, func(balancer.DoneInfo), error) {
+ t, done, err := cc.blockingpicker.pick(ctx, failfast, balancer.PickOptions{})
if err != nil {
- if put != nil {
- updateRPCInfoInContext(ctx, rpcInfo{bytesSent: false, bytesReceived: false})
- put()
- }
- return nil, nil, err
+ return nil, nil, toRPCErr(err)
}
- return t, put, nil
+ return t, done, nil
+}
+
+// handleServiceConfig parses the service config string in JSON format to Go native
+// struct ServiceConfig, and store both the struct and the JSON string in ClientConn.
+func (cc *ClientConn) handleServiceConfig(js string) error {
+ sc, err := parseServiceConfig(js)
+ if err != nil {
+ return err
+ }
+ cc.mu.Lock()
+ cc.scRaw = js
+ cc.sc = sc
+ if sc.LB != nil && *sc.LB != grpclbName { // "grpclb" is not a valid balancer option in service config.
+ if cc.curBalancerName == grpclbName {
+ // If current balancer is grpclb, there's at least one grpclb
+ // balancer address in the resolved list. Don't switch the balancer,
+ // but change the previous balancer name, so if a new resolved
+ // address list doesn't contain grpclb address, balancer will be
+ // switched to *sc.LB.
+ cc.preBalancerName = *sc.LB
+ } else {
+ cc.switchBalancer(*sc.LB)
+ cc.balancerWrapper.handleResolvedAddrs(cc.curAddresses, nil)
+ }
+ }
+ cc.mu.Unlock()
+ return nil
+}
+
+func (cc *ClientConn) resolveNow(o resolver.ResolveNowOption) {
+ cc.mu.Lock()
+ r := cc.resolverWrapper
+ cc.mu.Unlock()
+ if r == nil {
+ return
+ }
+ go r.resolveNow(o)
}
// Close tears down the ClientConn and all underlying connections.
@@ -905,11 +946,20 @@ func (cc *ClientConn) Close() error {
conns := cc.conns
cc.conns = nil
cc.csMgr.updateState(connectivity.Shutdown)
+
+ rWrapper := cc.resolverWrapper
+ cc.resolverWrapper = nil
+ bWrapper := cc.balancerWrapper
+ cc.balancerWrapper = nil
cc.mu.Unlock()
- if cc.dopts.balancer != nil {
- cc.dopts.balancer.Close()
+ cc.blockingpicker.close()
+ if rWrapper != nil {
+ rWrapper.close()
}
- for _, ac := range conns {
+ if bWrapper != nil {
+ bWrapper.close()
+ }
+ for ac := range conns {
ac.tearDown(ErrClientConnClosing)
}
return nil
@@ -920,17 +970,16 @@ type addrConn struct {
ctx context.Context
cancel context.CancelFunc
- cc *ClientConn
- curAddr Address
- addrs []Address
- dopts dialOptions
- events trace.EventLog
+ cc *ClientConn
+ addrs []resolver.Address
+ dopts dialOptions
+ events trace.EventLog
+ acbw balancer.SubConn
- csEvltr *connectivityStateEvaluator
-
- mu sync.Mutex
- state connectivity.State
- down func(error) // the handler called when a connection is down.
+ mu sync.Mutex
+ curAddr resolver.Address
+ reconnectIdx int // The index in addrs list to start reconnecting from.
+ state connectivity.State
// ready is closed and becomes nil when a new transport is up or failed
// due to timeout.
ready chan struct{}
@@ -938,13 +987,21 @@ type addrConn struct {
// The reason this addrConn is torn down.
tearDownErr error
+
+ connectRetryNum int
+ // backoffDeadline is the time until which resetTransport needs to
+ // wait before increasing connectRetryNum count.
+ backoffDeadline time.Time
+ // connectDeadline is the time by which all connection
+ // negotiations must complete.
+ connectDeadline time.Time
}
// adjustParams updates parameters used to create transports upon
// receiving a GoAway.
func (ac *addrConn) adjustParams(r transport.GoAwayReason) {
switch r {
- case transport.TooManyPings:
+ case transport.GoAwayTooManyPings:
v := 2 * ac.dopts.copts.KeepaliveParams.Time
ac.cc.mu.Lock()
if v > ac.cc.mkp.Time {
@@ -970,196 +1027,253 @@ func (ac *addrConn) errorf(format string, a ...interface{}) {
}
}
-// resetTransport recreates a transport to the address for ac.
-// For the old transport:
-// - if drain is true, it will be gracefully closed.
-// - otherwise, it will be closed.
-func (ac *addrConn) resetTransport(drain bool) error {
+// resetTransport recreates a transport to the address for ac. The old
+// transport will close itself on error or when the clientconn is closed.
+// The created transport must receive initial settings frame from the server.
+// In case that doesnt happen, transportMonitor will kill the newly created
+// transport after connectDeadline has expired.
+// In case there was an error on the transport before the settings frame was
+// received, resetTransport resumes connecting to backends after the one that
+// was previously connected to. In case end of the list is reached, resetTransport
+// backs off until the original deadline.
+// If the DialOption WithWaitForHandshake was set, resetTrasport returns
+// successfully only after server settings are received.
+//
+// TODO(bar) make sure all state transitions are valid.
+func (ac *addrConn) resetTransport() error {
ac.mu.Lock()
if ac.state == connectivity.Shutdown {
ac.mu.Unlock()
return errConnClosing
}
- ac.printf("connecting")
- if ac.down != nil {
- ac.down(downErrorf(false, true, "%v", errNetworkIO))
- ac.down = nil
+ if ac.ready != nil {
+ close(ac.ready)
+ ac.ready = nil
}
- oldState := ac.state
- ac.state = connectivity.Connecting
- ac.csEvltr.recordTransition(oldState, ac.state)
- t := ac.transport
ac.transport = nil
+ ridx := ac.reconnectIdx
ac.mu.Unlock()
- if t != nil && !drain {
- t.Close()
- }
ac.cc.mu.RLock()
ac.dopts.copts.KeepaliveParams = ac.cc.mkp
ac.cc.mu.RUnlock()
- for retries := 0; ; retries++ {
+ var backoffDeadline, connectDeadline time.Time
+ for connectRetryNum := 0; ; connectRetryNum++ {
ac.mu.Lock()
- sleepTime := ac.dopts.bs.backoff(retries)
- timeout := minConnectTimeout
- if timeout < time.Duration(int(sleepTime)/len(ac.addrs)) {
- timeout = time.Duration(int(sleepTime) / len(ac.addrs))
+ if ac.backoffDeadline.IsZero() {
+ // This means either a successful HTTP2 connection was established
+ // or this is the first time this addrConn is trying to establish a
+ // connection.
+ backoffFor := ac.dopts.bs.backoff(connectRetryNum) // time.Duration.
+ // This will be the duration that dial gets to finish.
+ dialDuration := minConnectTimeout
+ if backoffFor > dialDuration {
+ // Give dial more time as we keep failing to connect.
+ dialDuration = backoffFor
+ }
+ start := time.Now()
+ backoffDeadline = start.Add(backoffFor)
+ connectDeadline = start.Add(dialDuration)
+ ridx = 0 // Start connecting from the beginning.
+ } else {
+ // Continue trying to conect with the same deadlines.
+ connectRetryNum = ac.connectRetryNum
+ backoffDeadline = ac.backoffDeadline
+ connectDeadline = ac.connectDeadline
+ ac.backoffDeadline = time.Time{}
+ ac.connectDeadline = time.Time{}
+ ac.connectRetryNum = 0
+ }
+ if ac.state == connectivity.Shutdown {
+ ac.mu.Unlock()
+ return errConnClosing
+ }
+ ac.printf("connecting")
+ if ac.state != connectivity.Connecting {
+ ac.state = connectivity.Connecting
+ ac.cc.handleSubConnStateChange(ac.acbw, ac.state)
}
- connectTime := time.Now()
// copy ac.addrs in case of race
- addrsIter := make([]Address, len(ac.addrs))
+ addrsIter := make([]resolver.Address, len(ac.addrs))
copy(addrsIter, ac.addrs)
+ copts := ac.dopts.copts
ac.mu.Unlock()
- for _, addr := range addrsIter {
- ac.mu.Lock()
- if ac.state == connectivity.Shutdown {
- // ac.tearDown(...) has been invoked.
- ac.mu.Unlock()
- return errConnClosing
- }
- ac.mu.Unlock()
- ctx, cancel := context.WithTimeout(ac.ctx, timeout)
- sinfo := transport.TargetInfo{
- Addr: addr.Addr,
- Metadata: addr.Metadata,
- }
- newTransport, err := transport.NewClientTransport(ctx, sinfo, ac.dopts.copts)
- // Don't call cancel in success path due to a race in Go 1.6:
- // https://github.com/golang/go/issues/15078.
- if err != nil {
- cancel()
-
- if e, ok := err.(transport.ConnectionError); ok && !e.Temporary() {
- return err
- }
- grpclog.Warningf("grpc: addrConn.resetTransport failed to create client transport: %v; Reconnecting to %v", err, addr)
- ac.mu.Lock()
- if ac.state == connectivity.Shutdown {
- // ac.tearDown(...) has been invoked.
- ac.mu.Unlock()
- return errConnClosing
- }
- ac.errorf("transient failure: %v", err)
- oldState = ac.state
- ac.state = connectivity.TransientFailure
- ac.csEvltr.recordTransition(oldState, ac.state)
- if ac.ready != nil {
- close(ac.ready)
- ac.ready = nil
- }
- ac.mu.Unlock()
- continue
- }
- ac.mu.Lock()
- ac.printf("ready")
- if ac.state == connectivity.Shutdown {
- // ac.tearDown(...) has been invoked.
- ac.mu.Unlock()
- newTransport.Close()
- return errConnClosing
- }
- oldState = ac.state
- ac.state = connectivity.Ready
- ac.csEvltr.recordTransition(oldState, ac.state)
- ac.transport = newTransport
- if ac.ready != nil {
- close(ac.ready)
- ac.ready = nil
- }
- if ac.cc.dopts.balancer != nil {
- ac.down = ac.cc.dopts.balancer.Up(addr)
- }
- ac.curAddr = addr
- ac.mu.Unlock()
+ connected, err := ac.createTransport(connectRetryNum, ridx, backoffDeadline, connectDeadline, addrsIter, copts)
+ if err != nil {
+ return err
+ }
+ if connected {
return nil
}
- timer := time.NewTimer(sleepTime - time.Since(connectTime))
- select {
- case <-timer.C:
- case <-ac.ctx.Done():
- timer.Stop()
- return ac.ctx.Err()
- }
- timer.Stop()
}
}
+// createTransport creates a connection to one of the backends in addrs.
+// It returns true if a connection was established.
+func (ac *addrConn) createTransport(connectRetryNum, ridx int, backoffDeadline, connectDeadline time.Time, addrs []resolver.Address, copts transport.ConnectOptions) (bool, error) {
+ for i := ridx; i < len(addrs); i++ {
+ addr := addrs[i]
+ target := transport.TargetInfo{
+ Addr: addr.Addr,
+ Metadata: addr.Metadata,
+ Authority: ac.cc.authority,
+ }
+ done := make(chan struct{})
+ onPrefaceReceipt := func() {
+ close(done)
+ ac.mu.Lock()
+ if !ac.backoffDeadline.IsZero() {
+ // If we haven't already started reconnecting to
+ // other backends.
+ // Note, this can happen when writer notices an error
+ // and triggers resetTransport while at the same time
+ // reader receives the preface and invokes this closure.
+ ac.backoffDeadline = time.Time{}
+ ac.connectDeadline = time.Time{}
+ ac.connectRetryNum = 0
+ }
+ ac.mu.Unlock()
+ }
+ // Do not cancel in the success path because of
+ // this issue in Go1.6: https://github.com/golang/go/issues/15078.
+ connectCtx, cancel := context.WithDeadline(ac.ctx, connectDeadline)
+ newTr, err := transport.NewClientTransport(connectCtx, ac.cc.ctx, target, copts, onPrefaceReceipt)
+ if err != nil {
+ cancel()
+ if e, ok := err.(transport.ConnectionError); ok && !e.Temporary() {
+ ac.mu.Lock()
+ if ac.state != connectivity.Shutdown {
+ ac.state = connectivity.TransientFailure
+ ac.cc.handleSubConnStateChange(ac.acbw, ac.state)
+ }
+ ac.mu.Unlock()
+ return false, err
+ }
+ ac.mu.Lock()
+ if ac.state == connectivity.Shutdown {
+ // ac.tearDown(...) has been invoked.
+ ac.mu.Unlock()
+ return false, errConnClosing
+ }
+ ac.mu.Unlock()
+ grpclog.Warningf("grpc: addrConn.createTransport failed to connect to %v. Err :%v. Reconnecting...", addr, err)
+ continue
+ }
+ if ac.dopts.waitForHandshake {
+ select {
+ case <-done:
+ case <-connectCtx.Done():
+ // Didn't receive server preface, must kill this new transport now.
+ grpclog.Warningf("grpc: addrConn.createTransport failed to receive server preface before deadline.")
+ newTr.Close()
+ break
+ case <-ac.ctx.Done():
+ }
+ }
+ ac.mu.Lock()
+ if ac.state == connectivity.Shutdown {
+ ac.mu.Unlock()
+ // ac.tearDonn(...) has been invoked.
+ newTr.Close()
+ return false, errConnClosing
+ }
+ ac.printf("ready")
+ ac.state = connectivity.Ready
+ ac.cc.handleSubConnStateChange(ac.acbw, ac.state)
+ ac.transport = newTr
+ ac.curAddr = addr
+ if ac.ready != nil {
+ close(ac.ready)
+ ac.ready = nil
+ }
+ ac.connectRetryNum = connectRetryNum
+ ac.backoffDeadline = backoffDeadline
+ ac.connectDeadline = connectDeadline
+ ac.reconnectIdx = i + 1 // Start reconnecting from the next backend in the list.
+ ac.mu.Unlock()
+ return true, nil
+ }
+ ac.mu.Lock()
+ ac.state = connectivity.TransientFailure
+ ac.cc.handleSubConnStateChange(ac.acbw, ac.state)
+ ac.cc.resolveNow(resolver.ResolveNowOption{})
+ if ac.ready != nil {
+ close(ac.ready)
+ ac.ready = nil
+ }
+ ac.mu.Unlock()
+ timer := time.NewTimer(backoffDeadline.Sub(time.Now()))
+ select {
+ case <-timer.C:
+ case <-ac.ctx.Done():
+ timer.Stop()
+ return false, ac.ctx.Err()
+ }
+ return false, nil
+}
+
// Run in a goroutine to track the error in transport and create the
// new transport if an error happens. It returns when the channel is closing.
func (ac *addrConn) transportMonitor() {
for {
+ var timer *time.Timer
+ var cdeadline <-chan time.Time
ac.mu.Lock()
t := ac.transport
+ if !ac.connectDeadline.IsZero() {
+ timer = time.NewTimer(ac.connectDeadline.Sub(time.Now()))
+ cdeadline = timer.C
+ }
ac.mu.Unlock()
+ // Block until we receive a goaway or an error occurs.
select {
- // This is needed to detect the teardown when
- // the addrConn is idle (i.e., no RPC in flight).
- case <-ac.ctx.Done():
- select {
- case <-t.Error():
- t.Close()
- default:
+ case <-t.GoAway():
+ case <-t.Error():
+ case <-cdeadline:
+ ac.mu.Lock()
+ // This implies that client received server preface.
+ if ac.backoffDeadline.IsZero() {
+ ac.mu.Unlock()
+ continue
}
- return
+ ac.mu.Unlock()
+ timer = nil
+ // No server preface received until deadline.
+ // Kill the connection.
+ grpclog.Warningf("grpc: addrConn.transportMonitor didn't get server preface after waiting. Closing the new transport now.")
+ t.Close()
+ }
+ if timer != nil {
+ timer.Stop()
+ }
+ // If a GoAway happened, regardless of error, adjust our keepalive
+ // parameters as appropriate.
+ select {
case <-t.GoAway():
ac.adjustParams(t.GetGoAwayReason())
- // If GoAway happens without any network I/O error, the underlying transport
- // will be gracefully closed, and a new transport will be created.
- // (The transport will be closed when all the pending RPCs finished or failed.)
- // If GoAway and some network I/O error happen concurrently, the underlying transport
- // will be closed, and a new transport will be created.
- var drain bool
- select {
- case <-t.Error():
- default:
- drain = true
- }
- if err := ac.resetTransport(drain); err != nil {
- grpclog.Infof("get error from resetTransport %v, transportMonitor returning", err)
- if err != errConnClosing {
- // Keep this ac in cc.conns, to get the reason it's torn down.
- ac.tearDown(err)
- }
- return
- }
- case <-t.Error():
- select {
- case <-ac.ctx.Done():
- t.Close()
- return
- case <-t.GoAway():
- ac.adjustParams(t.GetGoAwayReason())
- if err := ac.resetTransport(false); err != nil {
- grpclog.Infof("get error from resetTransport %v, transportMonitor returning", err)
- if err != errConnClosing {
- // Keep this ac in cc.conns, to get the reason it's torn down.
- ac.tearDown(err)
- }
- return
- }
- default:
- }
- ac.mu.Lock()
- if ac.state == connectivity.Shutdown {
- // ac has been shutdown.
- ac.mu.Unlock()
- return
- }
- oldState := ac.state
- ac.state = connectivity.TransientFailure
- ac.csEvltr.recordTransition(oldState, ac.state)
+ default:
+ }
+ ac.mu.Lock()
+ if ac.state == connectivity.Shutdown {
ac.mu.Unlock()
- if err := ac.resetTransport(false); err != nil {
- grpclog.Infof("get error from resetTransport %v, transportMonitor returning", err)
- ac.mu.Lock()
- ac.printf("transport exiting: %v", err)
- ac.mu.Unlock()
- grpclog.Warningf("grpc: addrConn.transportMonitor exits due to: %v", err)
- if err != errConnClosing {
- // Keep this ac in cc.conns, to get the reason it's torn down.
- ac.tearDown(err)
- }
- return
+ return
+ }
+ // Set connectivity state to TransientFailure before calling
+ // resetTransport. Transition READY->CONNECTING is not valid.
+ ac.state = connectivity.TransientFailure
+ ac.cc.handleSubConnStateChange(ac.acbw, ac.state)
+ ac.cc.resolveNow(resolver.ResolveNowOption{})
+ ac.curAddr = resolver.Address{}
+ ac.mu.Unlock()
+ if err := ac.resetTransport(); err != nil {
+ ac.mu.Lock()
+ ac.printf("transport exiting: %v", err)
+ ac.mu.Unlock()
+ grpclog.Warningf("grpc: addrConn.transportMonitor exits due to: %v", err)
+ if err != errConnClosing {
+ // Keep this ac in cc.conns, to get the reason it's torn down.
+ ac.tearDown(err)
}
+ return
}
}
}
@@ -1204,6 +1318,28 @@ func (ac *addrConn) wait(ctx context.Context, hasBalancer, failfast bool) (trans
}
}
+// getReadyTransport returns the transport if ac's state is READY.
+// Otherwise it returns nil, false.
+// If ac's state is IDLE, it will trigger ac to connect.
+func (ac *addrConn) getReadyTransport() (transport.ClientTransport, bool) {
+ ac.mu.Lock()
+ if ac.state == connectivity.Ready {
+ t := ac.transport
+ ac.mu.Unlock()
+ return t, true
+ }
+ var idle bool
+ if ac.state == connectivity.Idle {
+ idle = true
+ }
+ ac.mu.Unlock()
+ // Trigger idle ac to connect.
+ if idle {
+ ac.connect()
+ }
+ return nil, false
+}
+
// tearDown starts to tear down the addrConn.
// TODO(zhaoq): Make this synchronous to avoid unbounded memory consumption in
// some edge cases (e.g., the caller opens and closes many addrConn's in a
@@ -1211,14 +1347,12 @@ func (ac *addrConn) wait(ctx context.Context, hasBalancer, failfast bool) (trans
// tearDown doesn't remove ac from ac.cc.conns.
func (ac *addrConn) tearDown(err error) {
ac.cancel()
-
ac.mu.Lock()
- ac.curAddr = Address{}
defer ac.mu.Unlock()
- if ac.down != nil {
- ac.down(downErrorf(false, false, "%v", err))
- ac.down = nil
+ if ac.state == connectivity.Shutdown {
+ return
}
+ ac.curAddr = resolver.Address{}
if err == errConnDrain && ac.transport != nil {
// GracefulClose(...) may be executed multiple times when
// i) receiving multiple GoAway frames from the server; or
@@ -1226,13 +1360,9 @@ func (ac *addrConn) tearDown(err error) {
// address removal and GoAway.
ac.transport.GracefulClose()
}
- if ac.state == connectivity.Shutdown {
- return
- }
- oldState := ac.state
ac.state = connectivity.Shutdown
ac.tearDownErr = err
- ac.csEvltr.recordTransition(oldState, ac.state)
+ ac.cc.handleSubConnStateChange(ac.acbw, ac.state)
if ac.events != nil {
ac.events.Finish()
ac.events = nil
@@ -1241,8 +1371,11 @@ func (ac *addrConn) tearDown(err error) {
close(ac.ready)
ac.ready = nil
}
- if ac.transport != nil && err != errConnDrain {
- ac.transport.Close()
- }
return
}
+
+func (ac *addrConn) getState() connectivity.State {
+ ac.mu.Lock()
+ defer ac.mu.Unlock()
+ return ac.state
+}
diff --git a/vendor/google.golang.org/grpc/clientconn_test.go b/vendor/google.golang.org/grpc/clientconn_test.go
index bdaf3df..d87daf2 100644
--- a/vendor/google.golang.org/grpc/clientconn_test.go
+++ b/vendor/google.golang.org/grpc/clientconn_test.go
@@ -19,17 +19,23 @@
package grpc
import (
+ "io"
"math"
"net"
"testing"
"time"
"golang.org/x/net/context"
+ "golang.org/x/net/http2"
"google.golang.org/grpc/connectivity"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/keepalive"
"google.golang.org/grpc/naming"
+ "google.golang.org/grpc/resolver"
+ "google.golang.org/grpc/resolver/manual"
+ _ "google.golang.org/grpc/resolver/passthrough"
+ "google.golang.org/grpc/test/leakcheck"
"google.golang.org/grpc/testdata"
)
@@ -42,15 +48,277 @@ func assertState(wantState connectivity.State, cc *ClientConn) (connectivity.Sta
return state, state == wantState
}
-func TestConnectivityStates(t *testing.T) {
- servers, resolver := startServers(t, 2, math.MaxUint32)
+func TestDialWithMultipleBackendsNotSendingServerPreface(t *testing.T) {
+ defer leakcheck.Check(t)
+ numServers := 2
+ servers := make([]net.Listener, numServers)
+ var err error
+ for i := 0; i < numServers; i++ {
+ servers[i], err = net.Listen("tcp", "localhost:0")
+ if err != nil {
+ t.Fatalf("Error while listening. Err: %v", err)
+ }
+ }
+ dones := make([]chan struct{}, numServers)
+ for i := 0; i < numServers; i++ {
+ dones[i] = make(chan struct{})
+ }
+ for i := 0; i < numServers; i++ {
+ go func(i int) {
+ defer func() {
+ close(dones[i])
+ }()
+ conn, err := servers[i].Accept()
+ if err != nil {
+ t.Errorf("Error while accepting. Err: %v", err)
+ return
+ }
+ defer conn.Close()
+ switch i {
+ case 0: // 1st server accepts the connection and immediately closes it.
+ case 1: // 2nd server accepts the connection and sends settings frames.
+ framer := http2.NewFramer(conn, conn)
+ if err := framer.WriteSettings(http2.Setting{}); err != nil {
+ t.Errorf("Error while writing settings frame. %v", err)
+ return
+ }
+ conn.SetDeadline(time.Now().Add(time.Second))
+ buf := make([]byte, 1024)
+ for { // Make sure the connection stays healthy.
+ _, err = conn.Read(buf)
+ if err == nil {
+ continue
+ }
+ if nerr, ok := err.(net.Error); !ok || !nerr.Timeout() {
+ t.Errorf("Server expected the conn.Read(_) to timeout instead got error: %v", err)
+ }
+ return
+ }
+ }
+ }(i)
+ }
+ r, cleanup := manual.GenerateAndRegisterManualResolver()
+ defer cleanup()
+ resolvedAddrs := make([]resolver.Address, numServers)
+ for i := 0; i < numServers; i++ {
+ resolvedAddrs[i] = resolver.Address{Addr: servers[i].Addr().String()}
+ }
+ r.InitialAddrs(resolvedAddrs)
+ client, err := Dial(r.Scheme()+":///test.server", WithInsecure())
+ if err != nil {
+ t.Errorf("Dial failed. Err: %v", err)
+ } else {
+ defer client.Close()
+ }
+ time.Sleep(time.Second) // Close the servers after a second for cleanup.
+ for _, s := range servers {
+ s.Close()
+ }
+ for _, done := range dones {
+ <-done
+ }
+}
+
+func TestDialWaitsForServerSettings(t *testing.T) {
+ defer leakcheck.Check(t)
+ server, err := net.Listen("tcp", "localhost:0")
+ if err != nil {
+ t.Fatalf("Error while listening. Err: %v", err)
+ }
+ defer server.Close()
+ done := make(chan struct{})
+ sent := make(chan struct{})
+ dialDone := make(chan struct{})
+ go func() { // Launch the server.
+ defer func() {
+ close(done)
+ }()
+ conn, err := server.Accept()
+ if err != nil {
+ t.Errorf("Error while accepting. Err: %v", err)
+ return
+ }
+ defer conn.Close()
+ // Sleep so that if the test were to fail it
+ // will fail more often than not.
+ time.Sleep(100 * time.Millisecond)
+ framer := http2.NewFramer(conn, conn)
+ close(sent)
+ if err := framer.WriteSettings(http2.Setting{}); err != nil {
+ t.Errorf("Error while writing settings. Err: %v", err)
+ return
+ }
+ <-dialDone // Close conn only after dial returns.
+ }()
+ ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
+ defer cancel()
+ client, err := DialContext(ctx, server.Addr().String(), WithInsecure(), WithWaitForHandshake(), WithBlock())
+ close(dialDone)
+ if err != nil {
+ cancel()
+ t.Fatalf("Error while dialing. Err: %v", err)
+ }
+ defer client.Close()
+ select {
+ case <-sent:
+ default:
+ t.Fatalf("Dial returned before server settings were sent")
+ }
+ <-done
+
+}
+
+func TestCloseConnectionWhenServerPrefaceNotReceived(t *testing.T) {
+ mctBkp := minConnectTimeout
+ // Call this only after transportMonitor goroutine has ended.
defer func() {
- for i := 0; i < 2; i++ {
- servers[i].stop()
+ minConnectTimeout = mctBkp
+ }()
+ defer leakcheck.Check(t)
+ minConnectTimeout = time.Millisecond * 500
+ server, err := net.Listen("tcp", "localhost:0")
+ if err != nil {
+ t.Fatalf("Error while listening. Err: %v", err)
+ }
+ defer server.Close()
+ done := make(chan struct{})
+ clientDone := make(chan struct{})
+ go func() { // Launch the server.
+ defer func() {
+ if done != nil {
+ close(done)
+ }
+ }()
+ conn1, err := server.Accept()
+ if err != nil {
+ t.Errorf("Error while accepting. Err: %v", err)
+ return
+ }
+ defer conn1.Close()
+ // Don't send server settings and make sure the connection is closed.
+ time.Sleep(time.Millisecond * 1500) // Since the first backoff is for a second.
+ conn1.SetDeadline(time.Now().Add(time.Second))
+ b := make([]byte, 24)
+ for {
+ // Make sure the connection was closed by client.
+ _, err = conn1.Read(b)
+ if err == nil {
+ continue
+ }
+ if err != io.EOF {
+ t.Errorf(" conn1.Read(_) = _, %v, want _, io.EOF", err)
+ return
+ }
+ break
+ }
+
+ conn2, err := server.Accept() // Accept a reconnection request from client.
+ if err != nil {
+ t.Errorf("Error while accepting. Err: %v", err)
+ return
+ }
+ defer conn2.Close()
+ framer := http2.NewFramer(conn2, conn2)
+ if err := framer.WriteSettings(http2.Setting{}); err != nil {
+ t.Errorf("Error while writing settings. Err: %v", err)
+ return
+ }
+ time.Sleep(time.Millisecond * 1500) // Since the first backoff is for a second.
+ conn2.SetDeadline(time.Now().Add(time.Millisecond * 500))
+ for {
+ // Make sure the connection stays open and is closed
+ // only by connection timeout.
+ _, err = conn2.Read(b)
+ if err == nil {
+ continue
+ }
+ if nerr, ok := err.(net.Error); ok && nerr.Timeout() {
+ return
+ }
+ t.Errorf("Unexpected error while reading. Err: %v, want timeout error", err)
+ break
+ }
+ close(done)
+ done = nil
+ <-clientDone
+
+ }()
+ client, err := Dial(server.Addr().String(), WithInsecure())
+ if err != nil {
+ t.Fatalf("Error while dialing. Err: %v", err)
+ }
+ <-done
+ // TODO: The code from BEGIN to END should be delete once issue
+ // https://github.com/grpc/grpc-go/issues/1750 is fixed.
+ // BEGIN
+ // Set underlying addrConns state to Shutdown so that no reconnect
+ // attempts take place and thereby resetting minConnectTimeout is
+ // race free.
+ client.mu.Lock()
+ addrConns := client.conns
+ client.mu.Unlock()
+ for ac := range addrConns {
+ ac.mu.Lock()
+ ac.state = connectivity.Shutdown
+ ac.mu.Unlock()
+ }
+ // END
+ client.Close()
+ close(clientDone)
+}
+
+func TestBackoffWhenNoServerPrefaceReceived(t *testing.T) {
+ defer leakcheck.Check(t)
+ server, err := net.Listen("tcp", "localhost:0")
+ if err != nil {
+ t.Fatalf("Error while listening. Err: %v", err)
+ }
+ defer server.Close()
+ done := make(chan struct{})
+ go func() { // Launch the server.
+ defer func() {
+ close(done)
+ }()
+ conn, err := server.Accept() // Accept the connection only to close it immediately.
+ if err != nil {
+ t.Errorf("Error while accepting. Err: %v", err)
+ return
+ }
+ prevAt := time.Now()
+ conn.Close()
+ var prevDuration time.Duration
+ // Make sure the retry attempts are backed off properly.
+ for i := 0; i < 3; i++ {
+ conn, err := server.Accept()
+ if err != nil {
+ t.Errorf("Error while accepting. Err: %v", err)
+ return
+ }
+ meow := time.Now()
+ conn.Close()
+ dr := meow.Sub(prevAt)
+ if dr <= prevDuration {
+ t.Errorf("Client backoff did not increase with retries. Previous duration: %v, current duration: %v", prevDuration, dr)
+ return
+ }
+ prevDuration = dr
+ prevAt = meow
}
}()
+ client, err := Dial(server.Addr().String(), WithInsecure())
+ if err != nil {
+ t.Fatalf("Error while dialing. Err: %v", err)
+ }
+ defer client.Close()
+ <-done
- cc, err := Dial("foo.bar.com", WithBalancer(RoundRobin(resolver)), WithInsecure())
+}
+
+func TestConnectivityStates(t *testing.T) {
+ defer leakcheck.Check(t)
+ servers, resolver, cleanup := startServers(t, 2, math.MaxUint32)
+ defer cleanup()
+ cc, err := Dial("passthrough:///foo.bar.com", WithBalancer(RoundRobin(resolver)), WithInsecure())
if err != nil {
t.Fatalf("Dial(\"foo.bar.com\", WithBalancer(_)) = _, %v, want _ ", err)
}
@@ -84,7 +352,8 @@ func TestConnectivityStates(t *testing.T) {
}
func TestDialTimeout(t *testing.T) {
- conn, err := Dial("Non-Existent.Server:80", WithTimeout(time.Millisecond), WithBlock(), WithInsecure())
+ defer leakcheck.Check(t)
+ conn, err := Dial("passthrough:///Non-Existent.Server:80", WithTimeout(time.Millisecond), WithBlock(), WithInsecure())
if err == nil {
conn.Close()
}
@@ -94,11 +363,12 @@ func TestDialTimeout(t *testing.T) {
}
func TestTLSDialTimeout(t *testing.T) {
+ defer leakcheck.Check(t)
creds, err := credentials.NewClientTLSFromFile(testdata.Path("ca.pem"), "x.test.youtube.com")
if err != nil {
t.Fatalf("Failed to create credentials %v", err)
}
- conn, err := Dial("Non-Existent.Server:80", WithTransportCredentials(creds), WithTimeout(time.Millisecond), WithBlock())
+ conn, err := Dial("passthrough:///Non-Existent.Server:80", WithTransportCredentials(creds), WithTimeout(time.Millisecond), WithBlock())
if err == nil {
conn.Close()
}
@@ -108,62 +378,67 @@ func TestTLSDialTimeout(t *testing.T) {
}
func TestDefaultAuthority(t *testing.T) {
+ defer leakcheck.Check(t)
target := "Non-Existent.Server:8080"
conn, err := Dial(target, WithInsecure())
if err != nil {
t.Fatalf("Dial(_, _) = _, %v, want _, ", err)
}
- conn.Close()
+ defer conn.Close()
if conn.authority != target {
t.Fatalf("%v.authority = %v, want %v", conn, conn.authority, target)
}
}
func TestTLSServerNameOverwrite(t *testing.T) {
+ defer leakcheck.Check(t)
overwriteServerName := "over.write.server.name"
creds, err := credentials.NewClientTLSFromFile(testdata.Path("ca.pem"), overwriteServerName)
if err != nil {
t.Fatalf("Failed to create credentials %v", err)
}
- conn, err := Dial("Non-Existent.Server:80", WithTransportCredentials(creds))
+ conn, err := Dial("passthrough:///Non-Existent.Server:80", WithTransportCredentials(creds))
if err != nil {
t.Fatalf("Dial(_, _) = _, %v, want _, ", err)
}
- conn.Close()
+ defer conn.Close()
if conn.authority != overwriteServerName {
t.Fatalf("%v.authority = %v, want %v", conn, conn.authority, overwriteServerName)
}
}
func TestWithAuthority(t *testing.T) {
+ defer leakcheck.Check(t)
overwriteServerName := "over.write.server.name"
- conn, err := Dial("Non-Existent.Server:80", WithInsecure(), WithAuthority(overwriteServerName))
+ conn, err := Dial("passthrough:///Non-Existent.Server:80", WithInsecure(), WithAuthority(overwriteServerName))
if err != nil {
t.Fatalf("Dial(_, _) = _, %v, want _, ", err)
}
- conn.Close()
+ defer conn.Close()
if conn.authority != overwriteServerName {
t.Fatalf("%v.authority = %v, want %v", conn, conn.authority, overwriteServerName)
}
}
func TestWithAuthorityAndTLS(t *testing.T) {
+ defer leakcheck.Check(t)
overwriteServerName := "over.write.server.name"
creds, err := credentials.NewClientTLSFromFile(testdata.Path("ca.pem"), overwriteServerName)
if err != nil {
t.Fatalf("Failed to create credentials %v", err)
}
- conn, err := Dial("Non-Existent.Server:80", WithTransportCredentials(creds), WithAuthority("no.effect.authority"))
+ conn, err := Dial("passthrough:///Non-Existent.Server:80", WithTransportCredentials(creds), WithAuthority("no.effect.authority"))
if err != nil {
t.Fatalf("Dial(_, _) = _, %v, want _, ", err)
}
- conn.Close()
+ defer conn.Close()
if conn.authority != overwriteServerName {
t.Fatalf("%v.authority = %v, want %v", conn, conn.authority, overwriteServerName)
}
}
func TestDialContextCancel(t *testing.T) {
+ defer leakcheck.Check(t)
ctx, cancel := context.WithCancel(context.Background())
cancel()
if _, err := DialContext(ctx, "Non-Existent.Server:80", WithBlock(), WithInsecure()); err != context.Canceled {
@@ -198,6 +473,7 @@ func (b *blockingBalancer) Close() error {
}
func TestDialWithBlockingBalancer(t *testing.T) {
+ defer leakcheck.Check(t)
ctx, cancel := context.WithCancel(context.Background())
dialDone := make(chan struct{})
go func() {
@@ -220,25 +496,28 @@ func (c securePerRPCCredentials) RequireTransportSecurity() bool {
}
func TestCredentialsMisuse(t *testing.T) {
+ defer leakcheck.Check(t)
tlsCreds, err := credentials.NewClientTLSFromFile(testdata.Path("ca.pem"), "x.test.youtube.com")
if err != nil {
t.Fatalf("Failed to create authenticator %v", err)
}
// Two conflicting credential configurations
- if _, err := Dial("Non-Existent.Server:80", WithTransportCredentials(tlsCreds), WithBlock(), WithInsecure()); err != errCredentialsConflict {
+ if _, err := Dial("passthrough:///Non-Existent.Server:80", WithTransportCredentials(tlsCreds), WithBlock(), WithInsecure()); err != errCredentialsConflict {
t.Fatalf("Dial(_, _) = _, %v, want _, %v", err, errCredentialsConflict)
}
// security info on insecure connection
- if _, err := Dial("Non-Existent.Server:80", WithPerRPCCredentials(securePerRPCCredentials{}), WithBlock(), WithInsecure()); err != errTransportCredentialsMissing {
+ if _, err := Dial("passthrough:///Non-Existent.Server:80", WithPerRPCCredentials(securePerRPCCredentials{}), WithBlock(), WithInsecure()); err != errTransportCredentialsMissing {
t.Fatalf("Dial(_, _) = _, %v, want _, %v", err, errTransportCredentialsMissing)
}
}
func TestWithBackoffConfigDefault(t *testing.T) {
+ defer leakcheck.Check(t)
testBackoffConfigSet(t, &DefaultBackoffConfig)
}
func TestWithBackoffConfig(t *testing.T) {
+ defer leakcheck.Check(t)
b := BackoffConfig{MaxDelay: DefaultBackoffConfig.MaxDelay / 2}
expected := b
setDefaults(&expected) // defaults should be set
@@ -246,6 +525,7 @@ func TestWithBackoffConfig(t *testing.T) {
}
func TestWithBackoffMaxDelay(t *testing.T) {
+ defer leakcheck.Check(t)
md := DefaultBackoffConfig.MaxDelay / 2
expected := BackoffConfig{MaxDelay: md}
setDefaults(&expected)
@@ -254,10 +534,11 @@ func TestWithBackoffMaxDelay(t *testing.T) {
func testBackoffConfigSet(t *testing.T, expected *BackoffConfig, opts ...DialOption) {
opts = append(opts, WithInsecure())
- conn, err := Dial("foo:80", opts...)
+ conn, err := Dial("passthrough:///foo:80", opts...)
if err != nil {
t.Fatalf("unexpected error dialing connection: %v", err)
}
+ defer conn.Close()
if conn.dopts.bs == nil {
t.Fatalf("backoff config not set")
@@ -271,38 +552,6 @@ func testBackoffConfigSet(t *testing.T, expected *BackoffConfig, opts ...DialOpt
if actual != *expected {
t.Fatalf("unexpected backoff config on connection: %v, want %v", actual, expected)
}
- conn.Close()
-}
-
-type testErr struct {
- temp bool
-}
-
-func (e *testErr) Error() string {
- return "test error"
-}
-
-func (e *testErr) Temporary() bool {
- return e.temp
-}
-
-var nonTemporaryError = &testErr{false}
-
-func nonTemporaryErrorDialer(addr string, timeout time.Duration) (net.Conn, error) {
- return nil, nonTemporaryError
-}
-
-func TestDialWithBlockErrorOnNonTemporaryErrorDialer(t *testing.T) {
- ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond)
- defer cancel()
- if _, err := DialContext(ctx, "", WithInsecure(), WithDialer(nonTemporaryErrorDialer), WithBlock(), FailOnNonTempDialError(true)); err != nonTemporaryError {
- t.Fatalf("Dial(%q) = %v, want %v", "", err, nonTemporaryError)
- }
-
- // Without FailOnNonTempDialError, gRPC will retry to connect, and dial should exit with time out error.
- if _, err := DialContext(ctx, "", WithInsecure(), WithDialer(nonTemporaryErrorDialer), WithBlock()); err != context.DeadlineExceeded {
- t.Fatalf("Dial(%q) = %v, want %v", "", err, context.DeadlineExceeded)
- }
}
// emptyBalancer returns an empty set of servers.
@@ -332,6 +581,7 @@ func (b *emptyBalancer) Close() error {
}
func TestNonblockingDialWithEmptyBalancer(t *testing.T) {
+ defer leakcheck.Check(t)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
dialDone := make(chan error)
@@ -350,6 +600,7 @@ func TestNonblockingDialWithEmptyBalancer(t *testing.T) {
}
func TestClientUpdatesParamsAfterGoAway(t *testing.T) {
+ defer leakcheck.Check(t)
lis, err := net.Listen("tcp", "localhost:0")
if err != nil {
t.Fatalf("Failed to listen. Err: %v", err)
@@ -361,7 +612,7 @@ func TestClientUpdatesParamsAfterGoAway(t *testing.T) {
defer s.Stop()
cc, err := Dial(addr, WithBlock(), WithInsecure(), WithKeepaliveParams(keepalive.ClientParameters{
Time: 50 * time.Millisecond,
- Timeout: 1 * time.Millisecond,
+ Timeout: 100 * time.Millisecond,
PermitWithoutStream: true,
}))
if err != nil {
@@ -376,19 +627,3 @@ func TestClientUpdatesParamsAfterGoAway(t *testing.T) {
t.Fatalf("cc.dopts.copts.Keepalive.Time = %v , want 100ms", v)
}
}
-
-func TestClientLBWatcherWithClosedBalancer(t *testing.T) {
- b := newBlockingBalancer()
- cc := &ClientConn{dopts: dialOptions{balancer: b}}
-
- doneChan := make(chan struct{})
- go cc.lbWatcher(doneChan)
- // Balancer closes before any successful connections.
- b.Close()
-
- select {
- case <-doneChan:
- case <-time.After(100 * time.Millisecond):
- t.Fatal("lbWatcher with closed balancer didn't close doneChan after 100ms")
- }
-}
diff --git a/vendor/google.golang.org/grpc/codec.go b/vendor/google.golang.org/grpc/codec.go
index 905b048..43d81ed 100644
--- a/vendor/google.golang.org/grpc/codec.go
+++ b/vendor/google.golang.org/grpc/codec.go
@@ -69,6 +69,11 @@ func (p protoCodec) marshal(v interface{}, cb *cachedProtoBuffer) ([]byte, error
}
func (p protoCodec) Marshal(v interface{}) ([]byte, error) {
+ if pm, ok := v.(proto.Marshaler); ok {
+ // object can marshal itself, no need for buffer
+ return pm.Marshal()
+ }
+
cb := protoBufferPool.Get().(*cachedProtoBuffer)
out, err := p.marshal(v, cb)
@@ -79,10 +84,17 @@ func (p protoCodec) Marshal(v interface{}) ([]byte, error) {
}
func (p protoCodec) Unmarshal(data []byte, v interface{}) error {
+ protoMsg := v.(proto.Message)
+ protoMsg.Reset()
+
+ if pu, ok := protoMsg.(proto.Unmarshaler); ok {
+ // object can unmarshal itself, no need for buffer
+ return pu.Unmarshal(data)
+ }
+
cb := protoBufferPool.Get().(*cachedProtoBuffer)
cb.SetBuf(data)
- v.(proto.Message).Reset()
- err := cb.Unmarshal(v.(proto.Message))
+ err := cb.Unmarshal(protoMsg)
cb.SetBuf(nil)
protoBufferPool.Put(cb)
return err
@@ -92,13 +104,11 @@ func (protoCodec) String() string {
return "proto"
}
-var (
- protoBufferPool = &sync.Pool{
- New: func() interface{} {
- return &cachedProtoBuffer{
- Buffer: proto.Buffer{},
- lastMarshaledSize: 16,
- }
- },
- }
-)
+var protoBufferPool = &sync.Pool{
+ New: func() interface{} {
+ return &cachedProtoBuffer{
+ Buffer: proto.Buffer{},
+ lastMarshaledSize: 16,
+ }
+ },
+}
diff --git a/vendor/google.golang.org/grpc/codec_benchmark_test.go b/vendor/google.golang.org/grpc/codec_benchmark_test.go
index dee617c..2286fd8 100644
--- a/vendor/google.golang.org/grpc/codec_benchmark_test.go
+++ b/vendor/google.golang.org/grpc/codec_benchmark_test.go
@@ -28,7 +28,7 @@ import (
"google.golang.org/grpc/test/codec_perf"
)
-func setupBenchmarkProtoCodecInputs(b *testing.B, payloadBaseSize uint32) []proto.Message {
+func setupBenchmarkProtoCodecInputs(payloadBaseSize uint32) []proto.Message {
payloadBase := make([]byte, payloadBaseSize)
// arbitrary byte slices
payloadSuffixes := [][]byte{
@@ -59,23 +59,21 @@ func BenchmarkProtoCodec(b *testing.B) {
payloadBaseSizes = append(payloadBaseSizes, 1<= Code(len(_Code_index)-1) {
- return fmt.Sprintf("Code(%d)", i)
+func (c Code) String() string {
+ switch c {
+ case OK:
+ return "OK"
+ case Canceled:
+ return "Canceled"
+ case Unknown:
+ return "Unknown"
+ case InvalidArgument:
+ return "InvalidArgument"
+ case DeadlineExceeded:
+ return "DeadlineExceeded"
+ case NotFound:
+ return "NotFound"
+ case AlreadyExists:
+ return "AlreadyExists"
+ case PermissionDenied:
+ return "PermissionDenied"
+ case ResourceExhausted:
+ return "ResourceExhausted"
+ case FailedPrecondition:
+ return "FailedPrecondition"
+ case Aborted:
+ return "Aborted"
+ case OutOfRange:
+ return "OutOfRange"
+ case Unimplemented:
+ return "Unimplemented"
+ case Internal:
+ return "Internal"
+ case Unavailable:
+ return "Unavailable"
+ case DataLoss:
+ return "DataLoss"
+ case Unauthenticated:
+ return "Unauthenticated"
+ default:
+ return "Code(" + strconv.FormatInt(int64(c), 10) + ")"
}
- return _Code_name[_Code_index[i]:_Code_index[i+1]]
}
diff --git a/vendor/google.golang.org/grpc/codes/codes.go b/vendor/google.golang.org/grpc/codes/codes.go
index 21e7733..f3719d5 100644
--- a/vendor/google.golang.org/grpc/codes/codes.go
+++ b/vendor/google.golang.org/grpc/codes/codes.go
@@ -19,12 +19,13 @@
// Package codes defines the canonical error codes used by gRPC. It is
// consistent across various languages.
package codes // import "google.golang.org/grpc/codes"
+import (
+ "fmt"
+)
// A Code is an unsigned 32-bit error code as defined in the gRPC spec.
type Code uint32
-//go:generate stringer -type=Code
-
const (
// OK is returned on success.
OK Code = 0
@@ -142,3 +143,41 @@ const (
// DataLoss indicates unrecoverable data loss or corruption.
DataLoss Code = 15
)
+
+var strToCode = map[string]Code{
+ `"OK"`: OK,
+ `"CANCELLED"`:/* [sic] */ Canceled,
+ `"UNKNOWN"`: Unknown,
+ `"INVALID_ARGUMENT"`: InvalidArgument,
+ `"DEADLINE_EXCEEDED"`: DeadlineExceeded,
+ `"NOT_FOUND"`: NotFound,
+ `"ALREADY_EXISTS"`: AlreadyExists,
+ `"PERMISSION_DENIED"`: PermissionDenied,
+ `"RESOURCE_EXHAUSTED"`: ResourceExhausted,
+ `"FAILED_PRECONDITION"`: FailedPrecondition,
+ `"ABORTED"`: Aborted,
+ `"OUT_OF_RANGE"`: OutOfRange,
+ `"UNIMPLEMENTED"`: Unimplemented,
+ `"INTERNAL"`: Internal,
+ `"UNAVAILABLE"`: Unavailable,
+ `"DATA_LOSS"`: DataLoss,
+ `"UNAUTHENTICATED"`: Unauthenticated,
+}
+
+// UnmarshalJSON unmarshals b into the Code.
+func (c *Code) UnmarshalJSON(b []byte) error {
+ // From json.Unmarshaler: By convention, to approximate the behavior of
+ // Unmarshal itself, Unmarshalers implement UnmarshalJSON([]byte("null")) as
+ // a no-op.
+ if string(b) == "null" {
+ return nil
+ }
+ if c == nil {
+ return fmt.Errorf("nil receiver passed to UnmarshalJSON")
+ }
+ if jc, ok := strToCode[string(b)]; ok {
+ *c = jc
+ return nil
+ }
+ return fmt.Errorf("invalid code: %q", string(b))
+}
diff --git a/vendor/google.golang.org/grpc/codes/codes_test.go b/vendor/google.golang.org/grpc/codes/codes_test.go
new file mode 100644
index 0000000..1e3b991
--- /dev/null
+++ b/vendor/google.golang.org/grpc/codes/codes_test.go
@@ -0,0 +1,64 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package codes
+
+import (
+ "encoding/json"
+ "reflect"
+ "testing"
+
+ cpb "google.golang.org/genproto/googleapis/rpc/code"
+)
+
+func TestUnmarshalJSON(t *testing.T) {
+ for s, v := range cpb.Code_value {
+ want := Code(v)
+ var got Code
+ if err := got.UnmarshalJSON([]byte(`"` + s + `"`)); err != nil || got != want {
+ t.Errorf("got.UnmarshalJSON(%q) = %v; want . got=%v; want %v", s, err, got, want)
+ }
+ }
+}
+
+func TestJSONUnmarshal(t *testing.T) {
+ var got []Code
+ want := []Code{OK, NotFound, Internal, Canceled}
+ in := `["OK", "NOT_FOUND", "INTERNAL", "CANCELLED"]`
+ err := json.Unmarshal([]byte(in), &got)
+ if err != nil || !reflect.DeepEqual(got, want) {
+ t.Fatalf("json.Unmarshal(%q, &got) = %v; want . got=%v; want %v", in, err, got, want)
+ }
+}
+
+func TestUnmarshalJSON_NilReceiver(t *testing.T) {
+ var got *Code
+ in := OK.String()
+ if err := got.UnmarshalJSON([]byte(in)); err == nil {
+ t.Errorf("got.UnmarshalJSON(%q) = nil; want . got=%v", in, got)
+ }
+}
+
+func TestUnmarshalJSON_UnknownInput(t *testing.T) {
+ var got Code
+ for _, in := range [][]byte{[]byte(""), []byte("xxx"), []byte("Code(17)"), nil} {
+ if err := got.UnmarshalJSON([]byte(in)); err == nil {
+ t.Errorf("got.UnmarshalJSON(%q) = nil; want . got=%v", in, got)
+ }
+ }
+}
diff --git a/vendor/google.golang.org/grpc/credentials/credentials.go b/vendor/google.golang.org/grpc/credentials/credentials.go
index 2475fe8..1d2e864 100644
--- a/vendor/google.golang.org/grpc/credentials/credentials.go
+++ b/vendor/google.golang.org/grpc/credentials/credentials.go
@@ -34,10 +34,8 @@ import (
"golang.org/x/net/context"
)
-var (
- // alpnProtoStr are the specified application level protocols for gRPC.
- alpnProtoStr = []string{"h2"}
-)
+// alpnProtoStr are the specified application level protocols for gRPC.
+var alpnProtoStr = []string{"h2"}
// PerRPCCredentials defines the common interface for the credentials which need to
// attach security information to every RPC (e.g., oauth2).
@@ -74,11 +72,9 @@ type AuthInfo interface {
AuthType() string
}
-var (
- // ErrConnDispatched indicates that rawConn has been dispatched out of gRPC
- // and the caller should not close rawConn.
- ErrConnDispatched = errors.New("credentials: rawConn is dispatched out of gRPC")
-)
+// ErrConnDispatched indicates that rawConn has been dispatched out of gRPC
+// and the caller should not close rawConn.
+var ErrConnDispatched = errors.New("credentials: rawConn is dispatched out of gRPC")
// TransportCredentials defines the common interface for all the live gRPC wire
// protocols and supported transport security protocols (e.g., TLS, SSL).
@@ -91,10 +87,14 @@ type TransportCredentials interface {
// (io.EOF, context.DeadlineExceeded or err.Temporary() == true).
// If the returned error is a wrapper error, implementations should make sure that
// the error implements Temporary() to have the correct retry behaviors.
+ //
+ // If the returned net.Conn is closed, it MUST close the net.Conn provided.
ClientHandshake(context.Context, string, net.Conn) (net.Conn, AuthInfo, error)
// ServerHandshake does the authentication handshake for servers. It returns
// the authenticated connection and the corresponding auth information about
// the connection.
+ //
+ // If the returned net.Conn is closed, it MUST close the net.Conn provided.
ServerHandshake(net.Conn) (net.Conn, AuthInfo, error)
// Info provides the ProtocolInfo of this TransportCredentials.
Info() ProtocolInfo
@@ -131,15 +131,15 @@ func (c tlsCreds) Info() ProtocolInfo {
}
}
-func (c *tlsCreds) ClientHandshake(ctx context.Context, addr string, rawConn net.Conn) (_ net.Conn, _ AuthInfo, err error) {
+func (c *tlsCreds) ClientHandshake(ctx context.Context, authority string, rawConn net.Conn) (_ net.Conn, _ AuthInfo, err error) {
// use local cfg to avoid clobbering ServerName if using multiple endpoints
cfg := cloneTLSConfig(c.config)
if cfg.ServerName == "" {
- colonPos := strings.LastIndex(addr, ":")
+ colonPos := strings.LastIndex(authority, ":")
if colonPos == -1 {
- colonPos = len(addr)
+ colonPos = len(authority)
}
- cfg.ServerName = addr[:colonPos]
+ cfg.ServerName = authority[:colonPos]
}
conn := tls.Client(rawConn, cfg)
errChannel := make(chan error, 1)
diff --git a/vendor/google.golang.org/grpc/credentials/credentials_test.go b/vendor/google.golang.org/grpc/credentials/credentials_test.go
index af40786..9b13db5 100644
--- a/vendor/google.golang.org/grpc/credentials/credentials_test.go
+++ b/vendor/google.golang.org/grpc/credentials/credentials_test.go
@@ -128,7 +128,7 @@ func launchServer(t *testing.T, hs serverHandshake, done chan AuthInfo) net.List
return lis
}
-// Is run in a seperate goroutine.
+// Is run in a separate goroutine.
func serverHandle(t *testing.T, hs serverHandshake, done chan AuthInfo, lis net.Listener) {
serverRawConn, err := lis.Accept()
if err != nil {
diff --git a/vendor/google.golang.org/grpc/encoding/encoding.go b/vendor/google.golang.org/grpc/encoding/encoding.go
new file mode 100644
index 0000000..47d10b0
--- /dev/null
+++ b/vendor/google.golang.org/grpc/encoding/encoding.go
@@ -0,0 +1,61 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// Package encoding defines the interface for the compressor and the functions
+// to register and get the compossor.
+// This package is EXPERIMENTAL.
+package encoding
+
+import (
+ "io"
+)
+
+var registerCompressor = make(map[string]Compressor)
+
+// Compressor is used for compressing and decompressing when sending or receiving messages.
+type Compressor interface {
+ // Compress writes the data written to wc to w after compressing it. If an error
+ // occurs while initializing the compressor, that error is returned instead.
+ Compress(w io.Writer) (io.WriteCloser, error)
+ // Decompress reads data from r, decompresses it, and provides the uncompressed data
+ // via the returned io.Reader. If an error occurs while initializing the decompressor, that error
+ // is returned instead.
+ Decompress(r io.Reader) (io.Reader, error)
+ // Name is the name of the compression codec and is used to set the content coding header.
+ Name() string
+}
+
+// RegisterCompressor registers the compressor with gRPC by its name. It can be activated when
+// sending an RPC via grpc.UseCompressor(). It will be automatically accessed when receiving a
+// message based on the content coding header. Servers also use it to send a response with the
+// same encoding as the request.
+//
+// NOTE: this function must only be called during initialization time (i.e. in an init() function). If
+// multiple Compressors are registered with the same name, the one registered last will take effect.
+func RegisterCompressor(c Compressor) {
+ registerCompressor[c.Name()] = c
+}
+
+// GetCompressor returns Compressor for the given compressor name.
+func GetCompressor(name string) Compressor {
+ return registerCompressor[name]
+}
+
+// Identity specifies the optional encoding for uncompressed streams.
+// It is intended for grpc internal use only.
+const Identity = "identity"
diff --git a/vendor/google.golang.org/grpc/go17.go b/vendor/google.golang.org/grpc/go17.go
index a3421d9..de23098 100644
--- a/vendor/google.golang.org/grpc/go17.go
+++ b/vendor/google.golang.org/grpc/go17.go
@@ -22,6 +22,7 @@ package grpc
import (
"context"
+ "fmt"
"io"
"net"
"net/http"
@@ -41,7 +42,7 @@ func dialContext(ctx context.Context, network, address string) (net.Conn, error)
func sendHTTPRequest(ctx context.Context, req *http.Request, conn net.Conn) error {
req = req.WithContext(ctx)
if err := req.Write(conn); err != nil {
- return err
+ return fmt.Errorf("failed to write the HTTP request: %v", err)
}
return nil
}
diff --git a/vendor/google.golang.org/grpc/grpclb.go b/vendor/google.golang.org/grpc/grpclb.go
index afe4982..d14a5d4 100644
--- a/vendor/google.golang.org/grpc/grpclb.go
+++ b/vendor/google.golang.org/grpc/grpclb.go
@@ -19,21 +19,32 @@
package grpc
import (
- "errors"
- "fmt"
- "math/rand"
- "net"
+ "strconv"
+ "strings"
"sync"
"time"
"golang.org/x/net/context"
- "google.golang.org/grpc/codes"
- lbmpb "google.golang.org/grpc/grpclb/grpc_lb_v1/messages"
+ "google.golang.org/grpc/balancer"
+ "google.golang.org/grpc/connectivity"
+ lbpb "google.golang.org/grpc/grpclb/grpc_lb_v1/messages"
"google.golang.org/grpc/grpclog"
- "google.golang.org/grpc/metadata"
- "google.golang.org/grpc/naming"
+ "google.golang.org/grpc/resolver"
)
+const (
+ lbTokeyKey = "lb-token"
+ defaultFallbackTimeout = 10 * time.Second
+ grpclbName = "grpclb"
+)
+
+func convertDuration(d *lbpb.Duration) time.Duration {
+ if d == nil {
+ return 0
+ }
+ return time.Duration(d.Seconds)*time.Second + time.Duration(d.Nanos)*time.Nanosecond
+}
+
// Client API for LoadBalancer service.
// Mostly copied from generated pb.go file.
// To avoid circular dependency.
@@ -59,650 +70,273 @@ type balanceLoadClientStream struct {
ClientStream
}
-func (x *balanceLoadClientStream) Send(m *lbmpb.LoadBalanceRequest) error {
+func (x *balanceLoadClientStream) Send(m *lbpb.LoadBalanceRequest) error {
return x.ClientStream.SendMsg(m)
}
-func (x *balanceLoadClientStream) Recv() (*lbmpb.LoadBalanceResponse, error) {
- m := new(lbmpb.LoadBalanceResponse)
+func (x *balanceLoadClientStream) Recv() (*lbpb.LoadBalanceResponse, error) {
+ m := new(lbpb.LoadBalanceResponse)
if err := x.ClientStream.RecvMsg(m); err != nil {
return nil, err
}
return m, nil
}
-// NewGRPCLBBalancer creates a grpclb load balancer.
-func NewGRPCLBBalancer(r naming.Resolver) Balancer {
- return &balancer{
- r: r,
+func init() {
+ balancer.Register(newLBBuilder())
+}
+
+// newLBBuilder creates a builder for grpclb.
+func newLBBuilder() balancer.Builder {
+ return NewLBBuilderWithFallbackTimeout(defaultFallbackTimeout)
+}
+
+// NewLBBuilderWithFallbackTimeout creates a grpclb builder with the given
+// fallbackTimeout. If no response is received from the remote balancer within
+// fallbackTimeout, the backend addresses from the resolved address list will be
+// used.
+//
+// Only call this function when a non-default fallback timeout is needed.
+func NewLBBuilderWithFallbackTimeout(fallbackTimeout time.Duration) balancer.Builder {
+ return &lbBuilder{
+ fallbackTimeout: fallbackTimeout,
}
}
-type remoteBalancerInfo struct {
- addr string
- // the server name used for authentication with the remote LB server.
- name string
+type lbBuilder struct {
+ fallbackTimeout time.Duration
}
-// grpclbAddrInfo consists of the information of a backend server.
-type grpclbAddrInfo struct {
- addr Address
- connected bool
- // dropForRateLimiting indicates whether this particular request should be
- // dropped by the client for rate limiting.
- dropForRateLimiting bool
- // dropForLoadBalancing indicates whether this particular request should be
- // dropped by the client for load balancing.
- dropForLoadBalancing bool
+func (b *lbBuilder) Name() string {
+ return grpclbName
}
-type balancer struct {
- r naming.Resolver
- target string
- mu sync.Mutex
- seq int // a sequence number to make sure addrCh does not get stale addresses.
- w naming.Watcher
- addrCh chan []Address
- rbs []remoteBalancerInfo
- addrs []*grpclbAddrInfo
- next int
- waitCh chan struct{}
- done bool
- rand *rand.Rand
+func (b *lbBuilder) Build(cc balancer.ClientConn, opt balancer.BuildOptions) balancer.Balancer {
+ // This generates a manual resolver builder with a random scheme. This
+ // scheme will be used to dial to remote LB, so we can send filtered address
+ // updates to remote LB ClientConn using this manual resolver.
+ scheme := "grpclb_internal_" + strconv.FormatInt(time.Now().UnixNano(), 36)
+ r := &lbManualResolver{scheme: scheme, ccb: cc}
- clientStats lbmpb.ClientStats
+ var target string
+ targetSplitted := strings.Split(cc.Target(), ":///")
+ if len(targetSplitted) < 2 {
+ target = cc.Target()
+ } else {
+ target = targetSplitted[1]
+ }
+
+ lb := &lbBalancer{
+ cc: cc,
+ target: target,
+ opt: opt,
+ fallbackTimeout: b.fallbackTimeout,
+ doneCh: make(chan struct{}),
+
+ manualResolver: r,
+ csEvltr: &connectivityStateEvaluator{},
+ subConns: make(map[resolver.Address]balancer.SubConn),
+ scStates: make(map[balancer.SubConn]connectivity.State),
+ picker: &errPicker{err: balancer.ErrNoSubConnAvailable},
+ clientStats: &rpcStats{},
+ }
+
+ return lb
}
-func (b *balancer) watchAddrUpdates(w naming.Watcher, ch chan []remoteBalancerInfo) error {
- updates, err := w.Next()
- if err != nil {
- grpclog.Warningf("grpclb: failed to get next addr update from watcher: %v", err)
- return err
- }
- b.mu.Lock()
- defer b.mu.Unlock()
- if b.done {
- return ErrClientConnClosing
- }
- for _, update := range updates {
- switch update.Op {
- case naming.Add:
- var exist bool
- for _, v := range b.rbs {
- // TODO: Is the same addr with different server name a different balancer?
- if update.Addr == v.addr {
- exist = true
- break
- }
- }
- if exist {
- continue
- }
- md, ok := update.Metadata.(*naming.AddrMetadataGRPCLB)
- if !ok {
- // TODO: Revisit the handling here and may introduce some fallback mechanism.
- grpclog.Errorf("The name resolution contains unexpected metadata %v", update.Metadata)
- continue
- }
- switch md.AddrType {
- case naming.Backend:
- // TODO: Revisit the handling here and may introduce some fallback mechanism.
- grpclog.Errorf("The name resolution does not give grpclb addresses")
- continue
- case naming.GRPCLB:
- b.rbs = append(b.rbs, remoteBalancerInfo{
- addr: update.Addr,
- name: md.ServerName,
- })
- default:
- grpclog.Errorf("Received unknow address type %d", md.AddrType)
- continue
- }
- case naming.Delete:
- for i, v := range b.rbs {
- if update.Addr == v.addr {
- copy(b.rbs[i:], b.rbs[i+1:])
- b.rbs = b.rbs[:len(b.rbs)-1]
- break
- }
- }
- default:
- grpclog.Errorf("Unknown update.Op %v", update.Op)
- }
- }
- // TODO: Fall back to the basic round-robin load balancing if the resulting address is
- // not a load balancer.
- select {
- case <-ch:
- default:
- }
- ch <- b.rbs
- return nil
+type lbBalancer struct {
+ cc balancer.ClientConn
+ target string
+ opt balancer.BuildOptions
+ fallbackTimeout time.Duration
+ doneCh chan struct{}
+
+ // manualResolver is used in the remote LB ClientConn inside grpclb. When
+ // resolved address updates are received by grpclb, filtered updates will be
+ // send to remote LB ClientConn through this resolver.
+ manualResolver *lbManualResolver
+ // The ClientConn to talk to the remote balancer.
+ ccRemoteLB *ClientConn
+
+ // Support client side load reporting. Each picker gets a reference to this,
+ // and will update its content.
+ clientStats *rpcStats
+
+ mu sync.Mutex // guards everything following.
+ // The full server list including drops, used to check if the newly received
+ // serverList contains anything new. Each generate picker will also have
+ // reference to this list to do the first layer pick.
+ fullServerList []*lbpb.Server
+ // All backends addresses, with metadata set to nil. This list contains all
+ // backend addresses in the same order and with the same duplicates as in
+ // serverlist. When generating picker, a SubConn slice with the same order
+ // but with only READY SCs will be gerenated.
+ backendAddrs []resolver.Address
+ // Roundrobin functionalities.
+ csEvltr *connectivityStateEvaluator
+ state connectivity.State
+ subConns map[resolver.Address]balancer.SubConn // Used to new/remove SubConn.
+ scStates map[balancer.SubConn]connectivity.State // Used to filter READY SubConns.
+ picker balancer.Picker
+ // Support fallback to resolved backend addresses if there's no response
+ // from remote balancer within fallbackTimeout.
+ fallbackTimerExpired bool
+ serverListReceived bool
+ // resolvedBackendAddrs is resolvedAddrs minus remote balancers. It's set
+ // when resolved address updates are received, and read in the goroutine
+ // handling fallback.
+ resolvedBackendAddrs []resolver.Address
}
-func convertDuration(d *lbmpb.Duration) time.Duration {
- if d == nil {
- return 0
- }
- return time.Duration(d.Seconds)*time.Second + time.Duration(d.Nanos)*time.Nanosecond
-}
-
-func (b *balancer) processServerList(l *lbmpb.ServerList, seq int) {
- if l == nil {
+// regeneratePicker takes a snapshot of the balancer, and generates a picker from
+// it. The picker
+// - always returns ErrTransientFailure if the balancer is in TransientFailure,
+// - does two layer roundrobin pick otherwise.
+// Caller must hold lb.mu.
+func (lb *lbBalancer) regeneratePicker() {
+ if lb.state == connectivity.TransientFailure {
+ lb.picker = &errPicker{err: balancer.ErrTransientFailure}
return
}
- servers := l.GetServers()
- var (
- sl []*grpclbAddrInfo
- addrs []Address
- )
- for _, s := range servers {
- md := metadata.Pairs("lb-token", s.LoadBalanceToken)
- ip := net.IP(s.IpAddress)
- ipStr := ip.String()
- if ip.To4() == nil {
- // Add square brackets to ipv6 addresses, otherwise net.Dial() and
- // net.SplitHostPort() will return too many colons error.
- ipStr = fmt.Sprintf("[%s]", ipStr)
+ var readySCs []balancer.SubConn
+ for _, a := range lb.backendAddrs {
+ if sc, ok := lb.subConns[a]; ok {
+ if st, ok := lb.scStates[sc]; ok && st == connectivity.Ready {
+ readySCs = append(readySCs, sc)
+ }
}
- addr := Address{
- Addr: fmt.Sprintf("%s:%d", ipStr, s.Port),
- Metadata: &md,
- }
- sl = append(sl, &grpclbAddrInfo{
- addr: addr,
- dropForRateLimiting: s.DropForRateLimiting,
- dropForLoadBalancing: s.DropForLoadBalancing,
- })
- addrs = append(addrs, addr)
}
- b.mu.Lock()
- defer b.mu.Unlock()
- if b.done || seq < b.seq {
+
+ if len(lb.fullServerList) <= 0 {
+ if len(readySCs) <= 0 {
+ lb.picker = &errPicker{err: balancer.ErrNoSubConnAvailable}
+ return
+ }
+ lb.picker = &rrPicker{subConns: readySCs}
return
}
- if len(sl) > 0 {
- // reset b.next to 0 when replacing the server list.
- b.next = 0
- b.addrs = sl
- b.addrCh <- addrs
+ lb.picker = &lbPicker{
+ serverList: lb.fullServerList,
+ subConns: readySCs,
+ stats: lb.clientStats,
}
return
}
-func (b *balancer) sendLoadReport(s *balanceLoadClientStream, interval time.Duration, done <-chan struct{}) {
- ticker := time.NewTicker(interval)
- defer ticker.Stop()
- for {
- select {
- case <-ticker.C:
- case <-done:
- return
- }
- b.mu.Lock()
- stats := b.clientStats
- b.clientStats = lbmpb.ClientStats{} // Clear the stats.
- b.mu.Unlock()
- t := time.Now()
- stats.Timestamp = &lbmpb.Timestamp{
- Seconds: t.Unix(),
- Nanos: int32(t.Nanosecond()),
- }
- if err := s.Send(&lbmpb.LoadBalanceRequest{
- LoadBalanceRequestType: &lbmpb.LoadBalanceRequest_ClientStats{
- ClientStats: &stats,
- },
- }); err != nil {
- grpclog.Errorf("grpclb: failed to send load report: %v", err)
- return
- }
- }
-}
+func (lb *lbBalancer) HandleSubConnStateChange(sc balancer.SubConn, s connectivity.State) {
+ grpclog.Infof("lbBalancer: handle SubConn state change: %p, %v", sc, s)
+ lb.mu.Lock()
+ defer lb.mu.Unlock()
-func (b *balancer) callRemoteBalancer(lbc *loadBalancerClient, seq int) (retry bool) {
- ctx, cancel := context.WithCancel(context.Background())
- defer cancel()
- stream, err := lbc.BalanceLoad(ctx)
- if err != nil {
- grpclog.Errorf("grpclb: failed to perform RPC to the remote balancer %v", err)
+ oldS, ok := lb.scStates[sc]
+ if !ok {
+ grpclog.Infof("lbBalancer: got state changes for an unknown SubConn: %p, %v", sc, s)
return
}
- b.mu.Lock()
- if b.done {
- b.mu.Unlock()
+ lb.scStates[sc] = s
+ switch s {
+ case connectivity.Idle:
+ sc.Connect()
+ case connectivity.Shutdown:
+ // When an address was removed by resolver, b called RemoveSubConn but
+ // kept the sc's state in scStates. Remove state for this sc here.
+ delete(lb.scStates, sc)
+ }
+
+ oldAggrState := lb.state
+ lb.state = lb.csEvltr.recordTransition(oldS, s)
+
+ // Regenerate picker when one of the following happens:
+ // - this sc became ready from not-ready
+ // - this sc became not-ready from ready
+ // - the aggregated state of balancer became TransientFailure from non-TransientFailure
+ // - the aggregated state of balancer became non-TransientFailure from TransientFailure
+ if (oldS == connectivity.Ready) != (s == connectivity.Ready) ||
+ (lb.state == connectivity.TransientFailure) != (oldAggrState == connectivity.TransientFailure) {
+ lb.regeneratePicker()
+ }
+
+ lb.cc.UpdateBalancerState(lb.state, lb.picker)
+ return
+}
+
+// fallbackToBackendsAfter blocks for fallbackTimeout and falls back to use
+// resolved backends (backends received from resolver, not from remote balancer)
+// if no connection to remote balancers was successful.
+func (lb *lbBalancer) fallbackToBackendsAfter(fallbackTimeout time.Duration) {
+ timer := time.NewTimer(fallbackTimeout)
+ defer timer.Stop()
+ select {
+ case <-timer.C:
+ case <-lb.doneCh:
return
}
- b.mu.Unlock()
- initReq := &lbmpb.LoadBalanceRequest{
- LoadBalanceRequestType: &lbmpb.LoadBalanceRequest_InitialRequest{
- InitialRequest: &lbmpb.InitialLoadBalanceRequest{
- Name: b.target,
- },
- },
- }
- if err := stream.Send(initReq); err != nil {
- grpclog.Errorf("grpclb: failed to send init request: %v", err)
- // TODO: backoff on retry?
- return true
- }
- reply, err := stream.Recv()
- if err != nil {
- grpclog.Errorf("grpclb: failed to recv init response: %v", err)
- // TODO: backoff on retry?
- return true
- }
- initResp := reply.GetInitialResponse()
- if initResp == nil {
- grpclog.Errorf("grpclb: reply from remote balancer did not include initial response.")
+ lb.mu.Lock()
+ if lb.serverListReceived {
+ lb.mu.Unlock()
return
}
- // TODO: Support delegation.
- if initResp.LoadBalancerDelegate != "" {
- // delegation
- grpclog.Errorf("TODO: Delegation is not supported yet.")
+ lb.fallbackTimerExpired = true
+ lb.refreshSubConns(lb.resolvedBackendAddrs)
+ lb.mu.Unlock()
+}
+
+// HandleResolvedAddrs sends the updated remoteLB addresses to remoteLB
+// clientConn. The remoteLB clientConn will handle creating/removing remoteLB
+// connections.
+func (lb *lbBalancer) HandleResolvedAddrs(addrs []resolver.Address, err error) {
+ grpclog.Infof("lbBalancer: handleResolvedResult: %+v", addrs)
+ if len(addrs) <= 0 {
return
}
- streamDone := make(chan struct{})
- defer close(streamDone)
- b.mu.Lock()
- b.clientStats = lbmpb.ClientStats{} // Clear client stats.
- b.mu.Unlock()
- if d := convertDuration(initResp.ClientStatsReportInterval); d > 0 {
- go b.sendLoadReport(stream, d, streamDone)
- }
- // Retrieve the server list.
- for {
- reply, err := stream.Recv()
- if err != nil {
- grpclog.Errorf("grpclb: failed to recv server list: %v", err)
- break
+
+ var remoteBalancerAddrs, backendAddrs []resolver.Address
+ for _, a := range addrs {
+ if a.Type == resolver.GRPCLB {
+ remoteBalancerAddrs = append(remoteBalancerAddrs, a)
+ } else {
+ backendAddrs = append(backendAddrs, a)
}
- b.mu.Lock()
- if b.done || seq < b.seq {
- b.mu.Unlock()
+ }
+
+ if lb.ccRemoteLB == nil {
+ if len(remoteBalancerAddrs) <= 0 {
+ grpclog.Errorf("grpclb: no remote balancer address is available, should never happen")
return
}
- b.seq++ // tick when receiving a new list of servers.
- seq = b.seq
- b.mu.Unlock()
- if serverList := reply.GetServerList(); serverList != nil {
- b.processServerList(serverList, seq)
- }
+ // First time receiving resolved addresses, create a cc to remote
+ // balancers.
+ lb.dialRemoteLB(remoteBalancerAddrs[0].ServerName)
+ // Start the fallback goroutine.
+ go lb.fallbackToBackendsAfter(lb.fallbackTimeout)
}
- return true
+
+ // cc to remote balancers uses lb.manualResolver. Send the updated remote
+ // balancer addresses to it through manualResolver.
+ lb.manualResolver.NewAddress(remoteBalancerAddrs)
+
+ lb.mu.Lock()
+ lb.resolvedBackendAddrs = backendAddrs
+ // If serverListReceived is true, connection to remote balancer was
+ // successful and there's no need to do fallback anymore.
+ // If fallbackTimerExpired is false, fallback hasn't happened yet.
+ if !lb.serverListReceived && lb.fallbackTimerExpired {
+ // This means we received a new list of resolved backends, and we are
+ // still in fallback mode. Need to update the list of backends we are
+ // using to the new list of backends.
+ lb.refreshSubConns(lb.resolvedBackendAddrs)
+ }
+ lb.mu.Unlock()
}
-func (b *balancer) Start(target string, config BalancerConfig) error {
- b.rand = rand.New(rand.NewSource(time.Now().Unix()))
- // TODO: Fall back to the basic direct connection if there is no name resolver.
- if b.r == nil {
- return errors.New("there is no name resolver installed")
- }
- b.target = target
- b.mu.Lock()
- if b.done {
- b.mu.Unlock()
- return ErrClientConnClosing
- }
- b.addrCh = make(chan []Address)
- w, err := b.r.Resolve(target)
- if err != nil {
- b.mu.Unlock()
- grpclog.Errorf("grpclb: failed to resolve address: %v, err: %v", target, err)
- return err
- }
- b.w = w
- b.mu.Unlock()
- balancerAddrsCh := make(chan []remoteBalancerInfo, 1)
- // Spawn a goroutine to monitor the name resolution of remote load balancer.
- go func() {
- for {
- if err := b.watchAddrUpdates(w, balancerAddrsCh); err != nil {
- grpclog.Warningf("grpclb: the naming watcher stops working due to %v.\n", err)
- close(balancerAddrsCh)
- return
- }
- }
- }()
- // Spawn a goroutine to talk to the remote load balancer.
- go func() {
- var (
- cc *ClientConn
- // ccError is closed when there is an error in the current cc.
- // A new rb should be picked from rbs and connected.
- ccError chan struct{}
- rb *remoteBalancerInfo
- rbs []remoteBalancerInfo
- rbIdx int
- )
-
- defer func() {
- if ccError != nil {
- select {
- case <-ccError:
- default:
- close(ccError)
- }
- }
- if cc != nil {
- cc.Close()
- }
- }()
-
- for {
- var ok bool
- select {
- case rbs, ok = <-balancerAddrsCh:
- if !ok {
- return
- }
- foundIdx := -1
- if rb != nil {
- for i, trb := range rbs {
- if trb == *rb {
- foundIdx = i
- break
- }
- }
- }
- if foundIdx >= 0 {
- if foundIdx >= 1 {
- // Move the address in use to the beginning of the list.
- b.rbs[0], b.rbs[foundIdx] = b.rbs[foundIdx], b.rbs[0]
- rbIdx = 0
- }
- continue // If found, don't dial new cc.
- } else if len(rbs) > 0 {
- // Pick a random one from the list, instead of always using the first one.
- if l := len(rbs); l > 1 && rb != nil {
- tmpIdx := b.rand.Intn(l - 1)
- b.rbs[0], b.rbs[tmpIdx] = b.rbs[tmpIdx], b.rbs[0]
- }
- rbIdx = 0
- rb = &rbs[0]
- } else {
- // foundIdx < 0 && len(rbs) <= 0.
- rb = nil
- }
- case <-ccError:
- ccError = nil
- if rbIdx < len(rbs)-1 {
- rbIdx++
- rb = &rbs[rbIdx]
- } else {
- rb = nil
- }
- }
-
- if rb == nil {
- continue
- }
-
- if cc != nil {
- cc.Close()
- }
- // Talk to the remote load balancer to get the server list.
- var (
- err error
- dopts []DialOption
- )
- if creds := config.DialCreds; creds != nil {
- if rb.name != "" {
- if err := creds.OverrideServerName(rb.name); err != nil {
- grpclog.Warningf("grpclb: failed to override the server name in the credentials: %v", err)
- continue
- }
- }
- dopts = append(dopts, WithTransportCredentials(creds))
- } else {
- dopts = append(dopts, WithInsecure())
- }
- if dialer := config.Dialer; dialer != nil {
- // WithDialer takes a different type of function, so we instead use a special DialOption here.
- dopts = append(dopts, func(o *dialOptions) { o.copts.Dialer = dialer })
- }
- ccError = make(chan struct{})
- cc, err = Dial(rb.addr, dopts...)
- if err != nil {
- grpclog.Warningf("grpclb: failed to setup a connection to the remote balancer %v: %v", rb.addr, err)
- close(ccError)
- continue
- }
- b.mu.Lock()
- b.seq++ // tick when getting a new balancer address
- seq := b.seq
- b.next = 0
- b.mu.Unlock()
- go func(cc *ClientConn, ccError chan struct{}) {
- lbc := &loadBalancerClient{cc}
- b.callRemoteBalancer(lbc, seq)
- cc.Close()
- select {
- case <-ccError:
- default:
- close(ccError)
- }
- }(cc, ccError)
- }
- }()
- return nil
-}
-
-func (b *balancer) down(addr Address, err error) {
- b.mu.Lock()
- defer b.mu.Unlock()
- for _, a := range b.addrs {
- if addr == a.addr {
- a.connected = false
- break
- }
- }
-}
-
-func (b *balancer) Up(addr Address) func(error) {
- b.mu.Lock()
- defer b.mu.Unlock()
- if b.done {
- return nil
- }
- var cnt int
- for _, a := range b.addrs {
- if a.addr == addr {
- if a.connected {
- return nil
- }
- a.connected = true
- }
- if a.connected && !a.dropForRateLimiting && !a.dropForLoadBalancing {
- cnt++
- }
- }
- // addr is the only one which is connected. Notify the Get() callers who are blocking.
- if cnt == 1 && b.waitCh != nil {
- close(b.waitCh)
- b.waitCh = nil
- }
- return func(err error) {
- b.down(addr, err)
- }
-}
-
-func (b *balancer) Get(ctx context.Context, opts BalancerGetOptions) (addr Address, put func(), err error) {
- var ch chan struct{}
- b.mu.Lock()
- if b.done {
- b.mu.Unlock()
- err = ErrClientConnClosing
+func (lb *lbBalancer) Close() {
+ select {
+ case <-lb.doneCh:
return
+ default:
}
- seq := b.seq
-
- defer func() {
- if err != nil {
- return
- }
- put = func() {
- s, ok := rpcInfoFromContext(ctx)
- if !ok {
- return
- }
- b.mu.Lock()
- defer b.mu.Unlock()
- if b.done || seq < b.seq {
- return
- }
- b.clientStats.NumCallsFinished++
- if !s.bytesSent {
- b.clientStats.NumCallsFinishedWithClientFailedToSend++
- } else if s.bytesReceived {
- b.clientStats.NumCallsFinishedKnownReceived++
- }
- }
- }()
-
- b.clientStats.NumCallsStarted++
- if len(b.addrs) > 0 {
- if b.next >= len(b.addrs) {
- b.next = 0
- }
- next := b.next
- for {
- a := b.addrs[next]
- next = (next + 1) % len(b.addrs)
- if a.connected {
- if !a.dropForRateLimiting && !a.dropForLoadBalancing {
- addr = a.addr
- b.next = next
- b.mu.Unlock()
- return
- }
- if !opts.BlockingWait {
- b.next = next
- if a.dropForLoadBalancing {
- b.clientStats.NumCallsFinished++
- b.clientStats.NumCallsFinishedWithDropForLoadBalancing++
- } else if a.dropForRateLimiting {
- b.clientStats.NumCallsFinished++
- b.clientStats.NumCallsFinishedWithDropForRateLimiting++
- }
- b.mu.Unlock()
- err = Errorf(codes.Unavailable, "%s drops requests", a.addr.Addr)
- return
- }
- }
- if next == b.next {
- // Has iterated all the possible address but none is connected.
- break
- }
- }
- }
- if !opts.BlockingWait {
- if len(b.addrs) == 0 {
- b.clientStats.NumCallsFinished++
- b.clientStats.NumCallsFinishedWithClientFailedToSend++
- b.mu.Unlock()
- err = Errorf(codes.Unavailable, "there is no address available")
- return
- }
- // Returns the next addr on b.addrs for a failfast RPC.
- addr = b.addrs[b.next].addr
- b.next++
- b.mu.Unlock()
- return
- }
- // Wait on b.waitCh for non-failfast RPCs.
- if b.waitCh == nil {
- ch = make(chan struct{})
- b.waitCh = ch
- } else {
- ch = b.waitCh
- }
- b.mu.Unlock()
- for {
- select {
- case <-ctx.Done():
- b.mu.Lock()
- b.clientStats.NumCallsFinished++
- b.clientStats.NumCallsFinishedWithClientFailedToSend++
- b.mu.Unlock()
- err = ctx.Err()
- return
- case <-ch:
- b.mu.Lock()
- if b.done {
- b.clientStats.NumCallsFinished++
- b.clientStats.NumCallsFinishedWithClientFailedToSend++
- b.mu.Unlock()
- err = ErrClientConnClosing
- return
- }
-
- if len(b.addrs) > 0 {
- if b.next >= len(b.addrs) {
- b.next = 0
- }
- next := b.next
- for {
- a := b.addrs[next]
- next = (next + 1) % len(b.addrs)
- if a.connected {
- if !a.dropForRateLimiting && !a.dropForLoadBalancing {
- addr = a.addr
- b.next = next
- b.mu.Unlock()
- return
- }
- if !opts.BlockingWait {
- b.next = next
- if a.dropForLoadBalancing {
- b.clientStats.NumCallsFinished++
- b.clientStats.NumCallsFinishedWithDropForLoadBalancing++
- } else if a.dropForRateLimiting {
- b.clientStats.NumCallsFinished++
- b.clientStats.NumCallsFinishedWithDropForRateLimiting++
- }
- b.mu.Unlock()
- err = Errorf(codes.Unavailable, "drop requests for the addreess %s", a.addr.Addr)
- return
- }
- }
- if next == b.next {
- // Has iterated all the possible address but none is connected.
- break
- }
- }
- }
- // The newly added addr got removed by Down() again.
- if b.waitCh == nil {
- ch = make(chan struct{})
- b.waitCh = ch
- } else {
- ch = b.waitCh
- }
- b.mu.Unlock()
- }
+ close(lb.doneCh)
+ if lb.ccRemoteLB != nil {
+ lb.ccRemoteLB.Close()
}
}
-
-func (b *balancer) Notify() <-chan []Address {
- return b.addrCh
-}
-
-func (b *balancer) Close() error {
- b.mu.Lock()
- defer b.mu.Unlock()
- if b.done {
- return errBalancerClosed
- }
- b.done = true
- if b.waitCh != nil {
- close(b.waitCh)
- }
- if b.addrCh != nil {
- close(b.addrCh)
- }
- if b.w != nil {
- b.w.Close()
- }
- return nil
-}
diff --git a/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/messages/messages.proto b/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/messages/messages.proto
index 2ed0455..42d99c1 100644
--- a/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/messages/messages.proto
+++ b/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/messages/messages.proto
@@ -15,7 +15,7 @@
syntax = "proto3";
package grpc.lb.v1;
-option go_package = "messages";
+option go_package = "google.golang.org/grpc/grpclb/grpc_lb_v1/messages";
message Duration {
// Signed seconds of the span of time. Must be from -315,576,000,000
diff --git a/vendor/google.golang.org/grpc/grpclb/grpclb_test.go b/vendor/google.golang.org/grpc/grpclb/grpclb_test.go
index fd861af..d83ea6b 100644
--- a/vendor/google.golang.org/grpc/grpclb/grpclb_test.go
+++ b/vendor/google.golang.org/grpc/grpclb/grpclb_test.go
@@ -16,8 +16,8 @@
*
*/
-//go:generate protoc --go_out=plugins=:. grpc_lb_v1/messages/messages.proto
-//go:generate protoc --go_out=Mgrpc_lb_v1/messages/messages.proto=google.golang.org/grpc/grpclb/grpc_lb_v1/messages,plugins=grpc:. grpc_lb_v1/service/service.proto
+//go:generate protoc --go_out=plugins=:$GOPATH grpc_lb_v1/messages/messages.proto
+//go:generate protoc --go_out=plugins=grpc:$GOPATH grpc_lb_v1/service/service.proto
// Package grpclb_test is currently used only for grpclb testing.
package grpclb_test
@@ -27,6 +27,7 @@ import (
"fmt"
"io"
"net"
+ "strconv"
"strings"
"sync"
"testing"
@@ -35,19 +36,27 @@ import (
"github.com/golang/protobuf/proto"
"golang.org/x/net/context"
"google.golang.org/grpc"
+ "google.golang.org/grpc/balancer"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/credentials"
lbmpb "google.golang.org/grpc/grpclb/grpc_lb_v1/messages"
lbspb "google.golang.org/grpc/grpclb/grpc_lb_v1/service"
+ _ "google.golang.org/grpc/grpclog/glogger"
"google.golang.org/grpc/metadata"
- "google.golang.org/grpc/naming"
+ "google.golang.org/grpc/peer"
+ "google.golang.org/grpc/resolver"
+ "google.golang.org/grpc/resolver/manual"
+ "google.golang.org/grpc/status"
testpb "google.golang.org/grpc/test/grpc_testing"
+ "google.golang.org/grpc/test/leakcheck"
+
+ _ "google.golang.org/grpc/grpclog/glogger"
)
var (
- lbsn = "bar.com"
- besn = "foo.com"
- lbToken = "iamatoken"
+ lbServerName = "bar.com"
+ beServerName = "foo.com"
+ lbToken = "iamatoken"
// Resolver replaces localhost with fakeName in Next().
// Dialer replaces fakeName with localhost when dialing.
@@ -55,82 +64,6 @@ var (
fakeName = "fake.Name"
)
-type testWatcher struct {
- // the channel to receives name resolution updates
- update chan *naming.Update
- // the side channel to get to know how many updates in a batch
- side chan int
- // the channel to notifiy update injector that the update reading is done
- readDone chan int
-}
-
-func (w *testWatcher) Next() (updates []*naming.Update, err error) {
- n, ok := <-w.side
- if !ok {
- return nil, fmt.Errorf("w.side is closed")
- }
- for i := 0; i < n; i++ {
- u, ok := <-w.update
- if !ok {
- break
- }
- if u != nil {
- // Resolver replaces localhost with fakeName in Next().
- // Custom dialer will replace fakeName with localhost when dialing.
- u.Addr = strings.Replace(u.Addr, "localhost", fakeName, 1)
- updates = append(updates, u)
- }
- }
- w.readDone <- 0
- return
-}
-
-func (w *testWatcher) Close() {
-}
-
-// Inject naming resolution updates to the testWatcher.
-func (w *testWatcher) inject(updates []*naming.Update) {
- w.side <- len(updates)
- for _, u := range updates {
- w.update <- u
- }
- <-w.readDone
-}
-
-type testNameResolver struct {
- w *testWatcher
- addrs []string
-}
-
-func (r *testNameResolver) Resolve(target string) (naming.Watcher, error) {
- r.w = &testWatcher{
- update: make(chan *naming.Update, len(r.addrs)),
- side: make(chan int, 1),
- readDone: make(chan int),
- }
- r.w.side <- len(r.addrs)
- for _, addr := range r.addrs {
- r.w.update <- &naming.Update{
- Op: naming.Add,
- Addr: addr,
- Metadata: &naming.AddrMetadataGRPCLB{
- AddrType: naming.GRPCLB,
- ServerName: lbsn,
- },
- }
- }
- go func() {
- <-r.w.readDone
- }()
- return r.w, nil
-}
-
-func (r *testNameResolver) inject(updates []*naming.Update) {
- if r.w != nil {
- r.w.inject(updates)
- }
-}
-
type serverNameCheckCreds struct {
mu sync.Mutex
sn string
@@ -148,9 +81,19 @@ func (c *serverNameCheckCreds) ClientHandshake(ctx context.Context, addr string,
c.mu.Lock()
defer c.mu.Unlock()
b := make([]byte, len(c.expected))
- if _, err := rawConn.Read(b); err != nil {
- fmt.Printf("Failed to read the server name from the server %v", err)
- return nil, nil, err
+ errCh := make(chan error, 1)
+ go func() {
+ _, err := rawConn.Read(b)
+ errCh <- err
+ }()
+ select {
+ case err := <-errCh:
+ if err != nil {
+ fmt.Printf("Failed to read the server name from the server %v", err)
+ return nil, nil, err
+ }
+ case <-ctx.Done():
+ return nil, nil, ctx.Err()
}
if c.expected != string(b) {
fmt.Printf("Read the server name %s want %s", string(b), c.expected)
@@ -185,23 +128,22 @@ func fakeNameDialer(addr string, timeout time.Duration) (net.Conn, error) {
}
type remoteBalancer struct {
- sls []*lbmpb.ServerList
- intervals []time.Duration
+ sls chan *lbmpb.ServerList
statsDura time.Duration
done chan struct{}
mu sync.Mutex
stats lbmpb.ClientStats
}
-func newRemoteBalancer(sls []*lbmpb.ServerList, intervals []time.Duration) *remoteBalancer {
+func newRemoteBalancer(intervals []time.Duration) *remoteBalancer {
return &remoteBalancer{
- sls: sls,
- intervals: intervals,
- done: make(chan struct{}),
+ sls: make(chan *lbmpb.ServerList, 1),
+ done: make(chan struct{}),
}
}
func (b *remoteBalancer) stop() {
+ close(b.sls)
close(b.done)
}
@@ -211,8 +153,8 @@ func (b *remoteBalancer) BalanceLoad(stream lbspb.LoadBalancer_BalanceLoadServer
return err
}
initReq := req.GetInitialRequest()
- if initReq.Name != besn {
- return grpc.Errorf(codes.InvalidArgument, "invalid service name: %v", initReq.Name)
+ if initReq.Name != beServerName {
+ return status.Errorf(codes.InvalidArgument, "invalid service name: %v", initReq.Name)
}
resp := &lbmpb.LoadBalanceResponse{
LoadBalanceResponseType: &lbmpb.LoadBalanceResponse_InitialResponse{
@@ -246,8 +188,7 @@ func (b *remoteBalancer) BalanceLoad(stream lbspb.LoadBalancer_BalanceLoadServer
b.mu.Unlock()
}
}()
- for k, v := range b.sls {
- time.Sleep(b.intervals[k])
+ for v := range b.sls {
resp = &lbmpb.LoadBalanceResponse{
LoadBalanceResponseType: &lbmpb.LoadBalanceResponse_ServerList{
ServerList: v,
@@ -264,7 +205,8 @@ func (b *remoteBalancer) BalanceLoad(stream lbspb.LoadBalancer_BalanceLoadServer
type testServer struct {
testpb.TestServiceServer
- addr string
+ addr string
+ fallback bool
}
const testmdkey = "testmd"
@@ -272,10 +214,10 @@ const testmdkey = "testmd"
func (s *testServer) EmptyCall(ctx context.Context, in *testpb.Empty) (*testpb.Empty, error) {
md, ok := metadata.FromIncomingContext(ctx)
if !ok {
- return nil, grpc.Errorf(codes.Internal, "failed to receive metadata")
+ return nil, status.Error(codes.Internal, "failed to receive metadata")
}
- if md == nil || md["lb-token"][0] != lbToken {
- return nil, grpc.Errorf(codes.Internal, "received unexpected metadata: %v", md)
+ if !s.fallback && (md == nil || md["lb-token"][0] != lbToken) {
+ return nil, status.Errorf(codes.Internal, "received unexpected metadata: %v", md)
}
grpc.SetTrailer(ctx, metadata.Pairs(testmdkey, s.addr))
return &testpb.Empty{}, nil
@@ -285,13 +227,13 @@ func (s *testServer) FullDuplexCall(stream testpb.TestService_FullDuplexCallServ
return nil
}
-func startBackends(sn string, lis ...net.Listener) (servers []*grpc.Server) {
+func startBackends(sn string, fallback bool, lis ...net.Listener) (servers []*grpc.Server) {
for _, l := range lis {
creds := &serverNameCheckCreds{
sn: sn,
}
s := grpc.NewServer(grpc.Creds(creds))
- testpb.RegisterTestServiceServer(s, &testServer{addr: l.Addr().String()})
+ testpb.RegisterTestServiceServer(s, &testServer{addr: l.Addr().String(), fallback: fallback})
servers = append(servers, s)
go func(s *grpc.Server, l net.Listener) {
s.Serve(l)
@@ -334,7 +276,7 @@ func newLoadBalancer(numberOfBackends int) (tss *testServers, cleanup func(), er
beListeners = append(beListeners, beLis)
}
- backends := startBackends(besn, beListeners...)
+ backends := startBackends(beServerName, false, beListeners...)
// Start a load balancer.
lbLis, err := net.Listen("tcp", "localhost:0")
@@ -343,21 +285,21 @@ func newLoadBalancer(numberOfBackends int) (tss *testServers, cleanup func(), er
return
}
lbCreds := &serverNameCheckCreds{
- sn: lbsn,
+ sn: lbServerName,
}
lb = grpc.NewServer(grpc.Creds(lbCreds))
if err != nil {
err = fmt.Errorf("Failed to generate the port number %v", err)
return
}
- ls = newRemoteBalancer(nil, nil)
+ ls = newRemoteBalancer(nil)
lbspb.RegisterLoadBalancerServer(lb, ls)
go func() {
lb.Serve(lbLis)
}()
tss = &testServers{
- lbAddr: lbLis.Addr().String(),
+ lbAddr: fakeName + ":" + strconv.Itoa(lbLis.Addr().(*net.TCPAddr).Port),
ls: ls,
lb: lb,
beIPs: beIPs,
@@ -374,6 +316,11 @@ func newLoadBalancer(numberOfBackends int) (tss *testServers, cleanup func(), er
}
func TestGRPCLB(t *testing.T) {
+ defer leakcheck.Check(t)
+
+ r, cleanup := manual.GenerateAndRegisterManualResolver()
+ defer cleanup()
+
tss, cleanup, err := newLoadBalancer(1)
if err != nil {
t.Fatalf("failed to create new load balancer: %v", err)
@@ -390,124 +337,175 @@ func TestGRPCLB(t *testing.T) {
sl := &lbmpb.ServerList{
Servers: bes,
}
- tss.ls.sls = []*lbmpb.ServerList{sl}
- tss.ls.intervals = []time.Duration{0}
+ tss.ls.sls <- sl
creds := serverNameCheckCreds{
- expected: besn,
+ expected: beServerName,
}
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
- cc, err := grpc.DialContext(ctx, besn,
- grpc.WithBalancer(grpc.NewGRPCLBBalancer(&testNameResolver{addrs: []string{tss.lbAddr}})),
- grpc.WithBlock(), grpc.WithTransportCredentials(&creds), grpc.WithDialer(fakeNameDialer))
+ cc, err := grpc.DialContext(ctx, r.Scheme()+":///"+beServerName,
+ grpc.WithTransportCredentials(&creds), grpc.WithDialer(fakeNameDialer))
if err != nil {
t.Fatalf("Failed to dial to the backend %v", err)
}
+ defer cc.Close()
testC := testpb.NewTestServiceClient(cc)
- if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}); err != nil {
+
+ r.NewAddress([]resolver.Address{{
+ Addr: tss.lbAddr,
+ Type: resolver.GRPCLB,
+ ServerName: lbServerName,
+ }})
+
+ if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.FailFast(false)); err != nil {
t.Fatalf("%v.EmptyCall(_, _) = _, %v, want _, ", testC, err)
}
- cc.Close()
}
-func TestDropRequest(t *testing.T) {
+// The remote balancer sends response with duplicates to grpclb client.
+func TestGRPCLBWeighted(t *testing.T) {
+ defer leakcheck.Check(t)
+
+ r, cleanup := manual.GenerateAndRegisterManualResolver()
+ defer cleanup()
+
tss, cleanup, err := newLoadBalancer(2)
if err != nil {
t.Fatalf("failed to create new load balancer: %v", err)
}
defer cleanup()
- tss.ls.sls = []*lbmpb.ServerList{{
- Servers: []*lbmpb.Server{{
- IpAddress: tss.beIPs[0],
- Port: int32(tss.bePorts[0]),
- LoadBalanceToken: lbToken,
- DropForLoadBalancing: true,
- }, {
- IpAddress: tss.beIPs[1],
- Port: int32(tss.bePorts[1]),
- LoadBalanceToken: lbToken,
- DropForLoadBalancing: false,
- }},
+
+ beServers := []*lbmpb.Server{{
+ IpAddress: tss.beIPs[0],
+ Port: int32(tss.bePorts[0]),
+ LoadBalanceToken: lbToken,
+ }, {
+ IpAddress: tss.beIPs[1],
+ Port: int32(tss.bePorts[1]),
+ LoadBalanceToken: lbToken,
}}
- tss.ls.intervals = []time.Duration{0}
+ portsToIndex := make(map[int]int)
+ for i := range beServers {
+ portsToIndex[tss.bePorts[i]] = i
+ }
+
creds := serverNameCheckCreds{
- expected: besn,
+ expected: beServerName,
}
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
- cc, err := grpc.DialContext(ctx, besn,
- grpc.WithBalancer(grpc.NewGRPCLBBalancer(&testNameResolver{addrs: []string{tss.lbAddr}})),
- grpc.WithBlock(), grpc.WithTransportCredentials(&creds), grpc.WithDialer(fakeNameDialer))
+ cc, err := grpc.DialContext(ctx, r.Scheme()+":///"+beServerName,
+ grpc.WithTransportCredentials(&creds), grpc.WithDialer(fakeNameDialer))
if err != nil {
t.Fatalf("Failed to dial to the backend %v", err)
}
+ defer cc.Close()
testC := testpb.NewTestServiceClient(cc)
- // The 1st, non-fail-fast RPC should succeed. This ensures both server
- // connections are made, because the first one has DropForLoadBalancing set to true.
- if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.FailFast(false)); err != nil {
- t.Fatalf("%v.SayHello(_, _) = _, %v, want _, ", testC, err)
- }
- for i := 0; i < 3; i++ {
- // Odd fail-fast RPCs should fail, because the 1st backend has DropForLoadBalancing
- // set to true.
- if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}); grpc.Code(err) != codes.Unavailable {
- t.Fatalf("%v.EmptyCall(_, _) = _, %v, want _, %s", testC, err, codes.Unavailable)
+
+ r.NewAddress([]resolver.Address{{
+ Addr: tss.lbAddr,
+ Type: resolver.GRPCLB,
+ ServerName: lbServerName,
+ }})
+
+ sequences := []string{"00101", "00011"}
+ for _, seq := range sequences {
+ var (
+ bes []*lbmpb.Server
+ p peer.Peer
+ result string
+ )
+ for _, s := range seq {
+ bes = append(bes, beServers[s-'0'])
}
- // Even fail-fast RPCs should succeed since they choose the
- // non-drop-request backend according to the round robin policy.
- if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}); err != nil {
- t.Fatalf("%v.EmptyCall(_, _) = _, %v, want _, ", testC, err)
+ tss.ls.sls <- &lbmpb.ServerList{Servers: bes}
+
+ for i := 0; i < 1000; i++ {
+ if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.FailFast(false), grpc.Peer(&p)); err != nil {
+ t.Fatalf("%v.EmptyCall(_, _) = _, %v, want _, ", testC, err)
+ }
+ result += strconv.Itoa(portsToIndex[p.Addr.(*net.TCPAddr).Port])
+ }
+ // The generated result will be in format of "0010100101".
+ if !strings.Contains(result, strings.Repeat(seq, 2)) {
+ t.Errorf("got result sequence %q, want patten %q", result, seq)
}
}
- cc.Close()
}
-func TestDropRequestFailedNonFailFast(t *testing.T) {
+func TestDropRequest(t *testing.T) {
+ defer leakcheck.Check(t)
+
+ r, cleanup := manual.GenerateAndRegisterManualResolver()
+ defer cleanup()
+
tss, cleanup, err := newLoadBalancer(1)
if err != nil {
t.Fatalf("failed to create new load balancer: %v", err)
}
defer cleanup()
- be := &lbmpb.Server{
- IpAddress: tss.beIPs[0],
- Port: int32(tss.bePorts[0]),
- LoadBalanceToken: lbToken,
- DropForLoadBalancing: true,
+ tss.ls.sls <- &lbmpb.ServerList{
+ Servers: []*lbmpb.Server{{
+ IpAddress: tss.beIPs[0],
+ Port: int32(tss.bePorts[0]),
+ LoadBalanceToken: lbToken,
+ DropForLoadBalancing: false,
+ }, {
+ DropForLoadBalancing: true,
+ }},
}
- var bes []*lbmpb.Server
- bes = append(bes, be)
- sl := &lbmpb.ServerList{
- Servers: bes,
- }
- tss.ls.sls = []*lbmpb.ServerList{sl}
- tss.ls.intervals = []time.Duration{0}
creds := serverNameCheckCreds{
- expected: besn,
+ expected: beServerName,
}
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
- cc, err := grpc.DialContext(ctx, besn,
- grpc.WithBalancer(grpc.NewGRPCLBBalancer(&testNameResolver{addrs: []string{tss.lbAddr}})),
- grpc.WithBlock(), grpc.WithTransportCredentials(&creds), grpc.WithDialer(fakeNameDialer))
+ cc, err := grpc.DialContext(ctx, r.Scheme()+":///"+beServerName,
+ grpc.WithTransportCredentials(&creds), grpc.WithDialer(fakeNameDialer))
if err != nil {
t.Fatalf("Failed to dial to the backend %v", err)
}
+ defer cc.Close()
testC := testpb.NewTestServiceClient(cc)
- ctx, cancel = context.WithTimeout(context.Background(), 10*time.Millisecond)
- defer cancel()
- if _, err := testC.EmptyCall(ctx, &testpb.Empty{}, grpc.FailFast(false)); grpc.Code(err) != codes.DeadlineExceeded {
- t.Fatalf("%v.EmptyCall(_, _) = _, %v, want _, %s", testC, err, codes.DeadlineExceeded)
+
+ r.NewAddress([]resolver.Address{{
+ Addr: tss.lbAddr,
+ Type: resolver.GRPCLB,
+ ServerName: lbServerName,
+ }})
+
+ // The 1st, non-fail-fast RPC should succeed. This ensures both server
+ // connections are made, because the first one has DropForLoadBalancing set to true.
+ if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.FailFast(false)); err != nil {
+ t.Fatalf("%v.SayHello(_, _) = _, %v, want _, ", testC, err)
+ }
+ for _, failfast := range []bool{true, false} {
+ for i := 0; i < 3; i++ {
+ // Even RPCs should fail, because the 2st backend has
+ // DropForLoadBalancing set to true.
+ if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.FailFast(failfast)); status.Code(err) != codes.Unavailable {
+ t.Errorf("%v.EmptyCall(_, _) = _, %v, want _, %s", testC, err, codes.Unavailable)
+ }
+ // Odd RPCs should succeed since they choose the non-drop-request
+ // backend according to the round robin policy.
+ if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.FailFast(failfast)); err != nil {
+ t.Errorf("%v.EmptyCall(_, _) = _, %v, want _, ", testC, err)
+ }
+ }
}
- cc.Close()
}
// When the balancer in use disconnects, grpclb should connect to the next address from resolved balancer address list.
func TestBalancerDisconnects(t *testing.T) {
+ defer leakcheck.Check(t)
+
+ r, cleanup := manual.GenerateAndRegisterManualResolver()
+ defer cleanup()
+
var (
- lbAddrs []string
- lbs []*grpc.Server
+ tests []*testServers
+ lbs []*grpc.Server
)
- for i := 0; i < 3; i++ {
+ for i := 0; i < 2; i++ {
tss, cleanup, err := newLoadBalancer(1)
if err != nil {
t.Fatalf("failed to create new load balancer: %v", err)
@@ -524,78 +522,166 @@ func TestBalancerDisconnects(t *testing.T) {
sl := &lbmpb.ServerList{
Servers: bes,
}
- tss.ls.sls = []*lbmpb.ServerList{sl}
- tss.ls.intervals = []time.Duration{0}
+ tss.ls.sls <- sl
- lbAddrs = append(lbAddrs, tss.lbAddr)
+ tests = append(tests, tss)
lbs = append(lbs, tss.lb)
}
creds := serverNameCheckCreds{
- expected: besn,
+ expected: beServerName,
}
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
- resolver := &testNameResolver{
- addrs: lbAddrs[:2],
- }
- cc, err := grpc.DialContext(ctx, besn,
- grpc.WithBalancer(grpc.NewGRPCLBBalancer(resolver)),
- grpc.WithBlock(), grpc.WithTransportCredentials(&creds), grpc.WithDialer(fakeNameDialer))
+ cc, err := grpc.DialContext(ctx, r.Scheme()+":///"+beServerName,
+ grpc.WithTransportCredentials(&creds), grpc.WithDialer(fakeNameDialer))
if err != nil {
t.Fatalf("Failed to dial to the backend %v", err)
}
+ defer cc.Close()
testC := testpb.NewTestServiceClient(cc)
- var previousTrailer string
- trailer := metadata.MD{}
- if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.Trailer(&trailer), grpc.FailFast(false)); err != nil {
+
+ r.NewAddress([]resolver.Address{{
+ Addr: tests[0].lbAddr,
+ Type: resolver.GRPCLB,
+ ServerName: lbServerName,
+ }, {
+ Addr: tests[1].lbAddr,
+ Type: resolver.GRPCLB,
+ ServerName: lbServerName,
+ }})
+
+ var p peer.Peer
+ if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.FailFast(false), grpc.Peer(&p)); err != nil {
t.Fatalf("%v.EmptyCall(_, _) = _, %v, want _, ", testC, err)
- } else {
- previousTrailer = trailer[testmdkey][0]
}
- // The initial resolver update contains lbs[0] and lbs[1].
- // When lbs[0] is stopped, lbs[1] should be used.
+ if p.Addr.(*net.TCPAddr).Port != tests[0].bePorts[0] {
+ t.Fatalf("got peer: %v, want peer port: %v", p.Addr, tests[0].bePorts[0])
+ }
+
lbs[0].Stop()
- for {
- if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.Trailer(&trailer), grpc.FailFast(false)); err != nil {
+ // Stop balancer[0], balancer[1] should be used by grpclb.
+ // Check peer address to see if that happened.
+ for i := 0; i < 1000; i++ {
+ if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.FailFast(false), grpc.Peer(&p)); err != nil {
t.Fatalf("%v.EmptyCall(_, _) = _, %v, want _, ", testC, err)
- } else if trailer[testmdkey][0] != previousTrailer {
- // A new backend server should receive the request.
- // The trailer contains the backend address, so the trailer should be different from the previous one.
- previousTrailer = trailer[testmdkey][0]
- break
}
- time.Sleep(100 * time.Millisecond)
+ if p.Addr.(*net.TCPAddr).Port == tests[1].bePorts[0] {
+ return
+ }
+ time.Sleep(time.Millisecond)
}
- // Inject a update to add lbs[2] to resolved addresses.
- resolver.inject([]*naming.Update{
- {Op: naming.Add,
- Addr: lbAddrs[2],
- Metadata: &naming.AddrMetadataGRPCLB{
- AddrType: naming.GRPCLB,
- ServerName: lbsn,
- },
- },
+ t.Fatalf("No RPC sent to second backend after 1 second")
+}
+
+type customGRPCLBBuilder struct {
+ balancer.Builder
+ name string
+}
+
+func (b *customGRPCLBBuilder) Name() string {
+ return b.name
+}
+
+const grpclbCustomFallbackName = "grpclb_with_custom_fallback_timeout"
+
+func init() {
+ balancer.Register(&customGRPCLBBuilder{
+ Builder: grpc.NewLBBuilderWithFallbackTimeout(100 * time.Millisecond),
+ name: grpclbCustomFallbackName,
})
- // Stop lbs[1]. Now lbs[0] and lbs[1] are all stopped. lbs[2] should be used.
- lbs[1].Stop()
- for {
- if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.Trailer(&trailer), grpc.FailFast(false)); err != nil {
- t.Fatalf("%v.EmptyCall(_, _) = _, %v, want _, ", testC, err)
- } else if trailer[testmdkey][0] != previousTrailer {
- // A new backend server should receive the request.
- // The trailer contains the backend address, so the trailer should be different from the previous one.
- break
- }
- time.Sleep(100 * time.Millisecond)
+}
+
+func TestFallback(t *testing.T) {
+ defer leakcheck.Check(t)
+
+ r, cleanup := manual.GenerateAndRegisterManualResolver()
+ defer cleanup()
+
+ tss, cleanup, err := newLoadBalancer(1)
+ if err != nil {
+ t.Fatalf("failed to create new load balancer: %v", err)
}
- cc.Close()
+ defer cleanup()
+
+ // Start a standalone backend.
+ beLis, err := net.Listen("tcp", "localhost:0")
+ if err != nil {
+ t.Fatalf("Failed to listen %v", err)
+ }
+ defer beLis.Close()
+ standaloneBEs := startBackends(beServerName, true, beLis)
+ defer stopBackends(standaloneBEs)
+
+ be := &lbmpb.Server{
+ IpAddress: tss.beIPs[0],
+ Port: int32(tss.bePorts[0]),
+ LoadBalanceToken: lbToken,
+ }
+ var bes []*lbmpb.Server
+ bes = append(bes, be)
+ sl := &lbmpb.ServerList{
+ Servers: bes,
+ }
+ tss.ls.sls <- sl
+ creds := serverNameCheckCreds{
+ expected: beServerName,
+ }
+ ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+ defer cancel()
+ cc, err := grpc.DialContext(ctx, r.Scheme()+":///"+beServerName,
+ grpc.WithBalancerName(grpclbCustomFallbackName),
+ grpc.WithTransportCredentials(&creds), grpc.WithDialer(fakeNameDialer))
+ if err != nil {
+ t.Fatalf("Failed to dial to the backend %v", err)
+ }
+ defer cc.Close()
+ testC := testpb.NewTestServiceClient(cc)
+
+ r.NewAddress([]resolver.Address{{
+ Addr: "",
+ Type: resolver.GRPCLB,
+ ServerName: lbServerName,
+ }, {
+ Addr: beLis.Addr().String(),
+ Type: resolver.Backend,
+ ServerName: beServerName,
+ }})
+
+ var p peer.Peer
+ if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.FailFast(false), grpc.Peer(&p)); err != nil {
+ t.Fatalf("%v.EmptyCall(_, _) = _, %v, want _, ", testC, err)
+ }
+ if p.Addr.String() != beLis.Addr().String() {
+ t.Fatalf("got peer: %v, want peer: %v", p.Addr, beLis.Addr())
+ }
+
+ r.NewAddress([]resolver.Address{{
+ Addr: tss.lbAddr,
+ Type: resolver.GRPCLB,
+ ServerName: lbServerName,
+ }, {
+ Addr: beLis.Addr().String(),
+ Type: resolver.Backend,
+ ServerName: beServerName,
+ }})
+
+ for i := 0; i < 1000; i++ {
+ if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.FailFast(false), grpc.Peer(&p)); err != nil {
+ t.Fatalf("%v.EmptyCall(_, _) = _, %v, want _, ", testC, err)
+ }
+ if p.Addr.(*net.TCPAddr).Port == tss.bePorts[0] {
+ return
+ }
+ time.Sleep(time.Millisecond)
+ }
+ t.Fatalf("No RPC sent to backend behind remote balancer after 1 second")
}
type failPreRPCCred struct{}
func (failPreRPCCred) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) {
- if strings.Contains(uri[0], "failtosend") {
+ if strings.Contains(uri[0], failtosendURI) {
return nil, fmt.Errorf("rpc should fail to send")
}
return nil, nil
@@ -613,35 +699,45 @@ func checkStats(stats *lbmpb.ClientStats, expected *lbmpb.ClientStats) error {
}
func runAndGetStats(t *testing.T, dropForLoadBalancing, dropForRateLimiting bool, runRPCs func(*grpc.ClientConn)) lbmpb.ClientStats {
- tss, cleanup, err := newLoadBalancer(3)
+ defer leakcheck.Check(t)
+
+ r, cleanup := manual.GenerateAndRegisterManualResolver()
+ defer cleanup()
+
+ tss, cleanup, err := newLoadBalancer(1)
if err != nil {
t.Fatalf("failed to create new load balancer: %v", err)
}
defer cleanup()
- tss.ls.sls = []*lbmpb.ServerList{{
+ tss.ls.sls <- &lbmpb.ServerList{
Servers: []*lbmpb.Server{{
- IpAddress: tss.beIPs[2],
- Port: int32(tss.bePorts[2]),
+ IpAddress: tss.beIPs[0],
+ Port: int32(tss.bePorts[0]),
LoadBalanceToken: lbToken,
DropForLoadBalancing: dropForLoadBalancing,
DropForRateLimiting: dropForRateLimiting,
}},
- }}
- tss.ls.intervals = []time.Duration{0}
+ }
tss.ls.statsDura = 100 * time.Millisecond
- creds := serverNameCheckCreds{expected: besn}
+ creds := serverNameCheckCreds{expected: beServerName}
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
- cc, err := grpc.DialContext(ctx, besn,
- grpc.WithBalancer(grpc.NewGRPCLBBalancer(&testNameResolver{addrs: []string{tss.lbAddr}})),
- grpc.WithTransportCredentials(&creds), grpc.WithPerRPCCredentials(failPreRPCCred{}),
- grpc.WithBlock(), grpc.WithDialer(fakeNameDialer))
+ cc, err := grpc.DialContext(ctx, r.Scheme()+":///"+beServerName,
+ grpc.WithTransportCredentials(&creds),
+ grpc.WithPerRPCCredentials(failPreRPCCred{}),
+ grpc.WithDialer(fakeNameDialer))
if err != nil {
t.Fatalf("Failed to dial to the backend %v", err)
}
defer cc.Close()
+ r.NewAddress([]resolver.Address{{
+ Addr: tss.lbAddr,
+ Type: resolver.GRPCLB,
+ ServerName: lbServerName,
+ }})
+
runRPCs(cc)
time.Sleep(1 * time.Second)
tss.ls.mu.Lock()
@@ -650,9 +746,14 @@ func runAndGetStats(t *testing.T, dropForLoadBalancing, dropForRateLimiting bool
return stats
}
-const countRPC = 40
+const (
+ countRPC = 40
+ failtosendURI = "failtosend"
+ dropErrDesc = "request dropped by grpclb"
+)
func TestGRPCLBStatsUnarySuccess(t *testing.T) {
+ defer leakcheck.Check(t)
stats := runAndGetStats(t, false, false, func(cc *grpc.ClientConn) {
testC := testpb.NewTestServiceClient(cc)
// The first non-failfast RPC succeeds, all connections are up.
@@ -674,13 +775,14 @@ func TestGRPCLBStatsUnarySuccess(t *testing.T) {
}
func TestGRPCLBStatsUnaryDropLoadBalancing(t *testing.T) {
+ defer leakcheck.Check(t)
c := 0
stats := runAndGetStats(t, true, false, func(cc *grpc.ClientConn) {
testC := testpb.NewTestServiceClient(cc)
for {
c++
if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}); err != nil {
- if strings.Contains(err.Error(), "drops requests") {
+ if strings.Contains(err.Error(), dropErrDesc) {
break
}
}
@@ -701,13 +803,14 @@ func TestGRPCLBStatsUnaryDropLoadBalancing(t *testing.T) {
}
func TestGRPCLBStatsUnaryDropRateLimiting(t *testing.T) {
+ defer leakcheck.Check(t)
c := 0
stats := runAndGetStats(t, false, true, func(cc *grpc.ClientConn) {
testC := testpb.NewTestServiceClient(cc)
for {
c++
if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}); err != nil {
- if strings.Contains(err.Error(), "drops requests") {
+ if strings.Contains(err.Error(), dropErrDesc) {
break
}
}
@@ -728,6 +831,7 @@ func TestGRPCLBStatsUnaryDropRateLimiting(t *testing.T) {
}
func TestGRPCLBStatsUnaryFailedToSend(t *testing.T) {
+ defer leakcheck.Check(t)
stats := runAndGetStats(t, false, false, func(cc *grpc.ClientConn) {
testC := testpb.NewTestServiceClient(cc)
// The first non-failfast RPC succeeds, all connections are up.
@@ -735,7 +839,7 @@ func TestGRPCLBStatsUnaryFailedToSend(t *testing.T) {
t.Fatalf("%v.EmptyCall(_, _) = _, %v, want _, ", testC, err)
}
for i := 0; i < countRPC-1; i++ {
- grpc.Invoke(context.Background(), "failtosend", &testpb.Empty{}, nil, cc)
+ grpc.Invoke(context.Background(), failtosendURI, &testpb.Empty{}, nil, cc)
}
})
@@ -750,6 +854,7 @@ func TestGRPCLBStatsUnaryFailedToSend(t *testing.T) {
}
func TestGRPCLBStatsStreamingSuccess(t *testing.T) {
+ defer leakcheck.Check(t)
stats := runAndGetStats(t, false, false, func(cc *grpc.ClientConn) {
testC := testpb.NewTestServiceClient(cc)
// The first non-failfast RPC succeeds, all connections are up.
@@ -785,13 +890,14 @@ func TestGRPCLBStatsStreamingSuccess(t *testing.T) {
}
func TestGRPCLBStatsStreamingDropLoadBalancing(t *testing.T) {
+ defer leakcheck.Check(t)
c := 0
stats := runAndGetStats(t, true, false, func(cc *grpc.ClientConn) {
testC := testpb.NewTestServiceClient(cc)
for {
c++
if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}); err != nil {
- if strings.Contains(err.Error(), "drops requests") {
+ if strings.Contains(err.Error(), dropErrDesc) {
break
}
}
@@ -812,13 +918,14 @@ func TestGRPCLBStatsStreamingDropLoadBalancing(t *testing.T) {
}
func TestGRPCLBStatsStreamingDropRateLimiting(t *testing.T) {
+ defer leakcheck.Check(t)
c := 0
stats := runAndGetStats(t, false, true, func(cc *grpc.ClientConn) {
testC := testpb.NewTestServiceClient(cc)
for {
c++
if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}); err != nil {
- if strings.Contains(err.Error(), "drops requests") {
+ if strings.Contains(err.Error(), dropErrDesc) {
break
}
}
@@ -839,6 +946,7 @@ func TestGRPCLBStatsStreamingDropRateLimiting(t *testing.T) {
}
func TestGRPCLBStatsStreamingFailedToSend(t *testing.T) {
+ defer leakcheck.Check(t)
stats := runAndGetStats(t, false, false, func(cc *grpc.ClientConn) {
testC := testpb.NewTestServiceClient(cc)
// The first non-failfast RPC succeeds, all connections are up.
@@ -852,7 +960,7 @@ func TestGRPCLBStatsStreamingFailedToSend(t *testing.T) {
}
}
for i := 0; i < countRPC-1; i++ {
- grpc.NewClientStream(context.Background(), &grpc.StreamDesc{}, cc, "failtosend")
+ grpc.NewClientStream(context.Background(), &grpc.StreamDesc{}, cc, failtosendURI)
}
})
diff --git a/vendor/google.golang.org/grpc/grpclb_picker.go b/vendor/google.golang.org/grpc/grpclb_picker.go
new file mode 100644
index 0000000..872c7cc
--- /dev/null
+++ b/vendor/google.golang.org/grpc/grpclb_picker.go
@@ -0,0 +1,159 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package grpc
+
+import (
+ "sync"
+ "sync/atomic"
+
+ "golang.org/x/net/context"
+ "google.golang.org/grpc/balancer"
+ "google.golang.org/grpc/codes"
+ lbpb "google.golang.org/grpc/grpclb/grpc_lb_v1/messages"
+ "google.golang.org/grpc/status"
+)
+
+type rpcStats struct {
+ NumCallsStarted int64
+ NumCallsFinished int64
+ NumCallsFinishedWithDropForRateLimiting int64
+ NumCallsFinishedWithDropForLoadBalancing int64
+ NumCallsFinishedWithClientFailedToSend int64
+ NumCallsFinishedKnownReceived int64
+}
+
+// toClientStats converts rpcStats to lbpb.ClientStats, and clears rpcStats.
+func (s *rpcStats) toClientStats() *lbpb.ClientStats {
+ stats := &lbpb.ClientStats{
+ NumCallsStarted: atomic.SwapInt64(&s.NumCallsStarted, 0),
+ NumCallsFinished: atomic.SwapInt64(&s.NumCallsFinished, 0),
+ NumCallsFinishedWithDropForRateLimiting: atomic.SwapInt64(&s.NumCallsFinishedWithDropForRateLimiting, 0),
+ NumCallsFinishedWithDropForLoadBalancing: atomic.SwapInt64(&s.NumCallsFinishedWithDropForLoadBalancing, 0),
+ NumCallsFinishedWithClientFailedToSend: atomic.SwapInt64(&s.NumCallsFinishedWithClientFailedToSend, 0),
+ NumCallsFinishedKnownReceived: atomic.SwapInt64(&s.NumCallsFinishedKnownReceived, 0),
+ }
+ return stats
+}
+
+func (s *rpcStats) dropForRateLimiting() {
+ atomic.AddInt64(&s.NumCallsStarted, 1)
+ atomic.AddInt64(&s.NumCallsFinishedWithDropForRateLimiting, 1)
+ atomic.AddInt64(&s.NumCallsFinished, 1)
+}
+
+func (s *rpcStats) dropForLoadBalancing() {
+ atomic.AddInt64(&s.NumCallsStarted, 1)
+ atomic.AddInt64(&s.NumCallsFinishedWithDropForLoadBalancing, 1)
+ atomic.AddInt64(&s.NumCallsFinished, 1)
+}
+
+func (s *rpcStats) failedToSend() {
+ atomic.AddInt64(&s.NumCallsStarted, 1)
+ atomic.AddInt64(&s.NumCallsFinishedWithClientFailedToSend, 1)
+ atomic.AddInt64(&s.NumCallsFinished, 1)
+}
+
+func (s *rpcStats) knownReceived() {
+ atomic.AddInt64(&s.NumCallsStarted, 1)
+ atomic.AddInt64(&s.NumCallsFinishedKnownReceived, 1)
+ atomic.AddInt64(&s.NumCallsFinished, 1)
+}
+
+type errPicker struct {
+ // Pick always returns this err.
+ err error
+}
+
+func (p *errPicker) Pick(ctx context.Context, opts balancer.PickOptions) (balancer.SubConn, func(balancer.DoneInfo), error) {
+ return nil, nil, p.err
+}
+
+// rrPicker does roundrobin on subConns. It's typically used when there's no
+// response from remote balancer, and grpclb falls back to the resolved
+// backends.
+//
+// It guaranteed that len(subConns) > 0.
+type rrPicker struct {
+ mu sync.Mutex
+ subConns []balancer.SubConn // The subConns that were READY when taking the snapshot.
+ subConnsNext int
+}
+
+func (p *rrPicker) Pick(ctx context.Context, opts balancer.PickOptions) (balancer.SubConn, func(balancer.DoneInfo), error) {
+ p.mu.Lock()
+ defer p.mu.Unlock()
+ sc := p.subConns[p.subConnsNext]
+ p.subConnsNext = (p.subConnsNext + 1) % len(p.subConns)
+ return sc, nil, nil
+}
+
+// lbPicker does two layers of picks:
+//
+// First layer: roundrobin on all servers in serverList, including drops and backends.
+// - If it picks a drop, the RPC will fail as being dropped.
+// - If it picks a backend, do a second layer pick to pick the real backend.
+//
+// Second layer: roundrobin on all READY backends.
+//
+// It's guaranteed that len(serverList) > 0.
+type lbPicker struct {
+ mu sync.Mutex
+ serverList []*lbpb.Server
+ serverListNext int
+ subConns []balancer.SubConn // The subConns that were READY when taking the snapshot.
+ subConnsNext int
+
+ stats *rpcStats
+}
+
+func (p *lbPicker) Pick(ctx context.Context, opts balancer.PickOptions) (balancer.SubConn, func(balancer.DoneInfo), error) {
+ p.mu.Lock()
+ defer p.mu.Unlock()
+
+ // Layer one roundrobin on serverList.
+ s := p.serverList[p.serverListNext]
+ p.serverListNext = (p.serverListNext + 1) % len(p.serverList)
+
+ // If it's a drop, return an error and fail the RPC.
+ if s.DropForRateLimiting {
+ p.stats.dropForRateLimiting()
+ return nil, nil, status.Errorf(codes.Unavailable, "request dropped by grpclb")
+ }
+ if s.DropForLoadBalancing {
+ p.stats.dropForLoadBalancing()
+ return nil, nil, status.Errorf(codes.Unavailable, "request dropped by grpclb")
+ }
+
+ // If not a drop but there's no ready subConns.
+ if len(p.subConns) <= 0 {
+ return nil, nil, balancer.ErrNoSubConnAvailable
+ }
+
+ // Return the next ready subConn in the list, also collect rpc stats.
+ sc := p.subConns[p.subConnsNext]
+ p.subConnsNext = (p.subConnsNext + 1) % len(p.subConns)
+ done := func(info balancer.DoneInfo) {
+ if !info.BytesSent {
+ p.stats.failedToSend()
+ } else if info.BytesReceived {
+ p.stats.knownReceived()
+ }
+ }
+ return sc, done, nil
+}
diff --git a/vendor/google.golang.org/grpc/grpclb_remote_balancer.go b/vendor/google.golang.org/grpc/grpclb_remote_balancer.go
new file mode 100644
index 0000000..1b580df
--- /dev/null
+++ b/vendor/google.golang.org/grpc/grpclb_remote_balancer.go
@@ -0,0 +1,254 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package grpc
+
+import (
+ "fmt"
+ "net"
+ "reflect"
+ "time"
+
+ "golang.org/x/net/context"
+ "google.golang.org/grpc/balancer"
+ "google.golang.org/grpc/connectivity"
+ lbpb "google.golang.org/grpc/grpclb/grpc_lb_v1/messages"
+ "google.golang.org/grpc/grpclog"
+ "google.golang.org/grpc/metadata"
+ "google.golang.org/grpc/resolver"
+)
+
+// processServerList updates balaner's internal state, create/remove SubConns
+// and regenerates picker using the received serverList.
+func (lb *lbBalancer) processServerList(l *lbpb.ServerList) {
+ grpclog.Infof("lbBalancer: processing server list: %+v", l)
+ lb.mu.Lock()
+ defer lb.mu.Unlock()
+
+ // Set serverListReceived to true so fallback will not take effect if it has
+ // not hit timeout.
+ lb.serverListReceived = true
+
+ // If the new server list == old server list, do nothing.
+ if reflect.DeepEqual(lb.fullServerList, l.Servers) {
+ grpclog.Infof("lbBalancer: new serverlist same as the previous one, ignoring")
+ return
+ }
+ lb.fullServerList = l.Servers
+
+ var backendAddrs []resolver.Address
+ for _, s := range l.Servers {
+ if s.DropForLoadBalancing || s.DropForRateLimiting {
+ continue
+ }
+
+ md := metadata.Pairs(lbTokeyKey, s.LoadBalanceToken)
+ ip := net.IP(s.IpAddress)
+ ipStr := ip.String()
+ if ip.To4() == nil {
+ // Add square brackets to ipv6 addresses, otherwise net.Dial() and
+ // net.SplitHostPort() will return too many colons error.
+ ipStr = fmt.Sprintf("[%s]", ipStr)
+ }
+ addr := resolver.Address{
+ Addr: fmt.Sprintf("%s:%d", ipStr, s.Port),
+ Metadata: &md,
+ }
+
+ backendAddrs = append(backendAddrs, addr)
+ }
+
+ // Call refreshSubConns to create/remove SubConns.
+ backendsUpdated := lb.refreshSubConns(backendAddrs)
+ // If no backend was updated, no SubConn will be newed/removed. But since
+ // the full serverList was different, there might be updates in drops or
+ // pick weights(different number of duplicates). We need to update picker
+ // with the fulllist.
+ if !backendsUpdated {
+ lb.regeneratePicker()
+ lb.cc.UpdateBalancerState(lb.state, lb.picker)
+ }
+}
+
+// refreshSubConns creates/removes SubConns with backendAddrs. It returns a bool
+// indicating whether the backendAddrs are different from the cached
+// backendAddrs (whether any SubConn was newed/removed).
+// Caller must hold lb.mu.
+func (lb *lbBalancer) refreshSubConns(backendAddrs []resolver.Address) bool {
+ lb.backendAddrs = nil
+ var backendsUpdated bool
+ // addrsSet is the set converted from backendAddrs, it's used to quick
+ // lookup for an address.
+ addrsSet := make(map[resolver.Address]struct{})
+ // Create new SubConns.
+ for _, addr := range backendAddrs {
+ addrWithoutMD := addr
+ addrWithoutMD.Metadata = nil
+ addrsSet[addrWithoutMD] = struct{}{}
+ lb.backendAddrs = append(lb.backendAddrs, addrWithoutMD)
+
+ if _, ok := lb.subConns[addrWithoutMD]; !ok {
+ backendsUpdated = true
+
+ // Use addrWithMD to create the SubConn.
+ sc, err := lb.cc.NewSubConn([]resolver.Address{addr}, balancer.NewSubConnOptions{})
+ if err != nil {
+ grpclog.Warningf("roundrobinBalancer: failed to create new SubConn: %v", err)
+ continue
+ }
+ lb.subConns[addrWithoutMD] = sc // Use the addr without MD as key for the map.
+ lb.scStates[sc] = connectivity.Idle
+ sc.Connect()
+ }
+ }
+
+ for a, sc := range lb.subConns {
+ // a was removed by resolver.
+ if _, ok := addrsSet[a]; !ok {
+ backendsUpdated = true
+
+ lb.cc.RemoveSubConn(sc)
+ delete(lb.subConns, a)
+ // Keep the state of this sc in b.scStates until sc's state becomes Shutdown.
+ // The entry will be deleted in HandleSubConnStateChange.
+ }
+ }
+
+ return backendsUpdated
+}
+
+func (lb *lbBalancer) readServerList(s *balanceLoadClientStream) error {
+ for {
+ reply, err := s.Recv()
+ if err != nil {
+ return fmt.Errorf("grpclb: failed to recv server list: %v", err)
+ }
+ if serverList := reply.GetServerList(); serverList != nil {
+ lb.processServerList(serverList)
+ }
+ }
+}
+
+func (lb *lbBalancer) sendLoadReport(s *balanceLoadClientStream, interval time.Duration) {
+ ticker := time.NewTicker(interval)
+ defer ticker.Stop()
+ for {
+ select {
+ case <-ticker.C:
+ case <-s.Context().Done():
+ return
+ }
+ stats := lb.clientStats.toClientStats()
+ t := time.Now()
+ stats.Timestamp = &lbpb.Timestamp{
+ Seconds: t.Unix(),
+ Nanos: int32(t.Nanosecond()),
+ }
+ if err := s.Send(&lbpb.LoadBalanceRequest{
+ LoadBalanceRequestType: &lbpb.LoadBalanceRequest_ClientStats{
+ ClientStats: stats,
+ },
+ }); err != nil {
+ return
+ }
+ }
+}
+func (lb *lbBalancer) callRemoteBalancer() error {
+ lbClient := &loadBalancerClient{cc: lb.ccRemoteLB}
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+ stream, err := lbClient.BalanceLoad(ctx, FailFast(false))
+ if err != nil {
+ return fmt.Errorf("grpclb: failed to perform RPC to the remote balancer %v", err)
+ }
+
+ // grpclb handshake on the stream.
+ initReq := &lbpb.LoadBalanceRequest{
+ LoadBalanceRequestType: &lbpb.LoadBalanceRequest_InitialRequest{
+ InitialRequest: &lbpb.InitialLoadBalanceRequest{
+ Name: lb.target,
+ },
+ },
+ }
+ if err := stream.Send(initReq); err != nil {
+ return fmt.Errorf("grpclb: failed to send init request: %v", err)
+ }
+ reply, err := stream.Recv()
+ if err != nil {
+ return fmt.Errorf("grpclb: failed to recv init response: %v", err)
+ }
+ initResp := reply.GetInitialResponse()
+ if initResp == nil {
+ return fmt.Errorf("grpclb: reply from remote balancer did not include initial response")
+ }
+ if initResp.LoadBalancerDelegate != "" {
+ return fmt.Errorf("grpclb: Delegation is not supported")
+ }
+
+ go func() {
+ if d := convertDuration(initResp.ClientStatsReportInterval); d > 0 {
+ lb.sendLoadReport(stream, d)
+ }
+ }()
+ return lb.readServerList(stream)
+}
+
+func (lb *lbBalancer) watchRemoteBalancer() {
+ for {
+ err := lb.callRemoteBalancer()
+ select {
+ case <-lb.doneCh:
+ return
+ default:
+ if err != nil {
+ grpclog.Error(err)
+ }
+ }
+
+ }
+}
+
+func (lb *lbBalancer) dialRemoteLB(remoteLBName string) {
+ var dopts []DialOption
+ if creds := lb.opt.DialCreds; creds != nil {
+ if err := creds.OverrideServerName(remoteLBName); err == nil {
+ dopts = append(dopts, WithTransportCredentials(creds))
+ } else {
+ grpclog.Warningf("grpclb: failed to override the server name in the credentials: %v, using Insecure", err)
+ dopts = append(dopts, WithInsecure())
+ }
+ } else {
+ dopts = append(dopts, WithInsecure())
+ }
+ if lb.opt.Dialer != nil {
+ // WithDialer takes a different type of function, so we instead use a
+ // special DialOption here.
+ dopts = append(dopts, withContextDialer(lb.opt.Dialer))
+ }
+ // Explicitly set pickfirst as the balancer.
+ dopts = append(dopts, WithBalancerName(PickFirstBalancerName))
+ dopts = append(dopts, withResolverBuilder(lb.manualResolver))
+ // Dial using manualResolver.Scheme, which is a random scheme generated
+ // when init grpclb. The target name is not important.
+ cc, err := Dial("grpclb:///grpclb.server", dopts...)
+ if err != nil {
+ grpclog.Fatalf("failed to dial: %v", err)
+ }
+ lb.ccRemoteLB = cc
+ go lb.watchRemoteBalancer()
+}
diff --git a/vendor/google.golang.org/grpc/grpclb_util.go b/vendor/google.golang.org/grpc/grpclb_util.go
new file mode 100644
index 0000000..93ab2db
--- /dev/null
+++ b/vendor/google.golang.org/grpc/grpclb_util.go
@@ -0,0 +1,90 @@
+/*
+ *
+ * Copyright 2016 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package grpc
+
+import (
+ "google.golang.org/grpc/balancer"
+ "google.golang.org/grpc/resolver"
+)
+
+// The parent ClientConn should re-resolve when grpclb loses connection to the
+// remote balancer. When the ClientConn inside grpclb gets a TransientFailure,
+// it calls lbManualResolver.ResolveNow(), which calls parent ClientConn's
+// ResolveNow, and eventually results in re-resolve happening in parent
+// ClientConn's resolver (DNS for example).
+//
+// parent
+// ClientConn
+// +-----------------------------------------------------------------+
+// | parent +---------------------------------+ |
+// | DNS ClientConn | grpclb | |
+// | resolver balancerWrapper | | |
+// | + + | grpclb grpclb | |
+// | | | | ManualResolver ClientConn | |
+// | | | | + + | |
+// | | | | | | Transient | |
+// | | | | | | Failure | |
+// | | | | | <--------- | | |
+// | | | <--------------- | ResolveNow | | |
+// | | <--------- | ResolveNow | | | | |
+// | | ResolveNow | | | | | |
+// | | | | | | | |
+// | + + | + + | |
+// | +---------------------------------+ |
+// +-----------------------------------------------------------------+
+
+// lbManualResolver is used by the ClientConn inside grpclb. It's a manual
+// resolver with a special ResolveNow() function.
+//
+// When ResolveNow() is called, it calls ResolveNow() on the parent ClientConn,
+// so when grpclb client lose contact with remote balancers, the parent
+// ClientConn's resolver will re-resolve.
+type lbManualResolver struct {
+ scheme string
+ ccr resolver.ClientConn
+
+ ccb balancer.ClientConn
+}
+
+func (r *lbManualResolver) Build(_ resolver.Target, cc resolver.ClientConn, _ resolver.BuildOption) (resolver.Resolver, error) {
+ r.ccr = cc
+ return r, nil
+}
+
+func (r *lbManualResolver) Scheme() string {
+ return r.scheme
+}
+
+// ResolveNow calls resolveNow on the parent ClientConn.
+func (r *lbManualResolver) ResolveNow(o resolver.ResolveNowOption) {
+ r.ccb.ResolveNow(o)
+}
+
+// Close is a noop for Resolver.
+func (*lbManualResolver) Close() {}
+
+// NewAddress calls cc.NewAddress.
+func (r *lbManualResolver) NewAddress(addrs []resolver.Address) {
+ r.ccr.NewAddress(addrs)
+}
+
+// NewServiceConfig calls cc.NewServiceConfig.
+func (r *lbManualResolver) NewServiceConfig(sc string) {
+ r.ccr.NewServiceConfig(sc)
+}
diff --git a/vendor/google.golang.org/grpc/health/health.go b/vendor/google.golang.org/grpc/health/health.go
index c6212f4..30a7866 100644
--- a/vendor/google.golang.org/grpc/health/health.go
+++ b/vendor/google.golang.org/grpc/health/health.go
@@ -26,9 +26,9 @@ import (
"sync"
"golang.org/x/net/context"
- "google.golang.org/grpc"
"google.golang.org/grpc/codes"
healthpb "google.golang.org/grpc/health/grpc_health_v1"
+ "google.golang.org/grpc/status"
)
// Server implements `service Health`.
@@ -60,7 +60,7 @@ func (s *Server) Check(ctx context.Context, in *healthpb.HealthCheckRequest) (*h
Status: status,
}, nil
}
- return nil, grpc.Errorf(codes.NotFound, "unknown service")
+ return nil, status.Error(codes.NotFound, "unknown service")
}
// SetServingStatus is called when need to reset the serving status of a service
diff --git a/vendor/google.golang.org/grpc/internal/internal.go b/vendor/google.golang.org/grpc/internal/internal.go
index 0708383..53f1775 100644
--- a/vendor/google.golang.org/grpc/internal/internal.go
+++ b/vendor/google.golang.org/grpc/internal/internal.go
@@ -19,13 +19,6 @@
// the godoc of the top-level grpc package.
package internal
-// TestingCloseConns closes all existing transports but keeps
-// grpcServer.lis accepting new connections.
-//
-// The provided grpcServer must be of type *grpc.Server. It is untyped
-// for circular dependency reasons.
-var TestingCloseConns func(grpcServer interface{})
-
// TestingUseHandlerImpl enables the http.Handler-based server implementation.
// It must be called before Serve and requires TLS credentials.
//
diff --git a/vendor/google.golang.org/grpc/naming/go17.go b/vendor/google.golang.org/grpc/naming/go17.go
index a537b08..57b65d7 100644
--- a/vendor/google.golang.org/grpc/naming/go17.go
+++ b/vendor/google.golang.org/grpc/naming/go17.go
@@ -1,4 +1,4 @@
-// +build go1.6, !go1.8
+// +build go1.6,!go1.8
/*
*
diff --git a/vendor/google.golang.org/grpc/picker_wrapper.go b/vendor/google.golang.org/grpc/picker_wrapper.go
new file mode 100644
index 0000000..db82bfb
--- /dev/null
+++ b/vendor/google.golang.org/grpc/picker_wrapper.go
@@ -0,0 +1,141 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package grpc
+
+import (
+ "sync"
+
+ "golang.org/x/net/context"
+ "google.golang.org/grpc/balancer"
+ "google.golang.org/grpc/codes"
+ "google.golang.org/grpc/grpclog"
+ "google.golang.org/grpc/status"
+ "google.golang.org/grpc/transport"
+)
+
+// pickerWrapper is a wrapper of balancer.Picker. It blocks on certain pick
+// actions and unblock when there's a picker update.
+type pickerWrapper struct {
+ mu sync.Mutex
+ done bool
+ blockingCh chan struct{}
+ picker balancer.Picker
+}
+
+func newPickerWrapper() *pickerWrapper {
+ bp := &pickerWrapper{blockingCh: make(chan struct{})}
+ return bp
+}
+
+// updatePicker is called by UpdateBalancerState. It unblocks all blocked pick.
+func (bp *pickerWrapper) updatePicker(p balancer.Picker) {
+ bp.mu.Lock()
+ if bp.done {
+ bp.mu.Unlock()
+ return
+ }
+ bp.picker = p
+ // bp.blockingCh should never be nil.
+ close(bp.blockingCh)
+ bp.blockingCh = make(chan struct{})
+ bp.mu.Unlock()
+}
+
+// pick returns the transport that will be used for the RPC.
+// It may block in the following cases:
+// - there's no picker
+// - the current picker returns ErrNoSubConnAvailable
+// - the current picker returns other errors and failfast is false.
+// - the subConn returned by the current picker is not READY
+// When one of these situations happens, pick blocks until the picker gets updated.
+func (bp *pickerWrapper) pick(ctx context.Context, failfast bool, opts balancer.PickOptions) (transport.ClientTransport, func(balancer.DoneInfo), error) {
+ var (
+ p balancer.Picker
+ ch chan struct{}
+ )
+
+ for {
+ bp.mu.Lock()
+ if bp.done {
+ bp.mu.Unlock()
+ return nil, nil, ErrClientConnClosing
+ }
+
+ if bp.picker == nil {
+ ch = bp.blockingCh
+ }
+ if ch == bp.blockingCh {
+ // This could happen when either:
+ // - bp.picker is nil (the previous if condition), or
+ // - has called pick on the current picker.
+ bp.mu.Unlock()
+ select {
+ case <-ctx.Done():
+ return nil, nil, ctx.Err()
+ case <-ch:
+ }
+ continue
+ }
+
+ ch = bp.blockingCh
+ p = bp.picker
+ bp.mu.Unlock()
+
+ subConn, done, err := p.Pick(ctx, opts)
+
+ if err != nil {
+ switch err {
+ case balancer.ErrNoSubConnAvailable:
+ continue
+ case balancer.ErrTransientFailure:
+ if !failfast {
+ continue
+ }
+ return nil, nil, status.Errorf(codes.Unavailable, "%v", err)
+ default:
+ // err is some other error.
+ return nil, nil, toRPCErr(err)
+ }
+ }
+
+ acw, ok := subConn.(*acBalancerWrapper)
+ if !ok {
+ grpclog.Infof("subconn returned from pick is not *acBalancerWrapper")
+ continue
+ }
+ if t, ok := acw.getAddrConn().getReadyTransport(); ok {
+ return t, done, nil
+ }
+ grpclog.Infof("blockingPicker: the picked transport is not ready, loop back to repick")
+ // If ok == false, ac.state is not READY.
+ // A valid picker always returns READY subConn. This means the state of ac
+ // just changed, and picker will be updated shortly.
+ // continue back to the beginning of the for loop to repick.
+ }
+}
+
+func (bp *pickerWrapper) close() {
+ bp.mu.Lock()
+ defer bp.mu.Unlock()
+ if bp.done {
+ return
+ }
+ bp.done = true
+ close(bp.blockingCh)
+}
diff --git a/vendor/google.golang.org/grpc/picker_wrapper_test.go b/vendor/google.golang.org/grpc/picker_wrapper_test.go
new file mode 100644
index 0000000..37dffa9
--- /dev/null
+++ b/vendor/google.golang.org/grpc/picker_wrapper_test.go
@@ -0,0 +1,160 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package grpc
+
+import (
+ "fmt"
+ "sync/atomic"
+ "testing"
+ "time"
+
+ "golang.org/x/net/context"
+ "google.golang.org/grpc/balancer"
+ "google.golang.org/grpc/connectivity"
+ _ "google.golang.org/grpc/grpclog/glogger"
+ "google.golang.org/grpc/test/leakcheck"
+ "google.golang.org/grpc/transport"
+)
+
+const goroutineCount = 5
+
+var (
+ testT = &testTransport{}
+ testSC = &acBalancerWrapper{ac: &addrConn{
+ state: connectivity.Ready,
+ transport: testT,
+ }}
+ testSCNotReady = &acBalancerWrapper{ac: &addrConn{
+ state: connectivity.TransientFailure,
+ }}
+)
+
+type testTransport struct {
+ transport.ClientTransport
+}
+
+type testingPicker struct {
+ err error
+ sc balancer.SubConn
+ maxCalled int64
+}
+
+func (p *testingPicker) Pick(ctx context.Context, opts balancer.PickOptions) (balancer.SubConn, func(balancer.DoneInfo), error) {
+ if atomic.AddInt64(&p.maxCalled, -1) < 0 {
+ return nil, nil, fmt.Errorf("Pick called to many times (> goroutineCount)")
+ }
+ if p.err != nil {
+ return nil, nil, p.err
+ }
+ return p.sc, nil, nil
+}
+
+func TestBlockingPickTimeout(t *testing.T) {
+ defer leakcheck.Check(t)
+ bp := newPickerWrapper()
+ ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond)
+ defer cancel()
+ if _, _, err := bp.pick(ctx, true, balancer.PickOptions{}); err != context.DeadlineExceeded {
+ t.Errorf("bp.pick returned error %v, want DeadlineExceeded", err)
+ }
+}
+
+func TestBlockingPick(t *testing.T) {
+ defer leakcheck.Check(t)
+ bp := newPickerWrapper()
+ // All goroutines should block because picker is nil in bp.
+ var finishedCount uint64
+ for i := goroutineCount; i > 0; i-- {
+ go func() {
+ if tr, _, err := bp.pick(context.Background(), true, balancer.PickOptions{}); err != nil || tr != testT {
+ t.Errorf("bp.pick returned non-nil error: %v", err)
+ }
+ atomic.AddUint64(&finishedCount, 1)
+ }()
+ }
+ time.Sleep(50 * time.Millisecond)
+ if c := atomic.LoadUint64(&finishedCount); c != 0 {
+ t.Errorf("finished goroutines count: %v, want 0", c)
+ }
+ bp.updatePicker(&testingPicker{sc: testSC, maxCalled: goroutineCount})
+}
+
+func TestBlockingPickNoSubAvailable(t *testing.T) {
+ defer leakcheck.Check(t)
+ bp := newPickerWrapper()
+ var finishedCount uint64
+ bp.updatePicker(&testingPicker{err: balancer.ErrNoSubConnAvailable, maxCalled: goroutineCount})
+ // All goroutines should block because picker returns no sc available.
+ for i := goroutineCount; i > 0; i-- {
+ go func() {
+ if tr, _, err := bp.pick(context.Background(), true, balancer.PickOptions{}); err != nil || tr != testT {
+ t.Errorf("bp.pick returned non-nil error: %v", err)
+ }
+ atomic.AddUint64(&finishedCount, 1)
+ }()
+ }
+ time.Sleep(50 * time.Millisecond)
+ if c := atomic.LoadUint64(&finishedCount); c != 0 {
+ t.Errorf("finished goroutines count: %v, want 0", c)
+ }
+ bp.updatePicker(&testingPicker{sc: testSC, maxCalled: goroutineCount})
+}
+
+func TestBlockingPickTransientWaitforready(t *testing.T) {
+ defer leakcheck.Check(t)
+ bp := newPickerWrapper()
+ bp.updatePicker(&testingPicker{err: balancer.ErrTransientFailure, maxCalled: goroutineCount})
+ var finishedCount uint64
+ // All goroutines should block because picker returns transientFailure and
+ // picks are not failfast.
+ for i := goroutineCount; i > 0; i-- {
+ go func() {
+ if tr, _, err := bp.pick(context.Background(), false, balancer.PickOptions{}); err != nil || tr != testT {
+ t.Errorf("bp.pick returned non-nil error: %v", err)
+ }
+ atomic.AddUint64(&finishedCount, 1)
+ }()
+ }
+ time.Sleep(time.Millisecond)
+ if c := atomic.LoadUint64(&finishedCount); c != 0 {
+ t.Errorf("finished goroutines count: %v, want 0", c)
+ }
+ bp.updatePicker(&testingPicker{sc: testSC, maxCalled: goroutineCount})
+}
+
+func TestBlockingPickSCNotReady(t *testing.T) {
+ defer leakcheck.Check(t)
+ bp := newPickerWrapper()
+ bp.updatePicker(&testingPicker{sc: testSCNotReady, maxCalled: goroutineCount})
+ var finishedCount uint64
+ // All goroutines should block because sc is not ready.
+ for i := goroutineCount; i > 0; i-- {
+ go func() {
+ if tr, _, err := bp.pick(context.Background(), true, balancer.PickOptions{}); err != nil || tr != testT {
+ t.Errorf("bp.pick returned non-nil error: %v", err)
+ }
+ atomic.AddUint64(&finishedCount, 1)
+ }()
+ }
+ time.Sleep(time.Millisecond)
+ if c := atomic.LoadUint64(&finishedCount); c != 0 {
+ t.Errorf("finished goroutines count: %v, want 0", c)
+ }
+ bp.updatePicker(&testingPicker{sc: testSC, maxCalled: goroutineCount})
+}
diff --git a/vendor/google.golang.org/grpc/pickfirst.go b/vendor/google.golang.org/grpc/pickfirst.go
new file mode 100644
index 0000000..bf659d4
--- /dev/null
+++ b/vendor/google.golang.org/grpc/pickfirst.go
@@ -0,0 +1,108 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package grpc
+
+import (
+ "golang.org/x/net/context"
+ "google.golang.org/grpc/balancer"
+ "google.golang.org/grpc/connectivity"
+ "google.golang.org/grpc/grpclog"
+ "google.golang.org/grpc/resolver"
+)
+
+// PickFirstBalancerName is the name of the pick_first balancer.
+const PickFirstBalancerName = "pick_first"
+
+func newPickfirstBuilder() balancer.Builder {
+ return &pickfirstBuilder{}
+}
+
+type pickfirstBuilder struct{}
+
+func (*pickfirstBuilder) Build(cc balancer.ClientConn, opt balancer.BuildOptions) balancer.Balancer {
+ return &pickfirstBalancer{cc: cc}
+}
+
+func (*pickfirstBuilder) Name() string {
+ return PickFirstBalancerName
+}
+
+type pickfirstBalancer struct {
+ cc balancer.ClientConn
+ sc balancer.SubConn
+}
+
+func (b *pickfirstBalancer) HandleResolvedAddrs(addrs []resolver.Address, err error) {
+ if err != nil {
+ grpclog.Infof("pickfirstBalancer: HandleResolvedAddrs called with error %v", err)
+ return
+ }
+ if b.sc == nil {
+ b.sc, err = b.cc.NewSubConn(addrs, balancer.NewSubConnOptions{})
+ if err != nil {
+ grpclog.Errorf("pickfirstBalancer: failed to NewSubConn: %v", err)
+ return
+ }
+ b.cc.UpdateBalancerState(connectivity.Idle, &picker{sc: b.sc})
+ b.sc.Connect()
+ } else {
+ b.sc.UpdateAddresses(addrs)
+ b.sc.Connect()
+ }
+}
+
+func (b *pickfirstBalancer) HandleSubConnStateChange(sc balancer.SubConn, s connectivity.State) {
+ grpclog.Infof("pickfirstBalancer: HandleSubConnStateChange: %p, %v", sc, s)
+ if b.sc != sc {
+ grpclog.Infof("pickfirstBalancer: ignored state change because sc is not recognized")
+ return
+ }
+ if s == connectivity.Shutdown {
+ b.sc = nil
+ return
+ }
+
+ switch s {
+ case connectivity.Ready, connectivity.Idle:
+ b.cc.UpdateBalancerState(s, &picker{sc: sc})
+ case connectivity.Connecting:
+ b.cc.UpdateBalancerState(s, &picker{err: balancer.ErrNoSubConnAvailable})
+ case connectivity.TransientFailure:
+ b.cc.UpdateBalancerState(s, &picker{err: balancer.ErrTransientFailure})
+ }
+}
+
+func (b *pickfirstBalancer) Close() {
+}
+
+type picker struct {
+ err error
+ sc balancer.SubConn
+}
+
+func (p *picker) Pick(ctx context.Context, opts balancer.PickOptions) (balancer.SubConn, func(balancer.DoneInfo), error) {
+ if p.err != nil {
+ return nil, nil, p.err
+ }
+ return p.sc, nil, nil
+}
+
+func init() {
+ balancer.Register(newPickfirstBuilder())
+}
diff --git a/vendor/google.golang.org/grpc/pickfirst_test.go b/vendor/google.golang.org/grpc/pickfirst_test.go
new file mode 100644
index 0000000..2f85feb
--- /dev/null
+++ b/vendor/google.golang.org/grpc/pickfirst_test.go
@@ -0,0 +1,360 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package grpc
+
+import (
+ "math"
+ "sync"
+ "testing"
+ "time"
+
+ "golang.org/x/net/context"
+ "google.golang.org/grpc/codes"
+ "google.golang.org/grpc/resolver"
+ "google.golang.org/grpc/resolver/manual"
+ "google.golang.org/grpc/status"
+ "google.golang.org/grpc/test/leakcheck"
+)
+
+func errorDesc(err error) string {
+ if s, ok := status.FromError(err); ok {
+ return s.Message()
+ }
+ return err.Error()
+}
+
+func TestOneBackendPickfirst(t *testing.T) {
+ defer leakcheck.Check(t)
+ r, rcleanup := manual.GenerateAndRegisterManualResolver()
+ defer rcleanup()
+
+ numServers := 1
+ servers, _, scleanup := startServers(t, numServers, math.MaxInt32)
+ defer scleanup()
+
+ cc, err := Dial(r.Scheme()+":///test.server", WithInsecure(), WithCodec(testCodec{}))
+ if err != nil {
+ t.Fatalf("failed to dial: %v", err)
+ }
+ defer cc.Close()
+ // The first RPC should fail because there's no address.
+ ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond)
+ defer cancel()
+ req := "port"
+ var reply string
+ if err := Invoke(ctx, "/foo/bar", &req, &reply, cc); err == nil || status.Code(err) != codes.DeadlineExceeded {
+ t.Fatalf("EmptyCall() = _, %v, want _, DeadlineExceeded", err)
+ }
+
+ r.NewAddress([]resolver.Address{{Addr: servers[0].addr}})
+ // The second RPC should succeed.
+ for i := 0; i < 1000; i++ {
+ if err = Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && errorDesc(err) == servers[0].port {
+ return
+ }
+ time.Sleep(time.Millisecond)
+ }
+ t.Fatalf("EmptyCall() = _, %v, want _, %v", err, servers[0].port)
+}
+
+func TestBackendsPickfirst(t *testing.T) {
+ defer leakcheck.Check(t)
+ r, rcleanup := manual.GenerateAndRegisterManualResolver()
+ defer rcleanup()
+
+ numServers := 2
+ servers, _, scleanup := startServers(t, numServers, math.MaxInt32)
+ defer scleanup()
+
+ cc, err := Dial(r.Scheme()+":///test.server", WithInsecure(), WithCodec(testCodec{}))
+ if err != nil {
+ t.Fatalf("failed to dial: %v", err)
+ }
+ defer cc.Close()
+ // The first RPC should fail because there's no address.
+ ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond)
+ defer cancel()
+ req := "port"
+ var reply string
+ if err := Invoke(ctx, "/foo/bar", &req, &reply, cc); err == nil || status.Code(err) != codes.DeadlineExceeded {
+ t.Fatalf("EmptyCall() = _, %v, want _, DeadlineExceeded", err)
+ }
+
+ r.NewAddress([]resolver.Address{{Addr: servers[0].addr}, {Addr: servers[1].addr}})
+ // The second RPC should succeed with the first server.
+ for i := 0; i < 1000; i++ {
+ if err = Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && errorDesc(err) == servers[0].port {
+ return
+ }
+ time.Sleep(time.Millisecond)
+ }
+ t.Fatalf("EmptyCall() = _, %v, want _, %v", err, servers[0].port)
+}
+
+func TestNewAddressWhileBlockingPickfirst(t *testing.T) {
+ defer leakcheck.Check(t)
+ r, rcleanup := manual.GenerateAndRegisterManualResolver()
+ defer rcleanup()
+
+ numServers := 1
+ servers, _, scleanup := startServers(t, numServers, math.MaxInt32)
+ defer scleanup()
+
+ cc, err := Dial(r.Scheme()+":///test.server", WithInsecure(), WithCodec(testCodec{}))
+ if err != nil {
+ t.Fatalf("failed to dial: %v", err)
+ }
+ defer cc.Close()
+ // The first RPC should fail because there's no address.
+ ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond)
+ defer cancel()
+ req := "port"
+ var reply string
+ if err := Invoke(ctx, "/foo/bar", &req, &reply, cc); err == nil || status.Code(err) != codes.DeadlineExceeded {
+ t.Fatalf("EmptyCall() = _, %v, want _, DeadlineExceeded", err)
+ }
+
+ var wg sync.WaitGroup
+ for i := 0; i < 3; i++ {
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ // This RPC blocks until NewAddress is called.
+ Invoke(context.Background(), "/foo/bar", &req, &reply, cc)
+ }()
+ }
+ time.Sleep(50 * time.Millisecond)
+ r.NewAddress([]resolver.Address{{Addr: servers[0].addr}})
+ wg.Wait()
+}
+
+func TestCloseWithPendingRPCPickfirst(t *testing.T) {
+ defer leakcheck.Check(t)
+ r, rcleanup := manual.GenerateAndRegisterManualResolver()
+ defer rcleanup()
+
+ numServers := 1
+ _, _, scleanup := startServers(t, numServers, math.MaxInt32)
+ defer scleanup()
+
+ cc, err := Dial(r.Scheme()+":///test.server", WithInsecure(), WithCodec(testCodec{}))
+ if err != nil {
+ t.Fatalf("failed to dial: %v", err)
+ }
+ defer cc.Close()
+ // The first RPC should fail because there's no address.
+ ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond)
+ defer cancel()
+ req := "port"
+ var reply string
+ if err := Invoke(ctx, "/foo/bar", &req, &reply, cc); err == nil || status.Code(err) != codes.DeadlineExceeded {
+ t.Fatalf("EmptyCall() = _, %v, want _, DeadlineExceeded", err)
+ }
+
+ var wg sync.WaitGroup
+ for i := 0; i < 3; i++ {
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ // This RPC blocks until NewAddress is called.
+ Invoke(context.Background(), "/foo/bar", &req, &reply, cc)
+ }()
+ }
+ time.Sleep(50 * time.Millisecond)
+ cc.Close()
+ wg.Wait()
+}
+
+func TestOneServerDownPickfirst(t *testing.T) {
+ defer leakcheck.Check(t)
+ r, rcleanup := manual.GenerateAndRegisterManualResolver()
+ defer rcleanup()
+
+ numServers := 2
+ servers, _, scleanup := startServers(t, numServers, math.MaxInt32)
+ defer scleanup()
+
+ cc, err := Dial(r.Scheme()+":///test.server", WithInsecure(), WithCodec(testCodec{}), WithWaitForHandshake())
+ if err != nil {
+ t.Fatalf("failed to dial: %v", err)
+ }
+ defer cc.Close()
+ // The first RPC should fail because there's no address.
+ ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond)
+ defer cancel()
+ req := "port"
+ var reply string
+ if err := Invoke(ctx, "/foo/bar", &req, &reply, cc); err == nil || status.Code(err) != codes.DeadlineExceeded {
+ t.Fatalf("EmptyCall() = _, %v, want _, DeadlineExceeded", err)
+ }
+
+ r.NewAddress([]resolver.Address{{Addr: servers[0].addr}, {Addr: servers[1].addr}})
+ // The second RPC should succeed with the first server.
+ for i := 0; i < 1000; i++ {
+ if err = Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && errorDesc(err) == servers[0].port {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+
+ servers[0].stop()
+ for i := 0; i < 1000; i++ {
+ if err = Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && errorDesc(err) == servers[1].port {
+ return
+ }
+ time.Sleep(time.Millisecond)
+ }
+ t.Fatalf("EmptyCall() = _, %v, want _, %v", err, servers[0].port)
+}
+
+func TestAllServersDownPickfirst(t *testing.T) {
+ defer leakcheck.Check(t)
+ r, rcleanup := manual.GenerateAndRegisterManualResolver()
+ defer rcleanup()
+
+ numServers := 2
+ servers, _, scleanup := startServers(t, numServers, math.MaxInt32)
+ defer scleanup()
+
+ cc, err := Dial(r.Scheme()+":///test.server", WithInsecure(), WithCodec(testCodec{}), WithWaitForHandshake())
+ if err != nil {
+ t.Fatalf("failed to dial: %v", err)
+ }
+ defer cc.Close()
+ // The first RPC should fail because there's no address.
+ ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond)
+ defer cancel()
+ req := "port"
+ var reply string
+ if err := Invoke(ctx, "/foo/bar", &req, &reply, cc); err == nil || status.Code(err) != codes.DeadlineExceeded {
+ t.Fatalf("EmptyCall() = _, %v, want _, DeadlineExceeded", err)
+ }
+
+ r.NewAddress([]resolver.Address{{Addr: servers[0].addr}, {Addr: servers[1].addr}})
+ // The second RPC should succeed with the first server.
+ for i := 0; i < 1000; i++ {
+ if err = Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && errorDesc(err) == servers[0].port {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+
+ for i := 0; i < numServers; i++ {
+ servers[i].stop()
+ }
+ for i := 0; i < 1000; i++ {
+ if err = Invoke(context.Background(), "/foo/bar", &req, &reply, cc); status.Code(err) == codes.Unavailable {
+ return
+ }
+ time.Sleep(time.Millisecond)
+ }
+ t.Fatalf("EmptyCall() = _, %v, want _, error with code unavailable", err)
+}
+
+func TestAddressesRemovedPickfirst(t *testing.T) {
+ defer leakcheck.Check(t)
+ r, rcleanup := manual.GenerateAndRegisterManualResolver()
+ defer rcleanup()
+
+ numServers := 3
+ servers, _, scleanup := startServers(t, numServers, math.MaxInt32)
+ defer scleanup()
+
+ cc, err := Dial(r.Scheme()+":///test.server", WithInsecure(), WithCodec(testCodec{}))
+ if err != nil {
+ t.Fatalf("failed to dial: %v", err)
+ }
+ defer cc.Close()
+ // The first RPC should fail because there's no address.
+ ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond)
+ defer cancel()
+ req := "port"
+ var reply string
+ if err := Invoke(ctx, "/foo/bar", &req, &reply, cc); err == nil || status.Code(err) != codes.DeadlineExceeded {
+ t.Fatalf("EmptyCall() = _, %v, want _, DeadlineExceeded", err)
+ }
+
+ r.NewAddress([]resolver.Address{{Addr: servers[0].addr}, {Addr: servers[1].addr}, {Addr: servers[2].addr}})
+ for i := 0; i < 1000; i++ {
+ if err = Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && errorDesc(err) == servers[0].port {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ for i := 0; i < 20; i++ {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || errorDesc(err) != servers[0].port {
+ t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 0, err, servers[0].port)
+ }
+ time.Sleep(10 * time.Millisecond)
+ }
+
+ // Remove server[0].
+ r.NewAddress([]resolver.Address{{Addr: servers[1].addr}, {Addr: servers[2].addr}})
+ for i := 0; i < 1000; i++ {
+ if err = Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && errorDesc(err) == servers[1].port {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ for i := 0; i < 20; i++ {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || errorDesc(err) != servers[1].port {
+ t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 1, err, servers[1].port)
+ }
+ time.Sleep(10 * time.Millisecond)
+ }
+
+ // Append server[0], nothing should change.
+ r.NewAddress([]resolver.Address{{Addr: servers[1].addr}, {Addr: servers[2].addr}, {Addr: servers[0].addr}})
+ for i := 0; i < 20; i++ {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || errorDesc(err) != servers[1].port {
+ t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 1, err, servers[1].port)
+ }
+ time.Sleep(10 * time.Millisecond)
+ }
+
+ // Remove server[1].
+ r.NewAddress([]resolver.Address{{Addr: servers[2].addr}, {Addr: servers[0].addr}})
+ for i := 0; i < 1000; i++ {
+ if err = Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && errorDesc(err) == servers[2].port {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ for i := 0; i < 20; i++ {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || errorDesc(err) != servers[2].port {
+ t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 2, err, servers[2].port)
+ }
+ time.Sleep(10 * time.Millisecond)
+ }
+
+ // Remove server[2].
+ r.NewAddress([]resolver.Address{{Addr: servers[0].addr}})
+ for i := 0; i < 1000; i++ {
+ if err = Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && errorDesc(err) == servers[0].port {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ for i := 0; i < 20; i++ {
+ if err := Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err == nil || errorDesc(err) != servers[0].port {
+ t.Fatalf("Index %d: Invoke(_, _, _, _, _) = %v, want %s", 0, err, servers[0].port)
+ }
+ time.Sleep(10 * time.Millisecond)
+ }
+}
diff --git a/vendor/google.golang.org/grpc/proxy_test.go b/vendor/google.golang.org/grpc/proxy_test.go
index 835b15a..39ee123 100644
--- a/vendor/google.golang.org/grpc/proxy_test.go
+++ b/vendor/google.golang.org/grpc/proxy_test.go
@@ -1,3 +1,5 @@
+// +build !race
+
/*
*
* Copyright 2017 gRPC authors.
@@ -28,6 +30,7 @@ import (
"time"
"golang.org/x/net/context"
+ "google.golang.org/grpc/test/leakcheck"
)
const (
@@ -45,29 +48,6 @@ func overwrite(hpfe func(req *http.Request) (*url.URL, error)) func() {
}
}
-func TestMapAddressEnv(t *testing.T) {
- // Overwrite the function in the test and restore them in defer.
- hpfe := func(req *http.Request) (*url.URL, error) {
- if req.URL.Host == envTestAddr {
- return &url.URL{
- Scheme: "https",
- Host: envProxyAddr,
- }, nil
- }
- return nil, nil
- }
- defer overwrite(hpfe)()
-
- // envTestAddr should be handled by ProxyFromEnvironment.
- got, err := mapAddress(context.Background(), envTestAddr)
- if err != nil {
- t.Error(err)
- }
- if got != envProxyAddr {
- t.Errorf("want %v, got %v", envProxyAddr, got)
- }
-}
-
type proxyServer struct {
t *testing.T
lis net.Listener
@@ -118,6 +98,7 @@ func (p *proxyServer) stop() {
}
func TestHTTPConnect(t *testing.T) {
+ defer leakcheck.Check(t)
plis, err := net.Listen("tcp", "localhost:0")
if err != nil {
t.Fatalf("failed to listen: %v", err)
@@ -175,3 +156,27 @@ func TestHTTPConnect(t *testing.T) {
t.Fatalf("received msg: %v, want %v", recvBuf, msg)
}
}
+
+func TestMapAddressEnv(t *testing.T) {
+ defer leakcheck.Check(t)
+ // Overwrite the function in the test and restore them in defer.
+ hpfe := func(req *http.Request) (*url.URL, error) {
+ if req.URL.Host == envTestAddr {
+ return &url.URL{
+ Scheme: "https",
+ Host: envProxyAddr,
+ }, nil
+ }
+ return nil, nil
+ }
+ defer overwrite(hpfe)()
+
+ // envTestAddr should be handled by ProxyFromEnvironment.
+ got, err := mapAddress(context.Background(), envTestAddr)
+ if err != nil {
+ t.Error(err)
+ }
+ if got != envProxyAddr {
+ t.Errorf("want %v, got %v", envProxyAddr, got)
+ }
+}
diff --git a/vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go b/vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go
new file mode 100644
index 0000000..a543a70
--- /dev/null
+++ b/vendor/google.golang.org/grpc/resolver/dns/dns_resolver.go
@@ -0,0 +1,377 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// Package dns implements a dns resolver to be installed as the default resolver
+// in grpc.
+package dns
+
+import (
+ "encoding/json"
+ "errors"
+ "fmt"
+ "math/rand"
+ "net"
+ "os"
+ "strconv"
+ "strings"
+ "sync"
+ "time"
+
+ "golang.org/x/net/context"
+ "google.golang.org/grpc/grpclog"
+ "google.golang.org/grpc/resolver"
+)
+
+func init() {
+ resolver.Register(NewBuilder())
+}
+
+const (
+ defaultPort = "443"
+ defaultFreq = time.Minute * 30
+ golang = "GO"
+ // In DNS, service config is encoded in a TXT record via the mechanism
+ // described in RFC-1464 using the attribute name grpc_config.
+ txtAttribute = "grpc_config="
+)
+
+var errMissingAddr = errors.New("missing address")
+
+// NewBuilder creates a dnsBuilder which is used to factory DNS resolvers.
+func NewBuilder() resolver.Builder {
+ return &dnsBuilder{freq: defaultFreq}
+}
+
+type dnsBuilder struct {
+ // frequency of polling the DNS server.
+ freq time.Duration
+}
+
+// Build creates and starts a DNS resolver that watches the name resolution of the target.
+func (b *dnsBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOption) (resolver.Resolver, error) {
+ host, port, err := parseTarget(target.Endpoint)
+ if err != nil {
+ return nil, err
+ }
+
+ // IP address.
+ if net.ParseIP(host) != nil {
+ host, _ = formatIP(host)
+ addr := []resolver.Address{{Addr: host + ":" + port}}
+ i := &ipResolver{
+ cc: cc,
+ ip: addr,
+ rn: make(chan struct{}, 1),
+ q: make(chan struct{}),
+ }
+ cc.NewAddress(addr)
+ go i.watcher()
+ return i, nil
+ }
+
+ // DNS address (non-IP).
+ ctx, cancel := context.WithCancel(context.Background())
+ d := &dnsResolver{
+ freq: b.freq,
+ host: host,
+ port: port,
+ ctx: ctx,
+ cancel: cancel,
+ cc: cc,
+ t: time.NewTimer(0),
+ rn: make(chan struct{}, 1),
+ }
+
+ d.wg.Add(1)
+ go d.watcher()
+ return d, nil
+}
+
+// Scheme returns the naming scheme of this resolver builder, which is "dns".
+func (b *dnsBuilder) Scheme() string {
+ return "dns"
+}
+
+// ipResolver watches for the name resolution update for an IP address.
+type ipResolver struct {
+ cc resolver.ClientConn
+ ip []resolver.Address
+ // rn channel is used by ResolveNow() to force an immediate resolution of the target.
+ rn chan struct{}
+ q chan struct{}
+}
+
+// ResolveNow resend the address it stores, no resolution is needed.
+func (i *ipResolver) ResolveNow(opt resolver.ResolveNowOption) {
+ select {
+ case i.rn <- struct{}{}:
+ default:
+ }
+}
+
+// Close closes the ipResolver.
+func (i *ipResolver) Close() {
+ close(i.q)
+}
+
+func (i *ipResolver) watcher() {
+ for {
+ select {
+ case <-i.rn:
+ i.cc.NewAddress(i.ip)
+ case <-i.q:
+ return
+ }
+ }
+}
+
+// dnsResolver watches for the name resolution update for a non-IP target.
+type dnsResolver struct {
+ freq time.Duration
+ host string
+ port string
+ ctx context.Context
+ cancel context.CancelFunc
+ cc resolver.ClientConn
+ // rn channel is used by ResolveNow() to force an immediate resolution of the target.
+ rn chan struct{}
+ t *time.Timer
+ // wg is used to enforce Close() to return after the watcher() goroutine has finished.
+ // Otherwise, data race will be possible. [Race Example] in dns_resolver_test we
+ // replace the real lookup functions with mocked ones to facilitate testing.
+ // If Close() doesn't wait for watcher() goroutine finishes, race detector sometimes
+ // will warns lookup (READ the lookup function pointers) inside watcher() goroutine
+ // has data race with replaceNetFunc (WRITE the lookup function pointers).
+ wg sync.WaitGroup
+}
+
+// ResolveNow invoke an immediate resolution of the target that this dnsResolver watches.
+func (d *dnsResolver) ResolveNow(opt resolver.ResolveNowOption) {
+ select {
+ case d.rn <- struct{}{}:
+ default:
+ }
+}
+
+// Close closes the dnsResolver.
+func (d *dnsResolver) Close() {
+ d.cancel()
+ d.wg.Wait()
+ d.t.Stop()
+}
+
+func (d *dnsResolver) watcher() {
+ defer d.wg.Done()
+ for {
+ select {
+ case <-d.ctx.Done():
+ return
+ case <-d.t.C:
+ case <-d.rn:
+ }
+ result, sc := d.lookup()
+ // Next lookup should happen after an interval defined by d.freq.
+ d.t.Reset(d.freq)
+ d.cc.NewServiceConfig(string(sc))
+ d.cc.NewAddress(result)
+ }
+}
+
+func (d *dnsResolver) lookupSRV() []resolver.Address {
+ var newAddrs []resolver.Address
+ _, srvs, err := lookupSRV(d.ctx, "grpclb", "tcp", d.host)
+ if err != nil {
+ grpclog.Infof("grpc: failed dns SRV record lookup due to %v.\n", err)
+ return nil
+ }
+ for _, s := range srvs {
+ lbAddrs, err := lookupHost(d.ctx, s.Target)
+ if err != nil {
+ grpclog.Warningf("grpc: failed load banlacer address dns lookup due to %v.\n", err)
+ continue
+ }
+ for _, a := range lbAddrs {
+ a, ok := formatIP(a)
+ if !ok {
+ grpclog.Errorf("grpc: failed IP parsing due to %v.\n", err)
+ continue
+ }
+ addr := a + ":" + strconv.Itoa(int(s.Port))
+ newAddrs = append(newAddrs, resolver.Address{Addr: addr, Type: resolver.GRPCLB, ServerName: s.Target})
+ }
+ }
+ return newAddrs
+}
+
+func (d *dnsResolver) lookupTXT() string {
+ ss, err := lookupTXT(d.ctx, d.host)
+ if err != nil {
+ grpclog.Warningf("grpc: failed dns TXT record lookup due to %v.\n", err)
+ return ""
+ }
+ var res string
+ for _, s := range ss {
+ res += s
+ }
+
+ // TXT record must have "grpc_config=" attribute in order to be used as service config.
+ if !strings.HasPrefix(res, txtAttribute) {
+ grpclog.Warningf("grpc: TXT record %v missing %v attribute", res, txtAttribute)
+ return ""
+ }
+ return strings.TrimPrefix(res, txtAttribute)
+}
+
+func (d *dnsResolver) lookupHost() []resolver.Address {
+ var newAddrs []resolver.Address
+ addrs, err := lookupHost(d.ctx, d.host)
+ if err != nil {
+ grpclog.Warningf("grpc: failed dns A record lookup due to %v.\n", err)
+ return nil
+ }
+ for _, a := range addrs {
+ a, ok := formatIP(a)
+ if !ok {
+ grpclog.Errorf("grpc: failed IP parsing due to %v.\n", err)
+ continue
+ }
+ addr := a + ":" + d.port
+ newAddrs = append(newAddrs, resolver.Address{Addr: addr})
+ }
+ return newAddrs
+}
+
+func (d *dnsResolver) lookup() ([]resolver.Address, string) {
+ var newAddrs []resolver.Address
+ newAddrs = d.lookupSRV()
+ // Support fallback to non-balancer address.
+ newAddrs = append(newAddrs, d.lookupHost()...)
+ sc := d.lookupTXT()
+ return newAddrs, canaryingSC(sc)
+}
+
+// formatIP returns ok = false if addr is not a valid textual representation of an IP address.
+// If addr is an IPv4 address, return the addr and ok = true.
+// If addr is an IPv6 address, return the addr enclosed in square brackets and ok = true.
+func formatIP(addr string) (addrIP string, ok bool) {
+ ip := net.ParseIP(addr)
+ if ip == nil {
+ return "", false
+ }
+ if ip.To4() != nil {
+ return addr, true
+ }
+ return "[" + addr + "]", true
+}
+
+// parseTarget takes the user input target string, returns formatted host and port info.
+// If target doesn't specify a port, set the port to be the defaultPort.
+// If target is in IPv6 format and host-name is enclosed in sqarue brackets, brackets
+// are strippd when setting the host.
+// examples:
+// target: "www.google.com" returns host: "www.google.com", port: "443"
+// target: "ipv4-host:80" returns host: "ipv4-host", port: "80"
+// target: "[ipv6-host]" returns host: "ipv6-host", port: "443"
+// target: ":80" returns host: "localhost", port: "80"
+// target: ":" returns host: "localhost", port: "443"
+func parseTarget(target string) (host, port string, err error) {
+ if target == "" {
+ return "", "", errMissingAddr
+ }
+ if ip := net.ParseIP(target); ip != nil {
+ // target is an IPv4 or IPv6(without brackets) address
+ return target, defaultPort, nil
+ }
+ if host, port, err = net.SplitHostPort(target); err == nil {
+ // target has port, i.e ipv4-host:port, [ipv6-host]:port, host-name:port
+ if host == "" {
+ // Keep consistent with net.Dial(): If the host is empty, as in ":80", the local system is assumed.
+ host = "localhost"
+ }
+ if port == "" {
+ // If the port field is empty(target ends with colon), e.g. "[::1]:", defaultPort is used.
+ port = defaultPort
+ }
+ return host, port, nil
+ }
+ if host, port, err = net.SplitHostPort(target + ":" + defaultPort); err == nil {
+ // target doesn't have port
+ return host, port, nil
+ }
+ return "", "", fmt.Errorf("invalid target address %v, error info: %v", target, err)
+}
+
+type rawChoice struct {
+ ClientLanguage *[]string `json:"clientLanguage,omitempty"`
+ Percentage *int `json:"percentage,omitempty"`
+ ClientHostName *[]string `json:"clientHostName,omitempty"`
+ ServiceConfig *json.RawMessage `json:"serviceConfig,omitempty"`
+}
+
+func containsString(a *[]string, b string) bool {
+ if a == nil {
+ return true
+ }
+ for _, c := range *a {
+ if c == b {
+ return true
+ }
+ }
+ return false
+}
+
+func chosenByPercentage(a *int) bool {
+ if a == nil {
+ return true
+ }
+ s := rand.NewSource(time.Now().UnixNano())
+ r := rand.New(s)
+ if r.Intn(100)+1 > *a {
+ return false
+ }
+ return true
+}
+
+func canaryingSC(js string) string {
+ if js == "" {
+ return ""
+ }
+ var rcs []rawChoice
+ err := json.Unmarshal([]byte(js), &rcs)
+ if err != nil {
+ grpclog.Warningf("grpc: failed to parse service config json string due to %v.\n", err)
+ return ""
+ }
+ cliHostname, err := os.Hostname()
+ if err != nil {
+ grpclog.Warningf("grpc: failed to get client hostname due to %v.\n", err)
+ return ""
+ }
+ var sc string
+ for _, c := range rcs {
+ if !containsString(c.ClientLanguage, golang) ||
+ !chosenByPercentage(c.Percentage) ||
+ !containsString(c.ClientHostName, cliHostname) ||
+ c.ServiceConfig == nil {
+ continue
+ }
+ sc = string(*c.ServiceConfig)
+ break
+ }
+ return sc
+}
diff --git a/vendor/google.golang.org/grpc/resolver/dns/dns_resolver_test.go b/vendor/google.golang.org/grpc/resolver/dns/dns_resolver_test.go
new file mode 100644
index 0000000..41a9ecb
--- /dev/null
+++ b/vendor/google.golang.org/grpc/resolver/dns/dns_resolver_test.go
@@ -0,0 +1,894 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package dns
+
+import (
+ "fmt"
+ "net"
+ "os"
+ "reflect"
+ "sync"
+ "testing"
+ "time"
+
+ "google.golang.org/grpc/resolver"
+ "google.golang.org/grpc/test/leakcheck"
+)
+
+func TestMain(m *testing.M) {
+ cleanup := replaceNetFunc()
+ code := m.Run()
+ cleanup()
+ os.Exit(code)
+}
+
+const (
+ txtBytesLimit = 255
+)
+
+type testClientConn struct {
+ target string
+ m1 sync.Mutex
+ addrs []resolver.Address
+ a int
+ m2 sync.Mutex
+ sc string
+ s int
+}
+
+func (t *testClientConn) NewAddress(addresses []resolver.Address) {
+ t.m1.Lock()
+ defer t.m1.Unlock()
+ t.addrs = addresses
+ t.a++
+}
+
+func (t *testClientConn) getAddress() ([]resolver.Address, int) {
+ t.m1.Lock()
+ defer t.m1.Unlock()
+ return t.addrs, t.a
+}
+
+func (t *testClientConn) NewServiceConfig(serviceConfig string) {
+ t.m2.Lock()
+ defer t.m2.Unlock()
+ t.sc = serviceConfig
+ t.s++
+}
+
+func (t *testClientConn) getSc() (string, int) {
+ t.m2.Lock()
+ defer t.m2.Unlock()
+ return t.sc, t.s
+}
+
+var hostLookupTbl = struct {
+ sync.Mutex
+ tbl map[string][]string
+}{
+ tbl: map[string][]string{
+ "foo.bar.com": {"1.2.3.4", "5.6.7.8"},
+ "ipv4.single.fake": {"1.2.3.4"},
+ "srv.ipv4.single.fake": {"2.4.6.8"},
+ "ipv4.multi.fake": {"1.2.3.4", "5.6.7.8", "9.10.11.12"},
+ "ipv6.single.fake": {"2607:f8b0:400a:801::1001"},
+ "ipv6.multi.fake": {"2607:f8b0:400a:801::1001", "2607:f8b0:400a:801::1002", "2607:f8b0:400a:801::1003"},
+ },
+}
+
+func hostLookup(host string) ([]string, error) {
+ hostLookupTbl.Lock()
+ defer hostLookupTbl.Unlock()
+ if addrs, cnt := hostLookupTbl.tbl[host]; cnt {
+ return addrs, nil
+ }
+ return nil, fmt.Errorf("failed to lookup host:%s resolution in hostLookupTbl", host)
+}
+
+var srvLookupTbl = struct {
+ sync.Mutex
+ tbl map[string][]*net.SRV
+}{
+ tbl: map[string][]*net.SRV{
+ "_grpclb._tcp.srv.ipv4.single.fake": {&net.SRV{Target: "ipv4.single.fake", Port: 1234}},
+ "_grpclb._tcp.srv.ipv4.multi.fake": {&net.SRV{Target: "ipv4.multi.fake", Port: 1234}},
+ "_grpclb._tcp.srv.ipv6.single.fake": {&net.SRV{Target: "ipv6.single.fake", Port: 1234}},
+ "_grpclb._tcp.srv.ipv6.multi.fake": {&net.SRV{Target: "ipv6.multi.fake", Port: 1234}},
+ },
+}
+
+func srvLookup(service, proto, name string) (string, []*net.SRV, error) {
+ cname := "_" + service + "._" + proto + "." + name
+ srvLookupTbl.Lock()
+ defer srvLookupTbl.Unlock()
+ if srvs, cnt := srvLookupTbl.tbl[cname]; cnt {
+ return cname, srvs, nil
+ }
+ return "", nil, fmt.Errorf("failed to lookup srv record for %s in srvLookupTbl", cname)
+}
+
+// div divides a byte slice into a slice of strings, each of which is of maximum
+// 255 bytes length, which is the length limit per TXT record in DNS.
+func div(b []byte) []string {
+ var r []string
+ for i := 0; i < len(b); i += txtBytesLimit {
+ if i+txtBytesLimit > len(b) {
+ r = append(r, string(b[i:]))
+ } else {
+ r = append(r, string(b[i:i+txtBytesLimit]))
+ }
+ }
+ return r
+}
+
+// scfs contains an array of service config file string in JSON format.
+// Notes about the scfs contents and usage:
+// scfs contains 4 service config file JSON strings for testing. Inside each
+// service config file, there are multiple choices. scfs[0:3] each contains 5
+// choices, and first 3 choices are nonmatching choices based on canarying rule,
+// while the last two are matched choices. scfs[3] only contains 3 choices, and
+// all of them are nonmatching based on canarying rule. For each of scfs[0:3],
+// the eventually returned service config, which is from the first of the two
+// matched choices, is stored in the corresponding scs element (e.g.
+// scfs[0]->scs[0]). scfs and scs elements are used in pair to test the dns
+// resolver functionality, with scfs as the input and scs used for validation of
+// the output. For scfs[3], it corresponds to empty service config, since there
+// isn't a matched choice.
+var scfs = []string{
+ `[
+ {
+ "clientLanguage": [
+ "CPP",
+ "JAVA"
+ ],
+ "serviceConfig": {
+ "loadBalancingPolicy": "grpclb",
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "all"
+ }
+ ],
+ "timeout": "1s"
+ }
+ ]
+ }
+ },
+ {
+ "percentage": 0,
+ "serviceConfig": {
+ "loadBalancingPolicy": "grpclb",
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "all"
+ }
+ ],
+ "timeout": "1s"
+ }
+ ]
+ }
+ },
+ {
+ "clientHostName": [
+ "localhost"
+ ],
+ "serviceConfig": {
+ "loadBalancingPolicy": "grpclb",
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "all"
+ }
+ ],
+ "timeout": "1s"
+ }
+ ]
+ }
+ },
+ {
+ "clientLanguage": [
+ "GO"
+ ],
+ "percentage": 100,
+ "serviceConfig": {
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "method": "bar"
+ }
+ ],
+ "maxRequestMessageBytes": 1024,
+ "maxResponseMessageBytes": 1024
+ }
+ ]
+ }
+ },
+ {
+ "serviceConfig": {
+ "loadBalancingPolicy": "round_robin",
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "foo",
+ "method": "bar"
+ }
+ ],
+ "waitForReady": true
+ }
+ ]
+ }
+ }
+]`,
+ `[
+ {
+ "clientLanguage": [
+ "CPP",
+ "JAVA"
+ ],
+ "serviceConfig": {
+ "loadBalancingPolicy": "grpclb",
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "all"
+ }
+ ],
+ "timeout": "1s"
+ }
+ ]
+ }
+ },
+ {
+ "percentage": 0,
+ "serviceConfig": {
+ "loadBalancingPolicy": "grpclb",
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "all"
+ }
+ ],
+ "timeout": "1s"
+ }
+ ]
+ }
+ },
+ {
+ "clientHostName": [
+ "localhost"
+ ],
+ "serviceConfig": {
+ "loadBalancingPolicy": "grpclb",
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "all"
+ }
+ ],
+ "timeout": "1s"
+ }
+ ]
+ }
+ },
+ {
+ "clientLanguage": [
+ "GO"
+ ],
+ "percentage": 100,
+ "serviceConfig": {
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "foo",
+ "method": "bar"
+ }
+ ],
+ "waitForReady": true,
+ "timeout": "1s",
+ "maxRequestMessageBytes": 1024,
+ "maxResponseMessageBytes": 1024
+ }
+ ]
+ }
+ },
+ {
+ "serviceConfig": {
+ "loadBalancingPolicy": "round_robin",
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "foo",
+ "method": "bar"
+ }
+ ],
+ "waitForReady": true
+ }
+ ]
+ }
+ }
+]`,
+ `[
+ {
+ "clientLanguage": [
+ "CPP",
+ "JAVA"
+ ],
+ "serviceConfig": {
+ "loadBalancingPolicy": "grpclb",
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "all"
+ }
+ ],
+ "timeout": "1s"
+ }
+ ]
+ }
+ },
+ {
+ "percentage": 0,
+ "serviceConfig": {
+ "loadBalancingPolicy": "grpclb",
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "all"
+ }
+ ],
+ "timeout": "1s"
+ }
+ ]
+ }
+ },
+ {
+ "clientHostName": [
+ "localhost"
+ ],
+ "serviceConfig": {
+ "loadBalancingPolicy": "grpclb",
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "all"
+ }
+ ],
+ "timeout": "1s"
+ }
+ ]
+ }
+ },
+ {
+ "clientLanguage": [
+ "GO"
+ ],
+ "percentage": 100,
+ "serviceConfig": {
+ "loadBalancingPolicy": "round_robin",
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "foo"
+ }
+ ],
+ "waitForReady": true,
+ "timeout": "1s"
+ },
+ {
+ "name": [
+ {
+ "service": "bar"
+ }
+ ],
+ "waitForReady": false
+ }
+ ]
+ }
+ },
+ {
+ "serviceConfig": {
+ "loadBalancingPolicy": "round_robin",
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "foo",
+ "method": "bar"
+ }
+ ],
+ "waitForReady": true
+ }
+ ]
+ }
+ }
+]`,
+ `[
+ {
+ "clientLanguage": [
+ "CPP",
+ "JAVA"
+ ],
+ "serviceConfig": {
+ "loadBalancingPolicy": "grpclb",
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "all"
+ }
+ ],
+ "timeout": "1s"
+ }
+ ]
+ }
+ },
+ {
+ "percentage": 0,
+ "serviceConfig": {
+ "loadBalancingPolicy": "grpclb",
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "all"
+ }
+ ],
+ "timeout": "1s"
+ }
+ ]
+ }
+ },
+ {
+ "clientHostName": [
+ "localhost"
+ ],
+ "serviceConfig": {
+ "loadBalancingPolicy": "grpclb",
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "all"
+ }
+ ],
+ "timeout": "1s"
+ }
+ ]
+ }
+ }
+]`,
+}
+
+// scs contains an array of service config string in JSON format.
+var scs = []string{
+ `{
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "method": "bar"
+ }
+ ],
+ "maxRequestMessageBytes": 1024,
+ "maxResponseMessageBytes": 1024
+ }
+ ]
+ }`,
+ `{
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "foo",
+ "method": "bar"
+ }
+ ],
+ "waitForReady": true,
+ "timeout": "1s",
+ "maxRequestMessageBytes": 1024,
+ "maxResponseMessageBytes": 1024
+ }
+ ]
+ }`,
+ `{
+ "loadBalancingPolicy": "round_robin",
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "foo"
+ }
+ ],
+ "waitForReady": true,
+ "timeout": "1s"
+ },
+ {
+ "name": [
+ {
+ "service": "bar"
+ }
+ ],
+ "waitForReady": false
+ }
+ ]
+ }`,
+}
+
+// scLookupTbl is a set, which contains targets that have service config. Target
+// not in this set should not have service config.
+var scLookupTbl = map[string]bool{
+ "foo.bar.com": true,
+ "srv.ipv4.single.fake": true,
+ "srv.ipv4.multi.fake": true,
+ "no.attribute": true,
+}
+
+// generateSCF generates a slice of strings (aggregately representing a single
+// service config file) for the input name, which mocks the result from a real
+// DNS TXT record lookup.
+func generateSCF(name string) []string {
+ var b []byte
+ switch name {
+ case "foo.bar.com":
+ b = []byte(scfs[0])
+ case "srv.ipv4.single.fake":
+ b = []byte(scfs[1])
+ case "srv.ipv4.multi.fake":
+ b = []byte(scfs[2])
+ default:
+ b = []byte(scfs[3])
+ }
+ if name == "no.attribute" {
+ return div(b)
+ }
+ return div(append([]byte(txtAttribute), b...))
+}
+
+// generateSC returns a service config string in JSON format for the input name.
+func generateSC(name string) string {
+ _, cnt := scLookupTbl[name]
+ if !cnt || name == "no.attribute" {
+ return ""
+ }
+ switch name {
+ case "foo.bar.com":
+ return scs[0]
+ case "srv.ipv4.single.fake":
+ return scs[1]
+ case "srv.ipv4.multi.fake":
+ return scs[2]
+ default:
+ return ""
+ }
+}
+
+var txtLookupTbl = struct {
+ sync.Mutex
+ tbl map[string][]string
+}{
+ tbl: map[string][]string{
+ "foo.bar.com": generateSCF("foo.bar.com"),
+ "srv.ipv4.single.fake": generateSCF("srv.ipv4.single.fake"),
+ "srv.ipv4.multi.fake": generateSCF("srv.ipv4.multi.fake"),
+ "srv.ipv6.single.fake": generateSCF("srv.ipv6.single.fake"),
+ "srv.ipv6.multi.fake": generateSCF("srv.ipv6.multi.fake"),
+ "no.attribute": generateSCF("no.attribute"),
+ },
+}
+
+func txtLookup(host string) ([]string, error) {
+ txtLookupTbl.Lock()
+ defer txtLookupTbl.Unlock()
+ if scs, cnt := txtLookupTbl.tbl[host]; cnt {
+ return scs, nil
+ }
+ return nil, fmt.Errorf("failed to lookup TXT:%s resolution in txtLookupTbl", host)
+}
+
+func TestResolve(t *testing.T) {
+ testDNSResolver(t)
+ testDNSResolveNow(t)
+ testIPResolver(t)
+}
+
+func testDNSResolver(t *testing.T) {
+ defer leakcheck.Check(t)
+ tests := []struct {
+ target string
+ addrWant []resolver.Address
+ scWant string
+ }{
+ {
+ "foo.bar.com",
+ []resolver.Address{{Addr: "1.2.3.4" + colonDefaultPort}, {Addr: "5.6.7.8" + colonDefaultPort}},
+ generateSC("foo.bar.com"),
+ },
+ {
+ "foo.bar.com:1234",
+ []resolver.Address{{Addr: "1.2.3.4:1234"}, {Addr: "5.6.7.8:1234"}},
+ generateSC("foo.bar.com"),
+ },
+ {
+ "srv.ipv4.single.fake",
+ []resolver.Address{{Addr: "1.2.3.4:1234", Type: resolver.GRPCLB, ServerName: "ipv4.single.fake"}, {Addr: "2.4.6.8" + colonDefaultPort}},
+ generateSC("srv.ipv4.single.fake"),
+ },
+ {
+ "srv.ipv4.multi.fake",
+ []resolver.Address{
+ {Addr: "1.2.3.4:1234", Type: resolver.GRPCLB, ServerName: "ipv4.multi.fake"},
+ {Addr: "5.6.7.8:1234", Type: resolver.GRPCLB, ServerName: "ipv4.multi.fake"},
+ {Addr: "9.10.11.12:1234", Type: resolver.GRPCLB, ServerName: "ipv4.multi.fake"},
+ },
+ generateSC("srv.ipv4.multi.fake"),
+ },
+ {
+ "srv.ipv6.single.fake",
+ []resolver.Address{{Addr: "[2607:f8b0:400a:801::1001]:1234", Type: resolver.GRPCLB, ServerName: "ipv6.single.fake"}},
+ generateSC("srv.ipv6.single.fake"),
+ },
+ {
+ "srv.ipv6.multi.fake",
+ []resolver.Address{
+ {Addr: "[2607:f8b0:400a:801::1001]:1234", Type: resolver.GRPCLB, ServerName: "ipv6.multi.fake"},
+ {Addr: "[2607:f8b0:400a:801::1002]:1234", Type: resolver.GRPCLB, ServerName: "ipv6.multi.fake"},
+ {Addr: "[2607:f8b0:400a:801::1003]:1234", Type: resolver.GRPCLB, ServerName: "ipv6.multi.fake"},
+ },
+ generateSC("srv.ipv6.multi.fake"),
+ },
+ {
+ "no.attribute",
+ nil,
+ generateSC("no.attribute"),
+ },
+ }
+
+ for _, a := range tests {
+ b := NewBuilder()
+ cc := &testClientConn{target: a.target}
+ r, err := b.Build(resolver.Target{Endpoint: a.target}, cc, resolver.BuildOption{})
+ if err != nil {
+ t.Fatalf("%v\n", err)
+ }
+ var addrs []resolver.Address
+ var cnt int
+ for {
+ addrs, cnt = cc.getAddress()
+ if cnt > 0 {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ var sc string
+ for {
+ sc, cnt = cc.getSc()
+ if cnt > 0 {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !reflect.DeepEqual(a.addrWant, addrs) {
+ t.Errorf("Resolved addresses of target: %q = %+v, want %+v\n", a.target, addrs, a.addrWant)
+ }
+ if !reflect.DeepEqual(a.scWant, sc) {
+ t.Errorf("Resolved service config of target: %q = %+v, want %+v\n", a.target, sc, a.scWant)
+ }
+ r.Close()
+ }
+}
+
+func mutateTbl(target string) func() {
+ hostLookupTbl.Lock()
+ oldHostTblEntry := hostLookupTbl.tbl[target]
+ hostLookupTbl.tbl[target] = hostLookupTbl.tbl[target][:len(oldHostTblEntry)-1]
+ hostLookupTbl.Unlock()
+ txtLookupTbl.Lock()
+ oldTxtTblEntry := txtLookupTbl.tbl[target]
+ txtLookupTbl.tbl[target] = []string{""}
+ txtLookupTbl.Unlock()
+
+ return func() {
+ hostLookupTbl.Lock()
+ hostLookupTbl.tbl[target] = oldHostTblEntry
+ hostLookupTbl.Unlock()
+ txtLookupTbl.Lock()
+ txtLookupTbl.tbl[target] = oldTxtTblEntry
+ txtLookupTbl.Unlock()
+ }
+}
+
+func testDNSResolveNow(t *testing.T) {
+ defer leakcheck.Check(t)
+ tests := []struct {
+ target string
+ addrWant []resolver.Address
+ addrNext []resolver.Address
+ scWant string
+ scNext string
+ }{
+ {
+ "foo.bar.com",
+ []resolver.Address{{Addr: "1.2.3.4" + colonDefaultPort}, {Addr: "5.6.7.8" + colonDefaultPort}},
+ []resolver.Address{{Addr: "1.2.3.4" + colonDefaultPort}},
+ generateSC("foo.bar.com"),
+ "",
+ },
+ }
+
+ for _, a := range tests {
+ b := NewBuilder()
+ cc := &testClientConn{target: a.target}
+ r, err := b.Build(resolver.Target{Endpoint: a.target}, cc, resolver.BuildOption{})
+ if err != nil {
+ t.Fatalf("%v\n", err)
+ }
+ var addrs []resolver.Address
+ var cnt int
+ for {
+ addrs, cnt = cc.getAddress()
+ if cnt > 0 {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ var sc string
+ for {
+ sc, cnt = cc.getSc()
+ if cnt > 0 {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !reflect.DeepEqual(a.addrWant, addrs) {
+ t.Errorf("Resolved addresses of target: %q = %+v, want %+v\n", a.target, addrs, a.addrWant)
+ }
+ if !reflect.DeepEqual(a.scWant, sc) {
+ t.Errorf("Resolved service config of target: %q = %+v, want %+v\n", a.target, sc, a.scWant)
+ }
+ revertTbl := mutateTbl(a.target)
+ r.ResolveNow(resolver.ResolveNowOption{})
+ for {
+ addrs, cnt = cc.getAddress()
+ if cnt == 2 {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ for {
+ sc, cnt = cc.getSc()
+ if cnt == 2 {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !reflect.DeepEqual(a.addrNext, addrs) {
+ t.Errorf("Resolved addresses of target: %q = %+v, want %+v\n", a.target, addrs, a.addrNext)
+ }
+ if !reflect.DeepEqual(a.scNext, sc) {
+ t.Errorf("Resolved service config of target: %q = %+v, want %+v\n", a.target, sc, a.scNext)
+ }
+ revertTbl()
+ r.Close()
+ }
+}
+
+const colonDefaultPort = ":" + defaultPort
+
+func testIPResolver(t *testing.T) {
+ defer leakcheck.Check(t)
+ tests := []struct {
+ target string
+ want []resolver.Address
+ }{
+ {"127.0.0.1", []resolver.Address{{Addr: "127.0.0.1" + colonDefaultPort}}},
+ {"127.0.0.1:12345", []resolver.Address{{Addr: "127.0.0.1:12345"}}},
+ {"::1", []resolver.Address{{Addr: "[::1]" + colonDefaultPort}}},
+ {"[::1]:12345", []resolver.Address{{Addr: "[::1]:12345"}}},
+ {"[::1]:", []resolver.Address{{Addr: "[::1]:443"}}},
+ {"2001:db8:85a3::8a2e:370:7334", []resolver.Address{{Addr: "[2001:db8:85a3::8a2e:370:7334]" + colonDefaultPort}}},
+ {"[2001:db8:85a3::8a2e:370:7334]", []resolver.Address{{Addr: "[2001:db8:85a3::8a2e:370:7334]" + colonDefaultPort}}},
+ {"[2001:db8:85a3::8a2e:370:7334]:12345", []resolver.Address{{Addr: "[2001:db8:85a3::8a2e:370:7334]:12345"}}},
+ {"[2001:db8::1]:http", []resolver.Address{{Addr: "[2001:db8::1]:http"}}},
+ // TODO(yuxuanli): zone support?
+ }
+
+ for _, v := range tests {
+ b := NewBuilder()
+ cc := &testClientConn{target: v.target}
+ r, err := b.Build(resolver.Target{Endpoint: v.target}, cc, resolver.BuildOption{})
+ if err != nil {
+ t.Fatalf("%v\n", err)
+ }
+ var addrs []resolver.Address
+ var cnt int
+ for {
+ addrs, cnt = cc.getAddress()
+ if cnt > 0 {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !reflect.DeepEqual(v.want, addrs) {
+ t.Errorf("Resolved addresses of target: %q = %+v, want %+v\n", v.target, addrs, v.want)
+ }
+ r.ResolveNow(resolver.ResolveNowOption{})
+ for {
+ addrs, cnt = cc.getAddress()
+ if cnt == 2 {
+ break
+ }
+ time.Sleep(time.Millisecond)
+ }
+ if !reflect.DeepEqual(v.want, addrs) {
+ t.Errorf("Resolved addresses of target: %q = %+v, want %+v\n", v.target, addrs, v.want)
+ }
+ r.Close()
+ }
+}
+
+func TestResolveFunc(t *testing.T) {
+ defer leakcheck.Check(t)
+ tests := []struct {
+ addr string
+ want error
+ }{
+ // TODO(yuxuanli): More false cases?
+ {"www.google.com", nil},
+ {"foo.bar:12345", nil},
+ {"127.0.0.1", nil},
+ {"127.0.0.1:12345", nil},
+ {"[::1]:80", nil},
+ {"[2001:db8:a0b:12f0::1]:21", nil},
+ {":80", nil},
+ {"127.0.0...1:12345", nil},
+ {"[fe80::1%lo0]:80", nil},
+ {"golang.org:http", nil},
+ {"[2001:db8::1]:http", nil},
+ {":", nil},
+ {"", errMissingAddr},
+ {"[2001:db8:a0b:12f0::1", errForInvalidTarget},
+ }
+
+ b := NewBuilder()
+ for _, v := range tests {
+ cc := &testClientConn{target: v.addr}
+ r, err := b.Build(resolver.Target{Endpoint: v.addr}, cc, resolver.BuildOption{})
+ if err == nil {
+ r.Close()
+ }
+ if !reflect.DeepEqual(err, v.want) {
+ t.Errorf("Build(%q, cc, resolver.BuildOption{}) = %v, want %v", v.addr, err, v.want)
+ }
+ }
+}
diff --git a/vendor/google.golang.org/grpc/resolver/dns/go17.go b/vendor/google.golang.org/grpc/resolver/dns/go17.go
new file mode 100644
index 0000000..b466bc8
--- /dev/null
+++ b/vendor/google.golang.org/grpc/resolver/dns/go17.go
@@ -0,0 +1,35 @@
+// +build go1.6, !go1.8
+
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package dns
+
+import (
+ "net"
+
+ "golang.org/x/net/context"
+)
+
+var (
+ lookupHost = func(ctx context.Context, host string) ([]string, error) { return net.LookupHost(host) }
+ lookupSRV = func(ctx context.Context, service, proto, name string) (string, []*net.SRV, error) {
+ return net.LookupSRV(service, proto, name)
+ }
+ lookupTXT = func(ctx context.Context, name string) ([]string, error) { return net.LookupTXT(name) }
+)
diff --git a/vendor/google.golang.org/grpc/resolver/dns/go17_test.go b/vendor/google.golang.org/grpc/resolver/dns/go17_test.go
new file mode 100644
index 0000000..21eaa88
--- /dev/null
+++ b/vendor/google.golang.org/grpc/resolver/dns/go17_test.go
@@ -0,0 +1,50 @@
+// +build go1.6, !go1.8
+
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package dns
+
+import (
+ "fmt"
+ "net"
+
+ "golang.org/x/net/context"
+)
+
+var errForInvalidTarget = fmt.Errorf("invalid target address [2001:db8:a0b:12f0::1, error info: missing ']' in address [2001:db8:a0b:12f0::1:443")
+
+func replaceNetFunc() func() {
+ oldLookupHost := lookupHost
+ oldLookupSRV := lookupSRV
+ oldLookupTXT := lookupTXT
+ lookupHost = func(ctx context.Context, host string) ([]string, error) {
+ return hostLookup(host)
+ }
+ lookupSRV = func(ctx context.Context, service, proto, name string) (string, []*net.SRV, error) {
+ return srvLookup(service, proto, name)
+ }
+ lookupTXT = func(ctx context.Context, host string) ([]string, error) {
+ return txtLookup(host)
+ }
+ return func() {
+ lookupHost = oldLookupHost
+ lookupSRV = oldLookupSRV
+ lookupTXT = oldLookupTXT
+ }
+}
diff --git a/vendor/google.golang.org/grpc/resolver/dns/go18.go b/vendor/google.golang.org/grpc/resolver/dns/go18.go
new file mode 100644
index 0000000..fa34f14
--- /dev/null
+++ b/vendor/google.golang.org/grpc/resolver/dns/go18.go
@@ -0,0 +1,29 @@
+// +build go1.8
+
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package dns
+
+import "net"
+
+var (
+ lookupHost = net.DefaultResolver.LookupHost
+ lookupSRV = net.DefaultResolver.LookupSRV
+ lookupTXT = net.DefaultResolver.LookupTXT
+)
diff --git a/vendor/google.golang.org/grpc/resolver/dns/go18_test.go b/vendor/google.golang.org/grpc/resolver/dns/go18_test.go
new file mode 100644
index 0000000..b0149c8
--- /dev/null
+++ b/vendor/google.golang.org/grpc/resolver/dns/go18_test.go
@@ -0,0 +1,49 @@
+// +build go1.8
+
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package dns
+
+import (
+ "context"
+ "fmt"
+ "net"
+)
+
+var errForInvalidTarget = fmt.Errorf("invalid target address [2001:db8:a0b:12f0::1, error info: address [2001:db8:a0b:12f0::1:443: missing ']' in address")
+
+func replaceNetFunc() func() {
+ oldLookupHost := lookupHost
+ oldLookupSRV := lookupSRV
+ oldLookupTXT := lookupTXT
+ lookupHost = func(ctx context.Context, host string) ([]string, error) {
+ return hostLookup(host)
+ }
+ lookupSRV = func(ctx context.Context, service, proto, name string) (string, []*net.SRV, error) {
+ return srvLookup(service, proto, name)
+ }
+ lookupTXT = func(ctx context.Context, host string) ([]string, error) {
+ return txtLookup(host)
+ }
+ return func() {
+ lookupHost = oldLookupHost
+ lookupSRV = oldLookupSRV
+ lookupTXT = oldLookupTXT
+ }
+}
diff --git a/vendor/google.golang.org/grpc/resolver/passthrough/passthrough.go b/vendor/google.golang.org/grpc/resolver/passthrough/passthrough.go
new file mode 100644
index 0000000..b76010d
--- /dev/null
+++ b/vendor/google.golang.org/grpc/resolver/passthrough/passthrough.go
@@ -0,0 +1,57 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// Package passthrough implements a pass-through resolver. It sends the target
+// name without scheme back to gRPC as resolved address.
+package passthrough
+
+import "google.golang.org/grpc/resolver"
+
+const scheme = "passthrough"
+
+type passthroughBuilder struct{}
+
+func (*passthroughBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOption) (resolver.Resolver, error) {
+ r := &passthroughResolver{
+ target: target,
+ cc: cc,
+ }
+ r.start()
+ return r, nil
+}
+
+func (*passthroughBuilder) Scheme() string {
+ return scheme
+}
+
+type passthroughResolver struct {
+ target resolver.Target
+ cc resolver.ClientConn
+}
+
+func (r *passthroughResolver) start() {
+ r.cc.NewAddress([]resolver.Address{{Addr: r.target.Endpoint}})
+}
+
+func (*passthroughResolver) ResolveNow(o resolver.ResolveNowOption) {}
+
+func (*passthroughResolver) Close() {}
+
+func init() {
+ resolver.Register(&passthroughBuilder{})
+}
diff --git a/vendor/google.golang.org/grpc/resolver/resolver.go b/vendor/google.golang.org/grpc/resolver/resolver.go
new file mode 100644
index 0000000..df097ee
--- /dev/null
+++ b/vendor/google.golang.org/grpc/resolver/resolver.go
@@ -0,0 +1,155 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// Package resolver defines APIs for name resolution in gRPC.
+// All APIs in this package are experimental.
+package resolver
+
+var (
+ // m is a map from scheme to resolver builder.
+ m = make(map[string]Builder)
+ // defaultScheme is the default scheme to use.
+ defaultScheme = "passthrough"
+)
+
+// TODO(bar) install dns resolver in init(){}.
+
+// Register registers the resolver builder to the resolver map.
+// b.Scheme will be used as the scheme registered with this builder.
+func Register(b Builder) {
+ m[b.Scheme()] = b
+}
+
+// Get returns the resolver builder registered with the given scheme.
+// If no builder is register with the scheme, the default scheme will
+// be used.
+// If the default scheme is not modified, "passthrough" will be the default
+// scheme, and the preinstalled dns resolver will be used.
+// If the default scheme is modified, and a resolver is registered with
+// the scheme, that resolver will be returned.
+// If the default scheme is modified, and no resolver is registered with
+// the scheme, nil will be returned.
+func Get(scheme string) Builder {
+ if b, ok := m[scheme]; ok {
+ return b
+ }
+ if b, ok := m[defaultScheme]; ok {
+ return b
+ }
+ return nil
+}
+
+// SetDefaultScheme sets the default scheme that will be used.
+// The default default scheme is "passthrough".
+func SetDefaultScheme(scheme string) {
+ defaultScheme = scheme
+}
+
+// AddressType indicates the address type returned by name resolution.
+type AddressType uint8
+
+const (
+ // Backend indicates the address is for a backend server.
+ Backend AddressType = iota
+ // GRPCLB indicates the address is for a grpclb load balancer.
+ GRPCLB
+)
+
+// Address represents a server the client connects to.
+// This is the EXPERIMENTAL API and may be changed or extended in the future.
+type Address struct {
+ // Addr is the server address on which a connection will be established.
+ Addr string
+ // Type is the type of this address.
+ Type AddressType
+ // ServerName is the name of this address.
+ //
+ // e.g. if Type is GRPCLB, ServerName should be the name of the remote load
+ // balancer, not the name of the backend.
+ ServerName string
+ // Metadata is the information associated with Addr, which may be used
+ // to make load balancing decision.
+ Metadata interface{}
+}
+
+// BuildOption includes additional information for the builder to create
+// the resolver.
+type BuildOption struct {
+ // UserOptions can be used to pass configuration between DialOptions and the
+ // resolver.
+ UserOptions interface{}
+}
+
+// ClientConn contains the callbacks for resolver to notify any updates
+// to the gRPC ClientConn.
+//
+// This interface is to be implemented by gRPC. Users should not need a
+// brand new implementation of this interface. For the situations like
+// testing, the new implementation should embed this interface. This allows
+// gRPC to add new methods to this interface.
+type ClientConn interface {
+ // NewAddress is called by resolver to notify ClientConn a new list
+ // of resolved addresses.
+ // The address list should be the complete list of resolved addresses.
+ NewAddress(addresses []Address)
+ // NewServiceConfig is called by resolver to notify ClientConn a new
+ // service config. The service config should be provided as a json string.
+ NewServiceConfig(serviceConfig string)
+}
+
+// Target represents a target for gRPC, as specified in:
+// https://github.com/grpc/grpc/blob/master/doc/naming.md.
+type Target struct {
+ Scheme string
+ Authority string
+ Endpoint string
+}
+
+// Builder creates a resolver that will be used to watch name resolution updates.
+type Builder interface {
+ // Build creates a new resolver for the given target.
+ //
+ // gRPC dial calls Build synchronously, and fails if the returned error is
+ // not nil.
+ Build(target Target, cc ClientConn, opts BuildOption) (Resolver, error)
+ // Scheme returns the scheme supported by this resolver.
+ // Scheme is defined at https://github.com/grpc/grpc/blob/master/doc/naming.md.
+ Scheme() string
+}
+
+// ResolveNowOption includes additional information for ResolveNow.
+type ResolveNowOption struct{}
+
+// Resolver watches for the updates on the specified target.
+// Updates include address updates and service config updates.
+type Resolver interface {
+ // ResolveNow will be called by gRPC to try to resolve the target name
+ // again. It's just a hint, resolver can ignore this if it's not necessary.
+ //
+ // It could be called multiple times concurrently.
+ ResolveNow(ResolveNowOption)
+ // Close closes the resolver.
+ Close()
+}
+
+// UnregisterForTesting removes the resolver builder with the given scheme from the
+// resolver map.
+// This function is for testing only.
+func UnregisterForTesting(scheme string) {
+ delete(m, scheme)
+}
diff --git a/vendor/google.golang.org/grpc/resolver_conn_wrapper.go b/vendor/google.golang.org/grpc/resolver_conn_wrapper.go
new file mode 100644
index 0000000..ef5d4c2
--- /dev/null
+++ b/vendor/google.golang.org/grpc/resolver_conn_wrapper.go
@@ -0,0 +1,159 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package grpc
+
+import (
+ "fmt"
+ "strings"
+
+ "google.golang.org/grpc/grpclog"
+ "google.golang.org/grpc/resolver"
+)
+
+// ccResolverWrapper is a wrapper on top of cc for resolvers.
+// It implements resolver.ClientConnection interface.
+type ccResolverWrapper struct {
+ cc *ClientConn
+ resolver resolver.Resolver
+ addrCh chan []resolver.Address
+ scCh chan string
+ done chan struct{}
+}
+
+// split2 returns the values from strings.SplitN(s, sep, 2).
+// If sep is not found, it returns ("", s, false) instead.
+func split2(s, sep string) (string, string, bool) {
+ spl := strings.SplitN(s, sep, 2)
+ if len(spl) < 2 {
+ return "", "", false
+ }
+ return spl[0], spl[1], true
+}
+
+// parseTarget splits target into a struct containing scheme, authority and
+// endpoint.
+func parseTarget(target string) (ret resolver.Target) {
+ var ok bool
+ ret.Scheme, ret.Endpoint, ok = split2(target, "://")
+ if !ok {
+ return resolver.Target{Endpoint: target}
+ }
+ ret.Authority, ret.Endpoint, _ = split2(ret.Endpoint, "/")
+ return ret
+}
+
+// newCCResolverWrapper parses cc.target for scheme and gets the resolver
+// builder for this scheme. It then builds the resolver and starts the
+// monitoring goroutine for it.
+//
+// If withResolverBuilder dial option is set, the specified resolver will be
+// used instead.
+func newCCResolverWrapper(cc *ClientConn) (*ccResolverWrapper, error) {
+ grpclog.Infof("dialing to target with scheme: %q", cc.parsedTarget.Scheme)
+
+ rb := cc.dopts.resolverBuilder
+ if rb == nil {
+ rb = resolver.Get(cc.parsedTarget.Scheme)
+ if rb == nil {
+ return nil, fmt.Errorf("could not get resolver for scheme: %q", cc.parsedTarget.Scheme)
+ }
+ }
+
+ ccr := &ccResolverWrapper{
+ cc: cc,
+ addrCh: make(chan []resolver.Address, 1),
+ scCh: make(chan string, 1),
+ done: make(chan struct{}),
+ }
+
+ var err error
+ ccr.resolver, err = rb.Build(cc.parsedTarget, ccr, resolver.BuildOption{
+ UserOptions: cc.dopts.resolverBuildUserOptions,
+ })
+ if err != nil {
+ return nil, err
+ }
+ return ccr, nil
+}
+
+func (ccr *ccResolverWrapper) start() {
+ go ccr.watcher()
+}
+
+// watcher processes address updates and service config updates sequencially.
+// Otherwise, we need to resolve possible races between address and service
+// config (e.g. they specify different balancer types).
+func (ccr *ccResolverWrapper) watcher() {
+ for {
+ select {
+ case <-ccr.done:
+ return
+ default:
+ }
+
+ select {
+ case addrs := <-ccr.addrCh:
+ select {
+ case <-ccr.done:
+ return
+ default:
+ }
+ grpclog.Infof("ccResolverWrapper: sending new addresses to cc: %v", addrs)
+ ccr.cc.handleResolvedAddrs(addrs, nil)
+ case sc := <-ccr.scCh:
+ select {
+ case <-ccr.done:
+ return
+ default:
+ }
+ grpclog.Infof("ccResolverWrapper: got new service config: %v", sc)
+ ccr.cc.handleServiceConfig(sc)
+ case <-ccr.done:
+ return
+ }
+ }
+}
+
+func (ccr *ccResolverWrapper) resolveNow(o resolver.ResolveNowOption) {
+ ccr.resolver.ResolveNow(o)
+}
+
+func (ccr *ccResolverWrapper) close() {
+ ccr.resolver.Close()
+ close(ccr.done)
+}
+
+// NewAddress is called by the resolver implemenetion to send addresses to gRPC.
+func (ccr *ccResolverWrapper) NewAddress(addrs []resolver.Address) {
+ select {
+ case <-ccr.addrCh:
+ default:
+ }
+ ccr.addrCh <- addrs
+}
+
+// NewServiceConfig is called by the resolver implemenetion to send service
+// configs to gPRC.
+func (ccr *ccResolverWrapper) NewServiceConfig(sc string) {
+ select {
+ case <-ccr.scCh:
+ default:
+ }
+ ccr.scCh <- sc
+}
diff --git a/vendor/google.golang.org/grpc/resolver_conn_wrapper_test.go b/vendor/google.golang.org/grpc/resolver_conn_wrapper_test.go
new file mode 100644
index 0000000..d857f43
--- /dev/null
+++ b/vendor/google.golang.org/grpc/resolver_conn_wrapper_test.go
@@ -0,0 +1,79 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package grpc
+
+import (
+ "testing"
+
+ "google.golang.org/grpc/resolver"
+)
+
+func TestParseTarget(t *testing.T) {
+ for _, test := range []resolver.Target{
+ {"", "", ""},
+ {"a", "", ""},
+ {"", "a", ""},
+ {"", "", "a"},
+ {"a", "b", ""},
+ {"a", "", "b"},
+ {"", "a", "b"},
+ {"a", "b", "c"},
+ {"dns", "", "google.com"},
+ {"dns", "a.server.com", "google.com"},
+ {"dns", "a.server.com", "google.com/?a=b"},
+ {"", "", "/unix/socket/address"},
+ } {
+ str := test.Scheme + "://" + test.Authority + "/" + test.Endpoint
+ got := parseTarget(str)
+ if got != test {
+ t.Errorf("parseTarget(%q) = %+v, want %+v", str, got, test)
+ }
+ }
+}
+
+func TestParseTargetString(t *testing.T) {
+ for _, test := range []struct {
+ targetStr string
+ want resolver.Target
+ }{
+ {"", resolver.Target{"", "", ""}},
+ {"://", resolver.Target{"", "", ""}},
+ {":///", resolver.Target{"", "", ""}},
+ {"a:///", resolver.Target{"a", "", ""}},
+ {"://a/", resolver.Target{"", "a", ""}},
+ {":///a", resolver.Target{"", "", "a"}},
+ {"a://b/", resolver.Target{"a", "b", ""}},
+ {"a:///b", resolver.Target{"a", "", "b"}},
+ {"://a/b", resolver.Target{"", "a", "b"}},
+ {"a://b/c", resolver.Target{"a", "b", "c"}},
+ {"dns:///google.com", resolver.Target{"dns", "", "google.com"}},
+ {"dns://a.server.com/google.com", resolver.Target{"dns", "a.server.com", "google.com"}},
+ {"dns://a.server.com/google.com/?a=b", resolver.Target{"dns", "a.server.com", "google.com/?a=b"}},
+
+ {"/", resolver.Target{"", "", "/"}},
+ {"google.com", resolver.Target{"", "", "google.com"}},
+ {"google.com/?a=b", resolver.Target{"", "", "google.com/?a=b"}},
+ {"/unix/socket/address", resolver.Target{"", "", "/unix/socket/address"}},
+ } {
+ got := parseTarget(test.targetStr)
+ if got != test.want {
+ t.Errorf("parseTarget(%q) = %+v, want %+v", test.targetStr, got, test.want)
+ }
+ }
+}
diff --git a/vendor/google.golang.org/grpc/resolver_test.go b/vendor/google.golang.org/grpc/resolver_test.go
new file mode 100644
index 0000000..6aba13c
--- /dev/null
+++ b/vendor/google.golang.org/grpc/resolver_test.go
@@ -0,0 +1,99 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package grpc
+
+import (
+ "fmt"
+ "strings"
+ "testing"
+ "time"
+
+ "google.golang.org/grpc/resolver"
+ "google.golang.org/grpc/resolver/manual"
+ "google.golang.org/grpc/test/leakcheck"
+)
+
+func TestResolverServiceConfigBeforeAddressNotPanic(t *testing.T) {
+ defer leakcheck.Check(t)
+ r, rcleanup := manual.GenerateAndRegisterManualResolver()
+ defer rcleanup()
+
+ cc, err := Dial(r.Scheme()+":///test.server", WithInsecure())
+ if err != nil {
+ t.Fatalf("failed to dial: %v", err)
+ }
+ defer cc.Close()
+
+ // SwitchBalancer before NewAddress. There was no balancer created, this
+ // makes sure we don't call close on nil balancerWrapper.
+ r.NewServiceConfig(`{"loadBalancingPolicy": "round_robin"}`) // This should not panic.
+
+ time.Sleep(time.Second) // Sleep to make sure the service config is handled by ClientConn.
+}
+
+func TestResolverEmptyUpdateNotPanic(t *testing.T) {
+ defer leakcheck.Check(t)
+ r, rcleanup := manual.GenerateAndRegisterManualResolver()
+ defer rcleanup()
+
+ cc, err := Dial(r.Scheme()+":///test.server", WithInsecure())
+ if err != nil {
+ t.Fatalf("failed to dial: %v", err)
+ }
+ defer cc.Close()
+
+ // This make sure we don't create addrConn with empty address list.
+ r.NewAddress([]resolver.Address{}) // This should not panic.
+
+ time.Sleep(time.Second) // Sleep to make sure the service config is handled by ClientConn.
+}
+
+var (
+ errTestResolverFailBuild = fmt.Errorf("test resolver build error")
+)
+
+type testResolverFailBuilder struct {
+ buildOpt resolver.BuildOption
+}
+
+func (r *testResolverFailBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOption) (resolver.Resolver, error) {
+ r.buildOpt = opts
+ return nil, errTestResolverFailBuild
+}
+func (r *testResolverFailBuilder) Scheme() string {
+ return "testResolverFailBuilderScheme"
+}
+
+// Tests that options in WithResolverUserOptions are passed to resolver.Build().
+func TestResolverUserOptions(t *testing.T) {
+ r := &testResolverFailBuilder{}
+
+ userOpt := "testUserOpt"
+ _, err := Dial("scheme:///test.server", WithInsecure(),
+ withResolverBuilder(r),
+ WithResolverUserOptions(userOpt),
+ )
+ if err == nil || !strings.Contains(err.Error(), errTestResolverFailBuild.Error()) {
+ t.Fatalf("Dial with testResolverFailBuilder returns err: %v, want: %v", err, errTestResolverFailBuild)
+ }
+
+ if r.buildOpt.UserOptions != userOpt {
+ t.Fatalf("buildOpt.UserOptions = %T %+v, want %v", r.buildOpt.UserOptions, r.buildOpt.UserOptions, userOpt)
+ }
+}
diff --git a/vendor/google.golang.org/grpc/rpc_util.go b/vendor/google.golang.org/grpc/rpc_util.go
index 9ba1ce0..6a5a7de 100644
--- a/vendor/google.golang.org/grpc/rpc_util.go
+++ b/vendor/google.golang.org/grpc/rpc_util.go
@@ -31,6 +31,7 @@ import (
"golang.org/x/net/context"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/credentials"
+ "google.golang.org/grpc/encoding"
"google.golang.org/grpc/metadata"
"google.golang.org/grpc/peer"
"google.golang.org/grpc/stats"
@@ -122,6 +123,7 @@ func (d *gzipDecompressor) Type() string {
// callInfo contains all related configuration and information about an RPC.
type callInfo struct {
+ compressorType string
failFast bool
headerMD metadata.MD
trailerMD metadata.MD
@@ -132,7 +134,9 @@ type callInfo struct {
creds credentials.PerRPCCredentials
}
-var defaultCallInfo = callInfo{failFast: true}
+func defaultCallInfo() *callInfo {
+ return &callInfo{failFast: true}
+}
// CallOption configures a Call before it starts or extracts information from
// a Call after it completes.
@@ -191,12 +195,15 @@ func Peer(peer *peer.Peer) CallOption {
}
// FailFast configures the action to take when an RPC is attempted on broken
-// connections or unreachable servers. If failfast is true, the RPC will fail
+// connections or unreachable servers. If failFast is true, the RPC will fail
// immediately. Otherwise, the RPC client will block the call until a
-// connection is available (or the call is canceled or times out) and will retry
-// the call if it fails due to a transient error. Please refer to
+// connection is available (or the call is canceled or times out) and will
+// retry the call if it fails due to a transient error. gRPC will not retry if
+// data was written to the wire unless the server indicates it did not process
+// the data. Please refer to
// https://github.com/grpc/grpc/blob/master/doc/wait-for-ready.md.
-// Note: failFast is default to true.
+//
+// By default, RPCs are "Fail Fast".
func FailFast(failFast bool) CallOption {
return beforeCall(func(c *callInfo) error {
c.failFast = failFast
@@ -229,6 +236,18 @@ func PerRPCCredentials(creds credentials.PerRPCCredentials) CallOption {
})
}
+// UseCompressor returns a CallOption which sets the compressor used when
+// sending the request. If WithCompressor is also set, UseCompressor has
+// higher priority.
+//
+// This API is EXPERIMENTAL.
+func UseCompressor(name string) CallOption {
+ return beforeCall(func(c *callInfo) error {
+ c.compressorType = name
+ return nil
+ })
+}
+
// The format of the payload: compressed or not?
type payloadFormat uint8
@@ -273,8 +292,11 @@ func (p *parser) recvMsg(maxReceiveMessageSize int) (pf payloadFormat, msg []byt
if length == 0 {
return pf, nil, nil
}
- if length > uint32(maxReceiveMessageSize) {
- return 0, nil, Errorf(codes.ResourceExhausted, "grpc: received message larger than max (%d vs. %d)", length, maxReceiveMessageSize)
+ if int64(length) > int64(maxInt) {
+ return 0, nil, status.Errorf(codes.ResourceExhausted, "grpc: received message larger than max length allowed on current machine (%d vs. %d)", length, maxInt)
+ }
+ if int(length) > maxReceiveMessageSize {
+ return 0, nil, status.Errorf(codes.ResourceExhausted, "grpc: received message larger than max (%d vs. %d)", length, maxReceiveMessageSize)
}
// TODO(bradfitz,zhaoq): garbage. reuse buffer after proto decoding instead
// of making it for each message:
@@ -290,18 +312,21 @@ func (p *parser) recvMsg(maxReceiveMessageSize int) (pf payloadFormat, msg []byt
// encode serializes msg and returns a buffer of message header and a buffer of msg.
// If msg is nil, it generates the message header and an empty msg buffer.
-func encode(c Codec, msg interface{}, cp Compressor, cbuf *bytes.Buffer, outPayload *stats.OutPayload) ([]byte, []byte, error) {
- var b []byte
+// TODO(ddyihai): eliminate extra Compressor parameter.
+func encode(c Codec, msg interface{}, cp Compressor, outPayload *stats.OutPayload, compressor encoding.Compressor) ([]byte, []byte, error) {
+ var (
+ b []byte
+ cbuf *bytes.Buffer
+ )
const (
payloadLen = 1
sizeLen = 4
)
-
if msg != nil {
var err error
b, err = c.Marshal(msg)
if err != nil {
- return nil, nil, Errorf(codes.Internal, "grpc: error while marshaling: %v", err.Error())
+ return nil, nil, status.Errorf(codes.Internal, "grpc: error while marshaling: %v", err.Error())
}
if outPayload != nil {
outPayload.Payload = msg
@@ -309,24 +334,35 @@ func encode(c Codec, msg interface{}, cp Compressor, cbuf *bytes.Buffer, outPayl
outPayload.Data = b
outPayload.Length = len(b)
}
- if cp != nil {
- if err := cp.Do(cbuf, b); err != nil {
- return nil, nil, Errorf(codes.Internal, "grpc: error while compressing: %v", err.Error())
+ if compressor != nil || cp != nil {
+ cbuf = new(bytes.Buffer)
+ // Has compressor, check Compressor is set by UseCompressor first.
+ if compressor != nil {
+ z, _ := compressor.Compress(cbuf)
+ if _, err := z.Write(b); err != nil {
+ return nil, nil, status.Errorf(codes.Internal, "grpc: error while compressing: %v", err.Error())
+ }
+ z.Close()
+ } else {
+ // If Compressor is not set by UseCompressor, use default Compressor
+ if err := cp.Do(cbuf, b); err != nil {
+ return nil, nil, status.Errorf(codes.Internal, "grpc: error while compressing: %v", err.Error())
+ }
}
b = cbuf.Bytes()
}
}
-
if uint(len(b)) > math.MaxUint32 {
- return nil, nil, Errorf(codes.ResourceExhausted, "grpc: message too large (%d bytes)", len(b))
+ return nil, nil, status.Errorf(codes.ResourceExhausted, "grpc: message too large (%d bytes)", len(b))
}
bufHeader := make([]byte, payloadLen+sizeLen)
- if cp == nil {
- bufHeader[0] = byte(compressionNone)
- } else {
+ if compressor != nil || cp != nil {
bufHeader[0] = byte(compressionMade)
+ } else {
+ bufHeader[0] = byte(compressionNone)
}
+
// Write length of b into buf
binary.BigEndian.PutUint32(bufHeader[payloadLen:], uint32(len(b)))
if outPayload != nil {
@@ -335,20 +371,26 @@ func encode(c Codec, msg interface{}, cp Compressor, cbuf *bytes.Buffer, outPayl
return bufHeader, b, nil
}
-func checkRecvPayload(pf payloadFormat, recvCompress string, dc Decompressor) error {
+func checkRecvPayload(pf payloadFormat, recvCompress string, haveCompressor bool) *status.Status {
switch pf {
case compressionNone:
case compressionMade:
- if dc == nil || recvCompress != dc.Type() {
- return Errorf(codes.Unimplemented, "grpc: Decompressor is not installed for grpc-encoding %q", recvCompress)
+ if recvCompress == "" || recvCompress == encoding.Identity {
+ return status.New(codes.Internal, "grpc: compressed flag set with identity or empty encoding")
+ }
+ if !haveCompressor {
+ return status.Newf(codes.Unimplemented, "grpc: Decompressor is not installed for grpc-encoding %q", recvCompress)
}
default:
- return Errorf(codes.Internal, "grpc: received unexpected payload format %d", pf)
+ return status.Newf(codes.Internal, "grpc: received unexpected payload format %d", pf)
}
return nil
}
-func recv(p *parser, c Codec, s *transport.Stream, dc Decompressor, m interface{}, maxReceiveMessageSize int, inPayload *stats.InPayload) error {
+// For the two compressor parameters, both should not be set, but if they are,
+// dc takes precedence over compressor.
+// TODO(dfawley): wrap the old compressor/decompressor using the new API?
+func recv(p *parser, c Codec, s *transport.Stream, dc Decompressor, m interface{}, maxReceiveMessageSize int, inPayload *stats.InPayload, compressor encoding.Compressor) error {
pf, d, err := p.recvMsg(maxReceiveMessageSize)
if err != nil {
return err
@@ -356,22 +398,37 @@ func recv(p *parser, c Codec, s *transport.Stream, dc Decompressor, m interface{
if inPayload != nil {
inPayload.WireLength = len(d)
}
- if err := checkRecvPayload(pf, s.RecvCompress(), dc); err != nil {
- return err
+
+ if st := checkRecvPayload(pf, s.RecvCompress(), compressor != nil || dc != nil); st != nil {
+ return st.Err()
}
+
if pf == compressionMade {
- d, err = dc.Do(bytes.NewReader(d))
- if err != nil {
- return Errorf(codes.Internal, "grpc: failed to decompress the received message %v", err)
+ // To match legacy behavior, if the decompressor is set by WithDecompressor or RPCDecompressor,
+ // use this decompressor as the default.
+ if dc != nil {
+ d, err = dc.Do(bytes.NewReader(d))
+ if err != nil {
+ return status.Errorf(codes.Internal, "grpc: failed to decompress the received message %v", err)
+ }
+ } else {
+ dcReader, err := compressor.Decompress(bytes.NewReader(d))
+ if err != nil {
+ return status.Errorf(codes.Internal, "grpc: failed to decompress the received message %v", err)
+ }
+ d, err = ioutil.ReadAll(dcReader)
+ if err != nil {
+ return status.Errorf(codes.Internal, "grpc: failed to decompress the received message %v", err)
+ }
}
}
if len(d) > maxReceiveMessageSize {
// TODO: Revisit the error code. Currently keep it consistent with java
// implementation.
- return Errorf(codes.ResourceExhausted, "grpc: received message larger than max (%d vs. %d)", len(d), maxReceiveMessageSize)
+ return status.Errorf(codes.ResourceExhausted, "grpc: received message larger than max (%d vs. %d)", len(d), maxReceiveMessageSize)
}
if err := c.Unmarshal(d, m); err != nil {
- return Errorf(codes.Internal, "grpc: failed to unmarshal the received message %v", err)
+ return status.Errorf(codes.Internal, "grpc: failed to unmarshal the received message %v", err)
}
if inPayload != nil {
inPayload.RecvTime = time.Now()
@@ -384,14 +441,13 @@ func recv(p *parser, c Codec, s *transport.Stream, dc Decompressor, m interface{
}
type rpcInfo struct {
- bytesSent bool
- bytesReceived bool
+ failfast bool
}
type rpcInfoContextKey struct{}
-func newContextWithRPCInfo(ctx context.Context) context.Context {
- return context.WithValue(ctx, rpcInfoContextKey{}, &rpcInfo{})
+func newContextWithRPCInfo(ctx context.Context, failfast bool) context.Context {
+ return context.WithValue(ctx, rpcInfoContextKey{}, &rpcInfo{failfast: failfast})
}
func rpcInfoFromContext(ctx context.Context) (s *rpcInfo, ok bool) {
@@ -399,17 +455,10 @@ func rpcInfoFromContext(ctx context.Context) (s *rpcInfo, ok bool) {
return
}
-func updateRPCInfoInContext(ctx context.Context, s rpcInfo) {
- if ss, ok := rpcInfoFromContext(ctx); ok {
- *ss = s
- }
- return
-}
-
// Code returns the error code for err if it was produced by the rpc system.
// Otherwise, it returns codes.Unknown.
//
-// Deprecated; use status.FromError and Code method instead.
+// Deprecated: use status.FromError and Code method instead.
func Code(err error) codes.Code {
if s, ok := status.FromError(err); ok {
return s.Code()
@@ -420,7 +469,7 @@ func Code(err error) codes.Code {
// ErrorDesc returns the error description of err if it was produced by the rpc system.
// Otherwise, it returns err.Error() or empty string when err is nil.
//
-// Deprecated; use status.FromError and Message method instead.
+// Deprecated: use status.FromError and Message method instead.
func ErrorDesc(err error) string {
if s, ok := status.FromError(err); ok {
return s.Message()
@@ -431,85 +480,26 @@ func ErrorDesc(err error) string {
// Errorf returns an error containing an error code and a description;
// Errorf returns nil if c is OK.
//
-// Deprecated; use status.Errorf instead.
+// Deprecated: use status.Errorf instead.
func Errorf(c codes.Code, format string, a ...interface{}) error {
return status.Errorf(c, format, a...)
}
-// MethodConfig defines the configuration recommended by the service providers for a
-// particular method.
-// This is EXPERIMENTAL and subject to change.
-type MethodConfig struct {
- // WaitForReady indicates whether RPCs sent to this method should wait until
- // the connection is ready by default (!failfast). The value specified via the
- // gRPC client API will override the value set here.
- WaitForReady *bool
- // Timeout is the default timeout for RPCs sent to this method. The actual
- // deadline used will be the minimum of the value specified here and the value
- // set by the application via the gRPC client API. If either one is not set,
- // then the other will be used. If neither is set, then the RPC has no deadline.
- Timeout *time.Duration
- // MaxReqSize is the maximum allowed payload size for an individual request in a
- // stream (client->server) in bytes. The size which is measured is the serialized
- // payload after per-message compression (but before stream compression) in bytes.
- // The actual value used is the minumum of the value specified here and the value set
- // by the application via the gRPC client API. If either one is not set, then the other
- // will be used. If neither is set, then the built-in default is used.
- MaxReqSize *int
- // MaxRespSize is the maximum allowed payload size for an individual response in a
- // stream (server->client) in bytes.
- MaxRespSize *int
-}
-
-// ServiceConfig is provided by the service provider and contains parameters for how
-// clients that connect to the service should behave.
-// This is EXPERIMENTAL and subject to change.
-type ServiceConfig struct {
- // LB is the load balancer the service providers recommends. The balancer specified
- // via grpc.WithBalancer will override this.
- LB Balancer
- // Methods contains a map for the methods in this service.
- // If there is an exact match for a method (i.e. /service/method) in the map, use the corresponding MethodConfig.
- // If there's no exact match, look for the default config for the service (/service/) and use the corresponding MethodConfig if it exists.
- // Otherwise, the method has no MethodConfig to use.
- Methods map[string]MethodConfig
-}
-
-func min(a, b *int) *int {
- if *a < *b {
- return a
- }
- return b
-}
-
-func getMaxSize(mcMax, doptMax *int, defaultVal int) *int {
- if mcMax == nil && doptMax == nil {
- return &defaultVal
- }
- if mcMax != nil && doptMax != nil {
- return min(mcMax, doptMax)
- }
- if mcMax != nil {
- return mcMax
- }
- return doptMax
-}
-
-// SupportPackageIsVersion3 is referenced from generated protocol buffer files.
-// The latest support package version is 4.
-// SupportPackageIsVersion3 is kept for compability. It will be removed in the
-// next support package version update.
-const SupportPackageIsVersion3 = true
-
-// SupportPackageIsVersion4 is referenced from generated protocol buffer files
-// to assert that that code is compatible with this version of the grpc package.
+// The SupportPackageIsVersion variables are referenced from generated protocol
+// buffer files to ensure compatibility with the gRPC version used. The latest
+// support package version is 5.
//
-// This constant may be renamed in the future if a change in the generated code
-// requires a synchronised update of grpc-go and protoc-gen-go. This constant
-// should not be referenced from any other code.
-const SupportPackageIsVersion4 = true
+// Older versions are kept for compatibility. They may be removed if
+// compatibility cannot be maintained.
+//
+// These constants should not be referenced from any other code.
+const (
+ SupportPackageIsVersion3 = true
+ SupportPackageIsVersion4 = true
+ SupportPackageIsVersion5 = true
+)
// Version is the current grpc version.
-const Version = "1.6.0"
+const Version = "1.9.0"
const grpcUA = "grpc-go/" + Version
diff --git a/vendor/google.golang.org/grpc/server.go b/vendor/google.golang.org/grpc/server.go
index 86fe20a..f651621 100644
--- a/vendor/google.golang.org/grpc/server.go
+++ b/vendor/google.golang.org/grpc/server.go
@@ -32,11 +32,14 @@ import (
"sync"
"time"
+ "io/ioutil"
+
"golang.org/x/net/context"
"golang.org/x/net/http2"
"golang.org/x/net/trace"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/credentials"
+ "google.golang.org/grpc/encoding"
"google.golang.org/grpc/grpclog"
"google.golang.org/grpc/internal"
"google.golang.org/grpc/keepalive"
@@ -89,13 +92,15 @@ type Server struct {
conns map[io.Closer]bool
serve bool
drain bool
- ctx context.Context
- cancel context.CancelFunc
- // A CondVar to let GracefulStop() blocks until all the pending RPCs are finished
- // and all the transport goes away.
- cv *sync.Cond
+ cv *sync.Cond // signaled when connections close for GracefulStop
m map[string]*service // service name -> service info
events trace.EventLog
+
+ quit chan struct{}
+ done chan struct{}
+ quitOnce sync.Once
+ doneOnce sync.Once
+ serveWG sync.WaitGroup // counts active Serve goroutines for GracefulStop
}
type options struct {
@@ -116,16 +121,36 @@ type options struct {
keepalivePolicy keepalive.EnforcementPolicy
initialWindowSize int32
initialConnWindowSize int32
+ writeBufferSize int
+ readBufferSize int
+ connectionTimeout time.Duration
}
var defaultServerOptions = options{
maxReceiveMessageSize: defaultServerMaxReceiveMessageSize,
maxSendMessageSize: defaultServerMaxSendMessageSize,
+ connectionTimeout: 120 * time.Second,
}
// A ServerOption sets options such as credentials, codec and keepalive parameters, etc.
type ServerOption func(*options)
+// WriteBufferSize lets you set the size of write buffer, this determines how much data can be batched
+// before doing a write on the wire.
+func WriteBufferSize(s int) ServerOption {
+ return func(o *options) {
+ o.writeBufferSize = s
+ }
+}
+
+// ReadBufferSize lets you set the size of read buffer, this determines how much data can be read at most
+// for one read syscall.
+func ReadBufferSize(s int) ServerOption {
+ return func(o *options) {
+ o.readBufferSize = s
+ }
+}
+
// InitialWindowSize returns a ServerOption that sets window size for stream.
// The lower bound for window size is 64K and any value smaller than that will be ignored.
func InitialWindowSize(s int32) ServerOption {
@@ -163,14 +188,24 @@ func CustomCodec(codec Codec) ServerOption {
}
}
-// RPCCompressor returns a ServerOption that sets a compressor for outbound messages.
+// RPCCompressor returns a ServerOption that sets a compressor for outbound
+// messages. For backward compatibility, all outbound messages will be sent
+// using this compressor, regardless of incoming message compression. By
+// default, server messages will be sent using the same compressor with which
+// request messages were sent.
+//
+// Deprecated: use encoding.RegisterCompressor instead.
func RPCCompressor(cp Compressor) ServerOption {
return func(o *options) {
o.cp = cp
}
}
-// RPCDecompressor returns a ServerOption that sets a decompressor for inbound messages.
+// RPCDecompressor returns a ServerOption that sets a decompressor for inbound
+// messages. It has higher priority than decompressors registered via
+// encoding.RegisterCompressor.
+//
+// Deprecated: use encoding.RegisterCompressor instead.
func RPCDecompressor(dc Decompressor) ServerOption {
return func(o *options) {
o.dc = dc
@@ -260,7 +295,7 @@ func StatsHandler(h stats.Handler) ServerOption {
// handler that will be invoked instead of returning the "unimplemented" gRPC
// error whenever a request is received for an unregistered service or method.
// The handling function has full access to the Context of the request and the
-// stream, and the invocation passes through interceptors.
+// stream, and the invocation bypasses interceptors.
func UnknownServiceHandler(streamHandler StreamHandler) ServerOption {
return func(o *options) {
o.unknownStreamDesc = &StreamDesc{
@@ -273,6 +308,18 @@ func UnknownServiceHandler(streamHandler StreamHandler) ServerOption {
}
}
+// ConnectionTimeout returns a ServerOption that sets the timeout for
+// connection establishment (up to and including HTTP/2 handshaking) for all
+// new connections. If this is not set, the default is 120 seconds. A zero or
+// negative value will result in an immediate timeout.
+//
+// This API is EXPERIMENTAL.
+func ConnectionTimeout(d time.Duration) ServerOption {
+ return func(o *options) {
+ o.connectionTimeout = d
+ }
+}
+
// NewServer creates a gRPC server which has no service registered and has not
// started to accept requests yet.
func NewServer(opt ...ServerOption) *Server {
@@ -289,9 +336,10 @@ func NewServer(opt ...ServerOption) *Server {
opts: opts,
conns: make(map[io.Closer]bool),
m: make(map[string]*service),
+ quit: make(chan struct{}),
+ done: make(chan struct{}),
}
s.cv = sync.NewCond(&s.mu)
- s.ctx, s.cancel = context.WithCancel(context.Background())
if EnableTracing {
_, file, line, _ := runtime.Caller(1)
s.events = trace.NewEventLog("grpc.Server", fmt.Sprintf("%s:%d", file, line))
@@ -400,11 +448,9 @@ func (s *Server) GetServiceInfo() map[string]ServiceInfo {
return ret
}
-var (
- // ErrServerStopped indicates that the operation is now illegal because of
- // the server being stopped.
- ErrServerStopped = errors.New("grpc: the server has been stopped")
-)
+// ErrServerStopped indicates that the operation is now illegal because of
+// the server being stopped.
+var ErrServerStopped = errors.New("grpc: the server has been stopped")
func (s *Server) useTransportAuthenticator(rawConn net.Conn) (net.Conn, credentials.AuthInfo, error) {
if s.opts.creds == nil {
@@ -418,16 +464,29 @@ func (s *Server) useTransportAuthenticator(rawConn net.Conn) (net.Conn, credenti
// read gRPC requests and then call the registered handlers to reply to them.
// Serve returns when lis.Accept fails with fatal errors. lis will be closed when
// this method returns.
-// Serve always returns non-nil error.
+// Serve will return a non-nil error unless Stop or GracefulStop is called.
func (s *Server) Serve(lis net.Listener) error {
s.mu.Lock()
s.printf("serving")
s.serve = true
if s.lis == nil {
+ // Serve called after Stop or GracefulStop.
s.mu.Unlock()
lis.Close()
return ErrServerStopped
}
+
+ s.serveWG.Add(1)
+ defer func() {
+ s.serveWG.Done()
+ select {
+ // Stop or GracefulStop called; block until done and return nil.
+ case <-s.quit:
+ <-s.done
+ default:
+ }
+ }()
+
s.lis[lis] = true
s.mu.Unlock()
defer func() {
@@ -461,36 +520,52 @@ func (s *Server) Serve(lis net.Listener) error {
timer := time.NewTimer(tempDelay)
select {
case <-timer.C:
- case <-s.ctx.Done():
+ case <-s.quit:
+ timer.Stop()
+ return nil
}
- timer.Stop()
continue
}
s.mu.Lock()
s.printf("done serving; Accept = %v", err)
s.mu.Unlock()
+
+ select {
+ case <-s.quit:
+ return nil
+ default:
+ }
return err
}
tempDelay = 0
- // Start a new goroutine to deal with rawConn
- // so we don't stall this Accept loop goroutine.
- go s.handleRawConn(rawConn)
+ // Start a new goroutine to deal with rawConn so we don't stall this Accept
+ // loop goroutine.
+ //
+ // Make sure we account for the goroutine so GracefulStop doesn't nil out
+ // s.conns before this conn can be added.
+ s.serveWG.Add(1)
+ go func() {
+ s.handleRawConn(rawConn)
+ s.serveWG.Done()
+ }()
}
}
-// handleRawConn is run in its own goroutine and handles a just-accepted
-// connection that has not had any I/O performed on it yet.
+// handleRawConn forks a goroutine to handle a just-accepted connection that
+// has not had any I/O performed on it yet.
func (s *Server) handleRawConn(rawConn net.Conn) {
+ rawConn.SetDeadline(time.Now().Add(s.opts.connectionTimeout))
conn, authInfo, err := s.useTransportAuthenticator(rawConn)
if err != nil {
s.mu.Lock()
s.errorf("ServerHandshake(%q) failed: %v", rawConn.RemoteAddr(), err)
s.mu.Unlock()
grpclog.Warningf("grpc: Server.Serve failed to complete security handshake from %q: %v", rawConn.RemoteAddr(), err)
- // If serverHandShake returns ErrConnDispatched, keep rawConn open.
+ // If serverHandshake returns ErrConnDispatched, keep rawConn open.
if err != credentials.ErrConnDispatched {
rawConn.Close()
}
+ rawConn.SetDeadline(time.Time{})
return
}
@@ -502,19 +577,33 @@ func (s *Server) handleRawConn(rawConn net.Conn) {
}
s.mu.Unlock()
+ var serve func()
+ c := conn.(io.Closer)
if s.opts.useHandlerImpl {
- s.serveUsingHandler(conn)
+ serve = func() { s.serveUsingHandler(conn) }
} else {
- s.serveHTTP2Transport(conn, authInfo)
+ // Finish handshaking (HTTP2)
+ st := s.newHTTP2Transport(conn, authInfo)
+ if st == nil {
+ return
+ }
+ c = st
+ serve = func() { s.serveStreams(st) }
}
+
+ rawConn.SetDeadline(time.Time{})
+ if !s.addConn(c) {
+ return
+ }
+ go func() {
+ serve()
+ s.removeConn(c)
+ }()
}
-// serveHTTP2Transport sets up a http/2 transport (using the
-// gRPC http2 server transport in transport/http2_server.go) and
-// serves streams on it.
-// This is run in its own goroutine (it does network I/O in
-// transport.NewServerTransport).
-func (s *Server) serveHTTP2Transport(c net.Conn, authInfo credentials.AuthInfo) {
+// newHTTP2Transport sets up a http/2 transport (using the
+// gRPC http2 server transport in transport/http2_server.go).
+func (s *Server) newHTTP2Transport(c net.Conn, authInfo credentials.AuthInfo) transport.ServerTransport {
config := &transport.ServerConfig{
MaxStreams: s.opts.maxConcurrentStreams,
AuthInfo: authInfo,
@@ -524,6 +613,8 @@ func (s *Server) serveHTTP2Transport(c net.Conn, authInfo credentials.AuthInfo)
KeepalivePolicy: s.opts.keepalivePolicy,
InitialWindowSize: s.opts.initialWindowSize,
InitialConnWindowSize: s.opts.initialConnWindowSize,
+ WriteBufferSize: s.opts.writeBufferSize,
+ ReadBufferSize: s.opts.readBufferSize,
}
st, err := transport.NewServerTransport("http2", c, config)
if err != nil {
@@ -532,17 +623,12 @@ func (s *Server) serveHTTP2Transport(c net.Conn, authInfo credentials.AuthInfo)
s.mu.Unlock()
c.Close()
grpclog.Warningln("grpc: Server.Serve failed to create ServerTransport: ", err)
- return
+ return nil
}
- if !s.addConn(st) {
- st.Close()
- return
- }
- s.serveStreams(st)
+ return st
}
func (s *Server) serveStreams(st transport.ServerTransport) {
- defer s.removeConn(st)
defer st.Close()
var wg sync.WaitGroup
st.HandleStreams(func(stream *transport.Stream) {
@@ -576,11 +662,6 @@ var _ http.Handler = (*Server)(nil)
//
// conn is the *tls.Conn that's already been authenticated.
func (s *Server) serveUsingHandler(conn net.Conn) {
- if !s.addConn(conn) {
- conn.Close()
- return
- }
- defer s.removeConn(conn)
h2s := &http2.Server{
MaxConcurrentStreams: s.opts.maxConcurrentStreams,
}
@@ -620,7 +701,6 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
return
}
if !s.addConn(st) {
- st.Close()
return
}
defer s.removeConn(st)
@@ -650,9 +730,15 @@ func (s *Server) traceInfo(st transport.ServerTransport, stream *transport.Strea
func (s *Server) addConn(c io.Closer) bool {
s.mu.Lock()
defer s.mu.Unlock()
- if s.conns == nil || s.drain {
+ if s.conns == nil {
+ c.Close()
return false
}
+ if s.drain {
+ // Transport added after we drained our existing conns: drain it
+ // immediately.
+ c.(transport.ServerTransport).Drain()
+ }
s.conns[c] = true
return true
}
@@ -666,18 +752,14 @@ func (s *Server) removeConn(c io.Closer) {
}
}
-func (s *Server) sendResponse(t transport.ServerTransport, stream *transport.Stream, msg interface{}, cp Compressor, opts *transport.Options) error {
+func (s *Server) sendResponse(t transport.ServerTransport, stream *transport.Stream, msg interface{}, cp Compressor, opts *transport.Options, comp encoding.Compressor) error {
var (
- cbuf *bytes.Buffer
outPayload *stats.OutPayload
)
- if cp != nil {
- cbuf = new(bytes.Buffer)
- }
if s.opts.statsHandler != nil {
outPayload = &stats.OutPayload{}
}
- hdr, data, err := encode(s.opts.codec, msg, cp, cbuf, outPayload)
+ hdr, data, err := encode(s.opts.codec, msg, cp, outPayload, comp)
if err != nil {
grpclog.Errorln("grpc: server failed to encode response: ", err)
return err
@@ -721,10 +803,43 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport.
}
}()
}
- if s.opts.cp != nil {
- // NOTE: this needs to be ahead of all handling, https://github.com/grpc/grpc-go/issues/686.
- stream.SetSendCompress(s.opts.cp.Type())
+
+ // comp and cp are used for compression. decomp and dc are used for
+ // decompression. If comp and decomp are both set, they are the same;
+ // however they are kept separate to ensure that at most one of the
+ // compressor/decompressor variable pairs are set for use later.
+ var comp, decomp encoding.Compressor
+ var cp Compressor
+ var dc Decompressor
+
+ // If dc is set and matches the stream's compression, use it. Otherwise, try
+ // to find a matching registered compressor for decomp.
+ if rc := stream.RecvCompress(); s.opts.dc != nil && s.opts.dc.Type() == rc {
+ dc = s.opts.dc
+ } else if rc != "" && rc != encoding.Identity {
+ decomp = encoding.GetCompressor(rc)
+ if decomp == nil {
+ st := status.Newf(codes.Unimplemented, "grpc: Decompressor is not installed for grpc-encoding %q", rc)
+ t.WriteStatus(stream, st)
+ return st.Err()
+ }
}
+
+ // If cp is set, use it. Otherwise, attempt to compress the response using
+ // the incoming message compression method.
+ //
+ // NOTE: this needs to be ahead of all handling, https://github.com/grpc/grpc-go/issues/686.
+ if s.opts.cp != nil {
+ cp = s.opts.cp
+ stream.SetSendCompress(cp.Type())
+ } else if rc := stream.RecvCompress(); rc != "" && rc != encoding.Identity {
+ // Legacy compressor not specified; attempt to respond with same encoding.
+ comp = encoding.GetCompressor(rc)
+ if comp != nil {
+ stream.SetSendCompress(rc)
+ }
+ }
+
p := &parser{r: stream}
pf, req, err := p.recvMsg(s.opts.maxReceiveMessageSize)
if err == io.EOF {
@@ -732,7 +847,7 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport.
return err
}
if err == io.ErrUnexpectedEOF {
- err = Errorf(codes.Internal, io.ErrUnexpectedEOF.Error())
+ err = status.Errorf(codes.Internal, io.ErrUnexpectedEOF.Error())
}
if err != nil {
if st, ok := status.FromError(err); ok {
@@ -753,19 +868,11 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport.
}
return err
}
-
- if err := checkRecvPayload(pf, stream.RecvCompress(), s.opts.dc); err != nil {
- if st, ok := status.FromError(err); ok {
- if e := t.WriteStatus(stream, st); e != nil {
- grpclog.Warningf("grpc: Server.processUnaryRPC failed to write status %v", e)
- }
- return err
- }
- if e := t.WriteStatus(stream, status.New(codes.Internal, err.Error())); e != nil {
+ if st := checkRecvPayload(pf, stream.RecvCompress(), dc != nil || decomp != nil); st != nil {
+ if e := t.WriteStatus(stream, st); e != nil {
grpclog.Warningf("grpc: Server.processUnaryRPC failed to write status %v", e)
}
-
- // TODO checkRecvPayload always return RPC error. Add a return here if necessary.
+ return st.Err()
}
var inPayload *stats.InPayload
if sh != nil {
@@ -779,9 +886,17 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport.
}
if pf == compressionMade {
var err error
- req, err = s.opts.dc.Do(bytes.NewReader(req))
- if err != nil {
- return Errorf(codes.Internal, err.Error())
+ if dc != nil {
+ req, err = dc.Do(bytes.NewReader(req))
+ if err != nil {
+ return status.Errorf(codes.Internal, err.Error())
+ }
+ } else {
+ tmp, _ := decomp.Decompress(bytes.NewReader(req))
+ req, err = ioutil.ReadAll(tmp)
+ if err != nil {
+ return status.Errorf(codes.Internal, "grpc: failed to decompress the received message %v", err)
+ }
}
}
if len(req) > s.opts.maxReceiveMessageSize {
@@ -827,7 +942,8 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport.
Last: true,
Delay: false,
}
- if err := s.sendResponse(t, stream, reply, s.opts.cp, opts); err != nil {
+
+ if err := s.sendResponse(t, stream, reply, cp, opts, comp); err != nil {
if err == io.EOF {
// The entire stream is done (for unary RPC only).
return err
@@ -876,24 +992,45 @@ func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transp
sh.HandleRPC(stream.Context(), end)
}()
}
- if s.opts.cp != nil {
- stream.SetSendCompress(s.opts.cp.Type())
- }
ss := &serverStream{
t: t,
s: stream,
p: &parser{r: stream},
codec: s.opts.codec,
- cp: s.opts.cp,
- dc: s.opts.dc,
maxReceiveMessageSize: s.opts.maxReceiveMessageSize,
maxSendMessageSize: s.opts.maxSendMessageSize,
trInfo: trInfo,
statsHandler: sh,
}
- if ss.cp != nil {
- ss.cbuf = new(bytes.Buffer)
+
+ // If dc is set and matches the stream's compression, use it. Otherwise, try
+ // to find a matching registered compressor for decomp.
+ if rc := stream.RecvCompress(); s.opts.dc != nil && s.opts.dc.Type() == rc {
+ ss.dc = s.opts.dc
+ } else if rc != "" && rc != encoding.Identity {
+ ss.decomp = encoding.GetCompressor(rc)
+ if ss.decomp == nil {
+ st := status.Newf(codes.Unimplemented, "grpc: Decompressor is not installed for grpc-encoding %q", rc)
+ t.WriteStatus(ss.s, st)
+ return st.Err()
+ }
}
+
+ // If cp is set, use it. Otherwise, attempt to compress the response using
+ // the incoming message compression method.
+ //
+ // NOTE: this needs to be ahead of all handling, https://github.com/grpc/grpc-go/issues/686.
+ if s.opts.cp != nil {
+ ss.cp = s.opts.cp
+ stream.SetSendCompress(s.opts.cp.Type())
+ } else if rc := stream.RecvCompress(); rc != "" && rc != encoding.Identity {
+ // Legacy compressor not specified; attempt to respond with same encoding.
+ ss.comp = encoding.GetCompressor(rc)
+ if ss.comp != nil {
+ stream.SetSendCompress(rc)
+ }
+ }
+
if trInfo != nil {
trInfo.tr.LazyLog(&trInfo.firstLine, false)
defer func() {
@@ -1037,6 +1174,17 @@ func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Str
// pending RPCs on the client side will get notified by connection
// errors.
func (s *Server) Stop() {
+ s.quitOnce.Do(func() {
+ close(s.quit)
+ })
+
+ defer func() {
+ s.serveWG.Wait()
+ s.doneOnce.Do(func() {
+ close(s.done)
+ })
+ }()
+
s.mu.Lock()
listeners := s.lis
s.lis = nil
@@ -1054,7 +1202,6 @@ func (s *Server) Stop() {
}
s.mu.Lock()
- s.cancel()
if s.events != nil {
s.events.Finish()
s.events = nil
@@ -1066,22 +1213,38 @@ func (s *Server) Stop() {
// accepting new connections and RPCs and blocks until all the pending RPCs are
// finished.
func (s *Server) GracefulStop() {
+ s.quitOnce.Do(func() {
+ close(s.quit)
+ })
+
+ defer func() {
+ s.doneOnce.Do(func() {
+ close(s.done)
+ })
+ }()
+
s.mu.Lock()
- defer s.mu.Unlock()
if s.conns == nil {
+ s.mu.Unlock()
return
}
for lis := range s.lis {
lis.Close()
}
s.lis = nil
- s.cancel()
if !s.drain {
for c := range s.conns {
c.(transport.ServerTransport).Drain()
}
s.drain = true
}
+
+ // Wait for serving threads to be ready to exit. Only then can we be sure no
+ // new conns will be created.
+ s.mu.Unlock()
+ s.serveWG.Wait()
+ s.mu.Lock()
+
for len(s.conns) != 0 {
s.cv.Wait()
}
@@ -1090,28 +1253,15 @@ func (s *Server) GracefulStop() {
s.events.Finish()
s.events = nil
}
+ s.mu.Unlock()
}
func init() {
- internal.TestingCloseConns = func(arg interface{}) {
- arg.(*Server).testingCloseConns()
- }
internal.TestingUseHandlerImpl = func(arg interface{}) {
arg.(*Server).opts.useHandlerImpl = true
}
}
-// testingCloseConns closes all existing transports but keeps s.lis
-// accepting new connections.
-func (s *Server) testingCloseConns() {
- s.mu.Lock()
- for c := range s.conns {
- c.Close()
- delete(s.conns, c)
- }
- s.mu.Unlock()
-}
-
// SetHeader sets the header metadata.
// When called multiple times, all the provided metadata will be merged.
// All the metadata will be sent out when one of the following happens:
@@ -1124,7 +1274,7 @@ func SetHeader(ctx context.Context, md metadata.MD) error {
}
stream, ok := transport.StreamFromContext(ctx)
if !ok {
- return Errorf(codes.Internal, "grpc: failed to fetch the stream from the context %v", ctx)
+ return status.Errorf(codes.Internal, "grpc: failed to fetch the stream from the context %v", ctx)
}
return stream.SetHeader(md)
}
@@ -1134,7 +1284,7 @@ func SetHeader(ctx context.Context, md metadata.MD) error {
func SendHeader(ctx context.Context, md metadata.MD) error {
stream, ok := transport.StreamFromContext(ctx)
if !ok {
- return Errorf(codes.Internal, "grpc: failed to fetch the stream from the context %v", ctx)
+ return status.Errorf(codes.Internal, "grpc: failed to fetch the stream from the context %v", ctx)
}
t := stream.ServerTransport()
if t == nil {
@@ -1154,7 +1304,7 @@ func SetTrailer(ctx context.Context, md metadata.MD) error {
}
stream, ok := transport.StreamFromContext(ctx)
if !ok {
- return Errorf(codes.Internal, "grpc: failed to fetch the stream from the context %v", ctx)
+ return status.Errorf(codes.Internal, "grpc: failed to fetch the stream from the context %v", ctx)
}
return stream.SetTrailer(md)
}
diff --git a/vendor/google.golang.org/grpc/server_test.go b/vendor/google.golang.org/grpc/server_test.go
index 335f56a..4a7a524 100644
--- a/vendor/google.golang.org/grpc/server_test.go
+++ b/vendor/google.golang.org/grpc/server_test.go
@@ -23,6 +23,9 @@ import (
"reflect"
"strings"
"testing"
+ "time"
+
+ "google.golang.org/grpc/test/leakcheck"
)
type emptyServiceServer interface{}
@@ -30,6 +33,7 @@ type emptyServiceServer interface{}
type testServer struct{}
func TestStopBeforeServe(t *testing.T) {
+ defer leakcheck.Check(t)
lis, err := net.Listen("tcp", "localhost:0")
if err != nil {
t.Fatalf("failed to create listener: %v", err)
@@ -45,12 +49,34 @@ func TestStopBeforeServe(t *testing.T) {
// server.Serve is responsible for closing the listener, even if the
// server was already stopped.
err = lis.Close()
- if got, want := ErrorDesc(err), "use of closed"; !strings.Contains(got, want) {
+ if got, want := errorDesc(err), "use of closed"; !strings.Contains(got, want) {
t.Errorf("Close() error = %q, want %q", got, want)
}
}
+func TestGracefulStop(t *testing.T) {
+ defer leakcheck.Check(t)
+
+ lis, err := net.Listen("tcp", "localhost:0")
+ if err != nil {
+ t.Fatalf("failed to create listener: %v", err)
+ }
+
+ server := NewServer()
+ go func() {
+ // make sure Serve() is called
+ time.Sleep(time.Millisecond * 500)
+ server.GracefulStop()
+ }()
+
+ err = server.Serve(lis)
+ if err != nil {
+ t.Fatalf("Serve() returned non-nil error on GracefulStop: %v", err)
+ }
+}
+
func TestGetServiceInfo(t *testing.T) {
+ defer leakcheck.Check(t)
testSd := ServiceDesc{
ServiceName: "grpc.testing.EmptyService",
HandlerType: (*emptyServiceServer)(nil),
diff --git a/vendor/google.golang.org/grpc/service_config.go b/vendor/google.golang.org/grpc/service_config.go
new file mode 100644
index 0000000..53fa88f
--- /dev/null
+++ b/vendor/google.golang.org/grpc/service_config.go
@@ -0,0 +1,226 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package grpc
+
+import (
+ "encoding/json"
+ "fmt"
+ "strconv"
+ "strings"
+ "time"
+
+ "google.golang.org/grpc/grpclog"
+)
+
+const maxInt = int(^uint(0) >> 1)
+
+// MethodConfig defines the configuration recommended by the service providers for a
+// particular method.
+// DEPRECATED: Users should not use this struct. Service config should be received
+// through name resolver, as specified here
+// https://github.com/grpc/grpc/blob/master/doc/service_config.md
+type MethodConfig struct {
+ // WaitForReady indicates whether RPCs sent to this method should wait until
+ // the connection is ready by default (!failfast). The value specified via the
+ // gRPC client API will override the value set here.
+ WaitForReady *bool
+ // Timeout is the default timeout for RPCs sent to this method. The actual
+ // deadline used will be the minimum of the value specified here and the value
+ // set by the application via the gRPC client API. If either one is not set,
+ // then the other will be used. If neither is set, then the RPC has no deadline.
+ Timeout *time.Duration
+ // MaxReqSize is the maximum allowed payload size for an individual request in a
+ // stream (client->server) in bytes. The size which is measured is the serialized
+ // payload after per-message compression (but before stream compression) in bytes.
+ // The actual value used is the minimum of the value specified here and the value set
+ // by the application via the gRPC client API. If either one is not set, then the other
+ // will be used. If neither is set, then the built-in default is used.
+ MaxReqSize *int
+ // MaxRespSize is the maximum allowed payload size for an individual response in a
+ // stream (server->client) in bytes.
+ MaxRespSize *int
+}
+
+// ServiceConfig is provided by the service provider and contains parameters for how
+// clients that connect to the service should behave.
+// DEPRECATED: Users should not use this struct. Service config should be received
+// through name resolver, as specified here
+// https://github.com/grpc/grpc/blob/master/doc/service_config.md
+type ServiceConfig struct {
+ // LB is the load balancer the service providers recommends. The balancer specified
+ // via grpc.WithBalancer will override this.
+ LB *string
+ // Methods contains a map for the methods in this service.
+ // If there is an exact match for a method (i.e. /service/method) in the map, use the corresponding MethodConfig.
+ // If there's no exact match, look for the default config for the service (/service/) and use the corresponding MethodConfig if it exists.
+ // Otherwise, the method has no MethodConfig to use.
+ Methods map[string]MethodConfig
+}
+
+func parseDuration(s *string) (*time.Duration, error) {
+ if s == nil {
+ return nil, nil
+ }
+ if !strings.HasSuffix(*s, "s") {
+ return nil, fmt.Errorf("malformed duration %q", *s)
+ }
+ ss := strings.SplitN((*s)[:len(*s)-1], ".", 3)
+ if len(ss) > 2 {
+ return nil, fmt.Errorf("malformed duration %q", *s)
+ }
+ // hasDigits is set if either the whole or fractional part of the number is
+ // present, since both are optional but one is required.
+ hasDigits := false
+ var d time.Duration
+ if len(ss[0]) > 0 {
+ i, err := strconv.ParseInt(ss[0], 10, 32)
+ if err != nil {
+ return nil, fmt.Errorf("malformed duration %q: %v", *s, err)
+ }
+ d = time.Duration(i) * time.Second
+ hasDigits = true
+ }
+ if len(ss) == 2 && len(ss[1]) > 0 {
+ if len(ss[1]) > 9 {
+ return nil, fmt.Errorf("malformed duration %q", *s)
+ }
+ f, err := strconv.ParseInt(ss[1], 10, 64)
+ if err != nil {
+ return nil, fmt.Errorf("malformed duration %q: %v", *s, err)
+ }
+ for i := 9; i > len(ss[1]); i-- {
+ f *= 10
+ }
+ d += time.Duration(f)
+ hasDigits = true
+ }
+ if !hasDigits {
+ return nil, fmt.Errorf("malformed duration %q", *s)
+ }
+
+ return &d, nil
+}
+
+type jsonName struct {
+ Service *string
+ Method *string
+}
+
+func (j jsonName) generatePath() (string, bool) {
+ if j.Service == nil {
+ return "", false
+ }
+ res := "/" + *j.Service + "/"
+ if j.Method != nil {
+ res += *j.Method
+ }
+ return res, true
+}
+
+// TODO(lyuxuan): delete this struct after cleaning up old service config implementation.
+type jsonMC struct {
+ Name *[]jsonName
+ WaitForReady *bool
+ Timeout *string
+ MaxRequestMessageBytes *int64
+ MaxResponseMessageBytes *int64
+}
+
+// TODO(lyuxuan): delete this struct after cleaning up old service config implementation.
+type jsonSC struct {
+ LoadBalancingPolicy *string
+ MethodConfig *[]jsonMC
+}
+
+func parseServiceConfig(js string) (ServiceConfig, error) {
+ var rsc jsonSC
+ err := json.Unmarshal([]byte(js), &rsc)
+ if err != nil {
+ grpclog.Warningf("grpc: parseServiceConfig error unmarshaling %s due to %v", js, err)
+ return ServiceConfig{}, err
+ }
+ sc := ServiceConfig{
+ LB: rsc.LoadBalancingPolicy,
+ Methods: make(map[string]MethodConfig),
+ }
+ if rsc.MethodConfig == nil {
+ return sc, nil
+ }
+
+ for _, m := range *rsc.MethodConfig {
+ if m.Name == nil {
+ continue
+ }
+ d, err := parseDuration(m.Timeout)
+ if err != nil {
+ grpclog.Warningf("grpc: parseServiceConfig error unmarshaling %s due to %v", js, err)
+ return ServiceConfig{}, err
+ }
+
+ mc := MethodConfig{
+ WaitForReady: m.WaitForReady,
+ Timeout: d,
+ }
+ if m.MaxRequestMessageBytes != nil {
+ if *m.MaxRequestMessageBytes > int64(maxInt) {
+ mc.MaxReqSize = newInt(maxInt)
+ } else {
+ mc.MaxReqSize = newInt(int(*m.MaxRequestMessageBytes))
+ }
+ }
+ if m.MaxResponseMessageBytes != nil {
+ if *m.MaxResponseMessageBytes > int64(maxInt) {
+ mc.MaxRespSize = newInt(maxInt)
+ } else {
+ mc.MaxRespSize = newInt(int(*m.MaxResponseMessageBytes))
+ }
+ }
+ for _, n := range *m.Name {
+ if path, valid := n.generatePath(); valid {
+ sc.Methods[path] = mc
+ }
+ }
+ }
+
+ return sc, nil
+}
+
+func min(a, b *int) *int {
+ if *a < *b {
+ return a
+ }
+ return b
+}
+
+func getMaxSize(mcMax, doptMax *int, defaultVal int) *int {
+ if mcMax == nil && doptMax == nil {
+ return &defaultVal
+ }
+ if mcMax != nil && doptMax != nil {
+ return min(mcMax, doptMax)
+ }
+ if mcMax != nil {
+ return mcMax
+ }
+ return doptMax
+}
+
+func newInt(b int) *int {
+ return &b
+}
diff --git a/vendor/google.golang.org/grpc/service_config_test.go b/vendor/google.golang.org/grpc/service_config_test.go
new file mode 100644
index 0000000..8301a50
--- /dev/null
+++ b/vendor/google.golang.org/grpc/service_config_test.go
@@ -0,0 +1,386 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package grpc
+
+import (
+ "fmt"
+ "math"
+ "reflect"
+ "testing"
+ "time"
+)
+
+func TestParseLoadBalancer(t *testing.T) {
+ testcases := []struct {
+ scjs string
+ wantSC ServiceConfig
+ wantErr bool
+ }{
+ {
+ `{
+ "loadBalancingPolicy": "round_robin",
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "foo",
+ "method": "Bar"
+ }
+ ],
+ "waitForReady": true
+ }
+ ]
+}`,
+ ServiceConfig{
+ LB: newString("round_robin"),
+ Methods: map[string]MethodConfig{
+ "/foo/Bar": {
+ WaitForReady: newBool(true),
+ },
+ },
+ },
+ false,
+ },
+ {
+ `{
+ "loadBalancingPolicy": 1,
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "foo",
+ "method": "Bar"
+ }
+ ],
+ "waitForReady": false
+ }
+ ]
+}`,
+ ServiceConfig{},
+ true,
+ },
+ }
+
+ for _, c := range testcases {
+ sc, err := parseServiceConfig(c.scjs)
+ if c.wantErr != (err != nil) || !reflect.DeepEqual(sc, c.wantSC) {
+ t.Fatalf("parseServiceConfig(%s) = %+v, %v, want %+v, %v", c.scjs, sc, err, c.wantSC, c.wantErr)
+ }
+ }
+}
+
+func TestParseWaitForReady(t *testing.T) {
+ testcases := []struct {
+ scjs string
+ wantSC ServiceConfig
+ wantErr bool
+ }{
+ {
+ `{
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "foo",
+ "method": "Bar"
+ }
+ ],
+ "waitForReady": true
+ }
+ ]
+}`,
+ ServiceConfig{
+ Methods: map[string]MethodConfig{
+ "/foo/Bar": {
+ WaitForReady: newBool(true),
+ },
+ },
+ },
+ false,
+ },
+ {
+ `{
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "foo",
+ "method": "Bar"
+ }
+ ],
+ "waitForReady": false
+ }
+ ]
+}`,
+ ServiceConfig{
+ Methods: map[string]MethodConfig{
+ "/foo/Bar": {
+ WaitForReady: newBool(false),
+ },
+ },
+ },
+ false,
+ },
+ {
+ `{
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "foo",
+ "method": "Bar"
+ }
+ ],
+ "waitForReady": fall
+ },
+ {
+ "name": [
+ {
+ "service": "foo",
+ "method": "Bar"
+ }
+ ],
+ "waitForReady": true
+ }
+ ]
+}`,
+ ServiceConfig{},
+ true,
+ },
+ }
+
+ for _, c := range testcases {
+ sc, err := parseServiceConfig(c.scjs)
+ if c.wantErr != (err != nil) || !reflect.DeepEqual(sc, c.wantSC) {
+ t.Fatalf("parseServiceConfig(%s) = %+v, %v, want %+v, %v", c.scjs, sc, err, c.wantSC, c.wantErr)
+ }
+ }
+}
+
+func TestPraseTimeOut(t *testing.T) {
+ testcases := []struct {
+ scjs string
+ wantSC ServiceConfig
+ wantErr bool
+ }{
+ {
+ `{
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "foo",
+ "method": "Bar"
+ }
+ ],
+ "timeout": "1s"
+ }
+ ]
+}`,
+ ServiceConfig{
+ Methods: map[string]MethodConfig{
+ "/foo/Bar": {
+ Timeout: newDuration(time.Second),
+ },
+ },
+ },
+ false,
+ },
+ {
+ `{
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "foo",
+ "method": "Bar"
+ }
+ ],
+ "timeout": "3c"
+ }
+ ]
+}`,
+ ServiceConfig{},
+ true,
+ },
+ {
+ `{
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "foo",
+ "method": "Bar"
+ }
+ ],
+ "timeout": "3c"
+ },
+ {
+ "name": [
+ {
+ "service": "foo",
+ "method": "Bar"
+ }
+ ],
+ "timeout": "1s"
+ }
+ ]
+}`,
+ ServiceConfig{},
+ true,
+ },
+ }
+
+ for _, c := range testcases {
+ sc, err := parseServiceConfig(c.scjs)
+ if c.wantErr != (err != nil) || !reflect.DeepEqual(sc, c.wantSC) {
+ t.Fatalf("parseServiceConfig(%s) = %+v, %v, want %+v, %v", c.scjs, sc, err, c.wantSC, c.wantErr)
+ }
+ }
+}
+
+func TestPraseMsgSize(t *testing.T) {
+ testcases := []struct {
+ scjs string
+ wantSC ServiceConfig
+ wantErr bool
+ }{
+ {
+ `{
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "foo",
+ "method": "Bar"
+ }
+ ],
+ "maxRequestMessageBytes": 1024,
+ "maxResponseMessageBytes": 2048
+ }
+ ]
+}`,
+ ServiceConfig{
+ Methods: map[string]MethodConfig{
+ "/foo/Bar": {
+ MaxReqSize: newInt(1024),
+ MaxRespSize: newInt(2048),
+ },
+ },
+ },
+ false,
+ },
+ {
+ `{
+ "methodConfig": [
+ {
+ "name": [
+ {
+ "service": "foo",
+ "method": "Bar"
+ }
+ ],
+ "maxRequestMessageBytes": "1024",
+ "maxResponseMessageBytes": "2048"
+ },
+ {
+ "name": [
+ {
+ "service": "foo",
+ "method": "Bar"
+ }
+ ],
+ "maxRequestMessageBytes": 1024,
+ "maxResponseMessageBytes": 2048
+ }
+ ]
+}`,
+ ServiceConfig{},
+ true,
+ },
+ }
+
+ for _, c := range testcases {
+ sc, err := parseServiceConfig(c.scjs)
+ if c.wantErr != (err != nil) || !reflect.DeepEqual(sc, c.wantSC) {
+ t.Fatalf("parseServiceConfig(%s) = %+v, %v, want %+v, %v", c.scjs, sc, err, c.wantSC, c.wantErr)
+ }
+ }
+}
+
+func TestParseDuration(t *testing.T) {
+ testCases := []struct {
+ s *string
+ want *time.Duration
+ err bool
+ }{
+ {s: nil, want: nil},
+ {s: newString("1s"), want: newDuration(time.Second)},
+ {s: newString("-1s"), want: newDuration(-time.Second)},
+ {s: newString("1.1s"), want: newDuration(1100 * time.Millisecond)},
+ {s: newString("1.s"), want: newDuration(time.Second)},
+ {s: newString("1.0s"), want: newDuration(time.Second)},
+ {s: newString(".002s"), want: newDuration(2 * time.Millisecond)},
+ {s: newString(".002000s"), want: newDuration(2 * time.Millisecond)},
+ {s: newString("0.003s"), want: newDuration(3 * time.Millisecond)},
+ {s: newString("0.000004s"), want: newDuration(4 * time.Microsecond)},
+ {s: newString("5000.000000009s"), want: newDuration(5000*time.Second + 9*time.Nanosecond)},
+ {s: newString("4999.999999999s"), want: newDuration(5000*time.Second - time.Nanosecond)},
+ {s: newString("1"), err: true},
+ {s: newString("s"), err: true},
+ {s: newString(".s"), err: true},
+ {s: newString("1 s"), err: true},
+ {s: newString(" 1s"), err: true},
+ {s: newString("1ms"), err: true},
+ {s: newString("1.1.1s"), err: true},
+ {s: newString("Xs"), err: true},
+ {s: newString("as"), err: true},
+ {s: newString(".0000000001s"), err: true},
+ {s: newString(fmt.Sprint(math.MaxInt32) + "s"), want: newDuration(math.MaxInt32 * time.Second)},
+ {s: newString(fmt.Sprint(int64(math.MaxInt32)+1) + "s"), err: true},
+ }
+ for _, tc := range testCases {
+ got, err := parseDuration(tc.s)
+ if tc.err != (err != nil) ||
+ (got == nil) != (tc.want == nil) ||
+ (got != nil && *got != *tc.want) {
+ wantErr := ""
+ if tc.err {
+ wantErr = ""
+ }
+ s := ""
+ if tc.s != nil {
+ s = `&"` + *tc.s + `"`
+ }
+ t.Errorf("parseDuration(%v) = %v, %v; want %v, %v", s, got, err, tc.want, wantErr)
+ }
+ }
+}
+
+func newBool(b bool) *bool {
+ return &b
+}
+
+func newDuration(b time.Duration) *time.Duration {
+ return &b
+}
+
+func newString(b string) *string {
+ return &b
+}
diff --git a/vendor/google.golang.org/grpc/stats/stats.go b/vendor/google.golang.org/grpc/stats/stats.go
index e7a14d9..d5aa2f7 100644
--- a/vendor/google.golang.org/grpc/stats/stats.go
+++ b/vendor/google.golang.org/grpc/stats/stats.go
@@ -135,8 +135,6 @@ func (s *OutPayload) isRPCStats() {}
type OutHeader struct {
// Client is true if this OutHeader is from client side.
Client bool
- // WireLength is the wire length of header.
- WireLength int
// The following fields are valid only if Client is true.
// FullMethod is the full RPC method string, i.e., /package.service/method.
@@ -220,7 +218,7 @@ type outgoingTagsKey struct{}
// the outgoing RPC with the header grpc-tags-bin. Subsequent calls to
// SetTags will overwrite the values from earlier calls.
//
-// NOTE: this is provided only for backward compatibilty with existing clients
+// NOTE: this is provided only for backward compatibility with existing clients
// and will likely be removed in an upcoming release. New uses should transmit
// this type of data using metadata with a different, non-reserved (i.e. does
// not begin with "grpc-") header name.
@@ -230,7 +228,7 @@ func SetTags(ctx context.Context, b []byte) context.Context {
// Tags returns the tags from the context for the inbound RPC.
//
-// NOTE: this is provided only for backward compatibilty with existing clients
+// NOTE: this is provided only for backward compatibility with existing clients
// and will likely be removed in an upcoming release. New uses should transmit
// this type of data using metadata with a different, non-reserved (i.e. does
// not begin with "grpc-") header name.
@@ -262,7 +260,7 @@ type outgoingTraceKey struct{}
// the outgoing RPC with the header grpc-trace-bin. Subsequent calls to
// SetTrace will overwrite the values from earlier calls.
//
-// NOTE: this is provided only for backward compatibilty with existing clients
+// NOTE: this is provided only for backward compatibility with existing clients
// and will likely be removed in an upcoming release. New uses should transmit
// this type of data using metadata with a different, non-reserved (i.e. does
// not begin with "grpc-") header name.
@@ -272,7 +270,7 @@ func SetTrace(ctx context.Context, b []byte) context.Context {
// Trace returns the trace from the context for the inbound RPC.
//
-// NOTE: this is provided only for backward compatibilty with existing clients
+// NOTE: this is provided only for backward compatibility with existing clients
// and will likely be removed in an upcoming release. New uses should transmit
// this type of data using metadata with a different, non-reserved (i.e. does
// not begin with "grpc-") header name.
diff --git a/vendor/google.golang.org/grpc/stats/stats_test.go b/vendor/google.golang.org/grpc/stats/stats_test.go
index 8865d3f..fef0d7c 100644
--- a/vendor/google.golang.org/grpc/stats/stats_test.go
+++ b/vendor/google.golang.org/grpc/stats/stats_test.go
@@ -1,3 +1,5 @@
+// +build go1.7
+
/*
*
* Copyright 2016 gRPC authors.
@@ -33,6 +35,7 @@ import (
"google.golang.org/grpc/metadata"
"google.golang.org/grpc/stats"
testpb "google.golang.org/grpc/stats/grpc_testing"
+ "google.golang.org/grpc/status"
)
func init() {
@@ -63,10 +66,10 @@ func (s *testServer) UnaryCall(ctx context.Context, in *testpb.SimpleRequest) (*
md, ok := metadata.FromIncomingContext(ctx)
if ok {
if err := grpc.SendHeader(ctx, md); err != nil {
- return nil, grpc.Errorf(grpc.Code(err), "grpc.SendHeader(_, %v) = %v, want ", md, err)
+ return nil, status.Errorf(status.Code(err), "grpc.SendHeader(_, %v) = %v, want ", md, err)
}
if err := grpc.SetTrailer(ctx, testTrailerMetadata); err != nil {
- return nil, grpc.Errorf(grpc.Code(err), "grpc.SetTrailer(_, %v) = %v, want ", testTrailerMetadata, err)
+ return nil, status.Errorf(status.Code(err), "grpc.SetTrailer(_, %v) = %v, want ", testTrailerMetadata, err)
}
}
@@ -81,7 +84,7 @@ func (s *testServer) FullDuplexCall(stream testpb.TestService_FullDuplexCallServ
md, ok := metadata.FromIncomingContext(stream.Context())
if ok {
if err := stream.SendHeader(md); err != nil {
- return grpc.Errorf(grpc.Code(err), "%v.SendHeader(%v) = %v, want %v", stream, md, err, nil)
+ return status.Errorf(status.Code(err), "%v.SendHeader(%v) = %v, want %v", stream, md, err, nil)
}
stream.SetTrailer(testTrailerMetadata)
}
@@ -109,7 +112,7 @@ func (s *testServer) ClientStreamCall(stream testpb.TestService_ClientStreamCall
md, ok := metadata.FromIncomingContext(stream.Context())
if ok {
if err := stream.SendHeader(md); err != nil {
- return grpc.Errorf(grpc.Code(err), "%v.SendHeader(%v) = %v, want %v", stream, md, err, nil)
+ return status.Errorf(status.Code(err), "%v.SendHeader(%v) = %v, want %v", stream, md, err, nil)
}
stream.SetTrailer(testTrailerMetadata)
}
@@ -133,7 +136,7 @@ func (s *testServer) ServerStreamCall(in *testpb.SimpleRequest, stream testpb.Te
md, ok := metadata.FromIncomingContext(stream.Context())
if ok {
if err := stream.SendHeader(md); err != nil {
- return grpc.Errorf(grpc.Code(err), "%v.SendHeader(%v) = %v, want %v", stream, md, err, nil)
+ return status.Errorf(status.Code(err), "%v.SendHeader(%v) = %v, want %v", stream, md, err, nil)
}
stream.SetTrailer(testTrailerMetadata)
}
@@ -444,10 +447,6 @@ func checkInHeader(t *testing.T, d *gotData, e *expectedData) {
if d.ctx == nil {
t.Fatalf("d.ctx = nil, want ")
}
- // TODO check real length, not just > 0.
- if st.WireLength <= 0 {
- t.Fatalf("st.Lenght = 0, want > 0")
- }
if !d.client {
if st.FullMethod != e.method {
t.Fatalf("st.FullMethod = %s, want %v", st.FullMethod, e.method)
@@ -530,18 +529,13 @@ func checkInPayload(t *testing.T, d *gotData, e *expectedData) {
func checkInTrailer(t *testing.T, d *gotData, e *expectedData) {
var (
ok bool
- st *stats.InTrailer
)
- if st, ok = d.s.(*stats.InTrailer); !ok {
+ if _, ok = d.s.(*stats.InTrailer); !ok {
t.Fatalf("got %T, want InTrailer", d.s)
}
if d.ctx == nil {
t.Fatalf("d.ctx = nil, want ")
}
- // TODO check real length, not just > 0.
- if st.WireLength <= 0 {
- t.Fatalf("st.Lenght = 0, want > 0")
- }
}
func checkOutHeader(t *testing.T, d *gotData, e *expectedData) {
@@ -555,10 +549,6 @@ func checkOutHeader(t *testing.T, d *gotData, e *expectedData) {
if d.ctx == nil {
t.Fatalf("d.ctx = nil, want ")
}
- // TODO check real length, not just > 0.
- if st.WireLength <= 0 {
- t.Fatalf("st.Lenght = 0, want > 0")
- }
if d.client {
if st.FullMethod != e.method {
t.Fatalf("st.FullMethod = %s, want %v", st.FullMethod, e.method)
@@ -642,10 +632,6 @@ func checkOutTrailer(t *testing.T, d *gotData, e *expectedData) {
if st.Client {
t.Fatalf("st IsClient = true, want false")
}
- // TODO check real length, not just > 0.
- if st.WireLength <= 0 {
- t.Fatalf("st.Lenght = 0, want > 0")
- }
}
func checkEnd(t *testing.T, d *gotData, e *expectedData) {
@@ -662,7 +648,14 @@ func checkEnd(t *testing.T, d *gotData, e *expectedData) {
if st.EndTime.IsZero() {
t.Fatalf("st.EndTime = %v, want ", st.EndTime)
}
- if grpc.Code(st.Error) != grpc.Code(e.err) || grpc.ErrorDesc(st.Error) != grpc.ErrorDesc(e.err) {
+
+ actual, ok := status.FromError(st.Error)
+ if !ok {
+ t.Fatalf("expected st.Error to be a statusError, got %T", st.Error)
+ }
+
+ expectedStatus, _ := status.FromError(e.err)
+ if actual.Code() != expectedStatus.Code() || actual.Message() != expectedStatus.Message() {
t.Fatalf("st.Error = %v, want %v", st.Error, e.err)
}
}
@@ -830,7 +823,9 @@ func testServerStats(t *testing.T, tc *testConfig, cc *rpcConfig, checkFuncs []f
err: err,
}
+ h.mu.Lock()
checkConnStats(t, h.gotConn)
+ h.mu.Unlock()
checkServerStats(t, h.gotRPC, expect, checkFuncs)
}
@@ -1123,7 +1118,9 @@ func testClientStats(t *testing.T, tc *testConfig, cc *rpcConfig, checkFuncs map
err: err,
}
+ h.mu.Lock()
checkConnStats(t, h.gotConn)
+ h.mu.Unlock()
checkClientStats(t, h.gotRPC, expect, checkFuncs)
}
diff --git a/vendor/google.golang.org/grpc/status/status.go b/vendor/google.golang.org/grpc/status/status.go
index 871dc4b..d9defae 100644
--- a/vendor/google.golang.org/grpc/status/status.go
+++ b/vendor/google.golang.org/grpc/status/status.go
@@ -125,8 +125,8 @@ func FromError(err error) (s *Status, ok bool) {
if err == nil {
return &Status{s: &spb.Status{Code: int32(codes.OK)}}, true
}
- if s, ok := err.(*statusError); ok {
- return s.status(), true
+ if se, ok := err.(*statusError); ok {
+ return se.status(), true
}
return nil, false
}
@@ -166,3 +166,16 @@ func (s *Status) Details() []interface{} {
}
return details
}
+
+// Code returns the Code of the error if it is a Status error, codes.OK if err
+// is nil, or codes.Unknown otherwise.
+func Code(err error) codes.Code {
+ // Don't use FromError to avoid allocation of OK status.
+ if err == nil {
+ return codes.OK
+ }
+ if se, ok := err.(*statusError); ok {
+ return se.status().Code()
+ }
+ return codes.Unknown
+}
diff --git a/vendor/google.golang.org/grpc/stream.go b/vendor/google.golang.org/grpc/stream.go
index 6f29a97..f913819 100644
--- a/vendor/google.golang.org/grpc/stream.go
+++ b/vendor/google.golang.org/grpc/stream.go
@@ -19,7 +19,6 @@
package grpc
import (
- "bytes"
"errors"
"io"
"sync"
@@ -27,7 +26,9 @@ import (
"golang.org/x/net/context"
"golang.org/x/net/trace"
+ "google.golang.org/grpc/balancer"
"google.golang.org/grpc/codes"
+ "google.golang.org/grpc/encoding"
"google.golang.org/grpc/metadata"
"google.golang.org/grpc/peer"
"google.golang.org/grpc/stats"
@@ -93,29 +94,37 @@ type ClientStream interface {
Stream
}
-// NewClientStream creates a new Stream for the client side. This is called
-// by generated code.
-func NewClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, opts ...CallOption) (_ ClientStream, err error) {
+// NewStream creates a new Stream for the client side. This is typically
+// called by generated code.
+func (cc *ClientConn) NewStream(ctx context.Context, desc *StreamDesc, method string, opts ...CallOption) (ClientStream, error) {
if cc.dopts.streamInt != nil {
return cc.dopts.streamInt(ctx, desc, cc, method, newClientStream, opts...)
}
return newClientStream(ctx, desc, cc, method, opts...)
}
+// NewClientStream creates a new Stream for the client side. This is typically
+// called by generated code.
+//
+// DEPRECATED: Use ClientConn.NewStream instead.
+func NewClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, opts ...CallOption) (ClientStream, error) {
+ return cc.NewStream(ctx, desc, method, opts...)
+}
+
func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, opts ...CallOption) (_ ClientStream, err error) {
var (
t transport.ClientTransport
s *transport.Stream
- put func()
+ done func(balancer.DoneInfo)
cancel context.CancelFunc
)
- c := defaultCallInfo
+ c := defaultCallInfo()
mc := cc.GetMethodConfig(method)
if mc.WaitForReady != nil {
c.failFast = !*mc.WaitForReady
}
- if mc.Timeout != nil {
+ if mc.Timeout != nil && *mc.Timeout >= 0 {
ctx, cancel = context.WithTimeout(ctx, *mc.Timeout)
defer func() {
if err != nil {
@@ -126,7 +135,7 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth
opts = append(cc.dopts.callOptions, opts...)
for _, o := range opts {
- if err := o.before(&c); err != nil {
+ if err := o.before(c); err != nil {
return nil, toRPCErr(err)
}
}
@@ -142,8 +151,24 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth
// time soon, so we ask the transport to flush the header.
Flush: desc.ClientStreams,
}
- if cc.dopts.cp != nil {
+
+ // Set our outgoing compression according to the UseCompressor CallOption, if
+ // set. In that case, also find the compressor from the encoding package.
+ // Otherwise, use the compressor configured by the WithCompressor DialOption,
+ // if set.
+ var cp Compressor
+ var comp encoding.Compressor
+ if ct := c.compressorType; ct != "" {
+ callHdr.SendCompress = ct
+ if ct != encoding.Identity {
+ comp = encoding.GetCompressor(ct)
+ if comp == nil {
+ return nil, status.Errorf(codes.Internal, "grpc: Compressor is not installed for requested grpc-encoding %q", ct)
+ }
+ }
+ } else if cc.dopts.cp != nil {
callHdr.SendCompress = cc.dopts.cp.Type()
+ cp = cc.dopts.cp
}
if c.creds != nil {
callHdr.Creds = c.creds
@@ -167,7 +192,7 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth
}
}()
}
- ctx = newContextWithRPCInfo(ctx)
+ ctx = newContextWithRPCInfo(ctx, c.failFast)
sh := cc.dopts.copts.StatsHandler
if sh != nil {
ctx = sh.TagRPC(ctx, &stats.RPCTagInfo{FullMethodName: method, FailFast: c.failFast})
@@ -188,45 +213,46 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth
}
}()
}
- gopts := BalancerGetOptions{
- BlockingWait: !c.failFast,
- }
+
for {
- t, put, err = cc.getTransport(ctx, gopts)
+ // Check to make sure the context has expired. This will prevent us from
+ // looping forever if an error occurs for wait-for-ready RPCs where no data
+ // is sent on the wire.
+ select {
+ case <-ctx.Done():
+ return nil, toRPCErr(ctx.Err())
+ default:
+ }
+
+ t, done, err = cc.getTransport(ctx, c.failFast)
if err != nil {
- // TODO(zhaoq): Probably revisit the error handling.
- if _, ok := status.FromError(err); ok {
- return nil, err
- }
- if err == errConnClosing || err == errConnUnavailable {
- if c.failFast {
- return nil, Errorf(codes.Unavailable, "%v", err)
- }
- continue
- }
- // All the other errors are treated as Internal errors.
- return nil, Errorf(codes.Internal, "%v", err)
+ return nil, err
}
s, err = t.NewStream(ctx, callHdr)
if err != nil {
- if _, ok := err.(transport.ConnectionError); ok && put != nil {
- // If error is connection error, transport was sending data on wire,
- // and we are not sure if anything has been sent on wire.
- // If error is not connection error, we are sure nothing has been sent.
- updateRPCInfoInContext(ctx, rpcInfo{bytesSent: true, bytesReceived: false})
+ if done != nil {
+ doneInfo := balancer.DoneInfo{Err: err}
+ if _, ok := err.(transport.ConnectionError); ok {
+ // If error is connection error, transport was sending data on wire,
+ // and we are not sure if anything has been sent on wire.
+ // If error is not connection error, we are sure nothing has been sent.
+ doneInfo.BytesSent = true
+ }
+ done(doneInfo)
+ done = nil
}
- if put != nil {
- put()
- put = nil
- }
- if _, ok := err.(transport.ConnectionError); (ok || err == transport.ErrStreamDrain) && !c.failFast {
+ // In the event of any error from NewStream, we never attempted to write
+ // anything to the wire, so we can retry indefinitely for non-fail-fast
+ // RPCs.
+ if !c.failFast {
continue
}
return nil, toRPCErr(err)
}
break
}
+
// Set callInfo.peer object from stream's context.
if peer, ok := peer.FromContext(s.Context()); ok {
c.peer = peer
@@ -236,14 +262,15 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth
c: c,
desc: desc,
codec: cc.dopts.codec,
- cp: cc.dopts.cp,
+ cp: cp,
dc: cc.dopts.dc,
+ comp: comp,
cancel: cancel,
- put: put,
- t: t,
- s: s,
- p: &parser{r: s},
+ done: done,
+ t: t,
+ s: s,
+ p: &parser{r: s},
tracing: EnableTracing,
trInfo: trInfo,
@@ -251,11 +278,8 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth
statsCtx: ctx,
statsHandler: cc.dopts.copts.StatsHandler,
}
- if cc.dopts.cp != nil {
- cs.cbuf = new(bytes.Buffer)
- }
- // Listen on ctx.Done() to detect cancellation and s.Done() to detect normal termination
- // when there is no pending I/O operations on this stream.
+ // Listen on s.Context().Done() to detect cancellation and s.Done() to detect
+ // normal termination when there is no pending I/O operations on this stream.
go func() {
select {
case <-t.Error():
@@ -282,22 +306,26 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth
// clientStream implements a client side Stream.
type clientStream struct {
- opts []CallOption
- c callInfo
- t transport.ClientTransport
- s *transport.Stream
- p *parser
- desc *StreamDesc
- codec Codec
- cp Compressor
- cbuf *bytes.Buffer
- dc Decompressor
+ opts []CallOption
+ c *callInfo
+ t transport.ClientTransport
+ s *transport.Stream
+ p *parser
+ desc *StreamDesc
+
+ codec Codec
+ cp Compressor
+ dc Decompressor
+ comp encoding.Compressor
+ decomp encoding.Compressor
+ decompSet bool
+
cancel context.CancelFunc
tracing bool // set to EnableTracing when the clientStream is created.
mu sync.Mutex
- put func()
+ done func(balancer.DoneInfo)
closed bool
finished bool
// trInfo.tr is set when the clientStream is created (if EnableTracing is true),
@@ -367,20 +395,15 @@ func (cs *clientStream) SendMsg(m interface{}) (err error) {
Client: true,
}
}
- hdr, data, err := encode(cs.codec, m, cs.cp, cs.cbuf, outPayload)
- defer func() {
- if cs.cbuf != nil {
- cs.cbuf.Reset()
- }
- }()
+ hdr, data, err := encode(cs.codec, m, cs.cp, outPayload, cs.comp)
if err != nil {
return err
}
if cs.c.maxSendMessageSize == nil {
- return Errorf(codes.Internal, "callInfo maxSendMessageSize field uninitialized(nil)")
+ return status.Errorf(codes.Internal, "callInfo maxSendMessageSize field uninitialized(nil)")
}
if len(data) > *cs.c.maxSendMessageSize {
- return Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", len(data), *cs.c.maxSendMessageSize)
+ return status.Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", len(data), *cs.c.maxSendMessageSize)
}
err = cs.t.Write(cs.s, hdr, data, &transport.Options{Last: false})
if err == nil && outPayload != nil {
@@ -398,9 +421,25 @@ func (cs *clientStream) RecvMsg(m interface{}) (err error) {
}
}
if cs.c.maxReceiveMessageSize == nil {
- return Errorf(codes.Internal, "callInfo maxReceiveMessageSize field uninitialized(nil)")
+ return status.Errorf(codes.Internal, "callInfo maxReceiveMessageSize field uninitialized(nil)")
}
- err = recv(cs.p, cs.codec, cs.s, cs.dc, m, *cs.c.maxReceiveMessageSize, inPayload)
+ if !cs.decompSet {
+ // Block until we receive headers containing received message encoding.
+ if ct := cs.s.RecvCompress(); ct != "" && ct != encoding.Identity {
+ if cs.dc == nil || cs.dc.Type() != ct {
+ // No configured decompressor, or it does not match the incoming
+ // message encoding; attempt to find a registered compressor that does.
+ cs.dc = nil
+ cs.decomp = encoding.GetCompressor(ct)
+ }
+ } else {
+ // No compression is used; disable our decompressor.
+ cs.dc = nil
+ }
+ // Only initialize this state once per stream.
+ cs.decompSet = true
+ }
+ err = recv(cs.p, cs.codec, cs.s, cs.dc, m, *cs.c.maxReceiveMessageSize, inPayload, cs.decomp)
defer func() {
// err != nil indicates the termination of the stream.
if err != nil {
@@ -424,9 +463,9 @@ func (cs *clientStream) RecvMsg(m interface{}) (err error) {
// Special handling for client streaming rpc.
// This recv expects EOF or errors, so we don't collect inPayload.
if cs.c.maxReceiveMessageSize == nil {
- return Errorf(codes.Internal, "callInfo maxReceiveMessageSize field uninitialized(nil)")
+ return status.Errorf(codes.Internal, "callInfo maxReceiveMessageSize field uninitialized(nil)")
}
- err = recv(cs.p, cs.codec, cs.s, cs.dc, m, *cs.c.maxReceiveMessageSize, nil)
+ err = recv(cs.p, cs.codec, cs.s, cs.dc, m, *cs.c.maxReceiveMessageSize, nil, cs.decomp)
cs.closeTransportStream(err)
if err == nil {
return toRPCErr(errors.New("grpc: client streaming protocol violation: get , want "))
@@ -494,15 +533,15 @@ func (cs *clientStream) finish(err error) {
}
}()
for _, o := range cs.opts {
- o.after(&cs.c)
+ o.after(cs.c)
}
- if cs.put != nil {
- updateRPCInfoInContext(cs.s.Context(), rpcInfo{
- bytesSent: cs.s.BytesSent(),
- bytesReceived: cs.s.BytesReceived(),
+ if cs.done != nil {
+ cs.done(balancer.DoneInfo{
+ Err: err,
+ BytesSent: true,
+ BytesReceived: cs.s.BytesReceived(),
})
- cs.put()
- cs.put = nil
+ cs.done = nil
}
if cs.statsHandler != nil {
end := &stats.End{
@@ -551,13 +590,16 @@ type ServerStream interface {
// serverStream implements a server side Stream.
type serverStream struct {
- t transport.ServerTransport
- s *transport.Stream
- p *parser
- codec Codec
- cp Compressor
- dc Decompressor
- cbuf *bytes.Buffer
+ t transport.ServerTransport
+ s *transport.Stream
+ p *parser
+ codec Codec
+
+ cp Compressor
+ dc Decompressor
+ comp encoding.Compressor
+ decomp encoding.Compressor
+
maxReceiveMessageSize int
maxSendMessageSize int
trInfo *traceInfo
@@ -613,17 +655,12 @@ func (ss *serverStream) SendMsg(m interface{}) (err error) {
if ss.statsHandler != nil {
outPayload = &stats.OutPayload{}
}
- hdr, data, err := encode(ss.codec, m, ss.cp, ss.cbuf, outPayload)
- defer func() {
- if ss.cbuf != nil {
- ss.cbuf.Reset()
- }
- }()
+ hdr, data, err := encode(ss.codec, m, ss.cp, outPayload, ss.comp)
if err != nil {
return err
}
if len(data) > ss.maxSendMessageSize {
- return Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", len(data), ss.maxSendMessageSize)
+ return status.Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", len(data), ss.maxSendMessageSize)
}
if err := ss.t.Write(ss.s, hdr, data, &transport.Options{Last: false}); err != nil {
return toRPCErr(err)
@@ -658,12 +695,12 @@ func (ss *serverStream) RecvMsg(m interface{}) (err error) {
if ss.statsHandler != nil {
inPayload = &stats.InPayload{}
}
- if err := recv(ss.p, ss.codec, ss.s, ss.dc, m, ss.maxReceiveMessageSize, inPayload); err != nil {
+ if err := recv(ss.p, ss.codec, ss.s, ss.dc, m, ss.maxReceiveMessageSize, inPayload, ss.decomp); err != nil {
if err == io.EOF {
return err
}
if err == io.ErrUnexpectedEOF {
- err = Errorf(codes.Internal, io.ErrUnexpectedEOF.Error())
+ err = status.Errorf(codes.Internal, io.ErrUnexpectedEOF.Error())
}
return toRPCErr(err)
}
@@ -672,3 +709,13 @@ func (ss *serverStream) RecvMsg(m interface{}) (err error) {
}
return nil
}
+
+// MethodFromServerStream returns the method string for the input stream.
+// The returned string is in the format of "/service/method".
+func MethodFromServerStream(stream ServerStream) (string, bool) {
+ s, ok := transport.StreamFromContext(stream.Context())
+ if !ok {
+ return "", ok
+ }
+ return s.Method(), ok
+}
diff --git a/vendor/google.golang.org/grpc/trace.go b/vendor/google.golang.org/grpc/trace.go
index b419c9e..c1c96de 100644
--- a/vendor/google.golang.org/grpc/trace.go
+++ b/vendor/google.golang.org/grpc/trace.go
@@ -31,7 +31,7 @@ import (
// EnableTracing controls whether to trace RPCs using the golang.org/x/net/trace package.
// This should only be set before any RPCs are sent or received by this program.
-var EnableTracing = true
+var EnableTracing bool
// methodFamily returns the trace family for the given method.
// It turns "/pkg.Service/GetFoo" into "pkg.Service".
@@ -76,6 +76,15 @@ func (f *firstLine) String() string {
return line.String()
}
+const truncateSize = 100
+
+func truncate(x string, l int) string {
+ if l > len(x) {
+ return x
+ }
+ return x[:l]
+}
+
// payload represents an RPC request or response payload.
type payload struct {
sent bool // whether this is an outgoing payload
@@ -85,9 +94,9 @@ type payload struct {
func (p payload) String() string {
if p.sent {
- return fmt.Sprintf("sent: %v", p.msg)
+ return truncate(fmt.Sprintf("sent: %v", p.msg), truncateSize)
}
- return fmt.Sprintf("recv: %v", p.msg)
+ return truncate(fmt.Sprintf("recv: %v", p.msg), truncateSize)
}
type fmtStringer struct {
diff --git a/vendor/google.golang.org/grpc/transport/bdp_estimator.go b/vendor/google.golang.org/grpc/transport/bdp_estimator.go
index 667edb8..63cd262 100644
--- a/vendor/google.golang.org/grpc/transport/bdp_estimator.go
+++ b/vendor/google.golang.org/grpc/transport/bdp_estimator.go
@@ -41,12 +41,9 @@ const (
gamma = 2
)
-var (
- // Adding arbitrary data to ping so that its ack can be
- // identified.
- // Easter-egg: what does the ping message say?
- bdpPing = &ping{data: [8]byte{2, 4, 16, 16, 9, 14, 7, 7}}
-)
+// Adding arbitrary data to ping so that its ack can be identified.
+// Easter-egg: what does the ping message say?
+var bdpPing = &ping{data: [8]byte{2, 4, 16, 16, 9, 14, 7, 7}}
type bdpEstimator struct {
// sentAt is the time when the ping was sent.
@@ -59,7 +56,7 @@ type bdpEstimator struct {
sample uint32
// bwMax is the maximum bandwidth noted so far (bytes/sec).
bwMax float64
- // bool to keep track of the begining of a new measurement cycle.
+ // bool to keep track of the beginning of a new measurement cycle.
isSent bool
// Callback to update the window sizes.
updateFlowControl func(n uint32)
@@ -70,7 +67,7 @@ type bdpEstimator struct {
}
// timesnap registers the time bdp ping was sent out so that
-// network rtt can be calculated when its ack is recieved.
+// network rtt can be calculated when its ack is received.
// It is called (by controller) when the bdpPing is
// being written on the wire.
func (b *bdpEstimator) timesnap(d [8]byte) {
@@ -119,7 +116,7 @@ func (b *bdpEstimator) calculate(d [8]byte) {
b.rtt += (rttSample - b.rtt) * float64(alpha)
}
b.isSent = false
- // The number of bytes accumalated so far in the sample is smaller
+ // The number of bytes accumulated so far in the sample is smaller
// than or equal to 1.5 times the real BDP on a saturated connection.
bwCurrent := float64(b.sample) / (b.rtt * float64(1.5))
if bwCurrent > b.bwMax {
diff --git a/vendor/google.golang.org/grpc/transport/control.go b/vendor/google.golang.org/grpc/transport/control.go
index 501eb03..0474b09 100644
--- a/vendor/google.golang.org/grpc/transport/control.go
+++ b/vendor/google.golang.org/grpc/transport/control.go
@@ -20,11 +20,13 @@ package transport
import (
"fmt"
+ "io"
"math"
"sync"
"time"
"golang.org/x/net/http2"
+ "golang.org/x/net/http2/hpack"
)
const (
@@ -44,26 +46,59 @@ const (
defaultKeepalivePolicyMinTime = time.Duration(5 * time.Minute)
// max window limit set by HTTP2 Specs.
maxWindowSize = math.MaxInt32
+ // defaultLocalSendQuota sets is default value for number of data
+ // bytes that each stream can schedule before some of it being
+ // flushed out.
+ defaultLocalSendQuota = 128 * 1024
)
// The following defines various control items which could flow through
// the control buffer of transport. They represent different aspects of
// control tasks, e.g., flow control, settings, streaming resetting, etc.
+
+type headerFrame struct {
+ streamID uint32
+ hf []hpack.HeaderField
+ endStream bool
+}
+
+func (*headerFrame) item() {}
+
+type continuationFrame struct {
+ streamID uint32
+ endHeaders bool
+ headerBlockFragment []byte
+}
+
+type dataFrame struct {
+ streamID uint32
+ endStream bool
+ d []byte
+ f func()
+}
+
+func (*dataFrame) item() {}
+
+func (*continuationFrame) item() {}
+
type windowUpdate struct {
streamID uint32
increment uint32
- flush bool
}
func (*windowUpdate) item() {}
type settings struct {
- ack bool
- ss []http2.Setting
+ ss []http2.Setting
}
func (*settings) item() {}
+type settingsAck struct {
+}
+
+func (*settingsAck) item() {}
+
type resetStream struct {
streamID uint32
code http2.ErrCode
@@ -81,6 +116,7 @@ type goAway struct {
func (*goAway) item() {}
type flushIO struct {
+ closeTr bool
}
func (*flushIO) item() {}
@@ -95,21 +131,17 @@ func (*ping) item() {}
// quotaPool is a pool which accumulates the quota and sends it to acquire()
// when it is available.
type quotaPool struct {
- c chan int
-
- mu sync.Mutex
- quota int
+ mu sync.Mutex
+ c chan struct{}
+ version uint32
+ quota int
}
// newQuotaPool creates a quotaPool which has quota q available to consume.
func newQuotaPool(q int) *quotaPool {
qb := "aPool{
- c: make(chan int, 1),
- }
- if q > 0 {
- qb.c <- q
- } else {
- qb.quota = q
+ quota: q,
+ c: make(chan struct{}, 1),
}
return qb
}
@@ -119,29 +151,85 @@ func newQuotaPool(q int) *quotaPool {
func (qb *quotaPool) add(v int) {
qb.mu.Lock()
defer qb.mu.Unlock()
- select {
- case n := <-qb.c:
- qb.quota += n
- default:
+ qb.lockedAdd(v)
+}
+
+func (qb *quotaPool) lockedAdd(v int) {
+ var wakeUp bool
+ if qb.quota <= 0 {
+ wakeUp = true // Wake up potential waiters.
}
qb.quota += v
- if qb.quota <= 0 {
- return
- }
- // After the pool has been created, this is the only place that sends on
- // the channel. Since mu is held at this point and any quota that was sent
- // on the channel has been retrieved, we know that this code will always
- // place any positive quota value on the channel.
- select {
- case qb.c <- qb.quota:
- qb.quota = 0
- default:
+ if wakeUp && qb.quota > 0 {
+ select {
+ case qb.c <- struct{}{}:
+ default:
+ }
}
}
-// acquire returns the channel on which available quota amounts are sent.
-func (qb *quotaPool) acquire() <-chan int {
- return qb.c
+func (qb *quotaPool) addAndUpdate(v int) {
+ qb.mu.Lock()
+ qb.lockedAdd(v)
+ qb.version++
+ qb.mu.Unlock()
+}
+
+func (qb *quotaPool) get(v int, wc waiters) (int, uint32, error) {
+ qb.mu.Lock()
+ if qb.quota > 0 {
+ if v > qb.quota {
+ v = qb.quota
+ }
+ qb.quota -= v
+ ver := qb.version
+ qb.mu.Unlock()
+ return v, ver, nil
+ }
+ qb.mu.Unlock()
+ for {
+ select {
+ case <-wc.ctx.Done():
+ return 0, 0, ContextErr(wc.ctx.Err())
+ case <-wc.tctx.Done():
+ return 0, 0, ErrConnClosing
+ case <-wc.done:
+ return 0, 0, io.EOF
+ case <-wc.goAway:
+ return 0, 0, errStreamDrain
+ case <-qb.c:
+ qb.mu.Lock()
+ if qb.quota > 0 {
+ if v > qb.quota {
+ v = qb.quota
+ }
+ qb.quota -= v
+ ver := qb.version
+ if qb.quota > 0 {
+ select {
+ case qb.c <- struct{}{}:
+ default:
+ }
+ }
+ qb.mu.Unlock()
+ return v, ver, nil
+
+ }
+ qb.mu.Unlock()
+ }
+ }
+}
+
+func (qb *quotaPool) compareAndExecute(version uint32, success, failure func()) bool {
+ qb.mu.Lock()
+ if version == qb.version {
+ success()
+ qb.mu.Unlock()
+ return true
+ }
+ failure()
+ qb.mu.Unlock()
+ return false
}
// inFlow deals with inbound flow control
diff --git a/vendor/google.golang.org/grpc/transport/go16.go b/vendor/google.golang.org/grpc/transport/go16.go
index 7cffee1..5babcf9 100644
--- a/vendor/google.golang.org/grpc/transport/go16.go
+++ b/vendor/google.golang.org/grpc/transport/go16.go
@@ -22,6 +22,7 @@ package transport
import (
"net"
+ "net/http"
"google.golang.org/grpc/codes"
@@ -43,3 +44,8 @@ func ContextErr(err error) StreamError {
}
return streamErrorf(codes.Internal, "Unexpected error from context packet: %v", err)
}
+
+// contextFromRequest returns a background context.
+func contextFromRequest(r *http.Request) context.Context {
+ return context.Background()
+}
diff --git a/vendor/google.golang.org/grpc/transport/go17.go b/vendor/google.golang.org/grpc/transport/go17.go
index 2464e69..b7fa6bd 100644
--- a/vendor/google.golang.org/grpc/transport/go17.go
+++ b/vendor/google.golang.org/grpc/transport/go17.go
@@ -23,6 +23,7 @@ package transport
import (
"context"
"net"
+ "net/http"
"google.golang.org/grpc/codes"
@@ -44,3 +45,8 @@ func ContextErr(err error) StreamError {
}
return streamErrorf(codes.Internal, "Unexpected error from context packet: %v", err)
}
+
+// contextFromRequest returns a context from the HTTP Request.
+func contextFromRequest(r *http.Request) context.Context {
+ return r.Context()
+}
diff --git a/vendor/google.golang.org/grpc/transport/handler_server.go b/vendor/google.golang.org/grpc/transport/handler_server.go
index 0489fad..27c4ebb 100644
--- a/vendor/google.golang.org/grpc/transport/handler_server.go
+++ b/vendor/google.golang.org/grpc/transport/handler_server.go
@@ -123,10 +123,9 @@ type serverHandlerTransport struct {
// when WriteStatus is called.
writes chan func()
- mu sync.Mutex
- // streamDone indicates whether WriteStatus has been called and writes channel
- // has been closed.
- streamDone bool
+ // block concurrent WriteStatus calls
+ // e.g. grpc/(*serverStream).SendMsg/RecvMsg
+ writeStatusMu sync.Mutex
}
func (ht *serverHandlerTransport) Close() error {
@@ -173,17 +172,13 @@ func (ht *serverHandlerTransport) do(fn func()) error {
case <-ht.closedCh:
return ErrConnClosing
}
-
}
}
func (ht *serverHandlerTransport) WriteStatus(s *Stream, st *status.Status) error {
- ht.mu.Lock()
- if ht.streamDone {
- ht.mu.Unlock()
- return nil
- }
- ht.mu.Unlock()
+ ht.writeStatusMu.Lock()
+ defer ht.writeStatusMu.Unlock()
+
err := ht.do(func() {
ht.writeCommonHeaders(s)
@@ -222,10 +217,11 @@ func (ht *serverHandlerTransport) WriteStatus(s *Stream, st *status.Status) erro
}
}
})
- close(ht.writes)
- ht.mu.Lock()
- ht.streamDone = true
- ht.mu.Unlock()
+
+ if err == nil { // transport has not been closed
+ ht.Close()
+ close(ht.writes)
+ }
return err
}
@@ -288,12 +284,12 @@ func (ht *serverHandlerTransport) WriteHeader(s *Stream, md metadata.MD) error {
func (ht *serverHandlerTransport) HandleStreams(startStream func(*Stream), traceCtx func(context.Context, string) context.Context) {
// With this transport type there will be exactly 1 stream: this HTTP request.
- var ctx context.Context
+ ctx := contextFromRequest(ht.req)
var cancel context.CancelFunc
if ht.timeoutSet {
- ctx, cancel = context.WithTimeout(context.Background(), ht.timeout)
+ ctx, cancel = context.WithTimeout(ctx, ht.timeout)
} else {
- ctx, cancel = context.WithCancel(context.Background())
+ ctx, cancel = context.WithCancel(ctx)
}
// requestOver is closed when either the request's context is done
diff --git a/vendor/google.golang.org/grpc/transport/handler_server_test.go b/vendor/google.golang.org/grpc/transport/handler_server_test.go
index 262e601..8505e1a 100644
--- a/vendor/google.golang.org/grpc/transport/handler_server_test.go
+++ b/vendor/google.golang.org/grpc/transport/handler_server_test.go
@@ -26,6 +26,7 @@ import (
"net/http/httptest"
"net/url"
"reflect"
+ "sync"
"testing"
"time"
@@ -390,6 +391,49 @@ func TestHandlerTransport_HandleStreams_Timeout(t *testing.T) {
}
}
+// TestHandlerTransport_HandleStreams_MultiWriteStatus ensures that
+// concurrent "WriteStatus"s do not panic writing to closed "writes" channel.
+func TestHandlerTransport_HandleStreams_MultiWriteStatus(t *testing.T) {
+ testHandlerTransportHandleStreams(t, func(st *handleStreamTest, s *Stream) {
+ if want := "/service/foo.bar"; s.method != want {
+ t.Errorf("stream method = %q; want %q", s.method, want)
+ }
+ st.bodyw.Close() // no body
+
+ var wg sync.WaitGroup
+ wg.Add(5)
+ for i := 0; i < 5; i++ {
+ go func() {
+ defer wg.Done()
+ st.ht.WriteStatus(s, status.New(codes.OK, ""))
+ }()
+ }
+ wg.Wait()
+ })
+}
+
+// TestHandlerTransport_HandleStreams_WriteStatusWrite ensures that "Write"
+// following "WriteStatus" does not panic writing to closed "writes" channel.
+func TestHandlerTransport_HandleStreams_WriteStatusWrite(t *testing.T) {
+ testHandlerTransportHandleStreams(t, func(st *handleStreamTest, s *Stream) {
+ if want := "/service/foo.bar"; s.method != want {
+ t.Errorf("stream method = %q; want %q", s.method, want)
+ }
+ st.bodyw.Close() // no body
+
+ st.ht.WriteStatus(s, status.New(codes.OK, ""))
+ st.ht.Write(s, []byte("hdr"), []byte("data"), &Options{})
+ })
+}
+
+func testHandlerTransportHandleStreams(t *testing.T, handleStream func(st *handleStreamTest, s *Stream)) {
+ st := newHandleStreamTest(t)
+ st.ht.HandleStreams(
+ func(s *Stream) { go handleStream(st, s) },
+ func(ctx context.Context, method string) context.Context { return ctx },
+ )
+}
+
func TestHandlerTransport_HandleStreams_ErrDetails(t *testing.T) {
errDetails := []proto.Message{
&epb.RetryInfo{
diff --git a/vendor/google.golang.org/grpc/transport/http2_client.go b/vendor/google.golang.org/grpc/transport/http2_client.go
index 5f22913..4a12269 100644
--- a/vendor/google.golang.org/grpc/transport/http2_client.go
+++ b/vendor/google.golang.org/grpc/transport/http2_client.go
@@ -20,6 +20,7 @@ package transport
import (
"bytes"
+ "fmt"
"io"
"math"
"net"
@@ -43,7 +44,7 @@ import (
// http2Client implements the ClientTransport interface with HTTP2.
type http2Client struct {
ctx context.Context
- target string // server name/addr
+ cancel context.CancelFunc
userAgent string
md interface{}
conn net.Conn // underlying communication channel
@@ -52,17 +53,6 @@ type http2Client struct {
authInfo credentials.AuthInfo // auth info about the connection
nextID uint32 // the next stream ID to be used
- // writableChan synchronizes write access to the transport.
- // A writer acquires the write lock by sending a value on writableChan
- // and releases it by receiving from writableChan.
- writableChan chan int
- // shutdownChan is closed when Close is called.
- // Blocking operations should select on shutdownChan to avoid
- // blocking forever after Close.
- // TODO(zhaoq): Maybe have a channel context?
- shutdownChan chan struct{}
- // errorChan is closed to notify the I/O error to the caller.
- errorChan chan struct{}
// goAway is closed to notify the upper layer (i.e., addrConn.transportMonitor)
// that the server sent GoAway on this transport.
goAway chan struct{}
@@ -79,6 +69,9 @@ type http2Client struct {
fc *inFlow
// sendQuotaPool provides flow control to outbound message.
sendQuotaPool *quotaPool
+ // localSendQuota limits the amount of data that can be scheduled
+ // for writing before it is actually written out.
+ localSendQuota *quotaPool
// streamsQuota limits the max number of concurrent streams.
streamsQuota *quotaPool
@@ -101,6 +94,11 @@ type http2Client struct {
bdpEst *bdpEstimator
outQuotaVersion uint32
+ // onSuccess is a callback that client transport calls upon
+ // receiving server preface to signal that a succefull HTTP2
+ // connection was established.
+ onSuccess func()
+
mu sync.Mutex // guard the following variables
state transportState // the state of underlying connection
activeStreams map[uint32]*Stream
@@ -153,9 +151,16 @@ func isTemporary(err error) bool {
// newHTTP2Client constructs a connected ClientTransport to addr based on HTTP2
// and starts to receive messages on it. Non-nil error returns if construction
// fails.
-func newHTTP2Client(ctx context.Context, addr TargetInfo, opts ConnectOptions) (_ ClientTransport, err error) {
+func newHTTP2Client(connectCtx, ctx context.Context, addr TargetInfo, opts ConnectOptions, onSuccess func()) (_ ClientTransport, err error) {
scheme := "http"
- conn, err := dial(ctx, opts.Dialer, addr.Addr)
+ ctx, cancel := context.WithCancel(ctx)
+ defer func() {
+ if err != nil {
+ cancel()
+ }
+ }()
+
+ conn, err := dial(connectCtx, opts.Dialer, addr.Addr)
if err != nil {
if opts.FailOnNonTempDialError {
return nil, connectionErrorf(isTemporary(err), err, "transport: error while dialing: %v", err)
@@ -174,7 +179,7 @@ func newHTTP2Client(ctx context.Context, addr TargetInfo, opts ConnectOptions) (
)
if creds := opts.TransportCredentials; creds != nil {
scheme = "https"
- conn, authInfo, err = creds.ClientHandshake(ctx, addr.Addr, conn)
+ conn, authInfo, err = creds.ClientHandshake(connectCtx, addr.Authority, conn)
if err != nil {
// Credentials handshake errors are typically considered permanent
// to avoid retrying on e.g. bad certificates.
@@ -198,9 +203,17 @@ func newHTTP2Client(ctx context.Context, addr TargetInfo, opts ConnectOptions) (
dynamicWindow = false
}
var buf bytes.Buffer
+ writeBufSize := defaultWriteBufSize
+ if opts.WriteBufferSize > 0 {
+ writeBufSize = opts.WriteBufferSize
+ }
+ readBufSize := defaultReadBufSize
+ if opts.ReadBufferSize > 0 {
+ readBufSize = opts.ReadBufferSize
+ }
t := &http2Client{
ctx: ctx,
- target: addr.Addr,
+ cancel: cancel,
userAgent: opts.UserAgent,
md: addr.Metadata,
conn: conn,
@@ -209,17 +222,15 @@ func newHTTP2Client(ctx context.Context, addr TargetInfo, opts ConnectOptions) (
authInfo: authInfo,
// The client initiated stream id is odd starting from 1.
nextID: 1,
- writableChan: make(chan int, 1),
- shutdownChan: make(chan struct{}),
- errorChan: make(chan struct{}),
goAway: make(chan struct{}),
awakenKeepalive: make(chan struct{}, 1),
- framer: newFramer(conn),
hBuf: &buf,
hEnc: hpack.NewEncoder(&buf),
+ framer: newFramer(conn, writeBufSize, readBufSize),
controlBuf: newControlBuffer(),
fc: &inFlow{limit: uint32(icwz)},
sendQuotaPool: newQuotaPool(defaultWindowSize),
+ localSendQuota: newQuotaPool(defaultLocalSendQuota),
scheme: scheme,
state: reachable,
activeStreams: make(map[uint32]*Stream),
@@ -231,6 +242,7 @@ func newHTTP2Client(ctx context.Context, addr TargetInfo, opts ConnectOptions) (
kp: kp,
statsHandler: opts.StatsHandler,
initialWindowSize: initialWindowSize,
+ onSuccess: onSuccess,
}
if opts.InitialWindowSize >= defaultWindowSize {
t.initialWindowSize = opts.InitialWindowSize
@@ -270,12 +282,12 @@ func newHTTP2Client(ctx context.Context, addr TargetInfo, opts ConnectOptions) (
return nil, connectionErrorf(true, err, "transport: preface mismatch, wrote %d bytes; want %d", n, len(clientPreface))
}
if t.initialWindowSize != defaultWindowSize {
- err = t.framer.writeSettings(true, http2.Setting{
+ err = t.framer.fr.WriteSettings(http2.Setting{
ID: http2.SettingInitialWindowSize,
Val: uint32(t.initialWindowSize),
})
} else {
- err = t.framer.writeSettings(true)
+ err = t.framer.fr.WriteSettings()
}
if err != nil {
t.Close()
@@ -283,16 +295,19 @@ func newHTTP2Client(ctx context.Context, addr TargetInfo, opts ConnectOptions) (
}
// Adjust the connection flow control window if needed.
if delta := uint32(icwz - defaultWindowSize); delta > 0 {
- if err := t.framer.writeWindowUpdate(true, 0, delta); err != nil {
+ if err := t.framer.fr.WriteWindowUpdate(0, delta); err != nil {
t.Close()
return nil, connectionErrorf(true, err, "transport: failed to write window update: %v", err)
}
}
- go t.controller()
+ t.framer.writer.Flush()
+ go func() {
+ loopyWriter(t.ctx, t.controlBuf, t.itemHandler)
+ t.conn.Close()
+ }()
if t.kp.Time != infinity {
go t.keepalive()
}
- t.writableChan <- 0
return t, nil
}
@@ -327,7 +342,12 @@ func (t *http2Client) newStream(ctx context.Context, callHdr *CallHdr) *Stream {
t.updateWindow(s, uint32(n))
},
}
-
+ s.waiters = waiters{
+ ctx: s.ctx,
+ tctx: t.ctx,
+ done: s.done,
+ goAway: s.goAway,
+ }
return s
}
@@ -368,13 +388,13 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea
authData[k] = v
}
}
- callAuthData := make(map[string]string)
+ callAuthData := map[string]string{}
// Check if credentials.PerRPCCredentials were provided via call options.
// Note: if these credentials are provided both via dial options and call
// options, then both sets of credentials will be applied.
if callCreds := callHdr.Creds; callCreds != nil {
if !t.isSecure && callCreds.RequireTransportSecurity() {
- return nil, streamErrorf(codes.Unauthenticated, "transport: cannot send secure credentials on an insecure conneciton")
+ return nil, streamErrorf(codes.Unauthenticated, "transport: cannot send secure credentials on an insecure connection")
}
data, err := callCreds.GetRequestMetadata(ctx, audience)
if err != nil {
@@ -393,35 +413,78 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea
}
if t.state == draining {
t.mu.Unlock()
- return nil, ErrStreamDrain
+ return nil, errStreamDrain
}
if t.state != reachable {
t.mu.Unlock()
return nil, ErrConnClosing
}
t.mu.Unlock()
- sq, err := wait(ctx, nil, nil, t.shutdownChan, t.streamsQuota.acquire())
- if err != nil {
+ // Get a quota of 1 from streamsQuota.
+ if _, _, err := t.streamsQuota.get(1, waiters{ctx: ctx, tctx: t.ctx}); err != nil {
return nil, err
}
- // Returns the quota balance back.
- if sq > 1 {
- t.streamsQuota.add(sq - 1)
+ // TODO(mmukhi): Benchmark if the performance gets better if count the metadata and other header fields
+ // first and create a slice of that exact size.
+ // Make the slice of certain predictable size to reduce allocations made by append.
+ hfLen := 7 // :method, :scheme, :path, :authority, content-type, user-agent, te
+ hfLen += len(authData) + len(callAuthData)
+ headerFields := make([]hpack.HeaderField, 0, hfLen)
+ headerFields = append(headerFields, hpack.HeaderField{Name: ":method", Value: "POST"})
+ headerFields = append(headerFields, hpack.HeaderField{Name: ":scheme", Value: t.scheme})
+ headerFields = append(headerFields, hpack.HeaderField{Name: ":path", Value: callHdr.Method})
+ headerFields = append(headerFields, hpack.HeaderField{Name: ":authority", Value: callHdr.Host})
+ headerFields = append(headerFields, hpack.HeaderField{Name: "content-type", Value: "application/grpc"})
+ headerFields = append(headerFields, hpack.HeaderField{Name: "user-agent", Value: t.userAgent})
+ headerFields = append(headerFields, hpack.HeaderField{Name: "te", Value: "trailers"})
+
+ if callHdr.SendCompress != "" {
+ headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-encoding", Value: callHdr.SendCompress})
}
- if _, err := wait(ctx, nil, nil, t.shutdownChan, t.writableChan); err != nil {
- // Return the quota back now because there is no stream returned to the caller.
- if _, ok := err.(StreamError); ok {
- t.streamsQuota.add(1)
+ if dl, ok := ctx.Deadline(); ok {
+ // Send out timeout regardless its value. The server can detect timeout context by itself.
+ // TODO(mmukhi): Perhaps this field should be updated when actually writing out to the wire.
+ timeout := dl.Sub(time.Now())
+ headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-timeout", Value: encodeTimeout(timeout)})
+ }
+ for k, v := range authData {
+ headerFields = append(headerFields, hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)})
+ }
+ for k, v := range callAuthData {
+ headerFields = append(headerFields, hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)})
+ }
+ if b := stats.OutgoingTags(ctx); b != nil {
+ headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-tags-bin", Value: encodeBinHeader(b)})
+ }
+ if b := stats.OutgoingTrace(ctx); b != nil {
+ headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-trace-bin", Value: encodeBinHeader(b)})
+ }
+ if md, ok := metadata.FromOutgoingContext(ctx); ok {
+ for k, vv := range md {
+ // HTTP doesn't allow you to set pseudoheaders after non pseudoheaders were set.
+ if isReservedHeader(k) {
+ continue
+ }
+ for _, v := range vv {
+ headerFields = append(headerFields, hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)})
+ }
+ }
+ }
+ if md, ok := t.md.(*metadata.MD); ok {
+ for k, vv := range *md {
+ if isReservedHeader(k) {
+ continue
+ }
+ for _, v := range vv {
+ headerFields = append(headerFields, hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)})
+ }
}
- return nil, err
}
t.mu.Lock()
if t.state == draining {
t.mu.Unlock()
t.streamsQuota.add(1)
- // Need to make t writable again so that the rpc in flight can still proceed.
- t.writableChan <- 0
- return nil, ErrStreamDrain
+ return nil, errStreamDrain
}
if t.state != reachable {
t.mu.Unlock()
@@ -434,7 +497,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea
if len(t.activeStreams) == 1 {
select {
case t.awakenKeepalive <- struct{}{}:
- t.framer.writePing(false, false, [8]byte{})
+ t.controlBuf.put(&ping{data: [8]byte{}})
// Fill the awakenKeepalive channel again as this channel must be
// kept non-writable except at the point that the keepalive()
// goroutine is waiting either to be awaken or shutdown.
@@ -442,110 +505,16 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea
default:
}
}
-
+ t.controlBuf.put(&headerFrame{
+ streamID: s.id,
+ hf: headerFields,
+ endStream: false,
+ })
t.mu.Unlock()
- // HPACK encodes various headers. Note that once WriteField(...) is
- // called, the corresponding headers/continuation frame has to be sent
- // because hpack.Encoder is stateful.
- t.hBuf.Reset()
- t.hEnc.WriteField(hpack.HeaderField{Name: ":method", Value: "POST"})
- t.hEnc.WriteField(hpack.HeaderField{Name: ":scheme", Value: t.scheme})
- t.hEnc.WriteField(hpack.HeaderField{Name: ":path", Value: callHdr.Method})
- t.hEnc.WriteField(hpack.HeaderField{Name: ":authority", Value: callHdr.Host})
- t.hEnc.WriteField(hpack.HeaderField{Name: "content-type", Value: "application/grpc"})
- t.hEnc.WriteField(hpack.HeaderField{Name: "user-agent", Value: t.userAgent})
- t.hEnc.WriteField(hpack.HeaderField{Name: "te", Value: "trailers"})
-
- if callHdr.SendCompress != "" {
- t.hEnc.WriteField(hpack.HeaderField{Name: "grpc-encoding", Value: callHdr.SendCompress})
- }
- if dl, ok := ctx.Deadline(); ok {
- // Send out timeout regardless its value. The server can detect timeout context by itself.
- timeout := dl.Sub(time.Now())
- t.hEnc.WriteField(hpack.HeaderField{Name: "grpc-timeout", Value: encodeTimeout(timeout)})
- }
-
- for k, v := range authData {
- t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)})
- }
- for k, v := range callAuthData {
- t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)})
- }
- var (
- endHeaders bool
- )
- if b := stats.OutgoingTags(ctx); b != nil {
- t.hEnc.WriteField(hpack.HeaderField{Name: "grpc-tags-bin", Value: encodeBinHeader(b)})
- }
- if b := stats.OutgoingTrace(ctx); b != nil {
- t.hEnc.WriteField(hpack.HeaderField{Name: "grpc-trace-bin", Value: encodeBinHeader(b)})
- }
- if md, ok := metadata.FromOutgoingContext(ctx); ok {
- for k, vv := range md {
- // HTTP doesn't allow you to set pseudoheaders after non pseudoheaders were set.
- if isReservedHeader(k) {
- continue
- }
- for _, v := range vv {
- t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)})
- }
- }
- }
- if md, ok := t.md.(*metadata.MD); ok {
- for k, vv := range *md {
- if isReservedHeader(k) {
- continue
- }
- for _, v := range vv {
- t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)})
- }
- }
- }
- first := true
- bufLen := t.hBuf.Len()
- // Sends the headers in a single batch even when they span multiple frames.
- for !endHeaders {
- size := t.hBuf.Len()
- if size > http2MaxFrameLen {
- size = http2MaxFrameLen
- } else {
- endHeaders = true
- }
- var flush bool
- if callHdr.Flush && endHeaders {
- flush = true
- }
- if first {
- // Sends a HeadersFrame to server to start a new stream.
- p := http2.HeadersFrameParam{
- StreamID: s.id,
- BlockFragment: t.hBuf.Next(size),
- EndStream: false,
- EndHeaders: endHeaders,
- }
- // Do a force flush for the buffered frames iff it is the last headers frame
- // and there is header metadata to be sent. Otherwise, there is flushing until
- // the corresponding data frame is written.
- err = t.framer.writeHeaders(flush, p)
- first = false
- } else {
- // Sends Continuation frames for the leftover headers.
- err = t.framer.writeContinuation(flush, s.id, endHeaders, t.hBuf.Next(size))
- }
- if err != nil {
- t.notifyError(err)
- return nil, connectionErrorf(true, err, "transport: %v", err)
- }
- }
- s.mu.Lock()
- s.bytesSent = true
- s.mu.Unlock()
-
if t.statsHandler != nil {
outHeader := &stats.OutHeader{
Client: true,
- WireLength: bufLen,
FullMethod: callHdr.Method,
RemoteAddr: t.remoteAddr,
LocalAddr: t.localAddr,
@@ -553,7 +522,6 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea
}
t.statsHandler.HandleRPC(s.ctx, outHeader)
}
- t.writableChan <- 0
return s, nil
}
@@ -617,19 +585,16 @@ func (t *http2Client) CloseStream(s *Stream, err error) {
// Close kicks off the shutdown process of the transport. This should be called
// only once on a transport. Once it is called, the transport should not be
// accessed any more.
-func (t *http2Client) Close() (err error) {
+func (t *http2Client) Close() error {
t.mu.Lock()
if t.state == closing {
t.mu.Unlock()
- return
- }
- if t.state == reachable || t.state == draining {
- close(t.errorChan)
+ return nil
}
t.state = closing
t.mu.Unlock()
- close(t.shutdownChan)
- err = t.conn.Close()
+ t.cancel()
+ err := t.conn.Close()
t.mu.Lock()
streams := t.activeStreams
t.activeStreams = nil
@@ -650,23 +615,18 @@ func (t *http2Client) Close() (err error) {
}
t.statsHandler.HandleConn(t.ctx, connEnd)
}
- return
+ return err
}
+// GracefulClose sets the state to draining, which prevents new streams from
+// being created and causes the transport to be closed when the last active
+// stream is closed. If there are no active streams, the transport is closed
+// immediately. This does nothing if the transport is already draining or
+// closing.
func (t *http2Client) GracefulClose() error {
t.mu.Lock()
switch t.state {
- case unreachable:
- // The server may close the connection concurrently. t is not available for
- // any streams. Close it now.
- t.mu.Unlock()
- t.Close()
- return nil
- case closing:
- t.mu.Unlock()
- return nil
- }
- if t.state == draining {
+ case closing, draining:
t.mu.Unlock()
return nil
}
@@ -681,129 +641,97 @@ func (t *http2Client) GracefulClose() error {
// Write formats the data into HTTP2 data frame(s) and sends it out. The caller
// should proceed only if Write returns nil.
-// TODO(zhaoq): opts.Delay is ignored in this implementation. Support it later
-// if it improves the performance.
func (t *http2Client) Write(s *Stream, hdr []byte, data []byte, opts *Options) error {
- secondStart := http2MaxFrameLen - len(hdr)%http2MaxFrameLen
- if len(data) < secondStart {
- secondStart = len(data)
+ select {
+ case <-s.ctx.Done():
+ return ContextErr(s.ctx.Err())
+ case <-t.ctx.Done():
+ return ErrConnClosing
+ default:
}
- hdr = append(hdr, data[:secondStart]...)
- data = data[secondStart:]
- isLastSlice := (len(data) == 0)
- r := bytes.NewBuffer(hdr)
+
+ if hdr == nil && data == nil && opts.Last {
+ // stream.CloseSend uses this to send an empty frame with endStream=True
+ t.controlBuf.put(&dataFrame{streamID: s.id, endStream: true, f: func() {}})
+ return nil
+ }
+ // Add data to header frame so that we can equally distribute data across frames.
+ emptyLen := http2MaxFrameLen - len(hdr)
+ if emptyLen > len(data) {
+ emptyLen = len(data)
+ }
+ hdr = append(hdr, data[:emptyLen]...)
+ data = data[emptyLen:]
var (
- p []byte
- oqv uint32
+ streamQuota int
+ streamQuotaVer uint32
+ err error
)
- for {
- oqv = atomic.LoadUint32(&t.outQuotaVersion)
- if r.Len() > 0 || p != nil {
+ for idx, r := range [][]byte{hdr, data} {
+ for len(r) > 0 {
size := http2MaxFrameLen
- // Wait until the stream has some quota to send the data.
- sq, err := wait(s.ctx, s.done, s.goAway, t.shutdownChan, s.sendQuotaPool.acquire())
+ if size > len(r) {
+ size = len(r)
+ }
+ if streamQuota == 0 { // Used up all the locally cached stream quota.
+ // Get all the stream quota there is.
+ streamQuota, streamQuotaVer, err = s.sendQuotaPool.get(math.MaxInt32, s.waiters)
+ if err != nil {
+ return err
+ }
+ }
+ if size > streamQuota {
+ size = streamQuota
+ }
+
+ // Get size worth quota from transport.
+ tq, _, err := t.sendQuotaPool.get(size, s.waiters)
if err != nil {
return err
}
- // Wait until the transport has some quota to send the data.
- tq, err := wait(s.ctx, s.done, s.goAway, t.shutdownChan, t.sendQuotaPool.acquire())
- if err != nil {
- return err
- }
- if sq < size {
- size = sq
- }
if tq < size {
size = tq
}
- if p == nil {
- p = r.Next(size)
+ ltq, _, err := t.localSendQuota.get(size, s.waiters)
+ if err != nil {
+ return err
}
- ps := len(p)
- if ps < sq {
- // Overbooked stream quota. Return it back.
- s.sendQuotaPool.add(sq - ps)
- }
- if ps < tq {
- // Overbooked transport quota. Return it back.
- t.sendQuotaPool.add(tq - ps)
- }
- }
- var (
- endStream bool
- forceFlush bool
- )
- // Indicate there is a writer who is about to write a data frame.
- t.framer.adjustNumWriters(1)
- // Got some quota. Try to acquire writing privilege on the transport.
- if _, err := wait(s.ctx, s.done, s.goAway, t.shutdownChan, t.writableChan); err != nil {
- if _, ok := err.(StreamError); ok || err == io.EOF {
- // Return the connection quota back.
- t.sendQuotaPool.add(len(p))
- }
- if t.framer.adjustNumWriters(-1) == 0 {
- // This writer is the last one in this batch and has the
- // responsibility to flush the buffered frames. It queues
- // a flush request to controlBuf instead of flushing directly
- // in order to avoid the race with other writing or flushing.
- t.controlBuf.put(&flushIO{})
- }
- return err
- }
- select {
- case <-s.ctx.Done():
- t.sendQuotaPool.add(len(p))
- if t.framer.adjustNumWriters(-1) == 0 {
- t.controlBuf.put(&flushIO{})
- }
- t.writableChan <- 0
- return ContextErr(s.ctx.Err())
- default:
- }
- if oqv != atomic.LoadUint32(&t.outQuotaVersion) {
- // InitialWindowSize settings frame must have been received after we
- // acquired send quota but before we got the writable channel.
- // We must forsake this write.
- t.sendQuotaPool.add(len(p))
- s.sendQuotaPool.add(len(p))
- if t.framer.adjustNumWriters(-1) == 0 {
- t.controlBuf.put(&flushIO{})
- }
- t.writableChan <- 0
- continue
- }
- if r.Len() == 0 {
- if isLastSlice {
- if opts.Last {
- endStream = true
- }
- if t.framer.adjustNumWriters(0) == 1 {
- // Do a force flush iff this is last frame for the entire gRPC message
- // and the caller is the only writer at this moment.
- forceFlush = true
- }
- } else {
- isLastSlice = true
- if len(data) != 0 {
- r = bytes.NewBuffer(data)
+ // even if ltq is smaller than size we don't adjust size since
+ // ltq is only a soft limit.
+ streamQuota -= size
+ p := r[:size]
+ var endStream bool
+ // See if this is the last frame to be written.
+ if opts.Last {
+ if len(r)-size == 0 { // No more data in r after this iteration.
+ if idx == 0 { // We're writing data header.
+ if len(data) == 0 { // There's no data to follow.
+ endStream = true
+ }
+ } else { // We're writing data.
+ endStream = true
+ }
}
}
+ success := func() {
+ ltq := ltq
+ t.controlBuf.put(&dataFrame{streamID: s.id, endStream: endStream, d: p, f: func() { t.localSendQuota.add(ltq) }})
+ r = r[size:]
+ }
+ failure := func() { // The stream quota version must have changed.
+ // Our streamQuota cache is invalidated now, so give it back.
+ s.sendQuotaPool.lockedAdd(streamQuota + size)
+ }
+ if !s.sendQuotaPool.compareAndExecute(streamQuotaVer, success, failure) {
+ // Couldn't send this chunk out.
+ t.sendQuotaPool.add(size)
+ t.localSendQuota.add(ltq)
+ streamQuota = 0
+ }
}
- // If WriteData fails, all the pending streams will be handled
- // by http2Client.Close(). No explicit CloseStream() needs to be
- // invoked.
- if err := t.framer.writeData(forceFlush, s.id, endStream, p); err != nil {
- t.notifyError(err)
- return connectionErrorf(true, err, "transport: %v", err)
- }
- p = nil
- if t.framer.adjustNumWriters(-1) == 0 {
- t.framer.flushWrite()
- }
- t.writableChan <- 0
- if r.Len() == 0 {
- break
- }
+ }
+ if streamQuota > 0 { // Add the left over quota back to stream.
+ s.sendQuotaPool.add(streamQuota)
}
if !opts.Last {
return nil
@@ -833,11 +761,11 @@ func (t *http2Client) adjustWindow(s *Stream, n uint32) {
return
}
if w := s.fc.maybeAdjust(n); w > 0 {
- // Piggyback conneciton's window update along.
+ // Piggyback connection's window update along.
if cw := t.fc.resetPendingUpdate(); cw > 0 {
- t.controlBuf.put(&windowUpdate{0, cw, false})
+ t.controlBuf.put(&windowUpdate{0, cw})
}
- t.controlBuf.put(&windowUpdate{s.id, w, true})
+ t.controlBuf.put(&windowUpdate{s.id, w})
}
}
@@ -852,9 +780,9 @@ func (t *http2Client) updateWindow(s *Stream, n uint32) {
}
if w := s.fc.onRead(n); w > 0 {
if cw := t.fc.resetPendingUpdate(); cw > 0 {
- t.controlBuf.put(&windowUpdate{0, cw, false})
+ t.controlBuf.put(&windowUpdate{0, cw})
}
- t.controlBuf.put(&windowUpdate{s.id, w, true})
+ t.controlBuf.put(&windowUpdate{s.id, w})
}
}
@@ -868,9 +796,8 @@ func (t *http2Client) updateFlowControl(n uint32) {
}
t.initialWindowSize = int32(n)
t.mu.Unlock()
- t.controlBuf.put(&windowUpdate{0, t.fc.newLimit(n), false})
+ t.controlBuf.put(&windowUpdate{0, t.fc.newLimit(n)})
t.controlBuf.put(&settings{
- ack: false,
ss: []http2.Setting{
{
ID: http2.SettingInitialWindowSize,
@@ -898,15 +825,17 @@ func (t *http2Client) handleData(f *http2.DataFrame) {
// Furthermore, if a bdpPing is being sent out we can piggyback
// connection's window update for the bytes we just received.
if sendBDPPing {
- t.controlBuf.put(&windowUpdate{0, uint32(size), false})
+ if size != 0 { // Could've been an empty data frame.
+ t.controlBuf.put(&windowUpdate{0, uint32(size)})
+ }
t.controlBuf.put(bdpPing)
} else {
if err := t.fc.onData(uint32(size)); err != nil {
- t.notifyError(connectionErrorf(true, err, "%v", err))
+ t.Close()
return
}
if w := t.fc.onRead(uint32(size)); w > 0 {
- t.controlBuf.put(&windowUpdate{0, w, true})
+ t.controlBuf.put(&windowUpdate{0, w})
}
}
// Select the right stream to dispatch.
@@ -930,7 +859,7 @@ func (t *http2Client) handleData(f *http2.DataFrame) {
}
if f.Header().Flags.Has(http2.FlagDataPadded) {
if w := s.fc.onRead(uint32(size) - uint32(len(f.Data()))); w > 0 {
- t.controlBuf.put(&windowUpdate{s.id, w, true})
+ t.controlBuf.put(&windowUpdate{s.id, w})
}
}
s.mu.Unlock()
@@ -971,7 +900,13 @@ func (t *http2Client) handleRSTStream(f *http2.RSTStreamFrame) {
close(s.headerChan)
s.headerDone = true
}
- statusCode, ok := http2ErrConvTab[http2.ErrCode(f.ErrCode)]
+
+ code := http2.ErrCode(f.ErrCode)
+ if code == http2.ErrCodeRefusedStream {
+ // The stream was unprocessed by the server.
+ s.unprocessed = true
+ }
+ statusCode, ok := http2ErrConvTab[code]
if !ok {
warningf("transport: http2Client.handleRSTStream found no mapped gRPC status for the received http2 error %v", f.ErrCode)
statusCode = codes.Unknown
@@ -981,17 +916,48 @@ func (t *http2Client) handleRSTStream(f *http2.RSTStreamFrame) {
s.write(recvMsg{err: io.EOF})
}
-func (t *http2Client) handleSettings(f *http2.SettingsFrame) {
+func (t *http2Client) handleSettings(f *http2.SettingsFrame, isFirst bool) {
if f.IsAck() {
return
}
- var ss []http2.Setting
+ var rs []http2.Setting
+ var ps []http2.Setting
+ isMaxConcurrentStreamsMissing := true
f.ForeachSetting(func(s http2.Setting) error {
- ss = append(ss, s)
+ if s.ID == http2.SettingMaxConcurrentStreams {
+ isMaxConcurrentStreamsMissing = false
+ }
+ if t.isRestrictive(s) {
+ rs = append(rs, s)
+ } else {
+ ps = append(ps, s)
+ }
return nil
})
- // The settings will be applied once the ack is sent.
- t.controlBuf.put(&settings{ack: true, ss: ss})
+ if isFirst && isMaxConcurrentStreamsMissing {
+ // This means server is imposing no limits on
+ // maximum number of concurrent streams initiated by client.
+ // So we must remove our self-imposed limit.
+ ps = append(ps, http2.Setting{
+ ID: http2.SettingMaxConcurrentStreams,
+ Val: math.MaxUint32,
+ })
+ }
+ t.applySettings(rs)
+ t.controlBuf.put(&settingsAck{})
+ t.applySettings(ps)
+}
+
+func (t *http2Client) isRestrictive(s http2.Setting) bool {
+ switch s.ID {
+ case http2.SettingMaxConcurrentStreams:
+ return int(s.Val) < t.maxStreams
+ case http2.SettingInitialWindowSize:
+ // Note: we don't acquire a lock here to read streamSendQuota
+ // because the same goroutine updates it later.
+ return s.Val < t.streamSendQuota
+ }
+ return false
}
func (t *http2Client) handlePing(f *http2.PingFrame) {
@@ -1019,21 +985,25 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) {
id := f.LastStreamID
if id > 0 && id%2 != 1 {
t.mu.Unlock()
- t.notifyError(connectionErrorf(true, nil, "received illegal http2 GOAWAY frame: stream ID %d is even", f.LastStreamID))
+ t.Close()
return
}
- // A client can recieve multiple GoAways from server (look at https://github.com/grpc/grpc-go/issues/1387).
- // The idea is that the first GoAway will be sent with an ID of MaxInt32 and the second GoAway will be sent after an RTT delay
- // with the ID of the last stream the server will process.
- // Therefore, when we get the first GoAway we don't really close any streams. While in case of second GoAway we
- // close all streams created after the second GoAwayId. This way streams that were in-flight while the GoAway from server
- // was being sent don't get killed.
+ // A client can receive multiple GoAways from the server (see
+ // https://github.com/grpc/grpc-go/issues/1387). The idea is that the first
+ // GoAway will be sent with an ID of MaxInt32 and the second GoAway will be
+ // sent after an RTT delay with the ID of the last stream the server will
+ // process.
+ //
+ // Therefore, when we get the first GoAway we don't necessarily close any
+ // streams. While in case of second GoAway we close all streams created after
+ // the GoAwayId. This way streams that were in-flight while the GoAway from
+ // server was being sent don't get killed.
select {
case <-t.goAway: // t.goAway has been closed (i.e.,multiple GoAways).
// If there are multiple GoAways the first one should always have an ID greater than the following ones.
if id > t.prevGoAwayID {
t.mu.Unlock()
- t.notifyError(connectionErrorf(true, nil, "received illegal http2 GOAWAY frame: previously recv GOAWAY frame with LastStramID %d, currently recv %d", id, f.LastStreamID))
+ t.Close()
return
}
default:
@@ -1049,6 +1019,11 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) {
}
for streamID, stream := range t.activeStreams {
if streamID > id && streamID <= upperLimit {
+ // The stream was unprocessed by the server.
+ stream.mu.Lock()
+ stream.unprocessed = true
+ stream.finish(statusGoAway)
+ stream.mu.Unlock()
close(stream.goAway)
}
}
@@ -1065,11 +1040,11 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) {
// It expects a lock on transport's mutext to be held by
// the caller.
func (t *http2Client) setGoAwayReason(f *http2.GoAwayFrame) {
- t.goAwayReason = NoReason
+ t.goAwayReason = GoAwayNoReason
switch f.ErrCode {
case http2.ErrCodeEnhanceYourCalm:
if string(f.DebugData()) == "too_many_pings" {
- t.goAwayReason = TooManyPings
+ t.goAwayReason = GoAwayTooManyPings
}
}
}
@@ -1150,7 +1125,6 @@ func (t *http2Client) operateHeaders(frame *http2.MetaHeadersFrame) {
s.mu.Unlock()
return
}
-
if len(state.mdata) > 0 {
s.trailer = state.mdata
}
@@ -1177,22 +1151,23 @@ func handleMalformedHTTP2(s *Stream, err error) {
// TODO(zhaoq): Check the validity of the incoming frame sequence.
func (t *http2Client) reader() {
// Check the validity of server preface.
- frame, err := t.framer.readFrame()
+ frame, err := t.framer.fr.ReadFrame()
if err != nil {
- t.notifyError(err)
+ t.Close()
return
}
atomic.CompareAndSwapUint32(&t.activity, 0, 1)
sf, ok := frame.(*http2.SettingsFrame)
if !ok {
- t.notifyError(err)
+ t.Close()
return
}
- t.handleSettings(sf)
+ t.onSuccess()
+ t.handleSettings(sf, true)
// loop to keep reading incoming messages on this transport.
for {
- frame, err := t.framer.readFrame()
+ frame, err := t.framer.fr.ReadFrame()
atomic.CompareAndSwapUint32(&t.activity, 0, 1)
if err != nil {
// Abort an active stream if the http2.Framer returns a
@@ -1204,12 +1179,12 @@ func (t *http2Client) reader() {
t.mu.Unlock()
if s != nil {
// use error detail to provide better err message
- handleMalformedHTTP2(s, streamErrorf(http2ErrConvTab[se.Code], "%v", t.framer.errorDetail()))
+ handleMalformedHTTP2(s, streamErrorf(http2ErrConvTab[se.Code], "%v", t.framer.fr.ErrorDetail()))
}
continue
} else {
// Transport error.
- t.notifyError(err)
+ t.Close()
return
}
}
@@ -1221,7 +1196,7 @@ func (t *http2Client) reader() {
case *http2.RSTStreamFrame:
t.handleRSTStream(frame)
case *http2.SettingsFrame:
- t.handleSettings(frame)
+ t.handleSettings(frame, false)
case *http2.PingFrame:
t.handlePing(frame)
case *http2.GoAwayFrame:
@@ -1244,69 +1219,96 @@ func (t *http2Client) applySettings(ss []http2.Setting) {
if s.Val > math.MaxInt32 {
s.Val = math.MaxInt32
}
- t.mu.Lock()
ms := t.maxStreams
t.maxStreams = int(s.Val)
- t.mu.Unlock()
t.streamsQuota.add(int(s.Val) - ms)
case http2.SettingInitialWindowSize:
t.mu.Lock()
for _, stream := range t.activeStreams {
// Adjust the sending quota for each stream.
- stream.sendQuotaPool.add(int(s.Val) - int(t.streamSendQuota))
+ stream.sendQuotaPool.addAndUpdate(int(s.Val) - int(t.streamSendQuota))
}
t.streamSendQuota = s.Val
t.mu.Unlock()
- atomic.AddUint32(&t.outQuotaVersion, 1)
}
}
}
-// controller running in a separate goroutine takes charge of sending control
-// frames (e.g., window update, reset stream, setting, etc.) to the server.
-func (t *http2Client) controller() {
- for {
- select {
- case i := <-t.controlBuf.get():
- t.controlBuf.load()
- select {
- case <-t.writableChan:
- switch i := i.(type) {
- case *windowUpdate:
- t.framer.writeWindowUpdate(i.flush, i.streamID, i.increment)
- case *settings:
- if i.ack {
- t.framer.writeSettingsAck(true)
- t.applySettings(i.ss)
- } else {
- t.framer.writeSettings(true, i.ss...)
- }
- case *resetStream:
- // If the server needs to be to intimated about stream closing,
- // then we need to make sure the RST_STREAM frame is written to
- // the wire before the headers of the next stream waiting on
- // streamQuota. We ensure this by adding to the streamsQuota pool
- // only after having acquired the writableChan to send RST_STREAM.
- t.streamsQuota.add(1)
- t.framer.writeRSTStream(true, i.streamID, i.code)
- case *flushIO:
- t.framer.flushWrite()
- case *ping:
- if !i.ack {
- t.bdpEst.timesnap(i.data)
- }
- t.framer.writePing(true, i.ack, i.data)
- default:
- errorf("transport: http2Client.controller got unexpected item type %v\n", i)
- }
- t.writableChan <- 0
- continue
- case <-t.shutdownChan:
- return
- }
- case <-t.shutdownChan:
- return
+// TODO(mmukhi): A lot of this code(and code in other places in the tranpsort layer)
+// is duplicated between the client and the server.
+// The transport layer needs to be refactored to take care of this.
+func (t *http2Client) itemHandler(i item) (err error) {
+ defer func() {
+ if err != nil {
+ errorf(" error in itemHandler: %v", err)
}
+ }()
+ switch i := i.(type) {
+ case *dataFrame:
+ if err := t.framer.fr.WriteData(i.streamID, i.endStream, i.d); err != nil {
+ return err
+ }
+ i.f()
+ return nil
+ case *headerFrame:
+ t.hBuf.Reset()
+ for _, f := range i.hf {
+ t.hEnc.WriteField(f)
+ }
+ endHeaders := false
+ first := true
+ for !endHeaders {
+ size := t.hBuf.Len()
+ if size > http2MaxFrameLen {
+ size = http2MaxFrameLen
+ } else {
+ endHeaders = true
+ }
+ if first {
+ first = false
+ err = t.framer.fr.WriteHeaders(http2.HeadersFrameParam{
+ StreamID: i.streamID,
+ BlockFragment: t.hBuf.Next(size),
+ EndStream: i.endStream,
+ EndHeaders: endHeaders,
+ })
+ } else {
+ err = t.framer.fr.WriteContinuation(
+ i.streamID,
+ endHeaders,
+ t.hBuf.Next(size),
+ )
+ }
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+ case *windowUpdate:
+ return t.framer.fr.WriteWindowUpdate(i.streamID, i.increment)
+ case *settings:
+ return t.framer.fr.WriteSettings(i.ss...)
+ case *settingsAck:
+ return t.framer.fr.WriteSettingsAck()
+ case *resetStream:
+ // If the server needs to be to intimated about stream closing,
+ // then we need to make sure the RST_STREAM frame is written to
+ // the wire before the headers of the next stream waiting on
+ // streamQuota. We ensure this by adding to the streamsQuota pool
+ // only after having acquired the writableChan to send RST_STREAM.
+ err := t.framer.fr.WriteRSTStream(i.streamID, i.code)
+ t.streamsQuota.add(1)
+ return err
+ case *flushIO:
+ return t.framer.writer.Flush()
+ case *ping:
+ if !i.ack {
+ t.bdpEst.timesnap(i.data)
+ }
+ return t.framer.fr.WritePing(i.ack, i.data)
+ default:
+ errorf("transport: http2Client.controller got unexpected item type %v", i)
+ return fmt.Errorf("transport: http2Client.controller got unexpected item type %v", i)
}
}
@@ -1331,7 +1333,7 @@ func (t *http2Client) keepalive() {
case <-t.awakenKeepalive:
// If the control gets here a ping has been sent
// need to reset the timer with keepalive.Timeout.
- case <-t.shutdownChan:
+ case <-t.ctx.Done():
return
}
} else {
@@ -1350,13 +1352,13 @@ func (t *http2Client) keepalive() {
}
t.Close()
return
- case <-t.shutdownChan:
+ case <-t.ctx.Done():
if !timer.Stop() {
<-timer.C
}
return
}
- case <-t.shutdownChan:
+ case <-t.ctx.Done():
if !timer.Stop() {
<-timer.C
}
@@ -1366,25 +1368,9 @@ func (t *http2Client) keepalive() {
}
func (t *http2Client) Error() <-chan struct{} {
- return t.errorChan
+ return t.ctx.Done()
}
func (t *http2Client) GoAway() <-chan struct{} {
return t.goAway
}
-
-func (t *http2Client) notifyError(err error) {
- t.mu.Lock()
- // make sure t.errorChan is closed only once.
- if t.state == draining {
- t.mu.Unlock()
- t.Close()
- return
- }
- if t.state == reachable {
- t.state = unreachable
- close(t.errorChan)
- infof("transport: http2Client.notifyError got notified that the client transport was broken %v.", err)
- }
- t.mu.Unlock()
-}
diff --git a/vendor/google.golang.org/grpc/transport/http2_server.go b/vendor/google.golang.org/grpc/transport/http2_server.go
index 0fd81af..6d252c5 100644
--- a/vendor/google.golang.org/grpc/transport/http2_server.go
+++ b/vendor/google.golang.org/grpc/transport/http2_server.go
@@ -21,6 +21,7 @@ package transport
import (
"bytes"
"errors"
+ "fmt"
"io"
"math"
"math/rand"
@@ -51,23 +52,16 @@ var ErrIllegalHeaderWrite = errors.New("transport: the stream is done or WriteHe
// http2Server implements the ServerTransport interface with HTTP2.
type http2Server struct {
ctx context.Context
+ cancel context.CancelFunc
conn net.Conn
remoteAddr net.Addr
localAddr net.Addr
maxStreamID uint32 // max stream ID ever seen
authInfo credentials.AuthInfo // auth info about the connection
inTapHandle tap.ServerInHandle
- // writableChan synchronizes write access to the transport.
- // A writer acquires the write lock by receiving a value on writableChan
- // and releases it by sending on writableChan.
- writableChan chan int
- // shutdownChan is closed when Close is called.
- // Blocking operations should select on shutdownChan to avoid
- // blocking forever after Close.
- shutdownChan chan struct{}
- framer *framer
- hBuf *bytes.Buffer // the buffer for HPACK encoding
- hEnc *hpack.Encoder // HPACK encoder
+ framer *framer
+ hBuf *bytes.Buffer // the buffer for HPACK encoding
+ hEnc *hpack.Encoder // HPACK encoder
// The max number of concurrent streams.
maxStreams uint32
// controlBuf delivers all the control related tasks (e.g., window
@@ -76,7 +70,10 @@ type http2Server struct {
fc *inFlow
// sendQuotaPool provides flow control to outbound message.
sendQuotaPool *quotaPool
- stats stats.Handler
+ // localSendQuota limits the amount of data that can be scheduled
+ // for writing before it is actually written out.
+ localSendQuota *quotaPool
+ stats stats.Handler
// Flag to keep track of reading activity on transport.
// 1 is true and 0 is false.
activity uint32 // Accessed atomically.
@@ -96,8 +93,6 @@ type http2Server struct {
initialWindowSize int32
bdpEst *bdpEstimator
- outQuotaVersion uint32
-
mu sync.Mutex // guard the following
// drainChan is initialized when drain(...) is called the first time.
@@ -112,7 +107,7 @@ type http2Server struct {
// the per-stream outbound flow control window size set by the peer.
streamSendQuota uint32
// idle is the time instant when the connection went idle.
- // This is either the begining of the connection or when the number of
+ // This is either the beginning of the connection or when the number of
// RPCs go down to 0.
// When the connection is busy, this value is set to 0.
idle time.Time
@@ -121,7 +116,15 @@ type http2Server struct {
// newHTTP2Server constructs a ServerTransport based on HTTP2. ConnectionError is
// returned if something goes wrong.
func newHTTP2Server(conn net.Conn, config *ServerConfig) (_ ServerTransport, err error) {
- framer := newFramer(conn)
+ writeBufSize := defaultWriteBufSize
+ if config.WriteBufferSize > 0 {
+ writeBufSize = config.WriteBufferSize
+ }
+ readBufSize := defaultReadBufSize
+ if config.ReadBufferSize > 0 {
+ readBufSize = config.ReadBufferSize
+ }
+ framer := newFramer(conn, writeBufSize, readBufSize)
// Send initial settings as connection preface to client.
var isettings []http2.Setting
// TODO(zhaoq): Have a better way to signal "no limit" because 0 is
@@ -151,13 +154,13 @@ func newHTTP2Server(conn net.Conn, config *ServerConfig) (_ ServerTransport, err
ID: http2.SettingInitialWindowSize,
Val: uint32(iwz)})
}
- if err := framer.writeSettings(true, isettings...); err != nil {
- return nil, connectionErrorf(true, err, "transport: %v", err)
+ if err := framer.fr.WriteSettings(isettings...); err != nil {
+ return nil, connectionErrorf(false, err, "transport: %v", err)
}
// Adjust the connection flow control window if needed.
if delta := uint32(icwz - defaultWindowSize); delta > 0 {
- if err := framer.writeWindowUpdate(true, 0, delta); err != nil {
- return nil, connectionErrorf(true, err, "transport: %v", err)
+ if err := framer.fr.WriteWindowUpdate(0, delta); err != nil {
+ return nil, connectionErrorf(false, err, "transport: %v", err)
}
}
kp := config.KeepaliveParams
@@ -183,8 +186,10 @@ func newHTTP2Server(conn net.Conn, config *ServerConfig) (_ ServerTransport, err
kep.MinTime = defaultKeepalivePolicyMinTime
}
var buf bytes.Buffer
+ ctx, cancel := context.WithCancel(context.Background())
t := &http2Server{
- ctx: context.Background(),
+ ctx: ctx,
+ cancel: cancel,
conn: conn,
remoteAddr: conn.RemoteAddr(),
localAddr: conn.LocalAddr(),
@@ -197,9 +202,8 @@ func newHTTP2Server(conn net.Conn, config *ServerConfig) (_ ServerTransport, err
controlBuf: newControlBuffer(),
fc: &inFlow{limit: uint32(icwz)},
sendQuotaPool: newQuotaPool(defaultWindowSize),
+ localSendQuota: newQuotaPool(defaultLocalSendQuota),
state: reachable,
- writableChan: make(chan int, 1),
- shutdownChan: make(chan struct{}),
activeStreams: make(map[uint32]*Stream),
streamSendQuota: defaultWindowSize,
stats: config.StatsHandler,
@@ -222,9 +226,42 @@ func newHTTP2Server(conn net.Conn, config *ServerConfig) (_ ServerTransport, err
connBegin := &stats.ConnBegin{}
t.stats.HandleConn(t.ctx, connBegin)
}
- go t.controller()
+ t.framer.writer.Flush()
+
+ defer func() {
+ if err != nil {
+ t.Close()
+ }
+ }()
+
+ // Check the validity of client preface.
+ preface := make([]byte, len(clientPreface))
+ if _, err := io.ReadFull(t.conn, preface); err != nil {
+ return nil, connectionErrorf(false, err, "transport: http2Server.HandleStreams failed to receive the preface from client: %v", err)
+ }
+ if !bytes.Equal(preface, clientPreface) {
+ return nil, connectionErrorf(false, nil, "transport: http2Server.HandleStreams received bogus greeting from client: %q", preface)
+ }
+
+ frame, err := t.framer.fr.ReadFrame()
+ if err == io.EOF || err == io.ErrUnexpectedEOF {
+ return nil, err
+ }
+ if err != nil {
+ return nil, connectionErrorf(false, err, "transport: http2Server.HandleStreams failed to read initial settings frame: %v", err)
+ }
+ atomic.StoreUint32(&t.activity, 1)
+ sf, ok := frame.(*http2.SettingsFrame)
+ if !ok {
+ return nil, connectionErrorf(false, nil, "transport: http2Server.HandleStreams saw invalid preface type %T from client", frame)
+ }
+ t.handleSettings(sf)
+
+ go func() {
+ loopyWriter(t.ctx, t.controlBuf, t.itemHandler)
+ t.conn.Close()
+ }()
go t.keepalive()
- t.writableChan <- 0
return t, nil
}
@@ -342,6 +379,10 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(
t.updateWindow(s, uint32(n))
},
}
+ s.waiters = waiters{
+ ctx: s.ctx,
+ tctx: t.ctx,
+ }
handle(s)
return
}
@@ -350,43 +391,8 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(
// typically run in a separate goroutine.
// traceCtx attaches trace to ctx and returns the new context.
func (t *http2Server) HandleStreams(handle func(*Stream), traceCtx func(context.Context, string) context.Context) {
- // Check the validity of client preface.
- preface := make([]byte, len(clientPreface))
- if _, err := io.ReadFull(t.conn, preface); err != nil {
- // Only log if it isn't a simple tcp accept check (ie: tcp balancer doing open/close socket)
- if err != io.EOF {
- errorf("transport: http2Server.HandleStreams failed to receive the preface from client: %v", err)
- }
- t.Close()
- return
- }
- if !bytes.Equal(preface, clientPreface) {
- errorf("transport: http2Server.HandleStreams received bogus greeting from client: %q", preface)
- t.Close()
- return
- }
-
- frame, err := t.framer.readFrame()
- if err == io.EOF || err == io.ErrUnexpectedEOF {
- t.Close()
- return
- }
- if err != nil {
- errorf("transport: http2Server.HandleStreams failed to read initial settings frame: %v", err)
- t.Close()
- return
- }
- atomic.StoreUint32(&t.activity, 1)
- sf, ok := frame.(*http2.SettingsFrame)
- if !ok {
- errorf("transport: http2Server.HandleStreams saw invalid preface type %T from client", frame)
- t.Close()
- return
- }
- t.handleSettings(sf)
-
for {
- frame, err := t.framer.readFrame()
+ frame, err := t.framer.fr.ReadFrame()
atomic.StoreUint32(&t.activity, 1)
if err != nil {
if se, ok := err.(http2.StreamError); ok {
@@ -457,9 +463,9 @@ func (t *http2Server) adjustWindow(s *Stream, n uint32) {
}
if w := s.fc.maybeAdjust(n); w > 0 {
if cw := t.fc.resetPendingUpdate(); cw > 0 {
- t.controlBuf.put(&windowUpdate{0, cw, false})
+ t.controlBuf.put(&windowUpdate{0, cw})
}
- t.controlBuf.put(&windowUpdate{s.id, w, true})
+ t.controlBuf.put(&windowUpdate{s.id, w})
}
}
@@ -474,9 +480,9 @@ func (t *http2Server) updateWindow(s *Stream, n uint32) {
}
if w := s.fc.onRead(n); w > 0 {
if cw := t.fc.resetPendingUpdate(); cw > 0 {
- t.controlBuf.put(&windowUpdate{0, cw, false})
+ t.controlBuf.put(&windowUpdate{0, cw})
}
- t.controlBuf.put(&windowUpdate{s.id, w, true})
+ t.controlBuf.put(&windowUpdate{s.id, w})
}
}
@@ -490,9 +496,8 @@ func (t *http2Server) updateFlowControl(n uint32) {
}
t.initialWindowSize = int32(n)
t.mu.Unlock()
- t.controlBuf.put(&windowUpdate{0, t.fc.newLimit(n), false})
+ t.controlBuf.put(&windowUpdate{0, t.fc.newLimit(n)})
t.controlBuf.put(&settings{
- ack: false,
ss: []http2.Setting{
{
ID: http2.SettingInitialWindowSize,
@@ -521,7 +526,9 @@ func (t *http2Server) handleData(f *http2.DataFrame) {
// Furthermore, if a bdpPing is being sent out we can piggyback
// connection's window update for the bytes we just received.
if sendBDPPing {
- t.controlBuf.put(&windowUpdate{0, uint32(size), false})
+ if size != 0 { // Could be an empty frame.
+ t.controlBuf.put(&windowUpdate{0, uint32(size)})
+ }
t.controlBuf.put(bdpPing)
} else {
if err := t.fc.onData(uint32(size)); err != nil {
@@ -530,7 +537,7 @@ func (t *http2Server) handleData(f *http2.DataFrame) {
return
}
if w := t.fc.onRead(uint32(size)); w > 0 {
- t.controlBuf.put(&windowUpdate{0, w, true})
+ t.controlBuf.put(&windowUpdate{0, w})
}
}
// Select the right stream to dispatch.
@@ -552,7 +559,7 @@ func (t *http2Server) handleData(f *http2.DataFrame) {
}
if f.Header().Flags.Has(http2.FlagDataPadded) {
if w := s.fc.onRead(uint32(size) - uint32(len(f.Data()))); w > 0 {
- t.controlBuf.put(&windowUpdate{s.id, w, true})
+ t.controlBuf.put(&windowUpdate{s.id, w})
}
}
s.mu.Unlock()
@@ -588,13 +595,43 @@ func (t *http2Server) handleSettings(f *http2.SettingsFrame) {
if f.IsAck() {
return
}
- var ss []http2.Setting
+ var rs []http2.Setting
+ var ps []http2.Setting
f.ForeachSetting(func(s http2.Setting) error {
- ss = append(ss, s)
+ if t.isRestrictive(s) {
+ rs = append(rs, s)
+ } else {
+ ps = append(ps, s)
+ }
return nil
})
- // The settings will be applied once the ack is sent.
- t.controlBuf.put(&settings{ack: true, ss: ss})
+ t.applySettings(rs)
+ t.controlBuf.put(&settingsAck{})
+ t.applySettings(ps)
+}
+
+func (t *http2Server) isRestrictive(s http2.Setting) bool {
+ switch s.ID {
+ case http2.SettingInitialWindowSize:
+ // Note: we don't acquire a lock here to read streamSendQuota
+ // because the same goroutine updates it later.
+ return s.Val < t.streamSendQuota
+ }
+ return false
+}
+
+func (t *http2Server) applySettings(ss []http2.Setting) {
+ for _, s := range ss {
+ if s.ID == http2.SettingInitialWindowSize {
+ t.mu.Lock()
+ for _, stream := range t.activeStreams {
+ stream.sendQuotaPool.addAndUpdate(int(s.Val) - int(t.streamSendQuota))
+ }
+ t.streamSendQuota = s.Val
+ t.mu.Unlock()
+ }
+
+ }
}
const (
@@ -634,7 +671,7 @@ func (t *http2Server) handlePing(f *http2.PingFrame) {
t.mu.Unlock()
if ns < 1 && !t.kep.PermitWithoutStream {
// Keepalive shouldn't be active thus, this new ping should
- // have come after atleast defaultPingTimeout.
+ // have come after at least defaultPingTimeout.
if t.lastPingAt.Add(defaultPingTimeout).After(now) {
t.pingStrikes++
}
@@ -647,6 +684,7 @@ func (t *http2Server) handlePing(f *http2.PingFrame) {
if t.pingStrikes > maxPingStrikes {
// Send goaway and close the connection.
+ errorf("transport: Got too many pings from the client, closing the connection.")
t.controlBuf.put(&goAway{code: http2.ErrCodeEnhanceYourCalm, debugData: []byte("too_many_pings"), closeConn: true})
}
}
@@ -663,47 +701,16 @@ func (t *http2Server) handleWindowUpdate(f *http2.WindowUpdateFrame) {
}
}
-func (t *http2Server) writeHeaders(s *Stream, b *bytes.Buffer, endStream bool) error {
- first := true
- endHeaders := false
- var err error
- defer func() {
- if err == nil {
- // Reset ping strikes when seding headers since that might cause the
- // peer to send ping.
- atomic.StoreUint32(&t.resetPingStrikes, 1)
- }
- }()
- // Sends the headers in a single batch.
- for !endHeaders {
- size := t.hBuf.Len()
- if size > http2MaxFrameLen {
- size = http2MaxFrameLen
- } else {
- endHeaders = true
- }
- if first {
- p := http2.HeadersFrameParam{
- StreamID: s.id,
- BlockFragment: b.Next(size),
- EndStream: endStream,
- EndHeaders: endHeaders,
- }
- err = t.framer.writeHeaders(endHeaders, p)
- first = false
- } else {
- err = t.framer.writeContinuation(endHeaders, s.id, endHeaders, b.Next(size))
- }
- if err != nil {
- t.Close()
- return connectionErrorf(true, err, "transport: %v", err)
- }
- }
- return nil
-}
-
// WriteHeader sends the header metedata md back to the client.
func (t *http2Server) WriteHeader(s *Stream, md metadata.MD) error {
+ select {
+ case <-s.ctx.Done():
+ return ContextErr(s.ctx.Err())
+ case <-t.ctx.Done():
+ return ErrConnClosing
+ default:
+ }
+
s.mu.Lock()
if s.headerOk || s.state == streamDone {
s.mu.Unlock()
@@ -719,14 +726,13 @@ func (t *http2Server) WriteHeader(s *Stream, md metadata.MD) error {
}
md = s.header
s.mu.Unlock()
- if _, err := wait(s.ctx, nil, nil, t.shutdownChan, t.writableChan); err != nil {
- return err
- }
- t.hBuf.Reset()
- t.hEnc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"})
- t.hEnc.WriteField(hpack.HeaderField{Name: "content-type", Value: "application/grpc"})
+ // TODO(mmukhi): Benchmark if the performance gets better if count the metadata and other header fields
+ // first and create a slice of that exact size.
+ headerFields := make([]hpack.HeaderField, 0, 2) // at least :status, content-type will be there if none else.
+ headerFields = append(headerFields, hpack.HeaderField{Name: ":status", Value: "200"})
+ headerFields = append(headerFields, hpack.HeaderField{Name: "content-type", Value: "application/grpc"})
if s.sendCompress != "" {
- t.hEnc.WriteField(hpack.HeaderField{Name: "grpc-encoding", Value: s.sendCompress})
+ headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-encoding", Value: s.sendCompress})
}
for k, vv := range md {
if isReservedHeader(k) {
@@ -734,20 +740,20 @@ func (t *http2Server) WriteHeader(s *Stream, md metadata.MD) error {
continue
}
for _, v := range vv {
- t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)})
+ headerFields = append(headerFields, hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)})
}
}
- bufLen := t.hBuf.Len()
- if err := t.writeHeaders(s, t.hBuf, false); err != nil {
- return err
- }
+ t.controlBuf.put(&headerFrame{
+ streamID: s.id,
+ hf: headerFields,
+ endStream: false,
+ })
if t.stats != nil {
outHeader := &stats.OutHeader{
- WireLength: bufLen,
+ //WireLength: // TODO(mmukhi): Revisit this later, if needed.
}
t.stats.HandleRPC(s.Context(), outHeader)
}
- t.writableChan <- 0
return nil
}
@@ -756,6 +762,12 @@ func (t *http2Server) WriteHeader(s *Stream, md metadata.MD) error {
// TODO(zhaoq): Now it indicates the end of entire stream. Revisit if early
// OK is adopted.
func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error {
+ select {
+ case <-t.ctx.Done():
+ return ErrConnClosing
+ default:
+ }
+
var headersSent, hasHeader bool
s.mu.Lock()
if s.state == streamDone {
@@ -775,25 +787,15 @@ func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error {
headersSent = true
}
- // Always write a status regardless of context cancellation unless the stream
- // is terminated (e.g. by a RST_STREAM, GOAWAY, or transport error). The
- // server's application code is already done so it is fine to ignore s.ctx.
- select {
- case <-t.shutdownChan:
- return ErrConnClosing
- case <-t.writableChan:
- }
- t.hBuf.Reset()
+ // TODO(mmukhi): Benchmark if the performance gets better if count the metadata and other header fields
+ // first and create a slice of that exact size.
+ headerFields := make([]hpack.HeaderField, 0, 2) // grpc-status and grpc-message will be there if none else.
if !headersSent {
- t.hEnc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"})
- t.hEnc.WriteField(hpack.HeaderField{Name: "content-type", Value: "application/grpc"})
+ headerFields = append(headerFields, hpack.HeaderField{Name: ":status", Value: "200"})
+ headerFields = append(headerFields, hpack.HeaderField{Name: "content-type", Value: "application/grpc"})
}
- t.hEnc.WriteField(
- hpack.HeaderField{
- Name: "grpc-status",
- Value: strconv.Itoa(int(st.Code())),
- })
- t.hEnc.WriteField(hpack.HeaderField{Name: "grpc-message", Value: encodeGrpcMessage(st.Message())})
+ headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-status", Value: strconv.Itoa(int(st.Code()))})
+ headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-message", Value: encodeGrpcMessage(st.Message())})
if p := st.Proto(); p != nil && len(p.Details) > 0 {
stBytes, err := proto.Marshal(p)
@@ -802,7 +804,7 @@ func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error {
panic(err)
}
- t.hEnc.WriteField(hpack.HeaderField{Name: "grpc-status-details-bin", Value: encodeBinHeader(stBytes)})
+ headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-status-details-bin", Value: encodeBinHeader(stBytes)})
}
// Attach the trailer metadata.
@@ -812,36 +814,32 @@ func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error {
continue
}
for _, v := range vv {
- t.hEnc.WriteField(hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)})
+ headerFields = append(headerFields, hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)})
}
}
- bufLen := t.hBuf.Len()
- if err := t.writeHeaders(s, t.hBuf, true); err != nil {
- t.Close()
- return err
- }
+ t.controlBuf.put(&headerFrame{
+ streamID: s.id,
+ hf: headerFields,
+ endStream: true,
+ })
if t.stats != nil {
- outTrailer := &stats.OutTrailer{
- WireLength: bufLen,
- }
- t.stats.HandleRPC(s.Context(), outTrailer)
+ t.stats.HandleRPC(s.Context(), &stats.OutTrailer{})
}
t.closeStream(s)
- t.writableChan <- 0
return nil
}
// Write converts the data into HTTP2 data frame and sends it out. Non-nil error
// is returns if it fails (e.g., framing error, transport error).
-func (t *http2Server) Write(s *Stream, hdr []byte, data []byte, opts *Options) (err error) {
- // TODO(zhaoq): Support multi-writers for a single stream.
- secondStart := http2MaxFrameLen - len(hdr)%http2MaxFrameLen
- if len(data) < secondStart {
- secondStart = len(data)
+func (t *http2Server) Write(s *Stream, hdr []byte, data []byte, opts *Options) error {
+ select {
+ case <-s.ctx.Done():
+ return ContextErr(s.ctx.Err())
+ case <-t.ctx.Done():
+ return ErrConnClosing
+ default:
}
- hdr = append(hdr, data[:secondStart]...)
- data = data[secondStart:]
- isLastSlice := (len(data) == 0)
+
var writeHeaderFrame bool
s.mu.Lock()
if s.state == streamDone {
@@ -855,124 +853,77 @@ func (t *http2Server) Write(s *Stream, hdr []byte, data []byte, opts *Options) (
if writeHeaderFrame {
t.WriteHeader(s, nil)
}
- r := bytes.NewBuffer(hdr)
+ // Add data to header frame so that we can equally distribute data across frames.
+ emptyLen := http2MaxFrameLen - len(hdr)
+ if emptyLen > len(data) {
+ emptyLen = len(data)
+ }
+ hdr = append(hdr, data[:emptyLen]...)
+ data = data[emptyLen:]
var (
- p []byte
- oqv uint32
+ streamQuota int
+ streamQuotaVer uint32
+ err error
)
- for {
- if r.Len() == 0 && p == nil {
- return nil
- }
- oqv = atomic.LoadUint32(&t.outQuotaVersion)
- size := http2MaxFrameLen
- // Wait until the stream has some quota to send the data.
- sq, err := wait(s.ctx, nil, nil, t.shutdownChan, s.sendQuotaPool.acquire())
- if err != nil {
- return err
- }
- // Wait until the transport has some quota to send the data.
- tq, err := wait(s.ctx, nil, nil, t.shutdownChan, t.sendQuotaPool.acquire())
- if err != nil {
- return err
- }
- if sq < size {
- size = sq
- }
- if tq < size {
- size = tq
- }
- if p == nil {
- p = r.Next(size)
- }
- ps := len(p)
- if ps < sq {
- // Overbooked stream quota. Return it back.
- s.sendQuotaPool.add(sq - ps)
- }
- if ps < tq {
- // Overbooked transport quota. Return it back.
- t.sendQuotaPool.add(tq - ps)
- }
- t.framer.adjustNumWriters(1)
- // Got some quota. Try to acquire writing privilege on the
- // transport.
- if _, err := wait(s.ctx, nil, nil, t.shutdownChan, t.writableChan); err != nil {
- if _, ok := err.(StreamError); ok {
- // Return the connection quota back.
- t.sendQuotaPool.add(ps)
+ for _, r := range [][]byte{hdr, data} {
+ for len(r) > 0 {
+ size := http2MaxFrameLen
+ if size > len(r) {
+ size = len(r)
}
- if t.framer.adjustNumWriters(-1) == 0 {
- // This writer is the last one in this batch and has the
- // responsibility to flush the buffered frames. It queues
- // a flush request to controlBuf instead of flushing directly
- // in order to avoid the race with other writing or flushing.
- t.controlBuf.put(&flushIO{})
- }
- return err
- }
- select {
- case <-s.ctx.Done():
- t.sendQuotaPool.add(ps)
- if t.framer.adjustNumWriters(-1) == 0 {
- t.controlBuf.put(&flushIO{})
- }
- t.writableChan <- 0
- return ContextErr(s.ctx.Err())
- default:
- }
- if oqv != atomic.LoadUint32(&t.outQuotaVersion) {
- // InitialWindowSize settings frame must have been received after we
- // acquired send quota but before we got the writable channel.
- // We must forsake this write.
- t.sendQuotaPool.add(ps)
- s.sendQuotaPool.add(ps)
- if t.framer.adjustNumWriters(-1) == 0 {
- t.controlBuf.put(&flushIO{})
- }
- t.writableChan <- 0
- continue
- }
- var forceFlush bool
- if r.Len() == 0 {
- if isLastSlice {
- if t.framer.adjustNumWriters(0) == 1 && !opts.Last {
- forceFlush = true
+ if streamQuota == 0 { // Used up all the locally cached stream quota.
+ // Get all the stream quota there is.
+ streamQuota, streamQuotaVer, err = s.sendQuotaPool.get(math.MaxInt32, s.waiters)
+ if err != nil {
+ return err
}
- } else {
- r = bytes.NewBuffer(data)
- isLastSlice = true
+ }
+ if size > streamQuota {
+ size = streamQuota
+ }
+ // Get size worth quota from transport.
+ tq, _, err := t.sendQuotaPool.get(size, s.waiters)
+ if err != nil {
+ return err
+ }
+ if tq < size {
+ size = tq
+ }
+ ltq, _, err := t.localSendQuota.get(size, s.waiters)
+ if err != nil {
+ return err
+ }
+ // even if ltq is smaller than size we don't adjust size since,
+ // ltq is only a soft limit.
+ streamQuota -= size
+ p := r[:size]
+ // Reset ping strikes when sending data since this might cause
+ // the peer to send ping.
+ atomic.StoreUint32(&t.resetPingStrikes, 1)
+ success := func() {
+ ltq := ltq
+ t.controlBuf.put(&dataFrame{streamID: s.id, endStream: false, d: p, f: func() {
+ t.localSendQuota.add(ltq)
+ }})
+ r = r[size:]
+ }
+ failure := func() { // The stream quota version must have changed.
+ // Our streamQuota cache is invalidated now, so give it back.
+ s.sendQuotaPool.lockedAdd(streamQuota + size)
+ }
+ if !s.sendQuotaPool.compareAndExecute(streamQuotaVer, success, failure) {
+ // Couldn't send this chunk out.
+ t.sendQuotaPool.add(size)
+ t.localSendQuota.add(ltq)
+ streamQuota = 0
}
}
- // Reset ping strikes when sending data since this might cause
- // the peer to send ping.
- atomic.StoreUint32(&t.resetPingStrikes, 1)
- if err := t.framer.writeData(forceFlush, s.id, false, p); err != nil {
- t.Close()
- return connectionErrorf(true, err, "transport: %v", err)
- }
- p = nil
- if t.framer.adjustNumWriters(-1) == 0 {
- t.framer.flushWrite()
- }
- t.writableChan <- 0
}
-
-}
-
-func (t *http2Server) applySettings(ss []http2.Setting) {
- for _, s := range ss {
- if s.ID == http2.SettingInitialWindowSize {
- t.mu.Lock()
- defer t.mu.Unlock()
- for _, stream := range t.activeStreams {
- stream.sendQuotaPool.add(int(s.Val) - int(t.streamSendQuota))
- }
- t.streamSendQuota = s.Val
- atomic.AddUint32(&t.outQuotaVersion, 1)
- }
-
+ if streamQuota > 0 {
+ // ADd the left over quota back to stream.
+ s.sendQuotaPool.add(streamQuota)
}
+ return nil
}
// keepalive running in a separate goroutine does the following:
@@ -988,7 +939,7 @@ func (t *http2Server) keepalive() {
maxAge := time.NewTimer(t.kp.MaxConnectionAge)
keepalive := time.NewTimer(t.kp.Time)
// NOTE: All exit paths of this function should reset their
- // respecitve timers. A failure to do so will cause the
+ // respective timers. A failure to do so will cause the
// following clean-up to deadlock and eventually leak.
defer func() {
if !maxIdle.Stop() {
@@ -1031,7 +982,7 @@ func (t *http2Server) keepalive() {
t.Close()
// Reseting the timer so that the clean-up doesn't deadlock.
maxAge.Reset(infinity)
- case <-t.shutdownChan:
+ case <-t.ctx.Done():
}
return
case <-keepalive.C:
@@ -1049,7 +1000,7 @@ func (t *http2Server) keepalive() {
pingSent = true
t.controlBuf.put(p)
keepalive.Reset(t.kp.Timeout)
- case <-t.shutdownChan:
+ case <-t.ctx.Done():
return
}
}
@@ -1057,93 +1008,135 @@ func (t *http2Server) keepalive() {
var goAwayPing = &ping{data: [8]byte{1, 6, 1, 8, 0, 3, 3, 9}}
-// controller running in a separate goroutine takes charge of sending control
-// frames (e.g., window update, reset stream, setting, etc.) to the server.
-func (t *http2Server) controller() {
- for {
- select {
- case i := <-t.controlBuf.get():
- t.controlBuf.load()
+// TODO(mmukhi): A lot of this code(and code in other places in the tranpsort layer)
+// is duplicated between the client and the server.
+// The transport layer needs to be refactored to take care of this.
+func (t *http2Server) itemHandler(i item) error {
+ switch i := i.(type) {
+ case *dataFrame:
+ if err := t.framer.fr.WriteData(i.streamID, i.endStream, i.d); err != nil {
+ return err
+ }
+ i.f()
+ return nil
+ case *headerFrame:
+ t.hBuf.Reset()
+ for _, f := range i.hf {
+ t.hEnc.WriteField(f)
+ }
+ first := true
+ endHeaders := false
+ for !endHeaders {
+ size := t.hBuf.Len()
+ if size > http2MaxFrameLen {
+ size = http2MaxFrameLen
+ } else {
+ endHeaders = true
+ }
+ var err error
+ if first {
+ first = false
+ err = t.framer.fr.WriteHeaders(http2.HeadersFrameParam{
+ StreamID: i.streamID,
+ BlockFragment: t.hBuf.Next(size),
+ EndStream: i.endStream,
+ EndHeaders: endHeaders,
+ })
+ } else {
+ err = t.framer.fr.WriteContinuation(
+ i.streamID,
+ endHeaders,
+ t.hBuf.Next(size),
+ )
+ }
+ if err != nil {
+ return err
+ }
+ }
+ atomic.StoreUint32(&t.resetPingStrikes, 1)
+ return nil
+ case *windowUpdate:
+ return t.framer.fr.WriteWindowUpdate(i.streamID, i.increment)
+ case *settings:
+ return t.framer.fr.WriteSettings(i.ss...)
+ case *settingsAck:
+ return t.framer.fr.WriteSettingsAck()
+ case *resetStream:
+ return t.framer.fr.WriteRSTStream(i.streamID, i.code)
+ case *goAway:
+ t.mu.Lock()
+ if t.state == closing {
+ t.mu.Unlock()
+ // The transport is closing.
+ return fmt.Errorf("transport: Connection closing")
+ }
+ sid := t.maxStreamID
+ if !i.headsUp {
+ // Stop accepting more streams now.
+ t.state = draining
+ if len(t.activeStreams) == 0 {
+ i.closeConn = true
+ }
+ t.mu.Unlock()
+ if err := t.framer.fr.WriteGoAway(sid, i.code, i.debugData); err != nil {
+ return err
+ }
+ if i.closeConn {
+ // Abruptly close the connection following the GoAway (via
+ // loopywriter). But flush out what's inside the buffer first.
+ t.controlBuf.put(&flushIO{closeTr: true})
+ }
+ return nil
+ }
+ t.mu.Unlock()
+ // For a graceful close, send out a GoAway with stream ID of MaxUInt32,
+ // Follow that with a ping and wait for the ack to come back or a timer
+ // to expire. During this time accept new streams since they might have
+ // originated before the GoAway reaches the client.
+ // After getting the ack or timer expiration send out another GoAway this
+ // time with an ID of the max stream server intends to process.
+ if err := t.framer.fr.WriteGoAway(math.MaxUint32, http2.ErrCodeNo, []byte{}); err != nil {
+ return err
+ }
+ if err := t.framer.fr.WritePing(false, goAwayPing.data); err != nil {
+ return err
+ }
+ go func() {
+ timer := time.NewTimer(time.Minute)
+ defer timer.Stop()
select {
- case <-t.writableChan:
- switch i := i.(type) {
- case *windowUpdate:
- t.framer.writeWindowUpdate(i.flush, i.streamID, i.increment)
- case *settings:
- if i.ack {
- t.framer.writeSettingsAck(true)
- t.applySettings(i.ss)
- } else {
- t.framer.writeSettings(true, i.ss...)
- }
- case *resetStream:
- t.framer.writeRSTStream(true, i.streamID, i.code)
- case *goAway:
- t.mu.Lock()
- if t.state == closing {
- t.mu.Unlock()
- // The transport is closing.
- return
- }
- sid := t.maxStreamID
- if !i.headsUp {
- // Stop accepting more streams now.
- t.state = draining
- activeStreams := len(t.activeStreams)
- t.mu.Unlock()
- t.framer.writeGoAway(true, sid, i.code, i.debugData)
- if i.closeConn || activeStreams == 0 {
- // Abruptly close the connection following the GoAway.
- t.Close()
- }
- t.writableChan <- 0
- continue
- }
- t.mu.Unlock()
- // For a graceful close, send out a GoAway with stream ID of MaxUInt32,
- // Follow that with a ping and wait for the ack to come back or a timer
- // to expire. During this time accept new streams since they might have
- // originated before the GoAway reaches the client.
- // After getting the ack or timer expiration send out another GoAway this
- // time with an ID of the max stream server intends to process.
- t.framer.writeGoAway(true, math.MaxUint32, http2.ErrCodeNo, []byte{})
- t.framer.writePing(true, false, goAwayPing.data)
- go func() {
- timer := time.NewTimer(time.Minute)
- defer timer.Stop()
- select {
- case <-t.drainChan:
- case <-timer.C:
- case <-t.shutdownChan:
- return
- }
- t.controlBuf.put(&goAway{code: i.code, debugData: i.debugData})
- }()
- case *flushIO:
- t.framer.flushWrite()
- case *ping:
- if !i.ack {
- t.bdpEst.timesnap(i.data)
- }
- t.framer.writePing(true, i.ack, i.data)
- default:
- errorf("transport: http2Server.controller got unexpected item type %v\n", i)
- }
- t.writableChan <- 0
- continue
- case <-t.shutdownChan:
+ case <-t.drainChan:
+ case <-timer.C:
+ case <-t.ctx.Done():
return
}
- case <-t.shutdownChan:
- return
+ t.controlBuf.put(&goAway{code: i.code, debugData: i.debugData})
+ }()
+ return nil
+ case *flushIO:
+ if err := t.framer.writer.Flush(); err != nil {
+ return err
}
+ if i.closeTr {
+ return ErrConnClosing
+ }
+ return nil
+ case *ping:
+ if !i.ack {
+ t.bdpEst.timesnap(i.data)
+ }
+ return t.framer.fr.WritePing(i.ack, i.data)
+ default:
+ err := status.Errorf(codes.Internal, "transport: http2Server.controller got unexpected item type %t", i)
+ errorf("%v", err)
+ return err
}
}
// Close starts shutting down the http2Server transport.
// TODO(zhaoq): Now the destruction is not blocked on any pending streams. This
// could cause some resource issue. Revisit this later.
-func (t *http2Server) Close() (err error) {
+func (t *http2Server) Close() error {
t.mu.Lock()
if t.state == closing {
t.mu.Unlock()
@@ -1153,8 +1146,8 @@ func (t *http2Server) Close() (err error) {
streams := t.activeStreams
t.activeStreams = nil
t.mu.Unlock()
- close(t.shutdownChan)
- err = t.conn.Close()
+ t.cancel()
+ err := t.conn.Close()
// Cancel all active streams.
for _, s := range streams {
s.cancel()
@@ -1163,7 +1156,7 @@ func (t *http2Server) Close() (err error) {
connEnd := &stats.ConnEnd{}
t.stats.HandleConn(t.ctx, connEnd)
}
- return
+ return err
}
// closeStream clears the footprint of a stream when the stream is not needed
@@ -1175,7 +1168,7 @@ func (t *http2Server) closeStream(s *Stream) {
t.idle = time.Now()
}
if t.state == draining && len(t.activeStreams) == 0 {
- defer t.Close()
+ defer t.controlBuf.put(&flushIO{closeTr: true})
}
t.mu.Unlock()
// In case stream sending and receiving are invoked in separate
diff --git a/vendor/google.golang.org/grpc/transport/http_util.go b/vendor/google.golang.org/grpc/transport/http_util.go
index f7c052a..39f878c 100644
--- a/vendor/google.golang.org/grpc/transport/http_util.go
+++ b/vendor/google.golang.org/grpc/transport/http_util.go
@@ -28,7 +28,6 @@ import (
"net/http"
"strconv"
"strings"
- "sync/atomic"
"time"
"github.com/golang/protobuf/proto"
@@ -45,7 +44,8 @@ const (
// http://http2.github.io/http2-spec/#SettingValues
http2InitHeaderTableSize = 4096
// http2IOBufSize specifies the buffer size for sending frames.
- http2IOBufSize = 32 * 1024
+ defaultWriteBufSize = 32 * 1024
+ defaultReadBufSize = 32 * 1024
)
var (
@@ -475,10 +475,10 @@ type framer struct {
fr *http2.Framer
}
-func newFramer(conn net.Conn) *framer {
+func newFramer(conn net.Conn, writeBufferSize, readBufferSize int) *framer {
f := &framer{
- reader: bufio.NewReaderSize(conn, http2IOBufSize),
- writer: bufio.NewWriterSize(conn, http2IOBufSize),
+ reader: bufio.NewReaderSize(conn, readBufferSize),
+ writer: bufio.NewWriterSize(conn, writeBufferSize),
}
f.fr = http2.NewFramer(f.writer, f.reader)
// Opt-in to Frame reuse API on framer to reduce garbage.
@@ -487,132 +487,3 @@ func newFramer(conn net.Conn) *framer {
f.fr.ReadMetaHeaders = hpack.NewDecoder(http2InitHeaderTableSize, nil)
return f
}
-
-func (f *framer) adjustNumWriters(i int32) int32 {
- return atomic.AddInt32(&f.numWriters, i)
-}
-
-// The following writeXXX functions can only be called when the caller gets
-// unblocked from writableChan channel (i.e., owns the privilege to write).
-
-func (f *framer) writeContinuation(forceFlush bool, streamID uint32, endHeaders bool, headerBlockFragment []byte) error {
- if err := f.fr.WriteContinuation(streamID, endHeaders, headerBlockFragment); err != nil {
- return err
- }
- if forceFlush {
- return f.writer.Flush()
- }
- return nil
-}
-
-func (f *framer) writeData(forceFlush bool, streamID uint32, endStream bool, data []byte) error {
- if err := f.fr.WriteData(streamID, endStream, data); err != nil {
- return err
- }
- if forceFlush {
- return f.writer.Flush()
- }
- return nil
-}
-
-func (f *framer) writeGoAway(forceFlush bool, maxStreamID uint32, code http2.ErrCode, debugData []byte) error {
- if err := f.fr.WriteGoAway(maxStreamID, code, debugData); err != nil {
- return err
- }
- if forceFlush {
- return f.writer.Flush()
- }
- return nil
-}
-
-func (f *framer) writeHeaders(forceFlush bool, p http2.HeadersFrameParam) error {
- if err := f.fr.WriteHeaders(p); err != nil {
- return err
- }
- if forceFlush {
- return f.writer.Flush()
- }
- return nil
-}
-
-func (f *framer) writePing(forceFlush, ack bool, data [8]byte) error {
- if err := f.fr.WritePing(ack, data); err != nil {
- return err
- }
- if forceFlush {
- return f.writer.Flush()
- }
- return nil
-}
-
-func (f *framer) writePriority(forceFlush bool, streamID uint32, p http2.PriorityParam) error {
- if err := f.fr.WritePriority(streamID, p); err != nil {
- return err
- }
- if forceFlush {
- return f.writer.Flush()
- }
- return nil
-}
-
-func (f *framer) writePushPromise(forceFlush bool, p http2.PushPromiseParam) error {
- if err := f.fr.WritePushPromise(p); err != nil {
- return err
- }
- if forceFlush {
- return f.writer.Flush()
- }
- return nil
-}
-
-func (f *framer) writeRSTStream(forceFlush bool, streamID uint32, code http2.ErrCode) error {
- if err := f.fr.WriteRSTStream(streamID, code); err != nil {
- return err
- }
- if forceFlush {
- return f.writer.Flush()
- }
- return nil
-}
-
-func (f *framer) writeSettings(forceFlush bool, settings ...http2.Setting) error {
- if err := f.fr.WriteSettings(settings...); err != nil {
- return err
- }
- if forceFlush {
- return f.writer.Flush()
- }
- return nil
-}
-
-func (f *framer) writeSettingsAck(forceFlush bool) error {
- if err := f.fr.WriteSettingsAck(); err != nil {
- return err
- }
- if forceFlush {
- return f.writer.Flush()
- }
- return nil
-}
-
-func (f *framer) writeWindowUpdate(forceFlush bool, streamID, incr uint32) error {
- if err := f.fr.WriteWindowUpdate(streamID, incr); err != nil {
- return err
- }
- if forceFlush {
- return f.writer.Flush()
- }
- return nil
-}
-
-func (f *framer) flushWrite() error {
- return f.writer.Flush()
-}
-
-func (f *framer) readFrame() (http2.Frame, error) {
- return f.fr.ReadFrame()
-}
-
-func (f *framer) errorDetail() error {
- return f.fr.ErrorDetail()
-}
diff --git a/vendor/google.golang.org/grpc/transport/transport.go b/vendor/google.golang.org/grpc/transport/transport.go
index c5732be..2e7bcae 100644
--- a/vendor/google.golang.org/grpc/transport/transport.go
+++ b/vendor/google.golang.org/grpc/transport/transport.go
@@ -17,7 +17,8 @@
*/
// Package transport defines and implements message oriented communication
-// channel to complete various transactions (e.g., an RPC).
+// channel to complete various transactions (e.g., an RPC). It is meant for
+// grpc-internal usage and is not intended to be imported directly by users.
package transport // import "google.golang.org/grpc/transport"
import (
@@ -67,20 +68,20 @@ func newRecvBuffer() *recvBuffer {
func (b *recvBuffer) put(r recvMsg) {
b.mu.Lock()
- defer b.mu.Unlock()
if len(b.backlog) == 0 {
select {
case b.c <- r:
+ b.mu.Unlock()
return
default:
}
}
b.backlog = append(b.backlog, r)
+ b.mu.Unlock()
}
func (b *recvBuffer) load() {
b.mu.Lock()
- defer b.mu.Unlock()
if len(b.backlog) > 0 {
select {
case b.c <- b.backlog[0]:
@@ -89,6 +90,7 @@ func (b *recvBuffer) load() {
default:
}
}
+ b.mu.Unlock()
}
// get returns the channel that receives a recvMsg in the buffer.
@@ -131,7 +133,7 @@ func (r *recvBufferReader) read(p []byte) (n int, err error) {
case <-r.ctx.Done():
return 0, ContextErr(r.ctx.Err())
case <-r.goAway:
- return 0, ErrStreamDrain
+ return 0, errStreamDrain
case m := <-r.recv.get():
r.recv.load()
if m.err != nil {
@@ -164,20 +166,20 @@ func newControlBuffer() *controlBuffer {
func (b *controlBuffer) put(r item) {
b.mu.Lock()
- defer b.mu.Unlock()
if len(b.backlog) == 0 {
select {
case b.c <- r:
+ b.mu.Unlock()
return
default:
}
}
b.backlog = append(b.backlog, r)
+ b.mu.Unlock()
}
func (b *controlBuffer) load() {
b.mu.Lock()
- defer b.mu.Unlock()
if len(b.backlog) > 0 {
select {
case b.c <- b.backlog[0]:
@@ -186,6 +188,7 @@ func (b *controlBuffer) load() {
default:
}
}
+ b.mu.Unlock()
}
// get returns the channel that receives an item in the buffer.
@@ -207,65 +210,67 @@ const (
// Stream represents an RPC in the transport layer.
type Stream struct {
- id uint32
- // nil for client side Stream.
- st ServerTransport
- // ctx is the associated context of the stream.
- ctx context.Context
- // cancel is always nil for client side Stream.
- cancel context.CancelFunc
- // done is closed when the final status arrives.
- done chan struct{}
- // goAway is closed when the server sent GoAways signal before this stream was initiated.
- goAway chan struct{}
- // method records the associated RPC method of the stream.
- method string
+ id uint32
+ st ServerTransport // nil for client side Stream
+ ctx context.Context // the associated context of the stream
+ cancel context.CancelFunc // always nil for client side Stream
+ done chan struct{} // closed when the final status arrives
+ goAway chan struct{} // closed when a GOAWAY control message is received
+ method string // the associated RPC method of the stream
recvCompress string
sendCompress string
buf *recvBuffer
trReader io.Reader
fc *inFlow
recvQuota uint32
-
- // TODO: Remote this unused variable.
- // The accumulated inbound quota pending for window update.
- updateQuota uint32
+ waiters waiters
// Callback to state application's intentions to read data. This
- // is used to adjust flow control, if need be.
+ // is used to adjust flow control, if needed.
requestRead func(int)
sendQuotaPool *quotaPool
- // Close headerChan to indicate the end of reception of header metadata.
- headerChan chan struct{}
- // header caches the received header metadata.
- header metadata.MD
- // The key-value map of trailer metadata.
- trailer metadata.MD
+ headerChan chan struct{} // closed to indicate the end of header metadata.
+ headerDone bool // set when headerChan is closed. Used to avoid closing headerChan multiple times.
+ header metadata.MD // the received header metadata.
+ trailer metadata.MD // the key-value map of trailer metadata.
- mu sync.RWMutex // guard the following
- // headerOK becomes true from the first header is about to send.
- headerOk bool
+ mu sync.RWMutex // guard the following
+ headerOk bool // becomes true from the first header is about to send
state streamState
- // true iff headerChan is closed. Used to avoid closing headerChan
- // multiple times.
- headerDone bool
- // the status error received from the server.
- status *status.Status
- // rstStream indicates whether a RST_STREAM frame needs to be sent
- // to the server to signify that this stream is closing.
- rstStream bool
- // rstError is the error that needs to be sent along with the RST_STREAM frame.
- rstError http2.ErrCode
- // bytesSent and bytesReceived indicates whether any bytes have been sent or
- // received on this stream.
- bytesSent bool
- bytesReceived bool
+
+ status *status.Status // the status error received from the server
+
+ rstStream bool // indicates whether a RST_STREAM frame needs to be sent
+ rstError http2.ErrCode // the error that needs to be sent along with the RST_STREAM frame
+
+ bytesReceived bool // indicates whether any bytes have been received on this stream
+ unprocessed bool // set if the server sends a refused stream or GOAWAY including this stream
+}
+
+func (s *Stream) waitOnHeader() error {
+ if s.headerChan == nil {
+ // On the server headerChan is always nil since a stream originates
+ // only after having received headers.
+ return nil
+ }
+ wc := s.waiters
+ select {
+ case <-wc.ctx.Done():
+ return ContextErr(wc.ctx.Err())
+ case <-wc.goAway:
+ return errStreamDrain
+ case <-s.headerChan:
+ return nil
+ }
}
// RecvCompress returns the compression algorithm applied to the inbound
// message. It is empty string if there is no compression applied.
func (s *Stream) RecvCompress() string {
+ if err := s.waitOnHeader(); err != nil {
+ return ""
+ }
return s.recvCompress
}
@@ -290,15 +295,7 @@ func (s *Stream) GoAway() <-chan struct{} {
// is available. It blocks until i) the metadata is ready or ii) there is no
// header metadata or iii) the stream is canceled/expired.
func (s *Stream) Header() (metadata.MD, error) {
- var err error
- select {
- case <-s.ctx.Done():
- err = ContextErr(s.ctx.Err())
- case <-s.goAway:
- err = ErrStreamDrain
- case <-s.headerChan:
- return s.header.Copy(), nil
- }
+ err := s.waitOnHeader()
// Even if the stream is closed, header is returned if available.
select {
case <-s.headerChan:
@@ -313,8 +310,9 @@ func (s *Stream) Header() (metadata.MD, error) {
// side only.
func (s *Stream) Trailer() metadata.MD {
s.mu.RLock()
- defer s.mu.RUnlock()
- return s.trailer.Copy()
+ c := s.trailer.Copy()
+ s.mu.RUnlock()
+ return c
}
// ServerTransport returns the underlying ServerTransport for the stream.
@@ -342,14 +340,16 @@ func (s *Stream) Status() *status.Status {
// Server side only.
func (s *Stream) SetHeader(md metadata.MD) error {
s.mu.Lock()
- defer s.mu.Unlock()
if s.headerOk || s.state == streamDone {
+ s.mu.Unlock()
return ErrIllegalHeaderWrite
}
if md.Len() == 0 {
+ s.mu.Unlock()
return nil
}
s.header = metadata.Join(s.header, md)
+ s.mu.Unlock()
return nil
}
@@ -360,8 +360,8 @@ func (s *Stream) SetTrailer(md metadata.MD) error {
return nil
}
s.mu.Lock()
- defer s.mu.Unlock()
s.trailer = metadata.Join(s.trailer, md)
+ s.mu.Unlock()
return nil
}
@@ -409,18 +409,21 @@ func (s *Stream) finish(st *status.Status) {
close(s.done)
}
-// BytesSent indicates whether any bytes have been sent on this stream.
-func (s *Stream) BytesSent() bool {
- s.mu.Lock()
- defer s.mu.Unlock()
- return s.bytesSent
-}
-
// BytesReceived indicates whether any bytes have been received on this stream.
func (s *Stream) BytesReceived() bool {
s.mu.Lock()
- defer s.mu.Unlock()
- return s.bytesReceived
+ br := s.bytesReceived
+ s.mu.Unlock()
+ return br
+}
+
+// Unprocessed indicates whether the server did not process this stream --
+// i.e. it sent a refused stream or GOAWAY including this stream ID.
+func (s *Stream) Unprocessed() bool {
+ s.mu.Lock()
+ br := s.unprocessed
+ s.mu.Unlock()
+ return br
}
// GoString is implemented by Stream so context.String() won't
@@ -449,7 +452,6 @@ type transportState int
const (
reachable transportState = iota
- unreachable
closing
draining
)
@@ -464,6 +466,8 @@ type ServerConfig struct {
KeepalivePolicy keepalive.EnforcementPolicy
InitialWindowSize int32
InitialConnWindowSize int32
+ WriteBufferSize int
+ ReadBufferSize int
}
// NewServerTransport creates a ServerTransport with conn or non-nil error
@@ -491,22 +495,27 @@ type ConnectOptions struct {
KeepaliveParams keepalive.ClientParameters
// StatsHandler stores the handler for stats.
StatsHandler stats.Handler
- // InitialWindowSize sets the intial window size for a stream.
+ // InitialWindowSize sets the initial window size for a stream.
InitialWindowSize int32
- // InitialConnWindowSize sets the intial window size for a connection.
+ // InitialConnWindowSize sets the initial window size for a connection.
InitialConnWindowSize int32
+ // WriteBufferSize sets the size of write buffer which in turn determines how much data can be batched before it's written on the wire.
+ WriteBufferSize int
+ // ReadBufferSize sets the size of read buffer, which in turn determines how much data can be read at most for one read syscall.
+ ReadBufferSize int
}
// TargetInfo contains the information of the target such as network address and metadata.
type TargetInfo struct {
- Addr string
- Metadata interface{}
+ Addr string
+ Metadata interface{}
+ Authority string
}
// NewClientTransport establishes the transport with the required ConnectOptions
// and returns it to the caller.
-func NewClientTransport(ctx context.Context, target TargetInfo, opts ConnectOptions) (ClientTransport, error) {
- return newHTTP2Client(ctx, target, opts)
+func NewClientTransport(connectCtx, ctx context.Context, target TargetInfo, opts ConnectOptions, onSuccess func()) (ClientTransport, error) {
+ return newHTTP2Client(connectCtx, ctx, target, opts, onSuccess)
}
// Options provides additional hints and information for message
@@ -518,7 +527,7 @@ type Options struct {
// Delay is a hint to the transport implementation for whether
// the data could be buffered for a batching write. The
- // Transport implementation may ignore the hint.
+ // transport implementation may ignore the hint.
Delay bool
}
@@ -530,10 +539,6 @@ type CallHdr struct {
// Method specifies the operation to perform.
Method string
- // RecvCompress specifies the compression algorithm applied on
- // inbound messages.
- RecvCompress string
-
// SendCompress specifies the compression algorithm applied on
// outbound message.
SendCompress string
@@ -671,9 +676,13 @@ func (e ConnectionError) Origin() error {
var (
// ErrConnClosing indicates that the transport is closing.
ErrConnClosing = connectionErrorf(true, nil, "transport is closing")
- // ErrStreamDrain indicates that the stream is rejected by the server because
+ // errStreamDrain indicates that the stream is rejected by the server because
// the server stops accepting new RPCs.
- ErrStreamDrain = streamErrorf(codes.Unavailable, "the server stops accepting new RPCs")
+ // TODO: delete this error; it is no longer necessary.
+ errStreamDrain = streamErrorf(codes.Unavailable, "the server stops accepting new RPCs")
+ // StatusGoAway indicates that the server sent a GOAWAY that included this
+ // stream's ID in unprocessed RPCs.
+ statusGoAway = status.New(codes.Unavailable, "the server stopped accepting new RPCs")
)
// TODO: See if we can replace StreamError with status package errors.
@@ -688,43 +697,61 @@ func (e StreamError) Error() string {
return fmt.Sprintf("stream error: code = %s desc = %q", e.Code, e.Desc)
}
-// wait blocks until it can receive from ctx.Done, closing, or proceed.
-// If it receives from ctx.Done, it returns 0, the StreamError for ctx.Err.
-// If it receives from done, it returns 0, io.EOF if ctx is not done; otherwise
-// it return the StreamError for ctx.Err.
-// If it receives from goAway, it returns 0, ErrStreamDrain.
-// If it receives from closing, it returns 0, ErrConnClosing.
-// If it receives from proceed, it returns the received integer, nil.
-func wait(ctx context.Context, done, goAway, closing <-chan struct{}, proceed <-chan int) (int, error) {
- select {
- case <-ctx.Done():
- return 0, ContextErr(ctx.Err())
- case <-done:
- // User cancellation has precedence.
- select {
- case <-ctx.Done():
- return 0, ContextErr(ctx.Err())
- default:
- }
- return 0, io.EOF
- case <-goAway:
- return 0, ErrStreamDrain
- case <-closing:
- return 0, ErrConnClosing
- case i := <-proceed:
- return i, nil
- }
+// waiters are passed to quotaPool get methods to
+// wait on in addition to waiting on quota.
+type waiters struct {
+ ctx context.Context
+ tctx context.Context
+ done chan struct{}
+ goAway chan struct{}
}
// GoAwayReason contains the reason for the GoAway frame received.
type GoAwayReason uint8
const (
- // Invalid indicates that no GoAway frame is received.
- Invalid GoAwayReason = 0
- // NoReason is the default value when GoAway frame is received.
- NoReason GoAwayReason = 1
- // TooManyPings indicates that a GoAway frame with ErrCodeEnhanceYourCalm
- // was recieved and that the debug data said "too_many_pings".
- TooManyPings GoAwayReason = 2
+ // GoAwayInvalid indicates that no GoAway frame is received.
+ GoAwayInvalid GoAwayReason = 0
+ // GoAwayNoReason is the default value when GoAway frame is received.
+ GoAwayNoReason GoAwayReason = 1
+ // GoAwayTooManyPings indicates that a GoAway frame with
+ // ErrCodeEnhanceYourCalm was received and that the debug data said
+ // "too_many_pings".
+ GoAwayTooManyPings GoAwayReason = 2
)
+
+// loopyWriter is run in a separate go routine. It is the single code path that will
+// write data on wire.
+func loopyWriter(ctx context.Context, cbuf *controlBuffer, handler func(item) error) {
+ for {
+ select {
+ case i := <-cbuf.get():
+ cbuf.load()
+ if err := handler(i); err != nil {
+ errorf("transport: Error while handling item. Err: %v", err)
+ return
+ }
+ case <-ctx.Done():
+ return
+ }
+ hasData:
+ for {
+ select {
+ case i := <-cbuf.get():
+ cbuf.load()
+ if err := handler(i); err != nil {
+ errorf("transport: Error while handling item. Err: %v", err)
+ return
+ }
+ case <-ctx.Done():
+ return
+ default:
+ if err := handler(&flushIO{}); err != nil {
+ errorf("transport: Error while flushing. Err: %v", err)
+ return
+ }
+ break hasData
+ }
+ }
+ }
+}
diff --git a/vendor/google.golang.org/grpc/transport/transport_test.go b/vendor/google.golang.org/grpc/transport/transport_test.go
index adaa172..8c004ec 100644
--- a/vendor/google.golang.org/grpc/transport/transport_test.go
+++ b/vendor/google.golang.org/grpc/transport/transport_test.go
@@ -49,6 +49,7 @@ type server struct {
startedErr chan error // error (or nil) with server start value
mu sync.Mutex
conns map[ServerTransport]bool
+ h *testStreamHandler
}
var (
@@ -60,7 +61,8 @@ var (
)
type testStreamHandler struct {
- t *http2Server
+ t *http2Server
+ notify chan struct{}
}
type hType int
@@ -68,6 +70,7 @@ type hType int
const (
normal hType = iota
suspended
+ notifyCall
misbehaved
encodingRequiredStatus
invalidHeaderField
@@ -76,6 +79,19 @@ const (
pingpong
)
+func (h *testStreamHandler) handleStreamAndNotify(s *Stream) {
+ if h.notify == nil {
+ return
+ }
+ go func() {
+ select {
+ case <-h.notify:
+ default:
+ close(h.notify)
+ }
+ }()
+}
+
func (h *testStreamHandler) handleStream(t *testing.T, s *Stream) {
req := expectedRequest
resp := expectedResponse
@@ -92,15 +108,19 @@ func (h *testStreamHandler) handleStream(t *testing.T, s *Stream) {
t.Fatalf("handleStream got %v, want %v", p, req)
}
// send a response back to the client.
- h.t.Write(s, resp, nil, &Options{})
+ h.t.Write(s, nil, resp, &Options{})
// send the trailer to end the stream.
h.t.WriteStatus(s, status.New(codes.OK, ""))
}
func (h *testStreamHandler) handleStreamPingPong(t *testing.T, s *Stream) {
header := make([]byte, 5)
- for i := 0; i < 10; i++ {
+ for {
if _, err := s.Read(header); err != nil {
+ if err == io.EOF {
+ h.t.WriteStatus(s, status.New(codes.OK, ""))
+ return
+ }
t.Fatalf("Error on server while reading data header: %v", err)
}
sz := binary.BigEndian.Uint32(header[1:])
@@ -112,7 +132,7 @@ func (h *testStreamHandler) handleStreamPingPong(t *testing.T, s *Stream) {
buf[0] = byte(0)
binary.BigEndian.PutUint32(buf[1:], uint32(sz))
copy(buf[5:], msg)
- h.t.Write(s, buf, nil, &Options{})
+ h.t.Write(s, nil, buf, &Options{})
}
}
@@ -124,7 +144,6 @@ func (h *testStreamHandler) handleStreamMisbehave(t *testing.T, s *Stream) {
var sent int
p := make([]byte, http2MaxFrameLen)
for sent < initialWindowSize {
- <-conn.writableChan
n := initialWindowSize - sent
// The last message may be smaller than http2MaxFrameLen
if n <= http2MaxFrameLen {
@@ -137,11 +156,7 @@ func (h *testStreamHandler) handleStreamMisbehave(t *testing.T, s *Stream) {
p = make([]byte, n+1)
}
}
- if err := conn.framer.writeData(true, s.id, false, p); err != nil {
- conn.writableChan <- 0
- break
- }
- conn.writableChan <- 0
+ conn.controlBuf.put(&dataFrame{s.id, false, p, func() {}})
sent += len(p)
}
}
@@ -152,13 +167,13 @@ func (h *testStreamHandler) handleStreamEncodingRequiredStatus(t *testing.T, s *
}
func (h *testStreamHandler) handleStreamInvalidHeaderField(t *testing.T, s *Stream) {
- <-h.t.writableChan
- h.t.hBuf.Reset()
- h.t.hEnc.WriteField(hpack.HeaderField{Name: "content-type", Value: expectedInvalidHeaderField})
- if err := h.t.writeHeaders(s, h.t.hBuf, false); err != nil {
- t.Fatalf("Failed to write headers: %v", err)
- }
- h.t.writableChan <- 0
+ headerFields := []hpack.HeaderField{}
+ headerFields = append(headerFields, hpack.HeaderField{Name: "content-type", Value: expectedInvalidHeaderField})
+ h.t.controlBuf.put(&headerFrame{
+ streamID: s.id,
+ hf: headerFields,
+ endStream: false,
+ })
}
func (h *testStreamHandler) handleStreamDelayRead(t *testing.T, s *Stream) {
@@ -183,7 +198,7 @@ func (h *testStreamHandler) handleStreamDelayRead(t *testing.T, s *Stream) {
t.Fatalf("handleStream got %v, want %v", p, req)
}
// send a response back to the client.
- h.t.Write(s, resp, nil, &Options{})
+ h.t.Write(s, nil, resp, &Options{})
// send the trailer to end the stream.
h.t.WriteStatus(s, status.New(codes.OK, ""))
}
@@ -208,7 +223,7 @@ func (h *testStreamHandler) handleStreamDelayWrite(t *testing.T, s *Stream) {
// Wait before sending. Give time to client to start reading
// before server starts sending.
time.Sleep(2 * time.Second)
- h.t.Write(s, resp, nil, &Options{})
+ h.t.Write(s, nil, resp, &Options{})
// send the trailer to end the stream.
h.t.WriteStatus(s, status.New(codes.OK, ""))
}
@@ -249,9 +264,15 @@ func (s *server) start(t *testing.T, port int, serverConfig *ServerConfig, ht hT
return
}
s.conns[transport] = true
+ h := &testStreamHandler{t: transport.(*http2Server)}
+ s.h = h
s.mu.Unlock()
- h := &testStreamHandler{transport.(*http2Server)}
switch ht {
+ case notifyCall:
+ go transport.HandleStreams(h.handleStreamAndNotify,
+ func(ctx context.Context, _ string) context.Context {
+ return ctx
+ })
case suspended:
go transport.HandleStreams(func(*Stream) {}, // Do nothing to handle the stream.
func(ctx context.Context, method string) context.Context {
@@ -340,8 +361,10 @@ func setUpWithOptions(t *testing.T, port int, serverConfig *ServerConfig, ht hTy
target := TargetInfo{
Addr: addr,
}
- ct, connErr = NewClientTransport(context.Background(), target, copts)
+ connectCtx, cancel := context.WithDeadline(context.Background(), time.Now().Add(2*time.Second))
+ ct, connErr = NewClientTransport(connectCtx, context.Background(), target, copts, func() {})
if connErr != nil {
+ cancel() // Do not cancel in success path.
t.Fatalf("failed to create transport: %v", connErr)
}
return server, ct
@@ -363,8 +386,10 @@ func setUpWithNoPingServer(t *testing.T, copts ConnectOptions, done chan net.Con
}
done <- conn
}()
- tr, err := NewClientTransport(context.Background(), TargetInfo{Addr: lis.Addr().String()}, copts)
+ connectCtx, cancel := context.WithDeadline(context.Background(), time.Now().Add(2*time.Second))
+ tr, err := NewClientTransport(connectCtx, context.Background(), TargetInfo{Addr: lis.Addr().String()}, copts, func() {})
if err != nil {
+ cancel() // Do not cancel in success path.
// Server clean-up.
lis.Close()
if conn, ok := <-done; ok {
@@ -512,8 +537,18 @@ func TestKeepaliveServer(t *testing.T) {
t.Fatalf("Failed to dial: %v", err)
}
defer client.Close()
+
// Set read deadline on client conn so that it doesn't block forever in errorsome cases.
- client.SetReadDeadline(time.Now().Add(10 * time.Second))
+ client.SetDeadline(time.Now().Add(10 * time.Second))
+
+ if n, err := client.Write(clientPreface); err != nil || n != len(clientPreface) {
+ t.Fatalf("Error writing client preface; n=%v, err=%v", n, err)
+ }
+ framer := newFramer(client, defaultWriteBufSize, defaultReadBufSize)
+ if err := framer.fr.WriteSettings(http2.Setting{}); err != nil {
+ t.Fatal("Error writing settings frame:", err)
+ }
+ framer.writer.Flush()
// Wait for keepalive logic to close the connection.
time.Sleep(4 * time.Second)
b := make([]byte, 24)
@@ -654,7 +689,7 @@ func TestKeepaliveServerEnforcementWithAbusiveClientNoRPC(t *testing.T) {
clientOptions := ConnectOptions{
KeepaliveParams: keepalive.ClientParameters{
Time: 50 * time.Millisecond,
- Timeout: 50 * time.Millisecond,
+ Timeout: 1 * time.Second,
PermitWithoutStream: true,
},
}
@@ -662,7 +697,7 @@ func TestKeepaliveServerEnforcementWithAbusiveClientNoRPC(t *testing.T) {
defer server.stop()
defer client.Close()
- timeout := time.NewTimer(2 * time.Second)
+ timeout := time.NewTimer(10 * time.Second)
select {
case <-client.GoAway():
if !timeout.Stop() {
@@ -689,7 +724,7 @@ func TestKeepaliveServerEnforcementWithAbusiveClientWithRPC(t *testing.T) {
clientOptions := ConnectOptions{
KeepaliveParams: keepalive.ClientParameters{
Time: 50 * time.Millisecond,
- Timeout: 50 * time.Millisecond,
+ Timeout: 1 * time.Second,
},
}
server, client := setUpWithOptions(t, 0, serverConfig, suspended, clientOptions)
@@ -699,7 +734,7 @@ func TestKeepaliveServerEnforcementWithAbusiveClientWithRPC(t *testing.T) {
if _, err := client.NewStream(context.Background(), &CallHdr{Flush: true}); err != nil {
t.Fatalf("Client failed to create stream.")
}
- timeout := time.NewTimer(2 * time.Second)
+ timeout := time.NewTimer(10 * time.Second)
select {
case <-client.GoAway():
if !timeout.Stop() {
@@ -727,7 +762,7 @@ func TestKeepaliveServerEnforcementWithObeyingClientNoRPC(t *testing.T) {
clientOptions := ConnectOptions{
KeepaliveParams: keepalive.ClientParameters{
Time: 101 * time.Millisecond,
- Timeout: 50 * time.Millisecond,
+ Timeout: 1 * time.Second,
PermitWithoutStream: true,
},
}
@@ -736,7 +771,7 @@ func TestKeepaliveServerEnforcementWithObeyingClientNoRPC(t *testing.T) {
defer client.Close()
// Give keepalive enough time.
- time.Sleep(2 * time.Second)
+ time.Sleep(3 * time.Second)
// Assert that connection is healthy.
ct := client.(*http2Client)
ct.mu.Lock()
@@ -755,7 +790,7 @@ func TestKeepaliveServerEnforcementWithObeyingClientWithRPC(t *testing.T) {
clientOptions := ConnectOptions{
KeepaliveParams: keepalive.ClientParameters{
Time: 101 * time.Millisecond,
- Timeout: 50 * time.Millisecond,
+ Timeout: 1 * time.Second,
},
}
server, client := setUpWithOptions(t, 0, serverConfig, suspended, clientOptions)
@@ -767,7 +802,7 @@ func TestKeepaliveServerEnforcementWithObeyingClientWithRPC(t *testing.T) {
}
// Give keepalive enough time.
- time.Sleep(2 * time.Second)
+ time.Sleep(3 * time.Second)
// Assert that connection is healthy.
ct := client.(*http2Client)
ct.mu.Lock()
@@ -801,7 +836,7 @@ func TestClientSendAndReceive(t *testing.T) {
Last: true,
Delay: false,
}
- if err := ct.Write(s1, expectedRequest, nil, &opts); err != nil && err != io.EOF {
+ if err := ct.Write(s1, nil, expectedRequest, &opts); err != nil && err != io.EOF {
t.Fatalf("failed to send data: %v", err)
}
p := make([]byte, len(expectedResponse))
@@ -838,7 +873,7 @@ func performOneRPC(ct ClientTransport) {
Last: true,
Delay: false,
}
- if err := ct.Write(s, expectedRequest, nil, &opts); err == nil || err == io.EOF {
+ if err := ct.Write(s, []byte{}, expectedRequest, &opts); err == nil || err == io.EOF {
time.Sleep(5 * time.Millisecond)
// The following s.Recv()'s could error out because the
// underlying transport is gone.
@@ -882,7 +917,7 @@ func TestLargeMessage(t *testing.T) {
if err != nil {
t.Errorf("%v.NewStream(_, _) = _, %v, want _, ", ct, err)
}
- if err := ct.Write(s, expectedRequestLarge, nil, &Options{Last: true, Delay: false}); err != nil && err != io.EOF {
+ if err := ct.Write(s, []byte{}, expectedRequestLarge, &Options{Last: true, Delay: false}); err != nil && err != io.EOF {
t.Errorf("%v.Write(_, _, _) = %v, want ", ct, err)
}
p := make([]byte, len(expectedResponseLarge))
@@ -914,7 +949,7 @@ func TestLargeMessageWithDelayRead(t *testing.T) {
if err != nil {
t.Errorf("%v.NewStream(_, _) = _, %v, want _, ", ct, err)
}
- if err := ct.Write(s, expectedRequestLarge, nil, &Options{Last: true, Delay: false}); err != nil && err != io.EOF {
+ if err := ct.Write(s, []byte{}, expectedRequestLarge, &Options{Last: true, Delay: false}); err != nil && err != io.EOF {
t.Errorf("%v.Write(_, _, _) = %v, want ", ct, err)
}
p := make([]byte, len(expectedResponseLarge))
@@ -952,7 +987,7 @@ func TestLargeMessageDelayWrite(t *testing.T) {
// Give time to server to start reading before client starts sending.
time.Sleep(2 * time.Second)
- if err := ct.Write(s, expectedRequestLarge, nil, &Options{Last: true, Delay: false}); err != nil && err != io.EOF {
+ if err := ct.Write(s, []byte{}, expectedRequestLarge, &Options{Last: true, Delay: false}); err != nil && err != io.EOF {
t.Errorf("%v.Write(_, _, _) = %v, want ", ct, err)
}
p := make([]byte, len(expectedResponseLarge))
@@ -988,8 +1023,8 @@ func TestGracefulClose(t *testing.T) {
wg.Add(1)
go func() {
defer wg.Done()
- if _, err := ct.NewStream(context.Background(), callHdr); err != ErrStreamDrain {
- t.Errorf("%v.NewStream(_, _) = _, %v, want _, %v", ct, err, ErrStreamDrain)
+ if _, err := ct.NewStream(context.Background(), callHdr); err != errStreamDrain {
+ t.Errorf("%v.NewStream(_, _) = _, %v, want _, %v", ct, err, errStreamDrain)
}
}()
}
@@ -998,7 +1033,7 @@ func TestGracefulClose(t *testing.T) {
Delay: false,
}
// The stream which was created before graceful close can still proceed.
- if err := ct.Write(s, expectedRequest, nil, &opts); err != nil && err != io.EOF {
+ if err := ct.Write(s, nil, expectedRequest, &opts); err != nil && err != io.EOF {
t.Fatalf("%v.Write(_, _, _) = %v, want ", ct, err)
}
p := make([]byte, len(expectedResponse))
@@ -1028,7 +1063,7 @@ func TestLargeMessageSuspension(t *testing.T) {
}
// Write should not be done successfully due to flow control.
msg := make([]byte, initialWindowSize*8)
- err = ct.Write(s, msg, nil, &Options{Last: true, Delay: false})
+ err = ct.Write(s, nil, msg, &Options{Last: true, Delay: false})
expectedErr := streamErrorf(codes.DeadlineExceeded, "%v", context.DeadlineExceeded)
if err != expectedErr {
t.Fatalf("Write got %v, want %v", err, expectedErr)
@@ -1072,43 +1107,29 @@ func TestMaxStreams(t *testing.T) {
}
}
}()
+ // Test these conditions until they pass or
+ // we reach the deadline (failure case).
for {
select {
case <-ch:
case <-done:
- t.Fatalf("Client has not received the max stream setting in 5 seconds.")
+ t.Fatalf("streamsQuota.quota shouldn't be non-zero.")
}
- cc.mu.Lock()
- // cc.maxStreams should be equal to 1 after having received settings frame from
- // server.
- if cc.maxStreams == 1 {
- cc.mu.Unlock()
- select {
- case <-cc.streamsQuota.acquire():
- t.Fatalf("streamsQuota.acquire() becomes readable mistakenly.")
- default:
- cc.streamsQuota.mu.Lock()
- quota := cc.streamsQuota.quota
- cc.streamsQuota.mu.Unlock()
- if quota != 0 {
- t.Fatalf("streamsQuota.quota got non-zero quota mistakenly.")
- }
- }
+ cc.streamsQuota.mu.Lock()
+ sq := cc.streamsQuota.quota
+ cc.streamsQuota.mu.Unlock()
+ if sq == 0 {
break
}
- cc.mu.Unlock()
}
close(ready)
// Close the pending stream so that the streams quota becomes available for the next new stream.
ct.CloseStream(s, nil)
- select {
- case i := <-cc.streamsQuota.acquire():
- if i != 1 {
- t.Fatalf("streamsQuota.acquire() got %d quota, want 1.", i)
- }
- cc.streamsQuota.add(i)
- default:
- t.Fatalf("streamsQuota.acquire() is not readable.")
+ cc.streamsQuota.mu.Lock()
+ i := cc.streamsQuota.quota
+ cc.streamsQuota.mu.Unlock()
+ if i != 1 {
+ t.Fatalf("streamsQuota is %d, want 1.", i)
}
if _, err := ct.NewStream(context.Background(), callHdr); err != nil {
t.Fatalf("Failed to open stream: %v", err)
@@ -1150,12 +1171,7 @@ func TestServerContextCanceledOnClosedConnection(t *testing.T) {
if err != nil {
t.Fatalf("Failed to open stream: %v", err)
}
- // Make sure the headers frame is flushed out.
- <-cc.writableChan
- if err = cc.framer.writeData(true, s.id, false, make([]byte, http2MaxFrameLen)); err != nil {
- t.Fatalf("Failed to write data: %v", err)
- }
- cc.writableChan <- 0
+ cc.controlBuf.put(&dataFrame{s.id, false, make([]byte, http2MaxFrameLen), func() {}})
// Loop until the server side stream is created.
var ss *Stream
for {
@@ -1186,7 +1202,7 @@ func TestClientConnDecoupledFromApplicationRead(t *testing.T) {
InitialWindowSize: defaultWindowSize,
InitialConnWindowSize: defaultWindowSize,
}
- server, client := setUpWithOptions(t, 0, &ServerConfig{}, suspended, connectOptions)
+ server, client := setUpWithOptions(t, 0, &ServerConfig{}, notifyCall, connectOptions)
defer server.stop()
defer client.Close()
@@ -1205,66 +1221,56 @@ func TestClientConnDecoupledFromApplicationRead(t *testing.T) {
for k := range server.conns {
st = k.(*http2Server)
}
+ notifyChan := make(chan struct{})
+ server.h.notify = notifyChan
server.mu.Unlock()
cstream1, err := client.NewStream(context.Background(), &CallHdr{Flush: true})
if err != nil {
t.Fatalf("Client failed to create first stream. Err: %v", err)
}
+ <-notifyChan
var sstream1 *Stream
// Access stream on the server.
- waitWhileTrue(t, func() (bool, error) {
- st.mu.Lock()
- defer st.mu.Unlock()
-
- if len(st.activeStreams) != 1 {
- return true, fmt.Errorf("timed-out while waiting for server to have created a stream")
- }
- for _, v := range st.activeStreams {
+ st.mu.Lock()
+ for _, v := range st.activeStreams {
+ if v.id == cstream1.id {
sstream1 = v
}
- return false, nil
- })
-
+ }
+ st.mu.Unlock()
+ if sstream1 == nil {
+ t.Fatalf("Didn't find stream corresponding to client cstream.id: %v on the server", cstream1.id)
+ }
// Exhaust client's connection window.
- <-st.writableChan
- if err := st.framer.writeData(true, sstream1.id, true, make([]byte, defaultWindowSize)); err != nil {
- st.writableChan <- 0
+ if err := st.Write(sstream1, []byte{}, make([]byte, defaultWindowSize), &Options{}); err != nil {
t.Fatalf("Server failed to write data. Err: %v", err)
}
- st.writableChan <- 0
+ notifyChan = make(chan struct{})
+ server.mu.Lock()
+ server.h.notify = notifyChan
+ server.mu.Unlock()
// Create another stream on client.
cstream2, err := client.NewStream(context.Background(), &CallHdr{Flush: true})
if err != nil {
t.Fatalf("Client failed to create second stream. Err: %v", err)
}
-
+ <-notifyChan
var sstream2 *Stream
- waitWhileTrue(t, func() (bool, error) {
- st.mu.Lock()
- defer st.mu.Unlock()
-
- if len(st.activeStreams) != 2 {
- return true, fmt.Errorf("timed-out while waiting for server to have created the second stream")
+ st.mu.Lock()
+ for _, v := range st.activeStreams {
+ if v.id == cstream2.id {
+ sstream2 = v
}
- for _, v := range st.activeStreams {
- if v.id == cstream2.id {
- sstream2 = v
- }
- }
- if sstream2 == nil {
- return true, fmt.Errorf("didn't find stream corresponding to client cstream.id: %v on the server", cstream2.id)
- }
- return false, nil
- })
-
+ }
+ st.mu.Unlock()
+ if sstream2 == nil {
+ t.Fatalf("Didn't find stream corresponding to client cstream.id: %v on the server", cstream2.id)
+ }
// Server should be able to send data on the new stream, even though the client hasn't read anything on the first stream.
- <-st.writableChan
- if err := st.framer.writeData(true, sstream2.id, true, make([]byte, defaultWindowSize)); err != nil {
- st.writableChan <- 0
+ if err := st.Write(sstream2, []byte{}, make([]byte, defaultWindowSize), &Options{}); err != nil {
t.Fatalf("Server failed to write data. Err: %v", err)
}
- st.writableChan <- 0
// Client should be able to read data on second stream.
if _, err := cstream2.Read(make([]byte, defaultWindowSize)); err != nil {
@@ -1305,7 +1311,7 @@ func TestServerConnDecoupledFromApplicationRead(t *testing.T) {
t.Fatalf("Failed to create 1st stream. Err: %v", err)
}
// Exhaust server's connection window.
- if err := client.Write(cstream1, make([]byte, defaultWindowSize), nil, &Options{Last: true}); err != nil {
+ if err := client.Write(cstream1, nil, make([]byte, defaultWindowSize), &Options{Last: true}); err != nil {
t.Fatalf("Client failed to write data. Err: %v", err)
}
//Client should be able to create another stream and send data on it.
@@ -1313,7 +1319,7 @@ func TestServerConnDecoupledFromApplicationRead(t *testing.T) {
if err != nil {
t.Fatalf("Failed to create 2nd stream. Err: %v", err)
}
- if err := client.Write(cstream2, make([]byte, defaultWindowSize), nil, &Options{}); err != nil {
+ if err := client.Write(cstream2, nil, make([]byte, defaultWindowSize), &Options{}); err != nil {
t.Fatalf("Client failed to write data. Err: %v", err)
}
// Get the streams on server.
@@ -1336,11 +1342,7 @@ func TestServerConnDecoupledFromApplicationRead(t *testing.T) {
st.mu.Unlock()
// Trying to write more on a max-ed out stream should result in a RST_STREAM from the server.
ct := client.(*http2Client)
- <-ct.writableChan
- if err := ct.framer.writeData(true, cstream2.id, true, make([]byte, 1)); err != nil {
- t.Fatalf("Client failed to write. Err: %v", err)
- }
- ct.writableChan <- 0
+ ct.controlBuf.put(&dataFrame{cstream2.id, true, make([]byte, 1), func() {}})
code := http2ErrConvTab[http2.ErrCodeFlowControl]
waitWhileTrue(t, func() (bool, error) {
cstream2.mu.Lock()
@@ -1362,7 +1364,15 @@ func TestServerConnDecoupledFromApplicationRead(t *testing.T) {
}
func TestServerWithMisbehavedClient(t *testing.T) {
- server, ct := setUp(t, 0, math.MaxUint32, suspended)
+ serverConfig := &ServerConfig{
+ InitialWindowSize: defaultWindowSize,
+ InitialConnWindowSize: defaultWindowSize,
+ }
+ connectOptions := ConnectOptions{
+ InitialWindowSize: defaultWindowSize,
+ InitialConnWindowSize: defaultWindowSize,
+ }
+ server, ct := setUpWithOptions(t, 0, serverConfig, suspended, connectOptions)
callHdr := &CallHdr{
Host: "localhost",
Method: "foo",
@@ -1397,11 +1407,7 @@ func TestServerWithMisbehavedClient(t *testing.T) {
}
var sent int
// Drain the stream flow control window
- <-cc.writableChan
- if err = cc.framer.writeData(true, s.id, false, make([]byte, http2MaxFrameLen)); err != nil {
- t.Fatalf("Failed to write data: %v", err)
- }
- cc.writableChan <- 0
+ cc.controlBuf.put(&dataFrame{s.id, false, make([]byte, http2MaxFrameLen), func() {}})
sent += http2MaxFrameLen
// Wait until the server creates the corresponding stream and receive some data.
var ss *Stream
@@ -1426,11 +1432,7 @@ func TestServerWithMisbehavedClient(t *testing.T) {
}
// Keep sending until the server inbound window is drained for that stream.
for sent <= initialWindowSize {
- <-cc.writableChan
- if err = cc.framer.writeData(true, s.id, false, make([]byte, 1)); err != nil {
- t.Fatalf("Failed to write data: %v", err)
- }
- cc.writableChan <- 0
+ cc.controlBuf.put(&dataFrame{s.id, false, make([]byte, 1), func() {}})
sent++
}
// Server sent a resetStream for s already.
@@ -1468,7 +1470,7 @@ func TestClientWithMisbehavedServer(t *testing.T) {
t.Fatalf("Failed to open stream: %v", err)
}
d := make([]byte, 1)
- if err := ct.Write(s, d, nil, &Options{Last: true, Delay: false}); err != nil && err != io.EOF {
+ if err := ct.Write(s, nil, d, &Options{Last: true, Delay: false}); err != nil && err != io.EOF {
t.Fatalf("Failed to write: %v", err)
}
// Read without window update.
@@ -1510,7 +1512,7 @@ func TestEncodingRequiredStatus(t *testing.T) {
Last: true,
Delay: false,
}
- if err := ct.Write(s, expectedRequest, nil, &opts); err != nil && err != io.EOF {
+ if err := ct.Write(s, nil, expectedRequest, &opts); err != nil && err != io.EOF {
t.Fatalf("Failed to write the request: %v", err)
}
p := make([]byte, http2MaxFrameLen)
@@ -1538,7 +1540,7 @@ func TestInvalidHeaderField(t *testing.T) {
Last: true,
Delay: false,
}
- if err := ct.Write(s, expectedRequest, nil, &opts); err != nil && err != io.EOF {
+ if err := ct.Write(s, nil, expectedRequest, &opts); err != nil && err != io.EOF {
t.Fatalf("Failed to write the request: %v", err)
}
p := make([]byte, http2MaxFrameLen)
@@ -1690,7 +1692,12 @@ func testAccountCheckWindowSize(t *testing.T, wc windowSizeConfig) {
})
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
- serverSendQuota, err := wait(ctx, nil, nil, nil, st.sendQuotaPool.acquire())
+ serverSendQuota, _, err := st.sendQuotaPool.get(math.MaxInt32, waiters{
+ ctx: ctx,
+ tctx: st.ctx,
+ done: nil,
+ goAway: nil,
+ })
if err != nil {
t.Fatalf("Error while acquiring sendQuota on server. Err: %v", err)
}
@@ -1712,7 +1719,12 @@ func testAccountCheckWindowSize(t *testing.T, wc windowSizeConfig) {
t.Fatalf("Client transport flow control window size is %v, want %v", limit, connectOptions.InitialConnWindowSize)
}
ctx, cancel = context.WithTimeout(context.Background(), time.Second)
- clientSendQuota, err := wait(ctx, nil, nil, nil, ct.sendQuotaPool.acquire())
+ clientSendQuota, _, err := ct.sendQuotaPool.get(math.MaxInt32, waiters{
+ ctx: ctx,
+ tctx: ct.ctx,
+ done: nil,
+ goAway: nil,
+ })
if err != nil {
t.Fatalf("Error while acquiring sendQuota on client. Err: %v", err)
}
@@ -1781,7 +1793,7 @@ func TestAccountCheckExpandingWindow(t *testing.T) {
opts := Options{}
header := make([]byte, 5)
for i := 1; i <= 10; i++ {
- if err := ct.Write(cstream, buf, nil, &opts); err != nil {
+ if err := ct.Write(cstream, nil, buf, &opts); err != nil {
t.Fatalf("Error on client while writing message: %v", err)
}
if _, err := cstream.Read(header); err != nil {
@@ -1796,6 +1808,12 @@ func TestAccountCheckExpandingWindow(t *testing.T) {
t.Fatalf("Length of message received by client: %v, want: %v", len(recvMsg), len(msg))
}
}
+ defer func() {
+ ct.Write(cstream, nil, nil, &Options{Last: true}) // Close the stream.
+ if _, err := cstream.Read(header); err != io.EOF {
+ t.Fatalf("Client expected an EOF from the server. Got: %v", err)
+ }
+ }()
var sstream *Stream
st.mu.Lock()
for _, v := range st.activeStreams {
@@ -1848,7 +1866,12 @@ func TestAccountCheckExpandingWindow(t *testing.T) {
// Check flow conrtrol window on client stream is equal to out flow on server stream.
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
- serverStreamSendQuota, err := wait(ctx, nil, nil, nil, sstream.sendQuotaPool.acquire())
+ serverStreamSendQuota, _, err := sstream.sendQuotaPool.get(math.MaxInt32, waiters{
+ ctx: ctx,
+ tctx: context.Background(),
+ done: nil,
+ goAway: nil,
+ })
cancel()
if err != nil {
return true, fmt.Errorf("error while acquiring server stream send quota. Err: %v", err)
@@ -1863,7 +1886,12 @@ func TestAccountCheckExpandingWindow(t *testing.T) {
// Check flow control window on server stream is equal to out flow on client stream.
ctx, cancel = context.WithTimeout(context.Background(), time.Second)
- clientStreamSendQuota, err := wait(ctx, nil, nil, nil, cstream.sendQuotaPool.acquire())
+ clientStreamSendQuota, _, err := cstream.sendQuotaPool.get(math.MaxInt32, waiters{
+ ctx: ctx,
+ tctx: context.Background(),
+ done: nil,
+ goAway: nil,
+ })
cancel()
if err != nil {
return true, fmt.Errorf("error while acquiring client stream send quota. Err: %v", err)
@@ -1878,7 +1906,12 @@ func TestAccountCheckExpandingWindow(t *testing.T) {
// Check flow control window on client transport is equal to out flow of server transport.
ctx, cancel = context.WithTimeout(context.Background(), time.Second)
- serverTrSendQuota, err := wait(ctx, nil, nil, nil, st.sendQuotaPool.acquire())
+ serverTrSendQuota, _, err := st.sendQuotaPool.get(math.MaxInt32, waiters{
+ ctx: ctx,
+ tctx: st.ctx,
+ done: nil,
+ goAway: nil,
+ })
cancel()
if err != nil {
return true, fmt.Errorf("error while acquring server transport send quota. Err: %v", err)
@@ -1893,7 +1926,12 @@ func TestAccountCheckExpandingWindow(t *testing.T) {
// Check flow control window on server transport is equal to out flow of client transport.
ctx, cancel = context.WithTimeout(context.Background(), time.Second)
- clientTrSendQuota, err := wait(ctx, nil, nil, nil, ct.sendQuotaPool.acquire())
+ clientTrSendQuota, _, err := ct.sendQuotaPool.get(math.MaxInt32, waiters{
+ ctx: ctx,
+ tctx: ct.ctx,
+ done: nil,
+ goAway: nil,
+ })
cancel()
if err != nil {
return true, fmt.Errorf("error while acquiring client transport send quota. Err: %v", err)
@@ -1943,15 +1981,12 @@ func writeOneHeader(framer *http2.Framer, sid uint32, httpStatus int) error {
var buf bytes.Buffer
henc := hpack.NewEncoder(&buf)
henc.WriteField(hpack.HeaderField{Name: ":status", Value: fmt.Sprint(httpStatus)})
- if err := framer.WriteHeaders(http2.HeadersFrameParam{
+ return framer.WriteHeaders(http2.HeadersFrameParam{
StreamID: sid,
BlockFragment: buf.Bytes(),
EndStream: true,
EndHeaders: true,
- }); err != nil {
- return err
- }
- return nil
+ })
}
func writeTwoHeaders(framer *http2.Framer, sid uint32, httpStatus int) error {
@@ -1973,15 +2008,12 @@ func writeTwoHeaders(framer *http2.Framer, sid uint32, httpStatus int) error {
Name: ":status",
Value: fmt.Sprint(httpStatus),
})
- if err := framer.WriteHeaders(http2.HeadersFrameParam{
+ return framer.WriteHeaders(http2.HeadersFrameParam{
StreamID: sid,
BlockFragment: buf.Bytes(),
EndStream: true,
EndHeaders: true,
- }); err != nil {
- return err
- }
- return nil
+ })
}
type httpServer struct {
@@ -2005,8 +2037,8 @@ func (s *httpServer) start(t *testing.T, lis net.Listener) {
t.Errorf("Error at server-side while reading preface from cleint. Err: %v", err)
return
}
- reader := bufio.NewReaderSize(s.conn, http2IOBufSize)
- writer := bufio.NewWriterSize(s.conn, http2IOBufSize)
+ reader := bufio.NewReaderSize(s.conn, defaultWriteBufSize)
+ writer := bufio.NewWriterSize(s.conn, defaultReadBufSize)
framer := http2.NewFramer(writer, reader)
if err = framer.WriteSettingsAck(); err != nil {
t.Errorf("Error at server-side while sending Settings ack. Err: %v", err)
@@ -2071,8 +2103,10 @@ func setUpHTTPStatusTest(t *testing.T, httpStatus int, wh writeHeaders) (stream
wh: wh,
}
server.start(t, lis)
- client, err = newHTTP2Client(context.Background(), TargetInfo{Addr: lis.Addr().String()}, ConnectOptions{})
+ connectCtx, cancel := context.WithDeadline(context.Background(), time.Now().Add(2*time.Second))
+ client, err = newHTTP2Client(connectCtx, context.Background(), TargetInfo{Addr: lis.Addr().String()}, ConnectOptions{}, func() {})
if err != nil {
+ cancel() // Do not cancel in success path.
t.Fatalf("Error creating client. Err: %v", err)
}
stream, err = client.NewStream(context.Background(), &CallHdr{Method: "bogus/method", Flush: true})
@@ -2172,3 +2206,73 @@ func TestReadGivesSameErrorAfterAnyErrorOccurs(t *testing.T) {
}
}
}
+
+func TestPingPong1B(t *testing.T) {
+ runPingPongTest(t, 1)
+}
+
+func TestPingPong1KB(t *testing.T) {
+ runPingPongTest(t, 1024)
+}
+
+func TestPingPong64KB(t *testing.T) {
+ runPingPongTest(t, 65536)
+}
+
+func TestPingPong1MB(t *testing.T) {
+ runPingPongTest(t, 1048576)
+}
+
+//This is a stress-test of flow control logic.
+func runPingPongTest(t *testing.T, msgSize int) {
+ server, client := setUp(t, 0, 0, pingpong)
+ defer server.stop()
+ defer client.Close()
+ waitWhileTrue(t, func() (bool, error) {
+ server.mu.Lock()
+ defer server.mu.Unlock()
+ if len(server.conns) == 0 {
+ return true, fmt.Errorf("timed out while waiting for server transport to be created")
+ }
+ return false, nil
+ })
+ ct := client.(*http2Client)
+ stream, err := client.NewStream(context.Background(), &CallHdr{})
+ if err != nil {
+ t.Fatalf("Failed to create stream. Err: %v", err)
+ }
+ msg := make([]byte, msgSize)
+ outgoingHeader := make([]byte, 5)
+ outgoingHeader[0] = byte(0)
+ binary.BigEndian.PutUint32(outgoingHeader[1:], uint32(msgSize))
+ opts := &Options{}
+ incomingHeader := make([]byte, 5)
+ done := make(chan struct{})
+ go func() {
+ timer := time.NewTimer(time.Second * 5)
+ <-timer.C
+ close(done)
+ }()
+ for {
+ select {
+ case <-done:
+ ct.Write(stream, nil, nil, &Options{Last: true})
+ if _, err := stream.Read(incomingHeader); err != io.EOF {
+ t.Fatalf("Client expected EOF from the server. Got: %v", err)
+ }
+ return
+ default:
+ if err := ct.Write(stream, outgoingHeader, msg, opts); err != nil {
+ t.Fatalf("Error on client while writing message. Err: %v", err)
+ }
+ if _, err := stream.Read(incomingHeader); err != nil {
+ t.Fatalf("Error on client while reading data header. Err: %v", err)
+ }
+ sz := binary.BigEndian.Uint32(incomingHeader[1:])
+ recvMsg := make([]byte, int(sz))
+ if _, err := stream.Read(recvMsg); err != nil {
+ t.Fatalf("Error on client while reading data. Err: %v", err)
+ }
+ }
+ }
+}
diff --git a/vendor/google.golang.org/grpc/vet.sh b/vendor/google.golang.org/grpc/vet.sh
index e18fb29..2ad94fe 100755
--- a/vendor/google.golang.org/grpc/vet.sh
+++ b/vendor/google.golang.org/grpc/vet.sh
@@ -8,16 +8,7 @@ die() {
exit 1
}
-# TODO: Remove this check and the mangling below once "context" is imported
-# directly.
-if git status --porcelain | read; then
- die "Uncommitted or untracked files found; commit changes first"
-fi
-# Undo any edits made by this script.
-cleanup() {
- git reset --hard HEAD
-}
-trap cleanup EXIT
+PATH="$GOPATH/bin:$GOROOT/bin:$PATH"
# Check proto in manual runs or cron runs.
if [[ "$TRAVIS" != "true" || "$TRAVIS_EVENT_TYPE" = "cron" ]]; then
@@ -31,15 +22,17 @@ if [ "$1" = "-install" ]; then
github.com/golang/lint/golint \
golang.org/x/tools/cmd/goimports \
honnef.co/go/tools/cmd/staticcheck \
- github.com/golang/protobuf/protoc-gen-go \
- golang.org/x/tools/cmd/stringer
+ github.com/client9/misspell/cmd/misspell \
+ github.com/golang/protobuf/protoc-gen-go
if [[ "$check_proto" = "true" ]]; then
if [[ "$TRAVIS" = "true" ]]; then
PROTOBUF_VERSION=3.3.0
- cd /home/travis
- wget https://github.com/google/protobuf/releases/download/v$PROTOBUF_VERSION/$basename-linux-x86_64.zip
- unzip $basename-linux-x86_64.zip
+ PROTOC_FILENAME=protoc-${PROTOBUF_VERSION}-linux-x86_64.zip
+ pushd /home/travis
+ wget https://github.com/google/protobuf/releases/download/v${PROTOBUF_VERSION}/${PROTOC_FILENAME}
+ unzip ${PROTOC_FILENAME}
bin/protoc --version
+ popd
elif ! which protoc > /dev/null; then
die "Please install protoc into your path"
fi
@@ -49,26 +42,43 @@ elif [[ "$#" -ne 0 ]]; then
die "Unknown argument(s): $*"
fi
+# TODO: Remove this check and the mangling below once "context" is imported
+# directly.
+if git status --porcelain | read; then
+ die "Uncommitted or untracked files found; commit changes first"
+fi
+
git ls-files "*.go" | xargs grep -L "\(Copyright [0-9]\{4,\} gRPC authors\)\|DO NOT EDIT" 2>&1 | tee /dev/stderr | (! read)
gofmt -s -d -l . 2>&1 | tee /dev/stderr | (! read)
goimports -l . 2>&1 | tee /dev/stderr | (! read)
-golint ./... 2>&1 | (grep -vE "(_mock|_string|\.pb)\.go:" || true) | tee /dev/stderr | (! read)
+golint ./... 2>&1 | (grep -vE "(_mock|\.pb)\.go:" || true) | tee /dev/stderr | (! read)
+
+# Undo any edits made by this script.
+cleanup() {
+ git reset --hard HEAD
+}
+trap cleanup EXIT
# Rewrite golang.org/x/net/context -> context imports (see grpc/grpc-go#1484).
# TODO: Remove this mangling once "context" is imported directly (grpc/grpc-go#711).
git ls-files "*.go" | xargs sed -i 's:"golang.org/x/net/context":"context":'
set +o pipefail
# TODO: Stop filtering pb.go files once golang/protobuf#214 is fixed.
-# TODO: Remove clientconn exception once go1.6 support is removed.
-go tool vet -all . 2>&1 | grep -vE 'clientconn.go:.*cancel' | grep -vF '.pb.go:' | tee /dev/stderr | (! read)
+go tool vet -all . 2>&1 | grep -vE '(clientconn|transport\/transport_test).go:.*cancel (function|var)' | grep -vF '.pb.go:' | tee /dev/stderr | (! read)
set -o pipefail
git reset --hard HEAD
if [[ "$check_proto" = "true" ]]; then
- PATH=/home/travis/bin:$PATH make proto && \
+ PATH="/home/travis/bin:$PATH" make proto && \
git status --porcelain 2>&1 | (! read) || \
(git status; git --no-pager diff; exit 1)
fi
# TODO(menghanl): fix errors in transport_test.
-staticcheck -ignore google.golang.org/grpc/transport/transport_test.go:SA2002 ./...
+staticcheck -ignore '
+google.golang.org/grpc/transport/transport_test.go:SA2002
+google.golang.org/grpc/benchmark/benchmain/main.go:SA1019
+google.golang.org/grpc/stats/stats_test.go:SA1019
+google.golang.org/grpc/test/end2end_test.go:SA1019
+' ./...
+misspell -error .
diff --git a/vendor/gopkg.in/alecthomas/kingpin.v2/README.md b/vendor/gopkg.in/alecthomas/kingpin.v2/README.md
index cd4edeb..498704c 100644
--- a/vendor/gopkg.in/alecthomas/kingpin.v2/README.md
+++ b/vendor/gopkg.in/alecthomas/kingpin.v2/README.md
@@ -222,7 +222,7 @@ Args:
IP address to ping.
[] Number of packets to send
$ ping 1.2.3.4 5
-Would ping: 1.2.3.4 with timeout 5s and count 0
+Would ping: 1.2.3.4 with timeout 5s and count 5
```
From the following source:
@@ -461,7 +461,7 @@ Here are some examples of flags with various permutations:
--name=NAME // Flag(...).String()
--name="Harry" // Flag(...).Default("Harry").String()
- --name=FULL-NAME // flag(...).PlaceHolder("FULL-NAME").Default("Harry").String()
+ --name=FULL-NAME // Flag(...).PlaceHolder("FULL-NAME").Default("Harry").String()
### Consuming all remaining arguments
diff --git a/vendor/gopkg.in/alecthomas/kingpin.v2/app.go b/vendor/gopkg.in/alecthomas/kingpin.v2/app.go
index a5e8b80..1a1a5ef 100644
--- a/vendor/gopkg.in/alecthomas/kingpin.v2/app.go
+++ b/vendor/gopkg.in/alecthomas/kingpin.v2/app.go
@@ -402,6 +402,9 @@ func (a *Application) setDefaults(context *ParseContext) error {
flagElements := map[string]*ParseElement{}
for _, element := range context.Elements {
if flag, ok := element.Clause.(*FlagClause); ok {
+ if flag.name == "help" {
+ return nil
+ }
flagElements[flag.name] = element
}
}
diff --git a/vendor/gopkg.in/alecthomas/kingpin.v2/app_test.go b/vendor/gopkg.in/alecthomas/kingpin.v2/app_test.go
index 993e25c..b9083a6 100644
--- a/vendor/gopkg.in/alecthomas/kingpin.v2/app_test.go
+++ b/vendor/gopkg.in/alecthomas/kingpin.v2/app_test.go
@@ -3,7 +3,7 @@ package kingpin
import (
"io/ioutil"
- "github.com/alecthomas/assert"
+ "github.com/stretchr/testify/assert"
"sort"
"strings"
diff --git a/vendor/gopkg.in/alecthomas/kingpin.v2/args_test.go b/vendor/gopkg.in/alecthomas/kingpin.v2/args_test.go
index f2837ec..c16a630 100644
--- a/vendor/gopkg.in/alecthomas/kingpin.v2/args_test.go
+++ b/vendor/gopkg.in/alecthomas/kingpin.v2/args_test.go
@@ -5,7 +5,7 @@ import (
"os"
"testing"
- "github.com/alecthomas/assert"
+ "github.com/stretchr/testify/assert"
)
func TestArgRemainder(t *testing.T) {
diff --git a/vendor/gopkg.in/alecthomas/kingpin.v2/cmd_test.go b/vendor/gopkg.in/alecthomas/kingpin.v2/cmd_test.go
index b1207be..d531589 100644
--- a/vendor/gopkg.in/alecthomas/kingpin.v2/cmd_test.go
+++ b/vendor/gopkg.in/alecthomas/kingpin.v2/cmd_test.go
@@ -4,7 +4,7 @@ import (
"sort"
"strings"
- "github.com/alecthomas/assert"
+ "github.com/stretchr/testify/assert"
"testing"
)
diff --git a/vendor/gopkg.in/alecthomas/kingpin.v2/completions_test.go b/vendor/gopkg.in/alecthomas/kingpin.v2/completions_test.go
index 74656ea..7da9c06 100644
--- a/vendor/gopkg.in/alecthomas/kingpin.v2/completions_test.go
+++ b/vendor/gopkg.in/alecthomas/kingpin.v2/completions_test.go
@@ -3,7 +3,7 @@ package kingpin
import (
"testing"
- "github.com/alecthomas/assert"
+ "github.com/stretchr/testify/assert"
)
func TestResolveWithBuiltin(t *testing.T) {
diff --git a/vendor/gopkg.in/alecthomas/kingpin.v2/flags_test.go b/vendor/gopkg.in/alecthomas/kingpin.v2/flags_test.go
index 9c83a1c..29327e6 100644
--- a/vendor/gopkg.in/alecthomas/kingpin.v2/flags_test.go
+++ b/vendor/gopkg.in/alecthomas/kingpin.v2/flags_test.go
@@ -4,7 +4,7 @@ import (
"io/ioutil"
"os"
- "github.com/alecthomas/assert"
+ "github.com/stretchr/testify/assert"
"testing"
)
diff --git a/vendor/gopkg.in/alecthomas/kingpin.v2/parser.go b/vendor/gopkg.in/alecthomas/kingpin.v2/parser.go
index efa198a..2a18351 100644
--- a/vendor/gopkg.in/alecthomas/kingpin.v2/parser.go
+++ b/vendor/gopkg.in/alecthomas/kingpin.v2/parser.go
@@ -153,6 +153,10 @@ func (p *ParseContext) EOL() bool {
return p.Peek().Type == TokenEOL
}
+func (p *ParseContext) Error() bool {
+ return p.Peek().Type == TokenError
+}
+
// Next token in the parse context.
func (p *ParseContext) Next() *Token {
if len(p.peek) > 0 {
@@ -266,9 +270,12 @@ func (p *ParseContext) matchedCmd(cmd *CmdClause) {
// Expand arguments from a file. Lines starting with # will be treated as comments.
func ExpandArgsFromFile(filename string) (out []string, err error) {
+ if filename == "" {
+ return nil, fmt.Errorf("expected @ file to expand arguments from")
+ }
r, err := os.Open(filename)
if err != nil {
- return nil, err
+ return nil, fmt.Errorf("failed to open arguments file %q: %s", filename, err)
}
defer r.Close()
scanner := bufio.NewScanner(r)
@@ -280,6 +287,9 @@ func ExpandArgsFromFile(filename string) (out []string, err error) {
out = append(out, line)
}
err = scanner.Err()
+ if err != nil {
+ return nil, fmt.Errorf("failed to read arguments from %q: %s", filename, err)
+ }
return
}
@@ -291,7 +301,7 @@ func parse(context *ParseContext, app *Application) (err error) {
ignoreDefault := context.ignoreDefault
loop:
- for !context.EOL() {
+ for !context.EOL() && !context.Error() {
token := context.Peek()
switch token.Type {
@@ -365,6 +375,10 @@ loop:
}
}
+ if context.Error() {
+ return fmt.Errorf("%s", context.Peek().Value)
+ }
+
if !context.EOL() {
return fmt.Errorf("unexpected %s", context.Peek())
}
diff --git a/vendor/gopkg.in/alecthomas/kingpin.v2/parser_test.go b/vendor/gopkg.in/alecthomas/kingpin.v2/parser_test.go
index 71bafe5..43dfde9 100644
--- a/vendor/gopkg.in/alecthomas/kingpin.v2/parser_test.go
+++ b/vendor/gopkg.in/alecthomas/kingpin.v2/parser_test.go
@@ -5,7 +5,7 @@ import (
"os"
"testing"
- "github.com/alecthomas/assert"
+ "github.com/stretchr/testify/assert"
)
func TestParserExpandFromFile(t *testing.T) {
diff --git a/vendor/gopkg.in/alecthomas/kingpin.v2/parsers_test.go b/vendor/gopkg.in/alecthomas/kingpin.v2/parsers_test.go
index 04e836c..81708c7 100644
--- a/vendor/gopkg.in/alecthomas/kingpin.v2/parsers_test.go
+++ b/vendor/gopkg.in/alecthomas/kingpin.v2/parsers_test.go
@@ -6,7 +6,7 @@ import (
"net/url"
"os"
- "github.com/alecthomas/assert"
+ "github.com/stretchr/testify/assert"
"testing"
)
diff --git a/vendor/gopkg.in/alecthomas/kingpin.v2/usage_test.go b/vendor/gopkg.in/alecthomas/kingpin.v2/usage_test.go
index 441b90c..2b81857 100644
--- a/vendor/gopkg.in/alecthomas/kingpin.v2/usage_test.go
+++ b/vendor/gopkg.in/alecthomas/kingpin.v2/usage_test.go
@@ -5,7 +5,7 @@ import (
"strings"
"testing"
- "github.com/alecthomas/assert"
+ "github.com/stretchr/testify/assert"
)
func TestFormatTwoColumns(t *testing.T) {
diff --git a/vendor/gopkg.in/alecthomas/kingpin.v2/values_test.go b/vendor/gopkg.in/alecthomas/kingpin.v2/values_test.go
index d88f667..e16ee2a 100644
--- a/vendor/gopkg.in/alecthomas/kingpin.v2/values_test.go
+++ b/vendor/gopkg.in/alecthomas/kingpin.v2/values_test.go
@@ -3,7 +3,7 @@ package kingpin
import (
"net"
- "github.com/alecthomas/assert"
+ "github.com/stretchr/testify/assert"
"testing"
)