init
This commit is contained in:
		
							parent
							
								
									0cf71ee320
								
							
						
					
					
						commit
						7ef000f6ed
					
				| 
						 | 
					@ -75,10 +75,10 @@ func (codec *VarCodec) DecodeNVarUInt64(buffer []byte, value *uint64) error {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SizeOfNVarInt return the buffer size after encoding value as NVarInt
 | 
					// SizeOfNVarInt return the buffer size after encoding value as NVarInt
 | 
				
			||||||
func sizeOfNVarInt(value int64, width int) int {
 | 
					func sizeOfNVarInt(value int64, width int) int {
 | 
				
			||||||
	const unit = 8 // bit width of encoding unit
 | 
						const unit = 8 // a bit width of encoding unit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var lead = value >> (width - 1)
 | 
						var lead = value >> (width - 1)
 | 
				
			||||||
	for size := width / unit - 1; size > 0; size-- {
 | 
						for size := width/unit - 1; size > 0; size-- {
 | 
				
			||||||
		var lookAhead = value >> (size*unit - 1)
 | 
							var lookAhead = value >> (size*unit - 1)
 | 
				
			||||||
		if lookAhead != lead {
 | 
							if lookAhead != lead {
 | 
				
			||||||
			return size + 1
 | 
								return size + 1
 | 
				
			||||||
| 
						 | 
					@ -92,7 +92,7 @@ func (codec *VarCodec) encodeNVarInt(buffer []byte, value int64) error {
 | 
				
			||||||
		return errors.New("nothing to encode")
 | 
							return errors.New("nothing to encode")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const unit = 8 // bit width of encoding unit
 | 
						const unit = 8 // a bit width of encoding unit
 | 
				
			||||||
	for codec.Size > 0 {
 | 
						for codec.Size > 0 {
 | 
				
			||||||
		if codec.Ptr >= len(buffer) {
 | 
							if codec.Ptr >= len(buffer) {
 | 
				
			||||||
			return ErrBufferInsufficient
 | 
								return ErrBufferInsufficient
 | 
				
			||||||
| 
						 | 
					@ -110,7 +110,7 @@ func (codec *VarCodec) decodeNVarInt(buffer []byte, value *int64) error {
 | 
				
			||||||
		return errors.New("nothing to decode")
 | 
							return errors.New("nothing to decode")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const unit = 8      // bit width of encoding unit
 | 
						const unit = 8      // a bit width of encoding unit
 | 
				
			||||||
	if codec.Size > 0 { // initialize sign bit
 | 
						if codec.Size > 0 { // initialize sign bit
 | 
				
			||||||
		if codec.Ptr >= len(buffer) {
 | 
							if codec.Ptr >= len(buffer) {
 | 
				
			||||||
			return ErrBufferInsufficient
 | 
								return ErrBufferInsufficient
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -74,7 +74,7 @@ func (codec *VarCodec) DecodePVarUInt64(buffer []byte, value *uint64) error {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func sizeOfPVarInt(value int64, width int) int {
 | 
					func sizeOfPVarInt(value int64, width int) int {
 | 
				
			||||||
	const unit = 7 // bit width of encoding unit
 | 
						const unit = 7 // a bit width of encoding unit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var lead = value >> (width - 1)
 | 
						var lead = value >> (width - 1)
 | 
				
			||||||
	for size := width / unit; size > 0; size-- {
 | 
						for size := width / unit; size > 0; size-- {
 | 
				
			||||||
| 
						 | 
					@ -94,7 +94,7 @@ func (codec *VarCodec) encodePVarInt(buffer []byte, value int64) error {
 | 
				
			||||||
		return ErrBufferInsufficient
 | 
							return ErrBufferInsufficient
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const unit = 7       // bit width of encoding unit
 | 
						const unit = 7       // a bit width of encoding unit
 | 
				
			||||||
	const more = -1 << 7 // continuation bits
 | 
						const more = -1 << 7 // continuation bits
 | 
				
			||||||
	for codec.Size > 1 {
 | 
						for codec.Size > 1 {
 | 
				
			||||||
		codec.Size--
 | 
							codec.Size--
 | 
				
			||||||
| 
						 | 
					@ -123,9 +123,9 @@ func (codec *VarCodec) decodePVarInt(buffer []byte, value *int64) error {
 | 
				
			||||||
		return ErrBufferInsufficient
 | 
							return ErrBufferInsufficient
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const unit = 7 // bit width of encoding unit
 | 
						const unit = 7       // a bit width of encoding unit
 | 
				
			||||||
	if codec.Size == 0 { // initialize sign bit
 | 
						if codec.Size == 0 { // initialize sign bit
 | 
				
			||||||
		const flag = 8 - unit // bit width for non-encoding bits
 | 
							const flag = 8 - unit // a bit of width for non-encoding bits
 | 
				
			||||||
		*value = int64(int8(buffer[codec.Ptr]) << flag >> unit)
 | 
							*value = int64(int8(buffer[codec.Ptr]) << flag >> unit)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -135,7 +135,7 @@ func (codec *VarCodec) decodePVarInt(buffer []byte, value *int64) error {
 | 
				
			||||||
		codec.Ptr++
 | 
							codec.Ptr++
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		codec.Size++
 | 
							codec.Size++
 | 
				
			||||||
		*value = (*value << unit) | int64(mask & part)
 | 
							*value = (*value << unit) | int64(mask&part)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if part >= 0 { // it's the last byte
 | 
							if part >= 0 { // it's the last byte
 | 
				
			||||||
			return nil
 | 
								return nil
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,11 +43,11 @@ func (codec *VarCodec) DecodeVarFloat64(buffer []byte, value *float64) error {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func sizeOfVarFloat(bits uint64, width int) int {
 | 
					func sizeOfVarFloat(bits uint64, width int) int {
 | 
				
			||||||
	const unit = 8            // bit width of encoding unit
 | 
						const unit = 8            // a bit width of encoding unit
 | 
				
			||||||
	const mask = uint64(0xFF) // mask of encoding unit
 | 
						const mask = uint64(0xFF) // mask of encoding unit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for s := 0; width > 1; s += unit {
 | 
						for s := 0; width > 1; s += unit {
 | 
				
			||||||
		if bits & (mask << s) != 0 {
 | 
							if bits&(mask<<s) != 0 {
 | 
				
			||||||
			return width
 | 
								return width
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		width--
 | 
							width--
 | 
				
			||||||
| 
						 | 
					@ -68,7 +68,7 @@ func (codec *VarCodec) encodeVarFloat(buffer []byte, bits uint64, width int) err
 | 
				
			||||||
			return ErrBufferInsufficient
 | 
								return ErrBufferInsufficient
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		codec.Size--
 | 
							codec.Size--
 | 
				
			||||||
		buffer[codec.Ptr] = byte(bits >> ((codec.Size & mask + gap) * unit))
 | 
							buffer[codec.Ptr] = byte(bits >> ((codec.Size&mask + gap) * unit))
 | 
				
			||||||
		codec.Ptr++
 | 
							codec.Ptr++
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -99,8 +99,8 @@ func (codec *VarCodec) decodeVarFloat(buffer []byte, bits *uint64, width int) er
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (codec *VarCodec) sizeOfGap(width int) (int, int) {
 | 
					func (codec *VarCodec) sizeOfGap(width int) (int, int) {
 | 
				
			||||||
	var ms = mbit.OnesCount(^uint(0)) // machine bit width for an int
 | 
						var ms = mbit.OnesCount(^uint(0)) // machine a bit of width for an int
 | 
				
			||||||
	var size = ms - 8                 // bit width of effective size
 | 
						var size = ms - 8                 // a bit width of effective size
 | 
				
			||||||
	var mask = -1 ^ (-1 << size)      // mask of effective size
 | 
						var mask = -1 ^ (-1 << size)      // mask of effective size
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var gap = 0 // gap between encoded size and decoded size
 | 
						var gap = 0 // gap between encoded size and decoded size
 | 
				
			||||||
| 
						 | 
					@ -108,7 +108,7 @@ func (codec *VarCodec) sizeOfGap(width int) (int, int) {
 | 
				
			||||||
		if width > codec.Size {
 | 
							if width > codec.Size {
 | 
				
			||||||
			gap = width - codec.Size
 | 
								gap = width - codec.Size
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		var sign = -1 << (ms - 1) // single sign bit for an int
 | 
							var sign = -1 << (ms - 1) // single sign a bit for an int
 | 
				
			||||||
		codec.Size = sign | (gap << size) | (codec.Size & mask)
 | 
							codec.Size = sign | (gap << size) | (codec.Size & mask)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		gap = (codec.Size >> size) & 0x7F
 | 
							gap = (codec.Size >> size) & 0x7F
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										44
									
								
								packet.go
								
								
								
								
							
							
						
						
									
										44
									
								
								packet.go
								
								
								
								
							| 
						 | 
					@ -12,7 +12,7 @@ import (
 | 
				
			||||||
type StreamPacket struct {
 | 
					type StreamPacket struct {
 | 
				
			||||||
	t         spec.T
 | 
						t         spec.T
 | 
				
			||||||
	l         spec.L
 | 
						l         spec.L
 | 
				
			||||||
	vbuf      []byte
 | 
						vBuf      []byte
 | 
				
			||||||
	vr        io.Reader
 | 
						vr        io.Reader
 | 
				
			||||||
	chunkMode bool
 | 
						chunkMode bool
 | 
				
			||||||
	chunkSize int
 | 
						chunkSize int
 | 
				
			||||||
| 
						 | 
					@ -38,8 +38,8 @@ func (p *StreamPacket) Bytes() []byte {
 | 
				
			||||||
	buf := new(bytes.Buffer)
 | 
						buf := new(bytes.Buffer)
 | 
				
			||||||
	// the raw bytes of T and L
 | 
						// the raw bytes of T and L
 | 
				
			||||||
	p.writeTL(buf)
 | 
						p.writeTL(buf)
 | 
				
			||||||
	// p.valbuf stores the raw bytes of V
 | 
						// p.valBuf stores the raw bytes of V
 | 
				
			||||||
	buf.Write(p.vbuf)
 | 
						buf.Write(p.vBuf)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return buf.Bytes()
 | 
						return buf.Bytes()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -47,7 +47,7 @@ func (p *StreamPacket) Bytes() []byte {
 | 
				
			||||||
// VReader return an io.Reader which can be read as the content of V.
 | 
					// VReader return an io.Reader which can be read as the content of V.
 | 
				
			||||||
func (p *StreamPacket) VReader() io.Reader {
 | 
					func (p *StreamPacket) VReader() io.Reader {
 | 
				
			||||||
	if !p.chunkMode {
 | 
						if !p.chunkMode {
 | 
				
			||||||
		return bytes.NewReader(p.vbuf)
 | 
							return bytes.NewReader(p.vBuf)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return p.vr
 | 
						return p.vr
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -60,7 +60,7 @@ func (p *StreamPacket) Reader() io.Reader {
 | 
				
			||||||
		buf := new(bytes.Buffer)
 | 
							buf := new(bytes.Buffer)
 | 
				
			||||||
		buf.Write(p.t.Bytes())
 | 
							buf.Write(p.t.Bytes())
 | 
				
			||||||
		buf.Write(p.l.Bytes())
 | 
							buf.Write(p.l.Bytes())
 | 
				
			||||||
		buf.Write(p.vbuf)
 | 
							buf.Write(p.vBuf)
 | 
				
			||||||
		return buf
 | 
							return buf
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -68,7 +68,7 @@ func (p *StreamPacket) Reader() io.Reader {
 | 
				
			||||||
	// T and L of this packet
 | 
						// T and L of this packet
 | 
				
			||||||
	p.writeTL(buf)
 | 
						p.writeTL(buf)
 | 
				
			||||||
	// V of this packet
 | 
						// V of this packet
 | 
				
			||||||
	buf.Write(p.vbuf)
 | 
						buf.Write(p.vBuf)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &chunkVReader{
 | 
						return &chunkVReader{
 | 
				
			||||||
		buf:        buf,
 | 
							buf:        buf,
 | 
				
			||||||
| 
						 | 
					@ -98,59 +98,59 @@ func (p *StreamPacket) writeTL(buf *bytes.Buffer) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// BytesV return V as bytes
 | 
					// BytesV return V as bytes
 | 
				
			||||||
func (p *StreamPacket) BytesV() []byte {
 | 
					func (p *StreamPacket) BytesV() []byte {
 | 
				
			||||||
	return p.vbuf
 | 
						return p.vBuf
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// UTF8StringV return V as utf-8 string
 | 
					// UTF8StringV return V as utf-8 string
 | 
				
			||||||
func (p *StreamPacket) UTF8StringV() string {
 | 
					func (p *StreamPacket) UTF8StringV() string {
 | 
				
			||||||
	return string(p.vbuf)
 | 
						return string(p.vBuf)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Int32V return V as int32
 | 
					// Int32V return V as int32
 | 
				
			||||||
func (p *StreamPacket) Int32V() (val int32, err error) {
 | 
					func (p *StreamPacket) Int32V() (val int32, err error) {
 | 
				
			||||||
	codec := encoding.VarCodec{Size: len(p.vbuf)}
 | 
						codec := encoding.VarCodec{Size: len(p.vBuf)}
 | 
				
			||||||
	err = codec.DecodeNVarInt32(p.vbuf, &val)
 | 
						err = codec.DecodeNVarInt32(p.vBuf, &val)
 | 
				
			||||||
	return val, err
 | 
						return val, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// UInt32V return V as uint32
 | 
					// UInt32V return V as uint32
 | 
				
			||||||
func (p *StreamPacket) UInt32V() (val uint32, err error) {
 | 
					func (p *StreamPacket) UInt32V() (val uint32, err error) {
 | 
				
			||||||
	codec := encoding.VarCodec{Size: len(p.vbuf)}
 | 
						codec := encoding.VarCodec{Size: len(p.vBuf)}
 | 
				
			||||||
	err = codec.DecodeNVarUInt32(p.vbuf, &val)
 | 
						err = codec.DecodeNVarUInt32(p.vBuf, &val)
 | 
				
			||||||
	return val, err
 | 
						return val, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Int64V return V as int64
 | 
					// Int64V return V as int64
 | 
				
			||||||
func (p *StreamPacket) Int64V() (val int64, err error) {
 | 
					func (p *StreamPacket) Int64V() (val int64, err error) {
 | 
				
			||||||
	codec := encoding.VarCodec{Size: len(p.vbuf)}
 | 
						codec := encoding.VarCodec{Size: len(p.vBuf)}
 | 
				
			||||||
	err = codec.DecodeNVarInt64(p.vbuf, &val)
 | 
						err = codec.DecodeNVarInt64(p.vBuf, &val)
 | 
				
			||||||
	return val, err
 | 
						return val, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// UInt64V return V as uint64
 | 
					// UInt64V return V as uint64
 | 
				
			||||||
func (p *StreamPacket) UInt64V() (val uint64, err error) {
 | 
					func (p *StreamPacket) UInt64V() (val uint64, err error) {
 | 
				
			||||||
	codec := encoding.VarCodec{Size: len(p.vbuf)}
 | 
						codec := encoding.VarCodec{Size: len(p.vBuf)}
 | 
				
			||||||
	err = codec.DecodeNVarUInt64(p.vbuf, &val)
 | 
						err = codec.DecodeNVarUInt64(p.vBuf, &val)
 | 
				
			||||||
	return val, err
 | 
						return val, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Float32V return V as float32
 | 
					// Float32V return V as float32
 | 
				
			||||||
func (p *StreamPacket) Float32V() (val float32, err error) {
 | 
					func (p *StreamPacket) Float32V() (val float32, err error) {
 | 
				
			||||||
	codec := encoding.VarCodec{Size: len(p.vbuf)}
 | 
						codec := encoding.VarCodec{Size: len(p.vBuf)}
 | 
				
			||||||
	err = codec.DecodeVarFloat32(p.vbuf, &val)
 | 
						err = codec.DecodeVarFloat32(p.vBuf, &val)
 | 
				
			||||||
	return val, err
 | 
						return val, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Float64V return V as float64
 | 
					// Float64V return V as float64
 | 
				
			||||||
func (p *StreamPacket) Float64V() (val float64, err error) {
 | 
					func (p *StreamPacket) Float64V() (val float64, err error) {
 | 
				
			||||||
	codec := encoding.VarCodec{Size: len(p.vbuf)}
 | 
						codec := encoding.VarCodec{Size: len(p.vBuf)}
 | 
				
			||||||
	err = codec.DecodeVarFloat64(p.vbuf, &val)
 | 
						err = codec.DecodeVarFloat64(p.vBuf, &val)
 | 
				
			||||||
	return val, err
 | 
						return val, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// BoolV return V as bool
 | 
					// BoolV return V as bool
 | 
				
			||||||
func (p *StreamPacket) BoolV() (val bool, err error) {
 | 
					func (p *StreamPacket) BoolV() (val bool, err error) {
 | 
				
			||||||
	codec := encoding.VarCodec{Size: len(p.vbuf)}
 | 
						codec := encoding.VarCodec{Size: len(p.vBuf)}
 | 
				
			||||||
	err = codec.DecodePVarBool(p.vbuf, &val)
 | 
						err = codec.DecodePVarBool(p.vBuf, &val)
 | 
				
			||||||
	return val, err
 | 
						return val, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,7 +13,7 @@ const (
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	errInvalidSeqID = errors.New("y3.Builder: SeqID should >= 0 and =< 0x3F")
 | 
						errInvalidSeqId = errors.New("coder.Builder: SeqId should >= 0 and =< 0x3F")
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func readByte(reader io.Reader) (byte, error) {
 | 
					func readByte(reader io.Reader) (byte, error) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,13 +12,13 @@ type T byte
 | 
				
			||||||
// will set MSB to T.
 | 
					// will set MSB to T.
 | 
				
			||||||
func NewT(seqID int) (T, error) {
 | 
					func NewT(seqID int) (T, error) {
 | 
				
			||||||
	if seqID < 0 || seqID > maxSeqID {
 | 
						if seqID < 0 || seqID > maxSeqID {
 | 
				
			||||||
		return 0, errInvalidSeqID
 | 
							return 0, errInvalidSeqId
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return T(seqID), nil
 | 
						return T(seqID), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Sid returns the sequenceID of this packet.
 | 
					// Sid returns the sequenceId of this packet.
 | 
				
			||||||
func (t T) Sid() int {
 | 
					func (t T) Sid() int {
 | 
				
			||||||
	return int(t & wipeFlagBits)
 | 
						return int(t & wipeFlagBits)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -29,7 +29,7 @@ func (t T) Bytes() []byte {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IsNodeMode will return true if this packet contains other packets.
 | 
					// IsNodeMode will return true if this packet contains other packets.
 | 
				
			||||||
// Otherwise return flase.
 | 
					// Otherwise, return false.
 | 
				
			||||||
func (t T) IsNodeMode() bool {
 | 
					func (t T) IsNodeMode() bool {
 | 
				
			||||||
	return t&flagBitNode == flagBitNode
 | 
						return t&flagBitNode == flagBitNode
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,9 +4,10 @@ import (
 | 
				
			||||||
	"bytes"
 | 
						"bytes"
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
 | 
					 | 
				
			||||||
	//"git.hpds.cc/Component/mq_coder/encoding"
 | 
					 | 
				
			||||||
	"mq_coder/encoding"
 | 
						"mq_coder/encoding"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"git.hpds.cc/Component/mq_coder/encoding"
 | 
				
			||||||
 | 
						//"mq_coder/encoding"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// L is the Length in a TLV structure
 | 
					// L is the Length in a TLV structure
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue