Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Performance improvement and simplification #44

Merged
merged 30 commits into from
Jan 19, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
5b1bdeb
Remove bytes number in error
RCasatta Jan 18, 2025
7f594a2
Introduce scan_len fn
RCasatta Jan 18, 2025
e84e178
add scan_len tests
RCasatta Jan 18, 2025
3fa1a12
add parse/scan len benches
RCasatta Jan 18, 2025
f73fba4
add test block
RCasatta Jan 18, 2025
a2498e0
fix scan len
RCasatta Jan 18, 2025
c00afd2
add bench for script parsing
RCasatta Jan 18, 2025
8145db8
improve script parsing by ~4%
RCasatta Jan 18, 2025
cec800a
add bench for witness
RCasatta Jan 18, 2025
ed8e42b
add test malformed witness
RCasatta Jan 18, 2025
8cdd0bc
use scan_len and avoid read_slice in witness
RCasatta Jan 18, 2025
82ddc1b
bench witnesses
RCasatta Jan 18, 2025
d92907e
remove latest parse_len instance with scan_len
RCasatta Jan 18, 2025
765b89e
add simpler read numbers fn
RCasatta Jan 18, 2025
844df7a
add benches just for header
RCasatta Jan 18, 2025
a929738
use new read fn for block_header
RCasatta Jan 18, 2025
603a287
avoid read_slice in OutPoint
RCasatta Jan 18, 2025
d3df677
in Transaction avoid U* use read_u* fn
RCasatta Jan 18, 2025
4c4b15c
avoid U32,U64 in TxIn & TxOut
RCasatta Jan 18, 2025
6c3a319
deprecate read_slice
RCasatta Jan 18, 2025
e5e8e93
impl split_at_checked equivalent to respect MSRV
RCasatta Jan 19, 2025
a631a95
clippy lints
RCasatta Jan 19, 2025
2c7b27b
use 1.82.0 for clippy
RCasatta Jan 19, 2025
da43447
fix possible overflow
RCasatta Jan 19, 2025
c896152
fix fuzz targets and run on nix
RCasatta Jan 19, 2025
4edd90a
add fuzz corpus
RCasatta Jan 19, 2025
ae204e0
add fuzz to ci
RCasatta Jan 19, 2025
609893e
bump version 0.9.2 -> 0.10.0
RCasatta Jan 19, 2025
85b94c4
update benches in Readme
RCasatta Jan 19, 2025
d03e677
add bench bitcoin header
RCasatta Jan 19, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
17 changes: 16 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: dtolnay/rust-toolchain@stable
- uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.82.0"
components: rustfmt, clippy
- run: cargo fmt --all -- --check
- run: cargo clippy -- -D warnings
Expand All @@ -52,3 +53,17 @@ jobs:
- uses: actions/checkout@v3
- uses: dtolnay/rust-toolchain@stable
- run: cargo bench --all-features

fuzz:
name: Fuzz
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
fuzz_target: ["block", "block_header", "len", "out_point", "script", "transaction", "tx_in", "tx_ins", "tx_out", "tx_outs", "witness", "witnesses"]
steps:
- uses: actions/checkout@v3
- uses: dtolnay/rust-toolchain@nightly
- run: cargo install cargo-fuzz
- run: cargo fuzz run ${{ matrix.fuzz_target }} -- -max_total_time=120

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "bitcoin_slices"
version = "0.9.2"
version = "0.10.0"
edition = "2021"
authors = ["Riccardo Casatta <[email protected]>"]
description = "Parse Bitcoin objects without allocations"
Expand Down
51 changes: 35 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -133,28 +133,40 @@ cargo bench --bench benches --all-features -- --output-format bencher
```

```sh
test tx_deserialize/slices ... bench: 29 ns/iter (+/- 0)
test tx_deserialize/bitcoin ... bench: 211 ns/iter (+/- 0)
test tx_deserialize/slices ... bench: 13 ns/iter (+/- 0)
test tx_deserialize/bitcoin ... bench: 203 ns/iter (+/- 4)

test tx_id/slices_bitcoin_hashes ... bench: 183 ns/iter (+/- 0)
test tx_id/slices_sha2 ... bench: 158 ns/iter (+/- 0)
test tx_id/bitcoin ... bench: 234 ns/iter (+/- 1)
test tx_id/slices_bitcoin_hashes ... bench: 180 ns/iter (+/- 1)
test tx_id/slices_sha2 ... bench: 152 ns/iter (+/- 0)
test tx_id/bitcoin ... bench: 232 ns/iter (+/- 2)

