diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 91e9621387..34c21c84d7 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -74,6 +74,7 @@ jobs: go test -json -v -p 4 -tags=release_checks,solccheck . 2>&1 | gotestfmt -hide=all | tee -a /tmp/gotest.log go test -json -v -p 4 -tags=prover_checks ./test/... 2>&1 | gotestfmt -hide=all | tee -a /tmp/gotest.log go test -json -v -p 4 -tags=prover_checks ./examples/... 2>&1 | gotestfmt -hide=all | tee -a /tmp/gotest.log + go test -json -v -run=NONE -fuzz=FuzzIntcomp -fuzztime=30s ./internal/backend/ioutils 2>&1 | gotestfmt -hide=all | tee -a /tmp/gotest.log - name: Generate job summary id: generate-job-summary diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 78df2d0b36..886ffb3559 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -80,6 +80,7 @@ jobs: go test -v -p 4 -tags=release_checks,solccheck . go test -v -p 4 -timeout=50m -tags=release_checks -race ./examples/cubic/... go test -v -p 4 -timeout=50m -tags=release_checks -short -race ./test/... + go test -v -run=NONE -fuzz=FuzzIntcomp -fuzztime=30s ./internal/backend/ioutils slack-workflow-status-failed: diff --git a/README.md b/README.md index e222cd5411..294be110f3 100644 --- a/README.md +++ b/README.md @@ -120,7 +120,7 @@ func main() { #### Icicle Library -The following schemes and curves support experimental use of Ingomyama's Icicle GPU library for low level zk-SNARK primitives such as MSM, NTT, and polynomial operations: +The following schemes and curves support experimental use of Ingonyama's Icicle GPU library for low level zk-SNARK primitives such as MSM, NTT, and polynomial operations: - [x] [Groth16](https://eprint.iacr.org/2016/260) diff --git a/backend/groth16/bls12-377/marshal.go b/backend/groth16/bls12-377/marshal.go index 525315efc2..ee8facd1e6 100644 --- a/backend/groth16/bls12-377/marshal.go +++ b/backend/groth16/bls12-377/marshal.go @@ -20,6 +20,7 @@ import ( curve "github.com/consensys/gnark-crypto/ecc/bls12-377" "github.com/consensys/gnark-crypto/ecc/bls12-377/fr/pedersen" + "github.com/consensys/gnark-crypto/utils/unsafe" "github.com/consensys/gnark/internal/utils" "io" ) @@ -372,3 +373,165 @@ func (pk *ProvingKey) readFrom(r io.Reader, decOptions ...func(*curve.Decoder)) return n + dec.BytesRead(), nil } + +// WriteDump behaves like WriteRawTo, excepts, the slices of points are "dumped" using gnark-crypto/utils/unsafe +// Output is compatible with ReadDump, with the caveat that, not only the points are not checked for +// correctness, but the raw bytes are platform dependent (endianness, etc.) +func (pk *ProvingKey) WriteDump(w io.Writer) error { + // it behaves like WriteRawTo, excepts, the slices of points are "dumped" using gnark-crypto/utils/unsafe + + // start by writing an unsafe marker to fail early. + if err := unsafe.WriteMarker(w); err != nil { + return err + } + + if _, err := pk.Domain.WriteTo(w); err != nil { + return err + } + + enc := curve.NewEncoder(w, curve.RawEncoding()) + nbWires := uint64(len(pk.InfinityA)) + + toEncode := []interface{}{ + &pk.G1.Alpha, + &pk.G1.Beta, + &pk.G1.Delta, + // pk.G1.A, + // pk.G1.B, + // pk.G1.Z, + // pk.G1.K, + &pk.G2.Beta, + &pk.G2.Delta, + // pk.G2.B, + nbWires, + pk.NbInfinityA, + pk.NbInfinityB, + pk.InfinityA, + pk.InfinityB, + uint32(len(pk.CommitmentKeys)), + } + + for _, v := range toEncode { + if err := enc.Encode(v); err != nil { + return err + } + } + + // dump slices of points + if err := unsafe.WriteSlice(w, pk.G1.A); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.B); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.Z); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.K); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G2.B); err != nil { + return err + } + + for i := range pk.CommitmentKeys { + if err := unsafe.WriteSlice(w, pk.CommitmentKeys[i].Basis); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.CommitmentKeys[i].BasisExpSigma); err != nil { + return err + } + } + + return nil +} + +// ReadDump reads a ProvingKey from a dump written by WriteDump. +// This is platform dependent and very unsafe (no checks, no endianness translation, etc.) +func (pk *ProvingKey) ReadDump(r io.Reader) error { + // read the marker to fail early in case of malformed input + if err := unsafe.ReadMarker(r); err != nil { + return err + } + + if _, err := pk.Domain.ReadFrom(r); err != nil { + return err + } + + dec := curve.NewDecoder(r, curve.NoSubgroupChecks()) + + var nbWires uint64 + var nbCommitments uint32 + + toDecode := []interface{}{ + &pk.G1.Alpha, + &pk.G1.Beta, + &pk.G1.Delta, + // &pk.G1.A, + // &pk.G1.B, + // &pk.G1.Z, + // &pk.G1.K, + &pk.G2.Beta, + &pk.G2.Delta, + // &pk.G2.B, + &nbWires, + &pk.NbInfinityA, + &pk.NbInfinityB, + } + + for _, v := range toDecode { + if err := dec.Decode(v); err != nil { + return err + } + } + pk.InfinityA = make([]bool, nbWires) + pk.InfinityB = make([]bool, nbWires) + + if err := dec.Decode(&pk.InfinityA); err != nil { + return err + } + if err := dec.Decode(&pk.InfinityB); err != nil { + return err + } + if err := dec.Decode(&nbCommitments); err != nil { + return err + } + + // read slices of points + var err error + pk.G1.A, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.B, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.Z, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.K, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G2.B, _, err = unsafe.ReadSlice[[]curve.G2Affine](r) + if err != nil { + return err + } + + pk.CommitmentKeys = make([]pedersen.ProvingKey, nbCommitments) + for i := range pk.CommitmentKeys { + pk.CommitmentKeys[i].Basis, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.CommitmentKeys[i].BasisExpSigma, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + } + + return nil + +} diff --git a/backend/groth16/bls12-377/marshal_test.go b/backend/groth16/bls12-377/marshal_test.go index c84d78180a..156ae2228d 100644 --- a/backend/groth16/bls12-377/marshal_test.go +++ b/backend/groth16/bls12-377/marshal_test.go @@ -187,9 +187,16 @@ func TestProvingKeySerialization(t *testing.T) { require.NoError(t, err) } - err := io.RoundTripCheck(&pk, func() any { return new(ProvingKey) }) - return err == nil + if err := io.RoundTripCheck(&pk, func() any { return new(ProvingKey) }); err != nil { + t.Log(err) + return false + } + if err := io.DumpRoundTripCheck(&pk, func() any { return new(ProvingKey) }); err != nil { + t.Log(err) + return false + } + return true }, GenG1(), GenG2(), diff --git a/backend/groth16/bls12-381/marshal.go b/backend/groth16/bls12-381/marshal.go index 9b0e59446b..ff47b52ad4 100644 --- a/backend/groth16/bls12-381/marshal.go +++ b/backend/groth16/bls12-381/marshal.go @@ -20,6 +20,7 @@ import ( curve "github.com/consensys/gnark-crypto/ecc/bls12-381" "github.com/consensys/gnark-crypto/ecc/bls12-381/fr/pedersen" + "github.com/consensys/gnark-crypto/utils/unsafe" "github.com/consensys/gnark/internal/utils" "io" ) @@ -372,3 +373,165 @@ func (pk *ProvingKey) readFrom(r io.Reader, decOptions ...func(*curve.Decoder)) return n + dec.BytesRead(), nil } + +// WriteDump behaves like WriteRawTo, excepts, the slices of points are "dumped" using gnark-crypto/utils/unsafe +// Output is compatible with ReadDump, with the caveat that, not only the points are not checked for +// correctness, but the raw bytes are platform dependent (endianness, etc.) +func (pk *ProvingKey) WriteDump(w io.Writer) error { + // it behaves like WriteRawTo, excepts, the slices of points are "dumped" using gnark-crypto/utils/unsafe + + // start by writing an unsafe marker to fail early. + if err := unsafe.WriteMarker(w); err != nil { + return err + } + + if _, err := pk.Domain.WriteTo(w); err != nil { + return err + } + + enc := curve.NewEncoder(w, curve.RawEncoding()) + nbWires := uint64(len(pk.InfinityA)) + + toEncode := []interface{}{ + &pk.G1.Alpha, + &pk.G1.Beta, + &pk.G1.Delta, + // pk.G1.A, + // pk.G1.B, + // pk.G1.Z, + // pk.G1.K, + &pk.G2.Beta, + &pk.G2.Delta, + // pk.G2.B, + nbWires, + pk.NbInfinityA, + pk.NbInfinityB, + pk.InfinityA, + pk.InfinityB, + uint32(len(pk.CommitmentKeys)), + } + + for _, v := range toEncode { + if err := enc.Encode(v); err != nil { + return err + } + } + + // dump slices of points + if err := unsafe.WriteSlice(w, pk.G1.A); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.B); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.Z); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.K); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G2.B); err != nil { + return err + } + + for i := range pk.CommitmentKeys { + if err := unsafe.WriteSlice(w, pk.CommitmentKeys[i].Basis); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.CommitmentKeys[i].BasisExpSigma); err != nil { + return err + } + } + + return nil +} + +// ReadDump reads a ProvingKey from a dump written by WriteDump. +// This is platform dependent and very unsafe (no checks, no endianness translation, etc.) +func (pk *ProvingKey) ReadDump(r io.Reader) error { + // read the marker to fail early in case of malformed input + if err := unsafe.ReadMarker(r); err != nil { + return err + } + + if _, err := pk.Domain.ReadFrom(r); err != nil { + return err + } + + dec := curve.NewDecoder(r, curve.NoSubgroupChecks()) + + var nbWires uint64 + var nbCommitments uint32 + + toDecode := []interface{}{ + &pk.G1.Alpha, + &pk.G1.Beta, + &pk.G1.Delta, + // &pk.G1.A, + // &pk.G1.B, + // &pk.G1.Z, + // &pk.G1.K, + &pk.G2.Beta, + &pk.G2.Delta, + // &pk.G2.B, + &nbWires, + &pk.NbInfinityA, + &pk.NbInfinityB, + } + + for _, v := range toDecode { + if err := dec.Decode(v); err != nil { + return err + } + } + pk.InfinityA = make([]bool, nbWires) + pk.InfinityB = make([]bool, nbWires) + + if err := dec.Decode(&pk.InfinityA); err != nil { + return err + } + if err := dec.Decode(&pk.InfinityB); err != nil { + return err + } + if err := dec.Decode(&nbCommitments); err != nil { + return err + } + + // read slices of points + var err error + pk.G1.A, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.B, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.Z, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.K, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G2.B, _, err = unsafe.ReadSlice[[]curve.G2Affine](r) + if err != nil { + return err + } + + pk.CommitmentKeys = make([]pedersen.ProvingKey, nbCommitments) + for i := range pk.CommitmentKeys { + pk.CommitmentKeys[i].Basis, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.CommitmentKeys[i].BasisExpSigma, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + } + + return nil + +} diff --git a/backend/groth16/bls12-381/marshal_test.go b/backend/groth16/bls12-381/marshal_test.go index 7b0e6a56cd..93e98ac44e 100644 --- a/backend/groth16/bls12-381/marshal_test.go +++ b/backend/groth16/bls12-381/marshal_test.go @@ -187,9 +187,16 @@ func TestProvingKeySerialization(t *testing.T) { require.NoError(t, err) } - err := io.RoundTripCheck(&pk, func() any { return new(ProvingKey) }) - return err == nil + if err := io.RoundTripCheck(&pk, func() any { return new(ProvingKey) }); err != nil { + t.Log(err) + return false + } + if err := io.DumpRoundTripCheck(&pk, func() any { return new(ProvingKey) }); err != nil { + t.Log(err) + return false + } + return true }, GenG1(), GenG2(), diff --git a/backend/groth16/bls24-315/marshal.go b/backend/groth16/bls24-315/marshal.go index efbb31d620..614647c775 100644 --- a/backend/groth16/bls24-315/marshal.go +++ b/backend/groth16/bls24-315/marshal.go @@ -20,6 +20,7 @@ import ( curve "github.com/consensys/gnark-crypto/ecc/bls24-315" "github.com/consensys/gnark-crypto/ecc/bls24-315/fr/pedersen" + "github.com/consensys/gnark-crypto/utils/unsafe" "github.com/consensys/gnark/internal/utils" "io" ) @@ -372,3 +373,165 @@ func (pk *ProvingKey) readFrom(r io.Reader, decOptions ...func(*curve.Decoder)) return n + dec.BytesRead(), nil } + +// WriteDump behaves like WriteRawTo, excepts, the slices of points are "dumped" using gnark-crypto/utils/unsafe +// Output is compatible with ReadDump, with the caveat that, not only the points are not checked for +// correctness, but the raw bytes are platform dependent (endianness, etc.) +func (pk *ProvingKey) WriteDump(w io.Writer) error { + // it behaves like WriteRawTo, excepts, the slices of points are "dumped" using gnark-crypto/utils/unsafe + + // start by writing an unsafe marker to fail early. + if err := unsafe.WriteMarker(w); err != nil { + return err + } + + if _, err := pk.Domain.WriteTo(w); err != nil { + return err + } + + enc := curve.NewEncoder(w, curve.RawEncoding()) + nbWires := uint64(len(pk.InfinityA)) + + toEncode := []interface{}{ + &pk.G1.Alpha, + &pk.G1.Beta, + &pk.G1.Delta, + // pk.G1.A, + // pk.G1.B, + // pk.G1.Z, + // pk.G1.K, + &pk.G2.Beta, + &pk.G2.Delta, + // pk.G2.B, + nbWires, + pk.NbInfinityA, + pk.NbInfinityB, + pk.InfinityA, + pk.InfinityB, + uint32(len(pk.CommitmentKeys)), + } + + for _, v := range toEncode { + if err := enc.Encode(v); err != nil { + return err + } + } + + // dump slices of points + if err := unsafe.WriteSlice(w, pk.G1.A); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.B); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.Z); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.K); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G2.B); err != nil { + return err + } + + for i := range pk.CommitmentKeys { + if err := unsafe.WriteSlice(w, pk.CommitmentKeys[i].Basis); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.CommitmentKeys[i].BasisExpSigma); err != nil { + return err + } + } + + return nil +} + +// ReadDump reads a ProvingKey from a dump written by WriteDump. +// This is platform dependent and very unsafe (no checks, no endianness translation, etc.) +func (pk *ProvingKey) ReadDump(r io.Reader) error { + // read the marker to fail early in case of malformed input + if err := unsafe.ReadMarker(r); err != nil { + return err + } + + if _, err := pk.Domain.ReadFrom(r); err != nil { + return err + } + + dec := curve.NewDecoder(r, curve.NoSubgroupChecks()) + + var nbWires uint64 + var nbCommitments uint32 + + toDecode := []interface{}{ + &pk.G1.Alpha, + &pk.G1.Beta, + &pk.G1.Delta, + // &pk.G1.A, + // &pk.G1.B, + // &pk.G1.Z, + // &pk.G1.K, + &pk.G2.Beta, + &pk.G2.Delta, + // &pk.G2.B, + &nbWires, + &pk.NbInfinityA, + &pk.NbInfinityB, + } + + for _, v := range toDecode { + if err := dec.Decode(v); err != nil { + return err + } + } + pk.InfinityA = make([]bool, nbWires) + pk.InfinityB = make([]bool, nbWires) + + if err := dec.Decode(&pk.InfinityA); err != nil { + return err + } + if err := dec.Decode(&pk.InfinityB); err != nil { + return err + } + if err := dec.Decode(&nbCommitments); err != nil { + return err + } + + // read slices of points + var err error + pk.G1.A, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.B, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.Z, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.K, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G2.B, _, err = unsafe.ReadSlice[[]curve.G2Affine](r) + if err != nil { + return err + } + + pk.CommitmentKeys = make([]pedersen.ProvingKey, nbCommitments) + for i := range pk.CommitmentKeys { + pk.CommitmentKeys[i].Basis, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.CommitmentKeys[i].BasisExpSigma, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + } + + return nil + +} diff --git a/backend/groth16/bls24-315/marshal_test.go b/backend/groth16/bls24-315/marshal_test.go index 9b5efcade2..6bf286b39e 100644 --- a/backend/groth16/bls24-315/marshal_test.go +++ b/backend/groth16/bls24-315/marshal_test.go @@ -187,9 +187,16 @@ func TestProvingKeySerialization(t *testing.T) { require.NoError(t, err) } - err := io.RoundTripCheck(&pk, func() any { return new(ProvingKey) }) - return err == nil + if err := io.RoundTripCheck(&pk, func() any { return new(ProvingKey) }); err != nil { + t.Log(err) + return false + } + if err := io.DumpRoundTripCheck(&pk, func() any { return new(ProvingKey) }); err != nil { + t.Log(err) + return false + } + return true }, GenG1(), GenG2(), diff --git a/backend/groth16/bls24-317/marshal.go b/backend/groth16/bls24-317/marshal.go index b16d681254..00e0222422 100644 --- a/backend/groth16/bls24-317/marshal.go +++ b/backend/groth16/bls24-317/marshal.go @@ -20,6 +20,7 @@ import ( curve "github.com/consensys/gnark-crypto/ecc/bls24-317" "github.com/consensys/gnark-crypto/ecc/bls24-317/fr/pedersen" + "github.com/consensys/gnark-crypto/utils/unsafe" "github.com/consensys/gnark/internal/utils" "io" ) @@ -372,3 +373,165 @@ func (pk *ProvingKey) readFrom(r io.Reader, decOptions ...func(*curve.Decoder)) return n + dec.BytesRead(), nil } + +// WriteDump behaves like WriteRawTo, excepts, the slices of points are "dumped" using gnark-crypto/utils/unsafe +// Output is compatible with ReadDump, with the caveat that, not only the points are not checked for +// correctness, but the raw bytes are platform dependent (endianness, etc.) +func (pk *ProvingKey) WriteDump(w io.Writer) error { + // it behaves like WriteRawTo, excepts, the slices of points are "dumped" using gnark-crypto/utils/unsafe + + // start by writing an unsafe marker to fail early. + if err := unsafe.WriteMarker(w); err != nil { + return err + } + + if _, err := pk.Domain.WriteTo(w); err != nil { + return err + } + + enc := curve.NewEncoder(w, curve.RawEncoding()) + nbWires := uint64(len(pk.InfinityA)) + + toEncode := []interface{}{ + &pk.G1.Alpha, + &pk.G1.Beta, + &pk.G1.Delta, + // pk.G1.A, + // pk.G1.B, + // pk.G1.Z, + // pk.G1.K, + &pk.G2.Beta, + &pk.G2.Delta, + // pk.G2.B, + nbWires, + pk.NbInfinityA, + pk.NbInfinityB, + pk.InfinityA, + pk.InfinityB, + uint32(len(pk.CommitmentKeys)), + } + + for _, v := range toEncode { + if err := enc.Encode(v); err != nil { + return err + } + } + + // dump slices of points + if err := unsafe.WriteSlice(w, pk.G1.A); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.B); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.Z); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.K); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G2.B); err != nil { + return err + } + + for i := range pk.CommitmentKeys { + if err := unsafe.WriteSlice(w, pk.CommitmentKeys[i].Basis); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.CommitmentKeys[i].BasisExpSigma); err != nil { + return err + } + } + + return nil +} + +// ReadDump reads a ProvingKey from a dump written by WriteDump. +// This is platform dependent and very unsafe (no checks, no endianness translation, etc.) +func (pk *ProvingKey) ReadDump(r io.Reader) error { + // read the marker to fail early in case of malformed input + if err := unsafe.ReadMarker(r); err != nil { + return err + } + + if _, err := pk.Domain.ReadFrom(r); err != nil { + return err + } + + dec := curve.NewDecoder(r, curve.NoSubgroupChecks()) + + var nbWires uint64 + var nbCommitments uint32 + + toDecode := []interface{}{ + &pk.G1.Alpha, + &pk.G1.Beta, + &pk.G1.Delta, + // &pk.G1.A, + // &pk.G1.B, + // &pk.G1.Z, + // &pk.G1.K, + &pk.G2.Beta, + &pk.G2.Delta, + // &pk.G2.B, + &nbWires, + &pk.NbInfinityA, + &pk.NbInfinityB, + } + + for _, v := range toDecode { + if err := dec.Decode(v); err != nil { + return err + } + } + pk.InfinityA = make([]bool, nbWires) + pk.InfinityB = make([]bool, nbWires) + + if err := dec.Decode(&pk.InfinityA); err != nil { + return err + } + if err := dec.Decode(&pk.InfinityB); err != nil { + return err + } + if err := dec.Decode(&nbCommitments); err != nil { + return err + } + + // read slices of points + var err error + pk.G1.A, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.B, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.Z, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.K, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G2.B, _, err = unsafe.ReadSlice[[]curve.G2Affine](r) + if err != nil { + return err + } + + pk.CommitmentKeys = make([]pedersen.ProvingKey, nbCommitments) + for i := range pk.CommitmentKeys { + pk.CommitmentKeys[i].Basis, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.CommitmentKeys[i].BasisExpSigma, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + } + + return nil + +} diff --git a/backend/groth16/bls24-317/marshal_test.go b/backend/groth16/bls24-317/marshal_test.go index 2e984257dc..4110b35746 100644 --- a/backend/groth16/bls24-317/marshal_test.go +++ b/backend/groth16/bls24-317/marshal_test.go @@ -187,9 +187,16 @@ func TestProvingKeySerialization(t *testing.T) { require.NoError(t, err) } - err := io.RoundTripCheck(&pk, func() any { return new(ProvingKey) }) - return err == nil + if err := io.RoundTripCheck(&pk, func() any { return new(ProvingKey) }); err != nil { + t.Log(err) + return false + } + if err := io.DumpRoundTripCheck(&pk, func() any { return new(ProvingKey) }); err != nil { + t.Log(err) + return false + } + return true }, GenG1(), GenG2(), diff --git a/backend/groth16/bn254/marshal.go b/backend/groth16/bn254/marshal.go index c6539a7ba2..90dd38d8ad 100644 --- a/backend/groth16/bn254/marshal.go +++ b/backend/groth16/bn254/marshal.go @@ -20,6 +20,7 @@ import ( curve "github.com/consensys/gnark-crypto/ecc/bn254" "github.com/consensys/gnark-crypto/ecc/bn254/fr/pedersen" + "github.com/consensys/gnark-crypto/utils/unsafe" "github.com/consensys/gnark/internal/utils" "io" ) @@ -372,3 +373,165 @@ func (pk *ProvingKey) readFrom(r io.Reader, decOptions ...func(*curve.Decoder)) return n + dec.BytesRead(), nil } + +// WriteDump behaves like WriteRawTo, excepts, the slices of points are "dumped" using gnark-crypto/utils/unsafe +// Output is compatible with ReadDump, with the caveat that, not only the points are not checked for +// correctness, but the raw bytes are platform dependent (endianness, etc.) +func (pk *ProvingKey) WriteDump(w io.Writer) error { + // it behaves like WriteRawTo, excepts, the slices of points are "dumped" using gnark-crypto/utils/unsafe + + // start by writing an unsafe marker to fail early. + if err := unsafe.WriteMarker(w); err != nil { + return err + } + + if _, err := pk.Domain.WriteTo(w); err != nil { + return err + } + + enc := curve.NewEncoder(w, curve.RawEncoding()) + nbWires := uint64(len(pk.InfinityA)) + + toEncode := []interface{}{ + &pk.G1.Alpha, + &pk.G1.Beta, + &pk.G1.Delta, + // pk.G1.A, + // pk.G1.B, + // pk.G1.Z, + // pk.G1.K, + &pk.G2.Beta, + &pk.G2.Delta, + // pk.G2.B, + nbWires, + pk.NbInfinityA, + pk.NbInfinityB, + pk.InfinityA, + pk.InfinityB, + uint32(len(pk.CommitmentKeys)), + } + + for _, v := range toEncode { + if err := enc.Encode(v); err != nil { + return err + } + } + + // dump slices of points + if err := unsafe.WriteSlice(w, pk.G1.A); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.B); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.Z); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.K); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G2.B); err != nil { + return err + } + + for i := range pk.CommitmentKeys { + if err := unsafe.WriteSlice(w, pk.CommitmentKeys[i].Basis); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.CommitmentKeys[i].BasisExpSigma); err != nil { + return err + } + } + + return nil +} + +// ReadDump reads a ProvingKey from a dump written by WriteDump. +// This is platform dependent and very unsafe (no checks, no endianness translation, etc.) +func (pk *ProvingKey) ReadDump(r io.Reader) error { + // read the marker to fail early in case of malformed input + if err := unsafe.ReadMarker(r); err != nil { + return err + } + + if _, err := pk.Domain.ReadFrom(r); err != nil { + return err + } + + dec := curve.NewDecoder(r, curve.NoSubgroupChecks()) + + var nbWires uint64 + var nbCommitments uint32 + + toDecode := []interface{}{ + &pk.G1.Alpha, + &pk.G1.Beta, + &pk.G1.Delta, + // &pk.G1.A, + // &pk.G1.B, + // &pk.G1.Z, + // &pk.G1.K, + &pk.G2.Beta, + &pk.G2.Delta, + // &pk.G2.B, + &nbWires, + &pk.NbInfinityA, + &pk.NbInfinityB, + } + + for _, v := range toDecode { + if err := dec.Decode(v); err != nil { + return err + } + } + pk.InfinityA = make([]bool, nbWires) + pk.InfinityB = make([]bool, nbWires) + + if err := dec.Decode(&pk.InfinityA); err != nil { + return err + } + if err := dec.Decode(&pk.InfinityB); err != nil { + return err + } + if err := dec.Decode(&nbCommitments); err != nil { + return err + } + + // read slices of points + var err error + pk.G1.A, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.B, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.Z, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.K, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G2.B, _, err = unsafe.ReadSlice[[]curve.G2Affine](r) + if err != nil { + return err + } + + pk.CommitmentKeys = make([]pedersen.ProvingKey, nbCommitments) + for i := range pk.CommitmentKeys { + pk.CommitmentKeys[i].Basis, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.CommitmentKeys[i].BasisExpSigma, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + } + + return nil + +} diff --git a/backend/groth16/bn254/marshal_test.go b/backend/groth16/bn254/marshal_test.go index ae007c3668..170bac74c0 100644 --- a/backend/groth16/bn254/marshal_test.go +++ b/backend/groth16/bn254/marshal_test.go @@ -187,9 +187,16 @@ func TestProvingKeySerialization(t *testing.T) { require.NoError(t, err) } - err := io.RoundTripCheck(&pk, func() any { return new(ProvingKey) }) - return err == nil + if err := io.RoundTripCheck(&pk, func() any { return new(ProvingKey) }); err != nil { + t.Log(err) + return false + } + if err := io.DumpRoundTripCheck(&pk, func() any { return new(ProvingKey) }); err != nil { + t.Log(err) + return false + } + return true }, GenG1(), GenG2(), diff --git a/backend/groth16/bn254/solidity.go b/backend/groth16/bn254/solidity.go index 5f0b1a504e..32ccc55bbb 100644 --- a/backend/groth16/bn254/solidity.go +++ b/backend/groth16/bn254/solidity.go @@ -535,7 +535,7 @@ contract Verifier { {{- if eq $numCommitments 1 }} (commitments[0], commitments[1]) = decompress_g1(compressedCommitments[0]); {{- else }} - // TODO: We need to fold commitments into single point + // TODO: We can fold commitments into a single point for more efficient verification (https://github.com/Consensys/gnark/issues/1095) for (uint256 i = 0; i < {{$numCommitments}}; i++) { (commitments[2*i], commitments[2*i+1]) = decompress_g1(compressedCommitments[i]); } diff --git a/backend/groth16/bw6-633/marshal.go b/backend/groth16/bw6-633/marshal.go index d5c2339407..a801462c9f 100644 --- a/backend/groth16/bw6-633/marshal.go +++ b/backend/groth16/bw6-633/marshal.go @@ -20,6 +20,7 @@ import ( curve "github.com/consensys/gnark-crypto/ecc/bw6-633" "github.com/consensys/gnark-crypto/ecc/bw6-633/fr/pedersen" + "github.com/consensys/gnark-crypto/utils/unsafe" "github.com/consensys/gnark/internal/utils" "io" ) @@ -372,3 +373,165 @@ func (pk *ProvingKey) readFrom(r io.Reader, decOptions ...func(*curve.Decoder)) return n + dec.BytesRead(), nil } + +// WriteDump behaves like WriteRawTo, excepts, the slices of points are "dumped" using gnark-crypto/utils/unsafe +// Output is compatible with ReadDump, with the caveat that, not only the points are not checked for +// correctness, but the raw bytes are platform dependent (endianness, etc.) +func (pk *ProvingKey) WriteDump(w io.Writer) error { + // it behaves like WriteRawTo, excepts, the slices of points are "dumped" using gnark-crypto/utils/unsafe + + // start by writing an unsafe marker to fail early. + if err := unsafe.WriteMarker(w); err != nil { + return err + } + + if _, err := pk.Domain.WriteTo(w); err != nil { + return err + } + + enc := curve.NewEncoder(w, curve.RawEncoding()) + nbWires := uint64(len(pk.InfinityA)) + + toEncode := []interface{}{ + &pk.G1.Alpha, + &pk.G1.Beta, + &pk.G1.Delta, + // pk.G1.A, + // pk.G1.B, + // pk.G1.Z, + // pk.G1.K, + &pk.G2.Beta, + &pk.G2.Delta, + // pk.G2.B, + nbWires, + pk.NbInfinityA, + pk.NbInfinityB, + pk.InfinityA, + pk.InfinityB, + uint32(len(pk.CommitmentKeys)), + } + + for _, v := range toEncode { + if err := enc.Encode(v); err != nil { + return err + } + } + + // dump slices of points + if err := unsafe.WriteSlice(w, pk.G1.A); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.B); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.Z); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.K); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G2.B); err != nil { + return err + } + + for i := range pk.CommitmentKeys { + if err := unsafe.WriteSlice(w, pk.CommitmentKeys[i].Basis); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.CommitmentKeys[i].BasisExpSigma); err != nil { + return err + } + } + + return nil +} + +// ReadDump reads a ProvingKey from a dump written by WriteDump. +// This is platform dependent and very unsafe (no checks, no endianness translation, etc.) +func (pk *ProvingKey) ReadDump(r io.Reader) error { + // read the marker to fail early in case of malformed input + if err := unsafe.ReadMarker(r); err != nil { + return err + } + + if _, err := pk.Domain.ReadFrom(r); err != nil { + return err + } + + dec := curve.NewDecoder(r, curve.NoSubgroupChecks()) + + var nbWires uint64 + var nbCommitments uint32 + + toDecode := []interface{}{ + &pk.G1.Alpha, + &pk.G1.Beta, + &pk.G1.Delta, + // &pk.G1.A, + // &pk.G1.B, + // &pk.G1.Z, + // &pk.G1.K, + &pk.G2.Beta, + &pk.G2.Delta, + // &pk.G2.B, + &nbWires, + &pk.NbInfinityA, + &pk.NbInfinityB, + } + + for _, v := range toDecode { + if err := dec.Decode(v); err != nil { + return err + } + } + pk.InfinityA = make([]bool, nbWires) + pk.InfinityB = make([]bool, nbWires) + + if err := dec.Decode(&pk.InfinityA); err != nil { + return err + } + if err := dec.Decode(&pk.InfinityB); err != nil { + return err + } + if err := dec.Decode(&nbCommitments); err != nil { + return err + } + + // read slices of points + var err error + pk.G1.A, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.B, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.Z, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.K, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G2.B, _, err = unsafe.ReadSlice[[]curve.G2Affine](r) + if err != nil { + return err + } + + pk.CommitmentKeys = make([]pedersen.ProvingKey, nbCommitments) + for i := range pk.CommitmentKeys { + pk.CommitmentKeys[i].Basis, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.CommitmentKeys[i].BasisExpSigma, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + } + + return nil + +} diff --git a/backend/groth16/bw6-633/marshal_test.go b/backend/groth16/bw6-633/marshal_test.go index 31b93fe801..05d9637e2a 100644 --- a/backend/groth16/bw6-633/marshal_test.go +++ b/backend/groth16/bw6-633/marshal_test.go @@ -187,9 +187,16 @@ func TestProvingKeySerialization(t *testing.T) { require.NoError(t, err) } - err := io.RoundTripCheck(&pk, func() any { return new(ProvingKey) }) - return err == nil + if err := io.RoundTripCheck(&pk, func() any { return new(ProvingKey) }); err != nil { + t.Log(err) + return false + } + if err := io.DumpRoundTripCheck(&pk, func() any { return new(ProvingKey) }); err != nil { + t.Log(err) + return false + } + return true }, GenG1(), GenG2(), diff --git a/backend/groth16/bw6-761/marshal.go b/backend/groth16/bw6-761/marshal.go index b9de7f8d90..b89105e280 100644 --- a/backend/groth16/bw6-761/marshal.go +++ b/backend/groth16/bw6-761/marshal.go @@ -20,6 +20,7 @@ import ( curve "github.com/consensys/gnark-crypto/ecc/bw6-761" "github.com/consensys/gnark-crypto/ecc/bw6-761/fr/pedersen" + "github.com/consensys/gnark-crypto/utils/unsafe" "github.com/consensys/gnark/internal/utils" "io" ) @@ -372,3 +373,165 @@ func (pk *ProvingKey) readFrom(r io.Reader, decOptions ...func(*curve.Decoder)) return n + dec.BytesRead(), nil } + +// WriteDump behaves like WriteRawTo, excepts, the slices of points are "dumped" using gnark-crypto/utils/unsafe +// Output is compatible with ReadDump, with the caveat that, not only the points are not checked for +// correctness, but the raw bytes are platform dependent (endianness, etc.) +func (pk *ProvingKey) WriteDump(w io.Writer) error { + // it behaves like WriteRawTo, excepts, the slices of points are "dumped" using gnark-crypto/utils/unsafe + + // start by writing an unsafe marker to fail early. + if err := unsafe.WriteMarker(w); err != nil { + return err + } + + if _, err := pk.Domain.WriteTo(w); err != nil { + return err + } + + enc := curve.NewEncoder(w, curve.RawEncoding()) + nbWires := uint64(len(pk.InfinityA)) + + toEncode := []interface{}{ + &pk.G1.Alpha, + &pk.G1.Beta, + &pk.G1.Delta, + // pk.G1.A, + // pk.G1.B, + // pk.G1.Z, + // pk.G1.K, + &pk.G2.Beta, + &pk.G2.Delta, + // pk.G2.B, + nbWires, + pk.NbInfinityA, + pk.NbInfinityB, + pk.InfinityA, + pk.InfinityB, + uint32(len(pk.CommitmentKeys)), + } + + for _, v := range toEncode { + if err := enc.Encode(v); err != nil { + return err + } + } + + // dump slices of points + if err := unsafe.WriteSlice(w, pk.G1.A); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.B); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.Z); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.K); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G2.B); err != nil { + return err + } + + for i := range pk.CommitmentKeys { + if err := unsafe.WriteSlice(w, pk.CommitmentKeys[i].Basis); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.CommitmentKeys[i].BasisExpSigma); err != nil { + return err + } + } + + return nil +} + +// ReadDump reads a ProvingKey from a dump written by WriteDump. +// This is platform dependent and very unsafe (no checks, no endianness translation, etc.) +func (pk *ProvingKey) ReadDump(r io.Reader) error { + // read the marker to fail early in case of malformed input + if err := unsafe.ReadMarker(r); err != nil { + return err + } + + if _, err := pk.Domain.ReadFrom(r); err != nil { + return err + } + + dec := curve.NewDecoder(r, curve.NoSubgroupChecks()) + + var nbWires uint64 + var nbCommitments uint32 + + toDecode := []interface{}{ + &pk.G1.Alpha, + &pk.G1.Beta, + &pk.G1.Delta, + // &pk.G1.A, + // &pk.G1.B, + // &pk.G1.Z, + // &pk.G1.K, + &pk.G2.Beta, + &pk.G2.Delta, + // &pk.G2.B, + &nbWires, + &pk.NbInfinityA, + &pk.NbInfinityB, + } + + for _, v := range toDecode { + if err := dec.Decode(v); err != nil { + return err + } + } + pk.InfinityA = make([]bool, nbWires) + pk.InfinityB = make([]bool, nbWires) + + if err := dec.Decode(&pk.InfinityA); err != nil { + return err + } + if err := dec.Decode(&pk.InfinityB); err != nil { + return err + } + if err := dec.Decode(&nbCommitments); err != nil { + return err + } + + // read slices of points + var err error + pk.G1.A, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.B, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.Z, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.K, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G2.B, _, err = unsafe.ReadSlice[[]curve.G2Affine](r) + if err != nil { + return err + } + + pk.CommitmentKeys = make([]pedersen.ProvingKey, nbCommitments) + for i := range pk.CommitmentKeys { + pk.CommitmentKeys[i].Basis, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.CommitmentKeys[i].BasisExpSigma, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + } + + return nil + +} diff --git a/backend/groth16/bw6-761/marshal_test.go b/backend/groth16/bw6-761/marshal_test.go index 61bd28a632..7f59bf90e8 100644 --- a/backend/groth16/bw6-761/marshal_test.go +++ b/backend/groth16/bw6-761/marshal_test.go @@ -187,9 +187,16 @@ func TestProvingKeySerialization(t *testing.T) { require.NoError(t, err) } - err := io.RoundTripCheck(&pk, func() any { return new(ProvingKey) }) - return err == nil + if err := io.RoundTripCheck(&pk, func() any { return new(ProvingKey) }); err != nil { + t.Log(err) + return false + } + if err := io.DumpRoundTripCheck(&pk, func() any { return new(ProvingKey) }); err != nil { + t.Log(err) + return false + } + return true }, GenG1(), GenG2(), diff --git a/backend/groth16/groth16.go b/backend/groth16/groth16.go index ca5b8bdc61..3b542f2afa 100644 --- a/backend/groth16/groth16.go +++ b/backend/groth16/groth16.go @@ -74,6 +74,7 @@ type Proof interface { type ProvingKey interface { groth16Object gnarkio.UnsafeReaderFrom + gnarkio.BinaryDumper // NbG1 returns the number of G1 elements in the ProvingKey NbG1() int diff --git a/constraint/bls12-377/coeff.go b/constraint/bls12-377/coeff.go index a1b86b75c4..9ec1f2a3d7 100644 --- a/constraint/bls12-377/coeff.go +++ b/constraint/bls12-377/coeff.go @@ -17,6 +17,8 @@ package cs import ( + "encoding/binary" + "errors" "github.com/consensys/gnark/constraint" "github.com/consensys/gnark/internal/utils" "math/big" @@ -46,6 +48,42 @@ func newCoeffTable(capacity int) CoeffTable { } +func (ct *CoeffTable) toBytes() []byte { + buf := make([]byte, 0, 8+len(ct.Coefficients)*fr.Bytes) + ctLen := uint64(len(ct.Coefficients)) + + buf = binary.LittleEndian.AppendUint64(buf, ctLen) + for _, c := range ct.Coefficients { + for _, w := range c { + buf = binary.LittleEndian.AppendUint64(buf, w) + } + } + + return buf +} + +func (ct *CoeffTable) fromBytes(buf []byte) error { + if len(buf) < 8 { + return errors.New("invalid buffer size") + } + ctLen := binary.LittleEndian.Uint64(buf[:8]) + buf = buf[8:] + + if uint64(len(buf)) < ctLen*fr.Bytes { + return errors.New("invalid buffer size") + } + ct.Coefficients = make([]fr.Element, ctLen) + for i := uint64(0); i < ctLen; i++ { + var c fr.Element + k := int(i) * fr.Bytes + for j := 0; j < fr.Limbs; j++ { + c[j] = binary.LittleEndian.Uint64(buf[k+j*8 : k+(j+1)*8]) + } + ct.Coefficients[i] = c + } + return nil +} + func (ct *CoeffTable) AddCoeff(coeff constraint.Element) uint32 { c := (*fr.Element)(coeff[:]) var cID uint32 diff --git a/constraint/bls12-377/marshal.go b/constraint/bls12-377/marshal.go new file mode 100644 index 0000000000..ea13e57dad --- /dev/null +++ b/constraint/bls12-377/marshal.go @@ -0,0 +1,101 @@ +// Copyright 2020 ConsenSys Software Inc. +// +// 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. + +// Code generated by gnark DO NOT EDIT + +package cs + +import ( + "encoding/binary" + "fmt" + "io" + + "github.com/blang/semver/v4" +) + +// WriteTo encodes R1CS into provided io.Writer using cbor +func (cs *system) WriteTo(w io.Writer) (int64, error) { + b, err := cs.System.ToBytes() + if err != nil { + return 0, err + } + + c := cs.CoeffTable.toBytes() + + totalLen := uint64(len(b) + len(c)) + gnarkVersion := semver.MustParse(cs.GnarkVersion) + // write totalLen, gnarkVersion.Major, gnarkVersion.Minor, gnarkVersion.Patch using + // binary.LittleEndian + if err := binary.Write(w, binary.LittleEndian, totalLen); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Major); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Minor); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Patch); err != nil { + return 0, err + } + + // write the system + n, err := w.Write(b) + if err != nil { + return int64(n), err + } + + // write the coeff table + m, err := w.Write(c) + return int64(n+m) + 4*8, err +} + +// ReadFrom attempts to decode R1CS from io.Reader using cbor +func (cs *system) ReadFrom(r io.Reader) (int64, error) { + var totalLen uint64 + if err := binary.Read(r, binary.LittleEndian, &totalLen); err != nil { + return 0, err + } + + var major, minor, patch uint64 + if err := binary.Read(r, binary.LittleEndian, &major); err != nil { + return 0, err + } + if err := binary.Read(r, binary.LittleEndian, &minor); err != nil { + return 0, err + } + if err := binary.Read(r, binary.LittleEndian, &patch); err != nil { + return 0, err + } + // TODO @gbotrel validate version, duplicate logic with core.go CheckSerializationHeader + if major != 0 || minor < 10 { + return 0, fmt.Errorf("unsupported gnark version %d.%d.%d", major, minor, patch) + } + + data := make([]byte, totalLen) + if _, err := io.ReadFull(r, data); err != nil { + return 0, err + } + n, err := cs.System.FromBytes(data) + if err != nil { + return 0, err + } + data = data[n:] + + if err := cs.CoeffTable.fromBytes(data); err != nil { + return 0, err + } + + return int64(totalLen) + 4*8, nil +} diff --git a/constraint/bls12-377/solver.go b/constraint/bls12-377/solver.go index 085fece29d..2838d62d8f 100644 --- a/constraint/bls12-377/solver.go +++ b/constraint/bls12-377/solver.go @@ -437,7 +437,7 @@ func (solver *solver) run() error { // then we check that the constraint is valid // if a[i] * b[i] != c[i]; it means the constraint is not satisfied var wg sync.WaitGroup - chTasks := make(chan []int, solver.nbTasks) + chTasks := make(chan []uint32, solver.nbTasks) chError := make(chan error, solver.nbTasks) // start a worker pool diff --git a/constraint/bls12-377/system.go b/constraint/bls12-377/system.go index bcd9ab9225..d7420aa421 100644 --- a/constraint/bls12-377/system.go +++ b/constraint/bls12-377/system.go @@ -17,16 +17,13 @@ package cs import ( - "github.com/fxamacker/cbor/v2" "io" "time" "github.com/consensys/gnark/backend/witness" "github.com/consensys/gnark/constraint" csolver "github.com/consensys/gnark/constraint/solver" - "github.com/consensys/gnark/internal/backend/ioutils" "github.com/consensys/gnark/logger" - "reflect" "github.com/consensys/gnark-crypto/ecc" @@ -149,55 +146,6 @@ func (cs *system) CurveID() ecc.ID { return ecc.BLS12_377 } -// WriteTo encodes R1CS into provided io.Writer using cbor -func (cs *system) WriteTo(w io.Writer) (int64, error) { - _w := ioutils.WriterCounter{W: w} // wraps writer to count the bytes written - ts := getTagSet() - enc, err := cbor.CoreDetEncOptions().EncModeWithTags(ts) - if err != nil { - return 0, err - } - encoder := enc.NewEncoder(&_w) - - // encode our object - err = encoder.Encode(cs) - return _w.N, err -} - -// ReadFrom attempts to decode R1CS from io.Reader using cbor -func (cs *system) ReadFrom(r io.Reader) (int64, error) { - ts := getTagSet() - dm, err := cbor.DecOptions{ - MaxArrayElements: 2147483647, - MaxMapPairs: 2147483647, - }.DecModeWithTags(ts) - - if err != nil { - return 0, err - } - decoder := dm.NewDecoder(r) - - // initialize coeff table - cs.CoeffTable = newCoeffTable(0) - - if err := decoder.Decode(&cs); err != nil { - return int64(decoder.NumBytesRead()), err - } - - if err := cs.CheckSerializationHeader(); err != nil { - return int64(decoder.NumBytesRead()), err - } - - switch v := cs.CommitmentInfo.(type) { - case *constraint.Groth16Commitments: - cs.CommitmentInfo = *v - case *constraint.PlonkCommitments: - cs.CommitmentInfo = *v - } - - return int64(decoder.NumBytesRead()), nil -} - func (cs *system) GetCoefficient(i int) (r constraint.Element) { copy(r[:], cs.Coefficients[i][:]) return @@ -351,36 +299,6 @@ func (t *SparseR1CSSolution) ReadFrom(r io.Reader) (int64, error) { return n, err } -func getTagSet() cbor.TagSet { - // temporary for refactor - ts := cbor.NewTagSet() - // https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml - // 65536-15309735 Unassigned - tagNum := uint64(5309735) - addType := func(t reflect.Type) { - if err := ts.Add( - cbor.TagOptions{EncTag: cbor.EncTagRequired, DecTag: cbor.DecTagRequired}, - t, - tagNum, - ); err != nil { - panic(err) - } - tagNum++ - } - - addType(reflect.TypeOf(constraint.BlueprintGenericHint{})) - addType(reflect.TypeOf(constraint.BlueprintGenericR1C{})) - addType(reflect.TypeOf(constraint.BlueprintGenericSparseR1C{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CAdd{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CMul{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CBool{})) - addType(reflect.TypeOf(constraint.BlueprintLookupHint{})) - addType(reflect.TypeOf(constraint.Groth16Commitments{})) - addType(reflect.TypeOf(constraint.PlonkCommitments{})) - - return ts -} - func (s *system) AddGkr(gkr constraint.GkrInfo) error { return s.System.AddGkr(gkr) } diff --git a/constraint/bls12-381/coeff.go b/constraint/bls12-381/coeff.go index 9eb3786806..1739672e54 100644 --- a/constraint/bls12-381/coeff.go +++ b/constraint/bls12-381/coeff.go @@ -17,6 +17,8 @@ package cs import ( + "encoding/binary" + "errors" "github.com/consensys/gnark/constraint" "github.com/consensys/gnark/internal/utils" "math/big" @@ -46,6 +48,42 @@ func newCoeffTable(capacity int) CoeffTable { } +func (ct *CoeffTable) toBytes() []byte { + buf := make([]byte, 0, 8+len(ct.Coefficients)*fr.Bytes) + ctLen := uint64(len(ct.Coefficients)) + + buf = binary.LittleEndian.AppendUint64(buf, ctLen) + for _, c := range ct.Coefficients { + for _, w := range c { + buf = binary.LittleEndian.AppendUint64(buf, w) + } + } + + return buf +} + +func (ct *CoeffTable) fromBytes(buf []byte) error { + if len(buf) < 8 { + return errors.New("invalid buffer size") + } + ctLen := binary.LittleEndian.Uint64(buf[:8]) + buf = buf[8:] + + if uint64(len(buf)) < ctLen*fr.Bytes { + return errors.New("invalid buffer size") + } + ct.Coefficients = make([]fr.Element, ctLen) + for i := uint64(0); i < ctLen; i++ { + var c fr.Element + k := int(i) * fr.Bytes + for j := 0; j < fr.Limbs; j++ { + c[j] = binary.LittleEndian.Uint64(buf[k+j*8 : k+(j+1)*8]) + } + ct.Coefficients[i] = c + } + return nil +} + func (ct *CoeffTable) AddCoeff(coeff constraint.Element) uint32 { c := (*fr.Element)(coeff[:]) var cID uint32 diff --git a/constraint/bls12-381/marshal.go b/constraint/bls12-381/marshal.go new file mode 100644 index 0000000000..ea13e57dad --- /dev/null +++ b/constraint/bls12-381/marshal.go @@ -0,0 +1,101 @@ +// Copyright 2020 ConsenSys Software Inc. +// +// 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. + +// Code generated by gnark DO NOT EDIT + +package cs + +import ( + "encoding/binary" + "fmt" + "io" + + "github.com/blang/semver/v4" +) + +// WriteTo encodes R1CS into provided io.Writer using cbor +func (cs *system) WriteTo(w io.Writer) (int64, error) { + b, err := cs.System.ToBytes() + if err != nil { + return 0, err + } + + c := cs.CoeffTable.toBytes() + + totalLen := uint64(len(b) + len(c)) + gnarkVersion := semver.MustParse(cs.GnarkVersion) + // write totalLen, gnarkVersion.Major, gnarkVersion.Minor, gnarkVersion.Patch using + // binary.LittleEndian + if err := binary.Write(w, binary.LittleEndian, totalLen); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Major); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Minor); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Patch); err != nil { + return 0, err + } + + // write the system + n, err := w.Write(b) + if err != nil { + return int64(n), err + } + + // write the coeff table + m, err := w.Write(c) + return int64(n+m) + 4*8, err +} + +// ReadFrom attempts to decode R1CS from io.Reader using cbor +func (cs *system) ReadFrom(r io.Reader) (int64, error) { + var totalLen uint64 + if err := binary.Read(r, binary.LittleEndian, &totalLen); err != nil { + return 0, err + } + + var major, minor, patch uint64 + if err := binary.Read(r, binary.LittleEndian, &major); err != nil { + return 0, err + } + if err := binary.Read(r, binary.LittleEndian, &minor); err != nil { + return 0, err + } + if err := binary.Read(r, binary.LittleEndian, &patch); err != nil { + return 0, err + } + // TODO @gbotrel validate version, duplicate logic with core.go CheckSerializationHeader + if major != 0 || minor < 10 { + return 0, fmt.Errorf("unsupported gnark version %d.%d.%d", major, minor, patch) + } + + data := make([]byte, totalLen) + if _, err := io.ReadFull(r, data); err != nil { + return 0, err + } + n, err := cs.System.FromBytes(data) + if err != nil { + return 0, err + } + data = data[n:] + + if err := cs.CoeffTable.fromBytes(data); err != nil { + return 0, err + } + + return int64(totalLen) + 4*8, nil +} diff --git a/constraint/bls12-381/solver.go b/constraint/bls12-381/solver.go index e2e4d66eb3..2b34205362 100644 --- a/constraint/bls12-381/solver.go +++ b/constraint/bls12-381/solver.go @@ -437,7 +437,7 @@ func (solver *solver) run() error { // then we check that the constraint is valid // if a[i] * b[i] != c[i]; it means the constraint is not satisfied var wg sync.WaitGroup - chTasks := make(chan []int, solver.nbTasks) + chTasks := make(chan []uint32, solver.nbTasks) chError := make(chan error, solver.nbTasks) // start a worker pool diff --git a/constraint/bls12-381/system.go b/constraint/bls12-381/system.go index 911294fd9f..a27133a240 100644 --- a/constraint/bls12-381/system.go +++ b/constraint/bls12-381/system.go @@ -17,16 +17,13 @@ package cs import ( - "github.com/fxamacker/cbor/v2" "io" "time" "github.com/consensys/gnark/backend/witness" "github.com/consensys/gnark/constraint" csolver "github.com/consensys/gnark/constraint/solver" - "github.com/consensys/gnark/internal/backend/ioutils" "github.com/consensys/gnark/logger" - "reflect" "github.com/consensys/gnark-crypto/ecc" @@ -149,55 +146,6 @@ func (cs *system) CurveID() ecc.ID { return ecc.BLS12_381 } -// WriteTo encodes R1CS into provided io.Writer using cbor -func (cs *system) WriteTo(w io.Writer) (int64, error) { - _w := ioutils.WriterCounter{W: w} // wraps writer to count the bytes written - ts := getTagSet() - enc, err := cbor.CoreDetEncOptions().EncModeWithTags(ts) - if err != nil { - return 0, err - } - encoder := enc.NewEncoder(&_w) - - // encode our object - err = encoder.Encode(cs) - return _w.N, err -} - -// ReadFrom attempts to decode R1CS from io.Reader using cbor -func (cs *system) ReadFrom(r io.Reader) (int64, error) { - ts := getTagSet() - dm, err := cbor.DecOptions{ - MaxArrayElements: 2147483647, - MaxMapPairs: 2147483647, - }.DecModeWithTags(ts) - - if err != nil { - return 0, err - } - decoder := dm.NewDecoder(r) - - // initialize coeff table - cs.CoeffTable = newCoeffTable(0) - - if err := decoder.Decode(&cs); err != nil { - return int64(decoder.NumBytesRead()), err - } - - if err := cs.CheckSerializationHeader(); err != nil { - return int64(decoder.NumBytesRead()), err - } - - switch v := cs.CommitmentInfo.(type) { - case *constraint.Groth16Commitments: - cs.CommitmentInfo = *v - case *constraint.PlonkCommitments: - cs.CommitmentInfo = *v - } - - return int64(decoder.NumBytesRead()), nil -} - func (cs *system) GetCoefficient(i int) (r constraint.Element) { copy(r[:], cs.Coefficients[i][:]) return @@ -351,36 +299,6 @@ func (t *SparseR1CSSolution) ReadFrom(r io.Reader) (int64, error) { return n, err } -func getTagSet() cbor.TagSet { - // temporary for refactor - ts := cbor.NewTagSet() - // https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml - // 65536-15309735 Unassigned - tagNum := uint64(5309735) - addType := func(t reflect.Type) { - if err := ts.Add( - cbor.TagOptions{EncTag: cbor.EncTagRequired, DecTag: cbor.DecTagRequired}, - t, - tagNum, - ); err != nil { - panic(err) - } - tagNum++ - } - - addType(reflect.TypeOf(constraint.BlueprintGenericHint{})) - addType(reflect.TypeOf(constraint.BlueprintGenericR1C{})) - addType(reflect.TypeOf(constraint.BlueprintGenericSparseR1C{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CAdd{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CMul{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CBool{})) - addType(reflect.TypeOf(constraint.BlueprintLookupHint{})) - addType(reflect.TypeOf(constraint.Groth16Commitments{})) - addType(reflect.TypeOf(constraint.PlonkCommitments{})) - - return ts -} - func (s *system) AddGkr(gkr constraint.GkrInfo) error { return s.System.AddGkr(gkr) } diff --git a/constraint/bls24-315/coeff.go b/constraint/bls24-315/coeff.go index 084652f545..83d5fe1f43 100644 --- a/constraint/bls24-315/coeff.go +++ b/constraint/bls24-315/coeff.go @@ -17,6 +17,8 @@ package cs import ( + "encoding/binary" + "errors" "github.com/consensys/gnark/constraint" "github.com/consensys/gnark/internal/utils" "math/big" @@ -46,6 +48,42 @@ func newCoeffTable(capacity int) CoeffTable { } +func (ct *CoeffTable) toBytes() []byte { + buf := make([]byte, 0, 8+len(ct.Coefficients)*fr.Bytes) + ctLen := uint64(len(ct.Coefficients)) + + buf = binary.LittleEndian.AppendUint64(buf, ctLen) + for _, c := range ct.Coefficients { + for _, w := range c { + buf = binary.LittleEndian.AppendUint64(buf, w) + } + } + + return buf +} + +func (ct *CoeffTable) fromBytes(buf []byte) error { + if len(buf) < 8 { + return errors.New("invalid buffer size") + } + ctLen := binary.LittleEndian.Uint64(buf[:8]) + buf = buf[8:] + + if uint64(len(buf)) < ctLen*fr.Bytes { + return errors.New("invalid buffer size") + } + ct.Coefficients = make([]fr.Element, ctLen) + for i := uint64(0); i < ctLen; i++ { + var c fr.Element + k := int(i) * fr.Bytes + for j := 0; j < fr.Limbs; j++ { + c[j] = binary.LittleEndian.Uint64(buf[k+j*8 : k+(j+1)*8]) + } + ct.Coefficients[i] = c + } + return nil +} + func (ct *CoeffTable) AddCoeff(coeff constraint.Element) uint32 { c := (*fr.Element)(coeff[:]) var cID uint32 diff --git a/constraint/bls24-315/marshal.go b/constraint/bls24-315/marshal.go new file mode 100644 index 0000000000..ea13e57dad --- /dev/null +++ b/constraint/bls24-315/marshal.go @@ -0,0 +1,101 @@ +// Copyright 2020 ConsenSys Software Inc. +// +// 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. + +// Code generated by gnark DO NOT EDIT + +package cs + +import ( + "encoding/binary" + "fmt" + "io" + + "github.com/blang/semver/v4" +) + +// WriteTo encodes R1CS into provided io.Writer using cbor +func (cs *system) WriteTo(w io.Writer) (int64, error) { + b, err := cs.System.ToBytes() + if err != nil { + return 0, err + } + + c := cs.CoeffTable.toBytes() + + totalLen := uint64(len(b) + len(c)) + gnarkVersion := semver.MustParse(cs.GnarkVersion) + // write totalLen, gnarkVersion.Major, gnarkVersion.Minor, gnarkVersion.Patch using + // binary.LittleEndian + if err := binary.Write(w, binary.LittleEndian, totalLen); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Major); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Minor); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Patch); err != nil { + return 0, err + } + + // write the system + n, err := w.Write(b) + if err != nil { + return int64(n), err + } + + // write the coeff table + m, err := w.Write(c) + return int64(n+m) + 4*8, err +} + +// ReadFrom attempts to decode R1CS from io.Reader using cbor +func (cs *system) ReadFrom(r io.Reader) (int64, error) { + var totalLen uint64 + if err := binary.Read(r, binary.LittleEndian, &totalLen); err != nil { + return 0, err + } + + var major, minor, patch uint64 + if err := binary.Read(r, binary.LittleEndian, &major); err != nil { + return 0, err + } + if err := binary.Read(r, binary.LittleEndian, &minor); err != nil { + return 0, err + } + if err := binary.Read(r, binary.LittleEndian, &patch); err != nil { + return 0, err + } + // TODO @gbotrel validate version, duplicate logic with core.go CheckSerializationHeader + if major != 0 || minor < 10 { + return 0, fmt.Errorf("unsupported gnark version %d.%d.%d", major, minor, patch) + } + + data := make([]byte, totalLen) + if _, err := io.ReadFull(r, data); err != nil { + return 0, err + } + n, err := cs.System.FromBytes(data) + if err != nil { + return 0, err + } + data = data[n:] + + if err := cs.CoeffTable.fromBytes(data); err != nil { + return 0, err + } + + return int64(totalLen) + 4*8, nil +} diff --git a/constraint/bls24-315/solver.go b/constraint/bls24-315/solver.go index 27d316ac43..f67e5f9ee1 100644 --- a/constraint/bls24-315/solver.go +++ b/constraint/bls24-315/solver.go @@ -437,7 +437,7 @@ func (solver *solver) run() error { // then we check that the constraint is valid // if a[i] * b[i] != c[i]; it means the constraint is not satisfied var wg sync.WaitGroup - chTasks := make(chan []int, solver.nbTasks) + chTasks := make(chan []uint32, solver.nbTasks) chError := make(chan error, solver.nbTasks) // start a worker pool diff --git a/constraint/bls24-315/system.go b/constraint/bls24-315/system.go index 5bdb86eda6..cccd0e606c 100644 --- a/constraint/bls24-315/system.go +++ b/constraint/bls24-315/system.go @@ -17,16 +17,13 @@ package cs import ( - "github.com/fxamacker/cbor/v2" "io" "time" "github.com/consensys/gnark/backend/witness" "github.com/consensys/gnark/constraint" csolver "github.com/consensys/gnark/constraint/solver" - "github.com/consensys/gnark/internal/backend/ioutils" "github.com/consensys/gnark/logger" - "reflect" "github.com/consensys/gnark-crypto/ecc" @@ -149,55 +146,6 @@ func (cs *system) CurveID() ecc.ID { return ecc.BLS24_315 } -// WriteTo encodes R1CS into provided io.Writer using cbor -func (cs *system) WriteTo(w io.Writer) (int64, error) { - _w := ioutils.WriterCounter{W: w} // wraps writer to count the bytes written - ts := getTagSet() - enc, err := cbor.CoreDetEncOptions().EncModeWithTags(ts) - if err != nil { - return 0, err - } - encoder := enc.NewEncoder(&_w) - - // encode our object - err = encoder.Encode(cs) - return _w.N, err -} - -// ReadFrom attempts to decode R1CS from io.Reader using cbor -func (cs *system) ReadFrom(r io.Reader) (int64, error) { - ts := getTagSet() - dm, err := cbor.DecOptions{ - MaxArrayElements: 2147483647, - MaxMapPairs: 2147483647, - }.DecModeWithTags(ts) - - if err != nil { - return 0, err - } - decoder := dm.NewDecoder(r) - - // initialize coeff table - cs.CoeffTable = newCoeffTable(0) - - if err := decoder.Decode(&cs); err != nil { - return int64(decoder.NumBytesRead()), err - } - - if err := cs.CheckSerializationHeader(); err != nil { - return int64(decoder.NumBytesRead()), err - } - - switch v := cs.CommitmentInfo.(type) { - case *constraint.Groth16Commitments: - cs.CommitmentInfo = *v - case *constraint.PlonkCommitments: - cs.CommitmentInfo = *v - } - - return int64(decoder.NumBytesRead()), nil -} - func (cs *system) GetCoefficient(i int) (r constraint.Element) { copy(r[:], cs.Coefficients[i][:]) return @@ -351,36 +299,6 @@ func (t *SparseR1CSSolution) ReadFrom(r io.Reader) (int64, error) { return n, err } -func getTagSet() cbor.TagSet { - // temporary for refactor - ts := cbor.NewTagSet() - // https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml - // 65536-15309735 Unassigned - tagNum := uint64(5309735) - addType := func(t reflect.Type) { - if err := ts.Add( - cbor.TagOptions{EncTag: cbor.EncTagRequired, DecTag: cbor.DecTagRequired}, - t, - tagNum, - ); err != nil { - panic(err) - } - tagNum++ - } - - addType(reflect.TypeOf(constraint.BlueprintGenericHint{})) - addType(reflect.TypeOf(constraint.BlueprintGenericR1C{})) - addType(reflect.TypeOf(constraint.BlueprintGenericSparseR1C{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CAdd{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CMul{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CBool{})) - addType(reflect.TypeOf(constraint.BlueprintLookupHint{})) - addType(reflect.TypeOf(constraint.Groth16Commitments{})) - addType(reflect.TypeOf(constraint.PlonkCommitments{})) - - return ts -} - func (s *system) AddGkr(gkr constraint.GkrInfo) error { return s.System.AddGkr(gkr) } diff --git a/constraint/bls24-317/coeff.go b/constraint/bls24-317/coeff.go index 5df92edf1b..88c7138581 100644 --- a/constraint/bls24-317/coeff.go +++ b/constraint/bls24-317/coeff.go @@ -17,6 +17,8 @@ package cs import ( + "encoding/binary" + "errors" "github.com/consensys/gnark/constraint" "github.com/consensys/gnark/internal/utils" "math/big" @@ -46,6 +48,42 @@ func newCoeffTable(capacity int) CoeffTable { } +func (ct *CoeffTable) toBytes() []byte { + buf := make([]byte, 0, 8+len(ct.Coefficients)*fr.Bytes) + ctLen := uint64(len(ct.Coefficients)) + + buf = binary.LittleEndian.AppendUint64(buf, ctLen) + for _, c := range ct.Coefficients { + for _, w := range c { + buf = binary.LittleEndian.AppendUint64(buf, w) + } + } + + return buf +} + +func (ct *CoeffTable) fromBytes(buf []byte) error { + if len(buf) < 8 { + return errors.New("invalid buffer size") + } + ctLen := binary.LittleEndian.Uint64(buf[:8]) + buf = buf[8:] + + if uint64(len(buf)) < ctLen*fr.Bytes { + return errors.New("invalid buffer size") + } + ct.Coefficients = make([]fr.Element, ctLen) + for i := uint64(0); i < ctLen; i++ { + var c fr.Element + k := int(i) * fr.Bytes + for j := 0; j < fr.Limbs; j++ { + c[j] = binary.LittleEndian.Uint64(buf[k+j*8 : k+(j+1)*8]) + } + ct.Coefficients[i] = c + } + return nil +} + func (ct *CoeffTable) AddCoeff(coeff constraint.Element) uint32 { c := (*fr.Element)(coeff[:]) var cID uint32 diff --git a/constraint/bls24-317/marshal.go b/constraint/bls24-317/marshal.go new file mode 100644 index 0000000000..ea13e57dad --- /dev/null +++ b/constraint/bls24-317/marshal.go @@ -0,0 +1,101 @@ +// Copyright 2020 ConsenSys Software Inc. +// +// 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. + +// Code generated by gnark DO NOT EDIT + +package cs + +import ( + "encoding/binary" + "fmt" + "io" + + "github.com/blang/semver/v4" +) + +// WriteTo encodes R1CS into provided io.Writer using cbor +func (cs *system) WriteTo(w io.Writer) (int64, error) { + b, err := cs.System.ToBytes() + if err != nil { + return 0, err + } + + c := cs.CoeffTable.toBytes() + + totalLen := uint64(len(b) + len(c)) + gnarkVersion := semver.MustParse(cs.GnarkVersion) + // write totalLen, gnarkVersion.Major, gnarkVersion.Minor, gnarkVersion.Patch using + // binary.LittleEndian + if err := binary.Write(w, binary.LittleEndian, totalLen); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Major); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Minor); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Patch); err != nil { + return 0, err + } + + // write the system + n, err := w.Write(b) + if err != nil { + return int64(n), err + } + + // write the coeff table + m, err := w.Write(c) + return int64(n+m) + 4*8, err +} + +// ReadFrom attempts to decode R1CS from io.Reader using cbor +func (cs *system) ReadFrom(r io.Reader) (int64, error) { + var totalLen uint64 + if err := binary.Read(r, binary.LittleEndian, &totalLen); err != nil { + return 0, err + } + + var major, minor, patch uint64 + if err := binary.Read(r, binary.LittleEndian, &major); err != nil { + return 0, err + } + if err := binary.Read(r, binary.LittleEndian, &minor); err != nil { + return 0, err + } + if err := binary.Read(r, binary.LittleEndian, &patch); err != nil { + return 0, err + } + // TODO @gbotrel validate version, duplicate logic with core.go CheckSerializationHeader + if major != 0 || minor < 10 { + return 0, fmt.Errorf("unsupported gnark version %d.%d.%d", major, minor, patch) + } + + data := make([]byte, totalLen) + if _, err := io.ReadFull(r, data); err != nil { + return 0, err + } + n, err := cs.System.FromBytes(data) + if err != nil { + return 0, err + } + data = data[n:] + + if err := cs.CoeffTable.fromBytes(data); err != nil { + return 0, err + } + + return int64(totalLen) + 4*8, nil +} diff --git a/constraint/bls24-317/solver.go b/constraint/bls24-317/solver.go index 66306de96a..d07747acd9 100644 --- a/constraint/bls24-317/solver.go +++ b/constraint/bls24-317/solver.go @@ -437,7 +437,7 @@ func (solver *solver) run() error { // then we check that the constraint is valid // if a[i] * b[i] != c[i]; it means the constraint is not satisfied var wg sync.WaitGroup - chTasks := make(chan []int, solver.nbTasks) + chTasks := make(chan []uint32, solver.nbTasks) chError := make(chan error, solver.nbTasks) // start a worker pool diff --git a/constraint/bls24-317/system.go b/constraint/bls24-317/system.go index 2d9baec5d6..16c70457e0 100644 --- a/constraint/bls24-317/system.go +++ b/constraint/bls24-317/system.go @@ -17,16 +17,13 @@ package cs import ( - "github.com/fxamacker/cbor/v2" "io" "time" "github.com/consensys/gnark/backend/witness" "github.com/consensys/gnark/constraint" csolver "github.com/consensys/gnark/constraint/solver" - "github.com/consensys/gnark/internal/backend/ioutils" "github.com/consensys/gnark/logger" - "reflect" "github.com/consensys/gnark-crypto/ecc" @@ -149,55 +146,6 @@ func (cs *system) CurveID() ecc.ID { return ecc.BLS24_317 } -// WriteTo encodes R1CS into provided io.Writer using cbor -func (cs *system) WriteTo(w io.Writer) (int64, error) { - _w := ioutils.WriterCounter{W: w} // wraps writer to count the bytes written - ts := getTagSet() - enc, err := cbor.CoreDetEncOptions().EncModeWithTags(ts) - if err != nil { - return 0, err - } - encoder := enc.NewEncoder(&_w) - - // encode our object - err = encoder.Encode(cs) - return _w.N, err -} - -// ReadFrom attempts to decode R1CS from io.Reader using cbor -func (cs *system) ReadFrom(r io.Reader) (int64, error) { - ts := getTagSet() - dm, err := cbor.DecOptions{ - MaxArrayElements: 2147483647, - MaxMapPairs: 2147483647, - }.DecModeWithTags(ts) - - if err != nil { - return 0, err - } - decoder := dm.NewDecoder(r) - - // initialize coeff table - cs.CoeffTable = newCoeffTable(0) - - if err := decoder.Decode(&cs); err != nil { - return int64(decoder.NumBytesRead()), err - } - - if err := cs.CheckSerializationHeader(); err != nil { - return int64(decoder.NumBytesRead()), err - } - - switch v := cs.CommitmentInfo.(type) { - case *constraint.Groth16Commitments: - cs.CommitmentInfo = *v - case *constraint.PlonkCommitments: - cs.CommitmentInfo = *v - } - - return int64(decoder.NumBytesRead()), nil -} - func (cs *system) GetCoefficient(i int) (r constraint.Element) { copy(r[:], cs.Coefficients[i][:]) return @@ -351,36 +299,6 @@ func (t *SparseR1CSSolution) ReadFrom(r io.Reader) (int64, error) { return n, err } -func getTagSet() cbor.TagSet { - // temporary for refactor - ts := cbor.NewTagSet() - // https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml - // 65536-15309735 Unassigned - tagNum := uint64(5309735) - addType := func(t reflect.Type) { - if err := ts.Add( - cbor.TagOptions{EncTag: cbor.EncTagRequired, DecTag: cbor.DecTagRequired}, - t, - tagNum, - ); err != nil { - panic(err) - } - tagNum++ - } - - addType(reflect.TypeOf(constraint.BlueprintGenericHint{})) - addType(reflect.TypeOf(constraint.BlueprintGenericR1C{})) - addType(reflect.TypeOf(constraint.BlueprintGenericSparseR1C{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CAdd{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CMul{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CBool{})) - addType(reflect.TypeOf(constraint.BlueprintLookupHint{})) - addType(reflect.TypeOf(constraint.Groth16Commitments{})) - addType(reflect.TypeOf(constraint.PlonkCommitments{})) - - return ts -} - func (s *system) AddGkr(gkr constraint.GkrInfo) error { return s.System.AddGkr(gkr) } diff --git a/constraint/bn254/coeff.go b/constraint/bn254/coeff.go index da49b0e68b..f3a6f2d140 100644 --- a/constraint/bn254/coeff.go +++ b/constraint/bn254/coeff.go @@ -17,6 +17,8 @@ package cs import ( + "encoding/binary" + "errors" "github.com/consensys/gnark/constraint" "github.com/consensys/gnark/internal/utils" "math/big" @@ -46,6 +48,42 @@ func newCoeffTable(capacity int) CoeffTable { } +func (ct *CoeffTable) toBytes() []byte { + buf := make([]byte, 0, 8+len(ct.Coefficients)*fr.Bytes) + ctLen := uint64(len(ct.Coefficients)) + + buf = binary.LittleEndian.AppendUint64(buf, ctLen) + for _, c := range ct.Coefficients { + for _, w := range c { + buf = binary.LittleEndian.AppendUint64(buf, w) + } + } + + return buf +} + +func (ct *CoeffTable) fromBytes(buf []byte) error { + if len(buf) < 8 { + return errors.New("invalid buffer size") + } + ctLen := binary.LittleEndian.Uint64(buf[:8]) + buf = buf[8:] + + if uint64(len(buf)) < ctLen*fr.Bytes { + return errors.New("invalid buffer size") + } + ct.Coefficients = make([]fr.Element, ctLen) + for i := uint64(0); i < ctLen; i++ { + var c fr.Element + k := int(i) * fr.Bytes + for j := 0; j < fr.Limbs; j++ { + c[j] = binary.LittleEndian.Uint64(buf[k+j*8 : k+(j+1)*8]) + } + ct.Coefficients[i] = c + } + return nil +} + func (ct *CoeffTable) AddCoeff(coeff constraint.Element) uint32 { c := (*fr.Element)(coeff[:]) var cID uint32 diff --git a/constraint/bn254/marshal.go b/constraint/bn254/marshal.go new file mode 100644 index 0000000000..ea13e57dad --- /dev/null +++ b/constraint/bn254/marshal.go @@ -0,0 +1,101 @@ +// Copyright 2020 ConsenSys Software Inc. +// +// 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. + +// Code generated by gnark DO NOT EDIT + +package cs + +import ( + "encoding/binary" + "fmt" + "io" + + "github.com/blang/semver/v4" +) + +// WriteTo encodes R1CS into provided io.Writer using cbor +func (cs *system) WriteTo(w io.Writer) (int64, error) { + b, err := cs.System.ToBytes() + if err != nil { + return 0, err + } + + c := cs.CoeffTable.toBytes() + + totalLen := uint64(len(b) + len(c)) + gnarkVersion := semver.MustParse(cs.GnarkVersion) + // write totalLen, gnarkVersion.Major, gnarkVersion.Minor, gnarkVersion.Patch using + // binary.LittleEndian + if err := binary.Write(w, binary.LittleEndian, totalLen); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Major); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Minor); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Patch); err != nil { + return 0, err + } + + // write the system + n, err := w.Write(b) + if err != nil { + return int64(n), err + } + + // write the coeff table + m, err := w.Write(c) + return int64(n+m) + 4*8, err +} + +// ReadFrom attempts to decode R1CS from io.Reader using cbor +func (cs *system) ReadFrom(r io.Reader) (int64, error) { + var totalLen uint64 + if err := binary.Read(r, binary.LittleEndian, &totalLen); err != nil { + return 0, err + } + + var major, minor, patch uint64 + if err := binary.Read(r, binary.LittleEndian, &major); err != nil { + return 0, err + } + if err := binary.Read(r, binary.LittleEndian, &minor); err != nil { + return 0, err + } + if err := binary.Read(r, binary.LittleEndian, &patch); err != nil { + return 0, err + } + // TODO @gbotrel validate version, duplicate logic with core.go CheckSerializationHeader + if major != 0 || minor < 10 { + return 0, fmt.Errorf("unsupported gnark version %d.%d.%d", major, minor, patch) + } + + data := make([]byte, totalLen) + if _, err := io.ReadFull(r, data); err != nil { + return 0, err + } + n, err := cs.System.FromBytes(data) + if err != nil { + return 0, err + } + data = data[n:] + + if err := cs.CoeffTable.fromBytes(data); err != nil { + return 0, err + } + + return int64(totalLen) + 4*8, nil +} diff --git a/constraint/bn254/solver.go b/constraint/bn254/solver.go index f1d11446ec..9f59979c46 100644 --- a/constraint/bn254/solver.go +++ b/constraint/bn254/solver.go @@ -437,7 +437,7 @@ func (solver *solver) run() error { // then we check that the constraint is valid // if a[i] * b[i] != c[i]; it means the constraint is not satisfied var wg sync.WaitGroup - chTasks := make(chan []int, solver.nbTasks) + chTasks := make(chan []uint32, solver.nbTasks) chError := make(chan error, solver.nbTasks) // start a worker pool diff --git a/constraint/bn254/system.go b/constraint/bn254/system.go index 48c0eca7b7..abf6fa2038 100644 --- a/constraint/bn254/system.go +++ b/constraint/bn254/system.go @@ -17,16 +17,13 @@ package cs import ( - "github.com/fxamacker/cbor/v2" "io" "time" "github.com/consensys/gnark/backend/witness" "github.com/consensys/gnark/constraint" csolver "github.com/consensys/gnark/constraint/solver" - "github.com/consensys/gnark/internal/backend/ioutils" "github.com/consensys/gnark/logger" - "reflect" "github.com/consensys/gnark-crypto/ecc" @@ -149,55 +146,6 @@ func (cs *system) CurveID() ecc.ID { return ecc.BN254 } -// WriteTo encodes R1CS into provided io.Writer using cbor -func (cs *system) WriteTo(w io.Writer) (int64, error) { - _w := ioutils.WriterCounter{W: w} // wraps writer to count the bytes written - ts := getTagSet() - enc, err := cbor.CoreDetEncOptions().EncModeWithTags(ts) - if err != nil { - return 0, err - } - encoder := enc.NewEncoder(&_w) - - // encode our object - err = encoder.Encode(cs) - return _w.N, err -} - -// ReadFrom attempts to decode R1CS from io.Reader using cbor -func (cs *system) ReadFrom(r io.Reader) (int64, error) { - ts := getTagSet() - dm, err := cbor.DecOptions{ - MaxArrayElements: 2147483647, - MaxMapPairs: 2147483647, - }.DecModeWithTags(ts) - - if err != nil { - return 0, err - } - decoder := dm.NewDecoder(r) - - // initialize coeff table - cs.CoeffTable = newCoeffTable(0) - - if err := decoder.Decode(&cs); err != nil { - return int64(decoder.NumBytesRead()), err - } - - if err := cs.CheckSerializationHeader(); err != nil { - return int64(decoder.NumBytesRead()), err - } - - switch v := cs.CommitmentInfo.(type) { - case *constraint.Groth16Commitments: - cs.CommitmentInfo = *v - case *constraint.PlonkCommitments: - cs.CommitmentInfo = *v - } - - return int64(decoder.NumBytesRead()), nil -} - func (cs *system) GetCoefficient(i int) (r constraint.Element) { copy(r[:], cs.Coefficients[i][:]) return @@ -351,36 +299,6 @@ func (t *SparseR1CSSolution) ReadFrom(r io.Reader) (int64, error) { return n, err } -func getTagSet() cbor.TagSet { - // temporary for refactor - ts := cbor.NewTagSet() - // https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml - // 65536-15309735 Unassigned - tagNum := uint64(5309735) - addType := func(t reflect.Type) { - if err := ts.Add( - cbor.TagOptions{EncTag: cbor.EncTagRequired, DecTag: cbor.DecTagRequired}, - t, - tagNum, - ); err != nil { - panic(err) - } - tagNum++ - } - - addType(reflect.TypeOf(constraint.BlueprintGenericHint{})) - addType(reflect.TypeOf(constraint.BlueprintGenericR1C{})) - addType(reflect.TypeOf(constraint.BlueprintGenericSparseR1C{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CAdd{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CMul{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CBool{})) - addType(reflect.TypeOf(constraint.BlueprintLookupHint{})) - addType(reflect.TypeOf(constraint.Groth16Commitments{})) - addType(reflect.TypeOf(constraint.PlonkCommitments{})) - - return ts -} - func (s *system) AddGkr(gkr constraint.GkrInfo) error { return s.System.AddGkr(gkr) } diff --git a/constraint/bw6-633/coeff.go b/constraint/bw6-633/coeff.go index dd1d29ad18..fe3ce57616 100644 --- a/constraint/bw6-633/coeff.go +++ b/constraint/bw6-633/coeff.go @@ -17,6 +17,8 @@ package cs import ( + "encoding/binary" + "errors" "github.com/consensys/gnark/constraint" "github.com/consensys/gnark/internal/utils" "math/big" @@ -46,6 +48,42 @@ func newCoeffTable(capacity int) CoeffTable { } +func (ct *CoeffTable) toBytes() []byte { + buf := make([]byte, 0, 8+len(ct.Coefficients)*fr.Bytes) + ctLen := uint64(len(ct.Coefficients)) + + buf = binary.LittleEndian.AppendUint64(buf, ctLen) + for _, c := range ct.Coefficients { + for _, w := range c { + buf = binary.LittleEndian.AppendUint64(buf, w) + } + } + + return buf +} + +func (ct *CoeffTable) fromBytes(buf []byte) error { + if len(buf) < 8 { + return errors.New("invalid buffer size") + } + ctLen := binary.LittleEndian.Uint64(buf[:8]) + buf = buf[8:] + + if uint64(len(buf)) < ctLen*fr.Bytes { + return errors.New("invalid buffer size") + } + ct.Coefficients = make([]fr.Element, ctLen) + for i := uint64(0); i < ctLen; i++ { + var c fr.Element + k := int(i) * fr.Bytes + for j := 0; j < fr.Limbs; j++ { + c[j] = binary.LittleEndian.Uint64(buf[k+j*8 : k+(j+1)*8]) + } + ct.Coefficients[i] = c + } + return nil +} + func (ct *CoeffTable) AddCoeff(coeff constraint.Element) uint32 { c := (*fr.Element)(coeff[:]) var cID uint32 diff --git a/constraint/bw6-633/marshal.go b/constraint/bw6-633/marshal.go new file mode 100644 index 0000000000..ea13e57dad --- /dev/null +++ b/constraint/bw6-633/marshal.go @@ -0,0 +1,101 @@ +// Copyright 2020 ConsenSys Software Inc. +// +// 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. + +// Code generated by gnark DO NOT EDIT + +package cs + +import ( + "encoding/binary" + "fmt" + "io" + + "github.com/blang/semver/v4" +) + +// WriteTo encodes R1CS into provided io.Writer using cbor +func (cs *system) WriteTo(w io.Writer) (int64, error) { + b, err := cs.System.ToBytes() + if err != nil { + return 0, err + } + + c := cs.CoeffTable.toBytes() + + totalLen := uint64(len(b) + len(c)) + gnarkVersion := semver.MustParse(cs.GnarkVersion) + // write totalLen, gnarkVersion.Major, gnarkVersion.Minor, gnarkVersion.Patch using + // binary.LittleEndian + if err := binary.Write(w, binary.LittleEndian, totalLen); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Major); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Minor); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Patch); err != nil { + return 0, err + } + + // write the system + n, err := w.Write(b) + if err != nil { + return int64(n), err + } + + // write the coeff table + m, err := w.Write(c) + return int64(n+m) + 4*8, err +} + +// ReadFrom attempts to decode R1CS from io.Reader using cbor +func (cs *system) ReadFrom(r io.Reader) (int64, error) { + var totalLen uint64 + if err := binary.Read(r, binary.LittleEndian, &totalLen); err != nil { + return 0, err + } + + var major, minor, patch uint64 + if err := binary.Read(r, binary.LittleEndian, &major); err != nil { + return 0, err + } + if err := binary.Read(r, binary.LittleEndian, &minor); err != nil { + return 0, err + } + if err := binary.Read(r, binary.LittleEndian, &patch); err != nil { + return 0, err + } + // TODO @gbotrel validate version, duplicate logic with core.go CheckSerializationHeader + if major != 0 || minor < 10 { + return 0, fmt.Errorf("unsupported gnark version %d.%d.%d", major, minor, patch) + } + + data := make([]byte, totalLen) + if _, err := io.ReadFull(r, data); err != nil { + return 0, err + } + n, err := cs.System.FromBytes(data) + if err != nil { + return 0, err + } + data = data[n:] + + if err := cs.CoeffTable.fromBytes(data); err != nil { + return 0, err + } + + return int64(totalLen) + 4*8, nil +} diff --git a/constraint/bw6-633/solver.go b/constraint/bw6-633/solver.go index 6e531d5c7b..4b6f647cde 100644 --- a/constraint/bw6-633/solver.go +++ b/constraint/bw6-633/solver.go @@ -437,7 +437,7 @@ func (solver *solver) run() error { // then we check that the constraint is valid // if a[i] * b[i] != c[i]; it means the constraint is not satisfied var wg sync.WaitGroup - chTasks := make(chan []int, solver.nbTasks) + chTasks := make(chan []uint32, solver.nbTasks) chError := make(chan error, solver.nbTasks) // start a worker pool diff --git a/constraint/bw6-633/system.go b/constraint/bw6-633/system.go index 4b6715f7d6..e0f3d874cf 100644 --- a/constraint/bw6-633/system.go +++ b/constraint/bw6-633/system.go @@ -17,16 +17,13 @@ package cs import ( - "github.com/fxamacker/cbor/v2" "io" "time" "github.com/consensys/gnark/backend/witness" "github.com/consensys/gnark/constraint" csolver "github.com/consensys/gnark/constraint/solver" - "github.com/consensys/gnark/internal/backend/ioutils" "github.com/consensys/gnark/logger" - "reflect" "github.com/consensys/gnark-crypto/ecc" @@ -149,55 +146,6 @@ func (cs *system) CurveID() ecc.ID { return ecc.BW6_633 } -// WriteTo encodes R1CS into provided io.Writer using cbor -func (cs *system) WriteTo(w io.Writer) (int64, error) { - _w := ioutils.WriterCounter{W: w} // wraps writer to count the bytes written - ts := getTagSet() - enc, err := cbor.CoreDetEncOptions().EncModeWithTags(ts) - if err != nil { - return 0, err - } - encoder := enc.NewEncoder(&_w) - - // encode our object - err = encoder.Encode(cs) - return _w.N, err -} - -// ReadFrom attempts to decode R1CS from io.Reader using cbor -func (cs *system) ReadFrom(r io.Reader) (int64, error) { - ts := getTagSet() - dm, err := cbor.DecOptions{ - MaxArrayElements: 2147483647, - MaxMapPairs: 2147483647, - }.DecModeWithTags(ts) - - if err != nil { - return 0, err - } - decoder := dm.NewDecoder(r) - - // initialize coeff table - cs.CoeffTable = newCoeffTable(0) - - if err := decoder.Decode(&cs); err != nil { - return int64(decoder.NumBytesRead()), err - } - - if err := cs.CheckSerializationHeader(); err != nil { - return int64(decoder.NumBytesRead()), err - } - - switch v := cs.CommitmentInfo.(type) { - case *constraint.Groth16Commitments: - cs.CommitmentInfo = *v - case *constraint.PlonkCommitments: - cs.CommitmentInfo = *v - } - - return int64(decoder.NumBytesRead()), nil -} - func (cs *system) GetCoefficient(i int) (r constraint.Element) { copy(r[:], cs.Coefficients[i][:]) return @@ -351,36 +299,6 @@ func (t *SparseR1CSSolution) ReadFrom(r io.Reader) (int64, error) { return n, err } -func getTagSet() cbor.TagSet { - // temporary for refactor - ts := cbor.NewTagSet() - // https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml - // 65536-15309735 Unassigned - tagNum := uint64(5309735) - addType := func(t reflect.Type) { - if err := ts.Add( - cbor.TagOptions{EncTag: cbor.EncTagRequired, DecTag: cbor.DecTagRequired}, - t, - tagNum, - ); err != nil { - panic(err) - } - tagNum++ - } - - addType(reflect.TypeOf(constraint.BlueprintGenericHint{})) - addType(reflect.TypeOf(constraint.BlueprintGenericR1C{})) - addType(reflect.TypeOf(constraint.BlueprintGenericSparseR1C{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CAdd{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CMul{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CBool{})) - addType(reflect.TypeOf(constraint.BlueprintLookupHint{})) - addType(reflect.TypeOf(constraint.Groth16Commitments{})) - addType(reflect.TypeOf(constraint.PlonkCommitments{})) - - return ts -} - func (s *system) AddGkr(gkr constraint.GkrInfo) error { return s.System.AddGkr(gkr) } diff --git a/constraint/bw6-761/coeff.go b/constraint/bw6-761/coeff.go index 506ee5e586..ba271c7e89 100644 --- a/constraint/bw6-761/coeff.go +++ b/constraint/bw6-761/coeff.go @@ -17,6 +17,8 @@ package cs import ( + "encoding/binary" + "errors" "github.com/consensys/gnark/constraint" "github.com/consensys/gnark/internal/utils" "math/big" @@ -46,6 +48,42 @@ func newCoeffTable(capacity int) CoeffTable { } +func (ct *CoeffTable) toBytes() []byte { + buf := make([]byte, 0, 8+len(ct.Coefficients)*fr.Bytes) + ctLen := uint64(len(ct.Coefficients)) + + buf = binary.LittleEndian.AppendUint64(buf, ctLen) + for _, c := range ct.Coefficients { + for _, w := range c { + buf = binary.LittleEndian.AppendUint64(buf, w) + } + } + + return buf +} + +func (ct *CoeffTable) fromBytes(buf []byte) error { + if len(buf) < 8 { + return errors.New("invalid buffer size") + } + ctLen := binary.LittleEndian.Uint64(buf[:8]) + buf = buf[8:] + + if uint64(len(buf)) < ctLen*fr.Bytes { + return errors.New("invalid buffer size") + } + ct.Coefficients = make([]fr.Element, ctLen) + for i := uint64(0); i < ctLen; i++ { + var c fr.Element + k := int(i) * fr.Bytes + for j := 0; j < fr.Limbs; j++ { + c[j] = binary.LittleEndian.Uint64(buf[k+j*8 : k+(j+1)*8]) + } + ct.Coefficients[i] = c + } + return nil +} + func (ct *CoeffTable) AddCoeff(coeff constraint.Element) uint32 { c := (*fr.Element)(coeff[:]) var cID uint32 diff --git a/constraint/bw6-761/marshal.go b/constraint/bw6-761/marshal.go new file mode 100644 index 0000000000..ea13e57dad --- /dev/null +++ b/constraint/bw6-761/marshal.go @@ -0,0 +1,101 @@ +// Copyright 2020 ConsenSys Software Inc. +// +// 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. + +// Code generated by gnark DO NOT EDIT + +package cs + +import ( + "encoding/binary" + "fmt" + "io" + + "github.com/blang/semver/v4" +) + +// WriteTo encodes R1CS into provided io.Writer using cbor +func (cs *system) WriteTo(w io.Writer) (int64, error) { + b, err := cs.System.ToBytes() + if err != nil { + return 0, err + } + + c := cs.CoeffTable.toBytes() + + totalLen := uint64(len(b) + len(c)) + gnarkVersion := semver.MustParse(cs.GnarkVersion) + // write totalLen, gnarkVersion.Major, gnarkVersion.Minor, gnarkVersion.Patch using + // binary.LittleEndian + if err := binary.Write(w, binary.LittleEndian, totalLen); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Major); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Minor); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Patch); err != nil { + return 0, err + } + + // write the system + n, err := w.Write(b) + if err != nil { + return int64(n), err + } + + // write the coeff table + m, err := w.Write(c) + return int64(n+m) + 4*8, err +} + +// ReadFrom attempts to decode R1CS from io.Reader using cbor +func (cs *system) ReadFrom(r io.Reader) (int64, error) { + var totalLen uint64 + if err := binary.Read(r, binary.LittleEndian, &totalLen); err != nil { + return 0, err + } + + var major, minor, patch uint64 + if err := binary.Read(r, binary.LittleEndian, &major); err != nil { + return 0, err + } + if err := binary.Read(r, binary.LittleEndian, &minor); err != nil { + return 0, err + } + if err := binary.Read(r, binary.LittleEndian, &patch); err != nil { + return 0, err + } + // TODO @gbotrel validate version, duplicate logic with core.go CheckSerializationHeader + if major != 0 || minor < 10 { + return 0, fmt.Errorf("unsupported gnark version %d.%d.%d", major, minor, patch) + } + + data := make([]byte, totalLen) + if _, err := io.ReadFull(r, data); err != nil { + return 0, err + } + n, err := cs.System.FromBytes(data) + if err != nil { + return 0, err + } + data = data[n:] + + if err := cs.CoeffTable.fromBytes(data); err != nil { + return 0, err + } + + return int64(totalLen) + 4*8, nil +} diff --git a/constraint/bw6-761/solver.go b/constraint/bw6-761/solver.go index c28a80cf03..edfc3f53d7 100644 --- a/constraint/bw6-761/solver.go +++ b/constraint/bw6-761/solver.go @@ -437,7 +437,7 @@ func (solver *solver) run() error { // then we check that the constraint is valid // if a[i] * b[i] != c[i]; it means the constraint is not satisfied var wg sync.WaitGroup - chTasks := make(chan []int, solver.nbTasks) + chTasks := make(chan []uint32, solver.nbTasks) chError := make(chan error, solver.nbTasks) // start a worker pool diff --git a/constraint/bw6-761/system.go b/constraint/bw6-761/system.go index 7909122cf8..089322639b 100644 --- a/constraint/bw6-761/system.go +++ b/constraint/bw6-761/system.go @@ -17,16 +17,13 @@ package cs import ( - "github.com/fxamacker/cbor/v2" "io" "time" "github.com/consensys/gnark/backend/witness" "github.com/consensys/gnark/constraint" csolver "github.com/consensys/gnark/constraint/solver" - "github.com/consensys/gnark/internal/backend/ioutils" "github.com/consensys/gnark/logger" - "reflect" "github.com/consensys/gnark-crypto/ecc" @@ -149,55 +146,6 @@ func (cs *system) CurveID() ecc.ID { return ecc.BW6_761 } -// WriteTo encodes R1CS into provided io.Writer using cbor -func (cs *system) WriteTo(w io.Writer) (int64, error) { - _w := ioutils.WriterCounter{W: w} // wraps writer to count the bytes written - ts := getTagSet() - enc, err := cbor.CoreDetEncOptions().EncModeWithTags(ts) - if err != nil { - return 0, err - } - encoder := enc.NewEncoder(&_w) - - // encode our object - err = encoder.Encode(cs) - return _w.N, err -} - -// ReadFrom attempts to decode R1CS from io.Reader using cbor -func (cs *system) ReadFrom(r io.Reader) (int64, error) { - ts := getTagSet() - dm, err := cbor.DecOptions{ - MaxArrayElements: 2147483647, - MaxMapPairs: 2147483647, - }.DecModeWithTags(ts) - - if err != nil { - return 0, err - } - decoder := dm.NewDecoder(r) - - // initialize coeff table - cs.CoeffTable = newCoeffTable(0) - - if err := decoder.Decode(&cs); err != nil { - return int64(decoder.NumBytesRead()), err - } - - if err := cs.CheckSerializationHeader(); err != nil { - return int64(decoder.NumBytesRead()), err - } - - switch v := cs.CommitmentInfo.(type) { - case *constraint.Groth16Commitments: - cs.CommitmentInfo = *v - case *constraint.PlonkCommitments: - cs.CommitmentInfo = *v - } - - return int64(decoder.NumBytesRead()), nil -} - func (cs *system) GetCoefficient(i int) (r constraint.Element) { copy(r[:], cs.Coefficients[i][:]) return @@ -351,36 +299,6 @@ func (t *SparseR1CSSolution) ReadFrom(r io.Reader) (int64, error) { return n, err } -func getTagSet() cbor.TagSet { - // temporary for refactor - ts := cbor.NewTagSet() - // https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml - // 65536-15309735 Unassigned - tagNum := uint64(5309735) - addType := func(t reflect.Type) { - if err := ts.Add( - cbor.TagOptions{EncTag: cbor.EncTagRequired, DecTag: cbor.DecTagRequired}, - t, - tagNum, - ); err != nil { - panic(err) - } - tagNum++ - } - - addType(reflect.TypeOf(constraint.BlueprintGenericHint{})) - addType(reflect.TypeOf(constraint.BlueprintGenericR1C{})) - addType(reflect.TypeOf(constraint.BlueprintGenericSparseR1C{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CAdd{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CMul{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CBool{})) - addType(reflect.TypeOf(constraint.BlueprintLookupHint{})) - addType(reflect.TypeOf(constraint.Groth16Commitments{})) - addType(reflect.TypeOf(constraint.PlonkCommitments{})) - - return ts -} - func (s *system) AddGkr(gkr constraint.GkrInfo) error { return s.System.AddGkr(gkr) } diff --git a/constraint/core.go b/constraint/core.go index c37fc4fd10..5d5ff2de43 100644 --- a/constraint/core.go +++ b/constraint/core.go @@ -81,9 +81,9 @@ type System struct { Type SystemType - Instructions []PackedInstruction + Instructions []PackedInstruction `cbor:"-"` Blueprints []Blueprint - CallData []uint32 // huge slice. + CallData []uint32 `cbor:"-"` // can be != than len(instructions) NbConstraints int @@ -114,7 +114,7 @@ type System struct { // TODO @gbotrel these are currently updated after we add a constraint. // but in case the object is built from a serialized representation // we need to init the level builder lbWireLevel from the existing constraints. - Levels [][]int + Levels [][]uint32 `cbor:"-"` // scalar field q *big.Int `cbor:"-"` @@ -143,7 +143,7 @@ func NewSystem(scalarField *big.Int, capacity int, t SystemType) System { Instructions: make([]PackedInstruction, 0, capacity), CallData: make([]uint32, 0, capacity*8), lbWireLevel: make([]Level, 0, capacity), - Levels: make([][]int, 0, capacity/2), + Levels: make([][]uint32, 0, capacity/2), CommitmentInfo: NewCommitments(t), } @@ -409,11 +409,11 @@ func (cs *System) AddInstruction(bID BlueprintID, calldata []uint32) []uint32 { // update the instruction dependency tree level := blueprint.UpdateInstructionTree(inst, cs) - iID := len(cs.Instructions) - 1 + iID := uint32(len(cs.Instructions) - 1) // we can't skip levels, so appending is fine. if int(level) >= len(cs.Levels) { - cs.Levels = append(cs.Levels, []int{iID}) + cs.Levels = append(cs.Levels, []uint32{iID}) } else { cs.Levels[level] = append(cs.Levels[level], iID) } diff --git a/constraint/marshal.go b/constraint/marshal.go new file mode 100644 index 0000000000..06a0d2d6b7 --- /dev/null +++ b/constraint/marshal.go @@ -0,0 +1,363 @@ +package constraint + +import ( + "bytes" + "encoding/binary" + "errors" + "reflect" + + "github.com/consensys/gnark/internal/backend/ioutils" + "github.com/fxamacker/cbor/v2" + "golang.org/x/sync/errgroup" +) + +// ToBytes serializes the constraint system to a byte slice +// This is not meant to be called directly since the constraint.System is embedded in +// a "curve-typed" system (e.g. bls12-381.system) +func (cs *System) ToBytes() ([]byte, error) { + // we prepare and write 4 distinct blocks of data; + // that allow for a more efficient serialization/deserialization (+ parallelism) + var calldata, instructions, levels []byte + var g errgroup.Group + g.Go(func() error { + var err error + calldata, err = cs.calldataToBytes() + return err + }) + g.Go(func() error { + var err error + instructions, err = cs.instructionsToBytes() + return err + }) + g.Go(func() error { + var err error + levels, err = cs.levelsToBytes() + return err + }) + body, err := cs.toBytes() + if err != nil { + return nil, err + } + + if err := g.Wait(); err != nil { + return nil, err + } + + // header + h := header{ + levelsLen: uint64(len(levels)), + instructionsLen: uint64(len(instructions)), + calldataLen: uint64(len(calldata)), + bodyLen: uint64(len(body)), + } + + // write header + buf := h.toBytes() + buf = append(buf, levels...) + buf = append(buf, instructions...) + buf = append(buf, calldata...) + buf = append(buf, body...) + + return buf, nil +} + +// FromBytes deserializes the constraint system from a byte slice +// This is not meant to be called directly since the constraint.System is embedded in +// a "curve-typed" system (e.g. bls12-381.system) +func (cs *System) FromBytes(data []byte) (int, error) { + if len(data) < headerLen { + return 0, errors.New("invalid data length") + } + + // read the header which contains the length of each section + h := new(header) + h.fromBytes(data) + + if len(data) < headerLen+int(h.levelsLen)+int(h.instructionsLen)+int(h.calldataLen)+int(h.bodyLen) { + return 0, errors.New("invalid data length") + } + + // read the sections in parallel + var g errgroup.Group + g.Go(func() error { + return cs.levelsFromBytes(data[headerLen : headerLen+h.levelsLen]) + }) + + g.Go(func() error { + return cs.instructionsFromBytes(data[headerLen+h.levelsLen : headerLen+h.levelsLen+h.instructionsLen]) + }) + + g.Go(func() error { + return cs.calldataFromBytes(data[headerLen+h.levelsLen+h.instructionsLen : headerLen+h.levelsLen+h.instructionsLen+h.calldataLen]) + }) + + // CBOR decoding of the constraint system (except what we do directly in binary) + ts := getTagSet() + dm, err := cbor.DecOptions{ + MaxArrayElements: 2147483647, + MaxMapPairs: 2147483647, + }.DecModeWithTags(ts) + + if err != nil { + return 0, err + } + decoder := dm.NewDecoder(bytes.NewReader(data[headerLen+h.levelsLen+h.instructionsLen+h.calldataLen : headerLen+h.levelsLen+h.instructionsLen+h.calldataLen+h.bodyLen])) + + if err := decoder.Decode(&cs); err != nil { + return 0, err + } + + if err := cs.CheckSerializationHeader(); err != nil { + return 0, err + } + + switch v := cs.CommitmentInfo.(type) { + case *Groth16Commitments: + cs.CommitmentInfo = *v + case *PlonkCommitments: + cs.CommitmentInfo = *v + } + + if err := g.Wait(); err != nil { + return 0, err + } + + return headerLen + int(h.levelsLen) + int(h.instructionsLen) + int(h.calldataLen) + int(h.bodyLen), nil +} + +func (cs *System) toBytes() ([]byte, error) { + // CBOR encoding of the constraint system (except what we do directly in binary) + ts := getTagSet() + enc, err := cbor.CoreDetEncOptions().EncModeWithTags(ts) + if err != nil { + return nil, err + } + buf := new(bytes.Buffer) + encoder := enc.NewEncoder(buf) + + // encode our object + err = encoder.Encode(cs) + if err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +const headerLen = 4 * 8 + +type header struct { + // length in bytes of each sections + levelsLen uint64 + instructionsLen uint64 + calldataLen uint64 + bodyLen uint64 +} + +func (h *header) toBytes() []byte { + buf := make([]byte, 0, 8*4+h.levelsLen+h.instructionsLen+h.calldataLen+h.bodyLen) + + buf = binary.LittleEndian.AppendUint64(buf, h.levelsLen) + buf = binary.LittleEndian.AppendUint64(buf, h.instructionsLen) + buf = binary.LittleEndian.AppendUint64(buf, h.calldataLen) + buf = binary.LittleEndian.AppendUint64(buf, h.bodyLen) + + return buf +} + +func (h *header) fromBytes(buf []byte) { + h.levelsLen = binary.LittleEndian.Uint64(buf[:8]) + h.instructionsLen = binary.LittleEndian.Uint64(buf[8:16]) + h.calldataLen = binary.LittleEndian.Uint64(buf[16:24]) + h.bodyLen = binary.LittleEndian.Uint64(buf[24:32]) +} + +func (cs *System) calldataToBytes() ([]byte, error) { + // calldata doesn't compress as well as the other sections; + // it still give a better size to use intcomp.CompressUint32 here, + // and an even better one to use binary.UVarint + // but, we keep it simple as it makes deserialization much faster + // user is still free to compress the final []byte slice if needed. + buf := make([]byte, 0, 8+len(cs.CallData)*binary.MaxVarintLen32) + buf = binary.LittleEndian.AppendUint64(buf, uint64(len(cs.CallData))) + // binary.LittleEndian.PutUint64(buf, uint64(len(cs.CallData))) + // buf = buf[:8+len(cs.CallData)*4] + for _, v := range cs.CallData { + buf = binary.AppendUvarint(buf, uint64(v)) + // binary.LittleEndian.PutUint32(buf[8+i*4:8+i*4+4], v) + } + return buf, nil +} + +func (cs *System) instructionsToBytes() ([]byte, error) { + // prepare the []uint32 separated slices for the packed instructions + sBlueprintID := make([]uint32, len(cs.Instructions)) + sConstraintOffset := make([]uint32, len(cs.Instructions)) + sWireOffset := make([]uint32, len(cs.Instructions)) + sStartCallData := make([]uint64, len(cs.Instructions)) + + // collect them + for i, inst := range cs.Instructions { + sBlueprintID[i] = uint32(inst.BlueprintID) + sConstraintOffset[i] = inst.ConstraintOffset + sWireOffset[i] = inst.WireOffset + sStartCallData[i] = inst.StartCallData + } + + // they compress very well due to their nature (sequential integers) + var buf32 []uint32 + var err error + var buf bytes.Buffer + buf.Grow(4 * len(cs.Instructions) * 3) + + buf32, err = ioutils.CompressAndWriteUints32(&buf, sBlueprintID, buf32) + if err != nil { + return nil, err + } + buf32, err = ioutils.CompressAndWriteUints32(&buf, sConstraintOffset, buf32) + if err != nil { + return nil, err + } + _, err = ioutils.CompressAndWriteUints32(&buf, sWireOffset, buf32) + if err != nil { + return nil, err + } + + err = ioutils.CompressAndWriteUints64(&buf, sStartCallData) + if err != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +func (cs *System) levelsToBytes() ([]byte, error) { + // they compress very well due to their nature (sequential integers) + var buf32 []uint32 + var buf bytes.Buffer + var err error + buf.Grow(4 * len(cs.Instructions)) + + binary.Write(&buf, binary.LittleEndian, uint64(len(cs.Levels))) + for _, l := range cs.Levels { + buf32, err = ioutils.CompressAndWriteUints32(&buf, l, buf32) + if err != nil { + return nil, err + } + } + + return buf.Bytes(), nil +} + +func (cs *System) levelsFromBytes(in []byte) error { + + levelsLen := binary.LittleEndian.Uint64(in[:8]) + + in = in[8:] + + var ( + buf32 []uint32 + err error + n int + ) + + cs.Levels = make([][]uint32, levelsLen) + for i := range cs.Levels { + buf32, n, cs.Levels[i], err = ioutils.ReadAndDecompressUints32(in, buf32) + if err != nil { + return err + } + in = in[n:] + } + + return nil +} + +func (cs *System) instructionsFromBytes(in []byte) error { + + // read the packed instructions + var ( + sBlueprintID, sConstraintOffset, sWireOffset []uint32 + sStartCallData []uint64 + err error + n int + buf32 []uint32 + ) + buf32, n, sBlueprintID, err = ioutils.ReadAndDecompressUints32(in, buf32) + if err != nil { + return err + } + in = in[n:] + buf32, n, sConstraintOffset, err = ioutils.ReadAndDecompressUints32(in, buf32) + if err != nil { + return err + } + in = in[n:] + _, n, sWireOffset, err = ioutils.ReadAndDecompressUints32(in, buf32) + if err != nil { + return err + } + in = in[n:] + _, sStartCallData, err = ioutils.ReadAndDecompressUints64(in) + if err != nil { + return err + } + + // rebuild the instructions + cs.Instructions = make([]PackedInstruction, len(sBlueprintID)) + for i := range cs.Instructions { + cs.Instructions[i] = PackedInstruction{ + BlueprintID: BlueprintID(sBlueprintID[i]), + ConstraintOffset: sConstraintOffset[i], + WireOffset: sWireOffset[i], + StartCallData: sStartCallData[i], + } + } + + return nil +} + +func (cs *System) calldataFromBytes(buf []byte) error { + calldataLen := binary.LittleEndian.Uint64(buf[:8]) + cs.CallData = make([]uint32, calldataLen) + buf = buf[8:] + for i := uint64(0); i < calldataLen; i++ { + v, n := binary.Uvarint(buf[:min(len(buf), binary.MaxVarintLen64)]) + if n <= 0 { + return errors.New("invalid calldata") + } + cs.CallData[i] = uint32(v) + buf = buf[n:] + } + return nil +} + +func getTagSet() cbor.TagSet { + // temporary for refactor + ts := cbor.NewTagSet() + // https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml + // 65536-15309735 Unassigned + tagNum := uint64(5309735) + addType := func(t reflect.Type) { + if err := ts.Add( + cbor.TagOptions{EncTag: cbor.EncTagRequired, DecTag: cbor.DecTagRequired}, + t, + tagNum, + ); err != nil { + panic(err) + } + tagNum++ + } + + addType(reflect.TypeOf(BlueprintGenericHint{})) + addType(reflect.TypeOf(BlueprintGenericR1C{})) + addType(reflect.TypeOf(BlueprintGenericSparseR1C{})) + addType(reflect.TypeOf(BlueprintSparseR1CAdd{})) + addType(reflect.TypeOf(BlueprintSparseR1CMul{})) + addType(reflect.TypeOf(BlueprintSparseR1CBool{})) + addType(reflect.TypeOf(BlueprintLookupHint{})) + addType(reflect.TypeOf(Groth16Commitments{})) + addType(reflect.TypeOf(PlonkCommitments{})) + + return ts +} diff --git a/constraint/tinyfield/coeff.go b/constraint/tinyfield/coeff.go index 3aec8da553..73f8c0c5b0 100644 --- a/constraint/tinyfield/coeff.go +++ b/constraint/tinyfield/coeff.go @@ -17,6 +17,8 @@ package cs import ( + "encoding/binary" + "errors" "github.com/consensys/gnark/constraint" "github.com/consensys/gnark/internal/utils" "math/big" @@ -46,6 +48,42 @@ func newCoeffTable(capacity int) CoeffTable { } +func (ct *CoeffTable) toBytes() []byte { + buf := make([]byte, 0, 8+len(ct.Coefficients)*fr.Bytes) + ctLen := uint64(len(ct.Coefficients)) + + buf = binary.LittleEndian.AppendUint64(buf, ctLen) + for _, c := range ct.Coefficients { + for _, w := range c { + buf = binary.LittleEndian.AppendUint64(buf, w) + } + } + + return buf +} + +func (ct *CoeffTable) fromBytes(buf []byte) error { + if len(buf) < 8 { + return errors.New("invalid buffer size") + } + ctLen := binary.LittleEndian.Uint64(buf[:8]) + buf = buf[8:] + + if uint64(len(buf)) < ctLen*fr.Bytes { + return errors.New("invalid buffer size") + } + ct.Coefficients = make([]fr.Element, ctLen) + for i := uint64(0); i < ctLen; i++ { + var c fr.Element + k := int(i) * fr.Bytes + for j := 0; j < fr.Limbs; j++ { + c[j] = binary.LittleEndian.Uint64(buf[k+j*8 : k+(j+1)*8]) + } + ct.Coefficients[i] = c + } + return nil +} + func (ct *CoeffTable) AddCoeff(coeff constraint.Element) uint32 { c := (*fr.Element)(coeff[:]) var cID uint32 diff --git a/constraint/tinyfield/marshal.go b/constraint/tinyfield/marshal.go new file mode 100644 index 0000000000..ea13e57dad --- /dev/null +++ b/constraint/tinyfield/marshal.go @@ -0,0 +1,101 @@ +// Copyright 2020 ConsenSys Software Inc. +// +// 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. + +// Code generated by gnark DO NOT EDIT + +package cs + +import ( + "encoding/binary" + "fmt" + "io" + + "github.com/blang/semver/v4" +) + +// WriteTo encodes R1CS into provided io.Writer using cbor +func (cs *system) WriteTo(w io.Writer) (int64, error) { + b, err := cs.System.ToBytes() + if err != nil { + return 0, err + } + + c := cs.CoeffTable.toBytes() + + totalLen := uint64(len(b) + len(c)) + gnarkVersion := semver.MustParse(cs.GnarkVersion) + // write totalLen, gnarkVersion.Major, gnarkVersion.Minor, gnarkVersion.Patch using + // binary.LittleEndian + if err := binary.Write(w, binary.LittleEndian, totalLen); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Major); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Minor); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Patch); err != nil { + return 0, err + } + + // write the system + n, err := w.Write(b) + if err != nil { + return int64(n), err + } + + // write the coeff table + m, err := w.Write(c) + return int64(n+m) + 4*8, err +} + +// ReadFrom attempts to decode R1CS from io.Reader using cbor +func (cs *system) ReadFrom(r io.Reader) (int64, error) { + var totalLen uint64 + if err := binary.Read(r, binary.LittleEndian, &totalLen); err != nil { + return 0, err + } + + var major, minor, patch uint64 + if err := binary.Read(r, binary.LittleEndian, &major); err != nil { + return 0, err + } + if err := binary.Read(r, binary.LittleEndian, &minor); err != nil { + return 0, err + } + if err := binary.Read(r, binary.LittleEndian, &patch); err != nil { + return 0, err + } + // TODO @gbotrel validate version, duplicate logic with core.go CheckSerializationHeader + if major != 0 || minor < 10 { + return 0, fmt.Errorf("unsupported gnark version %d.%d.%d", major, minor, patch) + } + + data := make([]byte, totalLen) + if _, err := io.ReadFull(r, data); err != nil { + return 0, err + } + n, err := cs.System.FromBytes(data) + if err != nil { + return 0, err + } + data = data[n:] + + if err := cs.CoeffTable.fromBytes(data); err != nil { + return 0, err + } + + return int64(totalLen) + 4*8, nil +} diff --git a/constraint/tinyfield/solver.go b/constraint/tinyfield/solver.go index 11fe6a7ba7..84e920572d 100644 --- a/constraint/tinyfield/solver.go +++ b/constraint/tinyfield/solver.go @@ -430,7 +430,7 @@ func (solver *solver) run() error { // then we check that the constraint is valid // if a[i] * b[i] != c[i]; it means the constraint is not satisfied var wg sync.WaitGroup - chTasks := make(chan []int, solver.nbTasks) + chTasks := make(chan []uint32, solver.nbTasks) chError := make(chan error, solver.nbTasks) // start a worker pool diff --git a/constraint/tinyfield/system.go b/constraint/tinyfield/system.go index dceacfe31d..e8671cea2e 100644 --- a/constraint/tinyfield/system.go +++ b/constraint/tinyfield/system.go @@ -17,16 +17,13 @@ package cs import ( - "github.com/fxamacker/cbor/v2" "io" "time" "github.com/consensys/gnark/backend/witness" "github.com/consensys/gnark/constraint" csolver "github.com/consensys/gnark/constraint/solver" - "github.com/consensys/gnark/internal/backend/ioutils" "github.com/consensys/gnark/logger" - "reflect" "github.com/consensys/gnark-crypto/ecc" @@ -149,55 +146,6 @@ func (cs *system) CurveID() ecc.ID { return ecc.UNKNOWN } -// WriteTo encodes R1CS into provided io.Writer using cbor -func (cs *system) WriteTo(w io.Writer) (int64, error) { - _w := ioutils.WriterCounter{W: w} // wraps writer to count the bytes written - ts := getTagSet() - enc, err := cbor.CoreDetEncOptions().EncModeWithTags(ts) - if err != nil { - return 0, err - } - encoder := enc.NewEncoder(&_w) - - // encode our object - err = encoder.Encode(cs) - return _w.N, err -} - -// ReadFrom attempts to decode R1CS from io.Reader using cbor -func (cs *system) ReadFrom(r io.Reader) (int64, error) { - ts := getTagSet() - dm, err := cbor.DecOptions{ - MaxArrayElements: 2147483647, - MaxMapPairs: 2147483647, - }.DecModeWithTags(ts) - - if err != nil { - return 0, err - } - decoder := dm.NewDecoder(r) - - // initialize coeff table - cs.CoeffTable = newCoeffTable(0) - - if err := decoder.Decode(&cs); err != nil { - return int64(decoder.NumBytesRead()), err - } - - if err := cs.CheckSerializationHeader(); err != nil { - return int64(decoder.NumBytesRead()), err - } - - switch v := cs.CommitmentInfo.(type) { - case *constraint.Groth16Commitments: - cs.CommitmentInfo = *v - case *constraint.PlonkCommitments: - cs.CommitmentInfo = *v - } - - return int64(decoder.NumBytesRead()), nil -} - func (cs *system) GetCoefficient(i int) (r constraint.Element) { copy(r[:], cs.Coefficients[i][:]) return @@ -351,36 +299,6 @@ func (t *SparseR1CSSolution) ReadFrom(r io.Reader) (int64, error) { return n, err } -func getTagSet() cbor.TagSet { - // temporary for refactor - ts := cbor.NewTagSet() - // https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml - // 65536-15309735 Unassigned - tagNum := uint64(5309735) - addType := func(t reflect.Type) { - if err := ts.Add( - cbor.TagOptions{EncTag: cbor.EncTagRequired, DecTag: cbor.DecTagRequired}, - t, - tagNum, - ); err != nil { - panic(err) - } - tagNum++ - } - - addType(reflect.TypeOf(constraint.BlueprintGenericHint{})) - addType(reflect.TypeOf(constraint.BlueprintGenericR1C{})) - addType(reflect.TypeOf(constraint.BlueprintGenericSparseR1C{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CAdd{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CMul{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CBool{})) - addType(reflect.TypeOf(constraint.BlueprintLookupHint{})) - addType(reflect.TypeOf(constraint.Groth16Commitments{})) - addType(reflect.TypeOf(constraint.PlonkCommitments{})) - - return ts -} - func (s *system) AddGkr(gkr constraint.GkrInfo) error { return s.System.AddGkr(gkr) } diff --git a/frontend/cs/scs/builder.go b/frontend/cs/scs/builder.go index 0ca3666fac..deec03d143 100644 --- a/frontend/cs/scs/builder.go +++ b/frontend/cs/scs/builder.go @@ -192,6 +192,13 @@ func (builder *builder) addPlonkConstraint(c sparseR1C, debugInfo ...constraint. if !c.qM.IsZero() && (c.xa == 0 || c.xb == 0) { // TODO this is internal but not easy to detect; if qM is set, but one or both of xa / xb is not, // since wireID == 0 is a valid wire, it may trigger unexpected behavior. + // + // ivokub: This essentially means we add a constraint which is always + // satisfied for any input. It only increases the number of constraints + // without adding any real constraints on the inputs. But this is good + // to catch unoptimal code on the caller side -- we have found a few + // multiplications by zero in field emulation and emulated group + // arithmetic. And this has allowed to optimize the implementation. log := logger.Logger() log.Warn().Msg("adding a plonk constraint with qM set but xa or xb == 0 (wire 0)") } @@ -715,19 +722,24 @@ func (builder *builder) GetWireConstraints(wires []frontend.Variable, addMissing } lookup[ww.WireID()] = struct{}{} } + nbPub := builder.cs.GetNbPublicVariables() res := make([][2]int, 0, len(wires)) iterator := builder.cs.GetSparseR1CIterator() for c, constraintIdx := iterator.Next(), 0; c != nil; c, constraintIdx = iterator.Next(), constraintIdx+1 { if _, ok := lookup[int(c.XA)]; ok { - res = append(res, [2]int{constraintIdx, 0}) + res = append(res, [2]int{nbPub + constraintIdx, 0}) delete(lookup, int(c.XA)) continue } if _, ok := lookup[int(c.XB)]; ok { - res = append(res, [2]int{constraintIdx, 1}) + res = append(res, [2]int{nbPub + constraintIdx, 1}) delete(lookup, int(c.XB)) continue } + if len(lookup) == 0 { + // we can break early if we found constraints for all the wires + break + } } if addMissing { nbWitnessWires := builder.cs.GetNbPublicVariables() + builder.cs.GetNbSecretVariables() @@ -741,7 +753,7 @@ func (builder *builder) GetWireConstraints(wires []frontend.Variable, addMissing QL: constraint.CoeffIdOne, QO: constraint.CoeffIdMinusOne, }, builder.genericGate) - res = append(res, [2]int{constraintIdx, 0}) + res = append(res, [2]int{nbPub + constraintIdx, 0}) delete(lookup, k) } } diff --git a/frontend/schema/walk.go b/frontend/schema/walk.go index e62a18db0e..f3a8fb9cab 100644 --- a/frontend/schema/walk.go +++ b/frontend/schema/walk.go @@ -96,6 +96,10 @@ func (w *walker) arraySliceElem(index int, v reflect.Value) error { if v.CanAddr() && v.Addr().CanInterface() { // TODO @gbotrel don't like that hook, undesirable side effects // will be hard to detect; (for example calling Parse multiple times will init multiple times!) + // + // ivokub: completely agree, I have had to work around quite a lot in + // field emulation to "deinitialize" the elements. Maybe we can have a + // destructor/deinit hook also? value := v.Addr().Interface() if ih, hasInitHook := value.(InitHook); hasInitHook { ih.GnarkInitHook() @@ -164,6 +168,10 @@ func (w *walker) StructField(sf reflect.StructField, v reflect.Value) error { if v.CanAddr() && v.Addr().CanInterface() { // TODO @gbotrel don't like that hook, undesirable side effects // will be hard to detect; (for example calling Parse multiple times will init multiple times!) + // + // ivokub: completely agree, I have had to work around quite a lot in + // field emulation to "deinitialize" the elements. Maybe we can have a + // destructor/deinit hook also? value := v.Addr().Interface() if ih, hasInitHook := value.(InitHook); hasInitHook { ih.GnarkInitHook() diff --git a/go.mod b/go.mod index b14fb910fc..4805c741f0 100644 --- a/go.mod +++ b/go.mod @@ -9,13 +9,14 @@ require ( github.com/blang/semver/v4 v4.0.0 github.com/consensys/bavard v0.1.13 github.com/consensys/compress v0.2.5 - github.com/consensys/gnark-crypto v0.12.2-0.20240215234832-d72fcb379d3e + github.com/consensys/gnark-crypto v0.12.2-0.20240504013751-564b6f724c3b github.com/fxamacker/cbor/v2 v2.5.0 github.com/google/go-cmp v0.5.9 github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b github.com/icza/bitio v1.1.0 github.com/ingonyama-zk/iciclegnark v0.1.0 github.com/leanovate/gopter v0.2.9 + github.com/ronanh/intcomp v1.1.0 github.com/rs/zerolog v1.30.0 github.com/stretchr/testify v1.8.4 golang.org/x/crypto v0.17.0 diff --git a/go.sum b/go.sum index ccd5701e49..99806d860f 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,8 @@ github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/Yj github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/compress v0.2.5 h1:gJr1hKzbOD36JFsF1AN8lfXz1yevnJi1YolffY19Ntk= github.com/consensys/compress v0.2.5/go.mod h1:pyM+ZXiNUh7/0+AUjUf9RKUM6vSH7T/fsn5LLS0j1Tk= -github.com/consensys/gnark-crypto v0.12.2-0.20240215234832-d72fcb379d3e h1:MKdOuCiy2DAX1tMp2YsmtNDaqdigpY6B5cZQDJ9BvEo= -github.com/consensys/gnark-crypto v0.12.2-0.20240215234832-d72fcb379d3e/go.mod h1:wKqwsieaKPThcFkHe0d0zMsbHEUWFmZcG7KBCse210o= +github.com/consensys/gnark-crypto v0.12.2-0.20240504013751-564b6f724c3b h1:tu0NaVr64o6vXzy9rYSK/LCZXmS+u/k9eP1F8OtRUWQ= +github.com/consensys/gnark-crypto v0.12.2-0.20240504013751-564b6f724c3b/go.mod h1:wKqwsieaKPThcFkHe0d0zMsbHEUWFmZcG7KBCse210o= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -48,6 +48,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/ronanh/intcomp v1.1.0 h1:i54kxmpmSoOZFcWPMWryuakN0vLxLswASsGa07zkvLU= +github.com/ronanh/intcomp v1.1.0/go.mod h1:7FOLy3P3Zj3er/kVrU/pl+Ql7JFZj7bwliMGketo0IU= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c= github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w= diff --git a/internal/backend/ioutils/intcomp.go b/internal/backend/ioutils/intcomp.go new file mode 100644 index 0000000000..def78616b1 --- /dev/null +++ b/internal/backend/ioutils/intcomp.go @@ -0,0 +1,74 @@ +package ioutils + +import ( + "encoding/binary" + "io" + + "github.com/ronanh/intcomp" +) + +// CompressAndWriteUints32 compresses a slice of uint32 and writes it to w. +// It returns the input buffer (possibly extended) for future use. +func CompressAndWriteUints32(w io.Writer, input []uint32, buffer []uint32) ([]uint32, error) { + buffer = buffer[:0] + buffer = intcomp.CompressUint32(input, buffer) + if err := binary.Write(w, binary.LittleEndian, uint64(len(buffer))); err != nil { + return nil, err + } + if err := binary.Write(w, binary.LittleEndian, buffer); err != nil { + return nil, err + } + return buffer, nil +} + +// CompressAndWriteUints64 compresses a slice of uint64 and writes it to w. +// It returns the input buffer (possibly extended) for future use. +func CompressAndWriteUints64(w io.Writer, input []uint64) error { + buffer := intcomp.CompressUint64(input, nil) + if err := binary.Write(w, binary.LittleEndian, uint64(len(buffer))); err != nil { + return err + } + return binary.Write(w, binary.LittleEndian, buffer) +} + +// ReadAndDecompressUints32 reads a compressed slice of uint32 from r and decompresses it. +// It returns the number of bytes read, the decompressed slice and an error. +func ReadAndDecompressUints32(in []byte, buf32 []uint32) (outbuf32 []uint32, read int, out []uint32, err error) { + if len(in) < 8 { + return buf32, 0, nil, io.ErrUnexpectedEOF + } + length := binary.LittleEndian.Uint64(in[:8]) + if uint64(len(in)) < 8+4*length { + return buf32, 0, nil, io.ErrUnexpectedEOF + } + in = in[8 : 8+4*length] + if cap(buf32) < int(length) { + buf32 = make([]uint32, length) + } else { + buf32 = buf32[:length] + } + + for i := 0; i < int(length); i++ { + buf32[i] = binary.LittleEndian.Uint32(in[4*i : 4*(i+1)]) + } + + return buf32, 8 + 4*int(length), intcomp.UncompressUint32(buf32, nil), nil +} + +// ReadAndDecompressUints64 reads a compressed slice of uint64 from r and decompresses it. +// It returns the number of bytes read, the decompressed slice and an error. +func ReadAndDecompressUints64(in []byte) (int, []uint64, error) { + if len(in) < 8 { + return 0, nil, io.ErrUnexpectedEOF + } + length := binary.LittleEndian.Uint64(in[:8]) + if uint64(len(in)) < 8+8*length { + return 0, nil, io.ErrUnexpectedEOF + } + in = in[8 : 8+8*length] + buffer := make([]uint64, length) + for i := 0; i < int(length); i++ { + buffer[i] = binary.LittleEndian.Uint64(in[8*i : 8*(i+1)]) + } + return 8 + 8*int(length), intcomp.UncompressUint64(buffer, nil), nil +} diff --git a/internal/backend/ioutils/intcomp_test.go b/internal/backend/ioutils/intcomp_test.go new file mode 100644 index 0000000000..4abfdc3f44 --- /dev/null +++ b/internal/backend/ioutils/intcomp_test.go @@ -0,0 +1,38 @@ +package ioutils + +import ( + "bytes" + "testing" +) + +func FuzzIntcomp32(f *testing.F) { + f.Fuzz(func(t *testing.T, in []byte) { + // convert in into a []uint32 ref slice; we just parse by multiple of 4 bytes + // and convert to uint32 + data := make([]uint32, len(in)/4) + for i := 0; i < len(data); i++ { + data[i] = uint32(in[i*4]) | uint32(in[i*4+1])<<8 | uint32(in[i*4+2])<<16 | uint32(in[i*4+3])<<24 + } + + var buf bytes.Buffer + if _, err := CompressAndWriteUints32(&buf, data, nil); err != nil { + t.Fatalf("CompressAndWriteUints32: %v", err) + } + _, n, out, err := ReadAndDecompressUints32(buf.Bytes(), nil) + if err != nil { + t.Fatalf("ReadAndDecompressUints32: %v", err) + } + if n != len(buf.Bytes()) { + t.Fatalf("ReadAndDecompressUints32: n=%d, want %d", n, len(buf.Bytes())) + } + if len(out) != len(data) { + t.Fatalf("ReadAndDecompressUints32: len(out)=%d, want %d", len(out), len(data)) + } + for i := 0; i < len(data); i++ { + if out[i] != data[i] { + t.Fatalf("ReadAndDecompressUints32: out[%d]=%d, want %d", i, out[i], data[i]) + } + } + }) + +} diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/01896cf457f9724711cdb5c47ae61e871610cc20925e4162dc512a99b16885f0 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/01896cf457f9724711cdb5c47ae61e871610cc20925e4162dc512a99b16885f0 new file mode 100644 index 0000000000..42bbdfdbee --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/01896cf457f9724711cdb5c47ae61e871610cc20925e4162dc512a99b16885f0 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/03bb2fe837460a2653f67a14e1a8934d756174eeae4bdc8e0f0f900af7048586 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/03bb2fe837460a2653f67a14e1a8934d756174eeae4bdc8e0f0f900af7048586 new file mode 100644 index 0000000000..ab32aa48a8 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/03bb2fe837460a2653f67a14e1a8934d756174eeae4bdc8e0f0f900af7048586 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00010000000000000000010000000000000000000000000000001\\xb0011\\xb0\\xb00000000\\xb00000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/03e05f2853ad338dcc021f05b8959b1f3633c8a1c27ccac74e768325649977be b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/03e05f2853ad338dcc021f05b8959b1f3633c8a1c27ccac74e768325649977be new file mode 100644 index 0000000000..b0be537a60 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/03e05f2853ad338dcc021f05b8959b1f3633c8a1c27ccac74e768325649977be @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\r0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\r0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\r0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\r0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/040184a38a688233199662fb82e804832282bdcd652e915e40fd2b32d6b6d0f2 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/040184a38a688233199662fb82e804832282bdcd652e915e40fd2b32d6b6d0f2 new file mode 100644 index 0000000000..3519628d76 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/040184a38a688233199662fb82e804832282bdcd652e915e40fd2b32d6b6d0f2 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000\\xd7000 00XA000B0000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/04d40af2f46a8834635bf775c66737abe55c2c04a7e9ddd0879c71152cb98439 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/04d40af2f46a8834635bf775c66737abe55c2c04a7e9ddd0879c71152cb98439 new file mode 100644 index 0000000000..090c9fc4c4 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/04d40af2f46a8834635bf775c66737abe55c2c04a7e9ddd0879c71152cb98439 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/06b5c2a93cba6f3652d6fac41dfc931ebb3d87736da993abfdc1a41eb20fec6a b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/06b5c2a93cba6f3652d6fac41dfc931ebb3d87736da993abfdc1a41eb20fec6a new file mode 100644 index 0000000000..76524340b8 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/06b5c2a93cba6f3652d6fac41dfc931ebb3d87736da993abfdc1a41eb20fec6a @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K00AK0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K000K00AK00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/06f200f8d192caa2b678a814f20c3cc8893e6a7e8f4dd07222010d6a7aae2e65 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/06f200f8d192caa2b678a814f20c3cc8893e6a7e8f4dd07222010d6a7aae2e65 new file mode 100644 index 0000000000..205dff145a --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/06f200f8d192caa2b678a814f20c3cc8893e6a7e8f4dd07222010d6a7aae2e65 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x080x000x000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/0743de4e382b7129ba4b7ecc4020ec1509bb982ff8e7430afb80c9c133c1b710 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/0743de4e382b7129ba4b7ecc4020ec1509bb982ff8e7430afb80c9c133c1b710 new file mode 100644 index 0000000000..7457f2bca2 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/0743de4e382b7129ba4b7ecc4020ec1509bb982ff8e7430afb80c9c133c1b710 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00\\x80\\xbf\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2\\xc2000000\\x80\\xbf\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/0a54ba0ff9c0ba72fd9818542d3ecd8f95799115cd8c3cab0581e2a4cf5b2dcd b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/0a54ba0ff9c0ba72fd9818542d3ecd8f95799115cd8c3cab0581e2a4cf5b2dcd new file mode 100644 index 0000000000..0abba4268f --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/0a54ba0ff9c0ba72fd9818542d3ecd8f95799115cd8c3cab0581e2a4cf5b2dcd @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/0dccde4bc82daae20d393545ffad47d83eaf15d05eb2e1e1db0a62e6e58dbd3e b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/0dccde4bc82daae20d393545ffad47d83eaf15d05eb2e1e1db0a62e6e58dbd3e new file mode 100644 index 0000000000..eb39060e56 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/0dccde4bc82daae20d393545ffad47d83eaf15d05eb2e1e1db0a62e6e58dbd3e @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/0f37e88df19ea0f14b79930142fc1610b9e16b5965452b9c00151ca1f7a7ffbd b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/0f37e88df19ea0f14b79930142fc1610b9e16b5965452b9c00151ca1f7a7ffbd new file mode 100644 index 0000000000..abc4529f38 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/0f37e88df19ea0f14b79930142fc1610b9e16b5965452b9c00151ca1f7a7ffbd @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000\\xe500000000000000000000000000000000000000000000000000000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe50\\x1c0\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe50000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/0f759b3cf4743f1f98ce073fc729a891d341268b5b793dde85a8248732f9cb8b b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/0f759b3cf4743f1f98ce073fc729a891d341268b5b793dde85a8248732f9cb8b new file mode 100644 index 0000000000..9cf7ed73d5 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/0f759b3cf4743f1f98ce073fc729a891d341268b5b793dde85a8248732f9cb8b @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x00000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/11eae8bbca55890f60a48462080e852e9c0805554c9a1df6c980c83e5bc29394 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/11eae8bbca55890f60a48462080e852e9c0805554c9a1df6c980c83e5bc29394 new file mode 100644 index 0000000000..ef19f75916 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/11eae8bbca55890f60a48462080e852e9c0805554c9a1df6c980c83e5bc29394 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/1264dffe19eef294b54757da360097ceac5138928762aec415ec72a20c66493b b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/1264dffe19eef294b54757da360097ceac5138928762aec415ec72a20c66493b new file mode 100644 index 0000000000..62448ae39b --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/1264dffe19eef294b54757da360097ceac5138928762aec415ec72a20c66493b @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/15a615d72b6713bf31b3214fba0757d790a1bfd7031ae06da29883b14275e642 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/15a615d72b6713bf31b3214fba0757d790a1bfd7031ae06da29883b14275e642 new file mode 100644 index 0000000000..a5e48c00c9 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/15a615d72b6713bf31b3214fba0757d790a1bfd7031ae06da29883b14275e642 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/17ebe62c07041b8afc5d6dc342232f5f2c2aa9124f43cd77c986d489f4f6e44f b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/17ebe62c07041b8afc5d6dc342232f5f2c2aa9124f43cd77c986d489f4f6e44f new file mode 100644 index 0000000000..2f88f76f1b --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/17ebe62c07041b8afc5d6dc342232f5f2c2aa9124f43cd77c986d489f4f6e44f @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000X000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000X0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/182f13ba3708f00b582d22682636dd4e23bbc79b7138ba54e30144d2b9434f30 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/182f13ba3708f00b582d22682636dd4e23bbc79b7138ba54e30144d2b9434f30 new file mode 100644 index 0000000000..01521d0d56 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/182f13ba3708f00b582d22682636dd4e23bbc79b7138ba54e30144d2b9434f30 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/1841b2d806001b28e33185ea1d5d146fc3798b9a7410e1394299a7b4a906d8f2 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/1841b2d806001b28e33185ea1d5d146fc3798b9a7410e1394299a7b4a906d8f2 new file mode 100644 index 0000000000..5077d0e337 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/1841b2d806001b28e33185ea1d5d146fc3798b9a7410e1394299a7b4a906d8f2 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/1b189fbdeeee763e1d6db02573bd3d5493347c8c688372f99c4fc15c8123f8e1 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/1b189fbdeeee763e1d6db02573bd3d5493347c8c688372f99c4fc15c8123f8e1 new file mode 100644 index 0000000000..6e856601e0 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/1b189fbdeeee763e1d6db02573bd3d5493347c8c688372f99c4fc15c8123f8e1 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/1d1db76969aa6b9bc9b45350df54493a2e1aa3899abcb9bc7fbae7230f255d9c b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/1d1db76969aa6b9bc9b45350df54493a2e1aa3899abcb9bc7fbae7230f255d9c new file mode 100644 index 0000000000..729a439a49 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/1d1db76969aa6b9bc9b45350df54493a2e1aa3899abcb9bc7fbae7230f255d9c @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/1f8142cb86201e784296e609d50fc5c9f0a1fb29c44b78635e19fcd713f0f5bf b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/1f8142cb86201e784296e609d50fc5c9f0a1fb29c44b78635e19fcd713f0f5bf new file mode 100644 index 0000000000..cdf7d4d0be --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/1f8142cb86201e784296e609d50fc5c9f0a1fb29c44b78635e19fcd713f0f5bf @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000A0000000A0000000A0000000A000700 0000A0000000A0000000A0000000A\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/1fb9284c980c107c8e16ea48224ee4c8f4ffe0711e2514ad0d45f6c508170daf b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/1fb9284c980c107c8e16ea48224ee4c8f4ffe0711e2514ad0d45f6c508170daf new file mode 100644 index 0000000000..45bc922a5f --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/1fb9284c980c107c8e16ea48224ee4c8f4ffe0711e2514ad0d45f6c508170daf @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/1fda811be9b4272c73cf8736e7e6f5505db1224173e43febd611cf30003fc9fe b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/1fda811be9b4272c73cf8736e7e6f5505db1224173e43febd611cf30003fc9fe new file mode 100644 index 0000000000..5c4f7a7049 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/1fda811be9b4272c73cf8736e7e6f5505db1224173e43febd611cf30003fc9fe @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/2035d1b3cadc0a5596433ed44b3c6bc1cd07cfaf04f5c98bc9ae6ecfdb900c7c b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/2035d1b3cadc0a5596433ed44b3c6bc1cd07cfaf04f5c98bc9ae6ecfdb900c7c new file mode 100644 index 0000000000..c069d7063c --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/2035d1b3cadc0a5596433ed44b3c6bc1cd07cfaf04f5c98bc9ae6ecfdb900c7c @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/219984e9862215ae1201a956a0df1d895d902713f88fdb3a9411c86d323a36a6 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/219984e9862215ae1201a956a0df1d895d902713f88fdb3a9411c86d323a36a6 new file mode 100644 index 0000000000..ea6f5ad418 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/219984e9862215ae1201a956a0df1d895d902713f88fdb3a9411c86d323a36a6 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xf30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/2298a37be59b01d79820e212552083a82e7bcbad939268ecdb0c8807cb0e348a b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/2298a37be59b01d79820e212552083a82e7bcbad939268ecdb0c8807cb0e348a new file mode 100644 index 0000000000..f65107587f --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/2298a37be59b01d79820e212552083a82e7bcbad939268ecdb0c8807cb0e348a @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xe50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xba0000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/236ded8bd24706a579142f29876380e8ff0c1250a91efbb43091816a45790e1b b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/236ded8bd24706a579142f29876380e8ff0c1250a91efbb43091816a45790e1b new file mode 100644 index 0000000000..5ee9fede7a --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/236ded8bd24706a579142f29876380e8ff0c1250a91efbb43091816a45790e1b @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/242966146c68786e67af22bfab1b70bbf9f02741f5aaa87b727416f828ae6b5c b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/242966146c68786e67af22bfab1b70bbf9f02741f5aaa87b727416f828ae6b5c new file mode 100644 index 0000000000..deb61d8ed7 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/242966146c68786e67af22bfab1b70bbf9f02741f5aaa87b727416f828ae6b5c @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000\\xa0\\xa001\\xa0\\xa00000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/25f268f490619cebc743282801317a3fd231eb8e05a6da378a75dd445623fd20 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/25f268f490619cebc743282801317a3fd231eb8e05a6da378a75dd445623fd20 new file mode 100644 index 0000000000..7c329cc0ef --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/25f268f490619cebc743282801317a3fd231eb8e05a6da378a75dd445623fd20 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000A\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/262872f4d7b5ec0664735b1362ca4def7ff2732fe08922b5a4ca9f16b72aeb9c b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/262872f4d7b5ec0664735b1362ca4def7ff2732fe08922b5a4ca9f16b72aeb9c new file mode 100644 index 0000000000..9bab3dc33e --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/262872f4d7b5ec0664735b1362ca4def7ff2732fe08922b5a4ca9f16b72aeb9c @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xc3\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xff\\xff\\xff\\x7f\\xb0\\xb0\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/267872f9b5643be9510013988829251f3edc6cd36e6820ee10d1008bc17f1cf5 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/267872f9b5643be9510013988829251f3edc6cd36e6820ee10d1008bc17f1cf5 new file mode 100644 index 0000000000..87e76c2841 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/267872f9b5643be9510013988829251f3edc6cd36e6820ee10d1008bc17f1cf5 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\\x1a\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/273cb600b5b7e749e3ce4e74f78da55a7ea0c27b78f4d5545c6887211566d929 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/273cb600b5b7e749e3ce4e74f78da55a7ea0c27b78f4d5545c6887211566d929 new file mode 100644 index 0000000000..c67ed1f6d2 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/273cb600b5b7e749e3ce4e74f78da55a7ea0c27b78f4d5545c6887211566d929 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 00000000000000000000000000000000000000000000000\\xe5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/274f3577c704fa2b61482836a07c54d1712409f19b04ad2f26f658109dea0669 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/274f3577c704fa2b61482836a07c54d1712409f19b04ad2f26f658109dea0669 new file mode 100644 index 0000000000..0459b22ea8 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/274f3577c704fa2b61482836a07c54d1712409f19b04ad2f26f658109dea0669 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000\\xbf000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc2000\\xc50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/29a9a48f8e2ec78701500df80ec11ab88a32abc7c07b8145f8293b98add270fc b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/29a9a48f8e2ec78701500df80ec11ab88a32abc7c07b8145f8293b98add270fc new file mode 100644 index 0000000000..f941a7b5d7 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/29a9a48f8e2ec78701500df80ec11ab88a32abc7c07b8145f8293b98add270fc @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/2a2538e5996f9645054974c27f905d8b1e1abdd35ee68c01417f553d39a9735b b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/2a2538e5996f9645054974c27f905d8b1e1abdd35ee68c01417f553d39a9735b new file mode 100644 index 0000000000..8be22d9b39 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/2a2538e5996f9645054974c27f905d8b1e1abdd35ee68c01417f553d39a9735b @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/2cb86af64ca4048046391b7f6bdf8cd4eedf01ba0cbda6a7dbde27ed27ffd047 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/2cb86af64ca4048046391b7f6bdf8cd4eedf01ba0cbda6a7dbde27ed27ffd047 new file mode 100644 index 0000000000..f20256826a --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/2cb86af64ca4048046391b7f6bdf8cd4eedf01ba0cbda6a7dbde27ed27ffd047 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/2d9b1cacdb0e4ea23c87bbc326432c59cc50080b13ca789635d2a4c5fa43e4f5 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/2d9b1cacdb0e4ea23c87bbc326432c59cc50080b13ca789635d2a4c5fa43e4f5 new file mode 100644 index 0000000000..e05a4ae22c --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/2d9b1cacdb0e4ea23c87bbc326432c59cc50080b13ca789635d2a4c5fa43e4f5 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe50000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/2ead7f17b415a7e441c87bad3097e1d08ace997fd108bab7b6c62efbc709beef b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/2ead7f17b415a7e441c87bad3097e1d08ace997fd108bab7b6c62efbc709beef new file mode 100644 index 0000000000..93b320f7a4 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/2ead7f17b415a7e441c87bad3097e1d08ace997fd108bab7b6c62efbc709beef @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000\\x0100000000000000000001000A0000000A0000000A0000000A00010000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/2eeb9630e1c449e52778f3f64973a6ab84cfd08c3773baaf8267eb9fc530cc36 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/2eeb9630e1c449e52778f3f64973a6ab84cfd08c3773baaf8267eb9fc530cc36 new file mode 100644 index 0000000000..19acf0a342 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/2eeb9630e1c449e52778f3f64973a6ab84cfd08c3773baaf8267eb9fc530cc36 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00\\xf2\\xf201\\xf2\\xf20000001000000010000000100000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/306e4d4fe00303c2e525d56b499dfcbff11eb6fcb74af0a0d2cb0695f17e1095 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/306e4d4fe00303c2e525d56b499dfcbff11eb6fcb74af0a0d2cb0695f17e1095 new file mode 100644 index 0000000000..9b289a9cb6 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/306e4d4fe00303c2e525d56b499dfcbff11eb6fcb74af0a0d2cb0695f17e1095 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"\\a\\a\\a\\a\\x03\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\x03\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/316025409c03a2ed6e949595c4ad003aa36b572e8f525adf21b196fe2eb7aa18 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/316025409c03a2ed6e949595c4ad003aa36b572e8f525adf21b196fe2eb7aa18 new file mode 100644 index 0000000000..6d4ef7a6b9 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/316025409c03a2ed6e949595c4ad003aa36b572e8f525adf21b196fe2eb7aa18 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/31fb64df0b611ffa55444e0402d14ea97ea23997d7f49d70042152f4287be7aa b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/31fb64df0b611ffa55444e0402d14ea97ea23997d7f49d70042152f4287be7aa new file mode 100644 index 0000000000..cf0e215dcf --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/31fb64df0b611ffa55444e0402d14ea97ea23997d7f49d70042152f4287be7aa @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/32d07219b2dd59df0b5738ec6add08a69aaa41304cb5a5a8c18154025b5e27e3 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/32d07219b2dd59df0b5738ec6add08a69aaa41304cb5a5a8c18154025b5e27e3 new file mode 100644 index 0000000000..1b43f11fa8 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/32d07219b2dd59df0b5738ec6add08a69aaa41304cb5a5a8c18154025b5e27e3 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/32ea7d586aaea071fe90992483cbc86267d1a7fd41423fb1ec4d562c31640056 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/32ea7d586aaea071fe90992483cbc86267d1a7fd41423fb1ec4d562c31640056 new file mode 100644 index 0000000000..28f421a720 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/32ea7d586aaea071fe90992483cbc86267d1a7fd41423fb1ec4d562c31640056 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000A0000000A0000000A\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/34cf9e379dc9bbcec3a751c30546f2c6529bc33238b4bc0b1b266967010425ac b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/34cf9e379dc9bbcec3a751c30546f2c6529bc33238b4bc0b1b266967010425ac new file mode 100644 index 0000000000..8e0ea3f72d --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/34cf9e379dc9bbcec3a751c30546f2c6529bc33238b4bc0b1b266967010425ac @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/35b31fe53d024fe80243715c80198de7d913a8a8ee57f9b293e93d8ec939469a b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/35b31fe53d024fe80243715c80198de7d913a8a8ee57f9b293e93d8ec939469a new file mode 100644 index 0000000000..0d15399d6e --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/35b31fe53d024fe80243715c80198de7d913a8a8ee57f9b293e93d8ec939469a @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Y0000000x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x00000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/35ea1a1561be122855a1f2c8e30650b516268d97c8ca73a88b2864d169290f5f b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/35ea1a1561be122855a1f2c8e30650b516268d97c8ca73a88b2864d169290f5f new file mode 100644 index 0000000000..9d8e482eed --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/35ea1a1561be122855a1f2c8e30650b516268d97c8ca73a88b2864d169290f5f @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/3632ac227a4abfbbd12c014921094345bb9f25ea3f9cfe6d6c1d22f0b5dc3322 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/3632ac227a4abfbbd12c014921094345bb9f25ea3f9cfe6d6c1d22f0b5dc3322 new file mode 100644 index 0000000000..d59ec0cfc4 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/3632ac227a4abfbbd12c014921094345bb9f25ea3f9cfe6d6c1d22f0b5dc3322 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000A0000000A0000000A0000000A\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/38ff44e319173b519e009c2a1c10695f6dfe90b04f6a3d18fc0757938b1f69e6 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/38ff44e319173b519e009c2a1c10695f6dfe90b04f6a3d18fc0757938b1f69e6 new file mode 100644 index 0000000000..803fa54ad4 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/38ff44e319173b519e009c2a1c10695f6dfe90b04f6a3d18fc0757938b1f69e6 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/3946302f44a01dda1619298bcd6eb30d2ba2b92db68890278881b49e575512e1 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/3946302f44a01dda1619298bcd6eb30d2ba2b92db68890278881b49e575512e1 new file mode 100644 index 0000000000..b98ef134dc --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/3946302f44a01dda1619298bcd6eb30d2ba2b92db68890278881b49e575512e1 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/398e997a9685e075111a4ee4050d49ab6311bb5c58a68e99a0ceae29c83b27f9 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/398e997a9685e075111a4ee4050d49ab6311bb5c58a68e99a0ceae29c83b27f9 new file mode 100644 index 0000000000..7d5537fd28 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/398e997a9685e075111a4ee4050d49ab6311bb5c58a68e99a0ceae29c83b27f9 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xe5000\\xe5000\\xe5000\\xe5020\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/3a7de8da69cbf9a37984e59a388ba31e4f74c69269482c1cd8255c14b072e32b b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/3a7de8da69cbf9a37984e59a388ba31e4f74c69269482c1cd8255c14b072e32b new file mode 100644 index 0000000000..fb9a34566f --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/3a7de8da69cbf9a37984e59a388ba31e4f74c69269482c1cd8255c14b072e32b @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"001000000010000000010000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A000000010000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A00010000000A000000010000000A0000000A000000010000000A000000010000000A0000000A0000000A000010000000100000000000000A0000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/3b1bcbc7689ef4f2b9122e973ce61920a4f1acad5b81debfd553031fb3807bd1 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/3b1bcbc7689ef4f2b9122e973ce61920a4f1acad5b81debfd553031fb3807bd1 new file mode 100644 index 0000000000..68c6dce23a --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/3b1bcbc7689ef4f2b9122e973ce61920a4f1acad5b81debfd553031fb3807bd1 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\x020x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x0\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/3cf1518d63d72249c911f737f9f9986c8dfd6630f8e78ebadaf6716c443eb76c b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/3cf1518d63d72249c911f737f9f9986c8dfd6630f8e78ebadaf6716c443eb76c new file mode 100644 index 0000000000..1560a91b9e --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/3cf1518d63d72249c911f737f9f9986c8dfd6630f8e78ebadaf6716c443eb76c @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/3eb3f3322dbf70e84306fbd82cf262e92520ffe1853966b3d314832c866dc596 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/3eb3f3322dbf70e84306fbd82cf262e92520ffe1853966b3d314832c866dc596 new file mode 100644 index 0000000000..2d7804f10b --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/3eb3f3322dbf70e84306fbd82cf262e92520ffe1853966b3d314832c866dc596 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/40cb27c14ed62167653bcee1da5798acb8a60cb9d03141901c3533c90b6c7813 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/40cb27c14ed62167653bcee1da5798acb8a60cb9d03141901c3533c90b6c7813 new file mode 100644 index 0000000000..24b5b924bf --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/40cb27c14ed62167653bcee1da5798acb8a60cb9d03141901c3533c90b6c7813 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000A0000000A000100100000000000010000000A0000000A0000000A0000000A0000000A0000000A0000000A00070000000A0000000A0000000A000000010000000A0000000A0000000A0000000A0000000X0000000A0000000A0000000A00080000000A00070000000A0000000A0000000A0000000A000000010000000A000000010000000A0000000A0000000A0000000A0000000A00000001000000010000000A0000000A0000000A0000000A0000000A000000010000000A0000000A0000000A0000000A0000000A0000000A\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/41e393287b187d0ee6d5dcf76377808b702619951166305312894fd5d0dd972b b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/41e393287b187d0ee6d5dcf76377808b702619951166305312894fd5d0dd972b new file mode 100644 index 0000000000..aa971946a2 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/41e393287b187d0ee6d5dcf76377808b702619951166305312894fd5d0dd972b @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000\\x01\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/42664785c395864106a38493ed7a48784a868f592a470d2a8dc853f5b5d038ab b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/42664785c395864106a38493ed7a48784a868f592a470d2a8dc853f5b5d038ab new file mode 100644 index 0000000000..b25acd54ae --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/42664785c395864106a38493ed7a48784a868f592a470d2a8dc853f5b5d038ab @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000001000000010000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/42bfbcfc5da37a55652f91ec40213d40eac8e64a9f13be5ab8bdfab23b2b3cb4 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/42bfbcfc5da37a55652f91ec40213d40eac8e64a9f13be5ab8bdfab23b2b3cb4 new file mode 100644 index 0000000000..ec8d7c0007 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/42bfbcfc5da37a55652f91ec40213d40eac8e64a9f13be5ab8bdfab23b2b3cb4 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xbe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/4356640acfa5b355159f3d4d169a9c8a2c6e692e6b8407605e81efe47c8af9bd b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/4356640acfa5b355159f3d4d169a9c8a2c6e692e6b8407605e81efe47c8af9bd new file mode 100644 index 0000000000..83bde95200 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/4356640acfa5b355159f3d4d169a9c8a2c6e692e6b8407605e81efe47c8af9bd @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/4451635b85976801e58215e9a59ab8f89fd7b63fe3b97b4167c3710887bc88df b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/4451635b85976801e58215e9a59ab8f89fd7b63fe3b97b4167c3710887bc88df new file mode 100644 index 0000000000..d3e2c22d98 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/4451635b85976801e58215e9a59ab8f89fd7b63fe3b97b4167c3710887bc88df @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000\\xff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xbe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xda00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xfe0000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/45099762592cd94c178c63cace13ff3826c8fff69852df2c354ac0a144c6c317 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/45099762592cd94c178c63cace13ff3826c8fff69852df2c354ac0a144c6c317 new file mode 100644 index 0000000000..0d64c81779 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/45099762592cd94c178c63cace13ff3826c8fff69852df2c354ac0a144c6c317 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000\\x80$y\\x0e`!S$\\fa\\xedw\\xfc\\xb6\\a3\\xe3\\x9c\\x114\\x15\\xe2:\\xd9\\xccF̔\\xdd\\xc2\\xd2\\nCYopxd$oϜ\\x8b\\x0eW\\x0fpV\\x1e\\x86\\xf7\\xbf\\x9a\\x1f\\x12v1\\xee\\xd1l\\xc9\\x0f\\x87J\\x11\\xf3/\\xf3\\xb3Y\\x82\\x83\\xed=\\xbayZ\\x7f\\x87\\xfc\\xbc\\x8e\\x8e\\x8b\\x96J\\u06020\\xf4\\xbc\\x15G\\xaf\\x13\\x85'\\xfe\\xe3k\\xd2\\xd5C\\xf6k\\x8e\\v\\x01}\\xf0\\xec\\xe4\\xf7\\xb4eV\\xb3-\\b\\x1f\\xa0ksE\\xf9\\x9b\\xab\\xee\\x17=m\\x10\\x18ruow\\x0e_\\x1c\\xf9\\xdda\\xbe\\xc0\\x80N6\\x9a\\xa1\\xbf\\xfe\\xbf\\xdf\\x1d\\x1d\\xfd\\xc5M\\xe6p\\x8b\\xad\\x94\\x11\\xe7\\xca\\xe4]m\\x7fI\\x19\\xdc\\xd9\\xf9\\xe68cdvY\\xccU|\\x1aS\\xad\\xc9\\xca\\x11\\xfa\\xc5fځ\\xe1$\\x14*d\\xcd\\xcd\\xc3\\xdd\\\"\\x1a̓\\xf5(\\xe1TrGL\\xa0λ\\x81\\xdbsb\\xfaXXU\\\"V\\xea\\x12D\\x8e\\x00\\x19%\\x1c\\xa1\\x8c\\xe8g\\xc1\\x86\\xf8E4\\t\\x06.\\x04\\x15.دx\\x02OU\\x85\\xc4Y{{\\xa5;\\xe8K.\\x97F\\x02\\xeb\\xd2[\\x04\\x91T\\x015&{\\xc7D?\\u0379\\x9fYlJ\\x13\\x86\\xfaO\\x03l;d'~+\\x1cѪ\\xebq\\\\\\xdd\\xf8zA\\xfd\\x1f\\xee᙭\\vcd\\xe4+\\xc4\\xe3ށ\\xad\\xed\\xb4\\xc13 \\xb1\\xd0N\\x9d3\\xe9Φʿ3\\xd9\\x1e\\xe7\\xea\\xf7\\xc0\\x15\\xed\\x92\\xddk\\xecf\\xabl\\x94\\x8d(сx\\xa36\\xf4\\xa58\\x18t¿\\xffp\\x14\\xb5\\x98(m\\x04\\xd5\\x1b(f\\xe0\\x9e\\xfa\\xaap\\xd0|\\xeb;\\xed\\xb1\\xc5\\xc2\\xe7\\xa7#l\\xdb^\\xc8\\xf7\\xa6W\\xeab\\x8b\\x83\\x86\\xfcC\\xfa\\n\\x13\\xf1DJ\\xe9$e\\x86)\\x99K>\\x9c\\x94FX~vL[\\x9c\\x1aZk\\xed\\x978\\xed\\x9c\\xd5t\\xe3\\x86#\\x8e\\xf3\\xac\\xd8x\\xf1\\xe8\\x17r\\xc07K^Oca\\xf9\\xb7\\xd1C\\xc9\\x00@\\xa8\\xca\\xfbUY\\xe5n\\x02\\x1bI\\xf6A|:\\xb6\\xd0U/\\x84\\x8e\\x87\\fh\\x1c\\xe6*\\x84\\b͎\\xf4T۱A\\xe6\\x1e\\xdd\\xe6\\xed%*\\xb6\\xb5\\xfc/\\x95S\\x9brzs\\xdaE\\xfe6\\x01ދf\\x1fĈ߃ٽ웵\\xb6\\x16\\x8b\\x00~LW\\x0e\\xde3uA\\xa3G<\\x90\\xbeޅ(\\x16|\\x82L\\x1a\\x10\\xc5%n\\xcdV\\x8e\\x86\\xf0F\\x06\\x01\\x0e\\xffx8ƣ\\\\L(\\xd3\\tu\\xa5\\xff\\xb5x~\\x7f\\x16xk\\\\\\xc1\\xe1\\x85E5x\\x85aQ\\x01y\\x0e\\xab~cۖ\\x8a\\xb5mx_\\xf2K8\\xbc\\x81L\\x93z\\xe1\\xde\\xfabQ\\xf9\\x9f&:(ܥ\\x85\\x98\\x99{\\xc7\\xe2K\\x7fY\\x8c}e%\\xf0T1\\xdaf\\x05{/,k\\x16Gߞ\\x98h\\x17nd5X`o+\\x1e\\xd7}]\\xc6\\xe5\\xff\\xe2o\\xb8\\t\\xf7>u\\xb1\\x9aW(.M\\xdaD\\u07bb\\xae\\x17\\xda\\xf8\\x1ab\\xfa\\xb4W\\x9cz\\x87\\x80\\xaf\\xaa\\x89\\xea\\xae\\x11\\b\\xb8\\xb9\\xf6\\xf2\\x82\\xf7Lu\\x1d\\x1e\\xcaD\\xa6\\xf0lf\\xef\\u0099[\\x04/\\x9d0\\x7f\\x86\\x17O\\xa5Ϸsu\\xf8\\xe1\\x0e\\xc9\\xea\\xbbOhf\\x0e\\xe8\\xae~N\\xb9Å\\x0f4\\x11\\x13\\x96\\x05X춇\\xc0\\xbdж\\xe3vLppa\\xb61\\xbe\\a0O\\xf2\\xb2\\xaf\\x17V\\xca\\xe1Q\\x1d\\x01\\xc2\\xd6r\\x9e\\x9dKWG\\x88$\\xa5\\xcb\\x15\\xf3(\\x9e\\x96\\x0e\\xf4պ[\\x8aj\\xc63?\\x97\\xc6\\x0f\\xbeKbYh\\\\b@~7<\\x8db\\x8a\\xb8G\\xf8\\xff9U\\xb6g[\\x1f\\xbb\\xfc\\xfd\\x03\\xf1\\v\\xa7C\\x01\\xdc5\\x0f\\xa3\\xbc\\xd8Ŀ\\xe0B\\xb8\\x1c\\xe9\\x90\\xc6B\\u218c\\xf6\\x97\\x98K\\xd0ʆȭ\\xee\\xca\\x1d\\xa6\\xe5\\xc2{~\\xf2=}2\\x81~\\x1f\\xa16\\x82\\xf3\\xd2\\xd0\\x05˷Npm\\x8a\\\"\\x8a\\f%|P\\xc9\\t\\xf1\\xd7E\\xc9\\xfe\\xfc(\\xa8\\xc3y \\x7fa\\x11\\xcfs\\xcb\\xffV\\xd1F\\xc2 \\xdeN6Us\\xed{\\xa7\\x01\\xb2\\x7f,\\xfe\\x8d\\x8eB`\\b\\xb6\\x02\\x96\\x1a\\xbf\\xf4\\xd8\\xd6\\xf8\\x88pG\\x92\\xaa\\xec\\bLP\\x12\\t\\x80\\xf2,트\\x18\\xb1\\xea\\xf3\\xae\\x81y\\xbek\\n\\xce:\\x8d\\x90\\x91LhF_? \\xa4\\xf4\\xb13\\xf6\\xa1\\x14S\\x03\\xc5W牗h\\xae\\xd5\\xf4D\\x9e9\\xeb\\x84ZI9\\xafr}tG#\\x04\\xad\\x9e\\x0635\\xa0\\xf6\\xe7)\\x174e;\\x80\\xcea\\xca\\b\\x1d\\xc8.\\x97\\x18%\\xdbwe\\xa9\\xc3M\\xca}Z\\xcf2\\x14\\xaf\\xc1-Sַm\\xe9݊q\\xc0r\\x00\\xce\\xf9\\x17\\xcb4: \\xd6z&5ؽ\\x8f\\x1fN\\x1cԔIg\\xc5.\\xbe\\xec\\x04s\\xd3m\\x85\\x95\\x84\\\\v\\xae\\xfd\\x8b,\\xa0\\x7f\\x95?}\\xb5\\x15xK\\xc6\\xdc6\\xbc\\xe9Yͥ\\xcbNV\\\"\\xf2\\x00)$q\\xae\\x94X\\xcb\\xcf5\\x11vuk\\xa1\\x02\\xab\\x86\\x152R\\xb69\\x93B\\xeb\\x8b\\xf2\\xafg\\f#D\\xe8\\x85\\xdce\\xd6\\xf1M*\\xb7W\\xff\\x8b\\xefq\\xc3\\xe0X6\\xe1}\\xb2\\vͿ\\x9b\\x06f_k\\xd2\\r~\\xda!W\\x8d\\xe1+\\x98\\xf9e\\xe7\\xe7\\x92\\xd1\\xe8v\\x90\\xb3\\xaac\\x14\\x13p\\x97MM`٩\\xd8\\xcch\\x00\\xdb\\xdchF.\\xe8\\xfe\\x03\\xb3\\x8c\\b֨\\x8b\\x9c~\\xe8b\\xcc\\f\\x82\\xe3\\x9abHd\\x84\\xb1\\xfb\\xecD\\xb2Fz\\xf2<\\x98\\xc7\\xfb\\xd8nD\\x11pK\\xf4\\x1c\\xb4Yj\\x8b\\xf3\\x95\\xa2$.\\xe7\\xb6\\x1d\\x06DI\\xca\\xdbX]2\\xbe\\xdb\\xfc\\x00\\x1bl)\\xaa\\xa0\\x84\\xae\\xfaDW\\xf4\\x14\\xc9!6\\xca\\b\\x92\\x15:wIm-\\xaf\\xcb\\xee\\xc0\\xc1\\a\\xd8\\xd6F\\x1e)\\vxN\\x12r\\x11\\xe9\\xf4\\xa50000000000000000000000000000000000000000000000000000000000000000000000000000\\xbe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xda000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/469238d27e063dfeff57d0dff00d520a46d5dbe3b784e8c8fd371961555138f4 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/469238d27e063dfeff57d0dff00d520a46d5dbe3b784e8c8fd371961555138f4 new file mode 100644 index 0000000000..2ed375e06e --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/469238d27e063dfeff57d0dff00d520a46d5dbe3b784e8c8fd371961555138f4 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000100000\\x93\\x93A00\\x930000100000000000100000001000000010000000A0000000A000200010000000A0000000A0000000A000000010000000A0000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/47d9917861ffd1eb170534ef258216673b22c8df59488a242b351339cf01aca7 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/47d9917861ffd1eb170534ef258216673b22c8df59488a242b351339cf01aca7 new file mode 100644 index 0000000000..1d097e66bb --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/47d9917861ffd1eb170534ef258216673b22c8df59488a242b351339cf01aca7 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000001000000010000000A0000000A0000000A0000000A0000000A0000000A0000000A0001000000010000000A0000000A0000000B00010000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A00010000000A0000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/4898c542e9e1d8779b9b7d28e4f42e94cfdb48f3e5f7f9583da1f08b2f56a90c b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/4898c542e9e1d8779b9b7d28e4f42e94cfdb48f3e5f7f9583da1f08b2f56a90c new file mode 100644 index 0000000000..8a269d6f9b --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/4898c542e9e1d8779b9b7d28e4f42e94cfdb48f3e5f7f9583da1f08b2f56a90c @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000\\xe50000000000000000000000000000\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf8\\xe5\\xf7\\xf7\\xf7\\xf7\\xe5\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf70\\xf7\\xf7\\xf70\\xf7\\xe5\\xf7\\xf7\\xf7\\xf70\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf700\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf700\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf70\\xf7\\xf70\\xf7\\xf7\\xe5\\xf70\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xf70\\xf7\\xf70\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf70\\xf7\\xf70\\xe5\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf700\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf70\\xf7\\xf700\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xe5\\xf700\\xe5\\xf70\\xf700\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7000\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf700\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7000\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf70\\xf70\\xf7\\xf70\\xf7\\xf7\\xe5\\xf7\\xf7\\xf70\\xf70\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\x1c\\xf70\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xe50\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\x06\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xe5\\xe5\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xe5\\xf7\\xf7\\xf70\\xe5\\xf7\\xf700\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf70\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf700\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xe5\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xe50\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xf700\\xf70\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xe5\\xf7\\xf70\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf70\\xf70\\xf70\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf70\\xf70\\xf7\\xf7\\xe5\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf70\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xe5\\xf70\\xf70\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xf7\\xe5\\xf70\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf70\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf70\\xf70\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xe5\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xe5\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xe5\\xf7\\xf7\\xf70\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf70\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf70\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf70\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xf70\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xe50\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf700\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf700\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe50\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xe5\\xf7\\xf7\\xe50\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xe500\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf70\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xf700\\xf70\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf700\\xf7\\xf7\\xf70\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xbe\\xf7\\xf70\\xe5\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xe5\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xe5\\xe5\\xf70\\xf7\\xf70\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf70\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xf7\\xf700\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf70\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe50\\xf7\\xf7\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xe5\\xf70\\xf7\\xf7\\xe5\\xf70\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xf70\\xf70\\xf7\\xf7\\xe5\\xf7\\xe5\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe50\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf70\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xf70\\xe5\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf70\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xe5\\xf7\\xf7\\xe5\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xf70\\xe5\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf70\\xf70\\xf70\\xf7\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf70\\xf70\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf700\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xe5\\xf7\\xf7\\xf7\\xf70\\xf7\\xe5\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf70\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf700\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf70\\xf7\\xf7\\xf7\\xf70\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xf7\\xe50\\xe5\\xf7\\xf7\\xe5\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf70\\xf70\\xf7\\xf700\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xe50\\xf7\\xf7\\xf7\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xe5\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf700\\xf7\\xf7\\xe5\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xe5\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xe5\\xf7\\xf7\\xf70\\xf7\\xf70\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe50\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf700\\xf7\\xf70\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xe50\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xe5\\xe5\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf700\\xf7\\xe5\\xf700\\xf7\\xf7\\xf7\\xf7\\xf70\\xe5\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xe5\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xe5\\xf70\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xe5\\xf70\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf700\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xe50\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf700\\xf7\\xf7\\xe50\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xe5\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xb7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf700\\xf7\\xf7\\xf70\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xe5\\xf700\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf700000\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xe50\\xf70\\xf7\\xf7\\xe5\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xe50\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf700\\xf70\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xe5\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf70\\xf70\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf700\\xf7\\xf7\\xf70\\xf70\\xf7\\xf7\\xf7\\xf7\\xe50\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf700\\xf7\\xf7\\xe50\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xe5\\xf7\\xf7\\xf7\\xf70\\xe5\\xe5\\xf7\\xf70\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf70\\xf70\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70000\\xf70\\xf70\\xf70\\xf7\\xf7\\xf7\\xf7\\xf70\\xf70\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xe50\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf70\\xf70\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7000\\xf7\\xf7\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xe5\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf70\\xf70\\xf70\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf70\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xe5\\xf7\\xe5\\xf7\\xf700\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf700\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe50000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/48e1bbb44a20a824ed90c150d0d6c60d8279d37a711284672c7870b237eeb151 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/48e1bbb44a20a824ed90c150d0d6c60d8279d37a711284672c7870b237eeb151 new file mode 100644 index 0000000000..36b3ceef57 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/48e1bbb44a20a824ed90c150d0d6c60d8279d37a711284672c7870b237eeb151 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xc0\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc20\\xc2\\xc2\\xc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/48eb5ee27cb53a6eb3bbb0f5a66ff41a644a19f8e45a54a76c0733610c73ef8e b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/48eb5ee27cb53a6eb3bbb0f5a66ff41a644a19f8e45a54a76c0733610c73ef8e new file mode 100644 index 0000000000..3613843d6d --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/48eb5ee27cb53a6eb3bbb0f5a66ff41a644a19f8e45a54a76c0733610c73ef8e @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/49abf3e72e013d8a1aeb37661d01da5c17207f054f0a2d1168a9aa7910874ec9 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/49abf3e72e013d8a1aeb37661d01da5c17207f054f0a2d1168a9aa7910874ec9 new file mode 100644 index 0000000000..7d62b25753 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/49abf3e72e013d8a1aeb37661d01da5c17207f054f0a2d1168a9aa7910874ec9 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000X0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/4c0d222e98944a9019a9a9ceb08c36656d6f6d1410d0c67e5f0e59e55e8e1ff1 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/4c0d222e98944a9019a9a9ceb08c36656d6f6d1410d0c67e5f0e59e55e8e1ff1 new file mode 100644 index 0000000000..74eb6e4f82 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/4c0d222e98944a9019a9a9ceb08c36656d6f6d1410d0c67e5f0e59e55e8e1ff1 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd3\\xd7\\xd70\\xd7\\xd7\\xd7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/4c39a145dd121722b1f056e2583ce545483da0e946b68d0114ba5f916cfef183 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/4c39a145dd121722b1f056e2583ce545483da0e946b68d0114ba5f916cfef183 new file mode 100644 index 0000000000..ef30c1bf17 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/4c39a145dd121722b1f056e2583ce545483da0e946b68d0114ba5f916cfef183 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/4c7f2d7633bd5dd51cf32f5cfc66406fde5a5385014b2d12406d229679edc342 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/4c7f2d7633bd5dd51cf32f5cfc66406fde5a5385014b2d12406d229679edc342 new file mode 100644 index 0000000000..45cfcf13c6 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/4c7f2d7633bd5dd51cf32f5cfc66406fde5a5385014b2d12406d229679edc342 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xfe/00000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/4ca1a9d57081092cbe1c39e4df036383db9595f7373103a743dbb3552175663c b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/4ca1a9d57081092cbe1c39e4df036383db9595f7373103a743dbb3552175663c new file mode 100644 index 0000000000..85fed34200 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/4ca1a9d57081092cbe1c39e4df036383db9595f7373103a743dbb3552175663c @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/502a8c27a532105a179e145f09a5c392dfdfd3ccd3d55db6894d15dea9e2c63f b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/502a8c27a532105a179e145f09a5c392dfdfd3ccd3d55db6894d15dea9e2c63f new file mode 100644 index 0000000000..c16e1e143e --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/502a8c27a532105a179e145f09a5c392dfdfd3ccd3d55db6894d15dea9e2c63f @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000\\xe500000000000000000000000000000000000000000000000000000\\xe5000\\xe5000\\xe5000\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe50\\x1c0\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xe5000\\xe5000\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7EEEEE\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\x1f\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7\\xf7000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe50000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/50cf26206a48b7fbfd581dd577fe3af7206043d4a6467f8cd2abebfa9052aa27 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/50cf26206a48b7fbfd581dd577fe3af7206043d4a6467f8cd2abebfa9052aa27 new file mode 100644 index 0000000000..3d1f89ceee --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/50cf26206a48b7fbfd581dd577fe3af7206043d4a6467f8cd2abebfa9052aa27 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1aA\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1aA\\x1a\\x1a\\x1aA00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/52584dbab125cae916ee4ae8f7e224547a6a12a0b187827c48f4c00cbe7d3d44 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/52584dbab125cae916ee4ae8f7e224547a6a12a0b187827c48f4c00cbe7d3d44 new file mode 100644 index 0000000000..0afa3d138b --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/52584dbab125cae916ee4ae8f7e224547a6a12a0b187827c48f4c00cbe7d3d44 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a1\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1aA\\x1a\\x1a\\x1a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/52d361eb35e0f22d170bd1e3a2463ca339cc803d9140b903a977d1e420d96089 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/52d361eb35e0f22d170bd1e3a2463ca339cc803d9140b903a977d1e420d96089 new file mode 100644 index 0000000000..aeb69f584c --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/52d361eb35e0f22d170bd1e3a2463ca339cc803d9140b903a977d1e420d96089 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"001000000010000000010000000A0000000A0000000A0000000A0000000A000000100000000A0000000A0000000A0000000A000000010000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A00010000000A000000010000000A0000000A000000010000000A000000010001000A00000010000000100001000000010000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/55ae53865eb1c823cb93a0775f3157bf20ca54c855e66116a882f2953dcc5f0c b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/55ae53865eb1c823cb93a0775f3157bf20ca54c855e66116a882f2953dcc5f0c new file mode 100644 index 0000000000..c1c958b397 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/55ae53865eb1c823cb93a0775f3157bf20ca54c855e66116a882f2953dcc5f0c @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000!0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/56009852a6a8482649ba610761a94cd11ee8e8b332064918ff4b0d27fb5f7c01 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/56009852a6a8482649ba610761a94cd11ee8e8b332064918ff4b0d27fb5f7c01 new file mode 100644 index 0000000000..2d8ed344ae --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/56009852a6a8482649ba610761a94cd11ee8e8b332064918ff4b0d27fb5f7c01 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/584e6f17a5183b6a28e859c55cd0317e2bb649101a97cb2db4595bbf0a746fa9 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/584e6f17a5183b6a28e859c55cd0317e2bb649101a97cb2db4595bbf0a746fa9 new file mode 100644 index 0000000000..127f03f424 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/584e6f17a5183b6a28e859c55cd0317e2bb649101a97cb2db4595bbf0a746fa9 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/586cde06faacf9b81fa48bbf9e794aaa718e47085b5fae7e18f05657b916e63a b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/586cde06faacf9b81fa48bbf9e794aaa718e47085b5fae7e18f05657b916e63a new file mode 100644 index 0000000000..c94ae69d03 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/586cde06faacf9b81fa48bbf9e794aaa718e47085b5fae7e18f05657b916e63a @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/594233b71f75c52745d01adf57fd25d1a64b5982c84b321bac1a867020c93b86 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/594233b71f75c52745d01adf57fd25d1a64b5982c84b321bac1a867020c93b86 new file mode 100644 index 0000000000..50d5944547 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/594233b71f75c52745d01adf57fd25d1a64b5982c84b321bac1a867020c93b86 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/5ab108eee10326056db1a48cdb67e47be8cebe1dddf7ed300cdbba278ab6d142 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/5ab108eee10326056db1a48cdb67e47be8cebe1dddf7ed300cdbba278ab6d142 new file mode 100644 index 0000000000..14339f2eeb --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/5ab108eee10326056db1a48cdb67e47be8cebe1dddf7ed300cdbba278ab6d142 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000010000000A000000010000000A0000000A0000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/5d2185a73a4a4e7d4bf7d57060fed3c6df107aa6a9a20d35937a9df1a28f65f0 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/5d2185a73a4a4e7d4bf7d57060fed3c6df107aa6a9a20d35937a9df1a28f65f0 new file mode 100644 index 0000000000..6934342bde --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/5d2185a73a4a4e7d4bf7d57060fed3c6df107aa6a9a20d35937a9df1a28f65f0 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6246924afc4cd9f7f33389867e021b09db2e6d5cc494f8298aa41dc84321526e b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6246924afc4cd9f7f33389867e021b09db2e6d5cc494f8298aa41dc84321526e new file mode 100644 index 0000000000..39e39ff3a0 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6246924afc4cd9f7f33389867e021b09db2e6d5cc494f8298aa41dc84321526e @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6436cc634360a4b0d6a3f9ebb8650f93ea12b5f926b860c2317e1adb95dc0f2a b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6436cc634360a4b0d6a3f9ebb8650f93ea12b5f926b860c2317e1adb95dc0f2a new file mode 100644 index 0000000000..5140c288ff --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6436cc634360a4b0d6a3f9ebb8650f93ea12b5f926b860c2317e1adb95dc0f2a @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x000000000000000000000000000000000000000000000000000000000000000000000000000000000 000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6738732a3862592748541da8b3f075430dc8490990a844b1f9eec5cab847036a b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6738732a3862592748541da8b3f075430dc8490990a844b1f9eec5cab847036a new file mode 100644 index 0000000000..f9818d57eb --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6738732a3862592748541da8b3f075430dc8490990a844b1f9eec5cab847036a @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x00010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x00080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/676205b763060464fbd88a1fc6ffafea414bd90190b821be6d8b663c693d9c74 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/676205b763060464fbd88a1fc6ffafea414bd90190b821be6d8b663c693d9c74 new file mode 100644 index 0000000000..806bb02c06 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/676205b763060464fbd88a1fc6ffafea414bd90190b821be6d8b663c693d9c74 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X0000000X000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6871795467747c91cd1b465ccf3da6e5606072103fdd1feb7308b279d00f23eb b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6871795467747c91cd1b465ccf3da6e5606072103fdd1feb7308b279d00f23eb new file mode 100644 index 0000000000..3848028975 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6871795467747c91cd1b465ccf3da6e5606072103fdd1feb7308b279d00f23eb @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6aec02b99c8a04ad39cb0f5f19df4e2300603caf4d21cba5e1a332f68f04b1a8 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6aec02b99c8a04ad39cb0f5f19df4e2300603caf4d21cba5e1a332f68f04b1a8 new file mode 100644 index 0000000000..826c2e9ade --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6aec02b99c8a04ad39cb0f5f19df4e2300603caf4d21cba5e1a332f68f04b1a8 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6ba2b1956371eeb6f6a98b86d72613c07957e455af0bd8005763a5c3b002ee37 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6ba2b1956371eeb6f6a98b86d72613c07957e455af0bd8005763a5c3b002ee37 new file mode 100644 index 0000000000..a24e510065 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6ba2b1956371eeb6f6a98b86d72613c07957e455af0bd8005763a5c3b002ee37 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000\\x80$y\\x0e`!S$\\fa\\xedw\\xfc\\xb6\\a3\\xe3\\x9c\\x114\\x15\\xe2:\\xd9\\xccF̔\\xdd\\xc2\\xd2\\nCYopxd$oϜ\\x8b\\x0eW\\x0fpV\\x1e\\x86\\xf7\\xbf\\x9a\\x1f\\x12v1\\xee\\xd1l\\xc9\\x0f\\x87J\\x11\\xf3/\\xf3\\xb3Y\\x82\\x83\\xed=\\xbayZ\\x7f\\x87\\xfc\\xbc\\x8e\\x8e\\x8b\\x96J\\u06020\\xf4\\xbc\\x15G\\xaf\\x13\\x85'\\xfe\\xe3k\\xd2\\xd5C\\xf6k\\x8e\\v\\x01}\\xf0\\xec\\xe4\\xf7\\xb4eV\\xb3-\\b\\x1f\\xa0ksE\\xf9\\x9b\\xab\\xee\\x17=m\\x10\\x18ruow\\x0e_\\x1c\\xf9\\xdda\\xbe\\xc0\\x80N6\\x9a\\xa1\\xbf\\xfe\\xbf\\xdf\\x1d\\x1d\\xfd\\xc5M\\xe6p\\x8b\\xad\\x94\\x11\\xe7\\xca\\xe4]m\\x7fI\\x19\\xdc\\xd9\\xf9\\xe68cdvY\\xccU|\\x1aS\\xad\\xc9\\xca\\x11\\xfa\\xc5fځ\\xe1$\\x14*d\\xcd\\xcd\\xc3\\xdd\\\"\\x1a̓\\xf5(\\xe1TrGL\\xa0λ\\x81\\xdbsb\\xfaXXU\\\"V\\xea\\x12D\\x8e\\x00\\x19%\\x1c\\xa1\\x8c\\xe8g\\xc1\\x86\\xf8E4\\t\\x06.\\x04\\x15.دx\\x02OU\\x85\\xc4Y{{\\xa5;\\xe8K.\\x97F\\x02\\xeb\\xd2[\\x04\\x91T\\x015&{\\xc7D?\\u0379\\x9fYlJ\\x13\\x86\\xfaO\\x03l;d'~+\\x1cѪ\\xebq\\\\\\xdd\\xf8zA\\xfd\\x1f\\xee᙭\\vcd\\xe4+\\xc4\\xe3ށ\\xad\\xed\\xb4\\xc13 \\xb1\\xd0N\\x9d3\\xe9Φʿ3\\xd9\\x1e\\xe7\\xea\\xf7\\xc0\\x15\\xed\\x92\\xddk\\xecf\\xabl\\x94\\x8d(сx\\xa36\\xf4\\xa58\\x18t¿\\xffp\\x14\\xb5\\x98(m\\x04\\xd5\\x1b(f\\xe0\\x9e\\xfa\\xaap\\xd0|\\xeb\\x8f\\x1fN\\x1cԔI#l\\xdb^\\xc8\\xf7\\xa6W\\xeab\\x8b\\x83\\x86\\xfcC\\xfa\\n\\x13\\xf10DJ\\xe9$e\\x86)\\x99K>\\x9c\\x94FX~vL[\\x9c\\x1aZk\\xed\\x978\\xed\\x9c\\x04/\\x9d0\\x7f\\x86\\xf3\\xac\\xd8x\\xf1\\xe8\\x17r\\xc07K^Oca\\xf9\\xb7\\xd1C\\xc9\\x00@\\xa8\\xca\\xfbUY\\xe5n\\x02\\x1bI\\xf6A|:\\xb6\\xd0U/\\x84\\x8e\\x87\\fh\\x1c\\xe6*\\x84\\b͎\\xf4T۱A\\xe6\\x1e\\xdd\\xe6\\xed%*\\xb6\\xb5\\xfc/\\x95S\\x9brzs\\xdaE\\xfe6\\x01ދf\\x1fĈ߃ٽ웵\\xb6\\x16\\x8b\\x00~LW\\x0e\\xde3uA\\xa3G<\\x90\\xbeޅ(\\x16|\\x82L\\x1a\\x10\\xc5%n\\xcdV\\x8e\\x86\\xf0F\\x06\\x01\\x0e\\xffx8ƣ\\\\L(\\xd3\\tu\\xa5\\xff\\xb5x~\\x7f\\x16xk\\\\\\xc1\\xe1\\x85E5x\\x85aQ\\x01y\\x0e\\xab~cۖ\\x8a\\xb5mx_\\xf2K8\\xbc\\x81L\\x93z\\xe1\\xde\\xfabQ\\xf9\\x9f&:(ܥ\\x85\\x98\\x99{\\xc7\\xe2K\\x7fY\\x8c}e%\\xf0T1\\xdaf\\x05{/,k\\x16Gߞ\\x98h\\x17nd5X`o+\\x1e\\xd7}]\\xc6\\xe5\\xff\\xe2o\\xb8\\t\\xf7>u\\xb1\\x9aW(.M\\xdaD\\u07bb\\xae\\x17\\xda\\xf8\\x1ab\\xfa\\xb4W\\x9cz\\x87\\x80\\xaf\\xaa\\x89\\xea\\xae\\x11\\b\\xb8\\xb9\\xf6\\xf2\\x82\\xf7Lu\\x1d\\x1e\\xcaD\\xa6\\xf0lf\\xef\\u0099[\\x04/\\x9d0\\x7f\\x86\\x17O\\xa5Ϸsu\\xf8\\xe1\\x0e\\xc9\\xea\\xbbOhf\\x0e\\xe8\\xae~N\\xb9Å\\x0f4\\x11\\x13\\x96\\x05X춇\\xc0\\xbdж\\xe3vLppa\\xb61\\xbe\\a0O\\xf2\\xb2\\xaf\\x17V\\xca\\xe1Q\\x1d\\x01\\xc2\\xd6r\\x9e\\x9dKWG\\x88$\\xa5\\xcb\\x15\\xf3(\\x9e\\x96\\x0e\\xf4պ[\\x8aj\\xc63?\\x97\\xc6\\x0f\\xbeKbYh\\\\b@~7<\\x8db\\x8a\\xb8G\\xf8\\xff9U\\xb6g[\\x1f\\xbb\\xfc\\xfd\\x03\\xf1\\v\\xa7C\\x01\\xdc5\\x0f\\xa3\\xbc\\xd8Ŀ\\xe0B\\xb8\\x1c\\xe9\\x90\\xc6B\\u218c\\xf6\\x97\\x98K\\xd0ʆȭ\\xee\\xca\\x1d\\xa6\\xe5\\xc2{~\\xf2=}2\\x81~\\x1f\\xa16\\x82\\xf3\\xd2\\xd0\\x05˷Npm\\x8a\\\"\\x8a\\f%|P\\xc9\\t\\xf1\\xd7E\\xc9\\xfe\\xfc(\\xa8\\xc3y \\x7fa\\x11\\xcfs\\xcb\\xffV\\xd1F\\xc2 \\xdeN6Us\\xed{\\xa7\\x01\\xb2\\x7f,\\xfe\\x8d\\x8eB`\\b\\xb6\\x02\\x96\\x1a\\xbf\\xf4\\xd8\\xd6\\xf8\\x88pG\\x92\\xaa\\xec\\bLP\\x12\\t\\x80\\xf2,트\\x18\\xb1\\xea\\xf3\\xae\\x81y\\xbek\\n\\xce:\\x8d\\x90\\x91LhF_? \\xa4\\xf4\\xb13\\xf6\\xa1\\x14S\\x03\\xc5W牗h\\xae\\xd5\\xf4D\\x9e9\\xeb\\x84ZI9\\xafr}tG#\\x04\\xad\\x9e\\x0635\\xa0\\xf6\\xe7)\\x174e;\\x80\\xcea\\xca\\b\\x1d\\xc8.\\x97\\x18%\\xdbwe\\xa9\\xc3M\\xca}Z\\xcf2\\x14\\xaf\\xc1-Sַm\\xe9݊q\\xc0r\\x00\\xce\\xf9\\x17\\xcb4: \\xd6z&5ؽ;\\xed\\xb1\\xc5\\xc2\\xe7\\xa7g\\xc5.\\xbe\\xec\\x04s\\xd3m\\x85\\x95\\x84\\\\v\\xae\\xfd\\x8b,\\xa0\\x7f\\x95?}\\xb5\\x15xK\\xc6\\xdc6\\xbc\\xe9Yͥ\\xcbNV\\\"\\xf2\\x00)$q\\xae\\x94X\\xcb\\xcf5\\x11vuk\\xa1\\x02\\xab\\x86\\x152R\\xb69\\x93B\\xeb\\x8b\\xf2\\xafg\\f#D\\xe8\\x85\\xdce\\xd6\\xf1M*\\xb7W\\xff\\x8b\\xefq\\xc3\\xe0X6\\xe1}\\xb2\\vͿ\\x9b\\x06f_k\\xd2\\r~\\xda!W\\x8d\\xe1+\\x98\\xf9e\\xe7\\xe7\\x92\\xd1\\xe8v\\x90\\xb3\\xaac\\x14\\x13p\\x97MM`٩\\xd8\\xcch\\x00\\xdb\\xdchF.\\xe8\\xfe\\x03\\xb3\\x8c\\b֨\\x8b\\x9c~\\xe8b\\xcc\\f\\x82\\xe3\\x9abHd\\x84\\xb1\\xfb\\xecD\\xb2Fz\\xf2<\\x98\\xc7\\xfb\\xd8nD\\x11pK\\xf4\\x1c\\xb4Yj\\x8b\\xf3\\x95\\xa2$.\\xe7\\xb6\\x1d\\x06DI\\xca\\xdbX]2\\xbe\\xdb\\xfc\\x00\\x1bl)\\xaa\\xa0\\x84\\xae\\xfaDW\\xf4\\x14\\xc9!6\\xca\\b\\x92\\x15:wIm-\\xaf\\xcb\\xee\\xc0\\xc1\\a\\xd8\\xd6F\\x1e)\\vxN\\x12r\\x11\\xe9\\xf4\\xa50000000000000000000000000000000000000000000000000000000000000000000000000000\\xbe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xda000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6d7d7ee8d4c9097ec44479c1913a303f2773647c46894bd6cc6845d7b4bb5f4e b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6d7d7ee8d4c9097ec44479c1913a303f2773647c46894bd6cc6845d7b4bb5f4e new file mode 100644 index 0000000000..ab2475beae --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6d7d7ee8d4c9097ec44479c1913a303f2773647c46894bd6cc6845d7b4bb5f4e @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000X000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xfe/00000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6dc7452270ae1b4984509e9751b1442ee4b95f7c9c6fb4cac8e696762dcb1b6f b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6dc7452270ae1b4984509e9751b1442ee4b95f7c9c6fb4cac8e696762dcb1b6f new file mode 100644 index 0000000000..e3ab9acda7 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6dc7452270ae1b4984509e9751b1442ee4b95f7c9c6fb4cac8e696762dcb1b6f @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6dde32092120c6d483ee107cac688dbe9de4f6df772175dcd76bf10b0e7f0c37 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6dde32092120c6d483ee107cac688dbe9de4f6df772175dcd76bf10b0e7f0c37 new file mode 100644 index 0000000000..4519b3d5da --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6dde32092120c6d483ee107cac688dbe9de4f6df772175dcd76bf10b0e7f0c37 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6fec2cef22d6d7c0debc6380e64c7e2b57220f7f592ca46ec95effe246db366a b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6fec2cef22d6d7c0debc6380e64c7e2b57220f7f592ca46ec95effe246db366a new file mode 100644 index 0000000000..d12f381511 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/6fec2cef22d6d7c0debc6380e64c7e2b57220f7f592ca46ec95effe246db366a @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/7044f1c80bb537d6461c9acc26ab1e3bf1d923e31776a2b9f88294a73ed443de b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/7044f1c80bb537d6461c9acc26ab1e3bf1d923e31776a2b9f88294a73ed443de new file mode 100644 index 0000000000..f7d24cafa9 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/7044f1c80bb537d6461c9acc26ab1e3bf1d923e31776a2b9f88294a73ed443de @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/70fb792a213b6c538db5d4facd77478cb31fdc876c02694ab3bef50710e5c63e b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/70fb792a213b6c538db5d4facd77478cb31fdc876c02694ab3bef50710e5c63e new file mode 100644 index 0000000000..ae249b89f8 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/70fb792a213b6c538db5d4facd77478cb31fdc876c02694ab3bef50710e5c63e @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/735df2021bcdf81df35f5af051450806733faa1ddfe21513b0e9338e7c4d7ca6 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/735df2021bcdf81df35f5af051450806733faa1ddfe21513b0e9338e7c4d7ca6 new file mode 100644 index 0000000000..4e5b39cbeb --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/735df2021bcdf81df35f5af051450806733faa1ddfe21513b0e9338e7c4d7ca6 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/73c8044c8d2447fe79e11122fc2634c4aa7be4430384886c701a392a2fd62c0d b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/73c8044c8d2447fe79e11122fc2634c4aa7be4430384886c701a392a2fd62c0d new file mode 100644 index 0000000000..80db3d7216 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/73c8044c8d2447fe79e11122fc2634c4aa7be4430384886c701a392a2fd62c0d @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/74835f93ba79ff704fb61dc6a4c14f8ce68d51ee3efb9172eef358bbd58c7610 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/74835f93ba79ff704fb61dc6a4c14f8ce68d51ee3efb9172eef358bbd58c7610 new file mode 100644 index 0000000000..f6299551cb --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/74835f93ba79ff704fb61dc6a4c14f8ce68d51ee3efb9172eef358bbd58c7610 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/781b59668a952c6ecd073308d82c26b5d476b51c2f10c1467dae6caec993cd96 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/781b59668a952c6ecd073308d82c26b5d476b51c2f10c1467dae6caec993cd96 new file mode 100644 index 0000000000..2486e5bdff --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/781b59668a952c6ecd073308d82c26b5d476b51c2f10c1467dae6caec993cd96 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/79302f8cd78f54acb5e360f45cb44a260fc21dac870528ab2a342ef85f8da186 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/79302f8cd78f54acb5e360f45cb44a260fc21dac870528ab2a342ef85f8da186 new file mode 100644 index 0000000000..88d6d8c94f --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/79302f8cd78f54acb5e360f45cb44a260fc21dac870528ab2a342ef85f8da186 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/7bc4e8151965ee7ce650797316ba49486a7c2ac4e9d032ebbb2417f40e9fda7b b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/7bc4e8151965ee7ce650797316ba49486a7c2ac4e9d032ebbb2417f40e9fda7b new file mode 100644 index 0000000000..800a7652bd --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/7bc4e8151965ee7ce650797316ba49486a7c2ac4e9d032ebbb2417f40e9fda7b @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000!00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/7e6e3bcf0235fa5adc7831d74231279839f5ffade7037954b3bdc71829c5482a b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/7e6e3bcf0235fa5adc7831d74231279839f5ffade7037954b3bdc71829c5482a new file mode 100644 index 0000000000..dcab2e2851 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/7e6e3bcf0235fa5adc7831d74231279839f5ffade7037954b3bdc71829c5482a @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000B0000000A000B0000000A0000000A0000000A0000000A0000000A0000000A00070000000A0000000A0000000A0000000A000X0000000A000200 0000A0000000A000X000000010000000A0000000A0000000A0000000C0000000A0000000A0000000A0000000A0000000A0000000A000\\x93000\\x950000000B00 0000A0000000X0000000A0000000A0000000A0000000A0000000A00090000000A000000010000000A0000000A000000010000000A000000010000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/80462184ed92523e56ab91e44409a03b8b14e3bd88455c7ac638a7385ccc1224 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/80462184ed92523e56ab91e44409a03b8b14e3bd88455c7ac638a7385ccc1224 new file mode 100644 index 0000000000..cb2066df33 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/80462184ed92523e56ab91e44409a03b8b14e3bd88455c7ac638a7385ccc1224 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/8252c9ee08c8aca728644ba40cd38ff45e02edad67c61e5c905837cdeb14cffc b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/8252c9ee08c8aca728644ba40cd38ff45e02edad67c61e5c905837cdeb14cffc new file mode 100644 index 0000000000..e26dc161ad --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/8252c9ee08c8aca728644ba40cd38ff45e02edad67c61e5c905837cdeb14cffc @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/82b5fe7fe265f963734aaf3edadf8ddce5b1dcab64155de1e3f3fb6a80286fd0 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/82b5fe7fe265f963734aaf3edadf8ddce5b1dcab64155de1e3f3fb6a80286fd0 new file mode 100644 index 0000000000..62627e55e0 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/82b5fe7fe265f963734aaf3edadf8ddce5b1dcab64155de1e3f3fb6a80286fd0 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe50X0\\xe5000\\xe5000\\xe5000\\xe500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/83de7d5430c5193ce2cfcbc68e6ac800e31f39feec13fba6697c016cfdee9570 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/83de7d5430c5193ce2cfcbc68e6ac800e31f39feec13fba6697c016cfdee9570 new file mode 100644 index 0000000000..6d75397c28 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/83de7d5430c5193ce2cfcbc68e6ac800e31f39feec13fba6697c016cfdee9570 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000010000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0007000000010000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A000X0000000A0000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/8a38e3bcb4bb4b0b111ca1e774ca70afe3aee3181fb031e8d42af690377c0e1f b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/8a38e3bcb4bb4b0b111ca1e774ca70afe3aee3181fb031e8d42af690377c0e1f new file mode 100644 index 0000000000..71d398b2fa --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/8a38e3bcb4bb4b0b111ca1e774ca70afe3aee3181fb031e8d42af690377c0e1f @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000&00 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/8b7584a841aa22959a387d21dad8ed95d9cde2a876be61a52135f72d117e357f b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/8b7584a841aa22959a387d21dad8ed95d9cde2a876be61a52135f72d117e357f new file mode 100644 index 0000000000..6a7249a077 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/8b7584a841aa22959a387d21dad8ed95d9cde2a876be61a52135f72d117e357f @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/8ba4ec0907eae145d1fad9a6f4f2652368bc1ccfd76f0702cf7b212329b5befc b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/8ba4ec0907eae145d1fad9a6f4f2652368bc1ccfd76f0702cf7b212329b5befc new file mode 100644 index 0000000000..b6c68f5a0a --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/8ba4ec0907eae145d1fad9a6f4f2652368bc1ccfd76f0702cf7b212329b5befc @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/90b12c1c5ed4e171d09c7251244d6925f49a9819f082d86c0820a73104ab755e b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/90b12c1c5ed4e171d09c7251244d6925f49a9819f082d86c0820a73104ab755e new file mode 100644 index 0000000000..73ff6f9a7c --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/90b12c1c5ed4e171d09c7251244d6925f49a9819f082d86c0820a73104ab755e @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xe50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xba000000000000000000000000000000000000\\xf3\\xf3\\xf3\\xf3\\xf3\\xf30000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/919d9b4423d0593ce102265eee3cf6b05d9814fd350a855417a175c9d8350351 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/919d9b4423d0593ce102265eee3cf6b05d9814fd350a855417a175c9d8350351 new file mode 100644 index 0000000000..3222f8e442 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/919d9b4423d0593ce102265eee3cf6b05d9814fd350a855417a175c9d8350351 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/91a0e95093d3f67ede7c2c217424caa45e4db1b0086d8432d43bc50c4922d79b b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/91a0e95093d3f67ede7c2c217424caa45e4db1b0086d8432d43bc50c4922d79b new file mode 100644 index 0000000000..ba87ae56c0 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/91a0e95093d3f67ede7c2c217424caa45e4db1b0086d8432d43bc50c4922d79b @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X0000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/92ca7994860c71ec5ab25e712b370bb9da0d71b9964882f093e9569d036e8fb1 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/92ca7994860c71ec5ab25e712b370bb9da0d71b9964882f093e9569d036e8fb1 new file mode 100644 index 0000000000..a71aa7faf2 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/92ca7994860c71ec5ab25e712b370bb9da0d71b9964882f093e9569d036e8fb1 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/940c7dac79fe3b9b3a44a023cf75258732cacb03a8af9237df355a7646527a0b b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/940c7dac79fe3b9b3a44a023cf75258732cacb03a8af9237df355a7646527a0b new file mode 100644 index 0000000000..2140a7b439 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/940c7dac79fe3b9b3a44a023cf75258732cacb03a8af9237df355a7646527a0b @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/95375140cb4e7e3056cbc8c223337e635fc31c502fc5dd8d1f86b22ec5b69ba4 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/95375140cb4e7e3056cbc8c223337e635fc31c502fc5dd8d1f86b22ec5b69ba4 new file mode 100644 index 0000000000..9160617a0e --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/95375140cb4e7e3056cbc8c223337e635fc31c502fc5dd8d1f86b22ec5b69ba4 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/97cd477ec499b43ca3518ad99afbca87b7b4dc5ec5113145b9d8f1faf16681cd b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/97cd477ec499b43ca3518ad99afbca87b7b4dc5ec5113145b9d8f1faf16681cd new file mode 100644 index 0000000000..86b869d602 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/97cd477ec499b43ca3518ad99afbca87b7b4dc5ec5113145b9d8f1faf16681cd @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5008\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/98f318f3b1743b003c5f148608c812c9a0f09927e72544ea2112d1ddebd461c7 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/98f318f3b1743b003c5f148608c812c9a0f09927e72544ea2112d1ddebd461c7 new file mode 100644 index 0000000000..bd7538f07b --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/98f318f3b1743b003c5f148608c812c9a0f09927e72544ea2112d1ddebd461c7 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/9998a69315a4db8a87f745d0a93af4bc0dcfdb6e9cb4cb28b8cb7b864a3c40e8 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/9998a69315a4db8a87f745d0a93af4bc0dcfdb6e9cb4cb28b8cb7b864a3c40e8 new file mode 100644 index 0000000000..88bae0adb6 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/9998a69315a4db8a87f745d0a93af4bc0dcfdb6e9cb4cb28b8cb7b864a3c40e8 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000 0000A0000000A0000000A0000000A0000000A000B000C0000000A0000000A0000000A0000000A000000010000000A0000000A0000000A0000000A0000000A00000001000A0000000A0000000A0000000A0000000A0000000A000B000C0000000A0000000A0000000A0000000\\x9a000\\xa7000x000y000000010000000A00000001000000010000000A000X0000000A000000010000000A0000000A\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/99f34f2659fb9032a634f2e9a9c88503ec5f360a24b00fe587ba4c625776496f b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/99f34f2659fb9032a634f2e9a9c88503ec5f360a24b00fe587ba4c625776496f new file mode 100644 index 0000000000..fec9ec5016 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/99f34f2659fb9032a634f2e9a9c88503ec5f360a24b00fe587ba4c625776496f @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/9ce68d5be174f1345a5c91eec53988443a907cb966f395fafed9b2b55f093c0a b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/9ce68d5be174f1345a5c91eec53988443a907cb966f395fafed9b2b55f093c0a new file mode 100644 index 0000000000..234347d8cf --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/9ce68d5be174f1345a5c91eec53988443a907cb966f395fafed9b2b55f093c0a @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/9f0263ae39f59a6ed3d1ca95693ce4247f5fd5bb74fdebbd7d87cd6ca9b25123 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/9f0263ae39f59a6ed3d1ca95693ce4247f5fd5bb74fdebbd7d87cd6ca9b25123 new file mode 100644 index 0000000000..3d96169dc3 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/9f0263ae39f59a6ed3d1ca95693ce4247f5fd5bb74fdebbd7d87cd6ca9b25123 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000\\xff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xbe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xda00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xfe000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/a1bdc0acbbd5c1594e7b3c38e0d8f4136167e73a608ee7de7b0833ff482ea7db b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/a1bdc0acbbd5c1594e7b3c38e0d8f4136167e73a608ee7de7b0833ff482ea7db new file mode 100644 index 0000000000..9fad4f3bd2 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/a1bdc0acbbd5c1594e7b3c38e0d8f4136167e73a608ee7de7b0833ff482ea7db @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\r0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\r0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\r0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\r0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/a509b34cffc9d1d66766846efde4a0f4c00298e8ccf3e5bd72cc12ceceec2f91 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/a509b34cffc9d1d66766846efde4a0f4c00298e8ccf3e5bd72cc12ceceec2f91 new file mode 100644 index 0000000000..6a0947ecc3 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/a509b34cffc9d1d66766846efde4a0f4c00298e8ccf3e5bd72cc12ceceec2f91 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/a6b35ad851d92120f205c532088cada16c0a593101783484029fa63ba21206ec b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/a6b35ad851d92120f205c532088cada16c0a593101783484029fa63ba21206ec new file mode 100644 index 0000000000..75245f83e5 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/a6b35ad851d92120f205c532088cada16c0a593101783484029fa63ba21206ec @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x000x\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/a6cc0f8a9dd601053bb818271175ce458018e492d782a7804dab71586bcf3a17 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/a6cc0f8a9dd601053bb818271175ce458018e492d782a7804dab71586bcf3a17 new file mode 100644 index 0000000000..7d9133806d --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/a6cc0f8a9dd601053bb818271175ce458018e492d782a7804dab71586bcf3a17 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xbe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xda000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/a6e3324a793840f6f86c1ca1390d80eb1004e4a4531481d466eda787183ec972 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/a6e3324a793840f6f86c1ca1390d80eb1004e4a4531481d466eda787183ec972 new file mode 100644 index 0000000000..8d3433aeaf --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/a6e3324a793840f6f86c1ca1390d80eb1004e4a4531481d466eda787183ec972 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/aa37a94a35f25d87b610a0ab4892e12c80e3ea9cfac6e317b38e92bf8d6cce48 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/aa37a94a35f25d87b610a0ab4892e12c80e3ea9cfac6e317b38e92bf8d6cce48 new file mode 100644 index 0000000000..28be0f70ab --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/aa37a94a35f25d87b610a0ab4892e12c80e3ea9cfac6e317b38e92bf8d6cce48 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000 0000A0000000A0000000A0000000A00000001000200010000000A0000000A0000000A0000000A000000010000000100020000000A0000000A0000000A0000000A0000000C000700080000000A0000000A0000000A0000000100000001000A000000010000000A00000001000000010000000A00010000000A000000010000000A00000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ab0c83116b6f8770aa32503c9df43ea3daf00aef9cb04e0431dff8c6e0c9694a b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ab0c83116b6f8770aa32503c9df43ea3daf00aef9cb04e0431dff8c6e0c9694a new file mode 100644 index 0000000000..3b1bcb9813 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ab0c83116b6f8770aa32503c9df43ea3daf00aef9cb04e0431dff8c6e0c9694a @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ab7deac1b8def32e16ef71f41f04f60d817c5c5c871736e2aed7ca5ad598c94d b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ab7deac1b8def32e16ef71f41f04f60d817c5c5c871736e2aed7ca5ad598c94d new file mode 100644 index 0000000000..1c81fcd559 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ab7deac1b8def32e16ef71f41f04f60d817c5c5c871736e2aed7ca5ad598c94d @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/abb2fbeb477b6ee30db7ccc6668a8a541dba1954b8402c486ad35eb64b3985a3 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/abb2fbeb477b6ee30db7ccc6668a8a541dba1954b8402c486ad35eb64b3985a3 new file mode 100644 index 0000000000..bbf305d8ea --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/abb2fbeb477b6ee30db7ccc6668a8a541dba1954b8402c486ad35eb64b3985a3 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ac5f19ef3f005d86f8abce54ca6ec48519316aebf8f196d451b45407eecbf1e3 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ac5f19ef3f005d86f8abce54ca6ec48519316aebf8f196d451b45407eecbf1e3 new file mode 100644 index 0000000000..6932c52aa5 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ac5f19ef3f005d86f8abce54ca6ec48519316aebf8f196d451b45407eecbf1e3 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ad5d950cd76699ee29a8b5cfff518737f8f91542fc2d10ee2313642ceb39d6e7 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ad5d950cd76699ee29a8b5cfff518737f8f91542fc2d10ee2313642ceb39d6e7 new file mode 100644 index 0000000000..1f1a995a90 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ad5d950cd76699ee29a8b5cfff518737f8f91542fc2d10ee2313642ceb39d6e7 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000X000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xfe/000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b1ab4136844b2f987b671603ed7523c414fce8ae81475d8c3643d0bc7f4b4b38 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b1ab4136844b2f987b671603ed7523c414fce8ae81475d8c3643d0bc7f4b4b38 new file mode 100644 index 0000000000..dd66cecd9d --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b1ab4136844b2f987b671603ed7523c414fce8ae81475d8c3643d0bc7f4b4b38 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000X000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b373b8e0357e4b97e503ea9edb2adb9ae495033a9c0d68f0a2f3fcc2a365e800 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b373b8e0357e4b97e503ea9edb2adb9ae495033a9c0d68f0a2f3fcc2a365e800 new file mode 100644 index 0000000000..08bbf56011 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b373b8e0357e4b97e503ea9edb2adb9ae495033a9c0d68f0a2f3fcc2a365e800 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"001000000010000000010000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\x00\\x00\\x00 \\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\xcf\\r0\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\rA\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r0\\r0\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\xcf\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r10\\r\\r\\r\\rA\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r00\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r00\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r00\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r1\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\rA0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r0\\r\\r0\\r\\r\\r\\r\\r\\r\\r0\\r0\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\rA\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r1\\r\\r\\r\\rA\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\rA0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r00\\r\\r\\r\\r\\r\\r\\rA\\r0\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\rA\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r0\\r0\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\rA\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r%\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r0\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r00\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r00\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\rA\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\rA0\\r\\r\\r\\r0\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\rA\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r0\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r0\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r1\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r0\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\rA\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r1\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\rA0\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r0\\r0\\r\\r\\r00\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r0\\r\\r\\r\\r\\r\\r\\r\\rA\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r00010000000100000000000000A0000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b412f8791d0ad75b4b94ebfcc3fc982adbfd9b857fc8e1e2ca798d734077daf1 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b412f8791d0ad75b4b94ebfcc3fc982adbfd9b857fc8e1e2ca798d734077daf1 new file mode 100644 index 0000000000..e73c1e0e86 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b412f8791d0ad75b4b94ebfcc3fc982adbfd9b857fc8e1e2ca798d734077daf1 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0X00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xdd000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b6e1da0b13ab10de85a67fbde933445a42889b9d9ec39d7a6bfe617e168dc04b b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b6e1da0b13ab10de85a67fbde933445a42889b9d9ec39d7a6bfe617e168dc04b new file mode 100644 index 0000000000..d95f530193 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b6e1da0b13ab10de85a67fbde933445a42889b9d9ec39d7a6bfe617e168dc04b @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b7dbe68221c9c29f82bc79469c5ae26114f70e063ab4ef86f04fee8b5cb1027e b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b7dbe68221c9c29f82bc79469c5ae26114f70e063ab4ef86f04fee8b5cb1027e new file mode 100644 index 0000000000..39505d0b7f --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b7dbe68221c9c29f82bc79469c5ae26114f70e063ab4ef86f04fee8b5cb1027e @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5008\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe5000\\xe50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b81bab9174b3eca77200d4bf2eb82571217275ac65cf539f9618da489e7a8ad3 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b81bab9174b3eca77200d4bf2eb82571217275ac65cf539f9618da489e7a8ad3 new file mode 100644 index 0000000000..d88984d68d --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b81bab9174b3eca77200d4bf2eb82571217275ac65cf539f9618da489e7a8ad3 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000A0000000A0000000A0000000A0000000A0000000A000X00080000000A0000000X000Y0000000A0000000A0000000A0000000\\x04000\\x0e000\\x1b007\\xfb008\\xfb0000000A0000000A0000000A0000000A0000000A000000\\r\\xdb00 \\xdb0000000A0000000A0000000A0000000A000\\xc4000\\xca0000000A0000000A0000000A0000000A0000000A0000000X000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A000\\xaa000\\xb70000000A0000000A0000000A0000000A0000000A000X0000000A0000000A0000000A0002000100000001\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b847c8c96e4d24591ba23ecb559d693ed1cfe7d26e5d1e26e74e9eb727f72b9a b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b847c8c96e4d24591ba23ecb559d693ed1cfe7d26e5d1e26e74e9eb727f72b9a new file mode 100644 index 0000000000..153ae7245c --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b847c8c96e4d24591ba23ecb559d693ed1cfe7d26e5d1e26e74e9eb727f72b9a @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \\x1a\\x1a\\x1a \\x1a\\x1a\\x1a \\x1a\\x1a\\x1a \\x1a\\x1a\\x1a \\x1a\\x1a\\x1a \\x1a\\x1a\\x1a \\x1a\\x1a\\x1a \\x1a\\x1a\\x1a \\x1a\\x1a\\x1a \\x1a\\x1a\\x1a \\x1a\\x1a\\x1a \\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a#\\x1a\\x1a\\x1a0\\x1a\\x1a\\x1a \\x1a\\x1a\\x1a \\x1a\\x1a\\x1a \\x1a\\x1a\\x1a \\x1a\\x1a\\x1a \\x1a\\x1a\\x1a\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b930d5b8f61bb456394dcac79f27b3431688cb3f0b5db2d7afff126e8b8d8df6 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b930d5b8f61bb456394dcac79f27b3431688cb3f0b5db2d7afff126e8b8d8df6 new file mode 100644 index 0000000000..a83012ec89 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/b930d5b8f61bb456394dcac79f27b3431688cb3f0b5db2d7afff126e8b8d8df6 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/bade6b4d0ed632738bd3c5e41f83cc1ae4857d7a0989d719ead13ebcd8ef9bca b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/bade6b4d0ed632738bd3c5e41f83cc1ae4857d7a0989d719ead13ebcd8ef9bca new file mode 100644 index 0000000000..6b415db4f2 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/bade6b4d0ed632738bd3c5e41f83cc1ae4857d7a0989d719ead13ebcd8ef9bca @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/bd1bca6d883fb59bc3f610ac45658fdb7529ec57aaefba1578e04e7db5612430 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/bd1bca6d883fb59bc3f610ac45658fdb7529ec57aaefba1578e04e7db5612430 new file mode 100644 index 0000000000..373a37347e --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/bd1bca6d883fb59bc3f610ac45658fdb7529ec57aaefba1578e04e7db5612430 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/bde888172d6043fba46602dec78ded54dfa443cfea3e2520bfe8305269b5dc3b b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/bde888172d6043fba46602dec78ded54dfa443cfea3e2520bfe8305269b5dc3b new file mode 100644 index 0000000000..54b971c9fa --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/bde888172d6043fba46602dec78ded54dfa443cfea3e2520bfe8305269b5dc3b @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000A0000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/bfc387e3883e31928a2b459ae2fb0c2566e1639c1d9be1c8b20d48f401a72e1b b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/bfc387e3883e31928a2b459ae2fb0c2566e1639c1d9be1c8b20d48f401a72e1b new file mode 100644 index 0000000000..efbfae1196 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/bfc387e3883e31928a2b459ae2fb0c2566e1639c1d9be1c8b20d48f401a72e1b @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000A0000000A00010010000000010000000A0100000001000000010000000100000001000000080001000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000009000100000008000100000001000011010100020000000A0000000A000000010000000A00000001000000010000000A0000000A0000000A0000000A0000000100000001000000010000000A0000000A0000000A0000000A000000010000000A0000000A0000000A0000000A0000000A0000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c0bccc497b8d8583c658d755c723ef07d4c04e3b88ed06fb0f2cbd851d55a309 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c0bccc497b8d8583c658d755c723ef07d4c04e3b88ed06fb0f2cbd851d55a309 new file mode 100644 index 0000000000..eabacc661c --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c0bccc497b8d8583c658d755c723ef07d4c04e3b88ed06fb0f2cbd851d55a309 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"\\x01\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\x01\\x00100\\x01\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c11be239e2d403dca0c9b61c474ed281292023ff3e8c3a4b4ca4f403cf8f0a65 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c11be239e2d403dca0c9b61c474ed281292023ff3e8c3a4b4ca4f403cf8f0a65 new file mode 100644 index 0000000000..7d8d867bf4 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c11be239e2d403dca0c9b61c474ed281292023ff3e8c3a4b4ca4f403cf8f0a65 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c18649778be24cc88ac1127ac5c5d78a6e5f5d39a49e99a807d31f2c89e0f7d4 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c18649778be24cc88ac1127ac5c5d78a6e5f5d39a49e99a807d31f2c89e0f7d4 new file mode 100644 index 0000000000..9d09cf1a33 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c18649778be24cc88ac1127ac5c5d78a6e5f5d39a49e99a807d31f2c89e0f7d4 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"10000000000A000A000A000A000A000A000A000A000A000A000A000A000A000A000A000A000A000A000A000A000A000A000A000A000A000A000A000A000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c50dacb6c027a906f4bc9312564a3b0aa7c6b0d54d518d5e22aa9f4e7cf1772c b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c50dacb6c027a906f4bc9312564a3b0aa7c6b0d54d518d5e22aa9f4e7cf1772c new file mode 100644 index 0000000000..fe2dfc2fd3 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c50dacb6c027a906f4bc9312564a3b0aa7c6b0d54d518d5e22aa9f4e7cf1772c @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c6256196b0828b34d1ed62eb542f9f5be8437ff2d8027e83046d7421de2c5e12 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c6256196b0828b34d1ed62eb542f9f5be8437ff2d8027e83046d7421de2c5e12 new file mode 100644 index 0000000000..eedd0724ef --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c6256196b0828b34d1ed62eb542f9f5be8437ff2d8027e83046d7421de2c5e12 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c6d91f4248454ea578204f04b3ca1ff4441e8b304f1fc0e91381e17dea7274d1 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c6d91f4248454ea578204f04b3ca1ff4441e8b304f1fc0e91381e17dea7274d1 new file mode 100644 index 0000000000..01ef3cef6f --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c6d91f4248454ea578204f04b3ca1ff4441e8b304f1fc0e91381e17dea7274d1 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x00010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c70bfef4bd6fec1dce0da687423e650e0a96912fb8a3cfdf8fa9fa37d7fb9658 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c70bfef4bd6fec1dce0da687423e650e0a96912fb8a3cfdf8fa9fa37d7fb9658 new file mode 100644 index 0000000000..e315cbc666 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c70bfef4bd6fec1dce0da687423e650e0a96912fb8a3cfdf8fa9fa37d7fb9658 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c85e42c17148356a15bc9d6fda4390c9b47c04cb28cba467b88b29a890b2b7d9 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c85e42c17148356a15bc9d6fda4390c9b47c04cb28cba467b88b29a890b2b7d9 new file mode 100644 index 0000000000..a9c5d636af --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c85e42c17148356a15bc9d6fda4390c9b47c04cb28cba467b88b29a890b2b7d9 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000A0000000A0000000A0000000A\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c8a9e918d8a497ccd870f549c3be69bdbf01626116464fac8ee71e2d5ecea760 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c8a9e918d8a497ccd870f549c3be69bdbf01626116464fac8ee71e2d5ecea760 new file mode 100644 index 0000000000..5a67c61216 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c8a9e918d8a497ccd870f549c3be69bdbf01626116464fac8ee71e2d5ecea760 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0000000000000000000000000000000000000000000000\\x0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xe500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\x00 000000000000000000000000000000000000000000000000000000000000000000000000\\xba000000000000000000000000000000000000\\xf3\\xf3\\xf3\\xf3\\xf3\\xf30000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c9f0eb1a6dd45c7f9915744550c17099bfa8e4ab96618a50991a5d67ffcefcdc b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c9f0eb1a6dd45c7f9915744550c17099bfa8e4ab96618a50991a5d67ffcefcdc new file mode 100644 index 0000000000..255b06c63a --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/c9f0eb1a6dd45c7f9915744550c17099bfa8e4ab96618a50991a5d67ffcefcdc @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cae994d6aaf565cde84766510a8a1a47bcd7bb20d00346b907789e21a512cd08 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cae994d6aaf565cde84766510a8a1a47bcd7bb20d00346b907789e21a512cd08 new file mode 100644 index 0000000000..f2505dde08 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cae994d6aaf565cde84766510a8a1a47bcd7bb20d00346b907789e21a512cd08 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"001000000010000000010000000A0000000A0000000A0000000A0000000A000000100000000A0000000A0000000A0000000A000000010000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A00010000000A000000010000000A0000000A000000010000000A00000001000000ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt0A000000100000001000010000000100000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/caf7bfd6c5b122d91244bc7e0cdf4bec7b8bbdc2595a0fe4e0612270c320d1a1 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/caf7bfd6c5b122d91244bc7e0cdf4bec7b8bbdc2595a0fe4e0612270c320d1a1 new file mode 100644 index 0000000000..8bf6908869 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/caf7bfd6c5b122d91244bc7e0cdf4bec7b8bbdc2595a0fe4e0612270c320d1a1 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cbb93dfb4c821715ddd2b245568131ea32d4fbd596d60f9b4e690bed80bedfd6 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cbb93dfb4c821715ddd2b245568131ea32d4fbd596d60f9b4e690bed80bedfd6 new file mode 100644 index 0000000000..b1b57871d1 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cbb93dfb4c821715ddd2b245568131ea32d4fbd596d60f9b4e690bed80bedfd6 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cc5d45c59f032906ecb8a3beb92b392f1be266063d015c01ab491bbe3534cb06 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cc5d45c59f032906ecb8a3beb92b392f1be266063d015c01ab491bbe3534cb06 new file mode 100644 index 0000000000..5b08c609a5 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cc5d45c59f032906ecb8a3beb92b392f1be266063d015c01ab491bbe3534cb06 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cd0af3241753b71de89455b67bf2cfa2204914cb71aeb2d381c522d8c2558e2e b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cd0af3241753b71de89455b67bf2cfa2204914cb71aeb2d381c522d8c2558e2e new file mode 100644 index 0000000000..821ee7e3c7 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cd0af3241753b71de89455b67bf2cfa2204914cb71aeb2d381c522d8c2558e2e @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"001000000010000000010000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r\\r000000010000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A00010000000A000000010000000A0000000A\\xcf\\xcf000000010000000A000000010000000A0000000A0000000A000010000000100000000000000A0000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cd2a2ba52cf0c49a017b450d2be908843a23fc1645adbb6fb9857d96b335b1b6 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cd2a2ba52cf0c49a017b450d2be908843a23fc1645adbb6fb9857d96b335b1b6 new file mode 100644 index 0000000000..aa04083622 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cd2a2ba52cf0c49a017b450d2be908843a23fc1645adbb6fb9857d96b335b1b6 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cda65fa8d6204f2c306595d6ac8d67b340252bdb139fb9cf8d2ba2e419db8f70 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cda65fa8d6204f2c306595d6ac8d67b340252bdb139fb9cf8d2ba2e419db8f70 new file mode 100644 index 0000000000..d2bcb136c9 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cda65fa8d6204f2c306595d6ac8d67b340252bdb139fb9cf8d2ba2e419db8f70 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ce77e27941cdd821caf2ed65f5fe8f47e4b464f7204c34fa989fbb189b0a7a75 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ce77e27941cdd821caf2ed65f5fe8f47e4b464f7204c34fa989fbb189b0a7a75 new file mode 100644 index 0000000000..898bc1590a --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ce77e27941cdd821caf2ed65f5fe8f47e4b464f7204c34fa989fbb189b0a7a75 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ce8aae3b56780c58b42250ded4b4ede9bd73f0eebaab210b627585bbfb57e89f b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ce8aae3b56780c58b42250ded4b4ede9bd73f0eebaab210b627585bbfb57e89f new file mode 100644 index 0000000000..85e08e849a --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ce8aae3b56780c58b42250ded4b4ede9bd73f0eebaab210b627585bbfb57e89f @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd70\\xd7\\xd7\\xd7\\xd7\\xd7\\xd7\\xd700\\xd700\\xd7\\xd7000000000X000000000000000X000000000000000X000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cf5f655d1033c02c438172768fa296f0d58afd61b7f3504e1e6aa25de735c260 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cf5f655d1033c02c438172768fa296f0d58afd61b7f3504e1e6aa25de735c260 new file mode 100644 index 0000000000..7fd15e79d5 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cf5f655d1033c02c438172768fa296f0d58afd61b7f3504e1e6aa25de735c260 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWW0WWWWWWWWWWWWWWWWdWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWW0W0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWW0WWWWWW0WWWWWWWWW0WWW0WWWWWWW0WWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWW\\xa0WWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW\\xa0WWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWW0WWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWW0WWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WW00WW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWW0WWW0WWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW\\xa0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWW0WWWWWWW0WWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW00WWWW0WWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWW0WWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW\\xa3WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWW0WWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWW0WWW0WWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0W0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW0000000000000000000000000000000000000000000\\xe50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xba000000000000000000000000000000000000\\xf3\\xf3\\xf3\\xf3\\xf3\\xf30000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cf73880fc5b4f59c9ecb164f42d67d33b41f5db9dff09268e786287a47c9949c b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cf73880fc5b4f59c9ecb164f42d67d33b41f5db9dff09268e786287a47c9949c new file mode 100644 index 0000000000..e7297bcf5c --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/cf73880fc5b4f59c9ecb164f42d67d33b41f5db9dff09268e786287a47c9949c @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d35beb0221535458155c012553310cc0c93bffb0ef14faebebfe3a8c2ca6e35a b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d35beb0221535458155c012553310cc0c93bffb0ef14faebebfe3a8c2ca6e35a new file mode 100644 index 0000000000..0f60f200d8 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d35beb0221535458155c012553310cc0c93bffb0ef14faebebfe3a8c2ca6e35a @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d49935174de567379e5c46589b415736f1d79656fa3f87ebd975fc03ff7c8f85 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d49935174de567379e5c46589b415736f1d79656fa3f87ebd975fc03ff7c8f85 new file mode 100644 index 0000000000..12c5fa56d9 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d49935174de567379e5c46589b415736f1d79656fa3f87ebd975fc03ff7c8f85 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000!0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d6297a8f059f6b6a43a492083b9e74755949eb9cf45f567b5741cb7b1cbfa623 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d6297a8f059f6b6a43a492083b9e74755949eb9cf45f567b5741cb7b1cbfa623 new file mode 100644 index 0000000000..85a635cd4f --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d6297a8f059f6b6a43a492083b9e74755949eb9cf45f567b5741cb7b1cbfa623 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X00000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d6704d4b5867d2d020c68419518a8fb5b6e20f26cf27a60e30e84c000d4f4cd3 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d6704d4b5867d2d020c68419518a8fb5b6e20f26cf27a60e30e84c000d4f4cd3 new file mode 100644 index 0000000000..0572b6041c --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d6704d4b5867d2d020c68419518a8fb5b6e20f26cf27a60e30e84c000d4f4cd3 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d6b63306ef64a077069ae1c13d1e469b6ac01f7dd5df7f93758c6ab36e3c4f75 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d6b63306ef64a077069ae1c13d1e469b6ac01f7dd5df7f93758c6ab36e3c4f75 new file mode 100644 index 0000000000..9122c2c137 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d6b63306ef64a077069ae1c13d1e469b6ac01f7dd5df7f93758c6ab36e3c4f75 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000x0000X0\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d8c2efa3ffa71157935a8aa32951bf89b19fbb9ff424e34aba0d1a3b0750584d b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d8c2efa3ffa71157935a8aa32951bf89b19fbb9ff424e34aba0d1a3b0750584d new file mode 100644 index 0000000000..5eff5d17e2 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d8c2efa3ffa71157935a8aa32951bf89b19fbb9ff424e34aba0d1a3b0750584d @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d8e25c58e5a52759e6bf2c1e01e722be3742f440cdf5d9fb2080806179e9a231 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d8e25c58e5a52759e6bf2c1e01e722be3742f440cdf5d9fb2080806179e9a231 new file mode 100644 index 0000000000..9aca96a3d3 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d8e25c58e5a52759e6bf2c1e01e722be3742f440cdf5d9fb2080806179e9a231 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"001000000010000000010000000A0000000A0000000A0000000A0000000A000000100000000A0000000A0000000A0000000A000000010000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A00010000000A000000010000000A0000000A000000010000000A00000001000000tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttYtttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttCCCttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt\\x84tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt\\x7ftttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt\\x87tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt0A000000100000001000010000000100000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d99fa5161e31d3623389aab4923f4d26437bbf1f323b94820da58592666aa8d5 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d99fa5161e31d3623389aab4923f4d26437bbf1f323b94820da58592666aa8d5 new file mode 100644 index 0000000000..0d4070b181 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/d99fa5161e31d3623389aab4923f4d26437bbf1f323b94820da58592666aa8d5 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x00010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/e1f1652aa028a58c7c2d8bfe8cd591b18a21c54a03006d55736e356ba6ad83f3 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/e1f1652aa028a58c7c2d8bfe8cd591b18a21c54a03006d55736e356ba6ad83f3 new file mode 100644 index 0000000000..32a6ba5ca4 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/e1f1652aa028a58c7c2d8bfe8cd591b18a21c54a03006d55736e356ba6ad83f3 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/e22cb15f9d9b47914f58ff306d317bf3a3e9aea38761f832a29928a4174b04fb b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/e22cb15f9d9b47914f58ff306d317bf3a3e9aea38761f832a29928a4174b04fb new file mode 100644 index 0000000000..d5a0047491 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/e22cb15f9d9b47914f58ff306d317bf3a3e9aea38761f832a29928a4174b04fb @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/e33b4e93ebd44efffd1f8f0cd859df29474ff8391a42b58b88a01f3e7f580bfa b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/e33b4e93ebd44efffd1f8f0cd859df29474ff8391a42b58b88a01f3e7f580bfa new file mode 100644 index 0000000000..852a36490c --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/e33b4e93ebd44efffd1f8f0cd859df29474ff8391a42b58b88a01f3e7f580bfa @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\a\\a\\aX000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\a\\a\\aX00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/e4f42afb92131940f86577887b39ca083e2e10b5766c2c599270703d72f723ff b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/e4f42afb92131940f86577887b39ca083e2e10b5766c2c599270703d72f723ff new file mode 100644 index 0000000000..fc4ea9db0a --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/e4f42afb92131940f86577887b39ca083e2e10b5766c2c599270703d72f723ff @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/e86df09cb21d03c5ad1cb340c46aaae575df4abb7d02466a6a921a915b421599 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/e86df09cb21d03c5ad1cb340c46aaae575df4abb7d02466a6a921a915b421599 new file mode 100644 index 0000000000..49ed538958 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/e86df09cb21d03c5ad1cb340c46aaae575df4abb7d02466a6a921a915b421599 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400x\\xb400\\xb4\\xb40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/e965fc72c9ec9d083887a1d2c4187ea8b6e0278f8a9a6adac3ccb4173575f8e4 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/e965fc72c9ec9d083887a1d2c4187ea8b6e0278f8a9a6adac3ccb4173575f8e4 new file mode 100644 index 0000000000..0bf9461a8b --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/e965fc72c9ec9d083887a1d2c4187ea8b6e0278f8a9a6adac3ccb4173575f8e4 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"001000000010000000010000000A0000000A0000000A0000000A0000000A000000100000000A0000000A0000000A0000000A000000010000000A0000000A0000000A0000000A0000000A0000000A0000000A0000000A00010000000A000000010000000A0000000A000000010000000A000000010000000A000000100000001000010000000100000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ed9b3104368f52782b72601848530aed8e0589513d26236e02dc024c56be46e1 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ed9b3104368f52782b72601848530aed8e0589513d26236e02dc024c56be46e1 new file mode 100644 index 0000000000..63aac8fd92 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ed9b3104368f52782b72601848530aed8e0589513d26236e02dc024c56be46e1 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000!000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ef87af580bbefc86565d44aabfc707d20a2f009684732d10817b34fa7614a8e0 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ef87af580bbefc86565d44aabfc707d20a2f009684732d10817b34fa7614a8e0 new file mode 100644 index 0000000000..097ca01b51 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/ef87af580bbefc86565d44aabfc707d20a2f009684732d10817b34fa7614a8e0 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/efa399b1e45f3fa417559f49f9735ed344c872efaf07b42be9391958d00ce2f8 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/efa399b1e45f3fa417559f49f9735ed344c872efaf07b42be9391958d00ce2f8 new file mode 100644 index 0000000000..f04ba0834b --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/efa399b1e45f3fa417559f49f9735ed344c872efaf07b42be9391958d00ce2f8 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f05c4d1716307be32abd1364eb895e8dd4fb4cb7f37894e469505ddeb901b544 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f05c4d1716307be32abd1364eb895e8dd4fb4cb7f37894e469505ddeb901b544 new file mode 100644 index 0000000000..7676845f18 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f05c4d1716307be32abd1364eb895e8dd4fb4cb7f37894e469505ddeb901b544 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f0de2cee4a42bca7821d2ac658e5a7b4e743037fa1d4ad1ed96c03cc3fc1451e b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f0de2cee4a42bca7821d2ac658e5a7b4e743037fa1d4ad1ed96c03cc3fc1451e new file mode 100644 index 0000000000..24d7b8fbab --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f0de2cee4a42bca7821d2ac658e5a7b4e743037fa1d4ad1ed96c03cc3fc1451e @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xcd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000X0000000x0000000A000000010000000A0000000A0000000B0000000A0000000A0000000A00000001000A0000000A0000000A000000010000000A0000000A0000000X0000000A0000000A00070000000A0000000A0000000A0000000A0000000A0000000A0000000A000X0000000A0000000A0000000A0000000A0000000A0000000A0000000A00000001000000010000000A000X0000000A0000000A0000000A0000000A0000000A0000000A00070000000A0000000A0000000A0000000A0000000A020001000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f0e5e2a18ed68d2b1baf18298300423cc4554baa0158165d563a2562c2cea33f b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f0e5e2a18ed68d2b1baf18298300423cc4554baa0158165d563a2562c2cea33f new file mode 100644 index 0000000000..83fa4c7de5 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f0e5e2a18ed68d2b1baf18298300423cc4554baa0158165d563a2562c2cea33f @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0001000000010000000100000001000000010000000A0000000A000000010000000A0000000A0000000A0000000A0000000A0000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f1da3e9bc3f5e18d6930229d5a745cba5d2a1ab44a4bf4bc74a8ae02140d6e4b b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f1da3e9bc3f5e18d6930229d5a745cba5d2a1ab44a4bf4bc74a8ae02140d6e4b new file mode 100644 index 0000000000..e409c1ca94 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f1da3e9bc3f5e18d6930229d5a745cba5d2a1ab44a4bf4bc74a8ae02140d6e4b @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"\\x01\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\x00\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a\\a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f379585b669fc50bdc8d8e838d73cecfcce5fa819b027689982fbdc009a09913 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f379585b669fc50bdc8d8e838d73cecfcce5fa819b027689982fbdc009a09913 new file mode 100644 index 0000000000..01c71cb405 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f379585b669fc50bdc8d8e838d73cecfcce5fa819b027689982fbdc009a09913 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f3e293f66e91d9eb40f6cf9c60fda084b2eb31481a9b975df1bf76bf7c70116c b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f3e293f66e91d9eb40f6cf9c60fda084b2eb31481a9b975df1bf76bf7c70116c new file mode 100644 index 0000000000..b511b30994 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f3e293f66e91d9eb40f6cf9c60fda084b2eb31481a9b975df1bf76bf7c70116c @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000\\xff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xbe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xda00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xfe000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f6b97f0e28a6dde97f64dc5665e4728742a885950752a1c82ae8167653cf3537 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f6b97f0e28a6dde97f64dc5665e4728742a885950752a1c82ae8167653cf3537 new file mode 100644 index 0000000000..19353e5103 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f6b97f0e28a6dde97f64dc5665e4728742a885950752a1c82ae8167653cf3537 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f80b9c343c891089fc8a29ed3f9fc738709ee24f60a137dbf8f42de76f318963 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f80b9c343c891089fc8a29ed3f9fc738709ee24f60a137dbf8f42de76f318963 new file mode 100644 index 0000000000..1a4e5a6688 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f80b9c343c891089fc8a29ed3f9fc738709ee24f60a137dbf8f42de76f318963 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\xcd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000x0000000A000000010000000A0000000A0000000A0000000A0000000A0000000A00000001000A0000000A0000000A01000000000A0000000A0000000A0000000A0000000A00010000000A0000000A0000000A0000000A0000000A0000000A0000000A00010000000A0000000A0000000A0000000A0000000A0000000A0000000A00000001000000010000000A00010000000A0000000A0000000A0000000A0000000A0000000A00010000000A0000000A0000000A0000000A0000000A020001000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f82d61948e338dd5eb07c070fe852dcb9c7493e5e9f8b2324f8734f3853f31c3 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f82d61948e338dd5eb07c070fe852dcb9c7493e5e9f8b2324f8734f3853f31c3 new file mode 100644 index 0000000000..af2d65a8bc --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f82d61948e338dd5eb07c070fe852dcb9c7493e5e9f8b2324f8734f3853f31c3 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f888c0d0df78f3ddc26d7c08500a6d55e8156fe03008c50e1e40443a63021754 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f888c0d0df78f3ddc26d7c08500a6d55e8156fe03008c50e1e40443a63021754 new file mode 100644 index 0000000000..5c893b0caf --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/f888c0d0df78f3ddc26d7c08500a6d55e8156fe03008c50e1e40443a63021754 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/fa84d96e88dd025460f533d2ce737196a6b61282f34b860d2feeb00f6ddab471 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/fa84d96e88dd025460f533d2ce737196a6b61282f34b860d2feeb00f6ddab471 new file mode 100644 index 0000000000..e334a12d45 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/fa84d96e88dd025460f533d2ce737196a6b61282f34b860d2feeb00f6ddab471 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/fbce49af78659e5ad8531a14e37643c390111e00de90871ae34bb0f1b66c6144 b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/fbce49af78659e5ad8531a14e37643c390111e00de90871ae34bb0f1b66c6144 new file mode 100644 index 0000000000..09573e6464 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/fbce49af78659e5ad8531a14e37643c390111e00de90871ae34bb0f1b66c6144 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/fe85970e074824301421b145c2f4661914f25b3d08f87f73288a03968bbad09e b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/fe85970e074824301421b145c2f4661914f25b3d08f87f73288a03968bbad09e new file mode 100644 index 0000000000..b1a21f2c03 --- /dev/null +++ b/internal/backend/ioutils/testdata/fuzz/FuzzIntcomp32/fe85970e074824301421b145c2f4661914f25b3d08f87f73288a03968bbad09e @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("go test fuzz v1\n[]byte(\"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n") \ No newline at end of file diff --git a/internal/generator/backend/main.go b/internal/generator/backend/main.go index dcc292f0e7..999ce79dde 100644 --- a/internal/generator/backend/main.go +++ b/internal/generator/backend/main.go @@ -119,6 +119,7 @@ func main() { // constraint systems entries := []bavard.Entry{ {File: filepath.Join(csDir, "system.go"), Templates: []string{"system.go.tmpl", importCurve}}, + {File: filepath.Join(csDir, "marshal.go"), Templates: []string{"marshal.go.tmpl", importCurve}}, {File: filepath.Join(csDir, "coeff.go"), Templates: []string{"coeff.go.tmpl", importCurve}}, {File: filepath.Join(csDir, "solver.go"), Templates: []string{"solver.go.tmpl", importCurve}}, } diff --git a/internal/generator/backend/template/representations/coeff.go.tmpl b/internal/generator/backend/template/representations/coeff.go.tmpl index 3ba357d1e6..02e4eeab78 100644 --- a/internal/generator/backend/template/representations/coeff.go.tmpl +++ b/internal/generator/backend/template/representations/coeff.go.tmpl @@ -2,6 +2,8 @@ import ( "github.com/consensys/gnark/constraint" "github.com/consensys/gnark/internal/utils" "math/big" + "encoding/binary" + "errors" {{ template "import_fr" . }} ) @@ -27,6 +29,42 @@ func newCoeffTable(capacity int) CoeffTable { } +func (ct *CoeffTable) toBytes() []byte { + buf := make([]byte, 0, 8 + len(ct.Coefficients)*fr.Bytes) + ctLen := uint64(len(ct.Coefficients)) + + buf = binary.LittleEndian.AppendUint64(buf, ctLen) + for _, c := range ct.Coefficients { + for _, w := range c { + buf = binary.LittleEndian.AppendUint64(buf, w) + } + } + + return buf +} + +func (ct *CoeffTable) fromBytes(buf []byte) error { + if len(buf) < 8 { + return errors.New("invalid buffer size") + } + ctLen := binary.LittleEndian.Uint64(buf[:8]) + buf = buf[8:] + + if uint64(len(buf)) < ctLen*fr.Bytes { + return errors.New("invalid buffer size") + } + ct.Coefficients = make([]fr.Element, ctLen) + for i := uint64(0); i < ctLen; i++ { + var c fr.Element + k := int(i) * fr.Bytes + for j := 0; j < fr.Limbs; j++ { + c[j] = binary.LittleEndian.Uint64(buf[k + j * 8 : k + (j+1)*8]) + } + ct.Coefficients[i] = c + } + return nil +} + func (ct *CoeffTable) AddCoeff(coeff constraint.Element) uint32 { c := (*fr.Element)(coeff[:]) var cID uint32 diff --git a/internal/generator/backend/template/representations/marshal.go.tmpl b/internal/generator/backend/template/representations/marshal.go.tmpl new file mode 100644 index 0000000000..95456fc9cd --- /dev/null +++ b/internal/generator/backend/template/representations/marshal.go.tmpl @@ -0,0 +1,83 @@ +import ( + "io" + "encoding/binary" + "fmt" + + "github.com/blang/semver/v4" +) + +// WriteTo encodes R1CS into provided io.Writer using cbor +func (cs *system) WriteTo(w io.Writer) (int64, error) { + b, err := cs.System.ToBytes() + if err != nil { + return 0, err + } + + c := cs.CoeffTable.toBytes() + + totalLen := uint64(len(b) + len(c)) + gnarkVersion := semver.MustParse(cs.GnarkVersion) + // write totalLen, gnarkVersion.Major, gnarkVersion.Minor, gnarkVersion.Patch using + // binary.LittleEndian + if err := binary.Write(w, binary.LittleEndian, totalLen); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Major); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Minor); err != nil { + return 0, err + } + if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Patch); err != nil { + return 0, err + } + + // write the system + n, err := w.Write(b) + if err != nil { + return int64(n), err + } + + // write the coeff table + m, err := w.Write(c) + return int64(n+m) + 4*8, err +} + +// ReadFrom attempts to decode R1CS from io.Reader using cbor +func (cs *system) ReadFrom(r io.Reader) (int64, error) { + var totalLen uint64 + if err := binary.Read(r, binary.LittleEndian, &totalLen); err != nil { + return 0, err + } + + var major, minor, patch uint64 + if err := binary.Read(r, binary.LittleEndian, &major); err != nil { + return 0, err + } + if err := binary.Read(r, binary.LittleEndian, &minor); err != nil { + return 0, err + } + if err := binary.Read(r, binary.LittleEndian, &patch); err != nil { + return 0, err + } + // TODO @gbotrel validate version, duplicate logic with core.go CheckSerializationHeader + if major != 0 || minor < 10 { + return 0, fmt.Errorf("unsupported gnark version %d.%d.%d", major, minor, patch) + } + + data := make([]byte, totalLen) + if _, err := io.ReadFull(r, data); err != nil { + return 0, err + } + n, err := cs.System.FromBytes(data) + if err != nil { + return 0, err + } + data = data[n:] + + if err := cs.CoeffTable.fromBytes(data); err != nil { + return 0, err + } + + return int64(totalLen) + 4*8, nil +} diff --git a/internal/generator/backend/template/representations/solver.go.tmpl b/internal/generator/backend/template/representations/solver.go.tmpl index d993ccdc44..96ef4d3a2c 100644 --- a/internal/generator/backend/template/representations/solver.go.tmpl +++ b/internal/generator/backend/template/representations/solver.go.tmpl @@ -435,7 +435,7 @@ func (solver *solver) run() error { // then we check that the constraint is valid // if a[i] * b[i] != c[i]; it means the constraint is not satisfied var wg sync.WaitGroup - chTasks := make(chan []int, solver.nbTasks) + chTasks := make(chan []uint32, solver.nbTasks) chError := make(chan error, solver.nbTasks) // start a worker pool diff --git a/internal/generator/backend/template/representations/system.go.tmpl b/internal/generator/backend/template/representations/system.go.tmpl index cb3715fac1..1c6276020e 100644 --- a/internal/generator/backend/template/representations/system.go.tmpl +++ b/internal/generator/backend/template/representations/system.go.tmpl @@ -1,14 +1,11 @@ import ( "io" "time" - "github.com/fxamacker/cbor/v2" - - "github.com/consensys/gnark/internal/backend/ioutils" + csolver "github.com/consensys/gnark/constraint/solver" "github.com/consensys/gnark/constraint" "github.com/consensys/gnark/logger" "github.com/consensys/gnark/backend/witness" - "reflect" "github.com/consensys/gnark-crypto/ecc" @@ -134,56 +131,6 @@ func (cs *system) CurveID() ecc.ID { return ecc.{{.CurveID}} } -// WriteTo encodes R1CS into provided io.Writer using cbor -func (cs *system) WriteTo(w io.Writer) (int64, error) { - _w := ioutils.WriterCounter{W: w} // wraps writer to count the bytes written - ts := getTagSet() - enc, err := cbor.CoreDetEncOptions().EncModeWithTags(ts) - if err != nil { - return 0, err - } - encoder := enc.NewEncoder(&_w) - - // encode our object - err = encoder.Encode(cs) - return _w.N, err -} - -// ReadFrom attempts to decode R1CS from io.Reader using cbor -func (cs *system) ReadFrom(r io.Reader) (int64, error) { - ts := getTagSet() - dm, err := cbor.DecOptions{ - MaxArrayElements: 2147483647, - MaxMapPairs: 2147483647, - }.DecModeWithTags(ts) - - if err != nil { - return 0, err - } - decoder := dm.NewDecoder(r) - - // initialize coeff table - cs.CoeffTable = newCoeffTable(0) - - if err := decoder.Decode(&cs); err != nil { - return int64(decoder.NumBytesRead()), err - } - - - if err := cs.CheckSerializationHeader(); err != nil { - return int64(decoder.NumBytesRead()), err - } - - switch v := cs.CommitmentInfo.(type) { - case *constraint.Groth16Commitments: - cs.CommitmentInfo = *v - case *constraint.PlonkCommitments: - cs.CommitmentInfo = *v - } - - return int64(decoder.NumBytesRead()), nil -} - func (cs *system) GetCoefficient(i int) (r constraint.Element) { copy(r[:], cs.Coefficients[i][:]) return @@ -347,36 +294,6 @@ func (t *SparseR1CSSolution) ReadFrom(r io.Reader) (int64, error) { } -func getTagSet() cbor.TagSet { - // temporary for refactor - ts := cbor.NewTagSet() - // https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml - // 65536-15309735 Unassigned - tagNum := uint64(5309735) - addType := func(t reflect.Type) { - if err := ts.Add( - cbor.TagOptions{EncTag: cbor.EncTagRequired, DecTag: cbor.DecTagRequired}, - t, - tagNum, - ); err != nil { - panic(err) - } - tagNum++ - } - - addType(reflect.TypeOf(constraint.BlueprintGenericHint{})) - addType(reflect.TypeOf(constraint.BlueprintGenericR1C{})) - addType(reflect.TypeOf(constraint.BlueprintGenericSparseR1C{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CAdd{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CMul{})) - addType(reflect.TypeOf(constraint.BlueprintSparseR1CBool{})) - addType(reflect.TypeOf(constraint.BlueprintLookupHint{})) - addType(reflect.TypeOf(constraint.Groth16Commitments{})) - addType(reflect.TypeOf(constraint.PlonkCommitments{})) - - return ts -} - func (s *system) AddGkr(gkr constraint.GkrInfo) error { return s.System.AddGkr(gkr) } \ No newline at end of file diff --git a/internal/generator/backend/template/zkpschemes/groth16/groth16.marshal.go.tmpl b/internal/generator/backend/template/zkpschemes/groth16/groth16.marshal.go.tmpl index bb22840950..4199f6cf47 100644 --- a/internal/generator/backend/template/zkpschemes/groth16/groth16.marshal.go.tmpl +++ b/internal/generator/backend/template/zkpschemes/groth16/groth16.marshal.go.tmpl @@ -2,6 +2,7 @@ import ( {{ template "import_curve" . }} {{ template "import_pedersen" . }} "github.com/consensys/gnark/internal/utils" + "github.com/consensys/gnark-crypto/utils/unsafe" "io" ) @@ -361,3 +362,164 @@ func (pk *ProvingKey) readFrom(r io.Reader, decOptions ...func(*curve.Decoder)) } +// WriteDump behaves like WriteRawTo, excepts, the slices of points are "dumped" using gnark-crypto/utils/unsafe +// Output is compatible with ReadDump, with the caveat that, not only the points are not checked for +// correctness, but the raw bytes are platform dependent (endianness, etc.) +func (pk *ProvingKey) WriteDump(w io.Writer) error { + // it behaves like WriteRawTo, excepts, the slices of points are "dumped" using gnark-crypto/utils/unsafe + + // start by writing an unsafe marker to fail early. + if err := unsafe.WriteMarker(w); err != nil { + return err + } + + if _, err := pk.Domain.WriteTo(w); err != nil { + return err + } + + enc := curve.NewEncoder(w, curve.RawEncoding()) + nbWires := uint64(len(pk.InfinityA)) + + toEncode := []interface{}{ + &pk.G1.Alpha, + &pk.G1.Beta, + &pk.G1.Delta, + // pk.G1.A, + // pk.G1.B, + // pk.G1.Z, + // pk.G1.K, + &pk.G2.Beta, + &pk.G2.Delta, + // pk.G2.B, + nbWires, + pk.NbInfinityA, + pk.NbInfinityB, + pk.InfinityA, + pk.InfinityB, + uint32(len(pk.CommitmentKeys)), + } + + for _, v := range toEncode { + if err := enc.Encode(v); err != nil { + return err + } + } + + // dump slices of points + if err := unsafe.WriteSlice(w, pk.G1.A); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.B); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.Z); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G1.K); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.G2.B); err != nil { + return err + } + + for i := range pk.CommitmentKeys { + if err := unsafe.WriteSlice(w, pk.CommitmentKeys[i].Basis); err != nil { + return err + } + if err := unsafe.WriteSlice(w, pk.CommitmentKeys[i].BasisExpSigma); err != nil { + return err + } + } + + return nil +} + +// ReadDump reads a ProvingKey from a dump written by WriteDump. +// This is platform dependent and very unsafe (no checks, no endianness translation, etc.) +func (pk *ProvingKey) ReadDump(r io.Reader) error { + // read the marker to fail early in case of malformed input + if err := unsafe.ReadMarker(r); err != nil { + return err + } + + if _, err := pk.Domain.ReadFrom(r); err != nil { + return err + } + + dec := curve.NewDecoder(r, curve.NoSubgroupChecks()) + + var nbWires uint64 + var nbCommitments uint32 + + toDecode := []interface{}{ + &pk.G1.Alpha, + &pk.G1.Beta, + &pk.G1.Delta, + // &pk.G1.A, + // &pk.G1.B, + // &pk.G1.Z, + // &pk.G1.K, + &pk.G2.Beta, + &pk.G2.Delta, + // &pk.G2.B, + &nbWires, + &pk.NbInfinityA, + &pk.NbInfinityB, + } + + for _, v := range toDecode { + if err := dec.Decode(v); err != nil { + return err + } + } + pk.InfinityA = make([]bool, nbWires) + pk.InfinityB = make([]bool, nbWires) + + if err := dec.Decode(&pk.InfinityA); err != nil { + return err + } + if err := dec.Decode(&pk.InfinityB); err != nil { + return err + } + if err := dec.Decode(&nbCommitments); err != nil { + return err + } + + // read slices of points + var err error + pk.G1.A, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.B, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.Z, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G1.K, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.G2.B, _, err = unsafe.ReadSlice[[]curve.G2Affine](r) + if err != nil { + return err + } + + pk.CommitmentKeys = make([]pedersen.ProvingKey, nbCommitments) + for i := range pk.CommitmentKeys { + pk.CommitmentKeys[i].Basis, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + pk.CommitmentKeys[i].BasisExpSigma, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) + if err != nil { + return err + } + } + + return nil + +} \ No newline at end of file diff --git a/internal/generator/backend/template/zkpschemes/groth16/tests/groth16.marshal.go.tmpl b/internal/generator/backend/template/zkpschemes/groth16/tests/groth16.marshal.go.tmpl index 5fb72b55c4..a5bc1d73ea 100644 --- a/internal/generator/backend/template/zkpschemes/groth16/tests/groth16.marshal.go.tmpl +++ b/internal/generator/backend/template/zkpschemes/groth16/tests/groth16.marshal.go.tmpl @@ -173,9 +173,16 @@ func TestProvingKeySerialization(t *testing.T) { require.NoError(t, err) } - err := io.RoundTripCheck(&pk, func() any {return new(ProvingKey)}) - return err == nil + if err := io.RoundTripCheck(&pk, func() any {return new(ProvingKey)}); err != nil { + t.Log(err) + return false + } + if err := io.DumpRoundTripCheck(&pk, func() any {return new(ProvingKey)}); err != nil { + t.Log(err) + return false + } + return true }, GenG1(), GenG2(), diff --git a/internal/regression_tests/issue1045/testdata/issue1045.r1cs b/internal/regression_tests/issue1045/testdata/issue1045.r1cs index e45b2ec162..e9d2ca03b6 100644 Binary files a/internal/regression_tests/issue1045/testdata/issue1045.r1cs and b/internal/regression_tests/issue1045/testdata/issue1045.r1cs differ diff --git a/internal/regression_tests/issue1045/testdata/issue1045.scs b/internal/regression_tests/issue1045/testdata/issue1045.scs index 42580b419f..f244076769 100644 Binary files a/internal/regression_tests/issue1045/testdata/issue1045.scs and b/internal/regression_tests/issue1045/testdata/issue1045.scs differ diff --git a/internal/stats/latest.stats b/internal/stats/latest.stats index d961ee475d..ca6fe17b4f 100644 Binary files a/internal/stats/latest.stats and b/internal/stats/latest.stats differ diff --git a/io/io.go b/io/io.go index 268e0f84ba..3d6847f35e 100644 --- a/io/io.go +++ b/io/io.go @@ -39,3 +39,11 @@ type WriterRawTo interface { type UnsafeReaderFrom interface { UnsafeReadFrom(r io.Reader) (int64, error) } + +// BinaryDumper is the interface that wraps the WriteDump and ReadDump methods. +// WriteDump writes the object to w, ReadDump reads the object from r. +// The object is serialized in binary format, in a very fast, very unsafe way. +type BinaryDumper interface { + WriteDump(w io.Writer) error + ReadDump(r io.Reader) error +} diff --git a/io/roundtrip.go b/io/roundtrip.go index 92bb038cfc..ecac78afaf 100644 --- a/io/roundtrip.go +++ b/io/roundtrip.go @@ -73,3 +73,20 @@ func RoundTripCheck(from any, to func() any) error { return nil } + +func DumpRoundTripCheck(from any, to func() any) error { + var buf bytes.Buffer + + if err := from.(BinaryDumper).WriteDump(&buf); err != nil { + return err + } + + r := to().(BinaryDumper) + if err := r.ReadDump(bytes.NewReader(buf.Bytes())); err != nil { + return err + } + if !reflect.DeepEqual(from, r) { + return errors.New("reconstructed object don't match original (ReadDump)") + } + return nil +} diff --git a/profile/profile_worker.go b/profile/profile_worker.go index 97817fe898..62b4a453fb 100644 --- a/profile/profile_worker.go +++ b/profile/profile_worker.go @@ -71,6 +71,8 @@ func collectSample(pc []uintptr) { if strings.HasSuffix(frame.Function, ".func1") { // TODO @gbotrel filter anonymous func better + // + // ivokub: relevant comment - if we have many anonymous functions in package, then the name of the anonymous function has different suffices. continue } diff --git a/std/algebra/emulated/fields_bls12381/e12.go b/std/algebra/emulated/fields_bls12381/e12.go index d452c4f0cb..84728728c2 100644 --- a/std/algebra/emulated/fields_bls12381/e12.go +++ b/std/algebra/emulated/fields_bls12381/e12.go @@ -49,8 +49,8 @@ func (e Ext12) Mul(x, y *E12) *E12 { a = e.Ext6.Mul(a, b) b = e.Ext6.Mul(&x.C0, &y.C0) c := e.Ext6.Mul(&x.C1, &y.C1) - z1 := e.Ext6.Sub(a, b) - z1 = e.Ext6.Sub(z1, c) + d := e.Ext6.Add(c, b) + z1 := e.Ext6.Sub(a, d) z0 := e.Ext6.MulByNonResidue(c) z0 = e.Ext6.Add(z0, b) return &E12{ @@ -101,8 +101,7 @@ func (e Ext12) IsZero(z *E12) frontend.Variable { func (e Ext12) Square(x *E12) *E12 { c0 := e.Ext6.Sub(&x.C0, &x.C1) c3 := e.Ext6.MulByNonResidue(&x.C1) - c3 = e.Ext6.Neg(c3) - c3 = e.Ext6.Add(&x.C0, c3) + c3 = e.Ext6.Sub(&x.C0, c3) c2 := e.Ext6.Mul(&x.C0, &x.C1) c0 = e.Ext6.Mul(c0, c3) c0 = e.Ext6.Add(c0, c2) diff --git a/std/algebra/emulated/fields_bls12381/e12_pairing.go b/std/algebra/emulated/fields_bls12381/e12_pairing.go index 69b0e9e37b..4cd3dc5613 100644 --- a/std/algebra/emulated/fields_bls12381/e12_pairing.go +++ b/std/algebra/emulated/fields_bls12381/e12_pairing.go @@ -93,8 +93,8 @@ func (e *Ext12) MulBy014(z *E12, c0, c1 *E2) *E12 { zC1 := e.Ext6.Add(&z.C1, &z.C0) zC1 = e.Ext6.MulBy01(zC1, c0, d) - zC1 = e.Ext6.Sub(zC1, a) - zC1 = e.Ext6.Sub(zC1, &b) + tmp := e.Ext6.Add(&b, a) + zC1 = e.Ext6.Sub(zC1, tmp) zC0 := e.Ext6.MulByNonResidue(&b) zC0 = e.Ext6.Add(zC0, a) @@ -124,8 +124,8 @@ func (e Ext12) Mul014By014(d0, d1, c0, c1 *E2) [5]*E2 { tmp := e.Ext2.Add(c0, c1) x01 := e.Ext2.Add(d0, d1) x01 = e.Ext2.Mul(x01, tmp) - x01 = e.Ext2.Sub(x01, x0) - x01 = e.Ext2.Sub(x01, x1) + tmp = e.Ext2.Add(x1, x0) + x01 = e.Ext2.Sub(x01, tmp) x14 := e.Ext2.Add(c1, d1) zC0B0 := e.Ext2.NonResidue() @@ -148,8 +148,8 @@ func (e *Ext12) MulBy01245(z *E12, x [5]*E2) *E12 { a = e.Ext6.Mul(a, b) b = e.Ext6.Mul(&z.C0, c0) c := e.Ext6.MulBy12(&z.C1, x[3], x[4]) - z1 := e.Ext6.Sub(a, b) - z1 = e.Ext6.Sub(z1, c) + d := e.Ext6.Add(c, b) + z1 := e.Ext6.Sub(a, d) z0 := e.Ext6.MulByNonResidue(c) z0 = e.Ext6.Add(z0, b) return &E12{ diff --git a/std/algebra/emulated/fields_bls12381/e2.go b/std/algebra/emulated/fields_bls12381/e2.go index e36178b215..30b5ebda49 100644 --- a/std/algebra/emulated/fields_bls12381/e2.go +++ b/std/algebra/emulated/fields_bls12381/e2.go @@ -59,8 +59,8 @@ func NewExt2(api frontend.API) *Ext2 { } func (e Ext2) MulByElement(x *E2, y *baseEl) *E2 { - z0 := e.fp.MulMod(&x.A0, y) - z1 := e.fp.MulMod(&x.A1, y) + z0 := e.fp.Mul(&x.A0, y) + z1 := e.fp.Mul(&x.A1, y) return &E2{ A0: *z0, A1: *z1, @@ -110,9 +110,9 @@ func (e Ext2) MulByNonResidue1Power1(x *E2) *E2 { // MulByNonResidue1Power2 returns x*(1+u)^(2*(p^1-1)/6) func (e Ext2) MulByNonResidue1Power2(x *E2) *E2 { element := emulated.ValueOf[emulated.BLS12381Fp]("4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436") - a := e.fp.MulMod(&x.A1, &element) + a := e.fp.Mul(&x.A1, &element) a = e.fp.Neg(a) - b := e.fp.MulMod(&x.A0, &element) + b := e.fp.Mul(&x.A0, &element) return &E2{ A0: *a, A1: *b, @@ -128,8 +128,8 @@ func (e Ext2) MulByNonResidue1Power3(x *E2) *E2 { func (e Ext2) MulByNonResidue1Power4(x *E2) *E2 { element := emulated.ValueOf[emulated.BLS12381Fp]("4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939437") return &E2{ - A0: *e.fp.MulMod(&x.A0, &element), - A1: *e.fp.MulMod(&x.A1, &element), + A0: *e.fp.Mul(&x.A0, &element), + A1: *e.fp.Mul(&x.A1, &element), } } @@ -142,8 +142,8 @@ func (e Ext2) MulByNonResidue1Power5(x *E2) *E2 { func (e Ext2) MulByNonResidue2Power1(x *E2) *E2 { element := emulated.ValueOf[emulated.BLS12381Fp]("793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620351") return &E2{ - A0: *e.fp.MulMod(&x.A0, &element), - A1: *e.fp.MulMod(&x.A1, &element), + A0: *e.fp.Mul(&x.A0, &element), + A1: *e.fp.Mul(&x.A1, &element), } } @@ -151,8 +151,8 @@ func (e Ext2) MulByNonResidue2Power1(x *E2) *E2 { func (e Ext2) MulByNonResidue2Power2(x *E2) *E2 { element := emulated.ValueOf[emulated.BLS12381Fp]("793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350") return &E2{ - A0: *e.fp.MulMod(&x.A0, &element), - A1: *e.fp.MulMod(&x.A1, &element), + A0: *e.fp.Mul(&x.A0, &element), + A1: *e.fp.Mul(&x.A1, &element), } } @@ -160,8 +160,8 @@ func (e Ext2) MulByNonResidue2Power2(x *E2) *E2 { func (e Ext2) MulByNonResidue2Power3(x *E2) *E2 { element := emulated.ValueOf[emulated.BLS12381Fp]("4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559786") return &E2{ - A0: *e.fp.MulMod(&x.A0, &element), - A1: *e.fp.MulMod(&x.A1, &element), + A0: *e.fp.Mul(&x.A0, &element), + A1: *e.fp.Mul(&x.A1, &element), } } @@ -169,8 +169,8 @@ func (e Ext2) MulByNonResidue2Power3(x *E2) *E2 { func (e Ext2) MulByNonResidue2Power4(x *E2) *E2 { element := emulated.ValueOf[emulated.BLS12381Fp]("4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436") return &E2{ - A0: *e.fp.MulMod(&x.A0, &element), - A1: *e.fp.MulMod(&x.A1, &element), + A0: *e.fp.Mul(&x.A0, &element), + A1: *e.fp.Mul(&x.A1, &element), } } @@ -178,23 +178,26 @@ func (e Ext2) MulByNonResidue2Power4(x *E2) *E2 { func (e Ext2) MulByNonResidue2Power5(x *E2) *E2 { element := emulated.ValueOf[emulated.BLS12381Fp]("4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939437") return &E2{ - A0: *e.fp.MulMod(&x.A0, &element), - A1: *e.fp.MulMod(&x.A1, &element), + A0: *e.fp.Mul(&x.A0, &element), + A1: *e.fp.Mul(&x.A1, &element), } } func (e Ext2) Mul(x, y *E2) *E2 { - a := e.fp.Add(&x.A0, &x.A1) - b := e.fp.Add(&y.A0, &y.A1) - a = e.fp.MulMod(a, b) - b = e.fp.MulMod(&x.A0, &y.A0) - c := e.fp.MulMod(&x.A1, &y.A1) - z1 := e.fp.Sub(a, b) - z1 = e.fp.Sub(z1, c) - z0 := e.fp.Sub(b, c) + + v0 := e.fp.Mul(&x.A0, &y.A0) + v1 := e.fp.Mul(&x.A1, &y.A1) + + b0 := e.fp.Sub(v0, v1) + b1 := e.fp.Add(&x.A0, &x.A1) + tmp := e.fp.Add(&y.A0, &y.A1) + b1 = e.fp.Mul(b1, tmp) + tmp = e.fp.Add(v0, v1) + b1 = e.fp.Sub(b1, tmp) + return &E2{ - A0: *z0, - A1: *z1, + A0: *b0, + A1: *b1, } } @@ -242,6 +245,7 @@ func (e Ext2) Zero() *E2 { A1: *z1, } } + func (e Ext2) IsZero(z *E2) frontend.Variable { a0 := e.fp.IsZero(&z.A0) a1 := e.fp.IsZero(&z.A1) @@ -260,8 +264,8 @@ func (e Ext2) NonResidue() *E2 { func (e Ext2) Square(x *E2) *E2 { a := e.fp.Add(&x.A0, &x.A1) b := e.fp.Sub(&x.A0, &x.A1) - a = e.fp.MulMod(a, b) - b = e.fp.MulMod(&x.A0, &x.A1) + a = e.fp.Mul(a, b) + b = e.fp.Mul(&x.A0, &x.A1) b = e.fp.MulConst(b, big.NewInt(2)) return &E2{ A0: *a, diff --git a/std/algebra/emulated/fields_bls12381/e6.go b/std/algebra/emulated/fields_bls12381/e6.go index 406c317c0a..22a3596324 100644 --- a/std/algebra/emulated/fields_bls12381/e6.go +++ b/std/algebra/emulated/fields_bls12381/e6.go @@ -1,8 +1,11 @@ package fields_bls12381 import ( + "math/big" + bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381" "github.com/consensys/gnark/frontend" + "github.com/consensys/gnark/internal/frontendtype" ) type E6 struct { @@ -79,29 +82,138 @@ func (e Ext6) Sub(x, y *E6) *E6 { } } +// Mul multiplies two E6 elmts func (e Ext6) Mul(x, y *E6) *E6 { + if ft, ok := e.api.(frontendtype.FrontendTyper); ok { + switch ft.FrontendType() { + case frontendtype.R1CS: + return e.mulToom3OverKaratsuba(x, y) + case frontendtype.SCS: + return e.mulKaratsubaOverKaratsuba(x, y) + } + } + return e.mulKaratsubaOverKaratsuba(x, y) +} + +func (e Ext6) mulToom3OverKaratsuba(x, y *E6) *E6 { + // Toom-Cook-3x over Karatsuba: + // We start by computing five interpolation points – these are evaluations of + // the product x(u)y(u) with u ∈ {0, ±1, 2, ∞}: + // + // v0 = x(0)y(0) = x.A0 * y.A0 + // v1 = x(1)y(1) = (x.A0 + x.A1 + x.A2)(y.A0 + y.A1 + y.A2) + // v2 = x(−1)y(−1) = (x.A0 − x.A1 + x.A2)(y.A0 − y.A1 + y.A2) + // v3 = x(2)y(2) = (x.A0 + 2x.A1 + 4x.A2)(y.A0 + 2y.A1 + 4y.A2) + // v4 = x(∞)y(∞) = x.A2 * y.A2 + + v0 := e.Ext2.Mul(&x.B0, &y.B0) + + t1 := e.Ext2.Add(&x.B0, &x.B2) + t2 := e.Ext2.Add(&y.B0, &y.B2) + t3 := e.Ext2.Add(t2, &y.B1) + v1 := e.Ext2.Add(t1, &x.B1) + v1 = e.Ext2.Mul(v1, t3) + + t3 = e.Ext2.Sub(t2, &y.B1) + v2 := e.Ext2.Sub(t1, &x.B1) + v2 = e.Ext2.Mul(v2, t3) + + t1 = e.Ext2.MulByConstElement(&x.B1, big.NewInt(2)) + t2 = e.Ext2.MulByConstElement(&x.B2, big.NewInt(4)) + v3 := e.Ext2.Add(t1, t2) + v3 = e.Ext2.Add(v3, &x.B0) + t1 = e.Ext2.MulByConstElement(&y.B1, big.NewInt(2)) + t2 = e.Ext2.MulByConstElement(&y.B2, big.NewInt(4)) + t3 = e.Ext2.Add(t1, t2) + t3 = e.Ext2.Add(t3, &y.B0) + v3 = e.Ext2.Mul(v3, t3) + + v4 := e.Ext2.Mul(&x.B2, &y.B2) + + // Then the interpolation is performed as: + // + // a0 = v0 + β((1/2)v0 − (1/2)v1 − (1/6)v2 + (1/6)v3 − 2v4) + // a1 = −(1/2)v0 + v1 − (1/3)v2 − (1/6)v3 + 2v4 + βv4 + // a2 = −v0 + (1/2)v1 + (1/2)v2 − v4 + // + // where β is the cubic non-residue. + // + // In-circuit, we compute 6*x*y as + // c0 = 6v0 + β(3v0 − 3v1 − v2 + v3 − 12v4) + // a1 = -(3v0 + 2v2 + v3) + 6(v1 + 2v4 + βv4) + // a2 = 3(v1 + v2 - 2(v0 + v4)) + // + // and then divide a0, a1 and a2 by 6 using a hint. + + a0 := e.Ext2.MulByConstElement(v0, big.NewInt(6)) + t1 = e.Ext2.Sub(v0, v1) + t1 = e.Ext2.MulByConstElement(t1, big.NewInt(3)) + t1 = e.Ext2.Sub(t1, v2) + t1 = e.Ext2.Add(t1, v3) + t2 = e.Ext2.MulByConstElement(v4, big.NewInt(12)) + t1 = e.Ext2.Sub(t1, t2) + t1 = e.Ext2.MulByNonResidue(t1) + a0 = e.Ext2.Add(a0, t1) + + a1 := e.Ext2.MulByConstElement(v0, big.NewInt(3)) + t1 = e.Ext2.MulByConstElement(v2, big.NewInt(2)) + a1 = e.Ext2.Add(a1, t1) + a1 = e.Ext2.Add(a1, v3) + t1 = e.Ext2.MulByConstElement(v4, big.NewInt(2)) + t1 = e.Ext2.Add(t1, v1) + t2 = e.Ext2.MulByNonResidue(v4) + t1 = e.Ext2.Add(t1, t2) + t1 = e.Ext2.MulByConstElement(t1, big.NewInt(6)) + a1 = e.Ext2.Sub(t1, a1) + + a2 := e.Ext2.Add(v1, v2) + a2 = e.Ext2.MulByConstElement(a2, big.NewInt(3)) + t1 = e.Ext2.Add(v0, v4) + t1 = e.Ext2.MulByConstElement(t1, big.NewInt(6)) + a2 = e.Ext2.Sub(a2, t1) + + res := e.divE6By6([6]*baseEl{&a0.A0, &a0.A1, &a1.A0, &a1.A1, &a2.A0, &a2.A1}) + return &E6{ + B0: E2{ + A0: *res[0], + A1: *res[1], + }, + B1: E2{ + A0: *res[2], + A1: *res[3], + }, + B2: E2{ + A0: *res[4], + A1: *res[5], + }, + } +} + +func (e Ext6) mulKaratsubaOverKaratsuba(x, y *E6) *E6 { + // Karatsuba over Karatsuba: + // Algorithm 13 from https://eprint.iacr.org/2010/354.pdf t0 := e.Ext2.Mul(&x.B0, &y.B0) t1 := e.Ext2.Mul(&x.B1, &y.B1) t2 := e.Ext2.Mul(&x.B2, &y.B2) c0 := e.Ext2.Add(&x.B1, &x.B2) tmp := e.Ext2.Add(&y.B1, &y.B2) c0 = e.Ext2.Mul(c0, tmp) - c0 = e.Ext2.Sub(c0, t1) - c0 = e.Ext2.Sub(c0, t2) + tmp = e.Ext2.Add(t2, t1) + c0 = e.Ext2.Sub(c0, tmp) c0 = e.Ext2.MulByNonResidue(c0) c0 = e.Ext2.Add(c0, t0) c1 := e.Ext2.Add(&x.B0, &x.B1) tmp = e.Ext2.Add(&y.B0, &y.B1) c1 = e.Ext2.Mul(c1, tmp) - c1 = e.Ext2.Sub(c1, t0) - c1 = e.Ext2.Sub(c1, t1) + tmp = e.Ext2.Add(t0, t1) + c1 = e.Ext2.Sub(c1, tmp) tmp = e.Ext2.MulByNonResidue(t2) c1 = e.Ext2.Add(c1, tmp) tmp = e.Ext2.Add(&x.B0, &x.B2) c2 := e.Ext2.Add(&y.B0, &y.B2) c2 = e.Ext2.Mul(c2, tmp) - c2 = e.Ext2.Sub(c2, t0) - c2 = e.Ext2.Sub(c2, t2) + tmp = e.Ext2.Add(t0, t2) + c2 = e.Ext2.Sub(c2, tmp) c2 = e.Ext2.Add(c2, t1) return &E6{ B0: *c0, @@ -166,8 +278,8 @@ func (e Ext6) MulBy12(x *E6, b1, b2 *E2) *E6 { c0 := e.Ext2.Add(&x.B1, &x.B2) tmp := e.Ext2.Add(b1, b2) c0 = e.Ext2.Mul(c0, tmp) - c0 = e.Ext2.Sub(c0, t1) - c0 = e.Ext2.Sub(c0, t2) + tmp = e.Ext2.Add(t1, t2) + c0 = e.Ext2.Sub(c0, tmp) c0 = e.Ext2.MulByNonResidue(c0) c1 := e.Ext2.Add(&x.B0, &x.B1) c1 = e.Ext2.Mul(c1, b1) @@ -207,7 +319,13 @@ func (e Ext6) MulBy0(z *E6, c0 *E2) *E6 { } } -// MulBy01 multiplication by sparse element (c0,c1,0) +// MulBy01 multiplies z by an E6 sparse element of the form +// +// E6{ +// B0: c0, +// B1: c1, +// B2: 0, +// } func (e Ext6) MulBy01(z *E6, c0, c1 *E2) *E6 { a := e.Ext2.Mul(&z.B0, c0) b := e.Ext2.Mul(&z.B1, c1) @@ -224,8 +342,8 @@ func (e Ext6) MulBy01(z *E6, c0, c1 *E2) *E6 { t1 := e.Ext2.Add(c0, c1) tmp = e.Ext2.Add(&z.B0, &z.B1) t1 = e.Ext2.Mul(t1, tmp) - t1 = e.Ext2.Sub(t1, a) - t1 = e.Ext2.Sub(t1, b) + tmp = e.Ext2.Add(a, b) + t1 = e.Ext2.Sub(t1, tmp) return &E6{ B0: *t0, B1: *t1, @@ -301,6 +419,37 @@ func (e Ext6) DivUnchecked(x, y *E6) *E6 { return &div } +func (e Ext6) divE6By6(x [6]*baseEl) [6]*baseEl { + res, err := e.fp.NewHint(divE6By6Hint, 6, x[0], x[1], x[2], x[3], x[4], x[5]) + if err != nil { + // err is non-nil only for invalid number of inputs + panic(err) + } + + y0 := *res[0] + y1 := *res[1] + y2 := *res[2] + y3 := *res[3] + y4 := *res[4] + y5 := *res[5] + + // xi == 6 * yi + x0 := e.fp.MulConst(&y0, big.NewInt(6)) + x1 := e.fp.MulConst(&y1, big.NewInt(6)) + x2 := e.fp.MulConst(&y2, big.NewInt(6)) + x3 := e.fp.MulConst(&y3, big.NewInt(6)) + x4 := e.fp.MulConst(&y4, big.NewInt(6)) + x5 := e.fp.MulConst(&y5, big.NewInt(6)) + e.fp.AssertIsEqual(x[0], x0) + e.fp.AssertIsEqual(x[1], x1) + e.fp.AssertIsEqual(x[2], x2) + e.fp.AssertIsEqual(x[3], x3) + e.fp.AssertIsEqual(x[4], x4) + e.fp.AssertIsEqual(x[5], x5) + + return [6]*baseEl{&y0, &y1, &y2, &y3, &y4, &y5} +} + func (e Ext6) Select(selector frontend.Variable, z1, z0 *E6) *E6 { b0 := e.Ext2.Select(selector, &z1.B0, &z0.B0) b1 := e.Ext2.Select(selector, &z1.B1, &z0.B1) diff --git a/std/algebra/emulated/fields_bls12381/e6_test.go b/std/algebra/emulated/fields_bls12381/e6_test.go index 7964833bdf..9ed08d3b51 100644 --- a/std/algebra/emulated/fields_bls12381/e6_test.go +++ b/std/algebra/emulated/fields_bls12381/e6_test.go @@ -102,6 +102,39 @@ func TestMulFp6(t *testing.T) { } +type e6MulVariant struct { + A, B, C E6 +} + +func (circuit *e6MulVariant) Define(api frontend.API) error { + e := NewExt6(api) + expected1 := e.mulKaratsubaOverKaratsuba(&circuit.A, &circuit.B) + expected2 := e.mulToom3OverKaratsuba(&circuit.A, &circuit.B) + e.AssertIsEqual(expected1, &circuit.C) + e.AssertIsEqual(expected2, &circuit.C) + return nil +} + +func TestMulFp6Variants(t *testing.T) { + + assert := test.NewAssert(t) + // witness values + var a, b, c bls12381.E6 + _, _ = a.SetRandom() + _, _ = b.SetRandom() + c.Mul(&a, &b) + + witness := e6Mul{ + A: FromE6(&a), + B: FromE6(&b), + C: FromE6(&c), + } + + err := test.IsSolved(&e6Mul{}, &witness, ecc.BN254.ScalarField()) + assert.NoError(err) + +} + type e6Square struct { A, C E6 } diff --git a/std/algebra/emulated/fields_bls12381/hints.go b/std/algebra/emulated/fields_bls12381/hints.go index c8455f40cf..fdc9700504 100644 --- a/std/algebra/emulated/fields_bls12381/hints.go +++ b/std/algebra/emulated/fields_bls12381/hints.go @@ -4,6 +4,7 @@ import ( "math/big" bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381" + "github.com/consensys/gnark-crypto/ecc/bls12-381/fp" "github.com/consensys/gnark/constraint/solver" "github.com/consensys/gnark/std/math/emulated" ) @@ -22,6 +23,7 @@ func GetHints() []solver.Hint { divE6Hint, inverseE6Hint, squareTorusHint, + divE6By6Hint, // E12 divE12Hint, inverseE12Hint, @@ -149,6 +151,36 @@ func squareTorusHint(nativeMod *big.Int, nativeInputs, nativeOutputs []*big.Int) }) } +func divE6By6Hint(nativeMod *big.Int, nativeInputs, nativeOutputs []*big.Int) error { + return emulated.UnwrapHint(nativeInputs, nativeOutputs, + func(mod *big.Int, inputs, outputs []*big.Int) error { + var a, c bls12381.E6 + + a.B0.A0.SetBigInt(inputs[0]) + a.B0.A1.SetBigInt(inputs[1]) + a.B1.A0.SetBigInt(inputs[2]) + a.B1.A1.SetBigInt(inputs[3]) + a.B2.A0.SetBigInt(inputs[4]) + a.B2.A1.SetBigInt(inputs[5]) + + var sixInv fp.Element + sixInv.SetString("6") + sixInv.Inverse(&sixInv) + c.B0.MulByElement(&a.B0, &sixInv) + c.B1.MulByElement(&a.B1, &sixInv) + c.B2.MulByElement(&a.B2, &sixInv) + + c.B0.A0.BigInt(outputs[0]) + c.B0.A1.BigInt(outputs[1]) + c.B1.A0.BigInt(outputs[2]) + c.B1.A1.BigInt(outputs[3]) + c.B2.A0.BigInt(outputs[4]) + c.B2.A1.BigInt(outputs[5]) + + return nil + }) +} + // E12 hints func inverseE12Hint(nativeMod *big.Int, nativeInputs, nativeOutputs []*big.Int) error { return emulated.UnwrapHint(nativeInputs, nativeOutputs, diff --git a/std/algebra/emulated/fields_bn254/e12.go b/std/algebra/emulated/fields_bn254/e12.go index abe8bd9a9e..fb50d82676 100644 --- a/std/algebra/emulated/fields_bn254/e12.go +++ b/std/algebra/emulated/fields_bn254/e12.go @@ -49,8 +49,8 @@ func (e Ext12) Mul(x, y *E12) *E12 { a = e.Ext6.Mul(a, b) b = e.Ext6.Mul(&x.C0, &y.C0) c := e.Ext6.Mul(&x.C1, &y.C1) - z1 := e.Ext6.Sub(a, b) - z1 = e.Ext6.Sub(z1, c) + d := e.Ext6.Add(c, b) + z1 := e.Ext6.Sub(a, d) z0 := e.Ext6.MulByNonResidue(c) z0 = e.Ext6.Add(z0, b) return &E12{ @@ -101,8 +101,7 @@ func (e Ext12) IsZero(z *E12) frontend.Variable { func (e Ext12) Square(x *E12) *E12 { c0 := e.Ext6.Sub(&x.C0, &x.C1) c3 := e.Ext6.MulByNonResidue(&x.C1) - c3 = e.Ext6.Neg(c3) - c3 = e.Ext6.Add(&x.C0, c3) + c3 = e.Ext6.Sub(&x.C0, c3) c2 := e.Ext6.Mul(&x.C0, &x.C1) c0 = e.Ext6.Mul(c0, c3) c0 = e.Ext6.Add(c0, c2) diff --git a/std/algebra/emulated/fields_bn254/e12_pairing.go b/std/algebra/emulated/fields_bn254/e12_pairing.go index 257f7d640f..9f896630ba 100644 --- a/std/algebra/emulated/fields_bn254/e12_pairing.go +++ b/std/algebra/emulated/fields_bn254/e12_pairing.go @@ -154,8 +154,8 @@ func (e *Ext12) Mul034By034(d3, d4, c3, c4 *E2) [5]*E2 { tmp := e.Ext2.Add(c3, c4) x34 := e.Ext2.Add(d3, d4) x34 = e.Ext2.Mul(x34, tmp) - x34 = e.Ext2.Sub(x34, x3) - x34 = e.Ext2.Sub(x34, x4) + tmp = e.Ext2.Add(x4, x3) + x34 = e.Ext2.Sub(x34, tmp) zC0B0 := e.Ext2.MulByNonResidue(x4) zC0B0 = e.Ext2.Add(zC0B0, e.Ext2.One()) @@ -181,8 +181,8 @@ func (e *Ext12) MulBy01234(z *E12, x [5]*E2) *E12 { a = e.Ext6.Mul(a, b) b = e.Ext6.Mul(&z.C0, c0) c := e.Ext6.MulBy01(&z.C1, x[3], x[4]) - z1 := e.Ext6.Sub(a, b) - z1 = e.Ext6.Sub(z1, c) + d := e.Ext6.Add(c, b) + z1 := e.Ext6.Sub(a, d) z0 := e.Ext6.MulByNonResidue(c) z0 = e.Ext6.Add(z0, b) return &E12{ @@ -211,8 +211,8 @@ func (e *Ext12) Mul01234By034(x [5]*E2, z3, z4 *E2) *E12 { b := e.Ext6.Add(c0, c1) a = e.Ext6.Mul(a, b) c := e.Ext6.Mul01By01(z3, z4, x[3], x[4]) - z1 := e.Ext6.Sub(a, c0) - z1 = e.Ext6.Sub(z1, c) + b = e.Ext6.Add(c0, c) + z1 := e.Ext6.Sub(a, b) z0 := e.Ext6.MulByNonResidue(c) z0 = e.Ext6.Add(z0, c0) return &E12{ diff --git a/std/algebra/emulated/fields_bn254/e2.go b/std/algebra/emulated/fields_bn254/e2.go index 161712f197..7533d7bf83 100644 --- a/std/algebra/emulated/fields_bn254/e2.go +++ b/std/algebra/emulated/fields_bn254/e2.go @@ -60,8 +60,8 @@ func NewExt2(api frontend.API) *Ext2 { } func (e Ext2) MulByElement(x *E2, y *baseEl) *E2 { - z0 := e.fp.MulMod(&x.A0, y) - z1 := e.fp.MulMod(&x.A1, y) + z0 := e.fp.Mul(&x.A0, y) + z1 := e.fp.Mul(&x.A1, y) return &E2{ A0: *z0, A1: *z1, @@ -134,8 +134,8 @@ func (e Ext2) MulByNonResidue1Power5(x *E2) *E2 { func (e Ext2) MulByNonResidue2Power1(x *E2) *E2 { element := emulated.ValueOf[emulated.BN254Fp]("21888242871839275220042445260109153167277707414472061641714758635765020556617") return &E2{ - A0: *e.fp.MulMod(&x.A0, &element), - A1: *e.fp.MulMod(&x.A1, &element), + A0: *e.fp.Mul(&x.A0, &element), + A1: *e.fp.Mul(&x.A1, &element), } } @@ -143,8 +143,8 @@ func (e Ext2) MulByNonResidue2Power1(x *E2) *E2 { func (e Ext2) MulByNonResidue2Power2(x *E2) *E2 { element := emulated.ValueOf[emulated.BN254Fp]("21888242871839275220042445260109153167277707414472061641714758635765020556616") return &E2{ - A0: *e.fp.MulMod(&x.A0, &element), - A1: *e.fp.MulMod(&x.A1, &element), + A0: *e.fp.Mul(&x.A0, &element), + A1: *e.fp.Mul(&x.A1, &element), } } @@ -152,8 +152,8 @@ func (e Ext2) MulByNonResidue2Power2(x *E2) *E2 { func (e Ext2) MulByNonResidue2Power3(x *E2) *E2 { element := emulated.ValueOf[emulated.BN254Fp]("21888242871839275222246405745257275088696311157297823662689037894645226208582") return &E2{ - A0: *e.fp.MulMod(&x.A0, &element), - A1: *e.fp.MulMod(&x.A1, &element), + A0: *e.fp.Mul(&x.A0, &element), + A1: *e.fp.Mul(&x.A1, &element), } } @@ -161,8 +161,8 @@ func (e Ext2) MulByNonResidue2Power3(x *E2) *E2 { func (e Ext2) MulByNonResidue2Power4(x *E2) *E2 { element := emulated.ValueOf[emulated.BN254Fp]("2203960485148121921418603742825762020974279258880205651966") return &E2{ - A0: *e.fp.MulMod(&x.A0, &element), - A1: *e.fp.MulMod(&x.A1, &element), + A0: *e.fp.Mul(&x.A0, &element), + A1: *e.fp.Mul(&x.A1, &element), } } @@ -170,8 +170,8 @@ func (e Ext2) MulByNonResidue2Power4(x *E2) *E2 { func (e Ext2) MulByNonResidue2Power5(x *E2) *E2 { element := emulated.ValueOf[emulated.BN254Fp]("2203960485148121921418603742825762020974279258880205651967") return &E2{ - A0: *e.fp.MulMod(&x.A0, &element), - A1: *e.fp.MulMod(&x.A1, &element), + A0: *e.fp.Mul(&x.A0, &element), + A1: *e.fp.Mul(&x.A1, &element), } } @@ -201,17 +201,20 @@ func (e Ext2) MulByNonResidue3Power5(x *E2) *E2 { } func (e Ext2) Mul(x, y *E2) *E2 { - a := e.fp.Add(&x.A0, &x.A1) - b := e.fp.Add(&y.A0, &y.A1) - a = e.fp.MulMod(a, b) - b = e.fp.MulMod(&x.A0, &y.A0) - c := e.fp.MulMod(&x.A1, &y.A1) - z1 := e.fp.Sub(a, b) - z1 = e.fp.Sub(z1, c) - z0 := e.fp.Sub(b, c) + + v0 := e.fp.Mul(&x.A0, &y.A0) + v1 := e.fp.Mul(&x.A1, &y.A1) + + b0 := e.fp.Sub(v0, v1) + b1 := e.fp.Add(&x.A0, &x.A1) + tmp := e.fp.Add(&y.A0, &y.A1) + b1 = e.fp.Mul(b1, tmp) + tmp = e.fp.Add(v0, v1) + b1 = e.fp.Sub(b1, tmp) + return &E2{ - A0: *z0, - A1: *z1, + A0: *b0, + A1: *b1, } } @@ -269,8 +272,8 @@ func (e Ext2) IsZero(z *E2) frontend.Variable { func (e Ext2) Square(x *E2) *E2 { a := e.fp.Add(&x.A0, &x.A1) b := e.fp.Sub(&x.A0, &x.A1) - a = e.fp.MulMod(a, b) - b = e.fp.MulMod(&x.A0, &x.A1) + a = e.fp.Mul(a, b) + b = e.fp.Mul(&x.A0, &x.A1) b = e.fp.MulConst(b, big.NewInt(2)) return &E2{ A0: *a, diff --git a/std/algebra/emulated/fields_bn254/e6.go b/std/algebra/emulated/fields_bn254/e6.go index 31ba7e0515..584043114c 100644 --- a/std/algebra/emulated/fields_bn254/e6.go +++ b/std/algebra/emulated/fields_bn254/e6.go @@ -1,8 +1,11 @@ package fields_bn254 import ( + "math/big" + "github.com/consensys/gnark-crypto/ecc/bn254" "github.com/consensys/gnark/frontend" + "github.com/consensys/gnark/internal/frontendtype" ) type E6 struct { @@ -79,29 +82,138 @@ func (e Ext6) Sub(x, y *E6) *E6 { } } +// Mul multiplies two E6 elmts func (e Ext6) Mul(x, y *E6) *E6 { + if ft, ok := e.api.(frontendtype.FrontendTyper); ok { + switch ft.FrontendType() { + case frontendtype.R1CS: + return e.mulToom3OverKaratsuba(x, y) + case frontendtype.SCS: + return e.mulKaratsubaOverKaratsuba(x, y) + } + } + return e.mulKaratsubaOverKaratsuba(x, y) +} + +func (e Ext6) mulToom3OverKaratsuba(x, y *E6) *E6 { + // Toom-Cook-3x over Karatsuba: + // We start by computing five interpolation points – these are evaluations of + // the product x(u)y(u) with u ∈ {0, ±1, 2, ∞}: + // + // v0 = x(0)y(0) = x.A0 * y.A0 + // v1 = x(1)y(1) = (x.A0 + x.A1 + x.A2)(y.A0 + y.A1 + y.A2) + // v2 = x(−1)y(−1) = (x.A0 − x.A1 + x.A2)(y.A0 − y.A1 + y.A2) + // v3 = x(2)y(2) = (x.A0 + 2x.A1 + 4x.A2)(y.A0 + 2y.A1 + 4y.A2) + // v4 = x(∞)y(∞) = x.A2 * y.A2 + + v0 := e.Ext2.Mul(&x.B0, &y.B0) + + t1 := e.Ext2.Add(&x.B0, &x.B2) + t2 := e.Ext2.Add(&y.B0, &y.B2) + t3 := e.Ext2.Add(t2, &y.B1) + v1 := e.Ext2.Add(t1, &x.B1) + v1 = e.Ext2.Mul(v1, t3) + + t3 = e.Ext2.Sub(t2, &y.B1) + v2 := e.Ext2.Sub(t1, &x.B1) + v2 = e.Ext2.Mul(v2, t3) + + t1 = e.Ext2.MulByConstElement(&x.B1, big.NewInt(2)) + t2 = e.Ext2.MulByConstElement(&x.B2, big.NewInt(4)) + v3 := e.Ext2.Add(t1, t2) + v3 = e.Ext2.Add(v3, &x.B0) + t1 = e.Ext2.MulByConstElement(&y.B1, big.NewInt(2)) + t2 = e.Ext2.MulByConstElement(&y.B2, big.NewInt(4)) + t3 = e.Ext2.Add(t1, t2) + t3 = e.Ext2.Add(t3, &y.B0) + v3 = e.Ext2.Mul(v3, t3) + + v4 := e.Ext2.Mul(&x.B2, &y.B2) + + // Then the interpolation is performed as: + // + // a0 = v0 + β((1/2)v0 − (1/2)v1 − (1/6)v2 + (1/6)v3 − 2v4) + // a1 = −(1/2)v0 + v1 − (1/3)v2 − (1/6)v3 + 2v4 + βv4 + // a2 = −v0 + (1/2)v1 + (1/2)v2 − v4 + // + // where β is the cubic non-residue. + // + // In-circuit, we compute 6*x*y as + // c0 = 6v0 + β(3v0 − 3v1 − v2 + v3 − 12v4) + // a1 = -(3v0 + 2v2 + v3) + 6(v1 + 2v4 + βv4) + // a2 = 3(v1 + v2 - 2(v0 + v4)) + // + // and then divide a0, a1 and a2 by 6 using a hint. + + a0 := e.Ext2.MulByConstElement(v0, big.NewInt(6)) + t1 = e.Ext2.Sub(v0, v1) + t1 = e.Ext2.MulByConstElement(t1, big.NewInt(3)) + t1 = e.Ext2.Sub(t1, v2) + t1 = e.Ext2.Add(t1, v3) + t2 = e.Ext2.MulByConstElement(v4, big.NewInt(12)) + t1 = e.Ext2.Sub(t1, t2) + t1 = e.Ext2.MulByNonResidue(t1) + a0 = e.Ext2.Add(a0, t1) + + a1 := e.Ext2.MulByConstElement(v0, big.NewInt(3)) + t1 = e.Ext2.MulByConstElement(v2, big.NewInt(2)) + a1 = e.Ext2.Add(a1, t1) + a1 = e.Ext2.Add(a1, v3) + t1 = e.Ext2.MulByConstElement(v4, big.NewInt(2)) + t1 = e.Ext2.Add(t1, v1) + t2 = e.Ext2.MulByNonResidue(v4) + t1 = e.Ext2.Add(t1, t2) + t1 = e.Ext2.MulByConstElement(t1, big.NewInt(6)) + a1 = e.Ext2.Sub(t1, a1) + + a2 := e.Ext2.Add(v1, v2) + a2 = e.Ext2.MulByConstElement(a2, big.NewInt(3)) + t1 = e.Ext2.Add(v0, v4) + t1 = e.Ext2.MulByConstElement(t1, big.NewInt(6)) + a2 = e.Ext2.Sub(a2, t1) + + res := e.divE6By6([6]*baseEl{&a0.A0, &a0.A1, &a1.A0, &a1.A1, &a2.A0, &a2.A1}) + return &E6{ + B0: E2{ + A0: *res[0], + A1: *res[1], + }, + B1: E2{ + A0: *res[2], + A1: *res[3], + }, + B2: E2{ + A0: *res[4], + A1: *res[5], + }, + } +} + +func (e Ext6) mulKaratsubaOverKaratsuba(x, y *E6) *E6 { + // Karatsuba over Karatsuba: + // Algorithm 13 from https://eprint.iacr.org/2010/354.pdf t0 := e.Ext2.Mul(&x.B0, &y.B0) t1 := e.Ext2.Mul(&x.B1, &y.B1) t2 := e.Ext2.Mul(&x.B2, &y.B2) c0 := e.Ext2.Add(&x.B1, &x.B2) tmp := e.Ext2.Add(&y.B1, &y.B2) c0 = e.Ext2.Mul(c0, tmp) - c0 = e.Ext2.Sub(c0, t1) - c0 = e.Ext2.Sub(c0, t2) + tmp = e.Ext2.Add(t2, t1) + c0 = e.Ext2.Sub(c0, tmp) c0 = e.Ext2.MulByNonResidue(c0) c0 = e.Ext2.Add(c0, t0) c1 := e.Ext2.Add(&x.B0, &x.B1) tmp = e.Ext2.Add(&y.B0, &y.B1) c1 = e.Ext2.Mul(c1, tmp) - c1 = e.Ext2.Sub(c1, t0) - c1 = e.Ext2.Sub(c1, t1) + tmp = e.Ext2.Add(t0, t1) + c1 = e.Ext2.Sub(c1, tmp) tmp = e.Ext2.MulByNonResidue(t2) c1 = e.Ext2.Add(c1, tmp) tmp = e.Ext2.Add(&x.B0, &x.B2) c2 := e.Ext2.Add(&y.B0, &y.B2) c2 = e.Ext2.Mul(c2, tmp) - c2 = e.Ext2.Sub(c2, t0) - c2 = e.Ext2.Sub(c2, t2) + tmp = e.Ext2.Add(t0, t2) + c2 = e.Ext2.Sub(c2, tmp) c2 = e.Ext2.Add(c2, t1) return &E6{ B0: *c0, @@ -148,6 +260,17 @@ func (e Ext6) Square(x *E6) *E6 { } } +func (e Ext6) MulByConstE2(x *E6, y *E2) *E6 { + z0 := e.Ext2.Mul(&x.B0, y) + z1 := e.Ext2.Mul(&x.B1, y) + z2 := e.Ext2.Mul(&x.B2, y) + return &E6{ + B0: *z0, + B1: *z1, + B2: *z2, + } +} + func (e Ext6) MulByE2(x *E6, y *E2) *E6 { z0 := e.Ext2.Mul(&x.B0, y) z1 := e.Ext2.Mul(&x.B1, y) @@ -204,8 +327,8 @@ func (e Ext6) MulBy01(z *E6, c0, c1 *E2) *E6 { t1 := e.Ext2.Add(c0, c1) tmp = e.Ext2.Add(&z.B0, &z.B1) t1 = e.Ext2.Mul(t1, tmp) - t1 = e.Ext2.Sub(t1, a) - t1 = e.Ext2.Sub(t1, b) + tmp = e.Ext2.Add(a, b) + t1 = e.Ext2.Sub(t1, tmp) return &E6{ B0: *t0, B1: *t1, @@ -234,8 +357,8 @@ func (e Ext6) Mul01By01(c0, c1, d0, d1 *E2) *E6 { t1 := e.Ext2.Add(c0, c1) tmp := e.Ext2.Add(d0, d1) t1 = e.Ext2.Mul(t1, tmp) - t1 = e.Ext2.Sub(t1, a) - t1 = e.Ext2.Sub(t1, b) + tmp = e.Ext2.Add(a, b) + t1 = e.Ext2.Sub(t1, tmp) return &E6{ B0: *a, B1: *t1, @@ -317,6 +440,37 @@ func (e Ext6) DivUnchecked(x, y *E6) *E6 { return &div } +func (e Ext6) divE6By6(x [6]*baseEl) [6]*baseEl { + res, err := e.fp.NewHint(divE6By6Hint, 6, x[0], x[1], x[2], x[3], x[4], x[5]) + if err != nil { + // err is non-nil only for invalid number of inputs + panic(err) + } + + y0 := *res[0] + y1 := *res[1] + y2 := *res[2] + y3 := *res[3] + y4 := *res[4] + y5 := *res[5] + + // xi == 6 * yi + x0 := e.fp.MulConst(&y0, big.NewInt(6)) + x1 := e.fp.MulConst(&y1, big.NewInt(6)) + x2 := e.fp.MulConst(&y2, big.NewInt(6)) + x3 := e.fp.MulConst(&y3, big.NewInt(6)) + x4 := e.fp.MulConst(&y4, big.NewInt(6)) + x5 := e.fp.MulConst(&y5, big.NewInt(6)) + e.fp.AssertIsEqual(x[0], x0) + e.fp.AssertIsEqual(x[1], x1) + e.fp.AssertIsEqual(x[2], x2) + e.fp.AssertIsEqual(x[3], x3) + e.fp.AssertIsEqual(x[4], x4) + e.fp.AssertIsEqual(x[5], x5) + + return [6]*baseEl{&y0, &y1, &y2, &y3, &y4, &y5} +} + func (e Ext6) Select(selector frontend.Variable, z1, z0 *E6) *E6 { b0 := e.Ext2.Select(selector, &z1.B0, &z0.B0) b1 := e.Ext2.Select(selector, &z1.B1, &z0.B1) diff --git a/std/algebra/emulated/fields_bn254/e6_test.go b/std/algebra/emulated/fields_bn254/e6_test.go index 9b8dfdac74..4fbfcdea8b 100644 --- a/std/algebra/emulated/fields_bn254/e6_test.go +++ b/std/algebra/emulated/fields_bn254/e6_test.go @@ -102,6 +102,39 @@ func TestMulFp6(t *testing.T) { } +type e6MulVariant struct { + A, B, C E6 +} + +func (circuit *e6MulVariant) Define(api frontend.API) error { + e := NewExt6(api) + expected1 := e.mulKaratsubaOverKaratsuba(&circuit.A, &circuit.B) + expected2 := e.mulToom3OverKaratsuba(&circuit.A, &circuit.B) + e.AssertIsEqual(expected1, &circuit.C) + e.AssertIsEqual(expected2, &circuit.C) + return nil +} + +func TestMulFp6Variants(t *testing.T) { + + assert := test.NewAssert(t) + // witness values + var a, b, c bn254.E6 + _, _ = a.SetRandom() + _, _ = b.SetRandom() + c.Mul(&a, &b) + + witness := e6Mul{ + A: FromE6(&a), + B: FromE6(&b), + C: FromE6(&c), + } + + err := test.IsSolved(&e6Mul{}, &witness, ecc.BN254.ScalarField()) + assert.NoError(err) + +} + type e6Square struct { A, C E6 } diff --git a/std/algebra/emulated/fields_bn254/hints.go b/std/algebra/emulated/fields_bn254/hints.go index b08d6ed977..e9409af18a 100644 --- a/std/algebra/emulated/fields_bn254/hints.go +++ b/std/algebra/emulated/fields_bn254/hints.go @@ -4,6 +4,7 @@ import ( "math/big" "github.com/consensys/gnark-crypto/ecc/bn254" + "github.com/consensys/gnark-crypto/ecc/bn254/fp" "github.com/consensys/gnark/constraint/solver" "github.com/consensys/gnark/std/math/emulated" ) @@ -22,6 +23,7 @@ func GetHints() []solver.Hint { divE6Hint, inverseE6Hint, squareTorusHint, + divE6By6Hint, // E12 divE12Hint, inverseE12Hint, @@ -149,6 +151,36 @@ func squareTorusHint(nativeMod *big.Int, nativeInputs, nativeOutputs []*big.Int) }) } +func divE6By6Hint(nativeMod *big.Int, nativeInputs, nativeOutputs []*big.Int) error { + return emulated.UnwrapHint(nativeInputs, nativeOutputs, + func(mod *big.Int, inputs, outputs []*big.Int) error { + var a, c bn254.E6 + + a.B0.A0.SetBigInt(inputs[0]) + a.B0.A1.SetBigInt(inputs[1]) + a.B1.A0.SetBigInt(inputs[2]) + a.B1.A1.SetBigInt(inputs[3]) + a.B2.A0.SetBigInt(inputs[4]) + a.B2.A1.SetBigInt(inputs[5]) + + var sixInv fp.Element + sixInv.SetString("6") + sixInv.Inverse(&sixInv) + c.B0.MulByElement(&a.B0, &sixInv) + c.B1.MulByElement(&a.B1, &sixInv) + c.B2.MulByElement(&a.B2, &sixInv) + + c.B0.A0.BigInt(outputs[0]) + c.B0.A1.BigInt(outputs[1]) + c.B1.A0.BigInt(outputs[2]) + c.B1.A1.BigInt(outputs[3]) + c.B2.A0.BigInt(outputs[4]) + c.B2.A1.BigInt(outputs[5]) + + return nil + }) +} + // E12 hints func inverseE12Hint(nativeMod *big.Int, nativeInputs, nativeOutputs []*big.Int) error { return emulated.UnwrapHint(nativeInputs, nativeOutputs, diff --git a/std/algebra/emulated/fields_bw6761/e3.go b/std/algebra/emulated/fields_bw6761/e3.go deleted file mode 100644 index a2dc7530e9..0000000000 --- a/std/algebra/emulated/fields_bw6761/e3.go +++ /dev/null @@ -1,400 +0,0 @@ -package fields_bw6761 - -import ( - "math/big" - - bw6761 "github.com/consensys/gnark-crypto/ecc/bw6-761" - "github.com/consensys/gnark/frontend" - "github.com/consensys/gnark/std/math/emulated" -) - -type curveF = emulated.Field[emulated.BW6761Fp] -type baseEl = emulated.Element[emulated.BW6761Fp] - -type E3 struct { - A0, A1, A2 baseEl -} - -type Ext3 struct { - api frontend.API - fp *curveF -} - -func NewExt3(api frontend.API) *Ext3 { - fp, err := emulated.NewField[emulated.BW6761Fp](api) - if err != nil { - panic(err) - } - return &Ext3{ - api: api, - fp: fp, - } -} - -func (e Ext3) Reduce(x *E3) *E3 { - var z E3 - z.A0 = *e.fp.Reduce(&x.A0) - z.A1 = *e.fp.Reduce(&x.A1) - z.A2 = *e.fp.Reduce(&x.A2) - return &z -} - -func (e Ext3) Zero() *E3 { - zero := e.fp.Zero() - return &E3{ - A0: *zero, - A1: *zero, - A2: *zero, - } -} - -func (e Ext3) One() *E3 { - one := e.fp.One() - zero := e.fp.Zero() - return &E3{ - A0: *one, - A1: *zero, - A2: *zero, - } -} - -func (e Ext3) Neg(x *E3) *E3 { - a0 := e.fp.Neg(&x.A0) - a1 := e.fp.Neg(&x.A1) - a2 := e.fp.Neg(&x.A2) - return &E3{ - A0: *a0, - A1: *a1, - A2: *a2, - } -} - -func (e Ext3) Add(x, y *E3) *E3 { - a0 := e.fp.Add(&x.A0, &y.A0) - a1 := e.fp.Add(&x.A1, &y.A1) - a2 := e.fp.Add(&x.A2, &y.A2) - return &E3{ - A0: *a0, - A1: *a1, - A2: *a2, - } -} - -func (e Ext3) Sub(x, y *E3) *E3 { - a0 := e.fp.Sub(&x.A0, &y.A0) - a1 := e.fp.Sub(&x.A1, &y.A1) - a2 := e.fp.Sub(&x.A2, &y.A2) - return &E3{ - A0: *a0, - A1: *a1, - A2: *a2, - } -} - -func (e Ext3) Double(x *E3) *E3 { - two := big.NewInt(2) - a0 := e.fp.MulConst(&x.A0, two) - a1 := e.fp.MulConst(&x.A1, two) - a2 := e.fp.MulConst(&x.A2, two) - return &E3{ - A0: *a0, - A1: *a1, - A2: *a2, - } -} - -func mulFpByNonResidue(fp *curveF, x *baseEl) *baseEl { - - z := fp.Neg(x) - z = fp.MulConst(z, big.NewInt(4)) - return z -} - -func (e Ext3) Conjugate(x *E3) *E3 { - a1 := e.fp.Neg(&x.A1) - return &E3{ - A0: x.A0, - A1: *a1, - A2: x.A2, - } -} - -func (e Ext3) MulByElement(x *E3, y *baseEl) *E3 { - a0 := e.fp.Mul(&x.A0, y) - a1 := e.fp.Mul(&x.A1, y) - a2 := e.fp.Mul(&x.A2, y) - z := &E3{ - A0: *a0, - A1: *a1, - A2: *a2, - } - return z -} - -func (e Ext3) MulByConstElement(x *E3, y *big.Int) *E3 { - a0 := e.fp.MulConst(&x.A0, y) - a1 := e.fp.MulConst(&x.A1, y) - a2 := e.fp.MulConst(&x.A2, y) - return &E3{ - A0: *a0, - A1: *a1, - A2: *a2, - } -} - -// MulBy01 multiplication by sparse element (c0,c1,0) -func (e Ext3) MulBy01(z *E3, c0, c1 *baseEl) *E3 { - - a := e.fp.Mul(&z.A0, c0) - b := e.fp.Mul(&z.A1, c1) - - tmp := e.fp.Add(&z.A1, &z.A2) - t0 := e.fp.Mul(c1, tmp) - t0 = e.fp.Sub(b, t0) - t0 = e.fp.MulConst(t0, big.NewInt(4)) - t0 = e.fp.Add(t0, a) - - // for t2, schoolbook is faster than karatsuba - // c2 = a0b2 + a1b1 + a2b0, - // c2 = a2b0 + b ∵ b2 = 0, b = a1b1 - t2 := e.fp.Mul(&z.A2, c0) - t2 = e.fp.Add(t2, b) - - t1 := e.fp.Add(c0, c1) - tmp = e.fp.Add(&z.A0, &z.A1) - t1 = e.fp.Mul(t1, tmp) - t1 = e.fp.Sub(t1, a) - t1 = e.fp.Sub(t1, b) - - return &E3{ - A0: *t0, - A1: *t1, - A2: *t2, - } -} - -// MulBy1 multiplication of E6 by sparse element (0, c1, 0) -func (e Ext3) MulBy1(z *E3, c1 *baseEl) *E3 { - - b := e.fp.Mul(&z.A1, c1) - tmp := e.fp.Add(&z.A1, &z.A2) - t0 := e.fp.Mul(c1, tmp) - t0 = e.fp.Sub(b, t0) - t0 = e.fp.MulConst(t0, big.NewInt(4)) - tmp = e.fp.Add(&z.A0, &z.A1) - t1 := e.fp.Mul(c1, tmp) - t1 = e.fp.Sub(t1, b) - - return &E3{ - A0: *t0, - A1: *t1, - A2: *b, - } -} - -// MulBy12 multiplication by sparse element (0,b1,b2) -func (e Ext3) MulBy12(x *E3, b1, b2 *baseEl) *E3 { - t1 := e.fp.Mul(&x.A1, b1) - t2 := e.fp.Mul(&x.A2, b2) - c0 := e.fp.Add(&x.A1, &x.A2) - tmp := e.fp.Add(b1, b2) - c0 = e.fp.Mul(c0, tmp) - c0 = e.fp.Sub(c0, t1) - c0 = e.fp.Sub(t2, c0) - c0 = e.fp.MulConst(c0, big.NewInt(4)) - c1 := e.fp.Add(&x.A0, &x.A1) - c1 = e.fp.Mul(c1, b1) - c1 = e.fp.Sub(c1, t1) - tmp = mulFpByNonResidue(e.fp, t2) - c1 = e.fp.Add(c1, tmp) - tmp = e.fp.Add(&x.A0, &x.A2) - c2 := e.fp.Mul(b2, tmp) - c2 = e.fp.Sub(c2, t2) - c2 = e.fp.Add(c2, t1) - return &E3{ - A0: *c0, - A1: *c1, - A2: *c2, - } -} - -// Mul01By01 multiplies two E3 sparse element of the form: -// -// E3{ -// A0: c0, -// A1: c1, -// A2: 0, -// } -// -// and -// -// E3{ -// A0: d0, -// A1: d1, -// A2: 0, -// } -func (e Ext3) Mul01By01(c0, c1, d0, d1 *baseEl) *E3 { - a := e.fp.Mul(d0, c0) - b := e.fp.Mul(d1, c1) - t1 := e.fp.Add(c0, c1) - tmp := e.fp.Add(d0, d1) - t1 = e.fp.Mul(t1, tmp) - t1 = e.fp.Sub(t1, a) - t1 = e.fp.Sub(t1, b) - return &E3{ - A0: *a, - A1: *t1, - A2: *b, - } -} - -func (e Ext3) Mul(x, y *E3) *E3 { - // Algorithm 13 from https://eprint.iacr.org/2010/354.pdf - t0 := e.fp.Mul(&x.A0, &y.A0) - t1 := e.fp.Mul(&x.A1, &y.A1) - t2 := e.fp.Mul(&x.A2, &y.A2) - - c0 := e.fp.Add(&x.A1, &x.A2) - tmp := e.fp.Add(&y.A1, &y.A2) - c0 = e.fp.Mul(c0, tmp) - c0 = e.fp.Sub(c0, t1) - c0 = e.fp.Sub(t2, c0) - c0 = e.fp.MulConst(c0, big.NewInt(4)) - - tmp = e.fp.Add(&x.A0, &x.A2) - c2 := e.fp.Add(&y.A0, &y.A2) - c2 = e.fp.Mul(c2, tmp) - c2 = e.fp.Sub(c2, t0) - c2 = e.fp.Sub(c2, t2) - - c1 := e.fp.Add(&x.A0, &x.A1) - tmp = e.fp.Add(&y.A0, &y.A1) - c1 = e.fp.Mul(c1, tmp) - c1 = e.fp.Sub(c1, t0) - c1 = e.fp.Sub(c1, t1) - t2 = mulFpByNonResidue(e.fp, t2) - - a0 := e.fp.Add(c0, t0) - a1 := e.fp.Add(c1, t2) - a2 := e.fp.Add(c2, t1) - - return &E3{ - A0: *a0, - A1: *a1, - A2: *a2, - } -} - -func (e Ext3) Square(x *E3) *E3 { - - // Algorithm 16 from https://eprint.iacr.org/2010/354.pdf - - c6 := e.fp.MulConst(&x.A1, big.NewInt(2)) - c4 := e.fp.Mul(&x.A0, c6) // x.A0 * xA1 * 2 - c5 := e.fp.Mul(&x.A2, &x.A2) - c1 := mulFpByNonResidue(e.fp, c5) - c1 = e.fp.Add(c1, c4) - c2 := e.fp.Sub(c4, c5) - - c3 := e.fp.Mul(&x.A0, &x.A0) - c4 = e.fp.Sub(&x.A0, &x.A1) - c4 = e.fp.Add(c4, &x.A2) - c5 = e.fp.Mul(c6, &x.A2) // x.A1 * xA2 * 2 - c4 = e.fp.Mul(c4, c4) - c0 := mulFpByNonResidue(e.fp, c5) - c4 = e.fp.Add(c4, c5) - c4 = e.fp.Sub(c4, c3) - - a0 := e.fp.Add(c0, c3) - a1 := c1 - a2 := e.fp.Add(c2, c4) - - return &E3{ - A0: *a0, - A1: *a1, - A2: *a2, - } -} - -func (e Ext3) Inverse(x *E3) *E3 { - res, err := e.fp.NewHint(inverseE3Hint, 3, &x.A0, &x.A1, &x.A2) - if err != nil { - // err is non-nil only for invalid number of inputs - panic(err) - } - - inv := E3{ - A0: *res[0], - A1: *res[1], - A2: *res[2], - } - one := e.One() - - // 1 == inv * x - _one := e.Mul(&inv, x) - e.AssertIsEqual(one, _one) - - return &inv - -} - -func (e Ext3) DivUnchecked(x, y *E3) *E3 { - res, err := e.fp.NewHint(divE3Hint, 6, &x.A0, &x.A1, &x.A2, &y.A0, &y.A1, &y.A2) - if err != nil { - // err is non-nil only for invalid number of inputs - panic(err) - } - - div := E3{ - A0: *res[0], - A1: *res[1], - A2: *res[2], - } - - // x = div * y - _x := e.Mul(&div, y) - e.AssertIsEqual(x, _x) - - return &div - -} - -// MulByNonResidue mul x by (0,1,0) -func (e Ext3) MulByNonResidue(x *E3) *E3 { - z := &E3{ - A0: x.A2, - A1: x.A0, - A2: x.A1, - } - z.A0 = *mulFpByNonResidue(e.fp, &z.A0) - return z -} - -func (e Ext3) AssertIsEqual(a, b *E3) { - e.fp.AssertIsEqual(&a.A0, &b.A0) - e.fp.AssertIsEqual(&a.A1, &b.A1) - e.fp.AssertIsEqual(&a.A2, &b.A2) -} - -func (e Ext3) Copy(x *E3) *E3 { - return &E3{ - A0: x.A0, - A1: x.A1, - A2: x.A2, - } -} - -func FromE3(a *bw6761.E3) E3 { - return E3{ - A0: emulated.ValueOf[emulated.BW6761Fp](a.A0), - A1: emulated.ValueOf[emulated.BW6761Fp](a.A1), - A2: emulated.ValueOf[emulated.BW6761Fp](a.A2), - } -} - -func (e Ext3) Select(selector frontend.Variable, z1, z0 *E3) *E3 { - a0 := e.fp.Select(selector, &z1.A0, &z0.A0) - a1 := e.fp.Select(selector, &z1.A1, &z0.A1) - a2 := e.fp.Select(selector, &z1.A2, &z0.A2) - return &E3{A0: *a0, A1: *a1, A2: *a2} -} diff --git a/std/algebra/emulated/fields_bw6761/e3_test.go b/std/algebra/emulated/fields_bw6761/e3_test.go deleted file mode 100644 index 1893258437..0000000000 --- a/std/algebra/emulated/fields_bw6761/e3_test.go +++ /dev/null @@ -1,410 +0,0 @@ -package fields_bw6761 - -import ( - "testing" - - "github.com/consensys/gnark-crypto/ecc" - bw6761 "github.com/consensys/gnark-crypto/ecc/bw6-761" - "github.com/consensys/gnark-crypto/ecc/bw6-761/fp" - "github.com/consensys/gnark/frontend" - "github.com/consensys/gnark/std/math/emulated" - "github.com/consensys/gnark/test" -) - -type e3Add struct { - A, B, C E3 -} - -func (circuit *e3Add) Define(api frontend.API) error { - e := NewExt3(api) - expected := e.Add(&circuit.A, &circuit.B) - e.AssertIsEqual(expected, &circuit.C) - return nil -} - -func TestAddFp3(t *testing.T) { - assert := test.NewAssert(t) - // witness values - var a, b, c bw6761.E3 - _, _ = a.SetRandom() - _, _ = b.SetRandom() - c.Add(&a, &b) - - witness := e3Add{ - A: FromE3(&a), - B: FromE3(&b), - C: FromE3(&c), - } - - err := test.IsSolved(&e3Add{}, &witness, ecc.BN254.ScalarField()) - assert.NoError(err) -} - -type e3Sub struct { - A, B, C E3 -} - -func (circuit *e3Sub) Define(api frontend.API) error { - e := NewExt3(api) - expected := e.Sub(&circuit.A, &circuit.B) - e.AssertIsEqual(expected, &circuit.C) - return nil -} - -func TestSubFp3(t *testing.T) { - assert := test.NewAssert(t) - // witness values - var a, b, c bw6761.E3 - _, _ = a.SetRandom() - _, _ = b.SetRandom() - c.Sub(&a, &b) - - witness := e3Sub{ - A: FromE3(&a), - B: FromE3(&b), - C: FromE3(&c), - } - - err := test.IsSolved(&e3Sub{}, &witness, ecc.BN254.ScalarField()) - assert.NoError(err) -} - -type e3Neg struct { - A, B E3 -} - -func (circuit *e3Neg) Define(api frontend.API) error { - e := NewExt3(api) - expected := e.Neg(&circuit.A) - e.AssertIsEqual(expected, &circuit.B) - return nil -} - -func TestNegFp3(t *testing.T) { - assert := test.NewAssert(t) - // witness values - var a, b bw6761.E3 - _, _ = a.SetRandom() - b.Neg(&a) - - witness := e3Neg{ - A: FromE3(&a), - B: FromE3(&b), - } - - err := test.IsSolved(&e3Neg{}, &witness, ecc.BN254.ScalarField()) - assert.NoError(err) -} - -type e3Double struct { - A, B E3 -} - -func (circuit *e3Double) Define(api frontend.API) error { - e := NewExt3(api) - expected := e.Double(&circuit.A) - e.AssertIsEqual(expected, &circuit.B) - return nil -} - -func TestDoubleFp3(t *testing.T) { - assert := test.NewAssert(t) - // witness values - var a, b bw6761.E3 - _, _ = a.SetRandom() - b.Double(&a) - - witness := e3Double{ - A: FromE3(&a), - B: FromE3(&b), - } - - err := test.IsSolved(&e3Double{}, &witness, ecc.BN254.ScalarField()) - assert.NoError(err) -} - -type e3Mul struct { - A, B, C E3 -} - -func (circuit *e3Mul) Define(api frontend.API) error { - e := NewExt3(api) - expected := e.Mul(&circuit.A, &circuit.B) - e.AssertIsEqual(expected, &circuit.C) - return nil -} - -func TestMulFp3(t *testing.T) { - assert := test.NewAssert(t) - // witness values - var a, b, c bw6761.E3 - _, _ = a.SetRandom() - _, _ = b.SetRandom() - c.Mul(&a, &b) - - witness := e3Mul{ - A: FromE3(&a), - B: FromE3(&b), - C: FromE3(&c), - } - - err := test.IsSolved(&e3Mul{}, &witness, ecc.BN254.ScalarField()) - assert.NoError(err) -} - -type e3Mul01By01 struct { - A0, A1 baseEl - B0, B1 baseEl - C E3 -} - -func (circuit *e3Mul01By01) Define(api frontend.API) error { - e := NewExt3(api) - expected := e.Mul01By01(&circuit.A0, &circuit.A1, &circuit.B0, &circuit.B1) - e.AssertIsEqual(expected, &circuit.C) - - return nil -} - -func TestMul01By01(t *testing.T) { - - // we test our new E3.Mul01By01 against E3.MulBy01 - assert := test.NewAssert(t) - // witness values - var a, c bw6761.E3 - var A0, A1, B0, B1 fp.Element - A0.SetRandom() - A1.SetRandom() - B0.SetRandom() - B1.SetRandom() - // build a 01 sparse E3 with, - // first two elements as A1 and A2, - // and the third as 0 - a.A0 = A0 - a.A1 = A1 - a.A2.SetZero() - c.Set(&a) - c.MulBy01(&B0, &B1) - - witness := e3Mul01By01{ - A0: emulated.ValueOf[emulated.BW6761Fp](A0), - A1: emulated.ValueOf[emulated.BW6761Fp](A1), - B0: emulated.ValueOf[emulated.BW6761Fp](B0), - B1: emulated.ValueOf[emulated.BW6761Fp](B1), - C: FromE3(&c), - } - - err := test.IsSolved(&e3Mul01By01{}, &witness, ecc.BN254.ScalarField()) - assert.NoError(err) - -} - -type e3MulByNonResidue struct { - A, B E3 -} - -func (circuit *e3MulByNonResidue) Define(api frontend.API) error { - e := NewExt3(api) - expected := e.MulByNonResidue(&circuit.A) - e.AssertIsEqual(expected, &circuit.B) - return nil -} - -func TestMulByNonResidueFp3(t *testing.T) { - assert := test.NewAssert(t) - // witness values - var a, b bw6761.E3 - _, _ = a.SetRandom() - b.Set(&a) - b.MulByNonResidue(&a) - - witness := e3MulByNonResidue{ - A: FromE3(&a), - B: FromE3(&b), - } - - err := test.IsSolved(&e3MulByNonResidue{}, &witness, ecc.BN254.ScalarField()) - assert.NoError(err) -} - -type e3MulByElement struct { - A E3 - Y baseEl - B E3 -} - -func (circuit *e3MulByElement) Define(api frontend.API) error { - e := NewExt3(api) - expected := e.MulByElement(&circuit.A, &circuit.Y) - e.AssertIsEqual(expected, &circuit.B) - return nil -} - -func TestMulByElementFp3(t *testing.T) { - assert := test.NewAssert(t) - // witness values - var a, b bw6761.E3 - _, _ = a.SetRandom() - var y fp.Element - y.SetRandom() - b.Set(&a) - b.MulByElement(&a, &y) - - witness := e3MulByElement{ - A: FromE3(&a), - Y: emulated.ValueOf[emulated.BW6761Fp](y), - B: FromE3(&b), - } - - err := test.IsSolved(&e3MulByElement{}, &witness, ecc.BN254.ScalarField()) - assert.NoError(err) -} - -type e3MulBy01 struct { - A E3 - C0, C1 baseEl - B E3 -} - -func (circuit *e3MulBy01) Define(api frontend.API) error { - e := NewExt3(api) - expected := e.MulBy01(&circuit.A, &circuit.C0, &circuit.C1) - e.AssertIsEqual(expected, &circuit.B) - return nil -} - -func TestMulBy01Fp3(t *testing.T) { - assert := test.NewAssert(t) - // witness values - var a, b bw6761.E3 - _, _ = a.SetRandom() - var c0, c1 fp.Element - c0.SetRandom() - c1.SetRandom() - b.Set(&a) - b.MulBy01(&c0, &c1) - - witness := e3MulBy01{ - A: FromE3(&a), - C0: emulated.ValueOf[emulated.BW6761Fp](c0), - C1: emulated.ValueOf[emulated.BW6761Fp](c1), - B: FromE3(&b), - } - - err := test.IsSolved(&e3MulBy01{}, &witness, ecc.BN254.ScalarField()) - assert.NoError(err) -} - -type e3Square struct { - A, B E3 -} - -func (circuit *e3Square) Define(api frontend.API) error { - e := NewExt3(api) - expected := e.Square(&circuit.A) - e.AssertIsEqual(expected, &circuit.B) - return nil -} - -func TestSquareFp3(t *testing.T) { - assert := test.NewAssert(t) - // witness values - var a, b bw6761.E3 - _, _ = a.SetRandom() - b.Square(&a) - - witness := e3Square{ - A: FromE3(&a), - B: FromE3(&b), - } - - err := test.IsSolved(&e3Square{}, &witness, ecc.BN254.ScalarField()) - assert.NoError(err) -} - -type e3Inverse struct { - A, B E3 -} - -func (circuit *e3Inverse) Define(api frontend.API) error { - e := NewExt3(api) - expected := e.Inverse(&circuit.A) - e.AssertIsEqual(expected, &circuit.B) - return nil -} - -func TestInverseFp3(t *testing.T) { - assert := test.NewAssert(t) - // witness values - var a, b bw6761.E3 - _, _ = a.SetRandom() - b.Inverse(&a) - - witness := e3Inverse{ - A: FromE3(&a), - B: FromE3(&b), - } - - // add=50605 equals=769 fromBinary=0 mul=50315 sub=558 toBinary=0 - err := test.IsSolved(&e3Inverse{}, &witness, ecc.BN254.ScalarField()) - assert.NoError(err) -} - -type e3Div struct { - A, B, C E3 -} - -func (circuit *e3Div) Define(api frontend.API) error { - e := NewExt3(api) - expected := e.DivUnchecked(&circuit.A, &circuit.B) - e.AssertIsEqual(expected, &circuit.C) - return nil -} - -func TestDivFp3(t *testing.T) { - - assert := test.NewAssert(t) - // witness values - var a, b, c bw6761.E3 - _, _ = a.SetRandom() - _, _ = b.SetRandom() - c.Inverse(&b) - c.Mul(&a, &c) - - witness := e3Div{ - A: FromE3(&a), - B: FromE3(&b), - C: FromE3(&c), - } - - err := test.IsSolved(&e3Div{}, &witness, ecc.BN254.ScalarField()) - assert.NoError(err) - -} - -type e3Conjugate struct { - A, B E3 -} - -func (circuit *e3Conjugate) Define(api frontend.API) error { - e := NewExt3(api) - expected := e.Conjugate(&circuit.A) - e.AssertIsEqual(expected, &circuit.B) - return nil -} - -func TestConjugateFp3(t *testing.T) { - assert := test.NewAssert(t) - // witness values - var a, b bw6761.E3 - _, _ = a.SetRandom() - b.Conjugate(&a) - - witness := e3Conjugate{ - A: FromE3(&a), - B: FromE3(&b), - } - - err := test.IsSolved(&e3Conjugate{}, &witness, ecc.BN254.ScalarField()) - assert.NoError(err) -} diff --git a/std/algebra/emulated/fields_bw6761/e6.go b/std/algebra/emulated/fields_bw6761/e6.go index be781adcb4..433b92cc5a 100644 --- a/std/algebra/emulated/fields_bw6761/e6.go +++ b/std/algebra/emulated/fields_bw6761/e6.go @@ -8,100 +8,783 @@ import ( "github.com/consensys/gnark/std/math/emulated" ) +type curveF = emulated.Field[emulated.BW6761Fp] +type baseEl = emulated.Element[emulated.BW6761Fp] + type E6 struct { - B0, B1 E3 + A0, A1, A2, A3, A4, A5 baseEl } type Ext6 struct { - *Ext3 + api frontend.API + fp *curveF +} + +func NewExt6(api frontend.API) *Ext6 { + fp, err := emulated.NewField[emulated.BW6761Fp](api) + if err != nil { + panic(err) + } + return &Ext6{ + api: api, + fp: fp, + } } func (e Ext6) Reduce(x *E6) *E6 { var z E6 - z.B0 = *e.Ext3.Reduce(&x.B0) - z.B1 = *e.Ext3.Reduce(&x.B1) + z.A0 = *e.fp.Reduce(&x.A0) + z.A1 = *e.fp.Reduce(&x.A1) + z.A2 = *e.fp.Reduce(&x.A2) + z.A3 = *e.fp.Reduce(&x.A3) + z.A4 = *e.fp.Reduce(&x.A4) + z.A5 = *e.fp.Reduce(&x.A5) return &z } -func NewExt6(api frontend.API) *Ext6 { - return &Ext6{Ext3: NewExt3(api)} -} - func (e Ext6) Zero() *E6 { - b0 := e.Ext3.Zero() - b1 := e.Ext3.Zero() + zero := e.fp.Zero() return &E6{ - B0: *b0, - B1: *b1, + A0: *zero, + A1: *zero, + A2: *zero, + A3: *zero, + A4: *zero, + A5: *zero, } } func (e Ext6) One() *E6 { + one := e.fp.One() + zero := e.fp.Zero() + return &E6{ + A0: *one, + A1: *zero, + A2: *zero, + A3: *zero, + A4: *zero, + A5: *zero, + } +} + +func (e Ext6) Neg(x *E6) *E6 { + a0 := e.fp.Neg(&x.A0) + a1 := e.fp.Neg(&x.A1) + a2 := e.fp.Neg(&x.A2) + a3 := e.fp.Neg(&x.A3) + a4 := e.fp.Neg(&x.A4) + a5 := e.fp.Neg(&x.A5) return &E6{ - B0: *e.Ext3.One(), - B1: *e.Ext3.Zero(), + A0: *a0, + A1: *a1, + A2: *a2, + A3: *a3, + A4: *a4, + A5: *a5, } } func (e Ext6) Add(x, y *E6) *E6 { + a0 := e.fp.Add(&x.A0, &y.A0) + a1 := e.fp.Add(&x.A1, &y.A1) + a2 := e.fp.Add(&x.A2, &y.A2) + a3 := e.fp.Add(&x.A3, &y.A3) + a4 := e.fp.Add(&x.A4, &y.A4) + a5 := e.fp.Add(&x.A5, &y.A5) return &E6{ - B0: *e.Ext3.Add(&x.B0, &y.B0), - B1: *e.Ext3.Add(&x.B1, &y.B1), + A0: *a0, + A1: *a1, + A2: *a2, + A3: *a3, + A4: *a4, + A5: *a5, } } func (e Ext6) Sub(x, y *E6) *E6 { + a0 := e.fp.Sub(&x.A0, &y.A0) + a1 := e.fp.Sub(&x.A1, &y.A1) + a2 := e.fp.Sub(&x.A2, &y.A2) + a3 := e.fp.Sub(&x.A3, &y.A3) + a4 := e.fp.Sub(&x.A4, &y.A4) + a5 := e.fp.Sub(&x.A5, &y.A5) return &E6{ - B0: *e.Ext3.Sub(&x.B0, &y.B0), - B1: *e.Ext3.Sub(&x.B1, &y.B1), + A0: *a0, + A1: *a1, + A2: *a2, + A3: *a3, + A4: *a4, + A5: *a5, } } func (e Ext6) Double(x *E6) *E6 { + two := big.NewInt(2) + a0 := e.fp.MulConst(&x.A0, two) + a1 := e.fp.MulConst(&x.A1, two) + a2 := e.fp.MulConst(&x.A2, two) + a3 := e.fp.MulConst(&x.A3, two) + a4 := e.fp.MulConst(&x.A4, two) + a5 := e.fp.MulConst(&x.A5, two) + return &E6{ + A0: *a0, + A1: *a1, + A2: *a2, + A3: *a3, + A4: *a4, + A5: *a5, + } +} + +func (e Ext6) MulByElement(x *E6, y *baseEl) *E6 { + a0 := e.fp.Mul(&x.A0, y) + a1 := e.fp.Mul(&x.A1, y) + a2 := e.fp.Mul(&x.A2, y) + a3 := e.fp.Mul(&x.A3, y) + a4 := e.fp.Mul(&x.A4, y) + a5 := e.fp.Mul(&x.A5, y) + z := &E6{ + A0: *a0, + A1: *a1, + A2: *a2, + A3: *a3, + A4: *a4, + A5: *a5, + } + return z +} + +func (e Ext6) MulByConstElement(x *E6, y *big.Int) *E6 { + a0 := e.fp.MulConst(&x.A0, y) + a1 := e.fp.MulConst(&x.A1, y) + a2 := e.fp.MulConst(&x.A2, y) + a3 := e.fp.MulConst(&x.A3, y) + a4 := e.fp.MulConst(&x.A4, y) + a5 := e.fp.MulConst(&x.A5, y) + return &E6{ + A0: *a0, + A1: *a1, + A2: *a2, + A3: *a3, + A4: *a4, + A5: *a5, + } +} + +func (e Ext6) Conjugate(x *E6) *E6 { return &E6{ - B0: *e.Ext3.Double(&x.B0), - B1: *e.Ext3.Double(&x.B1), + A0: x.A0, + A1: *e.fp.Neg(&x.A1), + A2: x.A2, + A3: *e.fp.Neg(&x.A3), + A4: x.A4, + A5: *e.fp.Neg(&x.A5), } } +func (e Ext6) mulFpByNonResidue(fp *curveF, x *baseEl) *baseEl { + + z := fp.Neg(x) + z = fp.MulConst(z, big.NewInt(4)) + return z +} + func (e Ext6) Mul(x, y *E6) *E6 { x = e.Reduce(x) y = e.Reduce(y) + return e.mulToomCook6(x, y) +} - a := e.Ext3.Add(&x.B0, &x.B1) - b := e.Ext3.Add(&y.B0, &y.B1) - a = e.Ext3.Mul(a, b) - b = e.Ext3.Mul(&x.B0, &y.B0) - c := e.Ext3.Mul(&x.B1, &y.B1) - b1 := e.Ext3.Sub(a, b) - b1 = e.Ext3.Sub(b1, c) - b0 := e.Ext3.MulByNonResidue(c) - b0 = e.Ext3.Add(b0, b) +func (e Ext6) mulMontgomery6(x, y *E6) *E6 { + // Ref.: Peter L. Montgomery. Five, six, and seven-term Karatsuba-like formulae. IEEE + // Transactions on Computers, 54(3):362–369, 2005. + // + // Fixing the polynomial C to X^6 we first compute the interpolation points + // vi = x(Xi)*y(Xi) at Xi={0, ±1, ±2, ±3, ±4, 5,∞}: + // + // v0 = (a0 + a1 + a2 + a3 + a4 + a5)(b0 + b1 + b2 + b3 + b4 + b5) + // v2 = (a0 + a1 + a3 + a4)(b0 + b1 + b3 + b4) + // v3 = (a0 − a2 − a3 + a5)(b0 − b2 − b3 + b5) + // v4 = (a0 − a2 − a5)(b0 − b2 − b5) + // v5 = (a0 + a3 − a5)(b0 + b3 − b5) + // v6 = (a0 + a1 + a2)(b0 + b1 + b2) + // v7 = (a3 + a4 + a5)(b3 + b4 + b5) + // v8 = (a2 + a3)(b2 + b3) + // v9 = (a1 − a4)(b1 − b4) + // v10 = (a1 + a2)(b1 + b2) + // v11 = (a3 + a4)(b3 + b4) + // v12 = (a0 + a1)(b0 + b1) + // v13 = (a4 + a5)(b4 + b5) + // v14 = a0b0 + // v15 = a1b1 + // v16 = a4b4 + // v17 = a5b5 + _t0 := e.fp.Add(&x.A0, &x.A1) + t0 := e.fp.Add(_t0, &x.A2) + t1 := e.fp.Add(&x.A3, &x.A4) + t2 := e.fp.Add(_t0, t1) + t3 := e.fp.Add(t2, &x.A5) + t3 = e.fp.Add(t3, &x.A2) + + _s0 := e.fp.Add(&y.A0, &y.A1) + s0 := e.fp.Add(_s0, &y.A2) + s1 := e.fp.Add(&y.A3, &y.A4) + s2 := e.fp.Add(_s0, s1) + s3 := e.fp.Add(s2, &y.A5) + s3 = e.fp.Add(s3, &y.A2) + + v0 := e.fp.Mul(t3, s3) + v2 := e.fp.Mul(t2, s2) + v6 := e.fp.Mul(t0, s0) + t4 := e.fp.Add(t1, &x.A5) + s4 := e.fp.Add(s1, &y.A5) + v7 := e.fp.Mul(t4, s4) + v12 := e.fp.Mul(_t0, _s0) + v11 := e.fp.Mul(t1, s1) + t0 = e.fp.Add(&x.A2, &x.A3) + s0 = e.fp.Add(&y.A2, &y.A3) + v8 := e.fp.Mul(t0, s0) + _t0 = e.fp.Sub(&x.A1, &x.A4) + _s0 = e.fp.Sub(&y.A1, &y.A4) + v9 := e.fp.Mul(_t0, _s0) + t1 = e.fp.Add(&x.A1, &x.A2) + s1 = e.fp.Add(&y.A1, &y.A2) + v10 := e.fp.Mul(t1, s1) + t1 = e.fp.Add(&x.A4, &x.A5) + s1 = e.fp.Add(&y.A4, &y.A5) + v13 := e.fp.Mul(t1, s1) + v3 := e.fp.Add(&x.A0, &x.A5) + v3 = e.fp.Sub(v3, t0) + s1 = e.fp.Add(&y.A0, &y.A5) + s1 = e.fp.Sub(s1, s0) + v3 = e.fp.Mul(v3, s1) + t1 = e.fp.Add(&x.A2, &x.A5) + t2 = e.fp.Sub(&x.A0, t1) + s1 = e.fp.Add(&y.A2, &y.A5) + s2 = e.fp.Sub(&y.A0, s1) + v4 := e.fp.Mul(t2, s2) + t1 = e.fp.Add(&x.A0, &x.A3) + t1 = e.fp.Sub(t1, &x.A5) + s1 = e.fp.Add(&y.A0, &y.A3) + s1 = e.fp.Sub(s1, &y.A5) + v5 := e.fp.Mul(t1, s1) + v14 := e.fp.Mul(&x.A0, &y.A0) + v15 := e.fp.Mul(&x.A1, &y.A1) + v16 := e.fp.Mul(&x.A4, &y.A4) + v17 := e.fp.Mul(&x.A5, &y.A5) + + // Then we compute the coefficients c0,c1,c3,c4 and c5 in the direct sextic + // extension of the product x*y as follows: + // + // c0 = v14 + β(v0 − v2 + v4 + 2(v3+v5+v6-v12) + 3(v7+v15-v8-v10-v11) + + // 4(v16-v13) − 5(v14+v17)) + // + // c1 = v12 − (v14 + v15) + β(v8 + v10 + v12 − (v3 + v5 + v6 + v15) + + // 2(v14 + v17 + v13 - v7) + 3(v11 - v16)) + // + // c2 = 2v15 + v6 − (v10 + v12) + β(2v16 + v7 − (v11 + v13)) + // + // c3 = v8 + v11 + v13 − (v3 + v4 + v7 + v16) + 3(v10 - v15) + 2(v12 + v14 + // + v17 - v6) + β(v13 − (v16 + v17)) + // + // c4 = v2 + v3 + v4 + v7 + v15 + v9 − (v8 + v13) − 3v12 + 2(v6 − (v17 + + // v10 + v11 + v14)) + βv17 + // + // c5 = −(v3 + v4 + v5 + v9 + v15 + v16) + 2(v8 + v10 + v11 + v12 + v13 − + // (v6 + v7)) + 3(v14 + v17) + + c0 := e.fp.MulConst(v2, big.NewInt(4)) + s811 := e.fp.Add(v8, v11) + s81110 := e.fp.Add(s811, v10) + s1 = e.fp.MulConst(s81110, big.NewInt(12)) + c0 = e.fp.Add(c0, s1) + s1 = e.fp.MulConst(v12, big.NewInt(8)) + c0 = e.fp.Add(c0, s1) + s1 = e.fp.MulConst(v13, big.NewInt(16)) + c0 = e.fp.Add(c0, s1) + s1 = e.fp.MulConst(v14, big.NewInt(21)) + c0 = e.fp.Add(c0, s1) + s1 = e.fp.MulConst(v17, big.NewInt(20)) + c0 = e.fp.Add(c0, s1) + s1 = e.fp.MulConst(v15, big.NewInt(12)) + s2 = e.fp.MulConst(v16, big.NewInt(16)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v0, big.NewInt(4)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v3, big.NewInt(8)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v4, big.NewInt(4)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v5, big.NewInt(8)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v6, big.NewInt(8)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v7, big.NewInt(12)) + s1 = e.fp.Add(s1, s2) + c0 = e.fp.Sub(c0, s1) + + s35 := e.fp.Add(v3, v5) + c1 := e.fp.Add(s35, v6) + c1 = e.fp.MulConst(c1, big.NewInt(4)) + s1 = e.fp.MulConst(v7, big.NewInt(8)) + c1 = e.fp.Add(c1, s1) + s1 = e.fp.MulConst(v16, big.NewInt(12)) + c1 = e.fp.Add(c1, s1) + s1 = e.fp.MulConst(v15, big.NewInt(3)) + c1 = e.fp.Add(c1, s1) + s1 = e.fp.MulConst(v12, big.NewInt(3)) + s2 = e.fp.MulConst(v14, big.NewInt(9)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v8, big.NewInt(4)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v10, big.NewInt(4)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v11, big.NewInt(12)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v13, big.NewInt(8)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v17, big.NewInt(8)) + s1 = e.fp.Add(s1, s2) + c1 = e.fp.Sub(c1, s1) + + c2 := e.fp.MulConst(v15, big.NewInt(2)) + c2 = e.fp.Add(c2, v6) + s1 = e.fp.MulConst(v11, big.NewInt(4)) + c2 = e.fp.Add(c2, s1) + s1 = e.fp.MulConst(v13, big.NewInt(4)) + c2 = e.fp.Add(c2, s1) + s1012 := e.fp.Add(v10, v12) + s2 = e.fp.MulConst(v7, big.NewInt(4)) + s1 = e.fp.Add(s1012, s2) + s2 = e.fp.MulConst(v16, big.NewInt(8)) + s1 = e.fp.Add(s1, s2) + c2 = e.fp.Sub(c2, s1) + + s1 = e.fp.MulConst(v10, big.NewInt(3)) + c3 := e.fp.Add(s811, s1) + s1 = e.fp.MulConst(v12, big.NewInt(2)) + c3 = e.fp.Add(c3, s1) + s1 = e.fp.MulConst(v14, big.NewInt(2)) + c3 = e.fp.Add(c3, s1) + s1 = e.fp.MulConst(v16, big.NewInt(3)) + c3 = e.fp.Add(c3, s1) + s1 = e.fp.MulConst(v17, big.NewInt(6)) + c3 = e.fp.Add(c3, s1) + s34 := e.fp.Add(v3, v4) + s1 = e.fp.Add(s34, v7) + s2 = e.fp.MulConst(v6, big.NewInt(2)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v13, big.NewInt(3)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v15, big.NewInt(3)) + s1 = e.fp.Add(s1, s2) + c3 = e.fp.Sub(c3, s1) + + c4 := e.fp.Add(v2, v15) + c4 = e.fp.Add(c4, v9) + c4 = e.fp.Add(c4, v7) + c4 = e.fp.Add(c4, s34) + s1 = e.fp.MulConst(v6, big.NewInt(2)) + c4 = e.fp.Add(c4, s1) + s1 = e.fp.Add(v13, v8) + s2 = e.fp.MulConst(v10, big.NewInt(2)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v11, big.NewInt(2)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v12, big.NewInt(3)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v14, big.NewInt(2)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v17, big.NewInt(6)) + s1 = e.fp.Add(s1, s2) + c4 = e.fp.Sub(c4, s1) + + c5 := e.fp.Add(s81110, v12) + c5 = e.fp.Add(c5, v13) + c5 = e.fp.MulConst(c5, big.NewInt(2)) + s1 = e.fp.MulConst(v14, big.NewInt(3)) + c5 = e.fp.Add(c5, s1) + s1 = e.fp.MulConst(v17, big.NewInt(3)) + c5 = e.fp.Add(c5, s1) + s1 = e.fp.Add(v15, v16) + s1 = e.fp.Add(s1, s34) + s1 = e.fp.Add(s1, v5) + s1 = e.fp.Add(s1, v9) + s2 = e.fp.MulConst(v6, big.NewInt(2)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v7, big.NewInt(2)) + s1 = e.fp.Add(s1, s2) + c5 = e.fp.Sub(c5, s1) return &E6{ - B0: *b0, - B1: *b1, + A0: *c0, + A1: *c1, + A2: *c2, + A3: *c3, + A4: *c4, + A5: *c5, } } -func (e Ext6) Square(x *E6) *E6 { +func (e Ext6) mulToomCook6(x, y *E6) *E6 { + // Toom-Cook 6-way multiplication: + // + // Ref.: https://eprint.iacr.org/2006/471.pdf + // ⚠️ but has sign errors in c1 and coefficient errors in c3 and c4. + // + // We first represent a, b as the polynomials: + // x(X) = a0 + a1*X + a2*X^2 + a3*X^3 + a4*X^4 + a5*X^5 + // y(X) = b0 + b1*X + b2*X^2 + b3*X^3 + b4*X^4 + b5*X^5 + // + // and we compute the interpolation points + // vi = a(Xi)*b(Xi) at Xi={0, ±1, ±2, ±3, ±4, 5, ∞}: + // + // v0 = x(0)y(0) = x0y0 + // v1 = x(1)y(1) = (x0 + x1 + x2 + x3 + x4 + x5)(y0 + y1 + y2 + y3 + y4 + y5) + // v2 = x(-1)y(-1) = (x0 - x1 + x2 - x3 + x4 - x5)(y0 - y1 + y2 - y3 + y4 - y5) + // v3 = x(2)y(2) = (x0 + 2x1 + 4x2 + 8x3 + 16x4 + 32x5)(y0 + 2y1 + 4y2 + 8y3 + 16y4 + 32y5) + // v4 = x(-2)y(-2) = (x0 - 2x1 + 4x2 - 8x3 + 16x4 - 32x5)(y0 - 2y1 + 4y2 - 8y3 + 16y4 - 32y5) + // v5 = x(3)y(3) = (x0 + 3x1 + 9x2 + 27x3 + 81x4 + 243x5)(y0 + 3y1 + 9y2 + 27y3 + 81y4 + 243y5) + // v6 = x(-3)y(-3) = (x0 - 3x1 + 9x2 - 27x3 + 81x4 - 243x5)(y0 - 3y1 + 9y2 - 27y3 + 81y4 - 243y5) + // v7 = x(4)y(4) = (x0 + 4x1 + 16x2 + 64x3 + 256x4 + 1024x5)(y0 + 4y1 + 16y2 + 64y3 + 256y4 + 1024y5) + // v8 = x(-4)y(-4) = (x0 - 4x1 + 16x2 - 64x3 + 256x4 - 1024x5)(y0 - 4y1 + 16y2 - 64y3 + 256y4 - 1024y5) + // v9 = x(5)y(5) = (x0 + 5x1 + 25x2 + 125x3 + 625x4 + 3125x5)(y0 + 5y1 + 25y2 + 125y3 + 625y4 + 3125y5) + // v10 = x(∞)y(∞) = x5y5 + + v0 := e.fp.Mul(&x.A0, &y.A0) + + t1 := e.fp.Add(&x.A0, &x.A2) + t1 = e.fp.Add(t1, &x.A4) + s1 := e.fp.Add(&y.A0, &y.A2) + s1 = e.fp.Add(s1, &y.A4) + t2 := e.fp.Add(&x.A1, &x.A3) + t2 = e.fp.Add(t2, &x.A5) + s2 := e.fp.Add(&y.A1, &y.A3) + s2 = e.fp.Add(s2, &y.A5) + + v1 := e.fp.Add(t1, t2) + s3 := e.fp.Add(s1, s2) + v1 = e.fp.Mul(v1, s3) + + v2 := e.fp.Sub(t1, t2) + s3 = e.fp.Sub(s1, s2) + v2 = e.fp.Mul(v2, s3) + + t1 = e.fp.MulConst(&x.A2, big.NewInt(4)) + t1 = e.fp.Add(&x.A0, t1) + t := e.fp.MulConst(&x.A4, big.NewInt(16)) + t1 = e.fp.Add(t1, t) + t2 = e.fp.MulConst(&x.A1, big.NewInt(2)) + t = e.fp.MulConst(&x.A3, big.NewInt(8)) + t2 = e.fp.Add(t2, t) + t = e.fp.MulConst(&x.A5, big.NewInt(32)) + t2 = e.fp.Add(t2, t) + s1 = e.fp.MulConst(&y.A2, big.NewInt(4)) + s1 = e.fp.Add(&y.A0, s1) + s := e.fp.MulConst(&y.A4, big.NewInt(16)) + s1 = e.fp.Add(s1, s) + s2 = e.fp.MulConst(&y.A1, big.NewInt(2)) + s = e.fp.MulConst(&y.A3, big.NewInt(8)) + s2 = e.fp.Add(s2, s) + s = e.fp.MulConst(&y.A5, big.NewInt(32)) + s2 = e.fp.Add(s2, s) + + v3 := e.fp.Add(t1, t2) + s3 = e.fp.Add(s1, s2) + v3 = e.fp.Mul(v3, s3) + + v4 := e.fp.Sub(t1, t2) + s3 = e.fp.Sub(s1, s2) + v4 = e.fp.Mul(v4, s3) + + t1 = e.fp.MulConst(&x.A2, big.NewInt(9)) + t1 = e.fp.Add(&x.A0, t1) + t = e.fp.MulConst(&x.A4, big.NewInt(81)) + t1 = e.fp.Add(t1, t) + t2 = e.fp.MulConst(&x.A1, big.NewInt(3)) + t = e.fp.MulConst(&x.A3, big.NewInt(27)) + t2 = e.fp.Add(t2, t) + t = e.fp.MulConst(&x.A5, big.NewInt(243)) + t2 = e.fp.Add(t2, t) + s1 = e.fp.MulConst(&y.A2, big.NewInt(9)) + s1 = e.fp.Add(&y.A0, s1) + s = e.fp.MulConst(&y.A4, big.NewInt(81)) + s1 = e.fp.Add(s1, s) + s2 = e.fp.MulConst(&y.A1, big.NewInt(3)) + s = e.fp.MulConst(&y.A3, big.NewInt(27)) + s2 = e.fp.Add(s2, s) + s = e.fp.MulConst(&y.A5, big.NewInt(243)) + s2 = e.fp.Add(s2, s) + + v5 := e.fp.Add(t1, t2) + s3 = e.fp.Add(s1, s2) + v5 = e.fp.Mul(v5, s3) + + v6 := e.fp.Sub(t1, t2) + s3 = e.fp.Sub(s1, s2) + v6 = e.fp.Mul(v6, s3) + + t1 = e.fp.MulConst(&x.A2, big.NewInt(16)) + t1 = e.fp.Add(&x.A0, t1) + t = e.fp.MulConst(&x.A4, big.NewInt(256)) + t1 = e.fp.Add(t1, t) + t2 = e.fp.MulConst(&x.A1, big.NewInt(4)) + t = e.fp.MulConst(&x.A3, big.NewInt(64)) + t2 = e.fp.Add(t2, t) + t = e.fp.MulConst(&x.A5, big.NewInt(1024)) + t2 = e.fp.Add(t2, t) + s1 = e.fp.MulConst(&y.A2, big.NewInt(16)) + s1 = e.fp.Add(&y.A0, s1) + s = e.fp.MulConst(&y.A4, big.NewInt(256)) + s1 = e.fp.Add(s1, s) + s2 = e.fp.MulConst(&y.A1, big.NewInt(4)) + s = e.fp.MulConst(&y.A3, big.NewInt(64)) + s2 = e.fp.Add(s2, s) + s = e.fp.MulConst(&y.A5, big.NewInt(1024)) + s2 = e.fp.Add(s2, s) + + v7 := e.fp.Add(t1, t2) + s3 = e.fp.Add(s1, s2) + v7 = e.fp.Mul(v7, s3) + + v8 := e.fp.Sub(t1, t2) + s3 = e.fp.Sub(s1, s2) + v8 = e.fp.Mul(v8, s3) + + t1 = e.fp.MulConst(&x.A2, big.NewInt(25)) + t1 = e.fp.Add(&x.A0, t1) + t = e.fp.MulConst(&x.A4, big.NewInt(625)) + t1 = e.fp.Add(t1, t) + t2 = e.fp.MulConst(&x.A1, big.NewInt(5)) + t = e.fp.MulConst(&x.A3, big.NewInt(125)) + t2 = e.fp.Add(t2, t) + t = e.fp.MulConst(&x.A5, big.NewInt(3125)) + t2 = e.fp.Add(t2, t) + s1 = e.fp.MulConst(&y.A2, big.NewInt(25)) + s1 = e.fp.Add(&y.A0, s1) + s = e.fp.MulConst(&y.A4, big.NewInt(625)) + s1 = e.fp.Add(s1, s) + s2 = e.fp.MulConst(&y.A1, big.NewInt(5)) + s = e.fp.MulConst(&y.A3, big.NewInt(125)) + s2 = e.fp.Add(s2, s) + s = e.fp.MulConst(&y.A5, big.NewInt(3125)) + s2 = e.fp.Add(s2, s) + v9 := e.fp.Add(t1, t2) + s3 = e.fp.Add(s1, s2) + v9 = e.fp.Mul(v9, s3) + + v10 := e.fp.Mul(&x.A5, &y.A5) + + // recording common sub-expressions + v12 := e.fp.Add(v1, v2) + v34 := e.fp.Add(v3, v4) + v56 := e.fp.Add(v5, v6) + v78 := e.fp.Add(v7, v8) + + // Then we compute the product 362880 * x * y to avoid divisions (mul by large coeffs): + // + // c0 = 438480 v0 + 26208(v3 + v4) + 504(v7 + v8) + // - (58464(v1 + v2) + 6048(v5 + v6) + 396264960 v10) + c0 := e.fp.MulConst(v0, big.NewInt(438480)) + s1 = e.fp.MulConst(v34, big.NewInt(26208)) + c0 = e.fp.Add(c0, s1) + s1 = e.fp.MulConst(v78, big.NewInt(504)) + c0 = e.fp.Add(c0, s1) + s1 = e.fp.MulConst(v12, big.NewInt(58464)) + s2 = e.fp.MulConst(v56, big.NewInt(6048)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v10, big.NewInt(396264960)) + s1 = e.fp.Add(s1, s2) + c0 = e.fp.Sub(c0, s1) + // c1 = 744 v8 + 696 v9 + 49536 v4 + 39744 v5 + 380016 v1 + // − (87696 v0 + 226800 v2 + 133056 v3 + 8424* v6 + 7704 v7 + 1262822400 v10) + c1 := e.fp.MulConst(v8, big.NewInt(744)) + s1 = e.fp.MulConst(v9, big.NewInt(696)) + c1 = e.fp.Add(c1, s1) + s1 = e.fp.MulConst(v4, big.NewInt(49536)) + c1 = e.fp.Add(c1, s1) + s1 = e.fp.MulConst(v5, big.NewInt(39744)) + c1 = e.fp.Add(c1, s1) + s1 = e.fp.MulConst(v1, big.NewInt(380016)) + c1 = e.fp.Add(c1, s1) + s1 = e.fp.MulConst(v0, big.NewInt(87696)) + s2 = e.fp.MulConst(v2, big.NewInt(233856)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v3, big.NewInt(133056)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v6, big.NewInt(8424)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v7, big.NewInt(7704)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v10, big.NewInt(1262822400)) + s1 = e.fp.Add(s1, s2) + c1 = e.fp.Sub(c1, s1) + // c2 = 4896(v5 + v6) + 292320(v1 + v2) + 252564480 v10 + // − (519120 v0 + 360(v7 + v8) + 37296(v3 + v4)) + c2 := e.fp.MulConst(v56, big.NewInt(4896)) + s1 = e.fp.MulConst(v12, big.NewInt(292320)) + c2 = e.fp.Add(c2, s1) + s1 = e.fp.MulConst(v10, big.NewInt(252564480)) + c2 = e.fp.Add(c2, s1) + s1 = e.fp.MulConst(v0, big.NewInt(519120)) + s2 = e.fp.MulConst(v78, big.NewInt(360)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v34, big.NewInt(37296)) + s1 = e.fp.Add(s1, s2) + c2 = e.fp.Sub(c2, s1) + // c3 = 103824 v0 + 1495065600 v10 + 10728 v6 + 9180 v7 + 53760 v2 + 154392 v3 + // - (55512 v4 + 47808* v5 + 940 v8 + 824* v9 + 226800* v1) + c3 := e.fp.MulConst(v0, big.NewInt(103824)) + s1 = e.fp.MulConst(v10, big.NewInt(1495065600)) + c3 = e.fp.Add(c3, s1) + s1 = e.fp.MulConst(v6, big.NewInt(10728)) + c3 = e.fp.Add(c3, s1) + s1 = e.fp.MulConst(v7, big.NewInt(9180)) + c3 = e.fp.Add(c3, s1) + s1 = e.fp.MulConst(v2, big.NewInt(53760)) + c3 = e.fp.Add(c3, s1) + s1 = e.fp.MulConst(v3, big.NewInt(154392)) + c3 = e.fp.Add(c3, s1) + s1 = e.fp.MulConst(v4, big.NewInt(55512)) + s2 = e.fp.MulConst(v5, big.NewInt(47808)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v8, big.NewInt(940)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v9, big.NewInt(824)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v1, big.NewInt(226800)) + s1 = e.fp.Add(s1, s2) + c3 = e.fp.Sub(c3, s1) + // c4 = 171990 v0 + 42588(v3 + v4) + 441* (v7 + v8) + // − (299013120 v10 + 122976(v1 + v2) + 6048(v5 + v6)) + c4 := e.fp.MulConst(v0, big.NewInt(171990)) + s1 = e.fp.MulConst(v34, big.NewInt(42588)) + c4 = e.fp.Add(c4, s1) + s1 = e.fp.MulConst(v78, big.NewInt(441)) + c4 = e.fp.Add(c4, s1) + s1 = e.fp.MulConst(v10, big.NewInt(299013120)) + s2 = e.fp.MulConst(v12, big.NewInt(122976)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v56, big.NewInt(6048)) + s1 = e.fp.Add(s1, s2) + c4 = e.fp.Sub(c4, s1) + // c5 = 231 v8 + 273 v9 + 3276 v4 + 8316 v2 + 14364 v5 + 49014 v1 + // - (34398 v0 + 36036 v3 + 2079 v6 + 2961 v7 + 495331200 v10) + c5 := e.fp.MulConst(v8, big.NewInt(231)) + s1 = e.fp.MulConst(v9, big.NewInt(273)) + c5 = e.fp.Add(c5, s1) + s1 = e.fp.MulConst(v4, big.NewInt(3276)) + c5 = e.fp.Add(c5, s1) + s1 = e.fp.MulConst(v2, big.NewInt(8316)) + c5 = e.fp.Add(c5, s1) + s1 = e.fp.MulConst(v5, big.NewInt(14364)) + c5 = e.fp.Add(c5, s1) + s1 = e.fp.MulConst(v1, big.NewInt(49014)) + c5 = e.fp.Add(c5, s1) + s1 = e.fp.MulConst(v0, big.NewInt(34398)) + s2 = e.fp.MulConst(v3, big.NewInt(36036)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v6, big.NewInt(2079)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v7, big.NewInt(2961)) + s1 = e.fp.Add(s1, s2) + s2 = e.fp.MulConst(v10, big.NewInt(495331200)) + s1 = e.fp.Add(s1, s2) + c5 = e.fp.Sub(c5, s1) + + res := e.divE6By362880([6]*baseEl{c0, c1, c2, c3, c4, c5}) + return &E6{ + A0: *res[0], + A1: *res[1], + A2: *res[2], + A3: *res[3], + A4: *res[4], + A5: *res[5], + } +} +func (e Ext6) Square(x *E6) *E6 { + // We don't use Montgomery-6 or Toom-Cook-6 for the squaring but instead we + // simulate a quadratic over cubic extension tower because Karatsuba over + // Chung-Hasan SQR2 is better constraint wise. + // + // Algorithm 22 from https://eprint.iacr.org/2010/354.pdf x = e.Reduce(x) - //Algorithm 22 from https://eprint.iacr.org/2010/354.pdf - c0 := e.Ext3.Sub(&x.B0, &x.B1) - c3 := e.Ext3.MulByNonResidue(&x.B1) - c3 = e.Ext3.Neg(c3) - c3 = e.Ext3.Add(&x.B0, c3) - c2 := e.Ext3.Mul(&x.B0, &x.B1) - c0 = e.Ext3.Mul(c0, c3) - c0 = e.Ext3.Add(c0, c2) - b1 := e.Ext3.Double(c2) - c2 = e.Ext3.MulByNonResidue(c2) - b0 := e.Ext3.Add(c0, c2) + + // c0 + x1n := e.fp.Neg(&x.A1) + x3n := e.fp.Neg(&x.A3) + c00 := e.fp.Add(&x.A0, x1n) + c01 := e.fp.Add(&x.A2, x3n) + c02 := e.fp.Sub(&x.A4, &x.A5) + + // c3 + c30 := e.fp.Add(&x.A0, e.fp.MulConst(&x.A5, big.NewInt(4))) + c31 := e.fp.Add(&x.A2, x1n) + c32 := e.fp.Add(&x.A4, x3n) + + t0 := e.fp.Mul(&x.A0, &x.A1) + t1 := e.fp.Mul(&x.A2, &x.A3) + t2 := e.fp.Mul(&x.A4, &x.A5) + c0 := e.fp.Add(&x.A2, &x.A4) + tmp := e.fp.Add(&x.A3, &x.A5) + c0 = e.fp.Mul(c0, tmp) + c0 = e.fp.Sub(e.fp.Add(t1, t2), c0) + c0 = e.fp.MulConst(c0, big.NewInt(4)) + tmp = e.fp.Add(&x.A0, &x.A4) + c2 := e.fp.Add(&x.A1, &x.A5) + c2 = e.fp.Mul(c2, tmp) + c2 = e.fp.Sub(c2, e.fp.Add(t0, t2)) + c1 := e.fp.Add(&x.A0, &x.A2) + tmp = e.fp.Add(&x.A1, &x.A3) + c1 = e.fp.Mul(c1, tmp) + c1 = e.fp.Sub(c1, e.fp.Add(t0, t1)) + t2 = e.mulFpByNonResidue(e.fp, t2) + // c2 + c20 := e.fp.Add(c0, t0) + c21 := e.fp.Add(c1, t2) + c22 := e.fp.Add(c2, t1) + + t0 = e.fp.Mul(c00, c30) + t1 = e.fp.Mul(c01, c31) + t2 = e.fp.Mul(c02, c32) + c0 = e.fp.Add(c01, c02) + tmp = e.fp.Add(c31, c32) + c0 = e.fp.Mul(c0, tmp) + c0 = e.fp.Sub(e.fp.Add(t1, t2), c0) + c0 = e.fp.MulConst(c0, big.NewInt(4)) + tmp = e.fp.Add(c00, c02) + c2 = e.fp.Add(c30, c32) + c2 = e.fp.Mul(c2, tmp) + c2 = e.fp.Sub(c2, e.fp.Add(t0, t2)) + c1 = e.fp.Add(c00, c01) + tmp = e.fp.Add(c30, c31) + c1 = e.fp.Mul(c1, tmp) + c1 = e.fp.Sub(c1, e.fp.Add(t0, t1)) + t2 = e.mulFpByNonResidue(e.fp, t2) + c00 = e.fp.Add(c0, t0) + c01 = e.fp.Add(c1, t2) + c02 = e.fp.Add(c2, t1) + + c00 = e.fp.Add(c00, c20) + c01 = e.fp.Add(c01, c21) + c02 = e.fp.Add(c02, c22) + + b10 := e.fp.MulConst(c20, big.NewInt(2)) + b11 := e.fp.MulConst(c21, big.NewInt(2)) + b12 := e.fp.MulConst(c22, big.NewInt(2)) + + b00 := e.fp.Sub(c00, e.fp.MulConst(c22, big.NewInt(4))) + b01 := e.fp.Add(c01, c20) + b02 := e.fp.Add(c02, c21) return &E6{ - B0: *b0, - B1: *b1, + A0: *b00, + A1: *b10, + A2: *b01, + A3: *b11, + A4: *b02, + A5: *b12, } } @@ -112,62 +795,58 @@ func (e Ext6) CyclotomicSquareKarabina12345(x *E6) *E6 { x = e.Reduce(x) // h4 = -g4 + 3((g3+g5)(g1+c*g2)-g1g5-c*g3g2) - g1g5 := e.fp.Mul(&x.B0.A1, &x.B1.A2) - g3g2 := e.fp.Mul(&x.B1.A0, &x.B0.A2) - h4 := mulFpByNonResidue(e.fp, &x.B0.A2) - h4 = e.fp.Add(h4, &x.B0.A1) - t := e.fp.Add(&x.B1.A0, &x.B1.A2) + g1g5 := e.fp.Mul(&x.A2, &x.A5) + g3g2 := e.fp.Mul(&x.A1, &x.A4) + h4 := e.mulFpByNonResidue(e.fp, &x.A4) + h4 = e.fp.Add(h4, &x.A2) + t := e.fp.Add(&x.A1, &x.A5) h4 = e.fp.Mul(h4, t) h4 = e.fp.Sub(h4, g1g5) t = e.fp.MulConst(g3g2, big.NewInt(4)) h4 = e.fp.Add(h4, t) h4 = e.fp.MulConst(h4, big.NewInt(3)) - h4 = e.fp.Sub(h4, &x.B1.A1) + h4 = e.fp.Sub(h4, &x.A3) // h3 = 2(g3+3c*g1g5) - h3 := mulFpByNonResidue(e.fp, g1g5) + h3 := e.mulFpByNonResidue(e.fp, g1g5) h3 = e.fp.MulConst(h3, big.NewInt(3)) - h3 = e.fp.Add(h3, &x.B1.A0) + h3 = e.fp.Add(h3, &x.A1) h3 = e.fp.MulConst(h3, big.NewInt(2)) // h2 = 3((g1+g5)(g1+c*g5)-(c+1)*g1g5)-2g2 - t = mulFpByNonResidue(e.fp, &x.B1.A2) - t = e.fp.Add(t, &x.B0.A1) - h2 := e.fp.Add(&x.B1.A2, &x.B0.A1) + t = e.mulFpByNonResidue(e.fp, &x.A5) + t = e.fp.Add(t, &x.A2) + h2 := e.fp.Add(&x.A5, &x.A2) h2 = e.fp.Mul(h2, t) t = e.fp.MulConst(g1g5, big.NewInt(3)) h2 = e.fp.Add(h2, t) h2 = e.fp.MulConst(h2, big.NewInt(3)) - t = e.fp.MulConst(&x.B0.A2, big.NewInt(2)) + t = e.fp.MulConst(&x.A4, big.NewInt(2)) h2 = e.fp.Sub(h2, t) // h1 = 3((g3+g2)(g3+c*g2)-(c+1)*g3g2)-2g1 - t = mulFpByNonResidue(e.fp, &x.B0.A2) - t = e.fp.Add(t, &x.B1.A0) - h1 := e.fp.Add(&x.B0.A2, &x.B1.A0) + t = e.mulFpByNonResidue(e.fp, &x.A4) + t = e.fp.Add(t, &x.A1) + h1 := e.fp.Add(&x.A4, &x.A1) h1 = e.fp.Mul(h1, t) t = e.fp.MulConst(g3g2, big.NewInt(3)) h1 = e.fp.Add(h1, t) h1 = e.fp.MulConst(h1, big.NewInt(3)) - t = e.fp.MulConst(&x.B0.A1, big.NewInt(2)) + t = e.fp.MulConst(&x.A2, big.NewInt(2)) h1 = e.fp.Sub(h1, t) // h5 = 2(g5+3g3g2) h5 := e.fp.MulConst(g3g2, big.NewInt(3)) - h5 = e.fp.Add(h5, &x.B1.A2) + h5 = e.fp.Add(h5, &x.A5) h5 = e.fp.MulConst(h5, big.NewInt(2)) return &E6{ - B0: E3{ - A0: x.B0.A0, - A1: *h1, - A2: *h2, - }, - B1: E3{ - A0: *h3, - A1: *h4, - A2: *h5, - }, + A0: x.A0, + A1: *h3, + A2: *h1, + A3: *h4, + A4: *h2, + A5: *h5, } } @@ -176,258 +855,36 @@ func (e Ext6) DecompressKarabina12345(x *E6) *E6 { x = e.Reduce(x) // h0 = (2g4^2 + g3g5 - 3g2g1)*c + 1 - t0 := e.fp.Mul(&x.B0.A1, &x.B0.A2) + t0 := e.fp.Mul(&x.A2, &x.A4) t0 = e.fp.MulConst(t0, big.NewInt(3)) - t1 := e.fp.Mul(&x.B1.A0, &x.B1.A2) - h0 := e.fp.Mul(&x.B1.A1, &x.B1.A1) + t1 := e.fp.Mul(&x.A1, &x.A5) + h0 := e.fp.Mul(&x.A3, &x.A3) h0 = e.fp.MulConst(h0, big.NewInt(2)) h0 = e.fp.Add(h0, t1) h0 = e.fp.Sub(t0, h0) h0 = e.fp.MulConst(h0, big.NewInt(4)) h0 = e.fp.Add(h0, e.fp.One()) + // a00 a01 a02 a10 a11 a12 + // A0 A2 A4 A1 A3 A5 return &E6{ - B0: E3{ - A0: *h0, - A1: x.B0.A1, - A2: x.B0.A2, - }, - B1: x.B1, + A0: *h0, + A1: x.A1, + A2: x.A2, + A3: x.A3, + A4: x.A4, + A5: x.A5, } } -// Karabina's compressed cyclotomic square SQR2345 -// https://eprint.iacr.org/2010/542.pdf -// Th. 3.2 with minor modifications to fit our tower -func (e Ext6) CyclotomicSquareKarabina2345(x *E6) *E6 { - x = e.Reduce(x) - z := e.Copy(x) - - var t [7]*baseEl - - // t0 = g1² - t[0] = e.fp.Mul(&x.B0.A1, &x.B0.A1) - // t1 = g5² - t[1] = e.fp.Mul(&x.B1.A2, &x.B1.A2) - // t5 = g1 + g5 - t[5] = e.fp.Add(&x.B0.A1, &x.B1.A2) - // t2 = (g1 + g5)² - t[2] = e.fp.Mul(t[5], t[5]) - - // t3 = g1² + g5² - t[3] = e.fp.Add(t[0], t[1]) - // t5 = 2 * g1 * g5 - t[5] = e.fp.Sub(t[3], t[2]) - - // t6 = g3 + g2 - t[6] = e.fp.Add(&x.B1.A0, &x.B0.A2) - // t3 = (g3 + g2)² - t[3] = e.fp.Mul(t[6], t[6]) - // t2 = g3² - t[2] = e.fp.Mul(&x.B1.A0, &x.B1.A0) - - // t6 = 2 * nr * g1 * g5 - t[6] = e.fp.MulConst(t[5], big.NewInt(4)) - // t5 = 4 * nr * g1 * g5 + 2 * g3 - t[5] = e.fp.Add(t[6], &x.B1.A0) - t[5] = e.fp.MulConst(t[5], big.NewInt(2)) - // z3 = 6 * nr * g1 * g5 + 2 * g3 - z.B1.A0 = *e.fp.Add(t[5], t[6]) - - // t4 = nr * g5² - t[4] = mulFpByNonResidue(e.fp, t[1]) - // t5 = nr * g5² + g1² - t[5] = e.fp.Add(t[0], t[4]) - // t6 = nr * g5² + g1² - g2 - t[6] = e.fp.Sub(t[5], &x.B0.A2) - - // t1 = g2² - t[1] = e.fp.Mul(&x.B0.A2, &x.B0.A2) - - // t6 = 2 * nr * g5² + 2 * g1² - 2*g2 - t[6] = e.fp.MulConst(t[6], big.NewInt(2)) - // z2 = 3 * nr * g5² + 3 * g1² - 2*g2 - z.B0.A2 = *e.fp.Add(t[6], t[5]) - - // t4 = nr * g2² - t[4] = mulFpByNonResidue(e.fp, t[1]) - // t5 = g3² + nr * g2² - t[5] = e.fp.Add(t[2], t[4]) - // t6 = g3² + nr * g2² - g1 - t[6] = e.fp.Sub(t[5], &x.B0.A1) - // t6 = 2 * g3² + 2 * nr * g2² - 2 * g1 - t[6] = e.fp.MulConst(t[6], big.NewInt(2)) - // z1 = 3 * g3² + 3 * nr * g2² - 2 * g1 - z.B0.A1 = *e.fp.Add(t[6], t[5]) - - // t0 = g2² + g3² - t[0] = e.fp.Add(t[2], t[1]) - // t5 = 2 * g3 * g2 - t[5] = e.fp.Sub(t[3], t[0]) - // t6 = 2 * g3 * g2 + g5 - t[6] = e.fp.Add(t[5], &x.B1.A2) - // t6 = 4 * g3 * g2 + 2 * g5 - t[6] = e.fp.MulConst(t[6], big.NewInt(2)) - // z5 = 6 * g3 * g2 + 2 * g5 - z.B1.A2 = *e.fp.Add(t[5], t[6]) - - return z -} - -// DecompressKarabina2345 decompresses Karabina's cyclotomic square result SQR2345 -// if g3 != 0 -// -// g4 = (E * g5^2 + 3 * g1^2 - 2 * g2)/4g3 -// -// if g3 == 0 -// -// g4 = 2g1g5/g2 -// -// if g3=g2=0 then g4=g5=g1=0 and g0=1 (x=1) -// Theorem 3.1 is well-defined for all x in Gϕₙ\{1} -func (e Ext6) DecompressKarabina2345(x *E6) *E6 { - - x = e.Reduce(x) - - var z E6 - - var t [3]*baseEl - var _t [2]*baseEl - one := e.fp.One() - - // if g3 == 0 - // t0 = 2 * g1 * g5 - // t1 = g2 - selector1 := e.fp.IsZero(&x.B1.A0) - _t[0] = e.fp.Mul(&x.B0.A1, &x.B0.A1) - _t[0] = e.fp.MulConst(_t[0], big.NewInt(2)) - _t[1] = &x.B0.A2 - - // if g2 == g3 == 0 - selector2 := e.fp.IsZero(_t[1]) - - // if g3 != 0 - // t0 = E * g5^2 + 3 * g1^2 - 2 * g2 - // t1 = 4 * g3 - t[0] = e.fp.Mul(&x.B0.A1, &x.B0.A1) - t[1] = e.fp.Sub(t[0], &x.B0.A2) - t[1] = e.fp.MulConst(t[1], big.NewInt(2)) - t[1] = e.fp.Add(t[1], t[0]) - t[2] = e.fp.Mul(&x.B1.A2, &x.B1.A2) - t[0] = mulFpByNonResidue(e.fp, t[2]) - t[0] = e.fp.Add(t[0], t[1]) - t[1] = e.fp.Add(&x.B1.A0, &x.B1.A0) - t[1] = e.fp.MulConst(t[1], big.NewInt(2)) - - // g4 = (E * g5^2 + 3 * g1^2 - 2 * g2)/4g3 or (2 * g1 * g5)/g2 - t[0] = e.fp.Select(selector1, _t[0], t[0]) - t[1] = e.fp.Select(selector1, _t[1], t[1]) - // g4 = dummy value, continue - t[1] = e.fp.Select(selector2, one, t[1]) - - z.B1.A1 = *e.fp.Div(t[0], t[1]) - - // Rest of the computation for all cases - // t1 = g2 * g1 - t[1] = e.fp.Mul(&x.B0.A2, &x.B0.A1) - // t2 = 2 * g4² - 3 * g2 * g1 - t[2] = e.fp.Mul(&z.B1.A1, &z.B1.A1) - t[2] = e.fp.Sub(t[2], t[1]) - t[2] = e.fp.MulConst(t[2], big.NewInt(2)) - t[2] = e.fp.Sub(t[2], t[1]) - // t1 = g3 * g5 (g3 can be 0) - t[1] = e.fp.Mul(&x.B1.A0, &x.B1.A2) - // g0 = E * (2 * g4² + g3 * g5 - 3 * g2 * g1) + 1 - t[2] = e.fp.Add(t[2], t[1]) - - z.B0.A0 = *mulFpByNonResidue(e.fp, t[2]) - z.B0.A0 = *e.fp.Add(&z.B0.A0, one) - - z.B0.A1 = x.B0.A1 - z.B0.A2 = x.B0.A2 - z.B1.A0 = x.B1.A0 - z.B1.A2 = x.B1.A2 - - return e.Select(e.api.And(selector1, selector2), e.One(), &z) -} - -// Granger-Scott's cyclotomic square -// https://eprint.iacr.org/2009/565.pdf, 3.2 -func (e Ext6) CyclotomicSquare(x *E6) *E6 { - // x=(x0,x1,x2,x3,x4,x5,x6,x7) in E3⁶ - // cyclosquare(x)=(3*x4²*u + 3*x0² - 2*x0, - // 3*x2²*u + 3*x3² - 2*x1, - // 3*x5²*u + 3*x1² - 2*x2, - // 6*x1*x5*u + 2*x3, - // 6*x0*x4 + 2*x4, - // 6*x2*x3 + 2*x5) - - x = e.Reduce(x) - - var t [9]*baseEl - - t[0] = e.fp.Mul(&x.B1.A1, &x.B1.A1) - t[1] = e.fp.Mul(&x.B0.A0, &x.B0.A0) - t[6] = e.fp.Add(&x.B1.A1, &x.B0.A0) - t[6] = e.fp.Mul(t[6], t[6]) - t[6] = e.fp.Sub(t[6], t[0]) - t[6] = e.fp.Sub(t[6], t[1]) // 2*x4*x0 - t[2] = e.fp.Mul(&x.B0.A2, &x.B0.A2) - t[3] = e.fp.Mul(&x.B1.A0, &x.B1.A0) - t[7] = e.fp.Add(&x.B0.A2, &x.B1.A0) - t[7] = e.fp.Mul(t[7], t[7]) - t[7] = e.fp.Sub(t[7], t[2]) - t[7] = e.fp.Sub(t[7], t[3]) // 2*x2*x3 - t[4] = e.fp.Mul(&x.B1.A2, &x.B1.A2) - t[5] = e.fp.Mul(&x.B0.A1, &x.B0.A1) - t[8] = e.fp.Add(&x.B1.A2, &x.B0.A1) - t[8] = e.fp.Mul(t[8], t[8]) - t[8] = e.fp.Sub(t[8], t[4]) - t[8] = e.fp.Sub(t[5], t[8]) - t[8] = e.fp.MulConst(t[8], big.NewInt(4)) // 2*x5*x1*u - - t[0] = mulFpByNonResidue(e.fp, t[0]) - t[0] = e.fp.Add(t[0], t[1]) // x4²*u + x0² - t[2] = mulFpByNonResidue(e.fp, t[2]) - t[2] = e.fp.Add(t[2], t[3]) // x2²*u + x3² - t[4] = mulFpByNonResidue(e.fp, t[4]) - t[4] = e.fp.Add(t[4], t[5]) // x5²*u + x1² - - var z E6 - z.B0.A0 = *e.fp.Sub(t[0], &x.B0.A0) - z.B0.A0 = *e.fp.MulConst(&z.B0.A0, big.NewInt(2)) - z.B0.A0 = *e.fp.Add(&z.B0.A0, t[0]) - z.B0.A1 = *e.fp.Sub(t[2], &x.B0.A1) - z.B0.A1 = *e.fp.MulConst(&z.B0.A1, big.NewInt(2)) - z.B0.A1 = *e.fp.Add(&z.B0.A1, t[2]) - z.B0.A2 = *e.fp.Sub(t[4], &x.B0.A2) - z.B0.A2 = *e.fp.MulConst(&z.B0.A2, big.NewInt(2)) - z.B0.A2 = *e.fp.Add(&z.B0.A2, t[4]) - - z.B1.A0 = *e.fp.Add(t[8], &x.B1.A0) - z.B1.A0 = *e.fp.MulConst(&z.B1.A0, big.NewInt(2)) - z.B1.A0 = *e.fp.Add(&z.B1.A0, t[8]) - z.B1.A1 = *e.fp.Add(t[6], &x.B1.A1) - z.B1.A1 = *e.fp.MulConst(&z.B1.A1, big.NewInt(2)) - z.B1.A1 = *e.fp.Add(&z.B1.A1, t[6]) - z.B1.A2 = *e.fp.Add(t[7], &x.B1.A2) - z.B1.A2 = *e.fp.Add(&z.B1.A2, &z.B1.A2) - z.B1.A2 = *e.fp.Add(&z.B1.A2, t[7]) - - return &z -} - func (e Ext6) Inverse(x *E6) *E6 { - res, err := e.fp.NewHint(inverseE6Hint, 6, &x.B0.A0, &x.B0.A1, &x.B0.A2, &x.B1.A0, &x.B1.A1, &x.B1.A2) + res, err := e.fp.NewHint(inverseE6Hint, 6, &x.A0, &x.A1, &x.A2, &x.A3, &x.A4, &x.A5) if err != nil { // err is non-nil only for invalid number of inputs panic(err) } - inv := E6{ - B0: E3{A0: *res[0], A1: *res[1], A2: *res[2]}, - B1: E3{A0: *res[3], A1: *res[4], A2: *res[5]}, - } + inv := E6{A0: *res[0], A1: *res[1], A2: *res[2], A3: *res[3], A4: *res[4], A5: *res[5]} one := e.One() // 1 == inv * x @@ -439,16 +896,13 @@ func (e Ext6) Inverse(x *E6) *E6 { } func (e Ext6) DivUnchecked(x, y *E6) *E6 { - res, err := e.fp.NewHint(divE6Hint, 12, &x.B0.A0, &x.B0.A1, &x.B0.A2, &x.B1.A0, &x.B1.A1, &x.B1.A2, &y.B0.A0, &y.B0.A1, &y.B0.A2, &y.B1.A0, &y.B1.A1, &y.B1.A2) + res, err := e.fp.NewHint(divE6Hint, 12, &x.A0, &x.A1, &x.A2, &x.A3, &x.A4, &x.A5, &y.A0, &y.A1, &y.A2, &y.A3, &y.A4, &y.A5) if err != nil { // err is non-nil only for invalid number of inputs panic(err) } - div := E6{ - B0: E3{A0: *res[0], A1: *res[1], A2: *res[2]}, - B1: E3{A0: *res[3], A1: *res[4], A2: *res[5]}, - } + div := E6{A0: *res[0], A1: *res[1], A2: *res[2], A3: *res[3], A4: *res[4], A5: *res[5]} // x = div * y _x := e.Mul(&div, y) @@ -458,55 +912,97 @@ func (e Ext6) DivUnchecked(x, y *E6) *E6 { } -func (e Ext6) Conjugate(x *E6) *E6 { - return &E6{ - B0: x.B0, - B1: *e.Ext3.Neg(&x.B1), +func (e Ext6) divE6By362880(x [6]*baseEl) [6]*baseEl { + res, err := e.fp.NewHint(divE6By362880Hint, 6, x[0], x[1], x[2], x[3], x[4], x[5]) + if err != nil { + // err is non-nil only for invalid number of inputs + panic(err) } + + y0 := *res[0] + y1 := *res[1] + y2 := *res[2] + y3 := *res[3] + y4 := *res[4] + y5 := *res[5] + + // xi == 362880 * yi + x0 := e.fp.MulConst(&y0, big.NewInt(362880)) + x1 := e.fp.MulConst(&y1, big.NewInt(362880)) + x2 := e.fp.MulConst(&y2, big.NewInt(362880)) + x3 := e.fp.MulConst(&y3, big.NewInt(362880)) + x4 := e.fp.MulConst(&y4, big.NewInt(362880)) + x5 := e.fp.MulConst(&y5, big.NewInt(362880)) + e.fp.AssertIsEqual(x[0], x0) + e.fp.AssertIsEqual(x[1], x1) + e.fp.AssertIsEqual(x[2], x2) + e.fp.AssertIsEqual(x[3], x3) + e.fp.AssertIsEqual(x[4], x4) + e.fp.AssertIsEqual(x[5], x5) + + return [6]*baseEl{&y0, &y1, &y2, &y3, &y4, &y5} } func (e Ext6) AssertIsEqual(a, b *E6) { - e.Ext3.AssertIsEqual(&a.B0, &b.B0) - e.Ext3.AssertIsEqual(&a.B1, &b.B1) + e.fp.AssertIsEqual(&a.A0, &b.A0) + e.fp.AssertIsEqual(&a.A1, &b.A1) + e.fp.AssertIsEqual(&a.A2, &b.A2) + e.fp.AssertIsEqual(&a.A3, &b.A3) + e.fp.AssertIsEqual(&a.A4, &b.A4) + e.fp.AssertIsEqual(&a.A5, &b.A5) + } func (e Ext6) Copy(x *E6) *E6 { - b0 := e.Ext3.Copy(&x.B0) - b1 := e.Ext3.Copy(&x.B1) return &E6{ - B0: *b0, - B1: *b1, + A0: x.A0, + A1: x.A1, + A2: x.A2, + A3: x.A3, + A4: x.A4, + A5: x.A5, } } func FromE6(a *bw6761.E6) E6 { + // gnark-crypto uses a quadratic over cubic sextic extension of Fp. + // The two towers are isomorphic and the coefficients are permuted as follows: + // a00 a01 a02 a10 a11 a12 + // A0 A2 A4 A1 A3 A5 return E6{ - B0: FromE3(&a.B0), - B1: FromE3(&a.B1), + A0: emulated.ValueOf[emulated.BW6761Fp](a.B0.A0), + A1: emulated.ValueOf[emulated.BW6761Fp](a.B1.A0), + A2: emulated.ValueOf[emulated.BW6761Fp](a.B0.A1), + A3: emulated.ValueOf[emulated.BW6761Fp](a.B1.A1), + A4: emulated.ValueOf[emulated.BW6761Fp](a.B0.A2), + A5: emulated.ValueOf[emulated.BW6761Fp](a.B1.A2), } } +func (e Ext6) Select(selector frontend.Variable, z1, z0 *E6) *E6 { + a0 := e.fp.Select(selector, &z1.A0, &z0.A0) + a1 := e.fp.Select(selector, &z1.A1, &z0.A1) + a2 := e.fp.Select(selector, &z1.A2, &z0.A2) + a3 := e.fp.Select(selector, &z1.A3, &z0.A3) + a4 := e.fp.Select(selector, &z1.A4, &z0.A4) + a5 := e.fp.Select(selector, &z1.A5, &z0.A5) + + return &E6{A0: *a0, A1: *a1, A2: *a2, A3: *a3, A4: *a4, A5: *a5} +} + // Frobenius set z in E6 to Frobenius(x), return z func (e Ext6) Frobenius(x *E6) *E6 { _frobA := emulated.ValueOf[emulated.BW6761Fp]("4922464560225523242118178942575080391082002530232324381063048548642823052024664478336818169867474395270858391911405337707247735739826664939444490469542109391530482826728203582549674992333383150446779312029624171857054392282775648") _frobB := emulated.ValueOf[emulated.BW6761Fp]("1968985824090209297278610739700577151397666382303825728450741611566800370218827257750865013421937292370006175842381275743914023380727582819905021229583192207421122272650305267822868639090213645505120388400344940985710520836292650") _frobC := emulated.ValueOf[emulated.BW6761Fp]("4922464560225523242118178942575080391082002530232324381063048548642823052024664478336818169867474395270858391911405337707247735739826664939444490469542109391530482826728203582549674992333383150446779312029624171857054392282775649") - _frobAC := emulated.ValueOf[emulated.BW6761Fp]("-1") _frobBC := emulated.ValueOf[emulated.BW6761Fp]("1968985824090209297278610739700577151397666382303825728450741611566800370218827257750865013421937292370006175842381275743914023380727582819905021229583192207421122272650305267822868639090213645505120388400344940985710520836292651") var z E6 - z.B0.A0 = x.B0.A0 - z.B0.A1 = *e.fp.Mul(&x.B0.A1, &_frobA) - z.B0.A2 = *e.fp.Mul(&x.B0.A2, &_frobB) - - z.B1.A0 = *e.fp.Mul(&x.B1.A0, &_frobC) - z.B1.A1 = *e.fp.Mul(&x.B1.A1, &_frobAC) - z.B1.A2 = *e.fp.Mul(&x.B1.A2, &_frobBC) + z.A0 = x.A0 + z.A2 = *e.fp.Mul(&x.A2, &_frobA) + z.A4 = *e.fp.Mul(&x.A4, &_frobB) + z.A1 = *e.fp.Mul(&x.A1, &_frobC) + z.A3 = *e.fp.Neg(&x.A3) + z.A5 = *e.fp.Mul(&x.A5, &_frobBC) return &z } - -func (e Ext6) Select(selector frontend.Variable, z1, z0 *E6) *E6 { - b0 := e.Ext3.Select(selector, &z1.B0, &z0.B0) - b1 := e.Ext3.Select(selector, &z1.B1, &z0.B1) - return &E6{B0: *b0, B1: *b1} -} diff --git a/std/algebra/emulated/fields_bw6761/e6_pairing.go b/std/algebra/emulated/fields_bw6761/e6_pairing.go index 20e8a9c444..12cbf4ab41 100644 --- a/std/algebra/emulated/fields_bw6761/e6_pairing.go +++ b/std/algebra/emulated/fields_bw6761/e6_pairing.go @@ -26,7 +26,7 @@ func (e Ext6) ExpX0Minus1(z *E6) *E6 { result = e.Mul(result, z33) result = e.nSquareKarabina12345(result, 4) result = e.Mul(result, z) - result = e.CyclotomicSquare(result) + result = e.nSquareKarabina12345(result, 1) result = e.Mul(result, z) result = e.nSquareKarabina12345(result, 46) @@ -39,11 +39,11 @@ func (e Ext6) ExpX0Minus1Square(z *E6) *E6 { z = e.Reduce(z) result := e.Copy(z) result = e.nSquareKarabina12345(result, 3) - t0 := e.CyclotomicSquare(result) + t0 := e.nSquareKarabina12345(result, 1) t2 := e.Mul(z, t0) result = e.Mul(result, t2) t0 = e.Mul(z, result) - t1 := e.CyclotomicSquare(t0) + t1 := e.nSquareKarabina12345(t0, 1) t1 = e.Mul(t2, t1) t3 := e.nSquareKarabina12345(t1, 7) t2 = e.Mul(t2, t3) @@ -65,7 +65,7 @@ func (e Ext6) ExpX0Minus1Square(z *E6) *E6 { func (e Ext6) ExpX0Plus1(z *E6) *E6 { z = e.Reduce(z) result := e.Copy(z) - t := e.CyclotomicSquare(result) + t := e.nSquareKarabina12345(result, 1) result = e.nSquareKarabina12345(t, 4) result = e.Mul(result, z) z33 := e.Copy(result) @@ -73,7 +73,7 @@ func (e Ext6) ExpX0Plus1(z *E6) *E6 { result = e.Mul(result, z33) result = e.nSquareKarabina12345(result, 4) result = e.Mul(result, z) - result = e.CyclotomicSquare(result) + result = e.nSquareKarabina12345(result, 1) result = e.Mul(result, z) result = e.nSquareKarabina12345(result, 46) result = e.Mul(result, t) @@ -86,10 +86,9 @@ func (e Ext6) ExpX0Plus1(z *E6) *E6 { func (e Ext6) ExptMinus1Div3(z *E6) *E6 { z = e.Reduce(z) result := e.Copy(z) - result = e.CyclotomicSquare(result) - result = e.CyclotomicSquare(result) + result = e.nSquareKarabina12345(result, 2) result = e.Mul(result, z) - result = e.CyclotomicSquare(result) + result = e.nSquareKarabina12345(result, 1) result = e.Mul(result, z) t0 := e.nSquareKarabina12345(result, 7) result = e.Mul(result, t0) @@ -106,10 +105,9 @@ func (e Ext6) ExptMinus1Div3(z *E6) *E6 { func (e Ext6) ExpC1(z *E6) *E6 { z = e.Reduce(z) result := e.Copy(z) - result = e.CyclotomicSquare(result) - result = e.CyclotomicSquare(result) + result = e.nSquareKarabina12345(result, 2) result = e.Mul(result, z) - result = e.CyclotomicSquare(result) + result = e.nSquareKarabina12345(result, 1) result = e.Mul(result, z) return result @@ -120,150 +118,206 @@ func (e Ext6) ExpC1(z *E6) *E6 { // C2 = (ht**2+3*hy**2)/4 = 103 func (e Ext6) ExpC2(z *E6) *E6 { z = e.Reduce(z) - result := e.CyclotomicSquare(z) + result := e.nSquareKarabina12345(z, 1) result = e.Mul(result, z) t0 := e.nSquareKarabina12345(result, 4) result = e.Mul(result, t0) - result = e.CyclotomicSquare(result) + result = e.nSquareKarabina12345(result, 1) result = e.Mul(result, z) return result } -// MulBy014 multiplies z by an E6 sparse element of the form +// MulBy023 multiplies z by an E6 sparse element of the form // -// E6{ -// B0: E3{A0: c0, A1: c1, A2: 0}, -// B1: E3{A0: 0, A1: 1, A2: 0}, -// } -func (e *Ext6) MulBy014(z *E6, c0, c1 *baseEl) *E6 { +// E6{A0: c0, A1: 0, A2: c1, A3: 1, A4: 0, A5: 0} +func (e *Ext6) MulBy023(z *E6, c0, c1 *baseEl) *E6 { z = e.Reduce(z) - a := e.MulBy01(&z.B0, c0, c1) + a := e.fp.Mul(&z.A0, c0) + b := e.fp.Mul(&z.A2, c1) + tmp := e.fp.Add(&z.A2, &z.A4) + a0 := e.fp.Mul(c1, tmp) + a0 = e.fp.Sub(b, a0) + a0 = e.fp.MulConst(a0, big.NewInt(4)) + a0 = e.fp.Add(a0, a) + a2 := e.fp.Mul(&z.A4, c0) + a2 = e.fp.Add(a2, b) + a1 := e.fp.Add(c0, c1) + tmp = e.fp.Add(&z.A0, &z.A2) + a1 = e.fp.Mul(a1, tmp) + a1 = e.fp.Sub(a1, a) + a1 = e.fp.Sub(a1, b) - var b E3 - // Mul by E3{0, 1, 0} - b.A0 = *e.fp.MulConst(&z.B1.A2, big.NewInt(4)) - b.A2 = *e.fp.Neg(&z.B1.A1) - b.A1 = *e.fp.Neg(&z.B1.A0) + b0 := e.fp.MulConst(&z.A5, big.NewInt(4)) + b2 := e.fp.Neg(&z.A3) + b1 := e.fp.Neg(&z.A1) one := e.fp.One() d := e.fp.Add(c1, one) - zC1 := e.Ext3.Add(&z.B1, &z.B0) - zC1 = e.Ext3.MulBy01(zC1, c0, d) - zC1 = e.Ext3.Sub(zC1, a) - zC1 = e.Ext3.Add(zC1, &b) - zC0 := &E3{ - A0: *e.fp.MulConst(&b.A2, big.NewInt(4)), - A1: *e.fp.Neg(&b.A0), - A2: *e.fp.Neg(&b.A1), - } + zC10 := e.fp.Add(&z.A1, &z.A0) + zC11 := e.fp.Add(&z.A3, &z.A2) + zC12 := e.fp.Add(&z.A5, &z.A4) + + a = e.fp.Mul(zC10, c0) + b = e.fp.Mul(zC11, d) + tmp = e.fp.Add(zC11, zC12) + t0 := e.fp.Mul(d, tmp) + t0 = e.fp.Sub(b, t0) + t0 = e.fp.MulConst(t0, big.NewInt(4)) + t0 = e.fp.Add(t0, a) + t2 := e.fp.Mul(zC12, c0) + t2 = e.fp.Add(t2, b) + t1 := e.fp.Add(c0, d) + tmp = e.fp.Add(zC10, zC11) + t1 = e.fp.Mul(t1, tmp) + t1 = e.fp.Sub(t1, a) + t1 = e.fp.Sub(t1, b) + + zC10 = e.fp.Sub(t0, a0) + zC11 = e.fp.Sub(t1, a1) + zC12 = e.fp.Sub(t2, a2) - zC0 = e.Ext3.Add(zC0, a) + zC10 = e.fp.Add(zC10, b0) + zC11 = e.fp.Add(zC11, b1) + zC12 = e.fp.Add(zC12, b2) + + zC00 := e.fp.Add(a0, e.fp.MulConst(b2, big.NewInt(4))) + zC01 := e.fp.Sub(a1, b0) + zC02 := e.fp.Sub(a2, b1) return &E6{ - B0: *zC0, - B1: *zC1, + A0: *zC00, + A1: *zC10, + A2: *zC01, + A3: *zC11, + A4: *zC02, + A5: *zC12, } + } -// multiplies two E6 sparse element of the form: +// Mul023By023 multiplies two E6 sparse element of the form: // -// E6{ -// B0: E3{A0: c0, A1: c1, A2: 0}, -// B1: E3{A0: 0, A1: 1, A2: 0}, -// } +// E6{A0: c0, A1: 0, A2: c1, A3: 1, A4: 0, A5: 0} // // and // -// E6{ -// B0: E3{A0: d0, A1: d1, A2: 0}, -// B1: E3{A0: 0, A1: 1, A2: 0}, -// } -func (e Ext6) Mul014By014(d0, d1, c0, c1 *baseEl) [5]*baseEl { +// E6{A0: c0, A1: 0, A2: c1, A3: 1, A4: 0, A5: 0} +func (e Ext6) Mul023By023(d0, d1, c0, c1 *baseEl) [5]*baseEl { x0 := e.fp.Mul(c0, d0) x1 := e.fp.Mul(c1, d1) x04 := e.fp.Add(c0, d0) tmp := e.fp.Add(c0, c1) x01 := e.fp.Add(d0, d1) x01 = e.fp.Mul(x01, tmp) - x01 = e.fp.Sub(x01, x0) - x01 = e.fp.Sub(x01, x1) + tmp = e.fp.Add(x0, x1) + x01 = e.fp.Sub(x01, tmp) x14 := e.fp.Add(c1, d1) - four := emulated.ValueOf[emulated.BW6761Fp](big.NewInt(4)) - zC0B0 := e.fp.Sub(x0, &four) + minusFour := emulated.ValueOf[emulated.BW6761Fp]("6891450384315732539396789682275657542479668912536150109513790160209623422243491736087683183289411687640864567753786613451161759120554247759349511699125301598951605099378508850372543631423596795951899700429969112842764913119068295") // -4 % p + zC0B0 := e.fp.Add(x0, &minusFour) - return [5]*baseEl{zC0B0, x01, x1, x04, x14} + return [5]*baseEl{zC0B0, x01, x04, x1, x14} } -// MulBy01245 multiplies z by an E6 sparse element of the form +// MulBy02345 multiplies z by an E6 sparse element of the form // -// E6{ -// B0: E3{A0: c0, A1: c1, A2: c2}, -// B1: E3{A0: 0, A1: c4, A2: c5}, +// E6{A0: y0, A1: 0, A2: y1, A3: y2, A4: y3, A5: y4}, // } -func (e *Ext6) MulBy01245(z *E6, x [5]*baseEl) *E6 { - c0 := &E3{A0: *x[0], A1: *x[1], A2: *x[2]} - a := e.Ext3.Add(&z.B0, &z.B1) - b := &E3{ - A0: c0.A0, - A1: *e.fp.Add(&c0.A1, x[3]), - A2: *e.fp.Add(&c0.A2, x[4]), - } - a = e.Ext3.Mul(a, b) - b = e.Ext3.Mul(&z.B0, c0) - c := e.Ext3.MulBy12(&z.B1, x[3], x[4]) - z1 := e.Ext3.Sub(a, b) - z1 = e.Ext3.Sub(z1, c) - z0 := e.Ext3.MulByNonResidue(c) - z0 = e.Ext3.Add(z0, b) - return &E6{ - B0: *z0, - B1: *z1, - } -} +func (e *Ext6) MulBy02345(z *E6, x [5]*baseEl) *E6 { + a0 := e.fp.Add(&z.A0, &z.A1) + a1 := e.fp.Add(&z.A2, &z.A3) + a2 := e.fp.Add(&z.A4, &z.A5) -// Mul01245By014 multiplies two E6 sparse element of the form -// -// E6{ -// C0: E3{B0: x0, B1: x1, B2: x2}, -// C1: E3{B0: 0, B1: x4, B2: x5}, -// } -// -// and -// -// E6{ -// C0: E3{B0: d0, B1: d1, B2: 0}, -// C1: E3{B0: 0, B1: 1, B2: 0}, -// } -func (e *Ext6) Mul01245By014(x [5]*baseEl, d0, d1 *baseEl) *E6 { - zero := e.fp.Zero() - c0 := &E3{A0: *x[0], A1: *x[1], A2: *x[2]} - b := &E3{ - A0: *x[0], - A1: *e.fp.Add(x[1], x[3]), - A2: *e.fp.Add(x[2], x[4]), - } - a := e.Ext3.MulBy01(b, d0, e.fp.Add(d1, e.fp.One())) - b = e.Ext3.MulBy01(c0, d0, d1) - c := &E3{ - A0: *e.fp.MulConst(x[4], big.NewInt(4)), - A1: *e.fp.Neg(zero), - A2: *e.fp.Neg(x[3]), - } - z1 := e.Ext3.Sub(a, b) - z1 = e.Ext3.Add(z1, c) - z0 := &E3{ - A0: *e.fp.MulConst(&c.A2, big.NewInt(4)), - A1: *e.fp.Neg(&c.A0), - A2: *e.fp.Neg(&c.A1), - } + b1 := e.fp.Add(x[1], x[2]) + b2 := e.fp.Add(x[3], x[4]) + + t0 := e.fp.Mul(a0, x[0]) + t1 := e.fp.Mul(a1, b1) + t2 := e.fp.Mul(a2, b2) + c0 := e.fp.Add(a1, a2) + tmp := e.fp.Add(b1, b2) + c0 = e.fp.Mul(c0, tmp) + c0 = e.fp.Sub(c0, t1) + c0 = e.fp.Sub(t2, c0) + c0 = e.fp.MulConst(c0, big.NewInt(4)) + tmp = e.fp.Add(a0, a2) + c2 := e.fp.Add(x[0], b2) + c2 = e.fp.Mul(c2, tmp) + c2 = e.fp.Sub(c2, t0) + c2 = e.fp.Sub(c2, t2) + c1 := e.fp.Add(a0, a1) + tmp = e.fp.Add(x[0], b1) + c1 = e.fp.Mul(c1, tmp) + c1 = e.fp.Sub(c1, t0) + c1 = e.fp.Sub(c1, t1) + t2 = e.mulFpByNonResidue(e.fp, t2) + a0 = e.fp.Add(c0, t0) + a1 = e.fp.Add(c1, t2) + a2 = e.fp.Add(c2, t1) + + t0 = e.fp.Mul(&z.A0, x[0]) + t1 = e.fp.Mul(&z.A2, x[1]) + t2 = e.fp.Mul(&z.A4, x[3]) + c0 = e.fp.Add(&z.A2, &z.A4) + tmp = e.fp.Add(x[1], x[3]) + c0 = e.fp.Mul(c0, tmp) + c0 = e.fp.Sub(c0, t1) + c0 = e.fp.Sub(t2, c0) + c0 = e.fp.MulConst(c0, big.NewInt(4)) + tmp = e.fp.Add(&z.A0, &z.A4) + c2 = e.fp.Add(x[0], x[3]) + c2 = e.fp.Mul(c2, tmp) + c2 = e.fp.Sub(c2, t0) + c2 = e.fp.Sub(c2, t2) + c1 = e.fp.Add(&z.A0, &z.A2) + tmp = e.fp.Add(x[0], x[1]) + c1 = e.fp.Mul(c1, tmp) + c1 = e.fp.Sub(c1, t0) + c1 = e.fp.Sub(c1, t1) + t2 = e.mulFpByNonResidue(e.fp, t2) + b0 := e.fp.Add(c0, t0) + b1 = e.fp.Add(c1, t2) + b2 = e.fp.Add(c2, t1) + + t1 = e.fp.Mul(&z.A3, x[2]) + t2 = e.fp.Mul(&z.A5, x[4]) + c0 = e.fp.Add(&z.A3, &z.A5) + tmp = e.fp.Add(x[2], x[4]) + c0 = e.fp.Mul(c0, tmp) + c0 = e.fp.Sub(c0, t1) + c0 = e.fp.Sub(t2, c0) + c0 = e.fp.MulConst(c0, big.NewInt(4)) + c1 = e.fp.Add(&z.A1, &z.A3) + c1 = e.fp.Mul(c1, x[2]) + c1 = e.fp.Sub(c1, t1) + tmp = e.mulFpByNonResidue(e.fp, t2) + c1 = e.fp.Add(c1, tmp) + tmp = e.fp.Add(&z.A1, &z.A5) + c2 = e.fp.Mul(x[4], tmp) + c2 = e.fp.Sub(c2, t2) + c2 = e.fp.Add(c2, t1) + + tmp = e.fp.Add(b0, c0) + z10 := e.fp.Sub(a0, tmp) + tmp = e.fp.Add(b1, c1) + z11 := e.fp.Sub(a1, tmp) + tmp = e.fp.Add(b2, c2) + z12 := e.fp.Sub(a2, tmp) + + z00 := e.mulFpByNonResidue(e.fp, c2) + z00 = e.fp.Add(z00, b0) + z01 := e.fp.Add(c0, b1) + z02 := e.fp.Add(c1, b2) - z0 = e.Ext3.Add(z0, b) return &E6{ - B0: *z0, - B1: *z1, + A0: *z00, + A1: *z10, + A2: *z01, + A3: *z11, + A4: *z02, + A5: *z12, } } diff --git a/std/algebra/emulated/fields_bw6761/e6_test.go b/std/algebra/emulated/fields_bw6761/e6_test.go index ecf3104517..b5745e77c6 100644 --- a/std/algebra/emulated/fields_bw6761/e6_test.go +++ b/std/algebra/emulated/fields_bw6761/e6_test.go @@ -99,6 +99,37 @@ func TestDoubleFp6(t *testing.T) { assert.NoError(err) } +type e6MulVariants struct { + A, B, C E6 +} + +func (circuit *e6MulVariants) Define(api frontend.API) error { + e := NewExt6(api) + expected1 := *e.mulMontgomery6(&circuit.A, &circuit.B) + expected2 := *e.mulToomCook6(&circuit.A, &circuit.B) + e.AssertIsEqual(&expected1, &circuit.C) + e.AssertIsEqual(&expected2, &circuit.C) + return nil +} + +func TestMulVariantsFp6(t *testing.T) { + assert := test.NewAssert(t) + // witness values + var a, b, c bw6761.E6 + _, _ = a.SetRandom() + _, _ = b.SetRandom() + c.Mul(&a, &b) + + witness := e6MulVariants{ + A: FromE6(&a), + B: FromE6(&b), + C: FromE6(&c), + } + + err := test.IsSolved(&e6MulVariants{}, &witness, ecc.BN254.ScalarField()) + assert.NoError(err) +} + type e6Mul struct { A, B, C E6 } @@ -245,90 +276,6 @@ func TestConjugateFp6(t *testing.T) { assert.NoError(err) } -type e6CyclotomicSquareKarabina2345 struct { - A, B E6 -} - -func (circuit *e6CyclotomicSquareKarabina2345) Define(api frontend.API) error { - e := NewExt6(api) - expected := e.CyclotomicSquareKarabina2345(&circuit.A) - e.AssertIsEqual(expected, &circuit.B) - return nil -} - -func TestCyclotomicSquareKarabina2345Fp6(t *testing.T) { - assert := test.NewAssert(t) - // witness values - var a, b bw6761.E6 - _, _ = a.SetRandom() - b.Set(&a) - b.CyclotomicSquareCompressed(&a) - - witness := e6CyclotomicSquareKarabina2345{ - A: FromE6(&a), - B: FromE6(&b), - } - - err := test.IsSolved(&e6CyclotomicSquareKarabina2345{}, &witness, ecc.BN254.ScalarField()) - assert.NoError(err) -} - -type e6DecompressKarabina2345 struct { - A, B E6 -} - -func (circuit *e6DecompressKarabina2345) Define(api frontend.API) error { - e := NewExt6(api) - expected := e.DecompressKarabina2345(&circuit.A) - e.AssertIsEqual(expected, &circuit.B) - return nil -} - -func TestDecompressKarabina2345Fp6(t *testing.T) { - assert := test.NewAssert(t) - // witness values - var a, b bw6761.E6 - _, _ = a.SetRandom() - b.Set(&a) - a.DecompressKarabina(&a) - - witness := e6DecompressKarabina2345{ - A: FromE6(&b), - B: FromE6(&a), - } - - err := test.IsSolved(&e6DecompressKarabina2345{}, &witness, ecc.BN254.ScalarField()) - assert.NoError(err) -} - -type e6CyclotomicSquare struct { - A, B E6 -} - -func (circuit *e6CyclotomicSquare) Define(api frontend.API) error { - e := NewExt6(api) - expected := e.CyclotomicSquare(&circuit.A) - e.AssertIsEqual(expected, &circuit.B) - return nil -} - -func TestCyclotomicSquareFp6(t *testing.T) { - assert := test.NewAssert(t) - // witness values - var a, b bw6761.E6 - _, _ = a.SetRandom() - b.Set(&a) - b.CyclotomicSquare(&a) - - witness := e6CyclotomicSquare{ - A: FromE6(&a), - B: FromE6(&b), - } - - err := test.IsSolved(&e6CyclotomicSquare{}, &witness, ecc.BN254.ScalarField()) - assert.NoError(err) -} - type e6Expt struct { A, B E6 } @@ -365,20 +312,20 @@ func TestExptFp6(t *testing.T) { assert.NoError(err) } -type e6MulBy014 struct { +type e6MulBy023 struct { A E6 `gnark:",public"` W E6 B, C baseEl } -func (circuit *e6MulBy014) Define(api frontend.API) error { +func (circuit *e6MulBy023) Define(api frontend.API) error { e := NewExt6(api) - res := e.MulBy014(&circuit.A, &circuit.B, &circuit.C) + res := e.MulBy023(&circuit.A, &circuit.B, &circuit.C) e.AssertIsEqual(res, &circuit.W) return nil } -func TestFp6MulBy014(t *testing.T) { +func TestFp6MulBy023(t *testing.T) { assert := test.NewAssert(t) // witness values @@ -391,14 +338,13 @@ func TestFp6MulBy014(t *testing.T) { w.Set(&a) w.MulBy014(&b, &c, &one) - witness := e6MulBy014{ + witness := e6MulBy023{ A: FromE6(&a), B: emulated.ValueOf[emulated.BW6761Fp](&b), C: emulated.ValueOf[emulated.BW6761Fp](&c), W: FromE6(&w), } - err := test.IsSolved(&e6MulBy014{}, &witness, ecc.BN254.ScalarField()) + err := test.IsSolved(&e6MulBy023{}, &witness, ecc.BN254.ScalarField()) assert.NoError(err) - } diff --git a/std/algebra/emulated/fields_bw6761/hints.go b/std/algebra/emulated/fields_bw6761/hints.go index 5c100d085c..994daa0d18 100644 --- a/std/algebra/emulated/fields_bw6761/hints.go +++ b/std/algebra/emulated/fields_bw6761/hints.go @@ -4,6 +4,7 @@ import ( "math/big" bw6761 "github.com/consensys/gnark-crypto/ecc/bw6-761" + "github.com/consensys/gnark-crypto/ecc/bw6-761/fp" "github.com/consensys/gnark/constraint/solver" "github.com/consensys/gnark/std/math/emulated" ) @@ -15,108 +16,91 @@ func init() { // GetHints returns all hint functions used in the package. func GetHints() []solver.Hint { return []solver.Hint{ - // E3 - divE3Hint, - inverseE3Hint, - // E6 divE6Hint, inverseE6Hint, + divE6By362880Hint, } } -// E3 -func inverseE3Hint(nativeMod *big.Int, nativeInputs, nativeOutputs []*big.Int) error { +func inverseE6Hint(nativeMod *big.Int, nativeInputs, nativeOutputs []*big.Int) error { return emulated.UnwrapHint(nativeInputs, nativeOutputs, func(mod *big.Int, inputs, outputs []*big.Int) error { - var a, c bw6761.E3 + var a, c bw6761.E6 - a.A0.SetBigInt(inputs[0]) - a.A1.SetBigInt(inputs[1]) - a.A2.SetBigInt(inputs[2]) + a.B0.A0.SetBigInt(inputs[0]) + a.B0.A1.SetBigInt(inputs[2]) + a.B0.A2.SetBigInt(inputs[4]) + a.B1.A0.SetBigInt(inputs[1]) + a.B1.A1.SetBigInt(inputs[3]) + a.B1.A2.SetBigInt(inputs[5]) c.Inverse(&a) - c.A0.BigInt(outputs[0]) - c.A1.BigInt(outputs[1]) - c.A2.BigInt(outputs[2]) - - return nil - }) -} - -func divE3Hint(nativeMod *big.Int, nativeInputs, nativeOutputs []*big.Int) error { - return emulated.UnwrapHint(nativeInputs, nativeOutputs, - func(mod *big.Int, inputs, outputs []*big.Int) error { - var a, b, c bw6761.E3 - - a.A0.SetBigInt(inputs[0]) - a.A1.SetBigInt(inputs[1]) - a.A2.SetBigInt(inputs[2]) - b.A0.SetBigInt(inputs[3]) - b.A1.SetBigInt(inputs[4]) - b.A2.SetBigInt(inputs[5]) - - c.Inverse(&b).Mul(&c, &a) - - c.A0.BigInt(outputs[0]) - c.A1.BigInt(outputs[1]) - c.A2.BigInt(outputs[2]) + c.B0.A0.BigInt(outputs[0]) + c.B0.A1.BigInt(outputs[2]) + c.B0.A2.BigInt(outputs[4]) + c.B1.A0.BigInt(outputs[1]) + c.B1.A1.BigInt(outputs[3]) + c.B1.A2.BigInt(outputs[5]) return nil }) } -// E6 -func inverseE6Hint(nativeMod *big.Int, nativeInputs, nativeOutputs []*big.Int) error { +func divE6Hint(nativeMod *big.Int, nativeInputs, nativeOutputs []*big.Int) error { return emulated.UnwrapHint(nativeInputs, nativeOutputs, func(mod *big.Int, inputs, outputs []*big.Int) error { - var a, c bw6761.E6 + var a, b, c bw6761.E6 a.B0.A0.SetBigInt(inputs[0]) - a.B0.A1.SetBigInt(inputs[1]) - a.B0.A2.SetBigInt(inputs[2]) - a.B1.A0.SetBigInt(inputs[3]) - a.B1.A1.SetBigInt(inputs[4]) + a.B0.A1.SetBigInt(inputs[2]) + a.B0.A2.SetBigInt(inputs[4]) + a.B1.A0.SetBigInt(inputs[1]) + a.B1.A1.SetBigInt(inputs[3]) a.B1.A2.SetBigInt(inputs[5]) + b.B0.A0.SetBigInt(inputs[6]) + b.B0.A1.SetBigInt(inputs[8]) + b.B0.A2.SetBigInt(inputs[10]) + b.B1.A0.SetBigInt(inputs[7]) + b.B1.A1.SetBigInt(inputs[9]) + b.B1.A2.SetBigInt(inputs[11]) - c.Inverse(&a) + c.Inverse(&b).Mul(&c, &a) c.B0.A0.BigInt(outputs[0]) - c.B0.A1.BigInt(outputs[1]) - c.B0.A2.BigInt(outputs[2]) - c.B1.A0.BigInt(outputs[3]) - c.B1.A1.BigInt(outputs[4]) + c.B0.A1.BigInt(outputs[2]) + c.B0.A2.BigInt(outputs[4]) + c.B1.A0.BigInt(outputs[1]) + c.B1.A1.BigInt(outputs[3]) c.B1.A2.BigInt(outputs[5]) return nil }) } -func divE6Hint(nativeMod *big.Int, nativeInputs, nativeOutputs []*big.Int) error { +func divE6By362880Hint(nativeMod *big.Int, nativeInputs, nativeOutputs []*big.Int) error { return emulated.UnwrapHint(nativeInputs, nativeOutputs, func(mod *big.Int, inputs, outputs []*big.Int) error { - var a, b, c bw6761.E6 + var a, c bw6761.E6 a.B0.A0.SetBigInt(inputs[0]) - a.B0.A1.SetBigInt(inputs[1]) - a.B0.A2.SetBigInt(inputs[2]) - a.B1.A0.SetBigInt(inputs[3]) - a.B1.A1.SetBigInt(inputs[4]) + a.B0.A1.SetBigInt(inputs[2]) + a.B0.A2.SetBigInt(inputs[4]) + a.B1.A0.SetBigInt(inputs[1]) + a.B1.A1.SetBigInt(inputs[3]) a.B1.A2.SetBigInt(inputs[5]) - b.B0.A0.SetBigInt(inputs[6]) - b.B0.A1.SetBigInt(inputs[7]) - b.B0.A2.SetBigInt(inputs[8]) - b.B1.A0.SetBigInt(inputs[9]) - b.B1.A1.SetBigInt(inputs[10]) - b.B1.A2.SetBigInt(inputs[11]) - c.Inverse(&b).Mul(&c, &a) + var sixInv fp.Element + sixInv.SetString("362880") + sixInv.Inverse(&sixInv) + c.B0.MulByElement(&a.B0, &sixInv) + c.B1.MulByElement(&a.B1, &sixInv) c.B0.A0.BigInt(outputs[0]) - c.B0.A1.BigInt(outputs[1]) - c.B0.A2.BigInt(outputs[2]) - c.B1.A0.BigInt(outputs[3]) - c.B1.A1.BigInt(outputs[4]) + c.B0.A1.BigInt(outputs[2]) + c.B0.A2.BigInt(outputs[4]) + c.B1.A0.BigInt(outputs[1]) + c.B1.A1.BigInt(outputs[3]) c.B1.A2.BigInt(outputs[5]) return nil diff --git a/std/algebra/emulated/sw_bls12381/pairing.go b/std/algebra/emulated/sw_bls12381/pairing.go index e180add6dc..bfe908cbd7 100644 --- a/std/algebra/emulated/sw_bls12381/pairing.go +++ b/std/algebra/emulated/sw_bls12381/pairing.go @@ -447,8 +447,7 @@ func (pr Pairing) doubleAndAddStep(p1, p2 *g2AffP) (*g2AffP, *lineEvaluation, *l // compute x3 =λ1²-x1-x2 x3 := pr.Ext2.Square(l1) - x3 = pr.Ext2.Sub(x3, &p1.X) - x3 = pr.Ext2.Sub(x3, &p2.X) + x3 = pr.Ext2.Sub(x3, pr.Ext2.Add(&p1.X, &p2.X)) // omit y3 computation @@ -466,8 +465,7 @@ func (pr Pairing) doubleAndAddStep(p1, p2 *g2AffP) (*g2AffP, *lineEvaluation, *l // compute x4 = λ2²-x1-x3 x4 := pr.Ext2.Square(l2) - x4 = pr.Ext2.Sub(x4, &p1.X) - x4 = pr.Ext2.Sub(x4, x3) + x4 = pr.Ext2.Sub(x4, pr.Ext2.Add(&p1.X, x3)) // compute y4 = λ2(x1 - x4)-y1 y4 := pr.Ext2.Sub(&p1.X, x4) @@ -501,8 +499,7 @@ func (pr Pairing) doubleStep(p1 *g2AffP) (*g2AffP, *lineEvaluation) { // xr = λ²-2x xr := pr.Ext2.Square(λ) - xr = pr.Ext2.Sub(xr, &p1.X) - xr = pr.Ext2.Sub(xr, &p1.X) + xr = pr.Ext2.Sub(xr, pr.Ext2.MulByConstElement(&p1.X, big.NewInt(2))) // yr = λ(x-xr)-y yr := pr.Ext2.Sub(&p1.X, xr) @@ -540,8 +537,7 @@ func (pr Pairing) tripleStep(p1 *g2AffP) (*g2AffP, *lineEvaluation, *lineEvaluat // x2 = λ1²-2x x2 := pr.Ext2.Square(λ1) - x2 = pr.Ext2.Sub(x2, &p1.X) - x2 = pr.Ext2.Sub(x2, &p1.X) + x2 = pr.Ext2.Sub(x2, pr.Ext2.MulByConstElement(&p1.X, big.NewInt(2))) // ommit yr computation, and // compute λ2 = 2y/(x2 − x) − λ1. diff --git a/std/algebra/emulated/sw_bw6761/pairing.go b/std/algebra/emulated/sw_bw6761/pairing.go index d5b0ac4fa7..b6fb462139 100644 --- a/std/algebra/emulated/sw_bw6761/pairing.go +++ b/std/algebra/emulated/sw_bw6761/pairing.go @@ -26,16 +26,12 @@ type GTEl = fields_bw6761.E6 func NewGTEl(v bw6761.GT) GTEl { return GTEl{ - B0: fields_bw6761.E3{ - A0: emulated.ValueOf[BaseField](v.B0.A0), - A1: emulated.ValueOf[BaseField](v.B0.A1), - A2: emulated.ValueOf[BaseField](v.B0.A2), - }, - B1: fields_bw6761.E3{ - A0: emulated.ValueOf[BaseField](v.B1.A0), - A1: emulated.ValueOf[BaseField](v.B1.A1), - A2: emulated.ValueOf[BaseField](v.B1.A2), - }, + A0: emulated.ValueOf[BaseField](v.B0.A0), + A1: emulated.ValueOf[BaseField](v.B1.A0), + A2: emulated.ValueOf[BaseField](v.B0.A1), + A3: emulated.ValueOf[BaseField](v.B1.A1), + A4: emulated.ValueOf[BaseField](v.B0.A2), + A5: emulated.ValueOf[BaseField](v.B1.A2), } } @@ -100,7 +96,8 @@ func (pr Pairing) FinalExponentiation(z *GTEl) *GTEl { a = pr.Mul(a, pr.Frobenius(result)) b := pr.ExpX0Plus1(a) b = pr.Mul(b, pr.Conjugate(result)) - t := pr.CyclotomicSquare(a) + t := pr.CyclotomicSquareKarabina12345(a) + t = pr.DecompressKarabina12345(t) a = pr.Mul(a, t) c := pr.ExptMinus1Div3(b) d := pr.ExpX0Minus1(c) @@ -116,7 +113,8 @@ func (pr Pairing) FinalExponentiation(z *GTEl) *GTEl { i = pr.Mul(i, pr.Conjugate(f)) j := pr.ExpC1(h) j = pr.Mul(j, e) - k := pr.CyclotomicSquare(j) + k := pr.CyclotomicSquareKarabina12345(j) + k = pr.DecompressKarabina12345(k) k = pr.Mul(k, j) k = pr.Mul(k, b) t = pr.ExpC2(i) @@ -300,57 +298,38 @@ func (pr Pairing) millerLoopLines(P []*G1Affine, lines []lineEvaluations) (*GTEl // i = 188 // k = 0 result = &fields_bw6761.E6{ - B0: fields_bw6761.E3{ - A0: *pr.curveF.Mul(&lines[0][0][188].R1, yInv[0]), - A1: *pr.curveF.Mul(&lines[0][0][188].R0, xNegOverY[0]), - A2: result.B0.A2, - }, - B1: fields_bw6761.E3{ - A0: result.B1.A0, - A1: *pr.curveF.One(), - A2: result.B1.A2, - }, + A0: *pr.curveF.Mul(&lines[0][0][188].R1, yInv[0]), + A1: result.A1, + A2: *pr.curveF.Mul(&lines[0][0][188].R0, xNegOverY[0]), + A3: *pr.curveF.One(), + A4: result.A4, + A5: result.A5, } if n >= 2 { - // k = 1, separately to avoid MulBy014 (res × ℓ) - // (res is also a line at this point, so we use Mul014By014 ℓ × ℓ) - prodLines = pr.Mul014By014( + // k = 1, separately to avoid MulBy023 (res × ℓ) + // (res is also a line at this point, so we use Mul023By023 ℓ × ℓ) + prodLines = pr.Mul023By023( pr.curveF.Mul(&lines[1][0][188].R1, yInv[1]), pr.curveF.Mul(&lines[1][0][188].R0, xNegOverY[1]), - &result.B0.A0, - &result.B0.A1, + &result.A0, + &result.A2, ) result = &fields_bw6761.E6{ - B0: fields_bw6761.E3{ - A0: *prodLines[0], - A1: *prodLines[1], - A2: *prodLines[2], - }, - B1: fields_bw6761.E3{ - A0: result.B1.A0, - A1: *prodLines[3], - A2: *prodLines[4], - }, + A0: *prodLines[0], + A1: result.A1, + A2: *prodLines[1], + A3: *prodLines[2], + A4: *prodLines[3], + A5: *prodLines[4], } } - if n >= 3 { - // k = 2, separately to avoid MulBy014 (res × ℓ) - // (res has a zero E2 element, so we use Mul01245By014) - result = pr.Mul01245By014( - prodLines, - pr.curveF.Mul(&lines[2][0][188].R1, yInv[2]), - pr.curveF.Mul(&lines[2][0][188].R0, xNegOverY[2]), + for k := 2; k < n; k++ { + result = pr.MulBy023(result, + pr.curveF.Mul(&lines[k][0][188].R1, yInv[k]), + pr.curveF.Mul(&lines[k][0][188].R0, xNegOverY[k]), ) - - // k >= 3 - for k := 3; k < n; k++ { - result = pr.MulBy014(result, - pr.curveF.Mul(&lines[k][0][188].R1, yInv[k]), - pr.curveF.Mul(&lines[k][0][188].R0, xNegOverY[k]), - ) - } } for i := 187; i >= 0; i-- { @@ -360,33 +339,33 @@ func (pr Pairing) millerLoopLines(P []*G1Affine, lines []lineEvaluations) (*GTEl if i > 0 && loopCounter2[i]*3+loopCounter1[i] != 0 { for k := 0; k < n; k++ { - prodLines = pr.Mul014By014( + prodLines = pr.Mul023By023( pr.curveF.Mul(&lines[k][0][i].R1, yInv[k]), pr.curveF.Mul(&lines[k][0][i].R0, xNegOverY[k]), pr.curveF.Mul(&lines[k][1][i].R1, yInv[k]), pr.curveF.Mul(&lines[k][1][i].R0, xNegOverY[k]), ) - result = pr.MulBy01245(result, prodLines) + result = pr.MulBy02345(result, prodLines) } } else { // if number of lines is odd, mul last line by res // works for n=1 as well if n%2 != 0 { // ℓ × res - result = pr.MulBy014(result, + result = pr.MulBy023(result, pr.curveF.Mul(&lines[n-1][0][i].R1, yInv[n-1]), pr.curveF.Mul(&lines[n-1][0][i].R0, xNegOverY[n-1]), ) } // mul lines 2-by-2 for k := 1; k < n; k += 2 { - prodLines = pr.Mul014By014( + prodLines = pr.Mul023By023( pr.curveF.Mul(&lines[k][0][i].R1, yInv[k]), pr.curveF.Mul(&lines[k][0][i].R0, xNegOverY[k]), pr.curveF.Mul(&lines[k-1][0][i].R1, yInv[k-1]), pr.curveF.Mul(&lines[k-1][0][i].R0, xNegOverY[k-1]), ) - result = pr.MulBy01245(result, prodLines) + result = pr.MulBy02345(result, prodLines) } } } diff --git a/std/algebra/emulated/sw_emulated/point.go b/std/algebra/emulated/sw_emulated/point.go index 6e2fe62afd..7e308f649d 100644 --- a/std/algebra/emulated/sw_emulated/point.go +++ b/std/algebra/emulated/sw_emulated/point.go @@ -804,7 +804,6 @@ func (c *Curve[B, S]) jointScalarMulGeneric(p1, p2 *AffinePoint[B], s1, s2 *emul panic(fmt.Sprintf("parse opts: %v", err)) } if cfg.CompleteArithmetic { - // TODO @yelhousni: optimize res1 := c.scalarMulGeneric(p1, s1, opts...) res2 := c.scalarMulGeneric(p2, s2, opts...) return c.AddUnified(res1, res2) @@ -861,7 +860,6 @@ func (c *Curve[B, S]) jointScalarMulGLV(p1, p2 *AffinePoint[B], s1, s2 *emulated panic(fmt.Sprintf("parse opts: %v", err)) } if cfg.CompleteArithmetic { - // TODO @yelhousni: optimize res1 := c.scalarMulGLV(p1, s1, opts...) res2 := c.scalarMulGLV(p2, s2, opts...) return c.AddUnified(res1, res2) diff --git a/std/algebra/native/fields_bls12377/e12.go b/std/algebra/native/fields_bls12377/e12.go index 73c2050ee9..e23b8ea5aa 100644 --- a/std/algebra/native/fields_bls12377/e12.go +++ b/std/algebra/native/fields_bls12377/e12.go @@ -176,7 +176,7 @@ func (e *E12) Square(api frontend.API, x E12) *E12 { c3.Sub(api, x.C0, c3) c2.Mul(api, x.C0, x.C1) c0.Mul(api, c0, c3).Add(api, c0, c2) - e.C1.Add(api, c2, c2) + e.C1.Double(api, c2) c2.MulByNonResidue(api, c2) e.C0.Add(api, c0, c2) @@ -423,13 +423,13 @@ func (e *E12) CyclotomicSquare(api frontend.API, x E12) *E12 { t[2].MulByNonResidue(api, t[2]).Add(api, t[2], t[3]) // x2²*u + x3² t[4].MulByNonResidue(api, t[4]).Add(api, t[4], t[5]) // x5²*u + x1² - e.C0.B0.Sub(api, t[0], x.C0.B0).Add(api, e.C0.B0, e.C0.B0).Add(api, e.C0.B0, t[0]) - e.C0.B1.Sub(api, t[2], x.C0.B1).Add(api, e.C0.B1, e.C0.B1).Add(api, e.C0.B1, t[2]) - e.C0.B2.Sub(api, t[4], x.C0.B2).Add(api, e.C0.B2, e.C0.B2).Add(api, e.C0.B2, t[4]) + e.C0.B0.Sub(api, t[0], x.C0.B0).Double(api, e.C0.B0).Add(api, e.C0.B0, t[0]) + e.C0.B1.Sub(api, t[2], x.C0.B1).Double(api, e.C0.B1).Add(api, e.C0.B1, t[2]) + e.C0.B2.Sub(api, t[4], x.C0.B2).Double(api, e.C0.B2).Add(api, e.C0.B2, t[4]) - e.C1.B0.Add(api, t[8], x.C1.B0).Add(api, e.C1.B0, e.C1.B0).Add(api, e.C1.B0, t[8]) - e.C1.B1.Add(api, t[6], x.C1.B1).Add(api, e.C1.B1, e.C1.B1).Add(api, e.C1.B1, t[6]) - e.C1.B2.Add(api, t[7], x.C1.B2).Add(api, e.C1.B2, e.C1.B2).Add(api, e.C1.B2, t[7]) + e.C1.B0.Add(api, t[8], x.C1.B0).Double(api, e.C1.B0).Add(api, e.C1.B0, t[8]) + e.C1.B1.Add(api, t[6], x.C1.B1).Double(api, e.C1.B1).Add(api, e.C1.B1, t[6]) + e.C1.B2.Add(api, t[7], x.C1.B2).Double(api, e.C1.B2).Add(api, e.C1.B2, t[7]) return e } diff --git a/std/algebra/native/fields_bls12377/e12_pairing.go b/std/algebra/native/fields_bls12377/e12_pairing.go index a98616c84d..a4895b425d 100644 --- a/std/algebra/native/fields_bls12377/e12_pairing.go +++ b/std/algebra/native/fields_bls12377/e12_pairing.go @@ -7,6 +7,7 @@ func (e *E12) nSquareKarabina2345(api frontend.API, n int) { for i := 0; i < n; i++ { e.CyclotomicSquareKarabina2345(api, *e) } + e.DecompressKarabina2345(api, *e) } // nSquareKarabina12345 repeated compressed cyclotmic square @@ -14,6 +15,7 @@ func (e *E12) nSquareKarabina12345(api frontend.API, n int) { for i := 0; i < n; i++ { e.CyclotomicSquareKarabina12345(api, *e) } + e.DecompressKarabina12345(api, *e) } // Square034 squares a sparse element in Fp12 @@ -129,19 +131,15 @@ func (e *E12) ExpX0(api frontend.API, e1 E12) *E12 { res := e1 res.nSquareKarabina2345(api, 5) - res.DecompressKarabina2345(api, res) res.Mul(api, res, e1) x33 := res res.nSquareKarabina2345(api, 7) - res.DecompressKarabina2345(api, res) res.Mul(api, res, x33) res.nSquareKarabina2345(api, 4) - res.DecompressKarabina2345(api, res) res.Mul(api, res, e1) res.CyclotomicSquare(api, res) res.Mul(api, res, e1) res.nSquareKarabina2345(api, 46) - res.DecompressKarabina2345(api, res) res.Mul(api, res, e1) *e = res @@ -157,7 +155,6 @@ func (e *E12) ExpX0Minus1Square(api frontend.API, e1 E12) *E12 { res = e1 res.nSquareKarabina12345(api, 3) - res.DecompressKarabina12345(api, res) t0.CyclotomicSquare(api, res) t2.Mul(api, e1, t0) res.Mul(api, res, t2) @@ -166,20 +163,15 @@ func (e *E12) ExpX0Minus1Square(api frontend.API, e1 E12) *E12 { t1.Mul(api, t2, t1) t3 = t1 t3.nSquareKarabina2345(api, 7) - t3.DecompressKarabina2345(api, t3) t2.Mul(api, t2, t3) t2.nSquareKarabina2345(api, 11) - t2.DecompressKarabina2345(api, t2) t1.Mul(api, t1, t2) t0.Mul(api, t0, t1) t0.nSquareKarabina2345(api, 7) - t0.DecompressKarabina2345(api, t0) res.Mul(api, res, t0) res.nSquareKarabina12345(api, 3) - res.DecompressKarabina12345(api, res) - res.Mul(api, e1, res) - res.nSquareKarabina2345(api, 92) - e.DecompressKarabina2345(api, res) + e.Mul(api, e1, res) + e.nSquareKarabina2345(api, 92) return e diff --git a/std/algebra/native/fields_bls12377/e2.go b/std/algebra/native/fields_bls12377/e2.go index fd6f99ecde..1a8390367c 100644 --- a/std/algebra/native/fields_bls12377/e2.go +++ b/std/algebra/native/fields_bls12377/e2.go @@ -83,13 +83,11 @@ func (e *E2) Sub(api frontend.API, e1, e2 E2) *E2 { // Mul e2 elmts func (e *E2) Mul(api frontend.API, e1, e2 E2) *E2 { - // 1C l1 := api.Add(e1.A0, e1.A1) l2 := api.Add(e2.A0, e2.A1) u := api.Mul(l1, l2) - // 2C ac := api.Mul(e1.A0, e2.A0) bd := api.Mul(e1.A1, e2.A1) @@ -111,9 +109,9 @@ func (e *E2) Square(api frontend.API, x E2) *E2 { c0 = api.Mul(c0, c2) // (x1+x2)*(x1+(u**2)x2) c2 = api.Mul(x.A0, x.A1) - c2 = api.Add(c2, c2) + c2 = api.Mul(c2, 2) e.A1 = c2 - c2 = api.Add(c2, c2) + c2 = api.Mul(c2, 2) e.A0 = api.Add(c0, c2) return e diff --git a/std/algebra/native/fields_bls12377/e6.go b/std/algebra/native/fields_bls12377/e6.go index 4ea19f9e25..b9af8c4f41 100644 --- a/std/algebra/native/fields_bls12377/e6.go +++ b/std/algebra/native/fields_bls12377/e6.go @@ -5,7 +5,7 @@ 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 +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, @@ -17,9 +17,11 @@ limitations under the License. package fields_bls12377 import ( - bls12377 "github.com/consensys/gnark-crypto/ecc/bls12-377" + "math/big" + bls12377 "github.com/consensys/gnark-crypto/ecc/bls12-377" "github.com/consensys/gnark/frontend" + "github.com/consensys/gnark/internal/frontendtype" ) // E6 element in a quadratic extension @@ -52,6 +54,14 @@ func (e *E6) assign(e1 []frontend.Variable) { e.B2.A1 = e1[5] } +// Double e6 elmt +func (e *E6) Double(api frontend.API, e1 E6) *E6 { + e.B0.Double(api, e1.B0) + e.B1.Double(api, e1.B1) + e.B2.Double(api, e1.B2) + return e +} + // Add creates a fp6elmt from fp elmts func (e *E6) Add(api frontend.API, e1, e2 E6) *E6 { @@ -89,10 +99,21 @@ func (e *E6) Neg(api frontend.API, e1 E6) *E6 { return e } -// Mul creates a fp6elmt from fp elmts -// icube is the imaginary elmt to the cube +// Mul multiplies two E6 elmts func (e *E6) Mul(api frontend.API, e1, e2 E6) *E6 { + if ft, ok := api.(frontendtype.FrontendTyper); ok { + switch ft.FrontendType() { + case frontendtype.R1CS: + return e.mulToom3OverKaratsuba(api, e1, e2) + case frontendtype.SCS: + return e.mulKaratsubaOverKaratsuba(api, e1, e2) + } + } + return e.mulKaratsubaOverKaratsuba(api, e1, e2) +} +func (e *E6) mulKaratsubaOverKaratsuba(api frontend.API, e1, e2 E6) *E6 { + // Karatsuba over Karatsuba: // Algorithm 13 from https://eprint.iacr.org/2010/354.pdf var t0, t1, t2, c0, c1, c2, tmp E2 t0.Mul(api, e1.B0, e2.B0) @@ -101,16 +122,26 @@ func (e *E6) Mul(api frontend.API, e1, e2 E6) *E6 { c0.Add(api, e1.B1, e1.B2) tmp.Add(api, e2.B1, e2.B2) - c0.Mul(api, c0, tmp).Sub(api, c0, t1).Sub(api, c0, t2).MulByNonResidue(api, c0).Add(api, c0, t0) + c0.Mul(api, c0, tmp). + Sub(api, c0, t1). + Sub(api, c0, t2). + MulByNonResidue(api, c0). + Add(api, c0, t0) c1.Add(api, e1.B0, e1.B1) tmp.Add(api, e2.B0, e2.B1) - c1.Mul(api, c1, tmp).Sub(api, c1, t0).Sub(api, c1, t1) + c1.Mul(api, c1, tmp). + Sub(api, c1, t0). + Sub(api, c1, t1) tmp.MulByNonResidue(api, t2) c1.Add(api, c1, tmp) tmp.Add(api, e1.B0, e1.B2) - c2.Add(api, e2.B0, e2.B2).Mul(api, c2, tmp).Sub(api, c2, t0).Sub(api, c2, t2).Add(api, c2, t1) + c2.Add(api, e2.B0, e2.B2). + Mul(api, c2, tmp). + Sub(api, c2, t0). + Sub(api, c2, t2). + Add(api, c2, t1) e.B0 = c0 e.B1 = c1 @@ -119,6 +150,94 @@ func (e *E6) Mul(api frontend.API, e1, e2 E6) *E6 { return e } +func (e *E6) mulToom3OverKaratsuba(api frontend.API, e1, e2 E6) *E6 { + // Toom-Cook-3x over Karatsuba: + // We start by computing five interpolation points – these are evaluations of + // the product x(u)y(u) with u ∈ {0, ±1, 2, ∞}: + // + // v0 = x(0)y(0) = x.A0 * y.A0 + // v1 = x(1)y(1) = (x.A0 + x.A1 + x.A2)(y.A0 + y.A1 + y.A2) + // v2 = x(−1)y(−1) = (x.A0 − x.A1 + x.A2)(y.A0 − y.A1 + y.A2) + // v3 = x(2)y(2) = (x.A0 + 2x.A1 + 4x.A2)(y.A0 + 2y.A1 + 4y.A2) + // v4 = x(∞)y(∞) = x.A2 * y.A2 + var v0, v1, v2, v3, v4, t1, t2, t3 E2 + + v0.Mul(api, e1.B0, e2.B0) + + t1.Add(api, e1.B0, e1.B2) + t2.Add(api, e2.B0, e2.B2) + t3.Add(api, t2, e2.B1) + v1.Add(api, t1, e1.B1) + v1.Mul(api, v1, t3) + + t3.Sub(api, t2, e2.B1) + v2.Sub(api, t1, e1.B1) + v2.Mul(api, v2, t3) + + t1.MulByFp(api, e1.B1, big.NewInt(2)) + t2.MulByFp(api, e1.B2, big.NewInt(4)) + v3.Add(api, t1, t2) + v3.Add(api, v3, e1.B0) + t1.MulByFp(api, e2.B1, big.NewInt(2)) + t2.MulByFp(api, e2.B2, big.NewInt(4)) + t3.Add(api, t1, t2) + t3.Add(api, t3, e2.B0) + v3.Mul(api, v3, t3) + + v4.Mul(api, e1.B2, e2.B2) + + // Then the interpolation is performed as: + // + // a0 = v0 + β((1/2)v0 − (1/2)v1 − (1/6)v2 + (1/6)v3 − 2v4) + // a1 = −(1/2)v0 + v1 − (1/3)v2 − (1/6)v3 + 2v4 + βv4 + // a2 = −v0 + (1/2)v1 + (1/2)v2 − v4 + // + // where β is the cubic non-residue. + // + // In-circuit, we compute 6*x*y as + // c0 = 6v0 + β(3v0 − 3v1 − v2 + v3 − 12v4) + // a1 = -(3v0 + 2v2 + v3) + 6(v1 + 2v4 + βv4) + // a2 = 3(v1 + v2 - 2(v0 + v4)) + // + // and then divide a0, a1 and a2 by 6 using a hint. + var a0, a1, a2 E2 + a0.MulByFp(api, v0, big.NewInt(6)) + t1.Sub(api, v0, v1) + t1.MulByFp(api, t1, big.NewInt(3)) + t1.Sub(api, t1, v2) + t1.Add(api, t1, v3) + t2.MulByFp(api, v4, big.NewInt(12)) + t1.Sub(api, t1, t2) + t1.MulByNonResidue(api, t1) + a0.Add(api, a0, t1) + + a1.MulByFp(api, v0, big.NewInt(3)) + t1.MulByFp(api, v2, big.NewInt(2)) + a1.Add(api, a1, t1) + a1.Add(api, a1, v3) + t1.MulByFp(api, v4, big.NewInt(2)) + t1.Add(api, t1, v1) + t2.MulByNonResidue(api, v4) + t1.Add(api, t1, t2) + t1.MulByFp(api, t1, big.NewInt(6)) + a1.Sub(api, t1, a1) + + a2.Add(api, v1, v2) + a2.MulByFp(api, a2, big.NewInt(3)) + t1.Add(api, v0, v4) + t1.MulByFp(api, t1, big.NewInt(6)) + a2.Sub(api, a2, t1) + + e.B0.A0 = api.Div(a0.A0, 6) + e.B0.A1 = api.Div(a0.A1, 6) + e.B1.A0 = api.Div(a1.A0, 6) + e.B1.A1 = api.Div(a1.A1, 6) + e.B2.A0 = api.Div(a2.A0, 6) + e.B2.A1 = api.Div(a2.A1, 6) + + return e +} + func (e *E6) Mul0By01(api frontend.API, a0, b0, b1 E2) *E6 { var t0, c1 E2 diff --git a/std/algebra/native/fields_bls12377/e6_test.go b/std/algebra/native/fields_bls12377/e6_test.go index 60e849605e..9024377490 100644 --- a/std/algebra/native/fields_bls12377/e6_test.go +++ b/std/algebra/native/fields_bls12377/e6_test.go @@ -122,6 +122,42 @@ func TestMulFp6(t *testing.T) { assert.CheckCircuit(&circuit, test.WithValidAssignment(&witness), test.WithCurves(ecc.BW6_761)) } +type fp6MulVariants struct { + A, B E6 + C E6 `gnark:",public"` +} + +func (circuit *fp6MulVariants) Define(api frontend.API) error { + expected1 := E6{} + expected2 := E6{} + + expected1.mulKaratsubaOverKaratsuba(api, circuit.A, circuit.B) + expected2.mulToom3OverKaratsuba(api, circuit.A, circuit.B) + + expected1.AssertIsEqual(api, circuit.C) + expected2.AssertIsEqual(api, circuit.C) + return nil +} + +func TestMulVariantsFp6(t *testing.T) { + + var circuit, witness fp6MulVariants + + // witness values + var a, b, c bls12377.E6 + _, _ = a.SetRandom() + _, _ = b.SetRandom() + c.Mul(&a, &b) + + witness.A.Assign(&a) + witness.B.Assign(&b) + witness.C.Assign(&c) + + // cs values + assert := test.NewAssert(t) + assert.CheckCircuit(&circuit, test.WithValidAssignment(&witness), test.WithCurves(ecc.BW6_761)) +} + type fp6MulBy01 struct { A E6 C0, C1 E2 diff --git a/std/algebra/native/sw_bls12377/g1.go b/std/algebra/native/sw_bls12377/g1.go index 7b5936a8c4..8297880fcb 100644 --- a/std/algebra/native/sw_bls12377/g1.go +++ b/std/algebra/native/sw_bls12377/g1.go @@ -467,7 +467,6 @@ func (P *G1Affine) jointScalarMul(api frontend.API, Q, R G1Affine, s, t frontend panic(err) } if cfg.CompleteArithmetic { - // TODO @yelhousni: optimize var tmp G1Affine P.ScalarMul(api, Q, s, opts...) tmp.ScalarMul(api, R, t, opts...) diff --git a/std/algebra/native/sw_bls24315/g1.go b/std/algebra/native/sw_bls24315/g1.go index d57481bd92..d65c6217c9 100644 --- a/std/algebra/native/sw_bls24315/g1.go +++ b/std/algebra/native/sw_bls24315/g1.go @@ -438,7 +438,6 @@ func (P *G1Affine) jointScalarMul(api frontend.API, Q, R G1Affine, s, t frontend panic(err) } if cfg.CompleteArithmetic { - // TODO @yelhousni: optimize var tmp G1Affine P.ScalarMul(api, Q, s, opts...) tmp.ScalarMul(api, R, t, opts...) diff --git a/std/commitments/kzg/verifier.go b/std/commitments/kzg/verifier.go index 74262a4c5c..bf23203a18 100644 --- a/std/commitments/kzg/verifier.go +++ b/std/commitments/kzg/verifier.go @@ -503,7 +503,11 @@ func (v *Verifier[FR, G1El, G2El, GTEl]) FoldProofsMultiPoint(digests []Commitme randomNumbers[1] = v.scalarApi.FromBits(binSeed...) for i := 2; i < len(randomNumbers); i++ { - // TODO use real random numbers, follow the solidity smart contract to know which variables are used as seed + // TODO: we can also use random number from the higher level transcript + // instead of computing it from the inputs. Currently it is inefficient + // as it computes hash of something for which we already have a hash. + // Maybe add an option to provide the folding coefficient? See issue + // https://github.com/Consensys/gnark/issues/1108 randomNumbers[i] = v.scalarApi.Mul(randomNumbers[1], randomNumbers[i-1]) } randomPointNumbers := make([]*emulated.Element[FR], len(randomNumbers)) diff --git a/std/evmprecompiles/01-ecrecover.go b/std/evmprecompiles/01-ecrecover.go index e993599a0f..0f5fdd67bb 100644 --- a/std/evmprecompiles/01-ecrecover.go +++ b/std/evmprecompiles/01-ecrecover.go @@ -12,12 +12,24 @@ import ( // ECRecover implements [ECRECOVER] precompile contract at address 0x01. // +// The method allows checking both the transaction signatures and ECRecover +// precompile calls. The difference between TX signature verification and +// ECRecover precompile call is that there is additional check for s <= (Fr-1)/2 +// in the former case. To enforce this check, the strictRange variable should be +// set to 1. +// +// The isFailure variable is set to 1 when the inputs are expected to be invalid +// in the context of ECRecover. The failure cases are: +// 1. The public key is zero. +// 2. The value r^3 + 7 is not a quadratic residue. +// // [ECRECOVER]: https://ethereum.github.io/execution-specs/autoapi/ethereum/paris/vm/precompiled_contracts/ecrecover/index.html func ECRecover(api frontend.API, msg emulated.Element[emulated.Secp256k1Fr], v frontend.Variable, r, s emulated.Element[emulated.Secp256k1Fr], - strictRange frontend.Variable) *sw_emulated.AffinePoint[emulated.Secp256k1Fp] { - // EVM uses v \in {27, 28}, but everyone else v >= 0. Convert back - v = api.Sub(v, 27) + strictRange frontend.Variable, isFailure frontend.Variable) *sw_emulated.AffinePoint[emulated.Secp256k1Fp] { + // the field implementations are cached. So it is safe to initialize + // them at every call to ECRecover. This allows to simplify the + // interface of ECRecover. var emfp emulated.Secp256k1Fp var emfr emulated.Secp256k1Fr fpField, err := emulated.NewField[emulated.Secp256k1Fp](api) @@ -28,6 +40,20 @@ func ECRecover(api frontend.API, msg emulated.Element[emulated.Secp256k1Fr], if err != nil { panic(fmt.Sprintf("new field: %v", err)) } + curve, err := sw_emulated.New[emulated.Secp256k1Fp, emulated.Secp256k1Fr](api, sw_emulated.GetSecp256k1Params()) + if err != nil { + panic(fmt.Sprintf("new curve: %v", err)) + } + + // sanity check that input is valid. First we need to ensure the failure + // tag is boolean. + api.AssertIsBoolean(isFailure) + + // EVM uses v \in {27, 28}, but everyone else v >= 0. Convert back + v = api.Sub(v, 27) + // check that len(v) = 2 + vbits := bits.ToBinary(api, v, bits.WithNbDigits(2)) + // with the encoding we may have that r,s < 2*Fr (i.e. not r,s < Fr). Apply more thorough checks. frField.AssertIsLessOrEqual(&r, frField.Modulus()) // Ethereum Yellow Paper defines that the check for s should be more strict @@ -38,21 +64,9 @@ func ECRecover(api frontend.API, msg emulated.Element[emulated.Secp256k1Fr], bound := frField.Select(strictRange, frField.NewElement(halfFr), frField.Modulus()) frField.AssertIsLessOrEqual(&s, bound) - curve, err := sw_emulated.New[emulated.Secp256k1Fp, emulated.Secp256k1Fr](api, sw_emulated.GetSecp256k1Params()) - if err != nil { - panic(fmt.Sprintf("new curve: %v", err)) - } - // we cannot directly use the field emulation hint calling wrappers as we work between two fields. - Rlimbs, err := api.Compiler().NewHint(recoverPointHint, 2*int(emfp.NbLimbs()), recoverPointHintArgs(v, r)...) - if err != nil { - panic(fmt.Sprintf("point hint: %v", err)) - } - R := sw_emulated.AffinePoint[emulated.Secp256k1Fp]{ - X: *fpField.NewElement(Rlimbs[0:emfp.NbLimbs()]), - Y: *fpField.NewElement(Rlimbs[emfp.NbLimbs() : 2*emfp.NbLimbs()]), - } + // compute P, the public key // we cannot directly use the field emulation hint calling wrappers as we work between two fields. - Plimbs, err := api.Compiler().NewHint(recoverPublicKeyHint, 2*int(emfp.NbLimbs()), recoverPublicKeyHintArgs(msg, v, r, s)...) + Plimbs, err := api.Compiler().NewHint(recoverPublicKeyHint, 2*int(emfp.NbLimbs())+1, recoverPublicKeyHintArgs(msg, v, r, s)...) if err != nil { panic(fmt.Sprintf("point hint: %v", err)) } @@ -60,25 +74,80 @@ func ECRecover(api frontend.API, msg emulated.Element[emulated.Secp256k1Fr], X: *fpField.NewElement(Plimbs[0:emfp.NbLimbs()]), Y: *fpField.NewElement(Plimbs[emfp.NbLimbs() : 2*emfp.NbLimbs()]), } - // check that len(v) = 2 - vbits := bits.ToBinary(api, v, bits.WithNbDigits(2)) - // check that Rx is correct: x = r+v[1]*fr - tmp := fpField.Select(vbits[1], fpField.NewElement(emfr.Modulus()), fpField.NewElement(0)) + // we also get a flag from the hint if the returned public key is zero. This + // is only set when we have no QNR failure. + pIsZero := Plimbs[2*emfp.NbLimbs()] + api.AssertIsBoolean(pIsZero) + + // the failure can be either that we have quadratic non residue or that the + // public key is zero. We set the QNR failure flag here. + // + // However, the flag coming from the hint is not strongly asserted as it + // comes from the hint. We need to later assert again against the computed + // public key (variable isZero). + isQNRFailure := api.Sub(isFailure, pIsZero) + + // compute R, the commitment + // the signature as elements in Fr, but it actually represents elements in Fp. Convert to Fp element. rbits := frField.ToBits(&r) rfp := fpField.FromBits(rbits...) - tmp = fpField.Add(rfp, tmp) - fpField.AssertIsEqual(tmp, &R.X) - // check that Ry is correct: oddity(y) = v[0] - Rynormal := fpField.Reduce(&R.Y) - Rybits := fpField.ToBits(Rynormal) - api.AssertIsEqual(vbits[0], Rybits[0]) + // compute R.X x = r+v[1]*fr + Rx := fpField.Select(vbits[1], fpField.NewElement(emfr.Modulus()), fpField.NewElement(0)) + Rx = fpField.Add(rfp, Rx) // Rx = r + v[1]*fr + Ry := fpField.Mul(Rx, Rx) // Ry = x^2 + // compute R.y y = sqrt(x^3+7) + Ry = fpField.Mul(Ry, Rx) // Ry = x^3 + b := fpField.NewElement(7) // b = 7 for secp256k1, a = 0 + Ry = fpField.Add(Ry, b) // Ry = x^3 + 7 + // in case of failure due to no QNR, negate Ry so that exists a square root + Ry = fpField.Select(isQNRFailure, fpField.Sub(fpField.Modulus(), Ry), Ry) + Ry = fpField.Sqrt(Ry) // Ry = sqrt(x^3 + 7) + // ensure the oddity of Ry is same as vbits[0], otherwise negate Ry + Rybits := fpField.ToBits(Ry) + Ry = fpField.Select(api.Xor(vbits[0], Rybits[0]), fpField.Sub(fpField.Modulus(), Ry), Ry) + + R := sw_emulated.AffinePoint[emulated.Secp256k1Fp]{ + X: *Rx, + Y: *Ry, + } + // compute the public key C also in-circuit. We need to compute u1 and u2 + // and use these to compute the public key. + // // compute u1 = -msg * r^{-1} mod fr u1 := frField.Div(&msg, &r) u1 = frField.Neg(u1) // compute u2 = s * r^{-1} mod fr u2 := frField.Div(&s, &r) - // check u1 * G + u2 R == P + // compute public key in circuit C = u1 * G + u2 R + // + // in case the public key is expected to be zero, then we add 1 to u1 to + // avoid falling to incomplete edge case in scalar multiplication. Otherwise we add 0. + u1 = frField.Add(u1, frField.Select(pIsZero, frField.One(), frField.Zero())) C := curve.JointScalarMulBase(&R, u2, u1) - curve.AssertIsEqual(C, &P) + // check that the in-circuit computed public key corresponds to the hint + // public key if it is not a QNR failure. + // + // now, when we added 1 to u1, then the computed public key should be + // generator (as we only add 1 when pIsZero=1). Instead of needing to + // subtract G using complete arithmetic, we switch between G and the + // computed public key. + condP := curve.Select(pIsZero, curve.Generator(), &P) + xIsEqual := fpField.IsZero(fpField.Sub(&C.X, &condP.X)) + yIsEqual := fpField.IsZero(fpField.Sub(&C.Y, &condP.Y)) + isEqual := api.Mul(xIsEqual, yIsEqual) + api.AssertIsEqual(isEqual, api.Sub(1, isQNRFailure)) + // check that the result is zero if isFailure is true. This holds because in + // case of any failure the returned public key from hint is zero. + isZero := fpField.IsZero(&P.X) + // yIsZero := fpField.IsZero(&P.Y) + // isZero := api.Mul(xIsZero, yIsZero) + api.AssertIsEqual(isZero, isFailure) + // when there was a QNR failure then the computed public key C is random. We + // only check for zero public key failure in case of no QNR failure. + // + // So, when there was a QNR failure, hint has returned pIsZero = 0, but the + // computed isZero 1. We set isZero to 0 by multiplying with + // (1-isQNRFailure). + api.AssertIsEqual(pIsZero, api.Mul(api.Sub(1, isQNRFailure), isZero)) return &P } diff --git a/std/evmprecompiles/01-ecrecover_test.go b/std/evmprecompiles/01-ecrecover_test.go index c862f78ce3..ac76ff1a33 100644 --- a/std/evmprecompiles/01-ecrecover_test.go +++ b/std/evmprecompiles/01-ecrecover_test.go @@ -40,12 +40,13 @@ func TestSignForRecoverCorrectness(t *testing.T) { } type ecrecoverCircuit struct { - Message emulated.Element[emulated.Secp256k1Fr] - V frontend.Variable - R emulated.Element[emulated.Secp256k1Fr] - S emulated.Element[emulated.Secp256k1Fr] - Strict frontend.Variable - Expected sw_emulated.AffinePoint[emulated.Secp256k1Fp] + Message emulated.Element[emulated.Secp256k1Fr] + V frontend.Variable + R emulated.Element[emulated.Secp256k1Fr] + S emulated.Element[emulated.Secp256k1Fr] + Strict frontend.Variable + IsFailure frontend.Variable + Expected sw_emulated.AffinePoint[emulated.Secp256k1Fp] } func (c *ecrecoverCircuit) Define(api frontend.API) error { @@ -53,7 +54,7 @@ func (c *ecrecoverCircuit) Define(api frontend.API) error { if err != nil { return fmt.Errorf("new curve: %w", err) } - res := ECRecover(api, c.Message, c.V, c.R, c.S, c.Strict) + res := ECRecover(api, c.Message, c.V, c.R, c.S, c.Strict, c.IsFailure) curve.AssertIsEqual(&c.Expected, res) return nil } @@ -85,11 +86,12 @@ func testRoutineECRecover(t *testing.T, wantStrict bool) (circ, wit *ecrecoverCi } circuit := ecrecoverCircuit{} witness := ecrecoverCircuit{ - Message: emulated.ValueOf[emulated.Secp256k1Fr](ecdsa.HashToInt(msg)), - V: v + 27, // EVM constant - R: emulated.ValueOf[emulated.Secp256k1Fr](r), - S: emulated.ValueOf[emulated.Secp256k1Fr](s), - Strict: strict, + Message: emulated.ValueOf[emulated.Secp256k1Fr](ecdsa.HashToInt(msg)), + V: v + 27, // EVM constant + R: emulated.ValueOf[emulated.Secp256k1Fr](r), + S: emulated.ValueOf[emulated.Secp256k1Fr](s), + Strict: strict, + IsFailure: 0, Expected: sw_emulated.AffinePoint[emulated.Secp256k1Fp]{ X: emulated.ValueOf[emulated.Secp256k1Fp](pk.A.X), Y: emulated.ValueOf[emulated.Secp256k1Fp](pk.A.Y), @@ -140,3 +142,121 @@ func TestECRecoverCircuitFull(t *testing.T) { test.NoProverChecks(), ) } + +func TestECRecoverQNR(t *testing.T) { + assert := test.NewAssert(t) + var sk ecdsa.PrivateKey + _, err := sk.SetBytes([]byte{0x80, 0x95, 0xb4, 0x19, 0x78, 0xe3, 0x7c, 0xb2, 0x44, 0x76, 0xd3, 0x76, 0x90, 0x87, 0x33, 0x61, 0x89, 0xcf, 0xac, 0xc2, 0x60, 0x2d, 0xf9, 0x83, 0xcc, 0xb5, 0xb2, 0x5c, 0x84, 0xe9, 0x41, 0x76, 0x7e, 0xe7, 0x47, 0x4b, 0x89, 0xbb, 0x50, 0xe0, 0x6, 0xf6, 0x11, 0x25, 0xf2, 0xe8, 0xf7, 0xb2, 0x59, 0x9d, 0xa8, 0x7, 0x48, 0x2b, 0x6d, 0x8c, 0x3e, 0x28, 0x5, 0x93, 0xf8, 0x5c, 0xcc, 0xc9, 0xe, 0x40, 0x3d, 0x19, 0x13, 0xad, 0x7f, 0xc1, 0x63, 0x93, 0x71, 0xb6, 0x8d, 0x3d, 0x43, 0x7a, 0x7f, 0x8, 0x9f, 0xaa, 0x8f, 0xc, 0xf6, 0xf8, 0x5, 0xad, 0xaf, 0x23, 0x93, 0x34, 0x97, 0xba}) + assert.NoError(err) + msg := []byte("test") + v := 1 + r, _ := new(big.Int).SetString("115792089237316195423570985008687907853269984665640564039457584007908834671662", 10) + s, _ := new(big.Int).SetString("31110821449234674195879853497860775923588666272130120981349127974920000247897", 10) + circuit := ecrecoverCircuit{} + witness := ecrecoverCircuit{ + Message: emulated.ValueOf[emulated.Secp256k1Fr](ecdsa.HashToInt(msg)), + V: v + 27, // EVM constant + R: emulated.ValueOf[emulated.Secp256k1Fr](r), + S: emulated.ValueOf[emulated.Secp256k1Fr](s), + Strict: 0, + IsFailure: 1, + Expected: sw_emulated.AffinePoint[emulated.Secp256k1Fp]{ + X: emulated.ValueOf[emulated.Secp256k1Fp](0), + Y: emulated.ValueOf[emulated.Secp256k1Fp](0), + }, + } + err = test.IsSolved(&circuit, &witness, ecc.BLS12_377.ScalarField()) + assert.NoError(err) +} + +func TestECRecoverQNRWoFailure(t *testing.T) { + assert := test.NewAssert(t) + var sk ecdsa.PrivateKey + _, err := sk.SetBytes([]byte{0x80, 0x95, 0xb4, 0x19, 0x78, 0xe3, 0x7c, 0xb2, 0x44, 0x76, 0xd3, 0x76, 0x90, 0x87, 0x33, 0x61, 0x89, 0xcf, 0xac, 0xc2, 0x60, 0x2d, 0xf9, 0x83, 0xcc, 0xb5, 0xb2, 0x5c, 0x84, 0xe9, 0x41, 0x76, 0x7e, 0xe7, 0x47, 0x4b, 0x89, 0xbb, 0x50, 0xe0, 0x6, 0xf6, 0x11, 0x25, 0xf2, 0xe8, 0xf7, 0xb2, 0x59, 0x9d, 0xa8, 0x7, 0x48, 0x2b, 0x6d, 0x8c, 0x3e, 0x28, 0x5, 0x93, 0xf8, 0x5c, 0xcc, 0xc9, 0xe, 0x40, 0x3d, 0x19, 0x13, 0xad, 0x7f, 0xc1, 0x63, 0x93, 0x71, 0xb6, 0x8d, 0x3d, 0x43, 0x7a, 0x7f, 0x8, 0x9f, 0xaa, 0x8f, 0xc, 0xf6, 0xf8, 0x5, 0xad, 0xaf, 0x23, 0x93, 0x34, 0x97, 0xba}) + assert.NoError(err) + msg := []byte("test") + v := 1 + r, _ := new(big.Int).SetString("115792089237316195423570985008687907853269984665640564039457584007908834671662", 10) + s, _ := new(big.Int).SetString("31110821449234674195879853497860775923588666272130120981349127974920000247897", 10) + circuit := ecrecoverCircuit{} + witness := ecrecoverCircuit{ + Message: emulated.ValueOf[emulated.Secp256k1Fr](ecdsa.HashToInt(msg)), + V: v + 27, // EVM constant + R: emulated.ValueOf[emulated.Secp256k1Fr](r), + S: emulated.ValueOf[emulated.Secp256k1Fr](s), + Strict: 0, + IsFailure: 0, + Expected: sw_emulated.AffinePoint[emulated.Secp256k1Fp]{ + X: emulated.ValueOf[emulated.Secp256k1Fp](0), + Y: emulated.ValueOf[emulated.Secp256k1Fp](0), + }, + } + err = test.IsSolved(&circuit, &witness, ecc.BLS12_377.ScalarField()) + assert.Error(err) +} + +func TestECRecoverInfinity(t *testing.T) { + assert := test.NewAssert(t) + var sk ecdsa.PrivateKey + var err error + pk := sk.Public().(*ecdsa.PublicKey) + msg := []byte("test") + var r, s *big.Int + var v uint + v, r, s, err = sk.SignForRecover(msg, nil) + if err != nil { + t.Fatal("sign", err) + } + circuit := ecrecoverCircuit{} + witness := ecrecoverCircuit{ + Message: emulated.ValueOf[emulated.Secp256k1Fr](ecdsa.HashToInt(msg)), + V: v + 27, // EVM constant + R: emulated.ValueOf[emulated.Secp256k1Fr](r), + S: emulated.ValueOf[emulated.Secp256k1Fr](s), + Strict: 0, + IsFailure: 1, + Expected: sw_emulated.AffinePoint[emulated.Secp256k1Fp]{ + X: emulated.ValueOf[emulated.Secp256k1Fp](pk.A.X), + Y: emulated.ValueOf[emulated.Secp256k1Fp](pk.A.Y), + }, + } + err = test.IsSolved(&circuit, &witness, ecc.BLS12_377.ScalarField()) + assert.NoError(err) +} + +func TestECRecoverInfinityWoFailure(t *testing.T) { + assert := test.NewAssert(t) + var sk ecdsa.PrivateKey + var err error + pk := sk.Public().(*ecdsa.PublicKey) + msg := []byte("test") + var r, s *big.Int + var v uint + v, r, s, err = sk.SignForRecover(msg, nil) + if err != nil { + t.Fatal("sign", err) + } + circuit := ecrecoverCircuit{} + witness := ecrecoverCircuit{ + Message: emulated.ValueOf[emulated.Secp256k1Fr](ecdsa.HashToInt(msg)), + V: v + 27, // EVM constant + R: emulated.ValueOf[emulated.Secp256k1Fr](r), + S: emulated.ValueOf[emulated.Secp256k1Fr](s), + Strict: 0, + IsFailure: 0, + Expected: sw_emulated.AffinePoint[emulated.Secp256k1Fp]{ + X: emulated.ValueOf[emulated.Secp256k1Fp](pk.A.X), + Y: emulated.ValueOf[emulated.Secp256k1Fp](pk.A.Y), + }, + } + err = test.IsSolved(&circuit, &witness, ecc.BLS12_377.ScalarField()) + assert.Error(err) +} + +func TestInvalidFailureTag(t *testing.T) { + assert := test.NewAssert(t) + circuit, witness, _ := testRoutineECRecover(t, false) + witness.IsFailure = 1 + err := test.IsSolved(circuit, witness, ecc.BN254.ScalarField()) + assert.Error(err) +} diff --git a/std/evmprecompiles/hints.go b/std/evmprecompiles/hints.go index 0ebc231ae0..15c7e98202 100644 --- a/std/evmprecompiles/hints.go +++ b/std/evmprecompiles/hints.go @@ -1,6 +1,7 @@ package evmprecompiles import ( + "errors" "fmt" "math/big" @@ -16,39 +17,7 @@ func init() { // GetHints returns all the hints used in this package. func GetHints() []solver.Hint { - return []solver.Hint{recoverPointHint, recoverPublicKeyHint} -} - -func recoverPointHintArgs(v frontend.Variable, r emulated.Element[emulated.Secp256k1Fr]) []frontend.Variable { - args := []frontend.Variable{v} - args = append(args, r.Limbs...) - return args -} - -func recoverPointHint(_ *big.Int, inputs []*big.Int, outputs []*big.Int) error { - var emfp emulated.Secp256k1Fp - if len(inputs) != int(emfp.NbLimbs())+1 { - return fmt.Errorf("expected input %d limbs got %d", emfp.NbLimbs()+1, len(inputs)) - } - if !inputs[0].IsInt64() { - return fmt.Errorf("first input supposed to be in [0,3]") - } - if len(outputs) != 2*int(emfp.NbLimbs()) { - return fmt.Errorf("expected output %d limbs got %d", 2*emfp.NbLimbs(), len(outputs)) - } - v := inputs[0].Uint64() - r := recompose(inputs[1:], emfp.BitsPerLimb()) - P, err := ecdsa.RecoverP(uint(v), r) - if err != nil { - return fmt.Errorf("recover: %s", err) - } - if err := decompose(P.X.BigInt(new(big.Int)), emfp.BitsPerLimb(), outputs[0:emfp.NbLimbs()]); err != nil { - return fmt.Errorf("decompose x: %w", err) - } - if err := decompose(P.Y.BigInt(new(big.Int)), emfp.BitsPerLimb(), outputs[emfp.NbLimbs():]); err != nil { - return fmt.Errorf("decompose y: %w", err) - } - return nil + return []solver.Hint{recoverPublicKeyHint} } func recoverPublicKeyHintArgs(msg emulated.Element[emulated.Secp256k1Fr], @@ -74,7 +43,7 @@ func recoverPublicKeyHint(_ *big.Int, inputs []*big.Int, outputs []*big.Int) err if !inputs[emfr.NbLimbs()].IsInt64() { return fmt.Errorf("second input input must be in [0,3]") } - if len(outputs) != 2*int(emfp.NbLimbs()) { + if len(outputs) != 2*int(emfp.NbLimbs())+1 { return fmt.Errorf("expected output %d limbs got %d", 2*emfp.NbLimbs(), len(outputs)) } msg := recompose(inputs[:emfr.NbLimbs()], emfr.BitsPerLimb()) @@ -82,8 +51,14 @@ func recoverPublicKeyHint(_ *big.Int, inputs []*big.Int, outputs []*big.Int) err r := recompose(inputs[emfr.NbLimbs()+1:2*emfr.NbLimbs()+1], emfr.BitsPerLimb()) s := recompose(inputs[2*emfr.NbLimbs()+1:3*emfr.NbLimbs()+1], emfr.BitsPerLimb()) var pk ecdsa.PublicKey + var isQNRFailure int if err := pk.RecoverFrom(msg.Bytes(), uint(v), r, s); err != nil { - return fmt.Errorf("recover public key: %w", err) + // in case we have some other possible error except QNR failure, then we return the error as is + if !errors.Is(err, ecdsa.ErrNoSqrtR) { + return fmt.Errorf("recover public key: %w", err) + } + // otherwise, we set the flag to 1. NB! In this case the public key is (0,0). + isQNRFailure = 1 } Px := pk.A.X.BigInt(new(big.Int)) Py := pk.A.Y.BigInt(new(big.Int)) @@ -93,5 +68,12 @@ func recoverPublicKeyHint(_ *big.Int, inputs []*big.Int, outputs []*big.Int) err if err := decompose(Py, emfp.BitsPerLimb(), outputs[emfp.NbLimbs():2*emfp.NbLimbs()]); err != nil { return fmt.Errorf("decompose y: %w", err) } + // we also return a flag that indicates if the public key is zero but only + // if the QNR failure flag is not set. + zero := new(big.Int) + xIsZero := 1 - Px.Cmp(zero) + yIsZero := 1 - Py.Cmp(zero) + isZero := (1 - isQNRFailure) * xIsZero * yIsZero + outputs[2*emfp.NbLimbs()].SetInt64(int64(isZero)) return nil } diff --git a/std/hash/sha2/sha2.go b/std/hash/sha2/sha2.go index edb261e621..ea36f7f70d 100644 --- a/std/hash/sha2/sha2.go +++ b/std/hash/sha2/sha2.go @@ -6,9 +6,13 @@ package sha2 import ( "encoding/binary" + "math/big" "github.com/consensys/gnark/frontend" "github.com/consensys/gnark/std/hash" + "github.com/consensys/gnark/std/math/bits" + "github.com/consensys/gnark/std/math/bitslice" + "github.com/consensys/gnark/std/math/cmp" "github.com/consensys/gnark/std/math/uints" "github.com/consensys/gnark/std/permutation/sha2" ) @@ -18,16 +22,17 @@ var _seed = uints.NewU32Array([]uint32{ }) type digest struct { + api frontend.API uapi *uints.BinaryField[uints.U32] in []uints.U8 } -func New(api frontend.API) (hash.BinaryHasher, error) { +func New(api frontend.API) (hash.BinaryFixedLengthHasher, error) { uapi, err := uints.New[uints.U32](api) if err != nil { return nil, err } - return &digest{uapi: uapi}, nil + return &digest{api: api, uapi: uapi}, nil } func (d *digest) Write(data []uints.U8) { @@ -71,7 +76,6 @@ func (d *digest) Sum() []uints.U8 { } func (d *digest) FixedLengthSum(length frontend.Variable) []uints.U8 { - panic("TODO") // we need to do two things here -- first the padding has to be put to the // right place. For that we need to know how many blocks we have used. We // need to fit at least 9 more bytes (padding byte and 8 bytes for input @@ -80,6 +84,69 @@ func (d *digest) FixedLengthSum(length frontend.Variable) []uints.U8 { // // idea - have a mask for blocks where 1 is only for the block we want to // use. + + data := make([]uints.U8, len(d.in)) + copy(data, d.in) + + comparator := cmp.NewBoundedComparator(d.api, big.NewInt(int64(len(data)+64+8)), false) + + for i := 0; i < 64+8; i++ { + data = append(data, uints.NewU8(0)) + } + + lenMod64 := d.mod64(length) + lenMod64Less56 := comparator.IsLess(lenMod64, 56) + + paddingCount := d.api.Sub(64, lenMod64) + paddingCount = d.api.Select(lenMod64Less56, paddingCount, d.api.Add(paddingCount, 64)) + + totalLen := d.api.Add(length, paddingCount) + last8BytesPos := d.api.Sub(totalLen, 8) + + var dataLenBtyes [8]frontend.Variable + d.bigEndianPutUint64(dataLenBtyes[:], d.api.Mul(length, 8)) + + for i := range data { + isPaddingStartPos := d.api.IsZero(d.api.Sub(i, length)) + data[i].Val = d.api.Select(isPaddingStartPos, 0x80, data[i].Val) + + isPaddingPos := comparator.IsLess(length, i) + data[i].Val = d.api.Select(isPaddingPos, 0, data[i].Val) + } + + for i := range data { + isLast8BytesPos := d.api.IsZero(d.api.Sub(i, last8BytesPos)) + for j := 0; j < 8; j++ { + if i+j < len(data) { + data[i+j].Val = d.api.Select(isLast8BytesPos, dataLenBtyes[j], data[i+j].Val) + } + } + } + + var runningDigest [8]uints.U32 + var resultDigest [8]uints.U32 + var buf [64]uints.U8 + copy(runningDigest[:], _seed) + copy(resultDigest[:], _seed) + + for i := 0; i < len(data)/64; i++ { + copy(buf[:], data[i*64:(i+1)*64]) + runningDigest = sha2.Permute(d.uapi, runningDigest, buf) + + isInRange := comparator.IsLess(i*64, totalLen) + + for j := 0; j < 8; j++ { + for k := 0; k < 4; k++ { + resultDigest[j][k].Val = d.api.Select(isInRange, runningDigest[j][k].Val, resultDigest[j][k].Val) + } + } + } + + var ret []uints.U8 + for i := range resultDigest { + ret = append(ret, d.uapi.UnpackMSB(resultDigest[i])...) + } + return ret } func (d *digest) Reset() { @@ -87,3 +154,15 @@ func (d *digest) Reset() { } func (d *digest) Size() int { return 32 } + +func (d *digest) mod64(v frontend.Variable) frontend.Variable { + lower, _ := bitslice.Partition(d.api, v, 6, bitslice.WithNbDigits(64)) + return lower +} + +func (d *digest) bigEndianPutUint64(b []frontend.Variable, x frontend.Variable) { + bts := bits.ToBinary(d.api, x, bits.WithNbDigits(64)) + for i := 0; i < 8; i++ { + b[i] = bits.FromBinary(d.api, bts[(8-i-1)*8:(8-i)*8]) + } +} diff --git a/std/hash/sha2/sha2_test.go b/std/hash/sha2/sha2_test.go index d4acf5baf3..0093fddc43 100644 --- a/std/hash/sha2/sha2_test.go +++ b/std/hash/sha2/sha2_test.go @@ -48,3 +48,44 @@ func TestSHA2(t *testing.T) { t.Fatal(err) } } + +type sha2FixedLengthCircuit struct { + In []uints.U8 + Length frontend.Variable + Expected [32]uints.U8 +} + +func (c *sha2FixedLengthCircuit) Define(api frontend.API) error { + h, err := New(api) + if err != nil { + return err + } + uapi, err := uints.New[uints.U32](api) + if err != nil { + return err + } + h.Write(c.In) + res := h.FixedLengthSum(c.Length) + if len(res) != 32 { + return fmt.Errorf("not 32 bytes") + } + for i := range c.Expected { + uapi.ByteAssertEq(c.Expected[i], res[i]) + } + return nil +} + +func TestSHA2FixedLengthSum(t *testing.T) { + bts := make([]byte, 144) + length := 56 + dgst := sha256.Sum256(bts[:length]) + witness := sha2FixedLengthCircuit{ + In: uints.NewU8Array(bts), + Length: length, + } + copy(witness.Expected[:], uints.NewU8Array(dgst[:])) + err := test.IsSolved(&sha2FixedLengthCircuit{In: make([]uints.U8, len(bts))}, &witness, ecc.BN254.ScalarField()) + if err != nil { + t.Fatal(err) + } +} diff --git a/std/math/emulated/composition.go b/std/math/emulated/composition.go index bce35e7442..d94d4f5cca 100644 --- a/std/math/emulated/composition.go +++ b/std/math/emulated/composition.go @@ -23,7 +23,8 @@ func recompose(inputs []*big.Int, nbBits uint, res *big.Int) error { res.Lsh(res, nbBits) res.Add(res, inputs[len(inputs)-i-1]) } - // TODO @gbotrel mod reduce ? + // we do not mod-reduce here as the result is mod-reduced by the caller if + // needed. In some places we need non-reduced results. return nil } @@ -67,7 +68,9 @@ func decompose(input *big.Int, nbBits uint, res []*big.Int) error { // then no such underflow happens and s = a-b (mod p) as the padding is multiple // of p. func subPadding(modulus *big.Int, bitsPerLimbs uint, overflow uint, nbLimbs uint) []*big.Int { - + if modulus.Cmp(big.NewInt(0)) == 0 { + panic("modulus is zero") + } // first, we build a number nLimbs, such that nLimbs > b; // here b is defined by its bounds, that is b is an element with nbLimbs of (bitsPerLimbs+overflow) // so a number nLimbs > b, is simply taking the next power of 2 over this bound . diff --git a/std/recursion/plonk/verifier.go b/std/recursion/plonk/verifier.go index 5ae3ee0673..738790897e 100644 --- a/std/recursion/plonk/verifier.go +++ b/std/recursion/plonk/verifier.go @@ -248,7 +248,7 @@ func ValueOfProof[FR emulated.FieldParams, G1El algebra.G1ElementT, G2El algebra if err != nil { return ret, fmt.Errorf("z shifted opening proof value assignment: %w", err) } - // TODO: missing bls12-381, bls24315, bn254, bls24317 + // TODO: missing bls24317 default: return ret, fmt.Errorf("unknown parametric type combination: %T", ret) } diff --git a/std/recursion/plonk/verifier_test.go b/std/recursion/plonk/verifier_test.go index e37dac2c0c..124d50f918 100644 --- a/std/recursion/plonk/verifier_test.go +++ b/std/recursion/plonk/verifier_test.go @@ -599,3 +599,205 @@ func TestBLS12InBW6MultiHashed(t *testing.T) { err = test.IsSolved(aggCircuit, aggAssignment, ecc.BW6_761.ScalarField()) assert.NoError(err) } + +// interconnection circuit +type HubCircuit struct { + PerCircuitInput []frontend.Variable `gnark:",public"` + RootInput frontend.Variable `gnark:",public"` +} + +func (c *HubCircuit) Define(api frontend.API) error { + p := api.Mul(c.PerCircuitInput[0], c.PerCircuitInput[1]) + for i := 2; i < len(c.PerCircuitInput); i++ { + p = api.Mul(p, c.PerCircuitInput[i]) + } + api.AssertIsEqual(p, c.RootInput) + return nil +} + +type AggregationDiffPubs[FR emulated.FieldParams, G1El algebra.G1ElementT, G2El algebra.G2ElementT, GtEl algebra.GtElementT] struct { + BaseKeySinglePub BaseVerifyingKey[FR, G1El, G2El] `gnark:"-"` + CircuitKeys []CircuitVerifyingKey[FR, G1El] + Selectors []frontend.Variable + Proofs []Proof[FR, G1El, G2El] + Witnesses []Witness[FR] + + HubKey VerifyingKey[FR, G1El, G2El] `gnark:"-"` + PublicInput emulated.Element[FR] `gnark:",public"` + HubProof Proof[FR, G1El, G2El] +} + +func (c *AggregationDiffPubs[FR, G1El, G2El, GtEl]) Define(api frontend.API) error { + v, err := NewVerifier[FR, G1El, G2El, GtEl](api) + if err != nil { + return fmt.Errorf("plonk verifier: %w", err) + } + // var foldedDigests []kzg.Commitment[G1El] + // var foldedProofs []kzg.OpeningProof[FR, G1El] + // var foldedPoints []emulated.Element[FR] + // for i := range c.Proofs { + // vk, err := v.SwitchVerificationKey(c.BaseKeySinglePub, c.Selectors[i], c.CircuitKeys) + // if err != nil { + // return fmt.Errorf("switch verification key: %w", err) + // } + // dg, pr, pts, err := v.PrepareVerification(vk, c.Proofs[i], c.Witnesses[i]) + // if err != nil { + // return fmt.Errorf("prepare proof %d: %w", i, err) + // } + // foldedDigests = append(foldedDigests, dg...) + // foldedProofs = append(foldedProofs, pr...) + // foldedPoints = append(foldedPoints, pts...) + // } + if err := v.AssertDifferentProofs(c.BaseKeySinglePub, c.CircuitKeys, c.Selectors, c.Proofs, c.Witnesses); err != nil { + return fmt.Errorf("assert different proofs: %w", err) + } + hubWitness := Witness[FR]{Public: make([]emulated.Element[FR], len(c.Witnesses)+1)} + for i := range c.Witnesses { + hubWitness.Public[i] = c.Witnesses[i].Public[0] + } + hubWitness.Public[len(c.Witnesses)] = c.PublicInput + if err := v.AssertProof(c.HubKey, c.HubProof, hubWitness, WithCompleteArithmetic()); err != nil { + return fmt.Errorf("assert hub proof: %w", err) + } + // dg, pr, pts, err := v.PrepareVerification(c.HubKey, c.HubProof, hubWitness, WithCompleteArithmetic()) + // if err != nil { + // return fmt.Errorf("prepare hub proof: %w", err) + // } + // foldedDigests = append(foldedDigests, dg...) + // foldedProofs = append(foldedProofs, pr...) + // foldedPoints = append(foldedPoints, pts...) + // k, err := kzg.NewVerifier[FR, G1El, G2El, GtEl](api) + // if err != nil { + // return fmt.Errorf("kzg verifier: %w", err) + // } + // if err := k.BatchVerifyMultiPoints(foldedDigests, foldedProofs, foldedPoints, c.BaseKeySinglePub.Kzg); err != nil { + // return fmt.Errorf("batch verify multi points: %w", err) + // } + + return nil +} + +func getParametricSetups2[FR emulated.FieldParams](assert *test.Assert, field *big.Int, nbParams, nbInner int) ([]constraint.ConstraintSystem, []native_plonk.VerifyingKey, []native_plonk.ProvingKey) { + var err error + + ccss := make([]constraint.ConstraintSystem, nbParams+1) + vks := make([]native_plonk.VerifyingKey, nbParams+1) + pks := make([]native_plonk.ProvingKey, nbParams+1) + for i := range ccss { + ccss[i], err = frontend.Compile(field, scs.NewBuilder, &InnerCircuitParametric{parameter: 8 << i}) + assert.NoError(err) + } + ccss[nbParams], err = frontend.Compile(field, scs.NewBuilder, &HubCircuit{PerCircuitInput: make([]frontend.Variable, nbInner)}) + assert.NoError(err) + + srs, srsLagrange, err := unsafekzg.NewSRS(ccss[nbParams-1]) + assert.NoError(err) + srsT, ok := srs.(*kzg_bls12377.SRS) + assert.True(ok) + srsLagrangeT, ok := srsLagrange.(*kzg_bls12377.SRS) + assert.True(ok) + + for i := range vks { + sizeSystem := ccss[i].GetNbPublicVariables() + ccss[i].GetNbConstraints() + nextPowerTwo := 1 << stdbits.Len(uint(sizeSystem)) + srsLagrangeT.Pk.G1, err = kzg_bls12377.ToLagrangeG1(srsT.Pk.G1[:nextPowerTwo]) + assert.NoError(err) + pks[i], vks[i], err = native_plonk.Setup(ccss[i], srsT, srsLagrangeT) + assert.NoError(err) + } + return ccss, vks, pks +} + +func getHubProof(assert *test.Assert, outer, field *big.Int, witness []witness.Witness, ccs constraint.ConstraintSystem, vk native_plonk.VerifyingKey, pk native_plonk.ProvingKey) (native_plonk.Proof, fr_bls12377.Element) { + witnesses := make([]fr_bls12377.Element, len(witness)) + root := fr_bls12377.One() + for i := range witness { + pubWit, err := witness[i].Public() + assert.NoError(err) + vec, ok := pubWit.Vector().(fr_bls12377.Vector) + assert.True(ok) + witnesses[i] = vec[0] + root.Mul(&root, &witnesses[i]) + } + hubAssignment := HubCircuit{PerCircuitInput: make([]frontend.Variable, len(witnesses)), RootInput: root.String()} + for i := range witnesses { + hubAssignment.PerCircuitInput[i] = witnesses[i].String() + } + hubWit, err := frontend.NewWitness(&hubAssignment, field) + assert.NoError(err) + proof, err := native_plonk.Prove(ccs, pk, hubWit, GetNativeProverOptions(outer, field)) + assert.NoError(err) + hubWitPub, err := hubWit.Public() + assert.NoError(err) + err = native_plonk.Verify(proof, vk, hubWitPub, GetNativeVerifierOptions(outer, field)) + assert.NoError(err) + return proof, root +} + +func TestAggregationDiff(t *testing.T) { + innerField := ecc.BLS12_377.ScalarField() + outerField := ecc.BW6_761.ScalarField() + nbCircuits := 5 + nbProofs := 20 + assert := test.NewAssert(t) + ccss, vks, pks := getParametricSetups2[sw_bls12377.ScalarField](assert, innerField, nbCircuits, nbProofs) + hubCcs, hubVk, hubPk := ccss[nbCircuits], vks[nbCircuits], pks[nbCircuits] + innerProofs := make([]native_plonk.Proof, nbProofs) + innerWitnesses := make([]witness.Witness, nbProofs) + innerSelectors := make([]int, nbProofs) + for i := 0; i < nbProofs; i++ { + innerSelectors[i], innerWitnesses[i], innerProofs[i] = getRandomParametricProof(assert, innerField, outerField, ccss[:nbCircuits], vks[:nbCircuits], pks[:nbCircuits]) + } + hubProof, hubRoot := getHubProof(assert, outerField, innerField, innerWitnesses, hubCcs, hubVk, hubPk) + circuitHubProof, err := ValueOfProof[sw_bls12377.ScalarField, sw_bls12377.G1Affine, sw_bls12377.G2Affine](hubProof) + assert.NoError(err) + circuitVk, err := ValueOfVerifyingKey[sw_bls12377.ScalarField, sw_bls12377.G1Affine, sw_bls12377.G2Affine](hubVk) + assert.NoError(err) + circuitBvk, err := ValueOfBaseVerifyingKey[sw_bls12377.ScalarField, sw_bls12377.G1Affine, sw_bls12377.G2Affine](vks[0]) + assert.NoError(err) + circuitVks := make([]CircuitVerifyingKey[sw_bls12377.ScalarField, sw_bls12377.G1Affine], nbCircuits) + for i := range circuitVks { + circuitVks[i], err = ValueOfCircuitVerifyingKey[sw_bls12377.ScalarField, sw_bls12377.G1Affine](vks[i]) + assert.NoError(err) + } + circuitSelector := make([]frontend.Variable, nbProofs) + for i := range circuitSelector { + circuitSelector[i] = innerSelectors[i] + } + circuitProofs := make([]Proof[sw_bls12377.ScalarField, sw_bls12377.G1Affine, sw_bls12377.G2Affine], nbProofs) + for i := range circuitProofs { + circuitProofs[i], err = ValueOfProof[sw_bls12377.ScalarField, sw_bls12377.G1Affine, sw_bls12377.G2Affine](innerProofs[i]) + assert.NoError(err) + } + circuitWitnesses := make([]Witness[sw_bls12377.ScalarField], nbProofs) + for i := range circuitWitnesses { + circuitWitnesses[i], err = ValueOfWitness[sw_bls12377.ScalarField](innerWitnesses[i]) + assert.NoError(err) + } + aggCircuit := &AggregationDiffPubs[sw_bls12377.ScalarField, sw_bls12377.G1Affine, sw_bls12377.G2Affine, sw_bls12377.GT]{ + BaseKeySinglePub: circuitBvk, + CircuitKeys: make([]CircuitVerifyingKey[sw_bls12377.ScalarField, sw_bls12377.G1Affine], nbCircuits), + Selectors: make([]frontend.Variable, nbProofs), + Proofs: make([]Proof[sw_bls12377.ScalarField, sw_bls12377.G1Affine, sw_bls12377.G2Affine], nbProofs), + Witnesses: make([]Witness[sw_bls12377.ScalarField], nbProofs), + HubKey: circuitVk, + HubProof: PlaceholderProof[sw_bls12377.ScalarField, sw_bls12377.G1Affine, sw_bls12377.G2Affine](hubCcs), + } + for i := 0; i < nbCircuits; i++ { + aggCircuit.CircuitKeys[i] = PlaceholderCircuitVerifyingKey[sw_bls12377.ScalarField, sw_bls12377.G1Affine](ccss[i]) + } + for i := 0; i < nbProofs; i++ { + aggCircuit.Proofs[i] = PlaceholderProof[sw_bls12377.ScalarField, sw_bls12377.G1Affine, sw_bls12377.G2Affine](ccss[0]) + aggCircuit.Witnesses[i] = PlaceholderWitness[sw_bls12377.ScalarField](ccss[0]) + } + aggAssignment := &AggregationDiffPubs[sw_bls12377.ScalarField, sw_bls12377.G1Affine, sw_bls12377.G2Affine, sw_bls12377.GT]{ + CircuitKeys: circuitVks, + Selectors: circuitSelector, + Proofs: circuitProofs, + Witnesses: circuitWitnesses, + PublicInput: emulated.ValueOf[sw_bls12377.ScalarField](hubRoot), + HubProof: circuitHubProof, + } + err = test.IsSolved(aggCircuit, aggAssignment, ecc.BW6_761.ScalarField()) + assert.NoError(err) +} diff --git a/std/signature/ecdsa/doc.go b/std/signature/ecdsa/doc.go new file mode 100644 index 0000000000..4da4dbcd60 --- /dev/null +++ b/std/signature/ecdsa/doc.go @@ -0,0 +1,13 @@ +// Package ecdsa implements ECDSA signature verification over any elliptic curve. +// +// The package depends on the [emulated/sw_emulated] package for elliptic curve +// group operations using non-native arithmetic. Thus we can verify ECDSA +// signatures over any curve. The cost for a single secp256k1 signature +// verification in a BN254-SNARK is approximately 122k constraints in R1CS and +// 453k constraints in PLONKish. +// +// See [ECDSA] for the signature verification algorithm. +// +// [ECDSA]: +// https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm +package ecdsa diff --git a/std/signature/ecdsa/ecdsa.go b/std/signature/ecdsa/ecdsa.go index cac32d7db1..066e6e15a5 100644 --- a/std/signature/ecdsa/ecdsa.go +++ b/std/signature/ecdsa/ecdsa.go @@ -1,16 +1,3 @@ -/* -Package ecdsa implements ECDSA signature verification over any elliptic curve. - -The package depends on the [emulated/sw_emulated] package for elliptic curve group -operations using non-native arithmetic. Thus we can verify ECDSA signatures over -any curve. The cost for a single secp256k1 signature verification is -approximately 4M constraints in R1CS and 10M constraints in PLONKish. - -See [ECDSA] for the signature verification algorithm. - -[ECDSA]: -https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm -*/ package ecdsa import ( @@ -34,7 +21,6 @@ type PublicKey[Base, Scalar emulated.FieldParams] sw_emulated.AffinePoint[Base] func (pk PublicKey[T, S]) Verify(api frontend.API, params sw_emulated.CurveParams, msg *emulated.Element[S], sig *Signature[S]) { cr, err := sw_emulated.New[T, S](api, params) if err != nil { - // TODO: softer handling. panic(err) } scalarApi, err := emulated.NewField[S](api) diff --git a/std/signature/eddsa/doc.go b/std/signature/eddsa/doc.go new file mode 100644 index 0000000000..c54c6693e7 --- /dev/null +++ b/std/signature/eddsa/doc.go @@ -0,0 +1,15 @@ +// Package eddsa implements EdDSA signature verification over twisted Edwards +// elliptic curves available in gnark and gnark-crypto. These are the so-called +// "embedded curves" (e.g. Baby-Jubjub, Bandersnatch...) defined over the scalar +// field of the pairing-friendly SNARK curves (e.g. BN254, BLS12-381...) +// +// The package depends on the [native/twistededwards] package for elliptic +// curve group operations in twisted Edwards form using native arithmetic. The +// cost for a single baby-jubjub signature verification in a BN254-SNARK is +// approximately 7k constraints in R1CS and 11k constraints in PLONKish. +// +// See [EdDSA] for the signature verification algorithm. +// +// [EdDSA]: +// https://en.wikipedia.org/wiki/EdDSA +package eddsa diff --git a/std/signature/eddsa/eddsa.go b/std/signature/eddsa/eddsa.go index b0841de4ad..e4a3a41f77 100644 --- a/std/signature/eddsa/eddsa.go +++ b/std/signature/eddsa/eddsa.go @@ -1,20 +1,3 @@ -/* -Copyright © 2020 ConsenSys - -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 eddsa provides a ZKP-circuit function to verify a EdDSA signature. package eddsa import (