[INFO] cloning repository https://github.com/Myusico/cortinizer [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/Myusico/cortinizer" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FMyusico%2Fcortinizer", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FMyusico%2Fcortinizer'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] 30a86052e33abd29f9e92482901c06eb7fd9f3e4 [INFO] checking Myusico/cortinizer against a5689b034ad287112f709693384a37f1377eb9cc for pr-129249-3 [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FMyusico%2Fcortinizer" "/workspace/builds/worker-6-tc2/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-6-tc2/source'... [INFO] [stderr] done. [INFO] started tweaking git repo https://github.com/Myusico/cortinizer [INFO] finished tweaking git repo https://github.com/Myusico/cortinizer [INFO] tweaked toml for git repo https://github.com/Myusico/cortinizer written to /workspace/builds/worker-6-tc2/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/Myusico/cortinizer on toolchain a5689b034ad287112f709693384a37f1377eb9cc [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+a5689b034ad287112f709693384a37f1377eb9cc" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate git repo https://github.com/Myusico/cortinizer 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" "+a5689b034ad287112f709693384a37f1377eb9cc" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/target:/opt/rustwide/target:rw,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" "-m" "1610612736" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:77db811e55d90add9212f6832c23229e3de5f1c1f9905e8cb07319ea15df73ac" "sleep" "infinity", kill_on_drop: false }` [INFO] [stdout] ff19162959bd9486754c1f2342964b39f98d911c9447348a88494f64a22168a4 [INFO] running `Command { std: "docker" "start" "ff19162959bd9486754c1f2342964b39f98d911c9447348a88494f64a22168a4", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "ff19162959bd9486754c1f2342964b39f98d911c9447348a88494f64a22168a4", kill_on_drop: false }` [INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-w" "/opt/rustwide/workdir" "--user" "0:0" "ff19162959bd9486754c1f2342964b39f98d911c9447348a88494f64a22168a4" "/opt/rustwide/cargo-home/bin/cargo" "+a5689b034ad287112f709693384a37f1377eb9cc" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "ff19162959bd9486754c1f2342964b39f98d911c9447348a88494f64a22168a4", kill_on_drop: false }` [INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-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" "-w" "/opt/rustwide/workdir" "--user" "0:0" "ff19162959bd9486754c1f2342964b39f98d911c9447348a88494f64a22168a4" "/opt/rustwide/cargo-home/bin/cargo" "+a5689b034ad287112f709693384a37f1377eb9cc" "check" "--frozen" "--all" "--all-targets" "--message-format=json", kill_on_drop: false }` [INFO] [stderr] Compiling quote v1.0.44 [INFO] [stderr] Compiling libc v0.2.182 [INFO] [stderr] Checking pin-project-lite v0.2.17 [INFO] [stderr] Checking bitflags v2.11.0 [INFO] [stderr] Checking lazy_static v1.5.0 [INFO] [stderr] Checking smallvec v1.15.1 [INFO] [stderr] Checking once_cell v1.21.3 [INFO] [stderr] Checking futures-sink v0.3.32 [INFO] [stderr] Checking futures-core v0.3.32 [INFO] [stderr] Checking simd-adler32 v0.3.8 [INFO] [stderr] Checking anstyle-parse v0.2.7 [INFO] [stderr] Compiling parking_lot_core v0.9.12 [INFO] [stderr] Checking futures-task v0.3.32 [INFO] [stderr] Checking anstyle v1.0.13 [INFO] [stderr] Compiling rustix v0.38.44 [INFO] [stderr] Checking colorchoice v1.0.4 [INFO] [stderr] Checking slab v0.4.12 [INFO] [stderr] Checking memchr v2.8.0 [INFO] [stderr] Checking futures-io v0.3.32 [INFO] [stderr] Checking regex-syntax v0.8.10 [INFO] [stderr] Checking lock_api v0.4.14 [INFO] [stderr] Checking futures-channel v0.3.32 [INFO] [stderr] Compiling thiserror v1.0.69 [INFO] [stderr] Compiling anyhow v1.0.102 [INFO] [stderr] Checking clap_lex v1.0.0 [INFO] [stderr] Compiling mp4ameta_proc v0.6.0 [INFO] [stderr] Checking miniz_oxide v0.8.9 [INFO] [stderr] Checking anstream v0.6.21 [INFO] [stderr] Checking log v0.4.29 [INFO] [stderr] Checking metaflac v0.2.8 [INFO] [stderr] Checking sharded-slab v0.1.7 [INFO] [stderr] Checking thread_local v1.1.9 [INFO] [stderr] Checking home v0.5.12 [INFO] [stderr] Checking tracing-core v0.1.36 [INFO] [stderr] Checking audiotags-macro v0.2.0 [INFO] [stderr] Checking same-file v1.0.6 [INFO] [stderr] Checking nu-ansi-term v0.50.3 [INFO] [stderr] Compiling syn v2.0.117 [INFO] [stderr] Checking either v1.15.0 [INFO] [stderr] Checking clap_builder v4.5.60 [INFO] [stderr] Checking bytes v1.11.1 [INFO] [stderr] Checking walkdir v2.5.0 [INFO] [stderr] Checking dunce v1.0.5 [INFO] [stderr] Checking mp4ameta v0.11.0 [INFO] [stderr] Checking flate2 v1.1.9 [INFO] [stderr] Checking tracing-log v0.2.0 [INFO] [stderr] Checking id3 v1.16.4 [INFO] [stderr] Checking regex-automata v0.4.14 [INFO] [stderr] Checking errno v0.3.14 [INFO] [stderr] Checking socket2 v0.6.2 [INFO] [stderr] Checking nix v0.27.1 [INFO] [stderr] Checking mio v1.1.1 [INFO] [stderr] Checking num_cpus v1.17.0 [INFO] [stderr] Checking signal-hook-registry v1.4.8 [INFO] [stderr] Checking which v6.0.3 [INFO] [stderr] Checking parking_lot v0.12.5 [INFO] [stderr] Checking matchers v0.2.0 [INFO] [stderr] Checking command-group v5.0.1 [INFO] [stderr] Compiling futures-macro v0.3.32 [INFO] [stderr] Compiling thiserror-impl v1.0.69 [INFO] [stderr] Compiling tracing-attributes v0.1.31 [INFO] [stderr] Compiling clap_derive v4.5.55 [INFO] [stderr] Compiling tokio-macros v2.6.1 [INFO] [stderr] Checking tokio v1.49.0 [INFO] [stderr] Checking futures-util v0.3.32 [INFO] [stderr] Checking tracing v0.1.44 [INFO] [stderr] Checking audiotags v0.5.0 [INFO] [stderr] Checking tracing-subscriber v0.3.22 [INFO] [stderr] Checking clap v4.5.60 [INFO] [stderr] Checking futures-executor v0.3.32 [INFO] [stderr] Checking futures v0.3.32 [INFO] [stderr] Checking cortinizer v0.1.0 (/opt/rustwide/workdir) [INFO] [stdout] warning: unused import: `std::fs` [INFO] [stdout] --> src/file_handler.rs:2:5 [INFO] [stdout] | [INFO] [stdout] 2 | use std::fs; [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: `std::io` [INFO] [stdout] --> src/ffmpeg.rs:3:5 [INFO] [stdout] | [INFO] [stdout] 3 | use std::io; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `anyhow::Context` [INFO] [stdout] --> src/metadata.rs:2:5 [INFO] [stdout] | [INFO] [stdout] 2 | use anyhow::Context; [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `std::fs` [INFO] [stdout] --> src/file_handler.rs:2:5 [INFO] [stdout] | [INFO] [stdout] 2 | use std::fs; [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: `std::io` [INFO] [stdout] --> src/ffmpeg.rs:3:5 [INFO] [stdout] | [INFO] [stdout] 3 | use std::io; [INFO] [stdout] | ^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused import: `anyhow::Context` [INFO] [stdout] --> src/metadata.rs:2:5 [INFO] [stdout] | [INFO] [stdout] 2 | use anyhow::Context; [INFO] [stdout] | ^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `stderr` [INFO] [stdout] --> src/ffmpeg.rs:46:13 [INFO] [stdout] | [INFO] [stdout] 46 | let stderr = String::from_utf8_lossy(&output.stderr); [INFO] [stdout] | ^^^^^^ help: if this is intentional, prefix it with an underscore: `_stderr` [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unused variable: `stderr` [INFO] [stdout] --> src/ffmpeg.rs:46:13 [INFO] [stdout] | [INFO] [stdout] 46 | let stderr = String::from_utf8_lossy(&output.stderr); [INFO] [stdout] | ^^^^^^ help: if this is intentional, prefix it with an underscore: `_stderr` [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: variants `InvalidAudioFile`, `MetadataError`, and `ConfigError` are never constructed [INFO] [stdout] --> src/error.rs:24:5 [INFO] [stdout] | [INFO] [stdout] 9 | pub enum CortinizerError { [INFO] [stdout] | --------------- variants in this enum [INFO] [stdout] ... [INFO] [stdout] 24 | InvalidAudioFile { path: PathBuf }, [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 32 | MetadataError(String), [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 36 | ConfigError(String), [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `CortinizerError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: field `output_path` is never read [INFO] [stdout] --> src/error.rs:45:9 [INFO] [stdout] | [INFO] [stdout] 41 | pub struct ProcessResult { [INFO] [stdout] | ------------- field in this struct [INFO] [stdout] ... [INFO] [stdout] 45 | pub output_path: Option, [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `ProcessResult` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `path` and `is_folder` are never used [INFO] [stdout] --> src/file_handler.rs:15:12 [INFO] [stdout] | [INFO] [stdout] 13 | impl InputItem { [INFO] [stdout] | -------------- methods in this implementation [INFO] [stdout] 14 | /// Get the path of this input item [INFO] [stdout] 15 | pub fn path(&self) -> &Path { [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 23 | pub fn is_folder(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `copy_metadata` is never used [INFO] [stdout] --> src/metadata.rs:23:8 [INFO] [stdout] | [INFO] [stdout] 23 | pub fn copy_metadata(input_path: &Path, output_path: &Path) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `copy_mp3_metadata` is never used [INFO] [stdout] --> src/metadata.rs:49:4 [INFO] [stdout] | [INFO] [stdout] 49 | fn copy_mp3_metadata(input_path: &Path, output_path: &Path) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: function `copy_flac_metadata` is never used [INFO] [stdout] --> src/metadata.rs:84:4 [INFO] [stdout] | [INFO] [stdout] 84 | fn copy_flac_metadata(input_path: &Path, output_path: &Path) -> Result<()> { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] error: useless conversion to the same type: `CortinizerError` [INFO] [stdout] --> src/ffmpeg.rs:47:20 [INFO] [stdout] | [INFO] [stdout] 47 | return Err(CortinizerError::DurationError { [INFO] [stdout] | ____________________^ [INFO] [stdout] 48 | | path: audio_path.to_path_buf(), [INFO] [stdout] 49 | | } [INFO] [stdout] 50 | | .into()); [INFO] [stdout] | |_______________^ [INFO] [stdout] | [INFO] [stdout] = note: this method call relies on the `impl Into for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors [INFO] [stdout] = note: `#[deny(self_type_conversion)]` on by default [INFO] [stdout] help: consider removing the conversion call [INFO] [stdout] | [INFO] [stdout] 49 - } [INFO] [stdout] 50 - .into()); [INFO] [stdout] 49 + }); [INFO] [stdout] | [INFO] [stdout] help: you can use the fully-qualified path to avoid triggering this lint [INFO] [stdout] | [INFO] [stdout] 47 ~ return Err(>::into(CortinizerError::DurationError { [INFO] [stdout] 48 | path: audio_path.to_path_buf(), [INFO] [stdout] 49 ~ })); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] error: useless conversion to the same type: `CortinizerError` [INFO] [stdout] --> src/ffmpeg.rs:158:20 [INFO] [stdout] | [INFO] [stdout] 158 | return Err(CortinizerError::FfmpegError(format!( [INFO] [stdout] | ____________________^ [INFO] [stdout] 159 | | "FFmpeg failed: {}", [INFO] [stdout] 160 | | stderr [INFO] [stdout] 161 | | )) [INFO] [stdout] 162 | | .into()); [INFO] [stdout] | |_______________^ [INFO] [stdout] | [INFO] [stdout] = note: this method call relies on the `impl Into for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors [INFO] [stdout] help: consider removing the conversion call [INFO] [stdout] | [INFO] [stdout] 161 - )) [INFO] [stdout] 162 - .into()); [INFO] [stdout] 161 + ))); [INFO] [stdout] | [INFO] [stdout] help: you can use the fully-qualified path to avoid triggering this lint [INFO] [stdout] | [INFO] [stdout] 158 ~ return Err(>::into(CortinizerError::FfmpegError(format!( [INFO] [stdout] 159 | "FFmpeg failed: {}", [INFO] [stdout] 160 | stderr [INFO] [stdout] 161 ~ )))); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] error: could not compile `cortinizer` (bin "cortinizer") due to 2 previous errors; 10 warnings emitted [INFO] [stderr] warning: build failed, waiting for other jobs to finish... [INFO] [stdout] warning: variants `InvalidAudioFile` and `ConfigError` are never constructed [INFO] [stdout] --> src/error.rs:24:5 [INFO] [stdout] | [INFO] [stdout] 9 | pub enum CortinizerError { [INFO] [stdout] | --------------- variants in this enum [INFO] [stdout] ... [INFO] [stdout] 24 | InvalidAudioFile { path: PathBuf }, [INFO] [stdout] | ^^^^^^^^^^^^^^^^ [INFO] [stdout] ... [INFO] [stdout] 36 | ConfigError(String), [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `CortinizerError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: methods `path` and `is_folder` are never used [INFO] [stdout] --> src/file_handler.rs:15:12 [INFO] [stdout] | [INFO] [stdout] 13 | impl InputItem { [INFO] [stdout] | -------------- methods in this implementation [INFO] [stdout] 14 | /// Get the path of this input item [INFO] [stdout] 15 | pub fn path(&self) -> &Path { [INFO] [stdout] | ^^^^ [INFO] [stdout] ... [INFO] [stdout] 23 | pub fn is_folder(&self) -> bool { [INFO] [stdout] | ^^^^^^^^^ [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] error: useless conversion to the same type: `CortinizerError` [INFO] [stdout] --> src/ffmpeg.rs:47:20 [INFO] [stdout] | [INFO] [stdout] 47 | return Err(CortinizerError::DurationError { [INFO] [stdout] | ____________________^ [INFO] [stdout] 48 | | path: audio_path.to_path_buf(), [INFO] [stdout] 49 | | } [INFO] [stdout] 50 | | .into()); [INFO] [stdout] | |_______________^ [INFO] [stdout] | [INFO] [stdout] = note: this method call relies on the `impl Into for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors [INFO] [stdout] = note: `#[deny(self_type_conversion)]` on by default [INFO] [stdout] help: consider removing the conversion call [INFO] [stdout] | [INFO] [stdout] 49 - } [INFO] [stdout] 50 - .into()); [INFO] [stdout] 49 + }); [INFO] [stdout] | [INFO] [stdout] help: you can use the fully-qualified path to avoid triggering this lint [INFO] [stdout] | [INFO] [stdout] 47 ~ return Err(>::into(CortinizerError::DurationError { [INFO] [stdout] 48 | path: audio_path.to_path_buf(), [INFO] [stdout] 49 ~ })); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] error: useless conversion to the same type: `CortinizerError` [INFO] [stdout] --> src/ffmpeg.rs:158:20 [INFO] [stdout] | [INFO] [stdout] 158 | return Err(CortinizerError::FfmpegError(format!( [INFO] [stdout] | ____________________^ [INFO] [stdout] 159 | | "FFmpeg failed: {}", [INFO] [stdout] 160 | | stderr [INFO] [stdout] 161 | | )) [INFO] [stdout] 162 | | .into()); [INFO] [stdout] | |_______________^ [INFO] [stdout] | [INFO] [stdout] = note: this method call relies on the `impl Into for T` blanket implementation and type inference, which is a semver hazard as a new `impl Into<_>` that affects your type might be added in the future causing type inference errors [INFO] [stdout] help: consider removing the conversion call [INFO] [stdout] | [INFO] [stdout] 161 - )) [INFO] [stdout] 162 - .into()); [INFO] [stdout] 161 + ))); [INFO] [stdout] | [INFO] [stdout] help: you can use the fully-qualified path to avoid triggering this lint [INFO] [stdout] | [INFO] [stdout] 158 ~ return Err(>::into(CortinizerError::FfmpegError(format!( [INFO] [stdout] 159 | "FFmpeg failed: {}", [INFO] [stdout] 160 | stderr [INFO] [stdout] 161 ~ )))); [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] error: could not compile `cortinizer` (bin "cortinizer" test) due to 2 previous errors; 6 warnings emitted [INFO] [stderr] warning: unused dependency `command-group` [INFO] [stderr] --> Cargo.toml:8:1 [INFO] [stderr] | [INFO] [stderr] 8 | command-group = "5.0" [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: `cargo::unused_dependencies` is set to `warn` by default [INFO] [stderr] help: consider removing the dependency on `command-group` [INFO] [stderr] warning: `cortinizer` (manifest) generated 1 warning [INFO] running `Command { std: "docker" "inspect" "ff19162959bd9486754c1f2342964b39f98d911c9447348a88494f64a22168a4", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "ff19162959bd9486754c1f2342964b39f98d911c9447348a88494f64a22168a4", kill_on_drop: false }` [INFO] [stdout] ff19162959bd9486754c1f2342964b39f98d911c9447348a88494f64a22168a4