[INFO] crate ron 0.4.0 is already in cache [INFO] extracting crate ron 0.4.0 into work/ex/clippy-test-run/sources/stable/reg/ron/0.4.0 [INFO] extracting crate ron 0.4.0 into work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/reg/ron/0.4.0 [INFO] validating manifest of ron-0.4.0 on toolchain stable [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "read-manifest" "--manifest-path" "Cargo.toml"` [INFO] validating manifest of ron-0.4.0 on toolchain stable+rustflags=-Dclippy::into_iter_on_array [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "read-manifest" "--manifest-path" "Cargo.toml"` [INFO] started frobbing ron-0.4.0 [INFO] finished frobbing ron-0.4.0 [INFO] frobbed toml for ron-0.4.0 written to work/ex/clippy-test-run/sources/stable/reg/ron/0.4.0/Cargo.toml [INFO] started frobbing ron-0.4.0 [INFO] finished frobbing ron-0.4.0 [INFO] frobbed toml for ron-0.4.0 written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/reg/ron/0.4.0/Cargo.toml [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "generate-lockfile" "--manifest-path" "Cargo.toml" "-Zno-index-update"` [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "generate-lockfile" "--manifest-path" "Cargo.toml" "-Zno-index-update"` [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "fetch" "--locked" "--manifest-path" "Cargo.toml"` [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "fetch" "--locked" "--manifest-path" "Cargo.toml"` [INFO] linting ron-0.4.0 against stable for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-7/stable:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable/reg/ron/0.4.0:/opt/crater/workdir:ro,Z" "-v" "/mnt/big/crater/work/local/cargo-home:/opt/crater/cargo-home:ro,Z" "-v" "/mnt/big/crater/work/local/rustup-home:/opt/crater/rustup-home:ro,Z" "-e" "USER_ID=1000" "-e" "SOURCE_DIR=/opt/crater/workdir" "-e" "MAP_USER_ID=1000" "-e" "CARGO_TARGET_DIR=/opt/crater/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/crater/cargo-home" "-e" "RUSTUP_HOME=/opt/crater/rustup-home" "-w" "/opt/crater/workdir" "-m" "1536M" "--network" "none" "rustops/crates-build-env" "/opt/crater/cargo-home/bin/cargo" "+stable" "clippy" "--frozen" "--all" "--all-targets"` [INFO] [stdout] b6b3010b071e3c3329284e12029f1e49a4336603a34e4f454edd094101819f73 [INFO] running `"docker" "start" "-a" "b6b3010b071e3c3329284e12029f1e49a4336603a34e4f454edd094101819f73"` [INFO] [stderr] Compiling serde v1.0.85 [INFO] [stderr] Checking serde_json v1.0.37 [INFO] [stderr] Checking serde_bytes v0.10.4 [INFO] [stderr] Checking ron v0.4.0 (/opt/crater/workdir) [INFO] [stderr] warning: this `else { if .. }` block can be collapsed [INFO] [stderr] --> src/de/mod.rs:299:16 [INFO] [stderr] | [INFO] [stderr] 299 | } else { [INFO] [stderr] | ________________^ [INFO] [stderr] 300 | | if self.bytes.exts.contains(Extensions::IMPLICIT_SOME) { [INFO] [stderr] 301 | | visitor.visit_some(&mut *self) [INFO] [stderr] 302 | | } else { [INFO] [stderr] ... | [INFO] [stderr] 321 | | } [INFO] [stderr] 322 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::collapsible_if)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 299 | } else if self.bytes.exts.contains(Extensions::IMPLICIT_SOME) { [INFO] [stderr] 300 | visitor.visit_some(&mut *self) [INFO] [stderr] 301 | } else { [INFO] [stderr] 302 | if self.bytes.consume("Some") && { [INFO] [stderr] 303 | self.bytes.skip_ws()?; [INFO] [stderr] 304 | self.bytes.consume("(") [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: this `else { if .. }` block can be collapsed [INFO] [stderr] --> src/de/mod.rs:302:20 [INFO] [stderr] | [INFO] [stderr] 302 | } else { [INFO] [stderr] | ____________________^ [INFO] [stderr] 303 | | if self.bytes.consume("Some") && { [INFO] [stderr] 304 | | self.bytes.skip_ws()?; [INFO] [stderr] 305 | | self.bytes.consume("(") [INFO] [stderr] ... | [INFO] [stderr] 320 | | } [INFO] [stderr] 321 | | } [INFO] [stderr] | |_____________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 302 | } else if self.bytes.consume("Some") && { [INFO] [stderr] 303 | self.bytes.skip_ws()?; [INFO] [stderr] 304 | self.bytes.consume("(") [INFO] [stderr] 305 | } { [INFO] [stderr] 306 | self.bytes.skip_ws()?; [INFO] [stderr] 307 | [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: returning the result of a let binding from a block. Consider returning the expression directly. [INFO] [stderr] --> src/parse.rs:560:17 [INFO] [stderr] | [INFO] [stderr] 560 | character [INFO] [stderr] | ^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::let_and_return)] on by default [INFO] [stderr] note: this expression can be directly returned [INFO] [stderr] --> src/parse.rs:558:33 [INFO] [stderr] | [INFO] [stderr] 558 | let character = char_from_u32(bytes) [INFO] [stderr] | _________________________________^ [INFO] [stderr] 559 | | .ok_or_else(|| self.error(ParseError::InvalidEscape("Not a valid char")))?; [INFO] [stderr] | |______________________________________________________________________________________________^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stderr] [INFO] [stderr] warning: defining a method called `from_str` on this type; consider implementing the `std::str::FromStr` trait or choosing a less ambiguous name [INFO] [stderr] --> src/de/value.rs:12:5 [INFO] [stderr] | [INFO] [stderr] 12 | / pub fn from_str(s: &str) -> de::Result { [INFO] [stderr] 13 | | let mut de = super::Deserializer::from_str(s)?; [INFO] [stderr] 14 | | [INFO] [stderr] 15 | | let val = Value::deserialize(&mut de)?; [INFO] [stderr] ... | [INFO] [stderr] 18 | | Ok(val) [INFO] [stderr] 19 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::should_implement_trait)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#should_implement_trait [INFO] [stderr] [INFO] [stderr] warning: defining a method called `from_str` on this type; consider implementing the `std::str::FromStr` trait or choosing a less ambiguous name [INFO] [stderr] --> src/de/mod.rs:32:5 [INFO] [stderr] | [INFO] [stderr] 32 | / pub fn from_str(input: &'de str) -> Result { [INFO] [stderr] 33 | | Deserializer::from_bytes(input.as_bytes()) [INFO] [stderr] 34 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#should_implement_trait [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/de/mod.rs:105:25 [INFO] [stderr] | [INFO] [stderr] 105 | let mut bytes = self.bytes.clone(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: try removing the `clone` call: `self.bytes` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::clone_on_copy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/de/mod.rs:107:9 [INFO] [stderr] | [INFO] [stderr] 107 | / match bytes.consume("(") { [INFO] [stderr] 108 | | true => { [INFO] [stderr] 109 | | bytes.skip_ws()?; [INFO] [stderr] 110 | | [INFO] [stderr] ... | [INFO] [stderr] 118 | | false => visitor.visit_unit(), [INFO] [stderr] 119 | | } [INFO] [stderr] | |_________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::match_bool)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_bool [INFO] [stderr] help: consider using an if/else expression [INFO] [stderr] | [INFO] [stderr] 107 | if bytes.consume("(") { [INFO] [stderr] 108 | bytes.skip_ws()?; [INFO] [stderr] 109 | [INFO] [stderr] 110 | match bytes.check_tuple_struct()? { [INFO] [stderr] 111 | // first argument is technically incorrect, but ignored anyway [INFO] [stderr] 112 | true => self.deserialize_tuple(0, visitor), [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/de/mod.rs:111:17 [INFO] [stderr] | [INFO] [stderr] 111 | / match bytes.check_tuple_struct()? { [INFO] [stderr] 112 | | // first argument is technically incorrect, but ignored anyway [INFO] [stderr] 113 | | true => self.deserialize_tuple(0, visitor), [INFO] [stderr] 114 | | // first two arguments are technically incorrect, but ignored anyway [INFO] [stderr] 115 | | false => self.deserialize_struct("", &[], visitor), [INFO] [stderr] 116 | | } [INFO] [stderr] | |_________________^ help: consider using an if/else expression: `if bytes.check_tuple_struct()? { self.deserialize_tuple(0, visitor) } else { self.deserialize_struct("", &[], visitor) }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_bool [INFO] [stderr] [INFO] [stderr] warning: casting i8 to i64 may become silently lossy if types change [INFO] [stderr] --> src/ser/mod.rs:204:28 [INFO] [stderr] | [INFO] [stderr] 204 | self.serialize_i64(v as i64) [INFO] [stderr] | ^^^^^^^^ help: try: `i64::from(v)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::cast_lossless)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: casting i16 to i64 may become silently lossy if types change [INFO] [stderr] --> src/ser/mod.rs:208:28 [INFO] [stderr] | [INFO] [stderr] 208 | self.serialize_i64(v as i64) [INFO] [stderr] | ^^^^^^^^ help: try: `i64::from(v)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: casting i32 to i64 may become silently lossy if types change [INFO] [stderr] --> src/ser/mod.rs:212:28 [INFO] [stderr] | [INFO] [stderr] 212 | self.serialize_i64(v as i64) [INFO] [stderr] | ^^^^^^^^ help: try: `i64::from(v)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: casting u8 to u64 may become silently lossy if types change [INFO] [stderr] --> src/ser/mod.rs:222:28 [INFO] [stderr] | [INFO] [stderr] 222 | self.serialize_u64(v as u64) [INFO] [stderr] | ^^^^^^^^ help: try: `u64::from(v)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: casting u16 to u64 may become silently lossy if types change [INFO] [stderr] --> src/ser/mod.rs:226:28 [INFO] [stderr] | [INFO] [stderr] 226 | self.serialize_u64(v as u64) [INFO] [stderr] | ^^^^^^^^ help: try: `u64::from(v)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: casting u32 to u64 may become silently lossy if types change [INFO] [stderr] --> src/ser/mod.rs:230:28 [INFO] [stderr] | [INFO] [stderr] 230 | self.serialize_u64(v as u64) [INFO] [stderr] | ^^^^^^^^ help: try: `u64::from(v)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: this argument is passed by reference, but would be more efficient if passed by value [INFO] [stderr] --> src/value.rs:28:16 [INFO] [stderr] | [INFO] [stderr] 28 | pub fn get(&self) -> f64 { [INFO] [stderr] | ^^^^^ help: consider passing by value instead: `self` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::trivially_copy_pass_by_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivially_copy_pass_by_ref [INFO] [stderr] [INFO] [stderr] error: you are implementing `Hash` explicitly but have derived `PartialEq` [INFO] [stderr] --> src/value.rs:35:1 [INFO] [stderr] | [INFO] [stderr] 35 | / impl Hash for Number { [INFO] [stderr] 36 | | fn hash(&self, state: &mut H) { [INFO] [stderr] 37 | | state.write_u64(self.0 as u64); [INFO] [stderr] 38 | | } [INFO] [stderr] 39 | | } [INFO] [stderr] | |_^ [INFO] [stderr] | [INFO] [stderr] = note: #[deny(clippy::derive_hash_xor_eq)] on by default [INFO] [stderr] note: `PartialEq` implemented here [INFO] [stderr] --> src/value.rs:13:42 [INFO] [stderr] | [INFO] [stderr] 13 | #[derive(Copy, Clone, Debug, PartialOrd, PartialEq)] [INFO] [stderr] | ^^^^^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#derive_hash_xor_eq [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/parse.rs:226:38 [INFO] [stderr] | [INFO] [stderr] 226 | self.eat_byte().and_then(|b| match b == byte { [INFO] [stderr] | ______________________________________^ [INFO] [stderr] 227 | | true => Ok(()), [INFO] [stderr] 228 | | false => self.err(error), [INFO] [stderr] 229 | | }) [INFO] [stderr] | |_________^ help: consider using an if/else expression: `if b == byte { Ok(()) } else { self.err(error) }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_bool [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to match on a boolean expression [INFO] [stderr] --> src/parse.rs:272:9 [INFO] [stderr] | [INFO] [stderr] 272 | / match self.consume_all(&[")", "]"])? { [INFO] [stderr] 273 | | true => Ok(extensions), [INFO] [stderr] 274 | | false => Err(self.error(ParseError::ExpectedAttributeEnd)), [INFO] [stderr] 275 | | } [INFO] [stderr] | |_________^ help: consider using an if/else expression: `if self.consume_all(&[")", "]"])? { Ok(extensions) } else { Err(self.error(ParseError::ExpectedAttributeEnd)) }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#match_bool [INFO] [stderr] [INFO] [stderr] warning: use of `ok_or` followed by a function call [INFO] [stderr] --> src/parse.rs:306:48 [INFO] [stderr] | [INFO] [stderr] 306 | let second = self.bytes.get(1).ok_or(self.error(ParseError::Eof))?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `ok_or_else(|| self.error(ParseError::Eof))` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::or_fun_call)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#or_fun_call [INFO] [stderr] [INFO] [stderr] warning: You are using an explicit closure for cloning elements [INFO] [stderr] --> src/parse.rs:343:9 [INFO] [stderr] | [INFO] [stderr] 343 | self.bytes.get(0).map(|b| *b) [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: Consider calling the dedicated `cloned` method: `self.bytes.get(0).cloned()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::map_clone)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_clone [INFO] [stderr] [INFO] [stderr] warning: use of `ok_or` followed by a function call [INFO] [stderr] --> src/parse.rs:350:14 [INFO] [stderr] | [INFO] [stderr] 350 | .ok_or(self.error(ParseError::Eof)) [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `ok_or_else(|| self.error(ParseError::Eof))` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#or_fun_call [INFO] [stderr] [INFO] [stderr] warning: You are using an explicit closure for cloning elements [INFO] [stderr] --> src/parse.rs:347:9 [INFO] [stderr] | [INFO] [stderr] 347 | / self.bytes [INFO] [stderr] 348 | | .get(0) [INFO] [stderr] 349 | | .map(|b| *b) [INFO] [stderr] | |________________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#map_clone [INFO] [stderr] help: Consider calling the dedicated `cloned` method [INFO] [stderr] | [INFO] [stderr] 347 | self.bytes [INFO] [stderr] 348 | .get(0).cloned() [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: use of `ok_or` followed by a function call [INFO] [stderr] --> src/parse.rs:389:14 [INFO] [stderr] | [INFO] [stderr] 389 | .ok_or(self.error(ParseError::ExpectedStringEnd))?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `ok_or_else(|| self.error(ParseError::ExpectedStringEnd))` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#or_fun_call [INFO] [stderr] [INFO] [stderr] warning: use of `ok_or` followed by a function call [INFO] [stderr] --> src/parse.rs:448:14 [INFO] [stderr] | [INFO] [stderr] 448 | .ok_or(self.error(ParseError::ExpectedStringEnd))?; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `ok_or_else(|| self.error(ParseError::ExpectedStringEnd))` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#or_fun_call [INFO] [stderr] [INFO] [stderr] warning: manual implementation of an assign operation [INFO] [stderr] --> src/parse.rs:502:13 [INFO] [stderr] | [INFO] [stderr] 502 | n = n << 4; [INFO] [stderr] | ^^^^^^^^^^ help: replace it with: `n <<= 4` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::assign_op_pattern)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#assign_op_pattern [INFO] [stderr] [INFO] [stderr] warning: manual implementation of an assign operation [INFO] [stderr] --> src/parse.rs:545:21 [INFO] [stderr] | [INFO] [stderr] 545 | bytes = bytes << 4; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: replace it with: `bytes <<= 4` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#assign_op_pattern [INFO] [stderr] [INFO] [stderr] warning: casting u8 to u32 may become silently lossy if types change [INFO] [stderr] --> src/parse.rs:546:30 [INFO] [stderr] | [INFO] [stderr] 546 | bytes |= byte as u32; [INFO] [stderr] | ^^^^^^^^^^^ help: try: `u32::from(byte)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/parse.rs:587:28 [INFO] [stderr] | [INFO] [stderr] 587 | if self.bytes.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `self.bytes.is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] error: aborting due to previous error [INFO] [stderr] [INFO] [stderr] error: Could not compile `ron`. [INFO] [stderr] warning: build failed, waiting for other jobs to finish... [INFO] [stderr] error: build failed [INFO] running `"docker" "inspect" "b6b3010b071e3c3329284e12029f1e49a4336603a34e4f454edd094101819f73"` [INFO] running `"docker" "rm" "-f" "b6b3010b071e3c3329284e12029f1e49a4336603a34e4f454edd094101819f73"` [INFO] [stdout] b6b3010b071e3c3329284e12029f1e49a4336603a34e4f454edd094101819f73