[INFO] cloning repository https://github.com/tooxo/deriche [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/tooxo/deriche" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Ftooxo%2Fderiche", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Ftooxo%2Fderiche'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] 5d98daae8f98a7d254fb306169f6f953b7c2b800 [INFO] linting tooxo/deriche against nightly for clippy-nonminimal_bool-denied [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Ftooxo%2Fderiche" "/workspace/builds/worker-5-tc1/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-5-tc1/source'... [INFO] [stderr] done. [INFO] started tweaking git repo https://github.com/tooxo/deriche [INFO] finished tweaking git repo https://github.com/tooxo/deriche [INFO] tweaked toml for git repo https://github.com/tooxo/deriche written to /workspace/builds/worker-5-tc1/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/tooxo/deriche on toolchain nightly [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+nightly" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate git repo https://github.com/tooxo/deriche already has a lockfile, it will not be regenerated [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+nightly" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] [stderr] Downloading crates ... [INFO] [stderr] Downloaded ravif v0.11.5 [INFO] [stderr] Downloaded bytemuck v1.16.0 [INFO] [stderr] Downloaded profiling-procmacros v1.0.15 [INFO] [stderr] Downloaded avif-serialize v0.8.1 [INFO] [stderr] Downloaded profiling v1.0.15 [INFO] [stderr] Downloaded rgb v0.8.37 [INFO] [stderr] Downloaded jobserver v0.1.31 [INFO] [stderr] Downloaded fdeflate v0.3.4 [INFO] [stderr] Downloaded built v0.7.2 [INFO] [stderr] Downloaded toml v0.8.13 [INFO] [stderr] Downloaded bitstream-io v2.3.0 [INFO] [stderr] Downloaded target-lexicon v0.12.14 [INFO] [stderr] Downloaded imgref v1.10.1 [INFO] [stderr] Downloaded image-webp v0.1.2 [INFO] [stderr] Downloaded toml_edit v0.22.13 [INFO] [stderr] Downloaded flate2 v1.0.30 [INFO] [stderr] Downloaded zune-jpeg v0.4.11 [INFO] [stderr] Downloaded png v0.17.13 [INFO] [stderr] Downloaded libfuzzer-sys v0.4.7 [INFO] [stderr] Downloaded winnow v0.6.8 [INFO] [stderr] Downloaded exr v1.72.0 [INFO] [stderr] Downloaded image v0.25.1 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+nightly" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] f06fbf7950b0884320b11025e3106ba102684374cb184ede79e4b3f35dd16d10 [INFO] running `Command { std: "docker" "start" "-a" "f06fbf7950b0884320b11025e3106ba102684374cb184ede79e4b3f35dd16d10", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "f06fbf7950b0884320b11025e3106ba102684374cb184ede79e4b3f35dd16d10", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "f06fbf7950b0884320b11025e3106ba102684374cb184ede79e4b3f35dd16d10", kill_on_drop: false }` [INFO] [stdout] f06fbf7950b0884320b11025e3106ba102684374cb184ede79e4b3f35dd16d10 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+nightly" "clippy" "--frozen" "--all" "--all-targets" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] daca0f9ea91c3ed71b01e73f06ebffc6c60b392ba4ff43b636c84849070cfe98 [INFO] running `Command { std: "docker" "start" "-a" "daca0f9ea91c3ed71b01e73f06ebffc6c60b392ba4ff43b636c84849070cfe98", kill_on_drop: false }` [INFO] [stderr] Compiling crossbeam-utils v0.8.20 [INFO] [stderr] Compiling rayon-core v1.12.1 [INFO] [stderr] Checking simd-adler32 v0.3.7 [INFO] [stderr] Checking adler v1.0.2 [INFO] [stderr] Checking either v1.12.0 [INFO] [stderr] Checking num-integer v0.1.46 [INFO] [stderr] Compiling anyhow v1.0.86 [INFO] [stderr] Compiling syn v2.0.65 [INFO] [stderr] Checking memchr v2.7.2 [INFO] [stderr] Checking aligned-vec v0.5.0 [INFO] [stderr] Checking miniz_oxide v0.7.3 [INFO] [stderr] Compiling built v0.7.2 [INFO] [stderr] Checking arrayvec v0.7.4 [INFO] [stderr] Checking num-bigint v0.4.5 [INFO] [stderr] Checking v_frame v0.3.8 [INFO] [stderr] Checking crc32fast v1.4.2 [INFO] [stderr] Compiling rav1e v0.7.1 [INFO] [stderr] Checking bytemuck v1.16.0 [INFO] [stderr] Checking itertools v0.12.1 [INFO] [stderr] Checking flate2 v1.0.30 [INFO] [stderr] Checking nom v7.1.3 [INFO] [stderr] Compiling simd_helpers v0.1.0 [INFO] [stderr] Checking crossbeam-epoch v0.9.18 [INFO] [stderr] Compiling noop_proc_macro v0.3.0 [INFO] [stderr] Checking crossbeam-deque v0.8.5 [INFO] [stderr] Checking imgref v1.10.1 [INFO] [stderr] Checking new_debug_unreachable v1.0.6 [INFO] [stderr] Checking weezl v0.1.8 [INFO] [stderr] Checking bitstream-io v2.3.0 [INFO] [stderr] Checking loop9 v0.1.5 [INFO] [stderr] Checking rgb v0.8.37 [INFO] [stderr] Checking flume v0.11.0 [INFO] [stderr] Checking avif-serialize v0.8.1 [INFO] [stderr] Checking zune-inflate v0.2.54 [INFO] [stderr] Checking fdeflate v0.3.4 [INFO] [stderr] Checking rayon v1.10.0 [INFO] [stderr] Checking num-rational v0.4.2 [INFO] [stderr] Checking half v2.4.1 [INFO] [stderr] Checking zune-core v0.4.12 [INFO] [stderr] Checking quick-error v2.0.1 [INFO] [stderr] Checking bit_field v0.10.2 [INFO] [stderr] Checking jpeg-decoder v0.3.1 [INFO] [stderr] Checking byteorder-lite v0.1.0 [INFO] [stderr] Checking color_quant v1.1.0 [INFO] [stderr] Checking lebe v0.5.2 [INFO] [stderr] Checking bitflags v1.3.2 [INFO] [stderr] Checking png v0.17.13 [INFO] [stderr] Checking gif v0.13.1 [INFO] [stderr] Checking exr v1.72.0 [INFO] [stderr] Checking zune-jpeg v0.4.11 [INFO] [stderr] Checking qoi v0.4.1 [INFO] [stderr] Checking tiff v0.9.1 [INFO] [stderr] Checking byteorder v1.5.0 [INFO] [stderr] Checking av1-grain v0.2.3 [INFO] [stderr] Checking maybe-rayon v0.1.1 [INFO] [stderr] Compiling thiserror-impl v1.0.61 [INFO] [stderr] Compiling profiling-procmacros v1.0.15 [INFO] [stderr] Compiling num-derive v0.4.2 [INFO] [stderr] Compiling arg_enum_proc_macro v0.3.4 [INFO] [stderr] Checking profiling v1.0.15 [INFO] [stderr] Checking thiserror v1.0.61 [INFO] [stderr] Checking image-webp v0.1.2 [INFO] [stderr] Checking ravif v0.11.5 [INFO] [stderr] Checking image v0.25.1 [INFO] [stderr] Checking deriche v0.1.0 (/opt/rustwide/workdir) [INFO] [stdout] warning: unused import: `WrappingAdd` [INFO] [stdout] --> src/detector.rs:5:51 [INFO] [stdout] | [INFO] [stdout] 5 | use num_traits::{Bounded, cast, NumCast, PrimInt, WrappingAdd, Zero}; [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `WrappingAdd` [INFO] [stdout] --> src/detector.rs:5:51 [INFO] [stdout] | [INFO] [stdout] 5 | use num_traits::{Bounded, cast, NumCast, PrimInt, WrappingAdd, Zero}; [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variable does not need to be mutable [INFO] [stdout] --> src/image.rs:22:13 [INFO] [stdout] | [INFO] [stdout] 22 | let mut buf = vec![T::zero(); width * height]; [INFO] [stdout] | ----^^^ [INFO] [stdout] | | [INFO] [stdout] | help: remove this `mut` [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variable does not need to be mutable [INFO] [stdout] --> src/image.rs:123:13 [INFO] [stdout] | [INFO] [stdout] 123 | let mut buf = Vec::from(value.as_raw().as_slice()); [INFO] [stdout] | ----^^^ [INFO] [stdout] | | [INFO] [stdout] | help: remove this `mut` [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unnecessary `unsafe` block [INFO] [stdout] --> src/image.rs:193:13 [INFO] [stdout] | [INFO] [stdout] 193 | unsafe { &self.zero } [INFO] [stdout] | ^^^^^^ unnecessary `unsafe` block [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_unsafe)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `Deriche` is never constructed [INFO] [stdout] --> src/detector.rs:13:8 [INFO] [stdout] | [INFO] [stdout] 13 | struct Deriche {} [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `g` is never used [INFO] [stdout] --> src/detector.rs:33:4 [INFO] [stdout] | [INFO] [stdout] 33 | fn g(r: &mut [T], i: isize) -> T [INFO] [stdout] | ^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `hysteresis` is never used [INFO] [stdout] --> src/detector.rs:214:4 [INFO] [stdout] | [INFO] [stdout] 214 | fn hysteresis() {} [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `set` is never used [INFO] [stdout] --> src/image.rs:71:8 [INFO] [stdout] | [INFO] [stdout] 18 | / impl GreyscaleImage [INFO] [stdout] 19 | | where T: Copy + Zero + Sized [INFO] [stdout] | |________________________________- method in this implementation [INFO] [stdout] ... [INFO] [stdout] 71 | fn set(&mut self, x: usize, y: usize, value: T) { [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variable does not need to be mutable [INFO] [stdout] --> src/image.rs:22:13 [INFO] [stdout] | [INFO] [stdout] 22 | let mut buf = vec![T::zero(); width * height]; [INFO] [stdout] | ----^^^ [INFO] [stdout] | | [INFO] [stdout] | help: remove this `mut` [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/image.rs:87:24 [INFO] [stdout] | [INFO] [stdout] 87 | if !(i + b < n) { break; } [INFO] [stdout] | ^^^^^^^^^^^^ help: try: `(i + b >= n)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stdout] = note: `#[warn(clippy::nonminimal_bool)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variable does not need to be mutable [INFO] [stdout] --> src/image.rs:123:13 [INFO] [stdout] | [INFO] [stdout] 123 | let mut buf = Vec::from(value.as_raw().as_slice()); [INFO] [stdout] | ----^^^ [INFO] [stdout] | | [INFO] [stdout] | help: remove this `mut` [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unnecessary `unsafe` block [INFO] [stdout] --> src/image.rs:193:13 [INFO] [stdout] | [INFO] [stdout] 193 | unsafe { &self.zero } [INFO] [stdout] | ^^^^^^ unnecessary `unsafe` block [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_unsafe)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: struct `Deriche` is never constructed [INFO] [stdout] --> src/detector.rs:13:8 [INFO] [stdout] | [INFO] [stdout] 13 | struct Deriche {} [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `g` is never used [INFO] [stdout] --> src/detector.rs:33:4 [INFO] [stdout] | [INFO] [stdout] 33 | fn g(r: &mut [T], i: isize) -> T [INFO] [stdout] | ^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `hysteresis` is never used [INFO] [stdout] --> src/detector.rs:214:4 [INFO] [stdout] | [INFO] [stdout] 214 | fn hysteresis() {} [INFO] [stdout] | ^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `set` is never used [INFO] [stdout] --> src/image.rs:71:8 [INFO] [stdout] | [INFO] [stdout] 18 | / impl GreyscaleImage [INFO] [stdout] 19 | | where T: Copy + Zero + Sized [INFO] [stdout] | |________________________________- method in this implementation [INFO] [stdout] ... [INFO] [stdout] 71 | fn set(&mut self, x: usize, y: usize, value: T) { [INFO] [stdout] | ^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: an implementation of `From` is preferred since it gives you `Into<_>` for free where the reverse isn't true [INFO] [stdout] --> src/image.rs:133:1 [INFO] [stdout] | [INFO] [stdout] 133 | / impl Into, Vec>> for GreyscaleImage [INFO] [stdout] 134 | | where T: Copy + Clone + image::Primitive { [INFO] [stdout] 135 | | fn into(self) -> ImageBuffer, Vec> { [INFO] [stdout] 136 | | ImageBuffer::from_raw(self.width as u32, self.height as u32, Vec::from(self.data)).unwrap() [INFO] [stdout] 137 | | } [INFO] [stdout] 138 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: `impl From for Foreign` is allowed by the orphan rules, for more information see [INFO] [stdout] https://doc.rust-lang.org/reference/items/implementations.html#trait-implementation-coherence [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_over_into [INFO] [stdout] = note: `#[warn(clippy::from_over_into)]` on by default [INFO] [stdout] help: replace the `Into` implementation with `From>` [INFO] [stdout] | [INFO] [stdout] 133 ~ impl From> for ImageBuffer, Vec> [INFO] [stdout] 134 | where T: Copy + Clone + image::Primitive { [INFO] [stdout] 135 ~ fn from(val: GreyscaleImage) -> Self { [INFO] [stdout] 136 ~ ImageBuffer::from_raw(val.width as u32, val.height as u32, Vec::from(val.data)).unwrap() [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/image.rs:145:9 [INFO] [stdout] | [INFO] [stdout] 145 | &self.at(index.0, index.1) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `self.at(index.0, index.1)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] = note: `#[warn(clippy::needless_borrow)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this boolean expression can be simplified [INFO] [stdout] --> src/image.rs:87:24 [INFO] [stdout] | [INFO] [stdout] 87 | if !(i + b < n) { break; } [INFO] [stdout] | ^^^^^^^^^^^^ help: try: `(i + b >= n)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#nonminimal_bool [INFO] [stdout] = note: `#[warn(clippy::nonminimal_bool)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: an implementation of `From` is preferred since it gives you `Into<_>` for free where the reverse isn't true [INFO] [stdout] --> src/image.rs:133:1 [INFO] [stdout] | [INFO] [stdout] 133 | / impl Into, Vec>> for GreyscaleImage [INFO] [stdout] 134 | | where T: Copy + Clone + image::Primitive { [INFO] [stdout] 135 | | fn into(self) -> ImageBuffer, Vec> { [INFO] [stdout] 136 | | ImageBuffer::from_raw(self.width as u32, self.height as u32, Vec::from(self.data)).unwrap() [INFO] [stdout] 137 | | } [INFO] [stdout] 138 | | } [INFO] [stdout] | |_^ [INFO] [stdout] | [INFO] [stdout] = help: `impl From for Foreign` is allowed by the orphan rules, for more information see [INFO] [stdout] https://doc.rust-lang.org/reference/items/implementations.html#trait-implementation-coherence [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#from_over_into [INFO] [stdout] = note: `#[warn(clippy::from_over_into)]` on by default [INFO] [stdout] help: replace the `Into` implementation with `From>` [INFO] [stdout] | [INFO] [stdout] 133 ~ impl From> for ImageBuffer, Vec> [INFO] [stdout] 134 | where T: Copy + Clone + image::Primitive { [INFO] [stdout] 135 ~ fn from(val: GreyscaleImage) -> Self { [INFO] [stdout] 136 ~ ImageBuffer::from_raw(val.width as u32, val.height as u32, Vec::from(val.data)).unwrap() [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: this expression creates a reference which is immediately dereferenced by the compiler [INFO] [stdout] --> src/image.rs:145:9 [INFO] [stdout] | [INFO] [stdout] 145 | &self.at(index.0, index.1) [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `self.at(index.0, index.1)` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [INFO] [stdout] = note: `#[warn(clippy::needless_borrow)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 36.10s [INFO] running `Command { std: "docker" "inspect" "daca0f9ea91c3ed71b01e73f06ebffc6c60b392ba4ff43b636c84849070cfe98", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "daca0f9ea91c3ed71b01e73f06ebffc6c60b392ba4ff43b636c84849070cfe98", kill_on_drop: false }` [INFO] [stdout] daca0f9ea91c3ed71b01e73f06ebffc6c60b392ba4ff43b636c84849070cfe98