test block_deserialize/slices ... bench: 230872 ns/iter (+/- 1686)
test block_deserialize/bitcoin ... bench: 1462784 ns/iter (+/- 115792)
test block_deserialize/slices ... bench: 104902 ns/iter (+/- 4190)
test block_deserialize/bitcoin ... bench: 1177448 ns/iter (+/- 64613)
test block_deserialize/slices_header ... bench: 0 ns/iter (+/- 0)
test block_deserialize/bitcoin_header ... bench: 29 ns/iter (+/- 2)

test block_sum_outputs/slices ... bench: 235757 ns/iter (+/- 1318)
test block_sum_outputs/bitcoin ... bench: 1459730 ns/iter (+/- 95817)
test block_sum_outputs/slices ... bench: 109554 ns/iter (+/- 3753)
test block_sum_outputs/bitcoin ... bench: 1189417 ns/iter (+/- 49148)

test hash_block_txs/slices ... bench: 881940 ns/iter (+/- 4961)
test hash_block_txs/slices_sha2 ... bench: 789365 ns/iter (+/- 932)
test hash_block_txs/bitcoin ... bench: 2301561 ns/iter (+/- 15406)
test hash_block_txs/slices ... bench: 742792 ns/iter (+/- 1269)
test hash_block_txs/slices_sha2 ... bench: 650505 ns/iter (+/- 3008)
test hash_block_txs/bitcoin ... bench: 1976693 ns/iter (+/- 12015)
test hash_block_txs/bitcoin_block_ready ... bench: 797423 ns/iter (+/- 4884)

test find_tx/slices ... bench: 406519 ns/iter (+/- 1423)
test find_tx/bitcoin ... bench: 1826147 ns/iter (+/- 122216)
test find_tx/slices ... bench: 327972 ns/iter (+/- 2049)
test find_tx/bitcoin ... bench: 1548186 ns/iter (+/- 60774)

test block_hash/slices ... bench: 112 ns/iter (+/- 0)
test block_hash/bitcoin ... bench: 137 ns/iter (+/- 0)

test len/scan_len ... bench: 5 ns/iter (+/- 0)
test len/parse_len ... bench: 5 ns/iter (+/- 0)

test script/parse ... bench: 12 ns/iter (+/- 0)

test witness/parse_single_witness ... bench: 18 ns/iter (+/- 0)
test witness/parse_multiple_witnesses ... bench: 29 ns/iter (+/- 0)

test block_hash/slices ... bench: 112 ns/iter (+/- 0)
test block_hash/bitcoin ... bench: 146 ns/iter (+/- 2)
```

* benches variants with `/bitcoin` use `rust-bitcoin`
Expand Down Expand Up @@ -193,6 +205,13 @@ Minimize corpus:
cargo +nightly fuzz cmin transaction
```

For NixOs there is a flake with a shell to setup the environment and run fuzzing.
```sh
cd fuzz
nix develop -C $SHELL
cargo fuzz run transaction
```

## Doc

To build docs:
Expand Down
128 changes: 127 additions & 1 deletion benches/benches.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
use bitcoin::consensus::deserialize;
use bitcoin_hashes::sha256d;
use bitcoin_slices::bsl;
use bitcoin_slices::bsl::scan_len;
use bitcoin_slices::bsl::{Block, BlockHeader, FindTransaction, Transaction, TxOut};
use bitcoin_slices::{Parse, Visit, Visitor};
use bitcoin_test_data::blocks::mainnet_702861;
Expand All @@ -19,7 +21,10 @@ criterion_group!(
block_sum_outputs,
hash_block_txs,
find_tx,
block_hash
block_hash,
len,
script,
witness,
);
criterion_main!(benches);

Expand Down Expand Up @@ -77,6 +82,18 @@ pub fn block_deserialize(c: &mut Criterion) {
let block: bitcoin::Block = deserialize(mainnet_702861()).unwrap();
black_box(&block);
})
})
.bench_function("slices_header", |b| {
b.iter(|| {
let block_header = BlockHeader::parse(&GENESIS_BLOCK_HEADER).unwrap();
black_box(&block_header);
})
})
.bench_function("bitcoin_header", |b| {
b.iter(|| {
let block: bitcoin::block::Header = deserialize(&GENESIS_BLOCK_HEADER).unwrap();
black_box(&block);
})
});
}

Expand Down Expand Up @@ -237,3 +254,112 @@ pub fn block_hash(c: &mut Criterion) {
})
});
}

