From 49cc1e1ab1acc3fa7fcf90ad8e197fe31c8b2a46 Mon Sep 17 00:00:00 2001 From: nichmor Date: Thu, 15 Feb 2024 14:59:58 +0200 Subject: [PATCH] fix: issue with zip and artifact:from_file (#221) These PR address 2 major issues and 1 small issue * zip file stamps issue https://github.com/alexcrichton/tar-rs/issues/349 which we encountered when installing tomli-2.1.0 * changed from_filename signature so it can also produce Stree, which it's needed from pixi side * lowercase Root-Is-Purelib so we can install elsie library ( https://github.com/prefix-dev/pixi/issues/771#issuecomment-1925817361) --- .../src/artifacts/sdist.rs | 40 + ...sts__zip_timestamps_before_1980_error.snap | 8938 +++++++++++++++++ .../src/artifacts/wheel.rs | 1 + .../src/index/git_interop.rs | 9 +- .../src/index/html.rs | 2 +- .../src/types/artifact_name.rs | 9 + .../src/wheel_builder/mod.rs | 17 +- 7 files changed, 9010 insertions(+), 6 deletions(-) create mode 100644 crates/rattler_installs_packages/src/artifacts/snapshots/rattler_installs_packages__artifacts__sdist__tests__zip_timestamps_before_1980_error.snap diff --git a/crates/rattler_installs_packages/src/artifacts/sdist.rs b/crates/rattler_installs_packages/src/artifacts/sdist.rs index 646f69c8..bcf9e9fb 100644 --- a/crates/rattler_installs_packages/src/artifacts/sdist.rs +++ b/crates/rattler_installs_packages/src/artifacts/sdist.rs @@ -1293,4 +1293,44 @@ mod tests { assert_debug_snapshot!(direct_url_json); } + + #[tokio::test(flavor = "multi_thread")] + pub async fn test_zip_timestamps_before_1980_error() { + let url = Url::parse("https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz").unwrap(); + + let package_db = get_package_db(); + let env_markers = Arc::new(Pep508EnvMakers::from_env().await.unwrap().0); + let wheel_builder = WheelBuilder::new( + package_db.0.clone(), + env_markers, + None, + ResolveOptions::default(), + HashMap::default(), + ) + .unwrap(); + + let norm_name = PackageName::from_str("tomli").unwrap(); + let sdist_remote_filename = SDistFilename { + distribution: norm_name, + version: Version::from_str("0.0.0").unwrap(), + format: SDistFormat::TarGz, + }; + let artifact_info = ArtifactInfo { + filename: ArtifactName::SDist(sdist_remote_filename), + url: url.clone(), + is_direct_url: true, + hashes: None, + requires_python: None, + dist_info_metadata: DistInfoMetadata::default(), + yanked: Yanked::default(), + }; + + let (wheel, _) = package_db + .0 + .get_wheel(&artifact_info, Some(&wheel_builder)) + .await + .unwrap(); + + assert_debug_snapshot!(wheel.metadata()); + } } diff --git a/crates/rattler_installs_packages/src/artifacts/snapshots/rattler_installs_packages__artifacts__sdist__tests__zip_timestamps_before_1980_error.snap b/crates/rattler_installs_packages/src/artifacts/snapshots/rattler_installs_packages__artifacts__sdist__tests__zip_timestamps_before_1980_error.snap new file mode 100644 index 00000000..f17d3554 --- /dev/null +++ b/crates/rattler_installs_packages/src/artifacts/snapshots/rattler_installs_packages__artifacts__sdist__tests__zip_timestamps_before_1980_error.snap @@ -0,0 +1,8938 @@ +--- +source: crates/rattler_installs_packages/src/artifacts/sdist.rs +expression: wheel.metadata() +--- +Ok( + ( + [ + 77, + 101, + 116, + 97, + 100, + 97, + 116, + 97, + 45, + 86, + 101, + 114, + 115, + 105, + 111, + 110, + 58, + 32, + 50, + 46, + 49, + 10, + 78, + 97, + 109, + 101, + 58, + 32, + 116, + 111, + 109, + 108, + 105, + 10, + 86, + 101, + 114, + 115, + 105, + 111, + 110, + 58, + 32, + 50, + 46, + 48, + 46, + 49, + 10, + 83, + 117, + 109, + 109, + 97, + 114, + 121, + 58, + 32, + 65, + 32, + 108, + 105, + 108, + 39, + 32, + 84, + 79, + 77, + 76, + 32, + 112, + 97, + 114, + 115, + 101, + 114, + 10, + 75, + 101, + 121, + 119, + 111, + 114, + 100, + 115, + 58, + 32, + 116, + 111, + 109, + 108, + 10, + 65, + 117, + 116, + 104, + 111, + 114, + 45, + 101, + 109, + 97, + 105, + 108, + 58, + 32, + 84, + 97, + 110, + 101, + 108, + 105, + 32, + 72, + 117, + 107, + 107, + 105, + 110, + 101, + 110, + 32, + 60, + 104, + 117, + 107, + 107, + 105, + 110, + 64, + 117, + 115, + 101, + 114, + 115, + 46, + 110, + 111, + 114, + 101, + 112, + 108, + 121, + 46, + 103, + 105, + 116, + 104, + 117, + 98, + 46, + 99, + 111, + 109, + 62, + 10, + 82, + 101, + 113, + 117, + 105, + 114, + 101, + 115, + 45, + 80, + 121, + 116, + 104, + 111, + 110, + 58, + 32, + 62, + 61, + 51, + 46, + 55, + 10, + 68, + 101, + 115, + 99, + 114, + 105, + 112, + 116, + 105, + 111, + 110, + 45, + 67, + 111, + 110, + 116, + 101, + 110, + 116, + 45, + 84, + 121, + 112, + 101, + 58, + 32, + 116, + 101, + 120, + 116, + 47, + 109, + 97, + 114, + 107, + 100, + 111, + 119, + 110, + 10, + 67, + 108, + 97, + 115, + 115, + 105, + 102, + 105, + 101, + 114, + 58, + 32, + 76, + 105, + 99, + 101, + 110, + 115, + 101, + 32, + 58, + 58, + 32, + 79, + 83, + 73, + 32, + 65, + 112, + 112, + 114, + 111, + 118, + 101, + 100, + 32, + 58, + 58, + 32, + 77, + 73, + 84, + 32, + 76, + 105, + 99, + 101, + 110, + 115, + 101, + 10, + 67, + 108, + 97, + 115, + 115, + 105, + 102, + 105, + 101, + 114, + 58, + 32, + 79, + 112, + 101, + 114, + 97, + 116, + 105, + 110, + 103, + 32, + 83, + 121, + 115, + 116, + 101, + 109, + 32, + 58, + 58, + 32, + 77, + 97, + 99, + 79, + 83, + 10, + 67, + 108, + 97, + 115, + 115, + 105, + 102, + 105, + 101, + 114, + 58, + 32, + 79, + 112, + 101, + 114, + 97, + 116, + 105, + 110, + 103, + 32, + 83, + 121, + 115, + 116, + 101, + 109, + 32, + 58, + 58, + 32, + 77, + 105, + 99, + 114, + 111, + 115, + 111, + 102, + 116, + 32, + 58, + 58, + 32, + 87, + 105, + 110, + 100, + 111, + 119, + 115, + 10, + 67, + 108, + 97, + 115, + 115, + 105, + 102, + 105, + 101, + 114, + 58, + 32, + 79, + 112, + 101, + 114, + 97, + 116, + 105, + 110, + 103, + 32, + 83, + 121, + 115, + 116, + 101, + 109, + 32, + 58, + 58, + 32, + 80, + 79, + 83, + 73, + 88, + 32, + 58, + 58, + 32, + 76, + 105, + 110, + 117, + 120, + 10, + 67, + 108, + 97, + 115, + 115, + 105, + 102, + 105, + 101, + 114, + 58, + 32, + 80, + 114, + 111, + 103, + 114, + 97, + 109, + 109, + 105, + 110, + 103, + 32, + 76, + 97, + 110, + 103, + 117, + 97, + 103, + 101, + 32, + 58, + 58, + 32, + 80, + 121, + 116, + 104, + 111, + 110, + 32, + 58, + 58, + 32, + 51, + 32, + 58, + 58, + 32, + 79, + 110, + 108, + 121, + 10, + 67, + 108, + 97, + 115, + 115, + 105, + 102, + 105, + 101, + 114, + 58, + 32, + 80, + 114, + 111, + 103, + 114, + 97, + 109, + 109, + 105, + 110, + 103, + 32, + 76, + 97, + 110, + 103, + 117, + 97, + 103, + 101, + 32, + 58, + 58, + 32, + 80, + 121, + 116, + 104, + 111, + 110, + 32, + 58, + 58, + 32, + 51, + 46, + 55, + 10, + 67, + 108, + 97, + 115, + 115, + 105, + 102, + 105, + 101, + 114, + 58, + 32, + 80, + 114, + 111, + 103, + 114, + 97, + 109, + 109, + 105, + 110, + 103, + 32, + 76, + 97, + 110, + 103, + 117, + 97, + 103, + 101, + 32, + 58, + 58, + 32, + 80, + 121, + 116, + 104, + 111, + 110, + 32, + 58, + 58, + 32, + 51, + 46, + 56, + 10, + 67, + 108, + 97, + 115, + 115, + 105, + 102, + 105, + 101, + 114, + 58, + 32, + 80, + 114, + 111, + 103, + 114, + 97, + 109, + 109, + 105, + 110, + 103, + 32, + 76, + 97, + 110, + 103, + 117, + 97, + 103, + 101, + 32, + 58, + 58, + 32, + 80, + 121, + 116, + 104, + 111, + 110, + 32, + 58, + 58, + 32, + 51, + 46, + 57, + 10, + 67, + 108, + 97, + 115, + 115, + 105, + 102, + 105, + 101, + 114, + 58, + 32, + 80, + 114, + 111, + 103, + 114, + 97, + 109, + 109, + 105, + 110, + 103, + 32, + 76, + 97, + 110, + 103, + 117, + 97, + 103, + 101, + 32, + 58, + 58, + 32, + 80, + 121, + 116, + 104, + 111, + 110, + 32, + 58, + 58, + 32, + 51, + 46, + 49, + 48, + 10, + 67, + 108, + 97, + 115, + 115, + 105, + 102, + 105, + 101, + 114, + 58, + 32, + 80, + 114, + 111, + 103, + 114, + 97, + 109, + 109, + 105, + 110, + 103, + 32, + 76, + 97, + 110, + 103, + 117, + 97, + 103, + 101, + 32, + 58, + 58, + 32, + 80, + 121, + 116, + 104, + 111, + 110, + 32, + 58, + 58, + 32, + 73, + 109, + 112, + 108, + 101, + 109, + 101, + 110, + 116, + 97, + 116, + 105, + 111, + 110, + 32, + 58, + 58, + 32, + 67, + 80, + 121, + 116, + 104, + 111, + 110, + 10, + 67, + 108, + 97, + 115, + 115, + 105, + 102, + 105, + 101, + 114, + 58, + 32, + 80, + 114, + 111, + 103, + 114, + 97, + 109, + 109, + 105, + 110, + 103, + 32, + 76, + 97, + 110, + 103, + 117, + 97, + 103, + 101, + 32, + 58, + 58, + 32, + 80, + 121, + 116, + 104, + 111, + 110, + 32, + 58, + 58, + 32, + 73, + 109, + 112, + 108, + 101, + 109, + 101, + 110, + 116, + 97, + 116, + 105, + 111, + 110, + 32, + 58, + 58, + 32, + 80, + 121, + 80, + 121, + 10, + 67, + 108, + 97, + 115, + 115, + 105, + 102, + 105, + 101, + 114, + 58, + 32, + 84, + 111, + 112, + 105, + 99, + 32, + 58, + 58, + 32, + 83, + 111, + 102, + 116, + 119, + 97, + 114, + 101, + 32, + 68, + 101, + 118, + 101, + 108, + 111, + 112, + 109, + 101, + 110, + 116, + 32, + 58, + 58, + 32, + 76, + 105, + 98, + 114, + 97, + 114, + 105, + 101, + 115, + 32, + 58, + 58, + 32, + 80, + 121, + 116, + 104, + 111, + 110, + 32, + 77, + 111, + 100, + 117, + 108, + 101, + 115, + 10, + 67, + 108, + 97, + 115, + 115, + 105, + 102, + 105, + 101, + 114, + 58, + 32, + 84, + 121, + 112, + 105, + 110, + 103, + 32, + 58, + 58, + 32, + 84, + 121, + 112, + 101, + 100, + 10, + 80, + 114, + 111, + 106, + 101, + 99, + 116, + 45, + 85, + 82, + 76, + 58, + 32, + 67, + 104, + 97, + 110, + 103, + 101, + 108, + 111, + 103, + 44, + 32, + 104, + 116, + 116, + 112, + 115, + 58, + 47, + 47, + 103, + 105, + 116, + 104, + 117, + 98, + 46, + 99, + 111, + 109, + 47, + 104, + 117, + 107, + 107, + 105, + 110, + 47, + 116, + 111, + 109, + 108, + 105, + 47, + 98, + 108, + 111, + 98, + 47, + 109, + 97, + 115, + 116, + 101, + 114, + 47, + 67, + 72, + 65, + 78, + 71, + 69, + 76, + 79, + 71, + 46, + 109, + 100, + 10, + 80, + 114, + 111, + 106, + 101, + 99, + 116, + 45, + 85, + 82, + 76, + 58, + 32, + 72, + 111, + 109, + 101, + 112, + 97, + 103, + 101, + 44, + 32, + 104, + 116, + 116, + 112, + 115, + 58, + 47, + 47, + 103, + 105, + 116, + 104, + 117, + 98, + 46, + 99, + 111, + 109, + 47, + 104, + 117, + 107, + 107, + 105, + 110, + 47, + 116, + 111, + 109, + 108, + 105, + 10, + 10, + 91, + 33, + 91, + 66, + 117, + 105, + 108, + 100, + 32, + 83, + 116, + 97, + 116, + 117, + 115, + 93, + 40, + 104, + 116, + 116, + 112, + 115, + 58, + 47, + 47, + 103, + 105, + 116, + 104, + 117, + 98, + 46, + 99, + 111, + 109, + 47, + 104, + 117, + 107, + 107, + 105, + 110, + 47, + 116, + 111, + 109, + 108, + 105, + 47, + 119, + 111, + 114, + 107, + 102, + 108, + 111, + 119, + 115, + 47, + 84, + 101, + 115, + 116, + 115, + 47, + 98, + 97, + 100, + 103, + 101, + 46, + 115, + 118, + 103, + 63, + 98, + 114, + 97, + 110, + 99, + 104, + 61, + 109, + 97, + 115, + 116, + 101, + 114, + 41, + 93, + 40, + 104, + 116, + 116, + 112, + 115, + 58, + 47, + 47, + 103, + 105, + 116, + 104, + 117, + 98, + 46, + 99, + 111, + 109, + 47, + 104, + 117, + 107, + 107, + 105, + 110, + 47, + 116, + 111, + 109, + 108, + 105, + 47, + 97, + 99, + 116, + 105, + 111, + 110, + 115, + 63, + 113, + 117, + 101, + 114, + 121, + 61, + 119, + 111, + 114, + 107, + 102, + 108, + 111, + 119, + 37, + 51, + 65, + 84, + 101, + 115, + 116, + 115, + 43, + 98, + 114, + 97, + 110, + 99, + 104, + 37, + 51, + 65, + 109, + 97, + 115, + 116, + 101, + 114, + 43, + 101, + 118, + 101, + 110, + 116, + 37, + 51, + 65, + 112, + 117, + 115, + 104, + 41, + 10, + 91, + 33, + 91, + 99, + 111, + 100, + 101, + 99, + 111, + 118, + 46, + 105, + 111, + 93, + 40, + 104, + 116, + 116, + 112, + 115, + 58, + 47, + 47, + 99, + 111, + 100, + 101, + 99, + 111, + 118, + 46, + 105, + 111, + 47, + 103, + 104, + 47, + 104, + 117, + 107, + 107, + 105, + 110, + 47, + 116, + 111, + 109, + 108, + 105, + 47, + 98, + 114, + 97, + 110, + 99, + 104, + 47, + 109, + 97, + 115, + 116, + 101, + 114, + 47, + 103, + 114, + 97, + 112, + 104, + 47, + 98, + 97, + 100, + 103, + 101, + 46, + 115, + 118, + 103, + 41, + 93, + 40, + 104, + 116, + 116, + 112, + 115, + 58, + 47, + 47, + 99, + 111, + 100, + 101, + 99, + 111, + 118, + 46, + 105, + 111, + 47, + 103, + 104, + 47, + 104, + 117, + 107, + 107, + 105, + 110, + 47, + 116, + 111, + 109, + 108, + 105, + 41, + 10, + 91, + 33, + 91, + 80, + 121, + 80, + 73, + 32, + 118, + 101, + 114, + 115, + 105, + 111, + 110, + 93, + 40, + 104, + 116, + 116, + 112, + 115, + 58, + 47, + 47, + 105, + 109, + 103, + 46, + 115, + 104, + 105, + 101, + 108, + 100, + 115, + 46, + 105, + 111, + 47, + 112, + 121, + 112, + 105, + 47, + 118, + 47, + 116, + 111, + 109, + 108, + 105, + 41, + 93, + 40, + 104, + 116, + 116, + 112, + 115, + 58, + 47, + 47, + 112, + 121, + 112, + 105, + 46, + 111, + 114, + 103, + 47, + 112, + 114, + 111, + 106, + 101, + 99, + 116, + 47, + 116, + 111, + 109, + 108, + 105, + 41, + 10, + 10, + 35, + 32, + 84, + 111, + 109, + 108, + 105, + 10, + 10, + 62, + 32, + 65, + 32, + 108, + 105, + 108, + 39, + 32, + 84, + 79, + 77, + 76, + 32, + 112, + 97, + 114, + 115, + 101, + 114, + 10, + 10, + 42, + 42, + 84, + 97, + 98, + 108, + 101, + 32, + 111, + 102, + 32, + 67, + 111, + 110, + 116, + 101, + 110, + 116, + 115, + 42, + 42, + 32, + 32, + 42, + 103, + 101, + 110, + 101, + 114, + 97, + 116, + 101, + 100, + 32, + 119, + 105, + 116, + 104, + 32, + 91, + 109, + 100, + 102, + 111, + 114, + 109, + 97, + 116, + 45, + 116, + 111, + 99, + 93, + 40, + 104, + 116, + 116, + 112, + 115, + 58, + 47, + 47, + 103, + 105, + 116, + 104, + 117, + 98, + 46, + 99, + 111, + 109, + 47, + 104, + 117, + 107, + 107, + 105, + 110, + 47, + 109, + 100, + 102, + 111, + 114, + 109, + 97, + 116, + 45, + 116, + 111, + 99, + 41, + 42, + 10, + 10, + 60, + 33, + 45, + 45, + 32, + 109, + 100, + 102, + 111, + 114, + 109, + 97, + 116, + 45, + 116, + 111, + 99, + 32, + 115, + 116, + 97, + 114, + 116, + 32, + 45, + 45, + 115, + 108, + 117, + 103, + 61, + 103, + 105, + 116, + 104, + 117, + 98, + 32, + 45, + 45, + 109, + 97, + 120, + 108, + 101, + 118, + 101, + 108, + 61, + 54, + 32, + 45, + 45, + 109, + 105, + 110, + 108, + 101, + 118, + 101, + 108, + 61, + 50, + 32, + 45, + 45, + 62, + 10, + 10, + 45, + 32, + 91, + 73, + 110, + 116, + 114, + 111, + 93, + 40, + 35, + 105, + 110, + 116, + 114, + 111, + 41, + 10, + 45, + 32, + 91, + 73, + 110, + 115, + 116, + 97, + 108, + 108, + 97, + 116, + 105, + 111, + 110, + 93, + 40, + 35, + 105, + 110, + 115, + 116, + 97, + 108, + 108, + 97, + 116, + 105, + 111, + 110, + 41, + 10, + 45, + 32, + 91, + 85, + 115, + 97, + 103, + 101, + 93, + 40, + 35, + 117, + 115, + 97, + 103, + 101, + 41, + 10, + 32, + 32, + 45, + 32, + 91, + 80, + 97, + 114, + 115, + 101, + 32, + 97, + 32, + 84, + 79, + 77, + 76, + 32, + 115, + 116, + 114, + 105, + 110, + 103, + 93, + 40, + 35, + 112, + 97, + 114, + 115, + 101, + 45, + 97, + 45, + 116, + 111, + 109, + 108, + 45, + 115, + 116, + 114, + 105, + 110, + 103, + 41, + 10, + 32, + 32, + 45, + 32, + 91, + 80, + 97, + 114, + 115, + 101, + 32, + 97, + 32, + 84, + 79, + 77, + 76, + 32, + 102, + 105, + 108, + 101, + 93, + 40, + 35, + 112, + 97, + 114, + 115, + 101, + 45, + 97, + 45, + 116, + 111, + 109, + 108, + 45, + 102, + 105, + 108, + 101, + 41, + 10, + 32, + 32, + 45, + 32, + 91, + 72, + 97, + 110, + 100, + 108, + 101, + 32, + 105, + 110, + 118, + 97, + 108, + 105, + 100, + 32, + 84, + 79, + 77, + 76, + 93, + 40, + 35, + 104, + 97, + 110, + 100, + 108, + 101, + 45, + 105, + 110, + 118, + 97, + 108, + 105, + 100, + 45, + 116, + 111, + 109, + 108, + 41, + 10, + 32, + 32, + 45, + 32, + 91, + 67, + 111, + 110, + 115, + 116, + 114, + 117, + 99, + 116, + 32, + 96, + 100, + 101, + 99, + 105, + 109, + 97, + 108, + 46, + 68, + 101, + 99, + 105, + 109, + 97, + 108, + 96, + 115, + 32, + 102, + 114, + 111, + 109, + 32, + 84, + 79, + 77, + 76, + 32, + 102, + 108, + 111, + 97, + 116, + 115, + 93, + 40, + 35, + 99, + 111, + 110, + 115, + 116, + 114, + 117, + 99, + 116, + 45, + 100, + 101, + 99, + 105, + 109, + 97, + 108, + 100, + 101, + 99, + 105, + 109, + 97, + 108, + 115, + 45, + 102, + 114, + 111, + 109, + 45, + 116, + 111, + 109, + 108, + 45, + 102, + 108, + 111, + 97, + 116, + 115, + 41, + 10, + 45, + 32, + 91, + 70, + 65, + 81, + 93, + 40, + 35, + 102, + 97, + 113, + 41, + 10, + 32, + 32, + 45, + 32, + 91, + 87, + 104, + 121, + 32, + 116, + 104, + 105, + 115, + 32, + 112, + 97, + 114, + 115, + 101, + 114, + 63, + 93, + 40, + 35, + 119, + 104, + 121, + 45, + 116, + 104, + 105, + 115, + 45, + 112, + 97, + 114, + 115, + 101, + 114, + 41, + 10, + 32, + 32, + 45, + 32, + 91, + 73, + 115, + 32, + 99, + 111, + 109, + 109, + 101, + 110, + 116, + 32, + 112, + 114, + 101, + 115, + 101, + 114, + 118, + 105, + 110, + 103, + 32, + 114, + 111, + 117, + 110, + 100, + 45, + 116, + 114, + 105, + 112, + 32, + 112, + 97, + 114, + 115, + 105, + 110, + 103, + 32, + 115, + 117, + 112, + 112, + 111, + 114, + 116, + 101, + 100, + 63, + 93, + 40, + 35, + 105, + 115, + 45, + 99, + 111, + 109, + 109, + 101, + 110, + 116, + 45, + 112, + 114, + 101, + 115, + 101, + 114, + 118, + 105, + 110, + 103, + 45, + 114, + 111, + 117, + 110, + 100, + 45, + 116, + 114, + 105, + 112, + 45, + 112, + 97, + 114, + 115, + 105, + 110, + 103, + 45, + 115, + 117, + 112, + 112, + 111, + 114, + 116, + 101, + 100, + 41, + 10, + 32, + 32, + 45, + 32, + 91, + 73, + 115, + 32, + 116, + 104, + 101, + 114, + 101, + 32, + 97, + 32, + 96, + 100, + 117, + 109, + 112, + 115, + 96, + 44, + 32, + 96, + 119, + 114, + 105, + 116, + 101, + 96, + 32, + 111, + 114, + 32, + 96, + 101, + 110, + 99, + 111, + 100, + 101, + 96, + 32, + 102, + 117, + 110, + 99, + 116, + 105, + 111, + 110, + 63, + 93, + 40, + 35, + 105, + 115, + 45, + 116, + 104, + 101, + 114, + 101, + 45, + 97, + 45, + 100, + 117, + 109, + 112, + 115, + 45, + 119, + 114, + 105, + 116, + 101, + 45, + 111, + 114, + 45, + 101, + 110, + 99, + 111, + 100, + 101, + 45, + 102, + 117, + 110, + 99, + 116, + 105, + 111, + 110, + 41, + 10, + 32, + 32, + 45, + 32, + 91, + 72, + 111, + 119, + 32, + 100, + 111, + 32, + 84, + 79, + 77, + 76, + 32, + 116, + 121, + 112, + 101, + 115, + 32, + 109, + 97, + 112, + 32, + 105, + 110, + 116, + 111, + 32, + 80, + 121, + 116, + 104, + 111, + 110, + 32, + 116, + 121, + 112, + 101, + 115, + 63, + 93, + 40, + 35, + 104, + 111, + 119, + 45, + 100, + 111, + 45, + 116, + 111, + 109, + 108, + 45, + 116, + 121, + 112, + 101, + 115, + 45, + 109, + 97, + 112, + 45, + 105, + 110, + 116, + 111, + 45, + 112, + 121, + 116, + 104, + 111, + 110, + 45, + 116, + 121, + 112, + 101, + 115, + 41, + 10, + 45, + 32, + 91, + 80, + 101, + 114, + 102, + 111, + 114, + 109, + 97, + 110, + 99, + 101, + 93, + 40, + 35, + 112, + 101, + 114, + 102, + 111, + 114, + 109, + 97, + 110, + 99, + 101, + 41, + 10, + 10, + 60, + 33, + 45, + 45, + 32, + 109, + 100, + 102, + 111, + 114, + 109, + 97, + 116, + 45, + 116, + 111, + 99, + 32, + 101, + 110, + 100, + 32, + 45, + 45, + 62, + 10, + 10, + 35, + 35, + 32, + 73, + 110, + 116, + 114, + 111, + 60, + 97, + 32, + 110, + 97, + 109, + 101, + 61, + 34, + 105, + 110, + 116, + 114, + 111, + 34, + 62, + 60, + 47, + 97, + 62, + 10, + 10, + 84, + 111, + 109, + 108, + 105, + 32, + 105, + 115, + 32, + 97, + 32, + 80, + 121, + 116, + 104, + 111, + 110, + 32, + 108, + 105, + 98, + 114, + 97, + 114, + 121, + 32, + 102, + 111, + 114, + 32, + 112, + 97, + 114, + 115, + 105, + 110, + 103, + 32, + 91, + 84, + 79, + 77, + 76, + 93, + 40, + 104, + 116, + 116, + 112, + 115, + 58, + 47, + 47, + 116, + 111, + 109, + 108, + 46, + 105, + 111, + 41, + 46, + 10, + 84, + 111, + 109, + 108, + 105, + 32, + 105, + 115, + 32, + 102, + 117, + 108, + 108, + 121, + 32, + 99, + 111, + 109, + 112, + 97, + 116, + 105, + 98, + 108, + 101, + 32, + 119, + 105, + 116, + 104, + 32, + 91, + 84, + 79, + 77, + 76, + 32, + 118, + 49, + 46, + 48, + 46, + 48, + 93, + 40, + 104, + 116, + 116, + 112, + 115, + 58, + 47, + 47, + 116, + 111, + 109, + 108, + 46, + 105, + 111, + 47, + 101, + 110, + 47, + 118, + 49, + 46, + 48, + 46, + 48, + 41, + 46, + 10, + 10, + 35, + 35, + 32, + 73, + 110, + 115, + 116, + 97, + 108, + 108, + 97, + 116, + 105, + 111, + 110, + 60, + 97, + 32, + 110, + 97, + 109, + 101, + 61, + 34, + 105, + 110, + 115, + 116, + 97, + 108, + 108, + 97, + 116, + 105, + 111, + 110, + 34, + 62, + 60, + 47, + 97, + 62, + 10, + 10, + 96, + 96, + 96, + 98, + 97, + 115, + 104, + 10, + 112, + 105, + 112, + 32, + 105, + 110, + 115, + 116, + 97, + 108, + 108, + 32, + 116, + 111, + 109, + 108, + 105, + 10, + 96, + 96, + 96, + 10, + 10, + 35, + 35, + 32, + 85, + 115, + 97, + 103, + 101, + 60, + 97, + 32, + 110, + 97, + 109, + 101, + 61, + 34, + 117, + 115, + 97, + 103, + 101, + 34, + 62, + 60, + 47, + 97, + 62, + 10, + 10, + 35, + 35, + 35, + 32, + 80, + 97, + 114, + 115, + 101, + 32, + 97, + 32, + 84, + 79, + 77, + 76, + 32, + 115, + 116, + 114, + 105, + 110, + 103, + 60, + 97, + 32, + 110, + 97, + 109, + 101, + 61, + 34, + 112, + 97, + 114, + 115, + 101, + 45, + 97, + 45, + 116, + 111, + 109, + 108, + 45, + 115, + 116, + 114, + 105, + 110, + 103, + 34, + 62, + 60, + 47, + 97, + 62, + 10, + 10, + 96, + 96, + 96, + 112, + 121, + 116, + 104, + 111, + 110, + 10, + 105, + 109, + 112, + 111, + 114, + 116, + 32, + 116, + 111, + 109, + 108, + 105, + 10, + 10, + 116, + 111, + 109, + 108, + 95, + 115, + 116, + 114, + 32, + 61, + 32, + 34, + 34, + 34, + 10, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 103, + 114, + 101, + 116, + 122, + 107, + 121, + 32, + 61, + 32, + 57, + 57, + 10, + 10, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 91, + 107, + 117, + 114, + 114, + 105, + 93, + 10, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 106, + 97, + 114, + 105, + 32, + 61, + 32, + 49, + 55, + 10, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 34, + 34, + 34, + 10, + 10, + 116, + 111, + 109, + 108, + 95, + 100, + 105, + 99, + 116, + 32, + 61, + 32, + 116, + 111, + 109, + 108, + 105, + 46, + 108, + 111, + 97, + 100, + 115, + 40, + 116, + 111, + 109, + 108, + 95, + 115, + 116, + 114, + 41, + 10, + 97, + 115, + 115, + 101, + 114, + 116, + 32, + 116, + 111, + 109, + 108, + 95, + 100, + 105, + 99, + 116, + 32, + 61, + 61, + 32, + 123, + 34, + 103, + 114, + 101, + 116, + 122, + 107, + 121, + 34, + 58, + 32, + 57, + 57, + 44, + 32, + 34, + 107, + 117, + 114, + 114, + 105, + 34, + 58, + 32, + 123, + 34, + 106, + 97, + 114, + 105, + 34, + 58, + 32, + 49, + 55, + 125, + 125, + 10, + 96, + 96, + 96, + 10, + 10, + 35, + 35, + 35, + 32, + 80, + 97, + 114, + 115, + 101, + 32, + 97, + 32, + 84, + 79, + 77, + 76, + 32, + 102, + 105, + 108, + 101, + 60, + 97, + 32, + 110, + 97, + 109, + 101, + 61, + 34, + 112, + 97, + 114, + 115, + 101, + 45, + 97, + 45, + 116, + 111, + 109, + 108, + 45, + 102, + 105, + 108, + 101, + 34, + 62, + 60, + 47, + 97, + 62, + 10, + 10, + 96, + 96, + 96, + 112, + 121, + 116, + 104, + 111, + 110, + 10, + 105, + 109, + 112, + 111, + 114, + 116, + 32, + 116, + 111, + 109, + 108, + 105, + 10, + 10, + 119, + 105, + 116, + 104, + 32, + 111, + 112, + 101, + 110, + 40, + 34, + 112, + 97, + 116, + 104, + 95, + 116, + 111, + 95, + 102, + 105, + 108, + 101, + 47, + 99, + 111, + 110, + 102, + 46, + 116, + 111, + 109, + 108, + 34, + 44, + 32, + 34, + 114, + 98, + 34, + 41, + 32, + 97, + 115, + 32, + 102, + 58, + 10, + 32, + 32, + 32, + 32, + 116, + 111, + 109, + 108, + 95, + 100, + 105, + 99, + 116, + 32, + 61, + 32, + 116, + 111, + 109, + 108, + 105, + 46, + 108, + 111, + 97, + 100, + 40, + 102, + 41, + 10, + 96, + 96, + 96, + 10, + 10, + 84, + 104, + 101, + 32, + 102, + 105, + 108, + 101, + 32, + 109, + 117, + 115, + 116, + 32, + 98, + 101, + 32, + 111, + 112, + 101, + 110, + 101, + 100, + 32, + 105, + 110, + 32, + 98, + 105, + 110, + 97, + 114, + 121, + 32, + 109, + 111, + 100, + 101, + 32, + 40, + 119, + 105, + 116, + 104, + 32, + 116, + 104, + 101, + 32, + 96, + 34, + 114, + 98, + 34, + 96, + 32, + 102, + 108, + 97, + 103, + 41, + 46, + 10, + 66, + 105, + 110, + 97, + 114, + 121, + 32, + 109, + 111, + 100, + 101, + 32, + 119, + 105, + 108, + 108, + 32, + 101, + 110, + 102, + 111, + 114, + 99, + 101, + 32, + 100, + 101, + 99, + 111, + 100, + 105, + 110, + 103, + 32, + 116, + 104, + 101, + 32, + 102, + 105, + 108, + 101, + 32, + 97, + 115, + 32, + 85, + 84, + 70, + 45, + 56, + 32, + 119, + 105, + 116, + 104, + 32, + 117, + 110, + 105, + 118, + 101, + 114, + 115, + 97, + 108, + 32, + 110, + 101, + 119, + 108, + 105, + 110, + 101, + 115, + 32, + 100, + 105, + 115, + 97, + 98, + 108, + 101, + 100, + 44, + 10, + 98, + 111, + 116, + 104, + 32, + 111, + 102, + 32, + 119, + 104, + 105, + 99, + 104, + 32, + 97, + 114, + 101, + 32, + 114, + 101, + 113, + 117, + 105, + 114, + 101, + 100, + 32, + 116, + 111, + 32, + 99, + 111, + 114, + 114, + 101, + 99, + 116, + 108, + 121, + 32, + 112, + 97, + 114, + 115, + 101, + 32, + 84, + 79, + 77, + 76, + 46, + 10, + 10, + 35, + 35, + 35, + 32, + 72, + 97, + 110, + 100, + 108, + 101, + 32, + 105, + 110, + 118, + 97, + 108, + 105, + 100, + 32, + 84, + 79, + 77, + 76, + 60, + 97, + 32, + 110, + 97, + 109, + 101, + 61, + 34, + 104, + 97, + 110, + 100, + 108, + 101, + 45, + 105, + 110, + 118, + 97, + 108, + 105, + 100, + 45, + 116, + 111, + 109, + 108, + 34, + 62, + 60, + 47, + 97, + 62, + 10, + 10, + 96, + 96, + 96, + 112, + 121, + 116, + 104, + 111, + 110, + 10, + 105, + 109, + 112, + 111, + 114, + 116, + 32, + 116, + 111, + 109, + 108, + 105, + 10, + 10, + 116, + 114, + 121, + 58, + 10, + 32, + 32, + 32, + 32, + 116, + 111, + 109, + 108, + 95, + 100, + 105, + 99, + 116, + 32, + 61, + 32, + 116, + 111, + 109, + 108, + 105, + 46, + 108, + 111, + 97, + 100, + 115, + 40, + 34, + 93, + 93, + 32, + 116, + 104, + 105, + 115, + 32, + 105, + 115, + 32, + 105, + 110, + 118, + 97, + 108, + 105, + 100, + 32, + 84, + 79, + 77, + 76, + 32, + 91, + 91, + 34, + 41, + 10, + 101, + 120, + 99, + 101, + 112, + 116, + 32, + 116, + 111, + 109, + 108, + 105, + 46, + 84, + 79, + 77, + 76, + 68, + 101, + 99, + 111, + 100, + 101, + 69, + 114, + 114, + 111, + 114, + 58, + 10, + 32, + 32, + 32, + 32, + 112, + 114, + 105, + 110, + 116, + 40, + 34, + 89, + 101, + 112, + 44, + 32, + 100, + 101, + 102, + 105, + 110, + 105, + 116, + 101, + 108, + 121, + 32, + 110, + 111, + 116, + 32, + 118, + 97, + 108, + 105, + 100, + 46, + 34, + 41, + 10, + 96, + 96, + 96, + 10, + 10, + 78, + 111, + 116, + 101, + 32, + 116, + 104, + 97, + 116, + 32, + 101, + 114, + 114, + 111, + 114, + 32, + 109, + 101, + 115, + 115, + 97, + 103, + 101, + 115, + 32, + 97, + 114, + 101, + 32, + 99, + 111, + 110, + 115, + 105, + 100, + 101, + 114, + 101, + 100, + 32, + 105, + 110, + 102, + 111, + 114, + 109, + 97, + 116, + 105, + 111, + 110, + 97, + 108, + 32, + 111, + 110, + 108, + 121, + 46, + 10, + 84, + 104, + 101, + 121, + 32, + 115, + 104, + 111, + 117, + 108, + 100, + 32, + 110, + 111, + 116, + 32, + 98, + 101, + 32, + 97, + 115, + 115, + 117, + 109, + 101, + 100, + 32, + 116, + 111, + 32, + 115, + 116, + 97, + 121, + 32, + 99, + 111, + 110, + 115, + 116, + 97, + 110, + 116, + 32, + 97, + 99, + 114, + 111, + 115, + 115, + 32, + 84, + 111, + 109, + 108, + 105, + 32, + 118, + 101, + 114, + 115, + 105, + 111, + 110, + 115, + 46, + 10, + 10, + 35, + 35, + 35, + 32, + 67, + 111, + 110, + 115, + 116, + 114, + 117, + 99, + 116, + 32, + 96, + 100, + 101, + 99, + 105, + 109, + 97, + 108, + 46, + 68, + 101, + 99, + 105, + 109, + 97, + 108, + 96, + 115, + 32, + 102, + 114, + 111, + 109, + 32, + 84, + 79, + 77, + 76, + 32, + 102, + 108, + 111, + 97, + 116, + 115, + 60, + 97, + 32, + 110, + 97, + 109, + 101, + 61, + 34, + 99, + 111, + 110, + 115, + 116, + 114, + 117, + 99, + 116, + 45, + 100, + 101, + 99, + 105, + 109, + 97, + 108, + 100, + 101, + 99, + 105, + 109, + 97, + 108, + 115, + 45, + 102, + 114, + 111, + 109, + 45, + 116, + 111, + 109, + 108, + 45, + 102, + 108, + 111, + 97, + 116, + 115, + 34, + 62, + 60, + 47, + 97, + 62, + 10, + 10, + 96, + 96, + 96, + 112, + 121, + 116, + 104, + 111, + 110, + 10, + 102, + 114, + 111, + 109, + 32, + 100, + 101, + 99, + 105, + 109, + 97, + 108, + 32, + 105, + 109, + 112, + 111, + 114, + 116, + 32, + 68, + 101, + 99, + 105, + 109, + 97, + 108, + 10, + 105, + 109, + 112, + 111, + 114, + 116, + 32, + 116, + 111, + 109, + 108, + 105, + 10, + 10, + 116, + 111, + 109, + 108, + 95, + 100, + 105, + 99, + 116, + 32, + 61, + 32, + 116, + 111, + 109, + 108, + 105, + 46, + 108, + 111, + 97, + 100, + 115, + 40, + 34, + 112, + 114, + 101, + 99, + 105, + 115, + 105, + 111, + 110, + 45, + 109, + 97, + 116, + 116, + 101, + 114, + 115, + 32, + 61, + 32, + 48, + 46, + 57, + 56, + 50, + 52, + 57, + 50, + 34, + 44, + 32, + 112, + 97, + 114, + 115, + 101, + 95, + 102, + 108, + 111, + 97, + 116, + 61, + 68, + 101, + 99, + 105, + 109, + 97, + 108, + 41, + 10, + 97, + 115, + 115, + 101, + 114, + 116, + 32, + 116, + 111, + 109, + 108, + 95, + 100, + 105, + 99, + 116, + 91, + 34, + 112, + 114, + 101, + 99, + 105, + 115, + 105, + 111, + 110, + 45, + 109, + 97, + 116, + 116, + 101, + 114, + 115, + 34, + 93, + 32, + 61, + 61, + 32, + 68, + 101, + 99, + 105, + 109, + 97, + 108, + 40, + 34, + 48, + 46, + 57, + 56, + 50, + 52, + 57, + 50, + 34, + 41, + 10, + 96, + 96, + 96, + 10, + 10, + 78, + 111, + 116, + 101, + 32, + 116, + 104, + 97, + 116, + 32, + 96, + 100, + 101, + 99, + 105, + 109, + 97, + 108, + 46, + 68, + 101, + 99, + 105, + 109, + 97, + 108, + 96, + 32, + 99, + 97, + 110, + 32, + 98, + 101, + 32, + 114, + 101, + 112, + 108, + 97, + 99, + 101, + 100, + 32, + 119, + 105, + 116, + 104, + 32, + 97, + 110, + 111, + 116, + 104, + 101, + 114, + 32, + 99, + 97, + 108, + 108, + 97, + 98, + 108, + 101, + 32, + 116, + 104, + 97, + 116, + 32, + 99, + 111, + 110, + 118, + 101, + 114, + 116, + 115, + 32, + 97, + 32, + 84, + 79, + 77, + 76, + 32, + 102, + 108, + 111, + 97, + 116, + 32, + 102, + 114, + 111, + 109, + 32, + 115, + 116, + 114, + 105, + 110, + 103, + 32, + 116, + 111, + 32, + 97, + 32, + 80, + 121, + 116, + 104, + 111, + 110, + 32, + 116, + 121, + 112, + 101, + 46, + 10, + 84, + 104, + 101, + 32, + 96, + 100, + 101, + 99, + 105, + 109, + 97, + 108, + 46, + 68, + 101, + 99, + 105, + 109, + 97, + 108, + 96, + 32, + 105, + 115, + 44, + 32, + 104, + 111, + 119, + 101, + 118, + 101, + 114, + 44, + 32, + 97, + 32, + 112, + 114, + 97, + 99, + 116, + 105, + 99, + 97, + 108, + 32, + 99, + 104, + 111, + 105, + 99, + 101, + 32, + 102, + 111, + 114, + 32, + 117, + 115, + 101, + 32, + 99, + 97, + 115, + 101, + 115, + 32, + 119, + 104, + 101, + 114, + 101, + 32, + 102, + 108, + 111, + 97, + 116, + 32, + 105, + 110, + 97, + 99, + 99, + 117, + 114, + 97, + 99, + 105, + 101, + 115, + 32, + 99, + 97, + 110, + 32, + 110, + 111, + 116, + 32, + 98, + 101, + 32, + 116, + 111, + 108, + 101, + 114, + 97, + 116, + 101, + 100, + 46, + 10, + 10, + 73, + 108, + 108, + 101, + 103, + 97, + 108, + 32, + 116, + 121, + 112, + 101, + 115, + 32, + 97, + 114, + 101, + 32, + 96, + 100, + 105, + 99, + 116, + 96, + 32, + 97, + 110, + 100, + 32, + 96, + 108, + 105, + 115, + 116, + 96, + 44, + 32, + 97, + 110, + 100, + 32, + 116, + 104, + 101, + 105, + 114, + 32, + 115, + 117, + 98, + 116, + 121, + 112, + 101, + 115, + 46, + 10, + 65, + 32, + 96, + 86, + 97, + 108, + 117, + 101, + 69, + 114, + 114, + 111, + 114, + 96, + 32, + 119, + 105, + 108, + 108, + 32, + 98, + 101, + 32, + 114, + 97, + 105, + 115, + 101, + 100, + 32, + 105, + 102, + 32, + 96, + 112, + 97, + 114, + 115, + 101, + 95, + 102, + 108, + 111, + 97, + 116, + 96, + 32, + 112, + 114, + 111, + 100, + 117, + 99, + 101, + 115, + 32, + 105, + 108, + 108, + 101, + 103, + 97, + 108, + 32, + 116, + 121, + 112, + 101, + 115, + 46, + 10, + 10, + 35, + 35, + 32, + 70, + 65, + 81, + 60, + 97, + 32, + 110, + 97, + 109, + 101, + 61, + 34, + 102, + 97, + 113, + 34, + 62, + 60, + 47, + 97, + 62, + 10, + 10, + 35, + 35, + 35, + 32, + 87, + 104, + 121, + 32, + 116, + 104, + 105, + 115, + 32, + 112, + 97, + 114, + 115, + 101, + 114, + 63, + 60, + 97, + 32, + 110, + 97, + 109, + 101, + 61, + 34, + 119, + 104, + 121, + 45, + 116, + 104, + 105, + 115, + 45, + 112, + 97, + 114, + 115, + 101, + 114, + 34, + 62, + 60, + 47, + 97, + 62, + 10, + 10, + 45, + 32, + 105, + 116, + 39, + 115, + 32, + 108, + 105, + 108, + 39, + 10, + 45, + 32, + 112, + 117, + 114, + 101, + 32, + 80, + 121, + 116, + 104, + 111, + 110, + 32, + 119, + 105, + 116, + 104, + 32, + 122, + 101, + 114, + 111, + 32, + 100, + 101, + 112, + 101, + 110, + 100, + 101, + 110, + 99, + 105, + 101, + 115, + 10, + 45, + 32, + 116, + 104, + 101, + 32, + 102, + 97, + 115, + 116, + 101, + 115, + 116, + 32, + 112, + 117, + 114, + 101, + 32, + 80, + 121, + 116, + 104, + 111, + 110, + 32, + 112, + 97, + 114, + 115, + 101, + 114, + 32, + 91, + 92, + 42, + 93, + 40, + 35, + 112, + 101, + 114, + 102, + 111, + 114, + 109, + 97, + 110, + 99, + 101, + 41, + 58, + 10, + 32, + 32, + 49, + 53, + 120, + 32, + 97, + 115, + 32, + 102, + 97, + 115, + 116, + 32, + 97, + 115, + 32, + 91, + 116, + 111, + 109, + 108, + 107, + 105, + 116, + 93, + 40, + 104, + 116, + 116, + 112, + 115, + 58, + 47, + 47, + 112, + 121, + 112, + 105, + 46, + 111, + 114, + 103, + 47, + 112, + 114, + 111, + 106, + 101, + 99, + 116, + 47, + 116, + 111, + 109, + 108, + 107, + 105, + 116, + 47, + 41, + 44, + 10, + 32, + 32, + 50, + 46, + 52, + 120, + 32, + 97, + 115, + 32, + 102, + 97, + 115, + 116, + 32, + 97, + 115, + 32, + 91, + 116, + 111, + 109, + 108, + 93, + 40, + 104, + 116, + 116, + 112, + 115, + 58, + 47, + 47, + 112, + 121, + 112, + 105, + 46, + 111, + 114, + 103, + 47, + 112, + 114, + 111, + 106, + 101, + 99, + 116, + 47, + 116, + 111, + 109, + 108, + 47, + 41, + 10, + 45, + 32, + 111, + 117, + 116, + 112, + 117, + 116, + 115, + 32, + 91, + 98, + 97, + 115, + 105, + 99, + 32, + 100, + 97, + 116, + 97, + 32, + 116, + 121, + 112, + 101, + 115, + 93, + 40, + 35, + 104, + 111, + 119, + 45, + 100, + 111, + 45, + 116, + 111, + 109, + 108, + 45, + 116, + 121, + 112, + 101, + 115, + 45, + 109, + 97, + 112, + 45, + 105, + 110, + 116, + 111, + 45, + 112, + 121, + 116, + 104, + 111, + 110, + 45, + 116, + 121, + 112, + 101, + 115, + 41, + 32, + 111, + 110, + 108, + 121, + 10, + 45, + 32, + 49, + 48, + 48, + 37, + 32, + 115, + 112, + 101, + 99, + 32, + 99, + 111, + 109, + 112, + 108, + 105, + 97, + 110, + 116, + 58, + 32, + 112, + 97, + 115, + 115, + 101, + 115, + 32, + 97, + 108, + 108, + 32, + 116, + 101, + 115, + 116, + 115, + 32, + 105, + 110, + 10, + 32, + 32, + 91, + 97, + 32, + 116, + 101, + 115, + 116, + 32, + 115, + 101, + 116, + 93, + 40, + 104, + 116, + 116, + 112, + 115, + 58, + 47, + 47, + 103, + 105, + 116, + 104, + 117, + 98, + 46, + 99, + 111, + 109, + 47, + 116, + 111, + 109, + 108, + 45, + 108, + 97, + 110, + 103, + 47, + 99, + 111, + 109, + 112, + 108, + 105, + 97, + 110, + 99, + 101, + 47, + 112, + 117, + 108, + 108, + 47, + 56, + 41, + 10, + 32, + 32, + 115, + 111, + 111, + 110, + 32, + 116, + 111, + 32, + 98, + 101, + 32, + 109, + 101, + 114, + 103, + 101, + 100, + 32, + 116, + 111, + 32, + 116, + 104, + 101, + 32, + 111, + 102, + 102, + 105, + 99, + 105, + 97, + 108, + 10, + 32, + 32, + 91, + 99, + 111, + 109, + 112, + 108, + 105, + 97, + 110, + 99, + 101, + 32, + 116, + 101, + 115, + 116, + 115, + 32, + 102, + 111, + 114, + 32, + 84, + 79, + 77, + 76, + 93, + 40, + 104, + 116, + 116, + 112, + 115, + 58, + 47, + 47, + 103, + 105, + 116, + 104, + 117, + 98, + 46, + 99, + 111, + 109, + 47, + 116, + 111, + 109, + 108, + 45, + 108, + 97, + 110, + 103, + 47, + 99, + 111, + 109, + 112, + 108, + 105, + 97, + 110, + 99, + 101, + 41, + 10, + 32, + 32, + 114, + 101, + 112, + 111, + 115, + 105, + 116, + 111, + 114, + 121, + 10, + 45, + 32, + 116, + 104, + 111, + 114, + 111, + 117, + 103, + 104, + 108, + 121, + 32, + 116, + 101, + 115, + 116, + 101, + 100, + 58, + 32, + 49, + 48, + 48, + 37, + 32, + 98, + 114, + 97, + 110, + 99, + 104, + 32, + 99, + 111, + 118, + 101, + 114, + 97, + 103, + 101, + 10, + 10, + 35, + 35, + 35, + 32, + 73, + 115, + 32, + 99, + 111, + 109, + 109, + 101, + 110, + 116, + 32, + 112, + 114, + 101, + 115, + 101, + 114, + 118, + 105, + 110, + 103, + 32, + 114, + 111, + 117, + 110, + 100, + 45, + 116, + 114, + 105, + 112, + 32, + 112, + 97, + 114, + 115, + 105, + 110, + 103, + 32, + 115, + 117, + 112, + 112, + 111, + 114, + 116, + 101, + 100, + 63, + 60, + 97, + 32, + 110, + 97, + 109, + 101, + 61, + 34, + 105, + 115, + 45, + 99, + 111, + 109, + 109, + 101, + 110, + 116, + 45, + 112, + 114, + 101, + 115, + 101, + 114, + 118, + 105, + 110, + 103, + 45, + 114, + 111, + 117, + 110, + 100, + 45, + 116, + 114, + 105, + 112, + 45, + 112, + 97, + 114, + 115, + 105, + 110, + 103, + 45, + 115, + 117, + 112, + 112, + 111, + 114, + 116, + 101, + 100, + 34, + 62, + 60, + 47, + 97, + 62, + 10, + 10, + 78, + 111, + 46, + 10, + 10, + 84, + 104, + 101, + 32, + 96, + 116, + 111, + 109, + 108, + 105, + 46, + 108, + 111, + 97, + 100, + 115, + 96, + 32, + 102, + 117, + 110, + 99, + 116, + 105, + 111, + 110, + 32, + 114, + 101, + 116, + 117, + 114, + 110, + 115, + 32, + 97, + 32, + 112, + 108, + 97, + 105, + 110, + 32, + 96, + 100, + 105, + 99, + 116, + 96, + 32, + 116, + 104, + 97, + 116, + 32, + 105, + 115, + 32, + 112, + 111, + 112, + 117, + 108, + 97, + 116, + 101, + 100, + 32, + 119, + 105, + 116, + 104, + 32, + 98, + 117, + 105, + 108, + 116, + 105, + 110, + 32, + 116, + 121, + 112, + 101, + 115, + 32, + 97, + 110, + 100, + 32, + 116, + 121, + 112, + 101, + 115, + 32, + 102, + 114, + 111, + 109, + 32, + 116, + 104, + 101, + 32, + 115, + 116, + 97, + 110, + 100, + 97, + 114, + 100, + 32, + 108, + 105, + 98, + 114, + 97, + 114, + 121, + 32, + 111, + 110, + 108, + 121, + 46, + 10, + 80, + 114, + 101, + 115, + 101, + 114, + 118, + 105, + 110, + 103, + 32, + 99, + 111, + 109, + 109, + 101, + 110, + 116, + 115, + 32, + 114, + 101, + 113, + 117, + 105, + 114, + 101, + 115, + 32, + 97, + 32, + 99, + 117, + 115, + 116, + 111, + 109, + 32, + 116, + 121, + 112, + 101, + 32, + 116, + 111, + 32, + 98, + 101, + 32, + 114, + 101, + 116, + 117, + 114, + 110, + 101, + 100, + 32, + 115, + 111, + 32, + 119, + 105, + 108, + 108, + 32, + 110, + 111, + 116, + 32, + 98, + 101, + 32, + 115, + 117, + 112, + 112, + 111, + 114, + 116, + 101, + 100, + 44, + 10, + 97, + 116, + 32, + 108, + 101, + 97, + 115, + 116, + 32, + 110, + 111, + 116, + 32, + 98, + 121, + 32, + 116, + 104, + 101, + 32, + 96, + 116, + 111, + 109, + 108, + 105, + 46, + 108, + 111, + 97, + 100, + 115, + 96, + 32, + 97, + 110, + 100, + 32, + 96, + 116, + 111, + 109, + 108, + 105, + 46, + 108, + 111, + 97, + 100, + 96, + 32, + 102, + 117, + 110, + 99, + 116, + 105, + 111, + 110, + 115, + 46, + 10, + 10, + 76, + 111, + 111, + 107, + 32, + 105, + 110, + 116, + 111, + 32, + 91, + 84, + 79, + 77, + 76, + 32, + 75, + 105, + 116, + 93, + 40, + 104, + 116, + 116, + 112, + 115, + 58, + 47, + 47, + 103, + 105, + 116, + 104, + 117, + 98, + 46, + 99, + 111, + 109, + 47, + 115, + 100, + 105, + 115, + 112, + 97, + 116, + 101, + 114, + 47, + 116, + 111, + 109, + 108, + 107, + 105, + 116, + 41, + 32, + 105, + 102, + 32, + 112, + 114, + 101, + 115, + 101, + 114, + 118, + 97, + 116, + 105, + 111, + 110, + 32, + 111, + 102, + 32, + 115, + 116, + 121, + 108, + 101, + 32, + 105, + 115, + 32, + 119, + 104, + 97, + 116, + 32, + 121, + 111, + 117, + 32, + 110, + 101, + 101, + 100, + 46, + 10, + 10, + 35, + 35, + 35, + 32, + 73, + 115, + 32, + 116, + 104, + 101, + 114, + 101, + 32, + 97, + 32, + 96, + 100, + 117, + 109, + 112, + 115, + 96, + 44, + 32, + 96, + 119, + 114, + 105, + 116, + 101, + 96, + 32, + 111, + 114, + 32, + 96, + 101, + 110, + 99, + 111, + 100, + 101, + 96, + 32, + 102, + 117, + 110, + 99, + 116, + 105, + 111, + 110, + 63, + 60, + 97, + 32, + 110, + 97, + 109, + 101, + 61, + 34, + 105, + 115, + 45, + 116, + 104, + 101, + 114, + 101, + 45, + 97, + 45, + 100, + 117, + 109, + 112, + 115, + 45, + 119, + 114, + 105, + 116, + 101, + 45, + 111, + 114, + 45, + 101, + 110, + 99, + 111, + 100, + 101, + 45, + 102, + 117, + 110, + 99, + 116, + 105, + 111, + 110, + 34, + 62, + 60, + 47, + 97, + 62, + 10, + 10, + 91, + 84, + 111, + 109, + 108, + 105, + 45, + 87, + 93, + 40, + 104, + 116, + 116, + 112, + 115, + 58, + 47, + 47, + 103, + 105, + 116, + 104, + 117, + 98, + 46, + 99, + 111, + 109, + 47, + 104, + 117, + 107, + 107, + 105, + 110, + 47, + 116, + 111, + 109, + 108, + 105, + 45, + 119, + 41, + 32, + 105, + 115, + 32, + 116, + 104, + 101, + 32, + 119, + 114, + 105, + 116, + 101, + 45, + 111, + 110, + 108, + 121, + 32, + 99, + 111, + 117, + 110, + 116, + 101, + 114, + 112, + 97, + 114, + 116, + 32, + 111, + 102, + 32, + 84, + 111, + 109, + 108, + 105, + 44, + 32, + 112, + 114, + 111, + 118, + 105, + 100, + 105, + 110, + 103, + 32, + 96, + 100, + 117, + 109, + 112, + 96, + 32, + 97, + 110, + 100, + 32, + 96, + 100, + 117, + 109, + 112, + 115, + 96, + 32, + 102, + 117, + 110, + 99, + 116, + 105, + 111, + 110, + 115, + 46, + 10, + 10, + 84, + 104, + 101, + 32, + 99, + 111, + 114, + 101, + 32, + 108, + 105, + 98, + 114, + 97, + 114, + 121, + 32, + 100, + 111, + 101, + 115, + 32, + 110, + 111, + 116, + 32, + 105, + 110, + 99, + 108, + 117, + 100, + 101, + 32, + 119, + 114, + 105, + 116, + 101, + 32, + 99, + 97, + 112, + 97, + 98, + 105, + 108, + 105, + 116, + 121, + 44, + 32, + 97, + 115, + 32, + 109, + 111, + 115, + 116, + 32, + 84, + 79, + 77, + 76, + 32, + 117, + 115, + 101, + 32, + 99, + 97, + 115, + 101, + 115, + 32, + 97, + 114, + 101, + 32, + 114, + 101, + 97, + 100, + 45, + 111, + 110, + 108, + 121, + 44, + 32, + 97, + 110, + 100, + 32, + 84, + 111, + 109, + 108, + 105, + 32, + 105, + 110, + 116, + 101, + 110, + 100, + 115, + 32, + 116, + 111, + 32, + 98, + 101, + 32, + 109, + 105, + 110, + 105, + 109, + 97, + 108, + 46, + 10, + 10, + 35, + 35, + 35, + 32, + 72, + 111, + 119, + 32, + 100, + 111, + 32, + 84, + 79, + 77, + 76, + 32, + 116, + 121, + 112, + 101, + 115, + 32, + 109, + 97, + 112, + 32, + 105, + 110, + 116, + 111, + 32, + 80, + 121, + 116, + 104, + 111, + 110, + 32, + 116, + 121, + 112, + 101, + 115, + 63, + 60, + 97, + 32, + 110, + 97, + 109, + 101, + 61, + 34, + 104, + 111, + 119, + 45, + 100, + 111, + 45, + 116, + 111, + 109, + 108, + 45, + 116, + 121, + 112, + 101, + 115, + 45, + 109, + 97, + 112, + 45, + 105, + 110, + 116, + 111, + 45, + 112, + 121, + 116, + 104, + 111, + 110, + 45, + 116, + 121, + 112, + 101, + 115, + 34, + 62, + 60, + 47, + 97, + 62, + 10, + 10, + 124, + 32, + 84, + 79, + 77, + 76, + 32, + 116, + 121, + 112, + 101, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 80, + 121, + 116, + 104, + 111, + 110, + 32, + 116, + 121, + 112, + 101, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 68, + 101, + 116, + 97, + 105, + 108, + 115, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 10, + 124, + 32, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 32, + 124, + 32, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 32, + 124, + 32, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 32, + 124, + 10, + 124, + 32, + 68, + 111, + 99, + 117, + 109, + 101, + 110, + 116, + 32, + 82, + 111, + 111, + 116, + 32, + 32, + 32, + 32, + 124, + 32, + 96, + 100, + 105, + 99, + 116, + 96, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 10, + 124, + 32, + 75, + 101, + 121, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 96, + 115, + 116, + 114, + 96, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 10, + 124, + 32, + 83, + 116, + 114, + 105, + 110, + 103, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 96, + 115, + 116, + 114, + 96, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 10, + 124, + 32, + 73, + 110, + 116, + 101, + 103, + 101, + 114, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 96, + 105, + 110, + 116, + 96, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 10, + 124, + 32, + 70, + 108, + 111, + 97, + 116, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 96, + 102, + 108, + 111, + 97, + 116, + 96, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 10, + 124, + 32, + 66, + 111, + 111, + 108, + 101, + 97, + 110, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 96, + 98, + 111, + 111, + 108, + 96, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 10, + 124, + 32, + 79, + 102, + 102, + 115, + 101, + 116, + 32, + 68, + 97, + 116, + 101, + 45, + 84, + 105, + 109, + 101, + 32, + 124, + 32, + 96, + 100, + 97, + 116, + 101, + 116, + 105, + 109, + 101, + 46, + 100, + 97, + 116, + 101, + 116, + 105, + 109, + 101, + 96, + 32, + 124, + 32, + 96, + 116, + 122, + 105, + 110, + 102, + 111, + 96, + 32, + 97, + 116, + 116, + 114, + 105, + 98, + 117, + 116, + 101, + 32, + 115, + 101, + 116, + 32, + 116, + 111, + 32, + 97, + 110, + 32, + 105, + 110, + 115, + 116, + 97, + 110, + 99, + 101, + 32, + 111, + 102, + 32, + 96, + 100, + 97, + 116, + 101, + 116, + 105, + 109, + 101, + 46, + 116, + 105, + 109, + 101, + 122, + 111, + 110, + 101, + 96, + 32, + 124, + 10, + 124, + 32, + 76, + 111, + 99, + 97, + 108, + 32, + 68, + 97, + 116, + 101, + 45, + 84, + 105, + 109, + 101, + 32, + 32, + 124, + 32, + 96, + 100, + 97, + 116, + 101, + 116, + 105, + 109, + 101, + 46, + 100, + 97, + 116, + 101, + 116, + 105, + 109, + 101, + 96, + 32, + 124, + 32, + 96, + 116, + 122, + 105, + 110, + 102, + 111, + 96, + 32, + 97, + 116, + 116, + 114, + 105, + 98, + 117, + 116, + 101, + 32, + 115, + 101, + 116, + 32, + 116, + 111, + 32, + 96, + 78, + 111, + 110, + 101, + 96, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 10, + 124, + 32, + 76, + 111, + 99, + 97, + 108, + 32, + 68, + 97, + 116, + 101, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 96, + 100, + 97, + 116, + 101, + 116, + 105, + 109, + 101, + 46, + 100, + 97, + 116, + 101, + 96, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 10, + 124, + 32, + 76, + 111, + 99, + 97, + 108, + 32, + 84, + 105, + 109, + 101, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 96, + 100, + 97, + 116, + 101, + 116, + 105, + 109, + 101, + 46, + 116, + 105, + 109, + 101, + 96, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 10, + 124, + 32, + 65, + 114, + 114, + 97, + 121, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 96, + 108, + 105, + 115, + 116, + 96, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 10, + 124, + 32, + 84, + 97, + 98, + 108, + 101, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 96, + 100, + 105, + 99, + 116, + 96, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 10, + 124, + 32, + 73, + 110, + 108, + 105, + 110, + 101, + 32, + 84, + 97, + 98, + 108, + 101, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 96, + 100, + 105, + 99, + 116, + 96, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 124, + 10, + 10, + 35, + 35, + 32, + 80, + 101, + 114, + 102, + 111, + 114, + 109, + 97, + 110, + 99, + 101, + 60, + 97, + 32, + 110, + 97, + 109, + 101, + 61, + 34, + 112, + 101, + 114, + 102, + 111, + 114, + 109, + 97, + 110, + 99, + 101, + 34, + 62, + 60, + 47, + 97, + 62, + 10, + 10, + 84, + 104, + 101, + 32, + 96, + 98, + 101, + 110, + 99, + 104, + 109, + 97, + 114, + 107, + 47, + 96, + 32, + 102, + 111, + 108, + 100, + 101, + 114, + 32, + 105, + 110, + 32, + 116, + 104, + 105, + 115, + 32, + 114, + 101, + 112, + 111, + 115, + 105, + 116, + 111, + 114, + 121, + 32, + 99, + 111, + 110, + 116, + 97, + 105, + 110, + 115, + 32, + 97, + 32, + 112, + 101, + 114, + 102, + 111, + 114, + 109, + 97, + 110, + 99, + 101, + 32, + 98, + 101, + 110, + 99, + 104, + 109, + 97, + 114, + 107, + 32, + 102, + 111, + 114, + 32, + 99, + 111, + 109, + 112, + 97, + 114, + 105, + 110, + 103, + 32, + 116, + 104, + 101, + 32, + 118, + 97, + 114, + 105, + 111, + 117, + 115, + 32, + 80, + 121, + 116, + 104, + 111, + 110, + 32, + 84, + 79, + 77, + 76, + 32, + 112, + 97, + 114, + 115, + 101, + 114, + 115, + 46, + 10, + 84, + 104, + 101, + 32, + 98, + 101, + 110, + 99, + 104, + 109, + 97, + 114, + 107, + 32, + 99, + 97, + 110, + 32, + 98, + 101, + 32, + 114, + 117, + 110, + 32, + 119, + 105, + 116, + 104, + 32, + 96, + 116, + 111, + 120, + 32, + 45, + 101, + 32, + 98, + 101, + 110, + 99, + 104, + 109, + 97, + 114, + 107, + 45, + 112, + 121, + 112, + 105, + 96, + 46, + 10, + 82, + 117, + 110, + 110, + 105, + 110, + 103, + 32, + 116, + 104, + 101, + 32, + 98, + 101, + 110, + 99, + 104, + 109, + 97, + 114, + 107, + 32, + 111, + 110, + 32, + 109, + 121, + 32, + 112, + 101, + 114, + 115, + 111, + 110, + 97, + 108, + 32, + 99, + 111, + 109, + 112, + 117, + 116, + 101, + 114, + 32, + 111, + 117, + 116, + 112, + 117, + 116, + 32, + 116, + 104, + 101, + 32, + 102, + 111, + 108, + 108, + 111, + 119, + 105, + 110, + 103, + 58, + 10, + 10, + 96, + 96, + 96, + 99, + 111, + 110, + 115, + 111, + 108, + 101, + 10, + 102, + 111, + 111, + 64, + 98, + 97, + 114, + 58, + 126, + 47, + 100, + 101, + 118, + 47, + 116, + 111, + 109, + 108, + 105, + 36, + 32, + 116, + 111, + 120, + 32, + 45, + 101, + 32, + 98, + 101, + 110, + 99, + 104, + 109, + 97, + 114, + 107, + 45, + 112, + 121, + 112, + 105, + 10, + 98, + 101, + 110, + 99, + 104, + 109, + 97, + 114, + 107, + 45, + 112, + 121, + 112, + 105, + 32, + 105, + 110, + 115, + 116, + 97, + 108, + 108, + 101, + 100, + 58, + 32, + 97, + 116, + 116, + 114, + 115, + 61, + 61, + 49, + 57, + 46, + 51, + 46, + 48, + 44, + 99, + 108, + 105, + 99, + 107, + 61, + 61, + 55, + 46, + 49, + 46, + 50, + 44, + 112, + 121, + 116, + 111, + 109, + 108, + 112, + 112, + 61, + 61, + 49, + 46, + 48, + 46, + 50, + 44, + 113, + 116, + 111, + 109, + 108, + 61, + 61, + 48, + 46, + 51, + 46, + 48, + 44, + 114, + 116, + 111, + 109, + 108, + 61, + 61, + 48, + 46, + 55, + 46, + 48, + 44, + 116, + 111, + 109, + 108, + 61, + 61, + 48, + 46, + 49, + 48, + 46, + 50, + 44, + 116, + 111, + 109, + 108, + 105, + 61, + 61, + 49, + 46, + 49, + 46, + 48, + 44, + 116, + 111, + 109, + 108, + 107, + 105, + 116, + 61, + 61, + 48, + 46, + 55, + 46, + 50, + 10, + 98, + 101, + 110, + 99, + 104, + 109, + 97, + 114, + 107, + 45, + 112, + 121, + 112, + 105, + 32, + 114, + 117, + 110, + 45, + 116, + 101, + 115, + 116, + 45, + 112, + 114, + 101, + 58, + 32, + 80, + 89, + 84, + 72, + 79, + 78, + 72, + 65, + 83, + 72, + 83, + 69, + 69, + 68, + 61, + 39, + 50, + 54, + 53, + 56, + 53, + 52, + 54, + 57, + 48, + 57, + 39, + 10, + 98, + 101, + 110, + 99, + 104, + 109, + 97, + 114, + 107, + 45, + 112, + 121, + 112, + 105, + 32, + 114, + 117, + 110, + 45, + 116, + 101, + 115, + 116, + 58, + 32, + 99, + 111, + 109, + 109, + 97, + 110, + 100, + 115, + 91, + 48, + 93, + 32, + 124, + 32, + 112, + 121, + 116, + 104, + 111, + 110, + 32, + 45, + 99, + 32, + 39, + 105, + 109, + 112, + 111, + 114, + 116, + 32, + 100, + 97, + 116, + 101, + 116, + 105, + 109, + 101, + 59, + 32, + 112, + 114, + 105, + 110, + 116, + 40, + 100, + 97, + 116, + 101, + 116, + 105, + 109, + 101, + 46, + 100, + 97, + 116, + 101, + 46, + 116, + 111, + 100, + 97, + 121, + 40, + 41, + 41, + 39, + 10, + 50, + 48, + 50, + 49, + 45, + 48, + 55, + 45, + 50, + 51, + 10, + 98, + 101, + 110, + 99, + 104, + 109, + 97, + 114, + 107, + 45, + 112, + 121, + 112, + 105, + 32, + 114, + 117, + 110, + 45, + 116, + 101, + 115, + 116, + 58, + 32, + 99, + 111, + 109, + 109, + 97, + 110, + 100, + 115, + 91, + 49, + 93, + 32, + 124, + 32, + 112, + 121, + 116, + 104, + 111, + 110, + 32, + 45, + 45, + 118, + 101, + 114, + 115, + 105, + 111, + 110, + 10, + 80, + 121, + 116, + 104, + 111, + 110, + 32, + 51, + 46, + 56, + 46, + 49, + 48, + 10, + 98, + 101, + 110, + 99, + 104, + 109, + 97, + 114, + 107, + 45, + 112, + 121, + 112, + 105, + 32, + 114, + 117, + 110, + 45, + 116, + 101, + 115, + 116, + 58, + 32, + 99, + 111, + 109, + 109, + 97, + 110, + 100, + 115, + 91, + 50, + 93, + 32, + 124, + 32, + 112, + 121, + 116, + 104, + 111, + 110, + 32, + 98, + 101, + 110, + 99, + 104, + 109, + 97, + 114, + 107, + 47, + 114, + 117, + 110, + 46, + 112, + 121, + 10, + 80, + 97, + 114, + 115, + 105, + 110, + 103, + 32, + 100, + 97, + 116, + 97, + 46, + 116, + 111, + 109, + 108, + 32, + 53, + 48, + 48, + 48, + 32, + 116, + 105, + 109, + 101, + 115, + 58, + 10, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 10, + 32, + 32, + 32, + 32, + 112, + 97, + 114, + 115, + 101, + 114, + 32, + 124, + 32, + 32, + 101, + 120, + 101, + 99, + 32, + 116, + 105, + 109, + 101, + 32, + 124, + 32, + 112, + 101, + 114, + 102, + 111, + 114, + 109, + 97, + 110, + 99, + 101, + 32, + 40, + 109, + 111, + 114, + 101, + 32, + 105, + 115, + 32, + 98, + 101, + 116, + 116, + 101, + 114, + 41, + 10, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 43, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 43, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 10, + 32, + 32, + 32, + 32, + 32, + 114, + 116, + 111, + 109, + 108, + 32, + 124, + 32, + 32, + 32, + 32, + 48, + 46, + 57, + 48, + 49, + 32, + 115, + 32, + 124, + 32, + 98, + 97, + 115, + 101, + 108, + 105, + 110, + 101, + 32, + 40, + 49, + 48, + 48, + 37, + 41, + 10, + 32, + 32, + 112, + 121, + 116, + 111, + 109, + 108, + 112, + 112, + 32, + 124, + 32, + 32, + 32, + 32, + 32, + 49, + 46, + 48, + 56, + 32, + 115, + 32, + 124, + 32, + 56, + 51, + 46, + 49, + 53, + 37, + 10, + 32, + 32, + 32, + 32, + 32, + 116, + 111, + 109, + 108, + 105, + 32, + 124, + 32, + 32, + 32, + 32, + 32, + 51, + 46, + 56, + 57, + 32, + 115, + 32, + 124, + 32, + 50, + 51, + 46, + 49, + 53, + 37, + 10, + 32, + 32, + 32, + 32, + 32, + 32, + 116, + 111, + 109, + 108, + 32, + 124, + 32, + 32, + 32, + 32, + 32, + 57, + 46, + 51, + 54, + 32, + 115, + 32, + 124, + 32, + 57, + 46, + 54, + 51, + 37, + 10, + 32, + 32, + 32, + 32, + 32, + 113, + 116, + 111, + 109, + 108, + 32, + 124, + 32, + 32, + 32, + 32, + 32, + 49, + 49, + 46, + 53, + 32, + 115, + 32, + 124, + 32, + 55, + 46, + 56, + 50, + 37, + 10, + 32, + 32, + 32, + 116, + 111, + 109, + 108, + 107, + 105, + 116, + 32, + 124, + 32, + 32, + 32, + 32, + 32, + 53, + 54, + 46, + 56, + 32, + 115, + 32, + 124, + 32, + 49, + 46, + 53, + 57, + 37, + 10, + 96, + 96, + 96, + 10, + 10, + 84, + 104, + 101, + 32, + 112, + 97, + 114, + 115, + 101, + 114, + 115, + 32, + 97, + 114, + 101, + 32, + 111, + 114, + 100, + 101, + 114, + 101, + 100, + 32, + 102, + 114, + 111, + 109, + 32, + 102, + 97, + 115, + 116, + 101, + 115, + 116, + 32, + 116, + 111, + 32, + 115, + 108, + 111, + 119, + 101, + 115, + 116, + 44, + 32, + 117, + 115, + 105, + 110, + 103, + 32, + 116, + 104, + 101, + 32, + 102, + 97, + 115, + 116, + 101, + 115, + 116, + 32, + 112, + 97, + 114, + 115, + 101, + 114, + 32, + 97, + 115, + 32, + 98, + 97, + 115, + 101, + 108, + 105, + 110, + 101, + 46, + 10, + 84, + 111, + 109, + 108, + 105, + 32, + 112, + 101, + 114, + 102, + 111, + 114, + 109, + 101, + 100, + 32, + 116, + 104, + 101, + 32, + 98, + 101, + 115, + 116, + 32, + 111, + 117, + 116, + 32, + 111, + 102, + 32, + 97, + 108, + 108, + 32, + 112, + 117, + 114, + 101, + 32, + 80, + 121, + 116, + 104, + 111, + 110, + 32, + 84, + 79, + 77, + 76, + 32, + 112, + 97, + 114, + 115, + 101, + 114, + 115, + 44, + 10, + 108, + 111, + 115, + 105, + 110, + 103, + 32, + 111, + 110, + 108, + 121, + 32, + 116, + 111, + 32, + 112, + 121, + 116, + 111, + 109, + 108, + 112, + 112, + 32, + 40, + 119, + 114, + 97, + 112, + 115, + 32, + 67, + 43, + 43, + 41, + 32, + 97, + 110, + 100, + 32, + 114, + 116, + 111, + 109, + 108, + 32, + 40, + 119, + 114, + 97, + 112, + 115, + 32, + 82, + 117, + 115, + 116, + 41, + 46, + 10, + 10, + ], + WheelCoreMetadata { + name: PackageName { + source: "tomli", + normalized: "tomli", + }, + version: Version { + epoch: 0, + release: [ + 2, + 0, + 1, + ], + pre: None, + post: None, + dev: None, + local: None, + }, + metadata_version: MetadataVersion( + Version { + epoch: 0, + release: [ + 2, + 1, + ], + pre: None, + post: None, + dev: None, + local: None, + }, + ), + requires_dist: [], + requires_python: Some( + VersionSpecifiers( + [ + VersionSpecifier { + operator: GreaterThanEqual, + version: Version { + epoch: 0, + release: [ + 3, + 7, + ], + pre: None, + post: None, + dev: None, + local: None, + }, + }, + ], + ), + ), + extras: {}, + }, + ), +) diff --git a/crates/rattler_installs_packages/src/artifacts/wheel.rs b/crates/rattler_installs_packages/src/artifacts/wheel.rs index ac8c590a..ac6f04ce 100644 --- a/crates/rattler_installs_packages/src/artifacts/wheel.rs +++ b/crates/rattler_installs_packages/src/artifacts/wheel.rs @@ -280,6 +280,7 @@ impl Wheel { let root_is_purelib = match &parsed .take("Root-Is-Purelib") + .map(|key| key.to_lowercase()) .map_err(|_| WheelCoreMetaDataError::MissingKey(String::from("Root-Is-Purelib")))?[..] { "true" => true, diff --git a/crates/rattler_installs_packages/src/index/git_interop.rs b/crates/rattler_installs_packages/src/index/git_interop.rs index c6cf9fb7..8139b66a 100644 --- a/crates/rattler_installs_packages/src/index/git_interop.rs +++ b/crates/rattler_installs_packages/src/index/git_interop.rs @@ -97,6 +97,7 @@ impl Default for GitRev { /// cleaned url with revision and subdirectory /// parsed from /// git+https://github.com/example/repo.git@1.0.0#subdirectry=some +#[derive(Debug)] pub struct ParsedUrl { /// Url to the git repository pub git_url: GitUrl, @@ -166,10 +167,10 @@ impl ParsedUrl { fn clean_url(url: &str) -> String { // Find the index of ".git" in the repository URL, or use the length if ".git" is not present - let repo_index = url - .find(".git") - .map(|index| index + 4) - .unwrap_or_else(|| url.len()); + let repo_index = url.find(".git").map(|index| index + 4).unwrap_or_else(|| { + // .git is missing, remove @ if present + url.find('@').unwrap_or(url.len()) + }); // Remove everything after ".git" let clean_url = url.chars().take(repo_index).collect(); diff --git a/crates/rattler_installs_packages/src/index/html.rs b/crates/rattler_installs_packages/src/index/html.rs index 72c46ec4..5f7add27 100644 --- a/crates/rattler_installs_packages/src/index/html.rs +++ b/crates/rattler_installs_packages/src/index/html.rs @@ -37,7 +37,7 @@ fn into_artifact_info( let url = base.join(href.as_ref()).ok()?; let filename = url.path_segments().and_then(|mut s| s.next_back()); let filename = filename - .map(|s| ArtifactName::from_filename(s, normalized_package_name))? + .map(|s| ArtifactName::from_filename(s, None, normalized_package_name))? .ok()?; // We found a valid link diff --git a/crates/rattler_installs_packages/src/types/artifact_name.rs b/crates/rattler_installs_packages/src/types/artifact_name.rs index 39e02396..49dcef58 100644 --- a/crates/rattler_installs_packages/src/types/artifact_name.rs +++ b/crates/rattler_installs_packages/src/types/artifact_name.rs @@ -489,6 +489,7 @@ impl ArtifactName { /// it uses the normalized package name to check where to split the string pub fn from_filename( input: &str, + url: Option, normalized_package_name: &NormalizedPackageName, ) -> Result { if input.ends_with(".whl") { @@ -507,6 +508,14 @@ impl ArtifactName { input, normalized_package_name, )?)) + } else if let Some(url) = url { + let distribution = PackageName::from(normalized_package_name.clone()); + + Ok(ArtifactName::STree(STreeFilename { + distribution, + version: Version::from_str("0.0.0").expect("0.0.0 version should be parseable"), + url, + })) } else { Err(ParseArtifactNameError::InvalidExtension(input.to_string())) } diff --git a/crates/rattler_installs_packages/src/wheel_builder/mod.rs b/crates/rattler_installs_packages/src/wheel_builder/mod.rs index 471a5466..d199b90f 100644 --- a/crates/rattler_installs_packages/src/wheel_builder/mod.rs +++ b/crates/rattler_installs_packages/src/wheel_builder/mod.rs @@ -7,6 +7,7 @@ mod wheel_cache; use fs_err as fs; use std::collections::HashSet; +use std::env; use std::str::FromStr; use std::sync::Arc; @@ -64,12 +65,26 @@ impl WheelBuilder { env_markers: Arc, wheel_tags: Option>, resolve_options: ResolveOptions, - env_variables: HashMap, + mut env_variables: HashMap, ) -> Result { let resolve_options = resolve_options.clone(); let python_version = resolve_options.python_location.version()?; + let source_date_epoch_key = "SOURCE_DATE_EPOCH".to_owned(); + // when unpacking tomli-2.0.1.tar.gz we face the issue that + // python std zipfile library does not support timestamps before 1980 + // so we are passing one as SOURCE_DATE_EPOCH env variable + // so flit_core could use it + // https://github.com/alexcrichton/tar-rs/issues/349 + if let std::collections::hash_map::Entry::Vacant(_) = + env_variables.entry(source_date_epoch_key.clone()) + { + if env::var(&source_date_epoch_key).is_err() || resolve_options.clean_env { + env_variables.insert(source_date_epoch_key, "1707928508".to_owned()); + } + } + Ok(Self { venv_cache: Mutex::new(HashMap::new()), package_db,