#[allow(deprecated)]
pub fn len(c: &mut Criterion) {
let slices = [
&[0x01u8][..], // small value
&[0xFC][..], // max small value
&[0xFD, 0xFD, 0x00][..], // minimal FD encoding
&[0xFD, 0xFF, 0xFF][..], // max FD value
&[0xFE, 0x00, 0x00, 0x01, 0x00][..], // minimal FE encoding
&[0xFE, 0xFF, 0xFF, 0xFF, 0xFF][..], // max FE value
&[0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00][..], // minimal FF encoding
&[0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF][..], // max FF value
];
c.benchmark_group("len")
.bench_function("scan_len", |b| {
b.iter(|| {
let mut sum = 0u128;
let mut value_ok = 0u64;
let mut consumed = 0;
for slice in slices {
let len = scan_len(&slice[..], &mut consumed).unwrap();
sum += len as u128;
value_ok += 1;
black_box(&len);
}
assert_eq!(sum, 18446744082299617783); // All values summed
assert_eq!(value_ok, 8);
})
})
.bench_function("parse_len", |b| {
b.iter(|| {
let mut sum = 0u128;
let mut value_ok = 0u64;
for slice in slices {
#[allow(deprecated)]
let len = bitcoin_slices::bsl::parse_len(&slice[..]).unwrap();

sum += len.n() as u128;
value_ok += 1;
black_box(&len.n());
black_box(&len.consumed());
}
assert_eq!(sum, 18446744082299617783); // All values summed
assert_eq!(value_ok, 8);
})
});
}

pub fn script(c: &mut Criterion) {
let slices = [
&[0x01u8, 0x00][..], // 1 byte script
&[0x06u8, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06][..], // 6 byte script
&[0xFDu8, 0xFD, 0x00, 0x00][..], // minimal FD encoding
&[0xFDu8, 0xFF, 0xFF][..], // invalid - not enough bytes
&[0xFEu8, 0x00, 0x00, 0x01, 0x00, 0x00][..], // minimal FE encoding
&[0xFEu8, 0xFF, 0xFF, 0xFF][..], // invalid - not enough bytes
&[0xFFu8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00][..], // minimal FF encoding
&[0xFFu8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF][..], // invalid - not enough bytes
];
c.benchmark_group("script").bench_function("parse", |b| {
b.iter(|| {
for slice in slices {
let script = bsl::Script::parse(&slice[..]);
black_box(&script);
}
})
});
}
pub fn witness(c: &mut Criterion) {
c.benchmark_group("witness")
.bench_function("parse_single_witness", |b| {
let slices = [
&[0x00][..], // empty witness
&[0x01, 0x01, 0x00][..], // one empty element
&[0x02, 0x01, 0x00, 0x01, 0x00][..], // two empty elements
&[0x02, 0x01, 0x42, 0x01, 0x43][..], // two single byte elements
&[0x02, 0x02, 0x42, 0x43, 0x02, 0x44, 0x45][..], // two two-byte elements
&[0x02][..], // invalid - missing witness elements
&[0x01, 0x01][..], // invalid - missing witness data
&[0x02, 0x02, 0x42, 0x43, 0x02][..], // invalid - incomplete second witness
&[0x02, 0x02, 0x42][..], // invalid - incomplete first witness
&[0xFF, 0xFF][..], // invalid - too many witness elements
];
b.iter(|| {
for slice in slices {
let witnesses = bsl::Witness::parse(&slice[..]);
black_box(&witnesses);
}
})
});
c.benchmark_group("witness")
.bench_function("parse_multiple_witnesses", |b| {
let slices = [
&[0x01, 0x01, 0x00, 0x02, 0x01, 0x00, 0x01, 0x00][..], // first witness is [[0]], second witness is [[0][0]]
&[0x01, 0x00][..], // empty witness
&[0x01, 0x01, 0x00][..], // one empty element
&[0x02, 0x01, 0x00, 0x01, 0x00][..], // two empty elements
&[0x02, 0x01, 0x42, 0x01, 0x43][..], // two single byte elements
&[0x02, 0x02, 0x42, 0x43, 0x02, 0x44, 0x45][..], // two two-byte elements
&[0x03, 0x01, 0x42, 0x02, 0x43, 0x44, 0x03, 0x45, 0x46, 0x47][..], // three elements of increasing size
];
b.iter(|| {
for slice in slices {
let witnesses = bsl::Witnesses::parse(&slice[..], 1);
black_box(&witnesses);
}
})
});
}
4 changes: 2 additions & 2 deletions fuzz/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
1 change: 1 addition & 0 deletions fuzz/corpus/block/1a5ac28859a58cbe99dd7c477c02a59d3664ce52
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
00000000000%00000000000000ÇÇÇÇÇÇÇÇÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÇÇÇÇ=Ç0000000TTTWWWWWWWWWWWTTT0ÿÿÿÿÿÿ000000000000000Z000000000000
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
1 change: 1 addition & 0 deletions fuzz/corpus/block/44811899dc61b60a68b33c74ee9f8801abf19e19
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0000000000000000000000000ÇÇÇÇÇÇÇÇÇÇÇÇ=Ç00000TTTTTT0ÿÿÿÿÿÿ000000000000000Z000000000000
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
1 change: 1 addition & 0 deletions fuzz/corpus/block/7e15bb5c01e7dd56499e37c634cf791d3a519aee
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
`
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
1 change: 1 addition & 0 deletions fuzz/corpus/block/86e1d8dbd0814c7279a304ee0c93bab6ce74ceac
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0000000000000000000000000ÇÇÇÇÇÇ000000000000000000000000ÇÇÇÇÇÇÇÇÇÇÇÇ=Ç00000TTTTTT0ÿÿÿÿÿ
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
1 change: 1 addition & 0 deletions fuzz/corpus/block/9af169a57089379f75ece359836d8e279c9cae93
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0000000000000000000000000ÇÇ@ÇÇÇÇÇÇÇÇÇÇ=Ç000000ÿÿÿÿÿÿ0000000000000000000Z000000000000
Binary file not shown.
Binary file not shown.
Binary file not shown.
1 change: 1 addition & 0 deletions fuzz/corpus/block/a14bae3cdc8f4c38d75edc4f6e567a9af89d1f45
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0000000000000008000000000ÇÇÇÇÇÇ000000000000000000000000ÇÇÇÇÇÇÇÇÇÇÇÇ=Ç00000TTTTTT0ÿÿÿÿTTT0T0T0T0ÿÿK00000Z000-00þþþþþþþþþþþþþÿ
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
1 change: 1 addition & 0 deletions fuzz/corpus/block/b6c16f71e67514107386e47202fb9a2f4e6a8486
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0000ÐÆ00000c00000800;00ÇÇÇÇÇÇÇÇÇÇÇ*=Ç0000ÿTTTTÿT0T0ÿÿÿÿ0ÿÿ00ÿÿÿþþþþþþ0ÐÆ0ÿÿ
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
1 change: 1 addition & 0 deletions fuzz/corpus/block/c4f48acee18b093116f8d4b7124736fd81521303
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0000000000000000000000000ÇÇÇÇÇÇÇÇÇÇÇÇ=Ç000000ÿÿÿÿÿÿ000000000000000Z000000000000
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
1 change: 1 addition & 0 deletions fuzz/corpus/block/ccb37c00d6a504396572e4e50c844a2b8f38eb53
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
000000000000000000ÇÇǽÇ00TTT0T0TF0T0ÿÿK00000Z00000þþþþþþþþþþþþþþþþþþþþþþþþþþ0000þ000
1 change: 1 addition & 0 deletions fuzz/corpus/block/cd90f8c2db7b24130df450feb2c8b26df0b006c9
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
`ýýýýýÇýý(ýýýíýýýýýýýýýý}ýýýýýýýýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýýýýýýýýüýýýýý
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
(rrrrrrrrrrrrrrrrrrrrrrÿÿÿÿrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
8
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
1 change: 1 addition & 0 deletions fuzz/corpus/len/53e3d892b95dd3d318f547cd2742620ea17cafbc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ýï\
Binary file not shown.
Binary file not shown.
Binary file not shown.
1 change: 1 addition & 0 deletions fuzz/corpus/len/85e53271e14006f0265921d02d4d736cdc580b0b
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ÿ
1 change: 1 addition & 0 deletions fuzz/corpus/len/adc83b19e793491b1c6ea0fd8b46cd9f32e592fc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

1 change: 1 addition & 0 deletions fuzz/corpus/len/b54664965911c6fe91e18cd01b68a75c8183b530
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ý
1 change: 1 addition & 0 deletions fuzz/corpus/len/b68542373c05c0ed25231d09955b2c699d37c45b
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
þ
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ÿþþþFÿÿÿÿÿÿ
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ÿþ
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ý!ÿÿÿÿ
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
þþþþi
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ý
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ÿ
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ý
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
þ
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ö&ö&þ
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@

/
z
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading
Loading