diff --git a/Cargo.lock b/Cargo.lock index cac53fc..6dbb55e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -67,7 +67,7 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -77,7 +77,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -101,6 +101,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "bendy" version = "0.3.3" @@ -112,6 +118,27 @@ dependencies = [ "serde_bytes", ] +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "brs" version = "0.1.0" @@ -120,10 +147,12 @@ dependencies = [ "chrono", "hex", "human_bytes", + "rand", + "reqwest", "serde", - "serde_bencode", "serde_bytes", - "serde_json", + "serde_with", + "sha1", "thiserror", ] @@ -131,8 +160,13 @@ dependencies = [ name = "brs-cli" version = "0.1.0" dependencies = [ + "bendy", "brs", "clap", + "clap_complete", + "rand", + "thiserror", + "tokio", ] [[package]] @@ -148,6 +182,12 @@ version = "3.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" +[[package]] +name = "bytes" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" + [[package]] name = "cc" version = "1.0.90" @@ -172,7 +212,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets", + "windows-targets 0.52.4", ] [[package]] @@ -194,7 +234,16 @@ dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim", + "strsim 0.11.0", +] + +[[package]] +name = "clap_complete" +version = "4.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "885e4d7d5af40bfb99ae6f9433e292feac98d452dcb3ec3d25dfe7552b77da8c" +dependencies = [ + "clap", ] [[package]] @@ -221,12 +270,121 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "darling" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn 2.0.55", +] + +[[package]] +name = "darling_macro" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "encoding_rs" +version = "0.8.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "failure" version = "0.1.8" @@ -249,30 +407,259 @@ dependencies = [ "synstructure", ] +[[package]] +name = "fastrand" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "gimli" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "h2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51ee2dd2e4f378392eeff5d51618cd9a63166a2513846bbc55f21cfacd9199d4" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + [[package]] name = "human_bytes" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91f255a4535024abf7640cb288260811fc14794f62b063652ed349f9a6c2348e" +[[package]] +name = "hyper" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2", + "tokio", + "tower", + "tower-service", + "tracing", +] + [[package]] name = "iana-time-zone" version = "0.1.60" @@ -296,6 +683,50 @@ dependencies = [ "cc", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", + "serde", +] + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + [[package]] name = "itoa" version = "1.0.11" @@ -311,12 +742,34 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + [[package]] name = "libc" version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +[[package]] +name = "linux-raw-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "log" version = "0.4.21" @@ -329,6 +782,12 @@ version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + [[package]] name = "miniz_oxide" version = "0.7.2" @@ -338,6 +797,41 @@ dependencies = [ "adler", ] +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-traits" version = "0.2.18" @@ -347,6 +841,16 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + [[package]] name = "object" version = "0.32.2" @@ -362,6 +866,129 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "openssl" +version = "0.10.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +dependencies = [ + "bitflags 2.5.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.48.5", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "proc-macro2" version = "1.0.79" @@ -380,18 +1007,159 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "reqwest" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d66674f2b6fb864665eea7a3c1ac4e3dfacd2fda83cf6f935a612e01b0e3338" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + [[package]] name = "rustc-demangle" version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +[[package]] +name = "rustix" +version = "0.38.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" +dependencies = [ + "bitflags 2.5.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64", +] + [[package]] name = "ryu" version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "serde" version = "1.0.197" @@ -401,16 +1169,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "serde_bencode" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a70dfc7b7438b99896e7f8992363ab8e2c4ba26aa5ec675d32d1c3c2c33d413e" -dependencies = [ - "serde", - "serde_bytes", -] - [[package]] name = "serde_bytes" version = "0.11.14" @@ -442,6 +1200,99 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee80b0e361bbf88fd2f6e242ccd19cfda072cb0faa6ae694ecee08199938569a" +dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.2.6", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6561dc161a9224638a31d876ccdfefbc1df91d3f3a8342eddb35f055d48c7655" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "strsim" version = "0.11.0" @@ -470,6 +1321,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "synstructure" version = "0.12.6" @@ -482,6 +1339,39 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + [[package]] name = "thiserror" version = "1.0.58" @@ -502,24 +1392,237 @@ dependencies = [ "syn 2.0.55", ] +[[package]] +name = "time" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-xid" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + [[package]] name = "utf8parse" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "wasm-bindgen" version = "0.2.92" @@ -545,6 +1648,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.92" @@ -574,13 +1689,32 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "windows-core" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets", + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", ] [[package]] @@ -589,7 +1723,22 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -598,53 +1747,105 @@ version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_aarch64_msvc" version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_gnu" version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_i686_msvc" version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnu" version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "windows_x86_64_msvc" version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] diff --git a/brs/Cargo.toml b/brs/Cargo.toml index 5dd6cee..4ae88c8 100644 --- a/brs/Cargo.toml +++ b/brs/Cargo.toml @@ -2,16 +2,18 @@ name = "brs" version = "0.1.0" edition = "2021" -description = "BRS stands for \"BitTorrent Rust\". It a library for the BitTorrent protocol." +description = "BRS stands for \"BitTorrent Rust\". It's a library for the BitTorrent protocol." authors = [ "Antoine Langlois " ] [dependencies] -bendy = { version = "0.3", features = ["serde"] } +bendy = { version = "0.3", features = ["std", "serde"] } chrono = { version = "0.4", features = ["serde"] } hex = "0.4" human_bytes = "0.4" +rand = "0.8" +reqwest = "0.12" serde = { version = "1.0", features = ["derive"] } -serde_bencode = "0.2" serde_bytes = "0.11" -serde_json = "1.0" +serde_with = { version = "3.7", features = ["chrono"] } +sha1 = "0.10" thiserror = "1.0" diff --git a/brs/src/error.rs b/brs/src/error.rs index 3fcdfd5..1251fab 100644 --- a/brs/src/error.rs +++ b/brs/src/error.rs @@ -1,11 +1,21 @@ -use std::io; +use std::net::AddrParseError; use thiserror::Error; -#[derive(Error, Debug)] -pub enum TorrentError { - #[error("Failed to parse torrent file: {0}")] - ParseTorrent(String), - #[error("Failed to read torrent file: {0}")] - ReadTorrent(#[from] io::Error) +#[derive(Debug, Error)] +pub enum TrackerError { + #[error("Failed to execute announce request: {0}")] + AnnounceRequest(#[from] reqwest::Error), + #[error("Failed to decode response body: {0}")] + BencodeDecode(#[from] bendy::serde::Error), + #[error("Tracker responded with an invalid status code: {0}")] + InvalidStatus(u16), + #[error("Announce request failed: {0}")] + AnnounceFailed(String), + #[error("Failed to convert IP string to IpAddr: {0}")] + IpParse(#[from] AddrParseError), + #[error("Invalid compact peers list. Expected a list of {0}*n bytes, found: {1}")] + InvalidPeersCompactList(u8, u64), + #[error("Failed to parse tracker URL: {0}")] + ParseURL(String), } diff --git a/brs/src/lib.rs b/brs/src/lib.rs index 4304b2f..d913293 100644 --- a/brs/src/lib.rs +++ b/brs/src/lib.rs @@ -1,4 +1,6 @@ pub mod torrent; -// pub mod torrent; +pub mod tracker; +pub mod peer; + mod error; mod macros; diff --git a/brs/src/macros.rs b/brs/src/macros.rs index efa99d8..ea1a01d 100644 --- a/brs/src/macros.rs +++ b/brs/src/macros.rs @@ -1,92 +1,8 @@ #[macro_export] -macro_rules! write_option { - ($f:expr, $k:expr, $v:expr) => {{ - if let Some(v) = $v { - write!($f, "{}: {}\n", $k, v)?; - } - }}; -} - -#[macro_export] -macro_rules! match_dict { - ($value:expr, $expected:expr) => {{ - match $value { - serde_bencode::value::Value::Dict(v) => Ok(v), - serde_bencode::value::Value::List(_) => Err(serde::de::Error::invalid_type( - serde::de::Unexpected::Seq, - &$expected, - )), - serde_bencode::value::Value::Int(v) => Err(serde::de::Error::invalid_type( - serde::de::Unexpected::Signed(v), - &$expected, - )), - serde_bencode::value::Value::Bytes(v) => Err(serde::de::Error::invalid_type( - serde::de::Unexpected::Bytes(&v), - &$expected, - )), - } - }}; -} - -#[macro_export] -macro_rules! match_list { - ($value:expr, $expected:expr) => {{ - match $value { - serde_bencode::value::Value::List(v) => Ok(v), - serde_bencode::value::Value::Dict(_) => Err(serde::de::Error::invalid_type( - serde::de::Unexpected::Map, - &$expected, - )), - serde_bencode::value::Value::Int(v) => Err(serde::de::Error::invalid_type( - serde::de::Unexpected::Signed(*v), - &$expected, - )), - serde_bencode::value::Value::Bytes(v) => Err(serde::de::Error::invalid_type( - serde::de::Unexpected::Bytes(&v), - &$expected, - )), - } - }}; -} - -#[macro_export] -macro_rules! match_bytes { - ($value:expr, $expected:expr) => {{ - match $value { - serde_bencode::value::Value::Bytes(v) => Ok(v), - serde_bencode::value::Value::Dict(_) => Err(serde::de::Error::invalid_type( - serde::de::Unexpected::Map, - &$expected, - )), - serde_bencode::value::Value::Int(v) => Err(serde::de::Error::invalid_type( - serde::de::Unexpected::Signed(*v), - &$expected, - )), - serde_bencode::value::Value::List(_) => Err(serde::de::Error::invalid_type( - serde::de::Unexpected::Seq, - &$expected, - )), - } - }}; -} - -#[macro_export] -macro_rules! match_int { - ($value:expr, $expected:expr) => {{ - match $value { - serde_bencode::value::Value::Int(v) => Ok(v), - serde_bencode::value::Value::Dict(_) => Err(serde::de::Error::invalid_type( - serde::de::Unexpected::Map, - &$expected, - )), - serde_bencode::value::Value::Bytes(v) => Err(serde::de::Error::invalid_type( - serde::de::Unexpected::Bytes(&v), - &$expected, - )), - serde_bencode::value::Value::List(_) => Err(serde::de::Error::invalid_type( - serde::de::Unexpected::Seq, - &$expected, - )), +macro_rules! write_optional { + ($f:expr, $k:expr, $v:expr, $empty:expr) => {{ + if !$empty($v) { + write!($f, "{}: {}\n", $k, $v)?; } }}; } diff --git a/brs/src/peer.rs b/brs/src/peer.rs new file mode 100644 index 0000000..e622e5f --- /dev/null +++ b/brs/src/peer.rs @@ -0,0 +1,31 @@ +use rand::{distributions::Alphanumeric, Rng}; + +const VERSION: &str = env!("CARGO_PKG_VERSION"); + +/// Generate a peer ID matching the specification `BEP 0020` +pub fn gen_peer_id(prefix: Option) -> String { + let prefix = if let Some(v) = prefix { + v + } else { + let mut iter = VERSION.splitn(3, "."); + let major = iter + .next() + .expect("version should contains 3 elements, not 0"); + let minor = iter + .next() + .expect("version should contains 3 elements, not 1"); + let patch = iter + .next() + .expect("version should contains 3 elements, not 2"); + + format!("-B{}{}{}-", major, minor, patch) + }; + + let random_alphanum: String = rand::thread_rng() + .sample_iter(&Alphanumeric) + .take(20-prefix.len()) + .map(char::from) + .collect(); + + format!("{prefix}{random_alphanum}") +} diff --git a/brs/src/torrent/de.rs b/brs/src/torrent/de.rs deleted file mode 100644 index 4091370..0000000 --- a/brs/src/torrent/de.rs +++ /dev/null @@ -1,94 +0,0 @@ -use chrono::{DateTime, Utc}; -use serde::{ - de::{Error, Unexpected}, - Deserialize, Deserializer, -}; - -use crate::{match_bytes, match_dict, match_int, match_list, torrent::TorrentFiles}; - -pub fn from_bool_to_int<'de, D>(deserializer: D) -> Result -where - D: Deserializer<'de>, -{ - match u8::deserialize(deserializer)? { - 0 => Ok(false), - 1 => Ok(true), - other => Err(Error::invalid_value( - Unexpected::Unsigned(other as u64), - &"zero or one", - )), - } -} - -pub fn from_i64_to_datetime<'de, D>(deserializer: D) -> Result>, D::Error> -where - D: Deserializer<'de>, -{ - let timestamp: Option = Option::deserialize(deserializer)?; - if let Some(v) = timestamp { - return Ok(DateTime::from_timestamp(v, 0)); - } - - Ok(None) -} - -pub fn from_bytes_to_vec<'de, D>(deserializer: D) -> Result, D::Error> -where - D: Deserializer<'de>, -{ - let bytes = serde_bytes::ByteBuf::deserialize(deserializer)?; - Ok(bytes - .chunks(20) - .map(|v| hex::encode(v)) - .collect::>()) -} - -pub fn from_files_list_to_struct<'de, D>( - deserializer: D, -) -> Result>, D::Error> -where - D: Deserializer<'de>, -{ - let list: Vec = match Option::deserialize(deserializer)? { - Some(v) => v, - None => return Ok(None), - }; - let mut torrent_files = vec![]; - for v in list { - let file_dict = match_dict!(v, "map with keys \"path\" & \"length\"")?; - if file_dict.len() > 2 { - return Err(Error::invalid_length( - file_dict.len(), - &"path and length only", - )); - } - let path = file_dict.get(b"path".as_ref()); - let length = file_dict.get(b"length".as_ref()); - if path.is_none() { - return Err(Error::missing_field( - "\"path\" is mandatory in a files list", - )); - } else if length.is_none() { - return Err(Error::missing_field( - "\"length\" is mandatory in a files list", - )); - } - let path = { - let mut str_path = String::new(); - for chunks in match_list!(path.unwrap(), "list of bytes")? { - let chunks = match_bytes!(chunks, "sequence of bytes")?; - str_path.push_str(std::str::from_utf8(chunks).map_err(|_| { - Error::invalid_value(Unexpected::Bytes(&chunks), &"Invalid bytes string") - })?); - } - str_path - }; - let length = match_int!(length.unwrap(), "integer")?; - torrent_files.push(TorrentFiles { - path, - length: *length as u64, - }) - } - - Ok(Some(torrent_files)) -} diff --git a/brs/src/torrent/display.rs b/brs/src/torrent/display.rs deleted file mode 100644 index 7546067..0000000 --- a/brs/src/torrent/display.rs +++ /dev/null @@ -1,116 +0,0 @@ -use std::collections::HashMap; - -use human_bytes::human_bytes; - -use crate::write_option; - -use super::Torrent; - -impl std::fmt::Display for Torrent { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, "tracker: {}\n", self.announce)?; - write_option!(f, "created by", &self.additional_fields.created_by); - write_option!(f, "creation date", &self.additional_fields.creation_date); - write_option!(f, "comment", &self.additional_fields.comment); - if self.additional_fields.extra_fields.len() > 0 { - for (k, v) in self.additional_fields.extra_fields.clone().into_iter() { - let value = match v { - serde_bencode::value::Value::Bytes(v) => std::str::from_utf8(&v) - .map_err(|_| std::fmt::Error)? - .to_string(), - serde_bencode::value::Value::Int(v) => v.to_string(), - serde_bencode::value::Value::List(v) => { - display_list(f, v)?; - continue; - } - serde_bencode::value::Value::Dict(v) => { - display_dict(f, v)?; - continue; - } - }; - write!(f, "{k}: {value}\n")?; - } - } - write!(f, "\n")?; - - write!(f, "Torrent information:\n")?; - write!(f, "\tname: {}\n", self.info.name)?; - write!(f, "\tprivate: {}\n", self.info.additional_fields.private)?; - if let Some(v) = self.info.length { - write!(f, "\tfile size: {}\n", human_bytes(v as f64))?; - } - write!(f, "\tpieces: {:?}\n", self.info.pieces.len())?; - write!( - f, - "\tpiece size: {}\n", - human_bytes(self.info.piece_length as f64) - )?; - if std::env::var("BRS_PRINT_TORRENT_FILES").is_ok() { - if let Some(v) = &self.info.files { - write!(f, "\tfiles:\n")?; - for file in v { - write!(f, "\t - {}\n", file.path)?; - write!(f, "\t size: {}\n", human_bytes(file.length as f64))?; - } - } - } - if self.info.additional_fields.extra_fields.len() > 0 { - for (k, v) in &self.info.additional_fields.extra_fields { - write!(f, "\t{}: {:#?}\n", k, v)?; - } - } - - Ok(()) - } -} - -fn display_dict( - f: &mut std::fmt::Formatter, - dict: HashMap, serde_bencode::value::Value>, -) -> std::fmt::Result { - for (k, v) in dict { - let key = std::str::from_utf8(&k).map_err(|_| std::fmt::Error)?; - let value = match v { - serde_bencode::value::Value::Bytes(v) => std::str::from_utf8(&v) - .map_err(|_| std::fmt::Error)? - .to_string(), - serde_bencode::value::Value::Int(v) => v.to_string(), - serde_bencode::value::Value::List(v) => { - display_list(f, v)?; - continue; - } - serde_bencode::value::Value::Dict(v) => { - display_dict(f, v)?; - continue; - } - }; - write!(f, "{key}: {value}\n").map_err(|_| std::fmt::Error)? - } - - Ok(()) -} - -fn display_list( - f: &mut std::fmt::Formatter, - list: Vec, -) -> std::fmt::Result { - for element in list { - let value = match element { - serde_bencode::value::Value::Bytes(v) => std::str::from_utf8(&v) - .map_err(|_| std::fmt::Error)? - .to_string(), - serde_bencode::value::Value::Int(v) => v.to_string(), - serde_bencode::value::Value::List(v) => { - display_list(f, v)?; - continue; - } - serde_bencode::value::Value::Dict(v) => { - display_dict(f, v)?; - continue; - } - }; - write!(f, " - {value}\n")?; - } - - Ok(()) -} diff --git a/brs/src/torrent/errors.rs b/brs/src/torrent/errors.rs new file mode 100644 index 0000000..5a6bc24 --- /dev/null +++ b/brs/src/torrent/errors.rs @@ -0,0 +1,15 @@ +use std::io; + +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum TorrentError { + #[error("Failed to parse torrent file: {0}")] + ParseTorrent(bendy::serde::Error), + #[error("Failed to encode info dictionnary: {0}")] + EncodeInfo(bendy::serde::Error), + #[error("Failed to read torrent file: {0}")] + ReadTorrent(#[from] io::Error), + #[error("Failed to convert bytes array to UTF-8 string")] + Utf8Conversion(#[from] std::string::FromUtf8Error), +} diff --git a/brs/src/torrent/mod.rs b/brs/src/torrent/mod.rs index 9e35390..d0ffc5e 100644 --- a/brs/src/torrent/mod.rs +++ b/brs/src/torrent/mod.rs @@ -1,91 +1,3 @@ -mod de; -mod display; - -use std::{collections::HashMap, fs}; - -use chrono::{DateTime, Utc}; -use serde::Deserialize; - -use crate::{error::TorrentError, torrent::de::*}; - -#[derive(Debug, Deserialize)] -pub struct Torrent { - /// Announcer URL - pub announce: String, - /// Torrent information - pub info: TorrentInfo, - /// Non official fields - #[serde(flatten)] - pub additional_fields: RootAdditionalFields, -} - -/// TorrentInfo is a struct that contains all the information about the torrent file. -#[derive(Debug, Deserialize)] -pub struct TorrentInfo { - /// Recommanded output file or root directory - pub name: String, - /// Size of each data piece - #[serde(rename = "piece length")] - pub piece_length: u64, - /// SHA1 hashes of each pieces - #[serde(deserialize_with = "from_bytes_to_vec")] - pub pieces: Vec, - /// In case of a single file, represents the file size - pub length: Option, - #[serde(default, deserialize_with = "from_files_list_to_struct")] - /// In case of multiple files/directories, represents all files/directories available - pub files: Option>, - // Additional fields available that are not part of the original specification - #[serde(flatten)] - pub additional_fields: TorrentInfoAdditionalFields, -} - -#[derive(Debug, Deserialize)] -pub struct TorrentFiles { - /// Output file path - pub path: String, - /// File size - pub length: u64, -} - -/// RootAdditionalFields is a struct that contains all the additional fields that are not part of the -/// original [BitTorrent](https://www.bittorrent.org/beps/bep_0003.html) specification. -#[derive(Debug, Deserialize)] -pub struct RootAdditionalFields { - /// Torrent creator or software name - #[serde(rename = "created by")] - pub created_by: Option, - /// Torrent creation date - #[serde( - default, - rename = "creation date", - deserialize_with = "from_i64_to_datetime" - )] - pub creation_date: Option>, - /// Comment about the torrent - pub comment: Option, - // #[serde(rename = "url-list")] - // /// List of resources available - // pub url_list: Option>, - #[serde(flatten)] - /// Extra fields not explicitly covered by the struct - pub extra_fields: HashMap, -} - -/// TorrentInfoAdditionalFields is a struct that contains all the additional fields that are not part of the -/// original [BitTorrent](https://www.bittorrent.org/beps/bep_0003.html) specification. -#[derive(Debug, Deserialize)] -pub struct TorrentInfoAdditionalFields { - /// Is the torrent private - #[serde(default, deserialize_with = "from_bool_to_int")] - pub private: bool, - /// Extra fields not explicitly covered by the struct - #[serde(flatten)] - pub extra_fields: HashMap, -} - -pub fn parse(path: String) -> Result { - let torrent_file = fs::read(path).map_err(|e| TorrentError::ReadTorrent(e))?; - - serde_bencode::from_bytes(&torrent_file).map_err(|e| TorrentError::ParseTorrent(e.to_string())) -} +pub mod errors; +pub mod v1; +pub mod v2; diff --git a/brs/src/torrent/v1/display.rs b/brs/src/torrent/v1/display.rs new file mode 100644 index 0000000..786b428 --- /dev/null +++ b/brs/src/torrent/v1/display.rs @@ -0,0 +1,95 @@ +use human_bytes::human_bytes; + +use crate::{torrent::v1::ext_parsing::skip_empty, write_optional}; + +use super::Torrent; + +impl std::fmt::Display for Torrent<'_> { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(f, "GENERAL\n\n")?; + write!(f, " Tracker: {}\n", self.announce)?; + write_optional!( + f, + " Created by", + &self.additional_fields.created_by, + skip_empty::string + ); + write_optional!( + f, + " Creation date", + &self.additional_fields.creation_date, + skip_empty::date + ); + write_optional!( + f, + " Comment", + &self.additional_fields.comment, + skip_empty::string + ); + write_optional!( + f, + " Encoding", + &self.additional_fields.encoding, + skip_empty::string + ); + if !self.additional_fields.url_list.is_empty() { + write!(f, " Additional resources:\n")?; + for ar in &self.additional_fields.url_list { + write!(f, " - {}\n", ar)?; + } + } + if !self.additional_fields.extra_fields.is_empty() { + for (k, v) in &self.additional_fields.extra_fields { + write!(f, " {}: {:#?}\n", k, v,)?; + } + } + write!(f, "\n")?; + + write!(f, "TORRENT INFORMATION\n\n")?; + write!(f, " Name: {}\n", self.info.name)?; + write!(f, " Hash: {}\n", self.calc_hash().unwrap())?; + write_optional!( + f, + " Private", + &self.info.additional_fields.private, + skip_empty::bool + ); + write!(f, " Pieces: {:?}\n", self.info.pieces.len())?; + write!( + f, + " Piece size: {}\n", + human_bytes(self.info.piece_length as f64) + )?; + write!( + f, + " Total size: {}\n", + human_bytes(self.calc_download_lenght() as f64) + )?; + if !self.info.additional_fields.extra_fields.is_empty() { + for (k, v) in &self.info.additional_fields.extra_fields { + write!(f, " {}: {:#?}\n", k, v,)?; + } + } + + write!(f, "\nFILES\n\n")?; + if !self.info.files.is_empty() { + for files in &self.info.files { + write!( + f, + " {} ({})\n", + files.path, + human_bytes(files.length as f64) + )?; + } + } else { + write!( + f, + " {} ({})", + self.info.name, + human_bytes(self.calc_download_lenght() as f64) + )?; + } + + Ok(()) + } +} diff --git a/brs/src/torrent/v1/ext_parsing.rs b/brs/src/torrent/v1/ext_parsing.rs new file mode 100644 index 0000000..7d9239f --- /dev/null +++ b/brs/src/torrent/v1/ext_parsing.rs @@ -0,0 +1,213 @@ +pub(super) mod skip_empty { + use chrono::{DateTime, Utc}; + + #[inline(always)] + pub(crate) fn i64(v: &i64) -> bool { + *v == 0 + } + + #[inline(always)] + pub(crate) fn bool(v: &bool) -> bool { + *v == false + } + + #[inline(always)] + pub(crate) fn string(v: &String) -> bool { + v.len() == 0 + } + + #[inline(always)] + pub(crate) fn date(v: &DateTime) -> bool { + *v == DateTime::::default() + } +} + +pub(super) mod pieces { + use serde::{de, ser, Deserializer, Serializer}; + use serde_with::{Bytes, DeserializeAs, SerializeAs}; + + pub fn serialize(pieces: &Vec, serializer: S) -> Result + where + S: Serializer, + { + let mut buf: Vec = vec![]; + for v in pieces { + buf.append(&mut hex::decode(v).map_err(|e| { + ser::Error::custom(format!( + "Every pieces must be serializable into hexadecimal: {e}" + )) + })?); + } + + Bytes::serialize_as(&buf, serializer) + } + + pub fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> + where + D: Deserializer<'de>, + { + let bytes: Vec = Bytes::deserialize_as(deserializer)?; + if (bytes.len() % 20) != 0 { + return Err(de::Error::custom("Invalid SHA1 pieces")); + } + + Ok(bytes.chunks(20).map(|c| hex::encode(c)).collect()) + } +} + +pub(super) mod files { + use std::{borrow::Cow, collections::BTreeMap}; + + use bendy::value::Value; + use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; + + use crate::torrent::v1::TorrentFile; + + pub fn serialize(files: &Vec, serializer: S) -> Result + where + S: Serializer, + { + let mut dict_list = vec![]; + let length_key: Cow<'_, [u8]> = Cow::Owned(String::from("length").into_bytes()); + let path_key: Cow<'_, [u8]> = Cow::Owned(String::from("path").into_bytes()); + for f in files { + let mut dict: BTreeMap, Value> = BTreeMap::new(); + dict.insert(length_key.clone(), Value::Integer(f.length as i64)); + let mut path_partial = vec![]; + for i in f.path.split("/") { + path_partial.push(Value::Bytes(i.as_bytes().into())); + } + dict.insert(path_key.clone(), Value::List(path_partial)); + dict_list.push(Value::Dict(dict)); + } + + dict_list.serialize(serializer) + } + + pub fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> + where + D: Deserializer<'de>, + { + let values = match Value::deserialize(deserializer)? { + Value::List(v) => v, + Value::Bytes(v) => { + return Err(de::Error::invalid_type( + de::Unexpected::Bytes(&v), + &"list of dict", + )) + } + Value::Dict(_) => { + return Err(de::Error::invalid_type( + de::Unexpected::Map, + &"list of dict", + )) + } + Value::Integer(v) => { + return Err(de::Error::invalid_type( + de::Unexpected::Signed(v), + &"list of dict", + )) + } + }; + let mut torrent_files: Vec = vec![]; + let length_key = Cow::Owned(String::from("length").into_bytes()); + let path_key = Cow::Owned(String::from("path").into_bytes()); + for v in values { + let file = match v { + Value::Dict(v) => v, + Value::Bytes(v) => { + return Err(de::Error::invalid_type( + de::Unexpected::Bytes(&v), + &"dict with keys length and path", + )) + } + Value::Integer(v) => { + return Err(de::Error::invalid_type( + de::Unexpected::Signed(v), + &"dict with keys length and path", + )) + } + Value::List(_) => { + return Err(de::Error::invalid_type( + de::Unexpected::Seq, + &"dict with keys length and path", + )) + } + }; + let length = file.get(&length_key); + let path = file.get(&path_key); + if length.is_none() { + return Err(de::Error::missing_field("length")); + } + if path.is_none() { + return Err(de::Error::missing_field("path")); + } + let length = match length.unwrap() { + Value::Integer(v) => *v, + Value::Bytes(v) => { + return Err(de::Error::invalid_type( + de::Unexpected::Bytes(&v), + &"integer", + )) + } + Value::Dict(_) => { + return Err(de::Error::invalid_type(de::Unexpected::Map, &"integer")) + } + Value::List(_) => { + return Err(de::Error::invalid_type(de::Unexpected::Seq, &"integer")) + } + }; + let path = match path.unwrap() { + Value::List(v) => { + let mut final_str = String::new(); + for (i, item) in v.iter().enumerate() { + let partial = match item { + Value::Bytes(v) => std::str::from_utf8(v).map_err(|_| { + de::Error::invalid_value( + de::Unexpected::Bytes(v), + &"valid UTF-8 string", + ) + })?, + Value::Dict(_) => { + return Err(de::Error::invalid_type(de::Unexpected::Map, &"string")) + } + Value::Integer(v) => { + return Err(de::Error::invalid_type( + de::Unexpected::Signed(*v), + &"string", + )) + } + Value::List(_) => { + return Err(de::Error::invalid_type(de::Unexpected::Seq, &"string")) + } + }; + if i == 0 { + final_str.push_str(partial); + continue; + } + final_str.push_str(&format!("/{partial}")); + } + final_str + } + Value::Bytes(v) => { + return Err(de::Error::invalid_type( + de::Unexpected::Bytes(&v), + &"list of bytes", + )) + } + Value::Dict(_) => { + return Err(de::Error::invalid_type(de::Unexpected::Map, &"list of bytes")) + } + Value::Integer(v) => { + return Err(de::Error::invalid_type( + de::Unexpected::Signed(*v), + &"list of bytes", + )) + } + }; + torrent_files.push(TorrentFile { length, path }) + } + + Ok(torrent_files) + } +} diff --git a/brs/src/torrent/v1/main.rs b/brs/src/torrent/v1/main.rs new file mode 100644 index 0000000..6e0fb26 --- /dev/null +++ b/brs/src/torrent/v1/main.rs @@ -0,0 +1,28 @@ +use bendy::serde::{from_bytes, to_bytes}; +use sha1::{Digest, Sha1}; + +use crate::torrent::errors::TorrentError; + +use super::{ext_parsing, Torrent}; + +impl Torrent<'_> { + pub fn parse_bytes<'a>(bytes: &'a [u8]) -> Result, TorrentError> { + from_bytes::<'a>(bytes).map_err(|e| TorrentError::ParseTorrent(e)) + } + + pub fn calc_download_lenght(&self) -> i64 { + if !ext_parsing::skip_empty::i64(&self.info.length) { + return self.info.length; + } + + self.info.files.iter().map(|f| f.length).sum() + } + + pub fn calc_hash(&self) -> Result { + let mut hasher = Sha1::new(); + let encoded = to_bytes(&self.info).map_err(|e| TorrentError::EncodeInfo(e))?; + hasher.update(&encoded); + + Ok(hex::encode(hasher.finalize())) + } +} diff --git a/brs/src/torrent/v1/mod.rs b/brs/src/torrent/v1/mod.rs new file mode 100644 index 0000000..8188f7e --- /dev/null +++ b/brs/src/torrent/v1/mod.rs @@ -0,0 +1,111 @@ +mod display; +mod ext_parsing; +mod main; + +use std::collections::HashMap; + +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use serde_with::{serde_as, BoolFromInt, TimestampSeconds}; + +#[derive(Debug, Deserialize, Serialize)] +pub struct Torrent<'a> { + /// Announcer URL + pub announce: String, + /// Torrent information + pub info: TorrentInfo<'a>, + /// Non official fields + #[serde(flatten, borrow)] + pub additional_fields: RootAdditionalFields<'a>, +} + +/// TorrentInfo is a struct that contains all the information about the torrent file. +#[serde_as] +#[derive(Debug, Deserialize, Serialize)] +pub struct TorrentInfo<'a> { + /// Recommanded output file or root directory. + /// REQUIRED + pub name: String, + /// Size of each data piece. + /// REQUIRED + #[serde(rename = "piece length")] + pub piece_length: i64, + /// SHA1 hashes of each pieces concatenated. Each hash is 20 bytes long. + /// REQUIRED + #[serde(with = "ext_parsing::pieces")] + pub pieces: Vec, + /// In case of a single file, represents the file size. + /// REQUIRED - If `TorrentInfo.files` is empty + #[serde(default, skip_serializing_if = "ext_parsing::skip_empty::i64")] + pub length: i64, + /// In case of multiple files/directories, represents all files/directories available + /// REQUIRED - If `TorrentInfo.length` is empty + #[serde( + default, + with = "ext_parsing::files", + skip_serializing_if = "Vec::is_empty" + )] + pub files: Vec, + // Additional fields available that are not part of the original specification + #[serde(flatten, borrow)] + pub additional_fields: TorrentInfoAdditionalFields<'a>, +} + +#[derive(Default, Debug, Clone, Deserialize, Serialize)] +pub struct TorrentFile { + /// Output file path + /// REQUIRED + pub path: String, + /// File size + /// REQUIRED + pub length: i64, +} + +/// RootAdditionalFields contains all the additional fields that are not part of the +/// original [BitTorrent](https://www.bittorrent.org/beps/bep_0003.html) specification. +/// Those who are well known are mapped directly with default values. +#[serde_as] +#[derive(Debug, Deserialize, Serialize)] +pub struct RootAdditionalFields<'a> { + /// Torrent creator or software name + #[serde( + default, + rename = "created by", + skip_serializing_if = "ext_parsing::skip_empty::string" + )] + pub created_by: String, + /// Torrent creation date + #[serde_as(as = "TimestampSeconds")] + #[serde( + default, + rename = "creation date", + skip_serializing_if = "ext_parsing::skip_empty::date" + )] + pub creation_date: DateTime, + /// Comment about the torrent + #[serde(default, skip_serializing_if = "ext_parsing::skip_empty::string")] + pub comment: String, + /// List of resources available + #[serde(default, rename = "url-list", skip_serializing_if = "Vec::is_empty")] + pub url_list: Vec, + #[serde(default)] + pub encoding: String, + /// Extra fields not explicitly covered by the struct + #[serde(flatten, borrow)] + pub extra_fields: HashMap>, +} + +/// TorrentInfoAdditionalFields contains all the additional fields that are not part of the +/// original [BitTorrent](https://www.bittorrent.org/beps/bep_0003.html) specification. +/// Those who are well known are mapped directly with default values. +#[serde_as] +#[derive(Debug, Deserialize, Serialize)] +pub struct TorrentInfoAdditionalFields<'a> { + /// Is the torrent private + #[serde_as(as = "BoolFromInt")] + #[serde(default, skip_serializing_if = "ext_parsing::skip_empty::bool")] + pub private: bool, + /// Extra fields not explicitly covered by the struct + #[serde(flatten, borrow)] + pub extra_fields: HashMap>, +} diff --git a/brs/src/torrent/v2/mod.rs b/brs/src/torrent/v2/mod.rs new file mode 100644 index 0000000..e69de29 diff --git a/brs/src/tracker/mod.rs b/brs/src/tracker/mod.rs new file mode 100644 index 0000000..d0450d4 --- /dev/null +++ b/brs/src/tracker/mod.rs @@ -0,0 +1,113 @@ +//! Tracker operations +//! +//! Start by creating an instance of a tracker +//! ```rust +//! use brs::torrent::v1::Torrent; +//! use brs::torrent::Parse; +//! use brs::tracker::Tracker; +//! +//! fn main() { +//! let torrent = match Torrent::parse("./file.torrent") { +//! Ok(v) => v, +//! Err(e) => return eprintln!("{e}"), +//! }; +//! +//! let tracker = Tracker::new(&torrent.url); +//! } +//! ``` + +mod tracker; + +use std::{collections::HashMap, net::IpAddr}; + +use serde::{Deserialize, Serialize}; +use serde_with::{serde_as, skip_serializing_none, BoolFromInt}; + +#[derive(Default, Serialize)] +#[serde(rename_all = "lowercase")] +pub enum TrackerEvent { + Started, + Completed, + Stopped, + #[default] + Empty, +} + +/// Tracker query parameters. +#[serde_as] +#[skip_serializing_none] +#[derive(Default, Serialize)] +pub struct TrackerRequest { + /// SHA1 hash of the bencode form. Must be 20 bytes long. + pub info_hash: String, + /// 20 characters ID generate before a download request. + pub peer_id: String, + /// Client's IP address. + pub ip: Option, + /// Client's listening port. + /// Usually, downloader will try common range: `6881` to `6889`. + pub port: Option, + /// Total amount of bytes uploaded encoded in base 10 `ASCII`. + pub uploaded: String, + /// Total amount of bytes downloaded encoded in base 10 `ASCII`. + pub downloaded: String, + /// Total amount of bytes left to download encoded in base 10 `ASCII`. + pub left: String, + /// Annoucement event. + pub event: TrackerEvent, + /// Should the tracker respond with a compact peers list + #[serde_as(as = "BoolFromInt")] + pub compact: bool, +} + +#[derive(Deserialize)] +pub enum TrackerResponse { + /// Tracker responded with an error + Error { + #[serde(rename = "failure reason")] + failure_reason: String, + }, + /// Tracker successfully computed the query - Normal response + Success { + /// Interval in seconds to query the tracker + interval: u64, + /// List of peers + peers: Vec, + }, + /// Tracker successfully computed the query - Compact response + SuccessCompact { + /// Interval in seconds to query the tracker + interval: u64, + /// List of peers in BigEndian order. + /// 4 bytes allocated for the IPv4 address and 2 bytes for the port. + peers: Option>, + peers6: Option> + }, +} + +#[derive(Deserialize)] +pub struct Peer { + /// Unique identifier for the peer + #[serde(rename = "peer id")] + pub peer_id: String, + /// Peer IP address. IPv4 or IPv6 + pub ip: String, + /// Peer listening port + pub port: u16, +} + +pub struct Tracker { + /// Tracker URL + pub url: String, + /// Interval in seconds to query the tracker once the transfert has started. + /// /!\ Populated with the first announce query. + pub interval: Option, + /// List of peers. + /// /!\ Populated with the first announce query. + pub peers: Option>, +} + +pub struct TrackerPeer { + pub ip: IpAddr, + pub port: u16, +} diff --git a/brs/src/tracker/tracker.rs b/brs/src/tracker/tracker.rs new file mode 100644 index 0000000..577f725 --- /dev/null +++ b/brs/src/tracker/tracker.rs @@ -0,0 +1,102 @@ +use std::{collections::HashMap, net::IpAddr}; + +use bendy::serde::from_bytes; + +use crate::error::TrackerError; + +use super::{Tracker, TrackerPeer, TrackerRequest, TrackerResponse}; + +const IPV4_PEER_LEN: u8 = 6; +const IPV6_PEER_LEN: u8 = 18; + +impl Tracker { + /// Create a new instance of `Tracker` + pub fn new(url: String) -> Self { + Self { + url, + interval: None, + peers: None, + } + } + + pub async fn announce(&mut self, req: TrackerRequest) -> Result<(), TrackerError> { + let req = reqwest::Client::new() + .get(&self.url) + .query(&req) + .send() + .await?; + if !req.status().is_success() { + return Err(TrackerError::InvalidStatus(req.status().as_u16())); + } + + let rsp: TrackerResponse = from_bytes(&req.bytes().await?)?; + match rsp { + TrackerResponse::Error { failure_reason } => { + return Err(TrackerError::AnnounceFailed(failure_reason)) + } + TrackerResponse::Success { interval, peers } => { + let mut hashmap_peers = HashMap::new(); + for p in peers { + hashmap_peers.insert( + p.peer_id, + TrackerPeer { + ip: p.ip.parse()?, + port: p.port, + }, + ); + } + self.interval = Some(interval); + self.peers = Some(hashmap_peers); + } + TrackerResponse::SuccessCompact { + interval, + peers, + peers6, + } => { + let mut hashmap_peers = HashMap::new(); + if let Some(p) = peers { + if (p.len() % IPV4_PEER_LEN as usize) != 0 { + return Err(TrackerError::InvalidPeersCompactList(IPV4_PEER_LEN, p.len() as u64)); + } + for (i, peer) in p.chunks(IPV4_PEER_LEN as usize).enumerate() { + let (ip, port) = peer.split_at(4); + hashmap_peers.insert( + i.to_string(), + TrackerPeer { + ip: IpAddr::from(TryInto::<[u8; 4]>::try_into(ip).expect( + "cannot convert &[u8] to &[u8; 4] where chunks is already of lenght 4", + )), + port: u16::from_be_bytes(port.try_into().expect( + "cannot convert &[u8] to &[u8; 2] where chunks is already of lenght 2", + )), + }, + ); + } + } + if let Some(p6) = peers6 { + if (p6.len() % IPV6_PEER_LEN as usize) != 0 { + return Err(TrackerError::InvalidPeersCompactList(IPV6_PEER_LEN, p6.len() as u64)); + } + for (i, peer) in p6.chunks(IPV6_PEER_LEN as usize).enumerate() { + let (ip, port) = peer.split_at(14); + hashmap_peers.insert( + i.to_string(), + TrackerPeer { + ip: IpAddr::from(TryInto::<[u8; 16]>::try_into(ip).expect( + "cannot convert &[u8] to &[u8; 16] where chunks is already of lenght 16", + )), + port: u16::from_be_bytes(port.try_into().expect( + "cannot convert &[u8] to &[u8; 2] where chunks is already of lenght 2", + )), + }, + ); + } + } + self.interval = Some(interval); + self.peers = Some(hashmap_peers); + } + } + + Ok(()) + } +} diff --git a/cli/Cargo.toml b/cli/Cargo.toml index d3b3361..f33c747 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -8,3 +8,8 @@ authors = [ "Antoine Langlois " ] [dependencies] brs = { path = "../brs" } clap = { version = "4.5", features = ["derive"] } +clap_complete = "4.5" +thiserror = "1.0" +tokio = { version = "1.37", features = ["full"] } +rand = "0.8" +bendy = { version = "0.3", features = ["std", "serde"] } diff --git a/cli/out b/cli/out deleted file mode 100644 index 8082cd9..0000000 --- a/cli/out +++ /dev/null @@ -1,3059 +0,0 @@ -tracker: http://tracker.loadpeers.org:8080/YXp9SWxonEzJ0Rowx49aWArU7mb7q4Ze/announce -created by: YggTorrent -creation date: 2024-03-29 16:55:34 UTC - -Torrent information: - name: Liza H 2009-2016 Full 19 Sets 1524 Photos [JPEG] - private: true - pieces: 502 - piece size: 4 MiB - files: - - MetModels2010-02-21 Liza B - Snow Show018.jpg - size: 3.9 MiB - - AmourAngels2014-01-08 Liza - Winter Forest001.jpg - size: 2.6 MiB - - AmourAngels2014-01-08 Liza - Winter Forest002.jpg - size: 2.9 MiB - - AmourAngels2014-01-08 Liza - Winter Forest003.jpg - size: 3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest004.jpg - size: 2.9 MiB - - AmourAngels2014-01-08 Liza - Winter Forest005.jpg - size: 2.7 MiB - - AmourAngels2014-01-08 Liza - Winter Forest006.jpg - size: 2.8 MiB - - AmourAngels2014-01-08 Liza - Winter Forest007.jpg - size: 2.7 MiB - - AmourAngels2014-01-08 Liza - Winter Forest008.jpg - size: 2.8 MiB - - AmourAngels2014-01-08 Liza - Winter Forest009.jpg - size: 2.8 MiB - - AmourAngels2014-01-08 Liza - Winter Forest010.jpg - size: 2.7 MiB - - AmourAngels2014-01-08 Liza - Winter Forest011.jpg - size: 2.9 MiB - - AmourAngels2014-01-08 Liza - Winter Forest012.jpg - size: 2.9 MiB - - AmourAngels2014-01-08 Liza - Winter Forest013.jpg - size: 3.1 MiB - - AmourAngels2014-01-08 Liza - Winter Forest014.jpg - size: 3.3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest015.jpg - size: 3.1 MiB - - AmourAngels2014-01-08 Liza - Winter Forest016.jpg - size: 3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest017.jpg - size: 3.2 MiB - - AmourAngels2014-01-08 Liza - Winter Forest018.jpg - size: 3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest019.jpg - size: 2.8 MiB - - AmourAngels2014-01-08 Liza - Winter Forest020.jpg - size: 2.9 MiB - - AmourAngels2014-01-08 Liza - Winter Forest021.jpg - size: 2.4 MiB - - AmourAngels2014-01-08 Liza - Winter Forest022.jpg - size: 2.8 MiB - - AmourAngels2014-01-08 Liza - Winter Forest023.jpg - size: 3.2 MiB - - AmourAngels2014-01-08 Liza - Winter Forest024.jpg - size: 3.1 MiB - - AmourAngels2014-01-08 Liza - Winter Forest025.jpg - size: 3.3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest026.jpg - size: 3.4 MiB - - AmourAngels2014-01-08 Liza - Winter Forest027.jpg - size: 3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest028.jpg - size: 3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest029.jpg - size: 2.7 MiB - - AmourAngels2014-01-08 Liza - Winter Forest030.jpg - size: 3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest031.jpg - size: 3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest032.jpg - size: 3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest033.jpg - size: 3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest034.jpg - size: 3.2 MiB - - AmourAngels2014-01-08 Liza - Winter Forest035.jpg - size: 3.1 MiB - - AmourAngels2014-01-08 Liza - Winter Forest036.jpg - size: 3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest037.jpg - size: 3.1 MiB - - AmourAngels2014-01-08 Liza - Winter Forest038.jpg - size: 3.4 MiB - - AmourAngels2014-01-08 Liza - Winter Forest039.jpg - size: 3.4 MiB - - AmourAngels2014-01-08 Liza - Winter Forest040.jpg - size: 3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest041.jpg - size: 3.1 MiB - - AmourAngels2014-01-08 Liza - Winter Forest042.jpg - size: 2.9 MiB - - AmourAngels2014-01-08 Liza - Winter Forest043.jpg - size: 3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest044.jpg - size: 3.1 MiB - - AmourAngels2014-01-08 Liza - Winter Forest045.jpg - size: 2.9 MiB - - AmourAngels2014-01-08 Liza - Winter Forest046.jpg - size: 2.6 MiB - - AmourAngels2014-01-08 Liza - Winter Forest047.jpg - size: 2.3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest048.jpg - size: 3.3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest049.jpg - size: 3.4 MiB - - AmourAngels2014-01-08 Liza - Winter Forest050.jpg - size: 3.3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest051.jpg - size: 3.3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest052.jpg - size: 2.9 MiB - - AmourAngels2014-01-08 Liza - Winter Forest053.jpg - size: 2.8 MiB - - AmourAngels2014-01-08 Liza - Winter Forest054.jpg - size: 3.3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest055.jpg - size: 3.1 MiB - - AmourAngels2014-01-08 Liza - Winter Forest056.jpg - size: 3.1 MiB - - AmourAngels2014-01-08 Liza - Winter Forest057.jpg - size: 3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest058.jpg - size: 3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest059.jpg - size: 3.3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest060.jpg - size: 3.2 MiB - - AmourAngels2014-01-08 Liza - Winter Forest061.jpg - size: 3.2 MiB - - AmourAngels2014-01-08 Liza - Winter Forest062.jpg - size: 3.1 MiB - - AmourAngels2014-01-08 Liza - Winter Forest063.jpg - size: 2.9 MiB - - AmourAngels2014-01-08 Liza - Winter Forest064.jpg - size: 2.8 MiB - - AmourAngels2014-01-08 Liza - Winter Forest065.jpg - size: 2.7 MiB - - AmourAngels2014-01-08 Liza - Winter Forest066.jpg - size: 3.3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest067.jpg - size: 3.4 MiB - - AmourAngels2014-01-08 Liza - Winter Forest068.jpg - size: 3.5 MiB - - AmourAngels2014-01-08 Liza - Winter Forest069.jpg - size: 3.4 MiB - - AmourAngels2014-01-08 Liza - Winter Forest070.jpg - size: 3.1 MiB - - AmourAngels2014-01-08 Liza - Winter Forest071.jpg - size: 3.4 MiB - - AmourAngels2014-01-08 Liza - Winter Forest072.jpg - size: 3.1 MiB - - AmourAngels2014-01-08 Liza - Winter Forest073.jpg - size: 2.9 MiB - - AmourAngels2014-01-08 Liza - Winter Forest074.jpg - size: 3.6 MiB - - AmourAngels2014-01-08 Liza - Winter Forest075.jpg - size: 3.4 MiB - - AmourAngels2014-01-08 Liza - Winter Forest076.jpg - size: 3.4 MiB - - AmourAngels2014-01-08 Liza - Winter Forest077.jpg - size: 3.4 MiB - - AmourAngels2014-01-08 Liza - Winter Forest078.jpg - size: 3.3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest079.jpg - size: 3.4 MiB - - AmourAngels2014-01-08 Liza - Winter Forest080.jpg - size: 3.4 MiB - - AmourAngels2014-01-08 Liza - Winter Forest081.jpg - size: 3.5 MiB - - AmourAngels2014-01-08 Liza - Winter Forest082.jpg - size: 3.2 MiB - - AmourAngels2014-01-08 Liza - Winter Forest083.jpg - size: 3.5 MiB - - AmourAngels2014-01-08 Liza - Winter Forest084.jpg - size: 3.6 MiB - - AmourAngels2014-01-08 Liza - Winter Forest085.jpg - size: 3.5 MiB - - AmourAngels2014-01-08 Liza - Winter Forest086.jpg - size: 3.4 MiB - - AmourAngels2014-01-08 Liza - Winter Forest087.jpg - size: 3.4 MiB - - AmourAngels2014-01-08 Liza - Winter Forest088.jpg - size: 3.3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest089.jpg - size: 3.4 MiB - - AmourAngels2014-01-08 Liza - Winter Forest090.jpg - size: 3.2 MiB - - AmourAngels2014-01-08 Liza - Winter Forest091.jpg - size: 3.4 MiB - - AmourAngels2014-01-08 Liza - Winter Forest092.jpg - size: 3.6 MiB - - AmourAngels2014-01-08 Liza - Winter Forest093.jpg - size: 3.6 MiB - - AmourAngels2014-01-08 Liza - Winter Forest094.jpg - size: 3.3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest095.jpg - size: 3.3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest096.jpg - size: 3.4 MiB - - AmourAngels2014-01-08 Liza - Winter Forest097.jpg - size: 3.4 MiB - - AmourAngels2014-01-08 Liza - Winter Forest098.jpg - size: 3.3 MiB - - AmourAngels2014-01-08 Liza - Winter Forest099.jpg - size: 3.4 MiB - - AmourAngels2014-01-08 Liza - Winter Forest100.jpg - size: 3.5 MiB - - AmourAngels2014-01-08 Liza - Winter Forest101.jpg - size: 3.5 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph000.jpg - size: 124.7 KiB - - AmourAngels2016-02-18 Liza - Cute Nymph001.jpg - size: 2.7 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph002.jpg - size: 2.6 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph003.jpg - size: 2.5 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph004.jpg - size: 2.6 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph005.jpg - size: 3.2 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph006.jpg - size: 2.1 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph007.jpg - size: 2.5 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph008.jpg - size: 2.3 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph009.jpg - size: 2.5 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph010.jpg - size: 2.9 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph011.jpg - size: 2.9 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph012.jpg - size: 2.4 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph013.jpg - size: 3 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph014.jpg - size: 3.4 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph015.jpg - size: 3.3 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph016.jpg - size: 2.8 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph017.jpg - size: 2.3 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph018.jpg - size: 2.9 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph019.jpg - size: 2.9 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph020.jpg - size: 3.4 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph021.jpg - size: 2.9 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph022.jpg - size: 2.6 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph023.jpg - size: 2.3 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph024.jpg - size: 2.3 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph025.jpg - size: 2.9 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph026.jpg - size: 2.6 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph027.jpg - size: 2.3 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph028.jpg - size: 2.4 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph029.jpg - size: 2.4 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph030.jpg - size: 2.5 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph031.jpg - size: 2 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph032.jpg - size: 2.3 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph033.jpg - size: 2.3 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph034.jpg - size: 2.2 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph035.jpg - size: 2.4 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph036.jpg - size: 2.9 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph037.jpg - size: 2.7 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph038.jpg - size: 2.4 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph039.jpg - size: 2.4 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph040.jpg - size: 2.9 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph041.jpg - size: 2.7 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph042.jpg - size: 2.2 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph043.jpg - size: 2.3 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph044.jpg - size: 2.3 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph045.jpg - size: 2.3 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph046.jpg - size: 2.2 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph047.jpg - size: 2.2 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph048.jpg - size: 2.3 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph049.jpg - size: 2.4 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph050.jpg - size: 2.2 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph051.jpg - size: 2.3 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph052.jpg - size: 2.3 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph053.jpg - size: 2.2 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph054.jpg - size: 2.3 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph055.jpg - size: 2.2 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph056.jpg - size: 2.2 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph057.jpg - size: 2.1 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph058.jpg - size: 2.3 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph059.jpg - size: 2.4 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph060.jpg - size: 2.2 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph061.jpg - size: 2.4 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph062.jpg - size: 2.3 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph063.jpg - size: 2.6 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph064.jpg - size: 2.9 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph065.jpg - size: 2.7 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph066.jpg - size: 2.7 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph067.jpg - size: 2.4 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph068.jpg - size: 2.2 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph069.jpg - size: 2 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph070.jpg - size: 1.9 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph071.jpg - size: 2.1 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph072.jpg - size: 2 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph073.jpg - size: 1.8 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph074.jpg - size: 1.9 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph075.jpg - size: 1.7 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph076.jpg - size: 2.4 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph077.jpg - size: 2.4 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph078.jpg - size: 2 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph079.jpg - size: 2.1 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph080.jpg - size: 2.2 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph081.jpg - size: 2.4 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph082.jpg - size: 2.3 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph083.jpg - size: 2.6 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph084.jpg - size: 2.5 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph085.jpg - size: 2.4 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph086.jpg - size: 2.4 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph087.jpg - size: 2.4 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph088.jpg - size: 2.5 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph089.jpg - size: 2.2 MiB - - AmourAngels2016-02-18 Liza - Cute Nymph090.jpg - size: 2 MiB - - Domai2009-02-26 Liza - Set 1000.jpg - size: 81.9 KiB - - Domai2009-02-26 Liza - Set 1001.jpg - size: 169.1 KiB - - Domai2009-02-26 Liza - Set 1002.jpg - size: 161.4 KiB - - Domai2009-02-26 Liza - Set 1003.jpg - size: 163.5 KiB - - Domai2009-02-26 Liza - Set 1004.jpg - size: 174.7 KiB - - Domai2009-02-26 Liza - Set 1005.jpg - size: 304.5 KiB - - Domai2009-02-26 Liza - Set 1006.jpg - size: 178.7 KiB - - Domai2009-02-26 Liza - Set 1007.jpg - size: 143 KiB - - Domai2009-02-26 Liza - Set 1008.jpg - size: 169.9 KiB - - Domai2009-02-26 Liza - Set 1009.jpg - size: 163.7 KiB - - Domai2009-02-26 Liza - Set 1010.jpg - size: 297.9 KiB - - Domai2009-02-26 Liza - Set 1011.jpg - size: 181.5 KiB - - Domai2009-02-26 Liza - Set 1012.jpg - size: 161.3 KiB - - Domai2009-02-26 Liza - Set 1013.jpg - size: 140.7 KiB - - Domai2009-02-26 Liza - Set 1014.jpg - size: 351.4 KiB - - Domai2009-02-26 Liza - Set 1015.jpg - size: 314.6 KiB - - Domai2009-02-26 Liza - Set 1016.jpg - size: 175.2 KiB - - Domai2009-02-26 Liza - Set 1017.jpg - size: 308.5 KiB - - Domai2009-02-26 Liza - Set 1018.jpg - size: 176.3 KiB - - Domai2009-02-26 Liza - Set 1019.jpg - size: 158.9 KiB - - Domai2009-02-26 Liza - Set 1020.jpg - size: 148.6 KiB - - Domai2009-02-26 Liza - Set 1021.jpg - size: 287.6 KiB - - Domai2009-02-26 Liza - Set 1022.jpg - size: 155.3 KiB - - Domai2009-02-26 Liza - Set 1023.jpg - size: 161.5 KiB - - Domai2009-02-26 Liza - Set 1024.jpg - size: 154.3 KiB - - Domai2009-02-26 Liza - Set 1025.jpg - size: 290.7 KiB - - Domai2009-02-26 Liza - Set 1026.jpg - size: 171.8 KiB - - Domai2009-02-26 Liza - Set 1027.jpg - size: 287.1 KiB - - Domai2009-02-26 Liza - Set 1028.jpg - size: 169.8 KiB - - Domai2009-02-26 Liza - Set 1029.jpg - size: 166 KiB - - Domai2009-02-26 Liza - Set 1030.jpg - size: 163 KiB - - Domai2009-02-26 Liza - Set 1031.jpg - size: 142.5 KiB - - Domai2009-02-26 Liza - Set 1032.jpg - size: 161.2 KiB - - Domai2009-02-26 Liza - Set 1033.jpg - size: 159.8 KiB - - Domai2009-02-26 Liza - Set 1034.jpg - size: 167.7 KiB - - Domai2009-02-26 Liza - Set 1035.jpg - size: 174.2 KiB - - Domai2009-02-26 Liza - Set 1036.jpg - size: 150.5 KiB - - Domai2009-02-26 Liza - Set 1037.jpg - size: 136.7 KiB - - Domai2009-02-26 Liza - Set 1038.jpg - size: 147.4 KiB - - Domai2009-02-26 Liza - Set 1039.jpg - size: 164.3 KiB - - Domai2009-02-26 Liza - Set 1040.jpg - size: 160.9 KiB - - Domai2009-02-26 Liza - Set 1041.jpg - size: 285.5 KiB - - Domai2009-02-26 Liza - Set 1042.jpg - size: 160.6 KiB - - Domai2009-02-26 Liza - Set 1043.jpg - size: 149.5 KiB - - Domai2009-02-26 Liza - Set 1044.jpg - size: 285.9 KiB - - Domai2009-02-26 Liza - Set 1045.jpg - size: 168.8 KiB - - Domai2009-02-26 Liza - Set 1046.jpg - size: 162.5 KiB - - Domai2009-02-26 Liza - Set 1047.jpg - size: 141.6 KiB - - Domai2009-02-26 Liza - Set 1048.jpg - size: 157.9 KiB - - Domai2009-02-26 Liza - Set 1049.jpg - size: 160.1 KiB - - Domai2009-02-26 Liza - Set 1050.jpg - size: 166.1 KiB - - Domai2009-02-26 Liza - Set 1051.jpg - size: 160.7 KiB - - Domai2009-10-28 Liza - Set 2000.jpg - size: 97.5 KiB - - Domai2009-10-28 Liza - Set 2001.jpg - size: 269.8 KiB - - Domai2009-10-28 Liza - Set 2002.jpg - size: 227.4 KiB - - Domai2009-10-28 Liza - Set 2003.jpg - size: 230.3 KiB - - Domai2009-10-28 Liza - Set 2004.jpg - size: 275.7 KiB - - Domai2009-10-28 Liza - Set 2005.jpg - size: 335.8 KiB - - Domai2009-10-28 Liza - Set 2006.jpg - size: 204.5 KiB - - Domai2009-10-28 Liza - Set 2007.jpg - size: 205 KiB - - Domai2009-10-28 Liza - Set 2008.jpg - size: 198.4 KiB - - Domai2009-10-28 Liza - Set 2009.jpg - size: 179.9 KiB - - Domai2009-10-28 Liza - Set 2010.jpg - size: 210.8 KiB - - Domai2009-10-28 Liza - Set 2011.jpg - size: 211.5 KiB - - Domai2009-10-28 Liza - Set 2012.jpg - size: 274.4 KiB - - Domai2009-10-28 Liza - Set 2013.jpg - size: 451.7 KiB - - Domai2009-10-28 Liza - Set 2014.jpg - size: 267.8 KiB - - Domai2009-10-28 Liza - Set 2015.jpg - size: 241.5 KiB - - Domai2009-10-28 Liza - Set 2016.jpg - size: 222 KiB - - Domai2009-10-28 Liza - Set 2017.jpg - size: 327.9 KiB - - Domai2009-10-28 Liza - Set 2018.jpg - size: 241.7 KiB - - Domai2009-10-28 Liza - Set 2019.jpg - size: 195.5 KiB - - Domai2009-10-28 Liza - Set 2020.jpg - size: 267.6 KiB - - Domai2009-10-28 Liza - Set 2021.jpg - size: 239.8 KiB - - Domai2009-10-28 Liza - Set 2022.jpg - size: 283.5 KiB - - Domai2009-10-28 Liza - Set 2023.jpg - size: 289.3 KiB - - Domai2009-10-28 Liza - Set 2024.jpg - size: 272.5 KiB - - Domai2009-10-28 Liza - Set 2025.jpg - size: 556.5 KiB - - Domai2009-10-28 Liza - Set 2026.jpg - size: 263.1 KiB - - Domai2009-10-28 Liza - Set 2027.jpg - size: 255.8 KiB - - Domai2009-10-28 Liza - Set 2028.jpg - size: 421.6 KiB - - Domai2009-10-28 Liza - Set 2029.jpg - size: 279.4 KiB - - Domai2009-10-28 Liza - Set 2030.jpg - size: 460.6 KiB - - Domai2009-10-28 Liza - Set 2031.jpg - size: 191.9 KiB - - Domai2009-10-28 Liza - Set 2032.jpg - size: 252.1 KiB - - Domai2009-10-28 Liza - Set 2033.jpg - size: 235.8 KiB - - Domai2009-10-28 Liza - Set 2034.jpg - size: 216.5 KiB - - Domai2009-10-28 Liza - Set 2035.jpg - size: 255.3 KiB - - Domai2009-10-28 Liza - Set 2036.jpg - size: 228.7 KiB - - Domai2009-10-28 Liza - Set 2037.jpg - size: 249.8 KiB - - Domai2009-10-28 Liza - Set 2038.jpg - size: 224.8 KiB - - Domai2009-10-28 Liza - Set 2039.jpg - size: 188.7 KiB - - Domai2009-10-28 Liza - Set 2040.jpg - size: 187.9 KiB - - Domai2009-10-28 Liza - Set 2041.jpg - size: 186.3 KiB - - Domai2009-10-28 Liza - Set 2042.jpg - size: 192.1 KiB - - Domai2009-10-28 Liza - Set 2043.jpg - size: 179.6 KiB - - Domai2009-10-28 Liza - Set 2044.jpg - size: 200 KiB - - Domai2010-12-07 Liza - Set 3000.jpg - size: 75.2 KiB - - Domai2010-12-07 Liza - Set 3001.jpg - size: 191.4 KiB - - Domai2010-12-07 Liza - Set 3002.jpg - size: 177.1 KiB - - Domai2010-12-07 Liza - Set 3003.jpg - size: 373.7 KiB - - Domai2010-12-07 Liza - Set 3004.jpg - size: 190.8 KiB - - Domai2010-12-07 Liza - Set 3005.jpg - size: 383.4 KiB - - Domai2010-12-07 Liza - Set 3006.jpg - size: 171 KiB - - Domai2010-12-07 Liza - Set 3007.jpg - size: 355.6 KiB - - Domai2010-12-07 Liza - Set 3008.jpg - size: 184.9 KiB - - Domai2010-12-07 Liza - Set 3009.jpg - size: 171.3 KiB - - Domai2010-12-07 Liza - Set 3010.jpg - size: 386.3 KiB - - Domai2010-12-07 Liza - Set 3011.jpg - size: 357.7 KiB - - Domai2010-12-07 Liza - Set 3012.jpg - size: 176.1 KiB - - Domai2010-12-07 Liza - Set 3013.jpg - size: 185.1 KiB - - Domai2010-12-07 Liza - Set 3014.jpg - size: 182.1 KiB - - Domai2010-12-07 Liza - Set 3015.jpg - size: 161.8 KiB - - Domai2010-12-07 Liza - Set 3016.jpg - size: 291.4 KiB - - Domai2010-12-07 Liza - Set 3017.jpg - size: 343.2 KiB - - Domai2010-12-07 Liza - Set 3018.jpg - size: 321.7 KiB - - Domai2010-12-07 Liza - Set 3019.jpg - size: 146.2 KiB - - Domai2010-12-07 Liza - Set 3020.jpg - size: 108.6 KiB - - Domai2010-12-07 Liza - Set 3021.jpg - size: 102.9 KiB - - Domai2010-12-07 Liza - Set 3022.jpg - size: 154.2 KiB - - Domai2010-12-07 Liza - Set 3023.jpg - size: 162.6 KiB - - Domai2010-12-07 Liza - Set 3024.jpg - size: 307.1 KiB - - Domai2010-12-07 Liza - Set 3025.jpg - size: 409.8 KiB - - Domai2010-12-07 Liza - Set 3026.jpg - size: 465.6 KiB - - Domai2010-12-07 Liza - Set 3027.jpg - size: 325.1 KiB - - Domai2010-12-07 Liza - Set 3028.jpg - size: 358.1 KiB - - Domai2010-12-07 Liza - Set 3029.jpg - size: 345.9 KiB - - Domai2010-12-07 Liza - Set 3030.jpg - size: 280.2 KiB - - Domai2010-12-07 Liza - Set 3031.jpg - size: 146.9 KiB - - Domai2010-12-07 Liza - Set 3032.jpg - size: 154.8 KiB - - Domai2010-12-07 Liza - Set 3033.jpg - size: 134.9 KiB - - Domai2010-12-07 Liza - Set 3034.jpg - size: 135.3 KiB - - Domai2010-12-07 Liza - Set 3035.jpg - size: 127 KiB - - Domai2010-12-07 Liza - Set 3036.jpg - size: 137.2 KiB - - Domai2010-12-07 Liza - Set 3037.jpg - size: 135.7 KiB - - Domai2010-12-07 Liza - Set 3038.jpg - size: 129.5 KiB - - Domai2010-12-07 Liza - Set 3039.jpg - size: 132.4 KiB - - Domai2010-12-07 Liza - Set 3040.jpg - size: 112.6 KiB - - Domai2010-12-07 Liza - Set 3041.jpg - size: 155.7 KiB - - Domai2010-12-07 Liza - Set 3042.jpg - size: 178 KiB - - Domai2010-12-07 Liza - Set 3043.jpg - size: 164.3 KiB - - Domai2010-12-07 Liza - Set 3044.jpg - size: 168 KiB - - Domai2010-12-07 Liza - Set 3045.jpg - size: 159 KiB - - Domai2010-12-07 Liza - Set 3046.jpg - size: 162.7 KiB - - Domai2010-12-07 Liza - Set 3047.jpg - size: 155.3 KiB - - Domai2010-12-07 Liza - Set 3048.jpg - size: 313.8 KiB - - Domai2010-12-07 Liza - Set 3049.jpg - size: 143.2 KiB - - Domai2010-12-07 Liza - Set 3050.jpg - size: 174.3 KiB - - Domai2010-12-07 Liza - Set 3051.jpg - size: 154.6 KiB - - Domai2010-12-07 Liza - Set 3052.jpg - size: 159.3 KiB - - Domai2010-12-07 Liza - Set 3053.jpg - size: 151.6 KiB - - Domai2010-12-07 Liza - Set 3054.jpg - size: 140.9 KiB - - Domai2010-12-07 Liza - Set 3055.jpg - size: 162.6 KiB - - Domai2010-12-07 Liza - Set 3056.jpg - size: 318.6 KiB - - Domai2011-11-16 Liza - Set 4000.jpg - size: 118 KiB - - Domai2011-11-16 Liza - Set 4001.jpg - size: 307.7 KiB - - Domai2011-11-16 Liza - Set 4002.jpg - size: 316 KiB - - Domai2011-11-16 Liza - Set 4003.jpg - size: 514.4 KiB - - Domai2011-11-16 Liza - Set 4004.jpg - size: 454.5 KiB - - Domai2011-11-16 Liza - Set 4005.jpg - size: 498.3 KiB - - Domai2011-11-16 Liza - Set 4006.jpg - size: 352.2 KiB - - Domai2011-11-16 Liza - Set 4007.jpg - size: 449.3 KiB - - Domai2011-11-16 Liza - Set 4008.jpg - size: 551.1 KiB - - Domai2011-11-16 Liza - Set 4009.jpg - size: 561.3 KiB - - Domai2011-11-16 Liza - Set 4010.jpg - size: 283 KiB - - Domai2011-11-16 Liza - Set 4011.jpg - size: 322.5 KiB - - Domai2011-11-16 Liza - Set 4012.jpg - size: 668.6 KiB - - Domai2011-11-16 Liza - Set 4013.jpg - size: 568.7 KiB - - Domai2011-11-16 Liza - Set 4014.jpg - size: 281.8 KiB - - Domai2011-11-16 Liza - Set 4015.jpg - size: 297.7 KiB - - Domai2011-11-16 Liza - Set 4016.jpg - size: 271 KiB - - Domai2011-11-16 Liza - Set 4017.jpg - size: 225.9 KiB - - Domai2011-11-16 Liza - Set 4018.jpg - size: 284.6 KiB - - Domai2011-11-16 Liza - Set 4019.jpg - size: 290.8 KiB - - Domai2011-11-16 Liza - Set 4020.jpg - size: 250 KiB - - Domai2011-11-16 Liza - Set 4021.jpg - size: 310.6 KiB - - Domai2011-11-16 Liza - Set 4022.jpg - size: 301.6 KiB - - Domai2011-11-16 Liza - Set 4023.jpg - size: 359 KiB - - Domai2011-11-16 Liza - Set 4024.jpg - size: 244.9 KiB - - Domai2011-11-16 Liza - Set 4025.jpg - size: 307.2 KiB - - Domai2011-11-16 Liza - Set 4026.jpg - size: 256.8 KiB - - Domai2011-11-16 Liza - Set 4027.jpg - size: 264.9 KiB - - Domai2011-11-16 Liza - Set 4028.jpg - size: 270.7 KiB - - Domai2011-11-16 Liza - Set 4029.jpg - size: 272 KiB - - Domai2011-11-16 Liza - Set 4030.jpg - size: 266.3 KiB - - Domai2011-11-16 Liza - Set 4031.jpg - size: 264.3 KiB - - Domai2011-11-16 Liza - Set 4032.jpg - size: 245.9 KiB - - Domai2011-11-16 Liza - Set 4033.jpg - size: 223.2 KiB - - Domai2011-11-16 Liza - Set 4034.jpg - size: 191.7 KiB - - Domai2011-11-16 Liza - Set 4035.jpg - size: 215.7 KiB - - Domai2011-11-16 Liza - Set 4036.jpg - size: 212.3 KiB - - Domai2011-11-16 Liza - Set 4037.jpg - size: 198.4 KiB - - Domai2011-11-16 Liza - Set 4038.jpg - size: 213.4 KiB - - Domai2011-11-16 Liza - Set 4039.jpg - size: 214.8 KiB - - Domai2011-11-16 Liza - Set 4040.jpg - size: 217.8 KiB - - Domai2011-11-16 Liza - Set 4041.jpg - size: 198.4 KiB - - Domai2011-11-16 Liza - Set 4042.jpg - size: 139.2 KiB - - Domai2011-11-16 Liza - Set 4043.jpg - size: 154.6 KiB - - Domai2011-11-16 Liza - Set 4044.jpg - size: 150.6 KiB - - Domai2011-11-16 Liza - Set 4045.jpg - size: 180.5 KiB - - Domai2011-11-16 Liza - Set 4046.jpg - size: 276.2 KiB - - Domai2011-11-16 Liza - Set 4047.jpg - size: 211.5 KiB - - Domai2011-11-16 Liza - Set 4048.jpg - size: 234.4 KiB - - Domai2011-11-16 Liza - Set 4049.jpg - size: 241.7 KiB - - Domai2011-11-16 Liza - Set 4050.jpg - size: 242.5 KiB - - Domai2011-11-16 Liza - Set 4051.jpg - size: 221.8 KiB - - Domai2011-11-16 Liza - Set 4052.jpg - size: 208.1 KiB - - Domai2011-11-16 Liza - Set 4053.jpg - size: 199.7 KiB - - Domai2011-11-16 Liza - Set 4054.jpg - size: 195.2 KiB - - Domai2011-11-16 Liza - Set 4055.jpg - size: 235.3 KiB - - Domai2011-11-16 Liza - Set 4056.jpg - size: 286 KiB - - Domai2011-11-16 Liza - Set 4057.jpg - size: 392 KiB - - Domai2011-11-16 Liza - Set 4058.jpg - size: 466 KiB - - Domai2011-11-16 Liza - Set 4059.jpg - size: 439.1 KiB - - Domai2011-11-16 Liza - Set 4060.jpg - size: 275.4 KiB - - Domai2011-11-16 Liza - Set 4061.jpg - size: 288.8 KiB - - Domai2011-11-16 Liza - Set 4062.jpg - size: 330.8 KiB - - Domai2011-11-16 Liza - Set 4063.jpg - size: 137.7 KiB - - Domai2011-11-16 Liza - Set 4064.jpg - size: 142.6 KiB - - Domai2011-11-16 Liza - Set 4065.jpg - size: 132.7 KiB - - Domai2011-11-16 Liza - Set 4066.jpg - size: 143.9 KiB - - Domai2011-11-16 Liza - Set 4067.jpg - size: 132.1 KiB - - Domai2011-11-16 Liza - Set 4068.jpg - size: 149.1 KiB - - Domai2011-11-16 Liza - Set 4069.jpg - size: 182.9 KiB - - Domai2011-11-16 Liza - Set 4070.jpg - size: 154.6 KiB - - Domai2011-11-16 Liza - Set 4071.jpg - size: 196.8 KiB - - Domai2011-11-16 Liza - Set 4072.jpg - size: 188.3 KiB - - Domai2011-11-16 Liza - Set 4073.jpg - size: 214.8 KiB - - Domai2011-11-16 Liza - Set 4074.jpg - size: 202.3 KiB - - Domai2011-11-16 Liza - Set 4075.jpg - size: 184.4 KiB - - Domai2011-11-16 Liza - Set 4076.jpg - size: 195.8 KiB - - Domai2011-11-16 Liza - Set 4077.jpg - size: 183 KiB - - Domai2011-11-16 Liza - Set 4078.jpg - size: 201.1 KiB - - Domai2011-11-16 Liza - Set 4079.jpg - size: 135.5 KiB - - Domai2011-11-16 Liza - Set 4080.jpg - size: 133.9 KiB - - Domai2011-11-16 Liza - Set 4081.jpg - size: 115.6 KiB - - Domai2011-11-16 Liza - Set 4082.jpg - size: 135.4 KiB - - Domai2011-11-16 Liza - Set 4083.jpg - size: 334.3 KiB - - Domai2011-11-16 Liza - Set 4084.jpg - size: 264 KiB - - Domai2011-11-16 Liza - Set 4085.jpg - size: 242.3 KiB - - Domai2011-11-16 Liza - Set 4086.jpg - size: 215.3 KiB - - Domai2011-11-16 Liza - Set 4087.jpg - size: 282.3 KiB - - Domai2011-11-16 Liza - Set 4088.jpg - size: 252 KiB - - Domai2011-11-16 Liza - Set 4089.jpg - size: 248.9 KiB - - Domai2011-11-16 Liza - Set 4090.jpg - size: 187.1 KiB - - Domai2011-11-16 Liza - Set 4091.jpg - size: 273 KiB - - Domai2011-11-16 Liza - Set 4092.jpg - size: 226.6 KiB - - Domai2011-11-16 Liza - Set 4093.jpg - size: 215.7 KiB - - Domai2011-11-16 Liza - Set 4094.jpg - size: 217.7 KiB - - Domai2011-11-16 Liza - Set 4095.jpg - size: 208 KiB - - Domai2011-11-16 Liza - Set 4096.jpg - size: 530.5 KiB - - Domai2011-11-16 Liza - Set 4097.jpg - size: 150.7 KiB - - Domai2011-11-16 Liza - Set 4098.jpg - size: 224.3 KiB - - Domai2011-11-16 Liza - Set 4099.jpg - size: 195.7 KiB - - Domai2011-11-16 Liza - Set 4100.jpg - size: 301.9 KiB - - Domai2011-11-16 Liza - Set 4101.jpg - size: 595.2 KiB - - Domai2011-11-16 Liza - Set 4102.jpg - size: 641.4 KiB - - Domai2012-05-07 Liza - Set 5000.jpg - size: 79.8 KiB - - Domai2012-05-07 Liza - Set 5001.jpg - size: 251.3 KiB - - Domai2012-05-07 Liza - Set 5002.jpg - size: 240.7 KiB - - Domai2012-05-07 Liza - Set 5003.jpg - size: 277.6 KiB - - Domai2012-05-07 Liza - Set 5004.jpg - size: 259.4 KiB - - Domai2012-05-07 Liza - Set 5005.jpg - size: 259.2 KiB - - Domai2012-05-07 Liza - Set 5006.jpg - size: 276.5 KiB - - Domai2012-05-07 Liza - Set 5007.jpg - size: 223 KiB - - Domai2012-05-07 Liza - Set 5008.jpg - size: 584.2 KiB - - Domai2012-05-07 Liza - Set 5009.jpg - size: 295 KiB - - Domai2012-05-07 Liza - Set 5010.jpg - size: 262.5 KiB - - Domai2012-05-07 Liza - Set 5011.jpg - size: 262.7 KiB - - Domai2012-05-07 Liza - Set 5012.jpg - size: 267.1 KiB - - Domai2012-05-07 Liza - Set 5013.jpg - size: 489.6 KiB - - Domai2012-05-07 Liza - Set 5014.jpg - size: 547.7 KiB - - Domai2012-05-07 Liza - Set 5015.jpg - size: 591.4 KiB - - Domai2012-05-07 Liza - Set 5016.jpg - size: 596.7 KiB - - Domai2012-05-07 Liza - Set 5017.jpg - size: 508.4 KiB - - Domai2012-05-07 Liza - Set 5018.jpg - size: 270.8 KiB - - Domai2012-05-07 Liza - Set 5019.jpg - size: 308.1 KiB - - Domai2012-05-07 Liza - Set 5020.jpg - size: 284.6 KiB - - Domai2012-05-07 Liza - Set 5021.jpg - size: 316.7 KiB - - Domai2012-05-07 Liza - Set 5022.jpg - size: 257.7 KiB - - Domai2012-05-07 Liza - Set 5023.jpg - size: 352.5 KiB - - Domai2012-05-07 Liza - Set 5024.jpg - size: 233.1 KiB - - Domai2012-05-07 Liza - Set 5025.jpg - size: 261.8 KiB - - Domai2012-05-07 Liza - Set 5026.jpg - size: 509.2 KiB - - Domai2012-05-07 Liza - Set 5027.jpg - size: 480.2 KiB - - Domai2012-05-07 Liza - Set 5028.jpg - size: 307.8 KiB - - Domai2012-05-07 Liza - Set 5029.jpg - size: 254.5 KiB - - Domai2012-05-07 Liza - Set 5030.jpg - size: 222.2 KiB - - Domai2012-05-07 Liza - Set 5031.jpg - size: 636.4 KiB - - Domai2012-05-07 Liza - Set 5032.jpg - size: 448.1 KiB - - Domai2012-05-07 Liza - Set 5033.jpg - size: 512.1 KiB - - Domai2012-05-07 Liza - Set 5034.jpg - size: 276 KiB - - Domai2012-05-07 Liza - Set 5035.jpg - size: 649.2 KiB - - Domai2012-05-07 Liza - Set 5036.jpg - size: 649.3 KiB - - Domai2012-05-07 Liza - Set 5037.jpg - size: 815 KiB - - Domai2012-05-07 Liza - Set 5038.jpg - size: 666.1 KiB - - Domai2012-05-07 Liza - Set 5039.jpg - size: 261 KiB - - Domai2012-05-07 Liza - Set 5040.jpg - size: 259 KiB - - Domai2012-05-07 Liza - Set 5041.jpg - size: 485.3 KiB - - Domai2012-05-07 Liza - Set 5042.jpg - size: 501.6 KiB - - Domai2012-05-07 Liza - Set 5043.jpg - size: 288.9 KiB - - Domai2012-05-07 Liza - Set 5044.jpg - size: 299.5 KiB - - Domai2012-05-07 Liza - Set 5045.jpg - size: 267.1 KiB - - Domai2012-05-07 Liza - Set 5046.jpg - size: 538.5 KiB - - Domai2012-05-07 Liza - Set 5047.jpg - size: 256.4 KiB - - Domai2012-05-07 Liza - Set 5048.jpg - size: 241.6 KiB - - Domai2012-05-07 Liza - Set 5049.jpg - size: 267.3 KiB - - Domai2012-05-07 Liza - Set 5050.jpg - size: 264.2 KiB - - Domai2012-05-07 Liza - Set 5051.jpg - size: 241.4 KiB - - Domai2012-05-07 Liza - Set 5052.jpg - size: 257.4 KiB - - Domai2012-05-07 Liza - Set 5053.jpg - size: 230.8 KiB - - Domai2012-05-07 Liza - Set 5054.jpg - size: 238.1 KiB - - Domai2012-05-07 Liza - Set 5055.jpg - size: 476.8 KiB - - Domai2012-05-07 Liza - Set 5056.jpg - size: 220.8 KiB - - Domai2012-05-07 Liza - Set 5057.jpg - size: 231 KiB - - Domai2012-05-07 Liza - Set 5058.jpg - size: 247.1 KiB - - Domai2012-05-07 Liza - Set 5059.jpg - size: 406.9 KiB - - Domai2012-05-07 Liza - Set 5060.jpg - size: 755.2 KiB - - Domai2012-05-07 Liza - Set 5061.jpg - size: 736 KiB - - Domai2012-05-07 Liza - Set 5062.jpg - size: 746.5 KiB - - Domai2012-05-07 Liza - Set 5063.jpg - size: 727.2 KiB - - Domai2012-05-07 Liza - Set 5064.jpg - size: 728.3 KiB - - Domai2012-05-07 Liza - Set 5065.jpg - size: 593.4 KiB - - Domai2012-05-07 Liza - Set 5066.jpg - size: 1002.3 KiB - - Domai2012-05-07 Liza - Set 5067.jpg - size: 608.1 KiB - - Domai2012-05-07 Liza - Set 5068.jpg - size: 355.1 KiB - - Domai2012-05-07 Liza - Set 5069.jpg - size: 823.5 KiB - - Domai2012-05-07 Liza - Set 5070.jpg - size: 492 KiB - - Domai2012-05-07 Liza - Set 5071.jpg - size: 537.9 KiB - - Domai2012-05-07 Liza - Set 5072.jpg - size: 419.8 KiB - - Domai2012-05-07 Liza - Set 5073.jpg - size: 626 KiB - - Domai2012-05-07 Liza - Set 5074.jpg - size: 308.4 KiB - - Domai2012-05-07 Liza - Set 5075.jpg - size: 265.3 KiB - - Domai2012-05-07 Liza - Set 5076.jpg - size: 382.5 KiB - - Domai2012-05-07 Liza - Set 5077.jpg - size: 406.4 KiB - - Domai2012-05-07 Liza - Set 5078.jpg - size: 396.9 KiB - - Domai2012-05-07 Liza - Set 5079.jpg - size: 404.7 KiB - - Domai2012-05-07 Liza - Set 5080.jpg - size: 381.5 KiB - - Domai2012-05-07 Liza - Set 5081.jpg - size: 591.4 KiB - - Domai2013-01-28 Liza - Set 6000.jpg - size: 91.4 KiB - - Domai2013-01-28 Liza - Set 6001.jpg - size: 613.9 KiB - - Domai2013-01-28 Liza - Set 6002.jpg - size: 546.2 KiB - - Domai2013-01-28 Liza - Set 6003.jpg - size: 243.3 KiB - - Domai2013-01-28 Liza - Set 6004.jpg - size: 239.2 KiB - - Domai2013-01-28 Liza - Set 6005.jpg - size: 214.6 KiB - - Domai2013-01-28 Liza - Set 6006.jpg - size: 240.7 KiB - - Domai2013-01-28 Liza - Set 6007.jpg - size: 481.4 KiB - - Domai2013-01-28 Liza - Set 6008.jpg - size: 230.4 KiB - - Domai2013-01-28 Liza - Set 6009.jpg - size: 214.6 KiB - - Domai2013-01-28 Liza - Set 6010.jpg - size: 485.6 KiB - - Domai2013-01-28 Liza - Set 6011.jpg - size: 475.4 KiB - - Domai2013-01-28 Liza - Set 6012.jpg - size: 273.8 KiB - - Domai2013-01-28 Liza - Set 6013.jpg - size: 237.7 KiB - - Domai2013-01-28 Liza - Set 6014.jpg - size: 243.4 KiB - - Domai2013-01-28 Liza - Set 6015.jpg - size: 448.4 KiB - - Domai2013-01-28 Liza - Set 6016.jpg - size: 233.8 KiB - - Domai2013-01-28 Liza - Set 6017.jpg - size: 242.3 KiB - - Domai2013-01-28 Liza - Set 6018.jpg - size: 255.4 KiB - - Domai2013-01-28 Liza - Set 6019.jpg - size: 264.4 KiB - - Domai2013-01-28 Liza - Set 6020.jpg - size: 545.1 KiB - - Domai2013-01-28 Liza - Set 6021.jpg - size: 554.4 KiB - - Domai2013-01-28 Liza - Set 6022.jpg - size: 496.7 KiB - - Domai2013-01-28 Liza - Set 6023.jpg - size: 542.1 KiB - - Domai2013-01-28 Liza - Set 6024.jpg - size: 239.3 KiB - - Domai2013-01-28 Liza - Set 6025.jpg - size: 247.9 KiB - - Domai2013-01-28 Liza - Set 6026.jpg - size: 229.8 KiB - - Domai2013-01-28 Liza - Set 6027.jpg - size: 294.8 KiB - - Domai2013-01-28 Liza - Set 6028.jpg - size: 260 KiB - - Domai2013-01-28 Liza - Set 6029.jpg - size: 262.9 KiB - - Domai2013-01-28 Liza - Set 6030.jpg - size: 285.9 KiB - - Domai2013-01-28 Liza - Set 6031.jpg - size: 229.1 KiB - - Domai2013-01-28 Liza - Set 6032.jpg - size: 488.2 KiB - - Domai2013-01-28 Liza - Set 6033.jpg - size: 525.6 KiB - - Domai2013-01-28 Liza - Set 6034.jpg - size: 554.8 KiB - - Domai2013-01-28 Liza - Set 6035.jpg - size: 507.6 KiB - - Domai2013-01-28 Liza - Set 6036.jpg - size: 213.8 KiB - - Domai2013-01-28 Liza - Set 6037.jpg - size: 536.1 KiB - - Domai2013-01-28 Liza - Set 6038.jpg - size: 258.2 KiB - - Domai2013-01-28 Liza - Set 6039.jpg - size: 228 KiB - - Domai2013-01-28 Liza - Set 6040.jpg - size: 503.4 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation000.jpg - size: 144.8 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation001.jpg - size: 580.4 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation002.jpg - size: 565.8 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation003.jpg - size: 565.9 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation004.jpg - size: 657.8 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation005.jpg - size: 504.1 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation006.jpg - size: 514.3 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation007.jpg - size: 570.4 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation008.jpg - size: 714.2 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation009.jpg - size: 522.2 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation010.jpg - size: 541.5 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation011.jpg - size: 560.1 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation012.jpg - size: 449.5 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation013.jpg - size: 588.5 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation014.jpg - size: 472.4 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation015.jpg - size: 528.4 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation016.jpg - size: 561.3 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation017.jpg - size: 586.2 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation018.jpg - size: 496.9 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation019.jpg - size: 523.6 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation020.jpg - size: 613.5 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation021.jpg - size: 400.2 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation022.jpg - size: 427.9 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation023.jpg - size: 365.8 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation024.jpg - size: 400.6 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation025.jpg - size: 618.6 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation026.jpg - size: 586.7 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation027.jpg - size: 617.5 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation028.jpg - size: 583.1 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation029.jpg - size: 583.6 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation030.jpg - size: 611.3 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation031.jpg - size: 547.2 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation032.jpg - size: 578.9 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation033.jpg - size: 691.1 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation034.jpg - size: 618.4 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation035.jpg - size: 663.6 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation036.jpg - size: 621 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation037.jpg - size: 552.3 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation038.jpg - size: 670.5 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation039.jpg - size: 594.3 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation040.jpg - size: 551.5 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation041.jpg - size: 558.3 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation042.jpg - size: 626.3 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation043.jpg - size: 587 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation044.jpg - size: 549.5 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation045.jpg - size: 450.4 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation046.jpg - size: 570.4 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation047.jpg - size: 526.4 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation048.jpg - size: 504.5 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation049.jpg - size: 480.7 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation050.jpg - size: 431.1 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation051.jpg - size: 528.5 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation052.jpg - size: 502.6 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation053.jpg - size: 676.9 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation054.jpg - size: 623.5 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation055.jpg - size: 475.1 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation056.jpg - size: 449.4 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation057.jpg - size: 452.9 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation058.jpg - size: 496.4 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation059.jpg - size: 604.9 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation060.jpg - size: 560.5 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation061.jpg - size: 682.2 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation062.jpg - size: 535.2 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation063.jpg - size: 623 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation064.jpg - size: 462.4 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation065.jpg - size: 505.7 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation066.jpg - size: 451.4 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation067.jpg - size: 549 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation068.jpg - size: 472.8 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation069.jpg - size: 471 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation070.jpg - size: 421.7 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation071.jpg - size: 811.9 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation072.jpg - size: 869 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation073.jpg - size: 901.5 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation074.jpg - size: 708 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation075.jpg - size: 613.9 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation076.jpg - size: 549.2 KiB - - FemJoy2009-03-26 Ivana - Morning Relaxation077.jpg - size: 563.9 KiB - - GoddessNudes2010-03-24 Liza - Set 1000.jpg - size: 92.1 KiB - - GoddessNudes2010-03-24 Liza - Set 1001.jpg - size: 818 KiB - - GoddessNudes2010-03-24 Liza - Set 1002.jpg - size: 784.8 KiB - - GoddessNudes2010-03-24 Liza - Set 1003.jpg - size: 799.2 KiB - - GoddessNudes2010-03-24 Liza - Set 1004.jpg - size: 999.9 KiB - - GoddessNudes2010-03-24 Liza - Set 1005.jpg - size: 915 KiB - - GoddessNudes2010-03-24 Liza - Set 1006.jpg - size: 1 MiB - - GoddessNudes2010-03-24 Liza - Set 1007.jpg - size: 803.6 KiB - - GoddessNudes2010-03-24 Liza - Set 1008.jpg - size: 810.6 KiB - - GoddessNudes2010-03-24 Liza - Set 1009.jpg - size: 855.1 KiB - - GoddessNudes2010-03-24 Liza - Set 1010.jpg - size: 785.1 KiB - - GoddessNudes2010-03-24 Liza - Set 1011.jpg - size: 952.8 KiB - - GoddessNudes2010-03-24 Liza - Set 1012.jpg - size: 844.2 KiB - - GoddessNudes2010-03-24 Liza - Set 1013.jpg - size: 860.2 KiB - - GoddessNudes2010-03-24 Liza - Set 1014.jpg - size: 878.8 KiB - - GoddessNudes2010-03-24 Liza - Set 1015.jpg - size: 840.8 KiB - - GoddessNudes2010-03-24 Liza - Set 1016.jpg - size: 721.3 KiB - - GoddessNudes2010-03-24 Liza - Set 1017.jpg - size: 778.5 KiB - - GoddessNudes2010-03-24 Liza - Set 1018.jpg - size: 712.7 KiB - - GoddessNudes2010-03-24 Liza - Set 1019.jpg - size: 839 KiB - - GoddessNudes2010-03-24 Liza - Set 1020.jpg - size: 715.5 KiB - - GoddessNudes2010-03-24 Liza - Set 1021.jpg - size: 811.9 KiB - - GoddessNudes2010-03-24 Liza - Set 1022.jpg - size: 824.7 KiB - - GoddessNudes2010-03-24 Liza - Set 1023.jpg - size: 950.5 KiB - - GoddessNudes2010-03-24 Liza - Set 1024.jpg - size: 850.9 KiB - - GoddessNudes2010-03-24 Liza - Set 1025.jpg - size: 854.3 KiB - - GoddessNudes2010-03-24 Liza - Set 1026.jpg - size: 731.7 KiB - - GoddessNudes2010-03-24 Liza - Set 1027.jpg - size: 704.2 KiB - - GoddessNudes2010-03-24 Liza - Set 1028.jpg - size: 728.8 KiB - - GoddessNudes2010-03-24 Liza - Set 1029.jpg - size: 799.7 KiB - - GoddessNudes2010-03-24 Liza - Set 1030.jpg - size: 846.9 KiB - - GoddessNudes2010-03-24 Liza - Set 1031.jpg - size: 831.6 KiB - - GoddessNudes2010-03-24 Liza - Set 1032.jpg - size: 733.1 KiB - - GoddessNudes2010-03-24 Liza - Set 1033.jpg - size: 703 KiB - - GoddessNudes2010-03-24 Liza - Set 1034.jpg - size: 669.4 KiB - - GoddessNudes2010-03-24 Liza - Set 1035.jpg - size: 633 KiB - - GoddessNudes2012-12-10 Liza - Set 2000.jpg - size: 329.9 KiB - - GoddessNudes2012-12-10 Liza - Set 2001.jpg - size: 625 KiB - - GoddessNudes2012-12-10 Liza - Set 2002.jpg - size: 551 KiB - - GoddessNudes2012-12-10 Liza - Set 2003.jpg - size: 612.4 KiB - - GoddessNudes2012-12-10 Liza - Set 2004.jpg - size: 727.1 KiB - - GoddessNudes2012-12-10 Liza - Set 2005.jpg - size: 687.5 KiB - - GoddessNudes2012-12-10 Liza - Set 2006.jpg - size: 673.6 KiB - - GoddessNudes2012-12-10 Liza - Set 2007.jpg - size: 547.7 KiB - - GoddessNudes2012-12-10 Liza - Set 2008.jpg - size: 668.2 KiB - - GoddessNudes2012-12-10 Liza - Set 2009.jpg - size: 664 KiB - - GoddessNudes2012-12-10 Liza - Set 2010.jpg - size: 637.1 KiB - - GoddessNudes2012-12-10 Liza - Set 2011.jpg - size: 692.2 KiB - - GoddessNudes2012-12-10 Liza - Set 2012.jpg - size: 750.4 KiB - - GoddessNudes2012-12-10 Liza - Set 2013.jpg - size: 725.9 KiB - - GoddessNudes2012-12-10 Liza - Set 2014.jpg - size: 555.1 KiB - - GoddessNudes2012-12-10 Liza - Set 2015.jpg - size: 626.8 KiB - - GoddessNudes2012-12-10 Liza - Set 2016.jpg - size: 810.2 KiB - - GoddessNudes2012-12-10 Liza - Set 2017.jpg - size: 774.3 KiB - - GoddessNudes2012-12-10 Liza - Set 2018.jpg - size: 776 KiB - - GoddessNudes2012-12-10 Liza - Set 2019.jpg - size: 725.8 KiB - - GoddessNudes2012-12-10 Liza - Set 2020.jpg - size: 700.5 KiB - - GoddessNudes2012-12-10 Liza - Set 2021.jpg - size: 706.7 KiB - - GoddessNudes2012-12-10 Liza - Set 2022.jpg - size: 661.9 KiB - - GoddessNudes2012-12-10 Liza - Set 2023.jpg - size: 767.4 KiB - - GoddessNudes2012-12-10 Liza - Set 2024.jpg - size: 614.4 KiB - - GoddessNudes2012-12-10 Liza - Set 2025.jpg - size: 665.1 KiB - - GoddessNudes2012-12-10 Liza - Set 2026.jpg - size: 667.2 KiB - - GoddessNudes2012-12-10 Liza - Set 2027.jpg - size: 665 KiB - - GoddessNudes2012-12-10 Liza - Set 2028.jpg - size: 611.9 KiB - - GoddessNudes2012-12-10 Liza - Set 2029.jpg - size: 635.9 KiB - - GoddessNudes2012-12-10 Liza - Set 2030.jpg - size: 571.8 KiB - - GoddessNudes2012-12-10 Liza - Set 2031.jpg - size: 574.6 KiB - - GoddessNudes2012-12-10 Liza - Set 2032.jpg - size: 722.9 KiB - - GoddessNudes2012-12-10 Liza - Set 2033.jpg - size: 718.3 KiB - - GoddessNudes2012-12-10 Liza - Set 2034.jpg - size: 709.1 KiB - - GoddessNudes2012-12-10 Liza - Set 2035.jpg - size: 632.3 KiB - - GoddessNudes2012-12-10 Liza - Set 2036.jpg - size: 592.7 KiB - - GoddessNudes2012-12-10 Liza - Set 2037.jpg - size: 606.4 KiB - - GoddessNudes2012-12-10 Liza - Set 2038.jpg - size: 615.3 KiB - - GoddessNudes2012-12-10 Liza - Set 2039.jpg - size: 602.8 KiB - - GoddessNudes2012-12-10 Liza - Set 2040.jpg - size: 699.4 KiB - - GoddessNudes2012-12-10 Liza - Set 2041.jpg - size: 751.9 KiB - - GoddessNudes2012-12-10 Liza - Set 2042.jpg - size: 712.8 KiB - - GoddessNudes2012-12-10 Liza - Set 2043.jpg - size: 703.5 KiB - - GoddessNudes2012-12-10 Liza - Set 2044.jpg - size: 604.5 KiB - - GoddessNudes2012-12-10 Liza - Set 2045.jpg - size: 660.5 KiB - - GoddessNudes2012-12-10 Liza - Set 2046.jpg - size: 735.9 KiB - - GoddessNudes2012-12-10 Liza - Set 2047.jpg - size: 720.5 KiB - - GoddessNudes2012-12-10 Liza - Set 2048.jpg - size: 600.7 KiB - - GoddessNudes2012-12-10 Liza - Set 2049.jpg - size: 604 KiB - - GoddessNudes2012-12-10 Liza - Set 2050.jpg - size: 609.9 KiB - - GoddessNudes2012-12-10 Liza - Set 2051.jpg - size: 606.6 KiB - - GoddessNudes2012-12-10 Liza - Set 2052.jpg - size: 603 KiB - - GoddessNudes2012-12-10 Liza - Set 2053.jpg - size: 622.5 KiB - - GoddessNudes2012-12-10 Liza - Set 2054.jpg - size: 669.9 KiB - - GoddessNudes2012-12-10 Liza - Set 2055.jpg - size: 584.8 KiB - - GoddessNudes2012-12-10 Liza - Set 2056.jpg - size: 676.6 KiB - - GoddessNudes2012-12-10 Liza - Set 2057.jpg - size: 661.6 KiB - - MetArt2009-01-01 Liza H - Presenting Liza000.jpg - size: 85.8 KiB - - MetArt2009-01-01 Liza H - Presenting Liza001.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza002.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza003.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza004.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza005.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza006.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza007.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza008.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza009.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza010.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza011.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza012.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza013.jpg - size: 2.2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza014.jpg - size: 2.2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza015.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza016.jpg - size: 2.2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza017.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza018.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza019.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza020.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza021.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza022.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza023.jpg - size: 2.2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza024.jpg - size: 1.8 MiB - - MetArt2009-01-01 Liza H - Presenting Liza025.jpg - size: 2.2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza026.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza027.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza028.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza029.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza030.jpg - size: 2.2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza031.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza032.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza033.jpg - size: 1.8 MiB - - MetArt2009-01-01 Liza H - Presenting Liza034.jpg - size: 2.2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza035.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza036.jpg - size: 2.2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza037.jpg - size: 2.2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza038.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza039.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza040.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza041.jpg - size: 2.2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza042.jpg - size: 2.2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza043.jpg - size: 2.3 MiB - - MetArt2009-01-01 Liza H - Presenting Liza044.jpg - size: 2.2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza045.jpg - size: 2.3 MiB - - MetArt2009-01-01 Liza H - Presenting Liza046.jpg - size: 2.2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza047.jpg - size: 2.2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza048.jpg - size: 2.3 MiB - - MetArt2009-01-01 Liza H - Presenting Liza049.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza050.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza051.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza052.jpg - size: 2.2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza053.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza054.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza055.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza056.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza057.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza058.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza059.jpg - size: 2.2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza060.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza061.jpg - size: 2.2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza062.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza063.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza064.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza065.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza066.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza067.jpg - size: 1.7 MiB - - MetArt2009-01-01 Liza H - Presenting Liza068.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza069.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza070.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza071.jpg - size: 2.2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza072.jpg - size: 2.2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza073.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza074.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza075.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza076.jpg - size: 2.3 MiB - - MetArt2009-01-01 Liza H - Presenting Liza077.jpg - size: 1.8 MiB - - MetArt2009-01-01 Liza H - Presenting Liza078.jpg - size: 1.8 MiB - - MetArt2009-01-01 Liza H - Presenting Liza079.jpg - size: 1.7 MiB - - MetArt2009-01-01 Liza H - Presenting Liza080.jpg - size: 1.7 MiB - - MetArt2009-01-01 Liza H - Presenting Liza081.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza082.jpg - size: 2.2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza083.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza084.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza085.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza086.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza087.jpg - size: 1.8 MiB - - MetArt2009-01-01 Liza H - Presenting Liza088.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza089.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza090.jpg - size: 1.8 MiB - - MetArt2009-01-01 Liza H - Presenting Liza091.jpg - size: 1.8 MiB - - MetArt2009-01-01 Liza H - Presenting Liza092.jpg - size: 1.7 MiB - - MetArt2009-01-01 Liza H - Presenting Liza093.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza094.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza095.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza096.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza097.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza098.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza099.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza100.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza101.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza102.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza103.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza104.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza105.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza106.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza107.jpg - size: 2.1 MiB - - MetArt2009-01-01 Liza H - Presenting Liza108.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza109.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza110.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza111.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza112.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza113.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza114.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza115.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza116.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza117.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza118.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza119.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza120.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza121.jpg - size: 2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza122.jpg - size: 1.8 MiB - - MetArt2009-01-01 Liza H - Presenting Liza123.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza124.jpg - size: 2.2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza125.jpg - size: 2.2 MiB - - MetArt2009-01-01 Liza H - Presenting Liza126.jpg - size: 2.3 MiB - - MetArt2009-01-01 Liza H - Presenting Liza127.jpg - size: 1.9 MiB - - MetArt2009-01-01 Liza H - Presenting Liza128.jpg - size: 2 MiB - - MetArt2010-01-02 Liza H - Stalingrad000.jpg - size: 80.4 KiB - - MetArt2010-01-02 Liza H - Stalingrad001.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad002.jpg - size: 1.6 MiB - - MetArt2010-01-02 Liza H - Stalingrad003.jpg - size: 1.2 MiB - - MetArt2010-01-02 Liza H - Stalingrad004.jpg - size: 1.4 MiB - - MetArt2010-01-02 Liza H - Stalingrad005.jpg - size: 1.4 MiB - - MetArt2010-01-02 Liza H - Stalingrad006.jpg - size: 1.3 MiB - - MetArt2010-01-02 Liza H - Stalingrad007.jpg - size: 1.3 MiB - - MetArt2010-01-02 Liza H - Stalingrad008.jpg - size: 1.3 MiB - - MetArt2010-01-02 Liza H - Stalingrad009.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad010.jpg - size: 1.4 MiB - - MetArt2010-01-02 Liza H - Stalingrad011.jpg - size: 1.4 MiB - - MetArt2010-01-02 Liza H - Stalingrad012.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad013.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad014.jpg - size: 1.4 MiB - - MetArt2010-01-02 Liza H - Stalingrad015.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad016.jpg - size: 1.4 MiB - - MetArt2010-01-02 Liza H - Stalingrad017.jpg - size: 1.4 MiB - - MetArt2010-01-02 Liza H - Stalingrad018.jpg - size: 1.4 MiB - - MetArt2010-01-02 Liza H - Stalingrad019.jpg - size: 1.3 MiB - - MetArt2010-01-02 Liza H - Stalingrad020.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad021.jpg - size: 1.3 MiB - - MetArt2010-01-02 Liza H - Stalingrad022.jpg - size: 1.4 MiB - - MetArt2010-01-02 Liza H - Stalingrad023.jpg - size: 1.7 MiB - - MetArt2010-01-02 Liza H - Stalingrad024.jpg - size: 1.4 MiB - - MetArt2010-01-02 Liza H - Stalingrad025.jpg - size: 1.4 MiB - - MetArt2010-01-02 Liza H - Stalingrad026.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad027.jpg - size: 1.9 MiB - - MetArt2010-01-02 Liza H - Stalingrad028.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad029.jpg - size: 1.7 MiB - - MetArt2010-01-02 Liza H - Stalingrad030.jpg - size: 1.6 MiB - - MetArt2010-01-02 Liza H - Stalingrad031.jpg - size: 1.6 MiB - - MetArt2010-01-02 Liza H - Stalingrad032.jpg - size: 1.6 MiB - - MetArt2010-01-02 Liza H - Stalingrad033.jpg - size: 1.6 MiB - - MetArt2010-01-02 Liza H - Stalingrad034.jpg - size: 1.6 MiB - - MetArt2010-01-02 Liza H - Stalingrad035.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad036.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad037.jpg - size: 1.6 MiB - - MetArt2010-01-02 Liza H - Stalingrad038.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad039.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad040.jpg - size: 1.4 MiB - - MetArt2010-01-02 Liza H - Stalingrad041.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad042.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad043.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad044.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad045.jpg - size: 1.6 MiB - - MetArt2010-01-02 Liza H - Stalingrad046.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad047.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad048.jpg - size: 1.7 MiB - - MetArt2010-01-02 Liza H - Stalingrad049.jpg - size: 1.6 MiB - - MetArt2010-01-02 Liza H - Stalingrad050.jpg - size: 1.7 MiB - - MetArt2010-01-02 Liza H - Stalingrad051.jpg - size: 1.6 MiB - - MetArt2010-01-02 Liza H - Stalingrad052.jpg - size: 1.4 MiB - - MetArt2010-01-02 Liza H - Stalingrad053.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad054.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad055.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad056.jpg - size: 1.8 MiB - - MetArt2010-01-02 Liza H - Stalingrad057.jpg - size: 1.9 MiB - - MetArt2010-01-02 Liza H - Stalingrad058.jpg - size: 1.9 MiB - - MetArt2010-01-02 Liza H - Stalingrad059.jpg - size: 1.8 MiB - - MetArt2010-01-02 Liza H - Stalingrad060.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad061.jpg - size: 1.6 MiB - - MetArt2010-01-02 Liza H - Stalingrad062.jpg - size: 1.7 MiB - - MetArt2010-01-02 Liza H - Stalingrad063.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad064.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad065.jpg - size: 1.8 MiB - - MetArt2010-01-02 Liza H - Stalingrad066.jpg - size: 2 MiB - - MetArt2010-01-02 Liza H - Stalingrad067.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad068.jpg - size: 1.7 MiB - - MetArt2010-01-02 Liza H - Stalingrad069.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad070.jpg - size: 1.7 MiB - - MetArt2010-01-02 Liza H - Stalingrad071.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad072.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad073.jpg - size: 1.6 MiB - - MetArt2010-01-02 Liza H - Stalingrad074.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad075.jpg - size: 1.6 MiB - - MetArt2010-01-02 Liza H - Stalingrad076.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad077.jpg - size: 1.7 MiB - - MetArt2010-01-02 Liza H - Stalingrad078.jpg - size: 1.6 MiB - - MetArt2010-01-02 Liza H - Stalingrad079.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad080.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad081.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad082.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad083.jpg - size: 1.6 MiB - - MetArt2010-01-02 Liza H - Stalingrad084.jpg - size: 1.6 MiB - - MetArt2010-01-02 Liza H - Stalingrad085.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad086.jpg - size: 1.3 MiB - - MetArt2010-01-02 Liza H - Stalingrad087.jpg - size: 1.3 MiB - - MetArt2010-01-02 Liza H - Stalingrad088.jpg - size: 1.4 MiB - - MetArt2010-01-02 Liza H - Stalingrad089.jpg - size: 1.4 MiB - - MetArt2010-01-02 Liza H - Stalingrad090.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad091.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad092.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad093.jpg - size: 1.4 MiB - - MetArt2010-01-02 Liza H - Stalingrad094.jpg - size: 1.4 MiB - - MetArt2010-01-02 Liza H - Stalingrad095.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad096.jpg - size: 1.5 MiB - - MetArt2010-01-02 Liza H - Stalingrad097.jpg - size: 1.2 MiB - - MetArt2010-01-02 Liza H - Stalingrad098.jpg - size: 1.6 MiB - - MetArt2010-01-02 Liza H - Stalingrad099.jpg - size: 1.6 MiB - - MetArt2010-01-02 Liza H - Stalingrad100.jpg - size: 1.6 MiB - - MetArt2011-10-10 Liza H - Jeans000.jpg - size: 141.1 KiB - - MetArt2011-10-10 Liza H - Jeans001.jpg - size: 1.5 MiB - - MetArt2011-10-10 Liza H - Jeans002.jpg - size: 1.6 MiB - - MetArt2011-10-10 Liza H - Jeans003.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans004.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans005.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans006.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans007.jpg - size: 1.5 MiB - - MetArt2011-10-10 Liza H - Jeans008.jpg - size: 1.5 MiB - - MetArt2011-10-10 Liza H - Jeans009.jpg - size: 1.5 MiB - - MetArt2011-10-10 Liza H - Jeans010.jpg - size: 1.6 MiB - - MetArt2011-10-10 Liza H - Jeans011.jpg - size: 1.7 MiB - - MetArt2011-10-10 Liza H - Jeans012.jpg - size: 1.5 MiB - - MetArt2011-10-10 Liza H - Jeans013.jpg - size: 1.6 MiB - - MetArt2011-10-10 Liza H - Jeans014.jpg - size: 1.5 MiB - - MetArt2011-10-10 Liza H - Jeans015.jpg - size: 1.5 MiB - - MetArt2011-10-10 Liza H - Jeans016.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans017.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans018.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans019.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans020.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans021.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans022.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans023.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans024.jpg - size: 1.6 MiB - - MetArt2011-10-10 Liza H - Jeans025.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans026.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans027.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans028.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans029.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans030.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans031.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans032.jpg - size: 1.6 MiB - - MetArt2011-10-10 Liza H - Jeans033.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans034.jpg - size: 1.5 MiB - - MetArt2011-10-10 Liza H - Jeans035.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans036.jpg - size: 1.7 MiB - - MetArt2011-10-10 Liza H - Jeans037.jpg - size: 1.8 MiB - - MetArt2011-10-10 Liza H - Jeans038.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans039.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans040.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans041.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans042.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans043.jpg - size: 1.6 MiB - - MetArt2011-10-10 Liza H - Jeans044.jpg - size: 1.8 MiB - - MetArt2011-10-10 Liza H - Jeans045.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans046.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans047.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans048.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans049.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans050.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans051.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans052.jpg - size: 1.2 MiB - - MetArt2011-10-10 Liza H - Jeans053.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans054.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans055.jpg - size: 1.2 MiB - - MetArt2011-10-10 Liza H - Jeans056.jpg - size: 1.2 MiB - - MetArt2011-10-10 Liza H - Jeans057.jpg - size: 1.2 MiB - - MetArt2011-10-10 Liza H - Jeans058.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans059.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans060.jpg - size: 1.7 MiB - - MetArt2011-10-10 Liza H - Jeans061.jpg - size: 1.6 MiB - - MetArt2011-10-10 Liza H - Jeans062.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans063.jpg - size: 1.2 MiB - - MetArt2011-10-10 Liza H - Jeans064.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans065.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans066.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans067.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans068.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans069.jpg - size: 1.2 MiB - - MetArt2011-10-10 Liza H - Jeans070.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans071.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans072.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans073.jpg - size: 1.7 MiB - - MetArt2011-10-10 Liza H - Jeans074.jpg - size: 1.6 MiB - - MetArt2011-10-10 Liza H - Jeans075.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans076.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans077.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans078.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans079.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans080.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans081.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans082.jpg - size: 1.2 MiB - - MetArt2011-10-10 Liza H - Jeans083.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans084.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans085.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans086.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans087.jpg - size: 1.6 MiB - - MetArt2011-10-10 Liza H - Jeans088.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans089.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans090.jpg - size: 1.2 MiB - - MetArt2011-10-10 Liza H - Jeans091.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans092.jpg - size: 1.8 MiB - - MetArt2011-10-10 Liza H - Jeans093.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans094.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans095.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans096.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans097.jpg - size: 1.5 MiB - - MetArt2011-10-10 Liza H - Jeans098.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans099.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans100.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans101.jpg - size: 1.2 MiB - - MetArt2011-10-10 Liza H - Jeans102.jpg - size: 1.1 MiB - - MetArt2011-10-10 Liza H - Jeans103.jpg - size: 1 MiB - - MetArt2011-10-10 Liza H - Jeans104.jpg - size: 1 MiB - - MetArt2011-10-10 Liza H - Jeans105.jpg - size: 1.1 MiB - - MetArt2011-10-10 Liza H - Jeans106.jpg - size: 1.2 MiB - - MetArt2011-10-10 Liza H - Jeans107.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans108.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans109.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans110.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans111.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans112.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans113.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans114.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans115.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans116.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans117.jpg - size: 1.2 MiB - - MetArt2011-10-10 Liza H - Jeans118.jpg - size: 1.1 MiB - - MetArt2011-10-10 Liza H - Jeans119.jpg - size: 1 MiB - - MetArt2011-10-10 Liza H - Jeans120.jpg - size: 1.1 MiB - - MetArt2011-10-10 Liza H - Jeans121.jpg - size: 1.1 MiB - - MetArt2011-10-10 Liza H - Jeans122.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans123.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans124.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans125.jpg - size: 1.4 MiB - - MetArt2011-10-10 Liza H - Jeans126.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans127.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans128.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans129.jpg - size: 1.6 MiB - - MetArt2011-10-10 Liza H - Jeans130.jpg - size: 1.3 MiB - - MetArt2011-10-10 Liza H - Jeans131.jpg - size: 1.4 MiB - - MetModels2010-02-21 Liza B - Snow Show000.jpg - size: 362.4 KiB - - MetModels2010-02-21 Liza B - Snow Show001.jpg - size: 3.3 MiB - - MetModels2010-02-21 Liza B - Snow Show002.jpg - size: 3.1 MiB - - MetModels2010-02-21 Liza B - Snow Show003.jpg - size: 3.3 MiB - - MetModels2010-02-21 Liza B - Snow Show004.jpg - size: 3.2 MiB - - MetModels2010-02-21 Liza B - Snow Show005.jpg - size: 3.3 MiB - - MetModels2010-02-21 Liza B - Snow Show006.jpg - size: 3.4 MiB - - MetModels2010-02-21 Liza B - Snow Show007.jpg - size: 3.7 MiB - - MetModels2010-02-21 Liza B - Snow Show008.jpg - size: 3.9 MiB - - MetModels2010-02-21 Liza B - Snow Show009.jpg - size: 3.6 MiB - - MetModels2010-02-21 Liza B - Snow Show010.jpg - size: 3.5 MiB - - MetModels2010-02-21 Liza B - Snow Show011.jpg - size: 3.2 MiB - - MetModels2010-02-21 Liza B - Snow Show012.jpg - size: 3.4 MiB - - MetModels2010-02-21 Liza B - Snow Show013.jpg - size: 2.9 MiB - - MetModels2010-02-21 Liza B - Snow Show014.jpg - size: 3.3 MiB - - MetModels2010-02-21 Liza B - Snow Show015.jpg - size: 3.7 MiB - - MetModels2010-02-21 Liza B - Snow Show016.jpg - size: 3.6 MiB - - MetModels2010-02-21 Liza B - Snow Show017.jpg - size: 3.8 MiB - - AmourAngels2014-01-08 Liza - Winter Forest000.jpg - size: 179.2 KiB - - MetModels2010-02-21 Liza B - Snow Show019.jpg - size: 3.6 MiB - - MetModels2010-02-21 Liza B - Snow Show020.jpg - size: 426.5 KiB - - MetModels2010-02-21 Liza B - Snow Show021.jpg - size: 447.7 KiB - - MetModels2010-02-21 Liza B - Snow Show022.jpg - size: 465.4 KiB - - MetModels2010-02-21 Liza B - Snow Show023.jpg - size: 538.8 KiB - - MetModels2010-02-21 Liza B - Snow Show024.jpg - size: 432.6 KiB - - MetModels2010-02-21 Liza B - Snow Show025.jpg - size: 422.1 KiB - - MetModels2010-02-21 Liza B - Snow Show026.jpg - size: 449.3 KiB - - MetModels2010-02-21 Liza B - Snow Show027.jpg - size: 421.8 KiB - - MetModels2010-02-21 Liza B - Snow Show028.jpg - size: 308.6 KiB - - MetModels2010-02-21 Liza B - Snow Show029.jpg - size: 535.8 KiB - - MetModels2010-02-21 Liza B - Snow Show030.jpg - size: 419.2 KiB - - MetModels2010-02-21 Liza B - Snow Show031.jpg - size: 410.1 KiB - - MetModels2010-02-21 Liza B - Snow Show032.jpg - size: 466 KiB - - MetModels2010-02-21 Liza B - Snow Show033.jpg - size: 440.3 KiB - - MetModels2010-02-21 Liza B - Snow Show034.jpg - size: 422.2 KiB - - MetModels2010-02-21 Liza B - Snow Show035.jpg - size: 490.6 KiB - - MetModels2010-02-21 Liza B - Snow Show036.jpg - size: 489.5 KiB - - MetModels2010-02-21 Liza B - Snow Show037.jpg - size: 382.5 KiB - - MetModels2010-02-21 Liza B - Snow Show038.jpg - size: 455.3 KiB - - MetModels2010-02-21 Liza B - Snow Show039.jpg - size: 413.6 KiB - - MetModels2010-02-21 Liza B - Snow Show040.jpg - size: 497.9 KiB - - MetModels2010-02-21 Liza B - Snow Show041.jpg - size: 507.5 KiB - - MetModels2010-02-21 Liza B - Snow Show042.jpg - size: 520.6 KiB - - MetModels2010-02-21 Liza B - Snow Show043.jpg - size: 473.5 KiB - - MetModels2010-02-21 Liza B - Snow Show044.jpg - size: 520.8 KiB - - MetModels2010-02-21 Liza B - Snow Show045.jpg - size: 533.9 KiB - - MetModels2010-02-21 Liza B - Snow Show046.jpg - size: 532.6 KiB - - MetModels2010-02-21 Liza B - Snow Show047.jpg - size: 481.4 KiB - - MetModels2010-02-21 Liza B - Snow Show048.jpg - size: 507.4 KiB - - MetModels2010-02-21 Liza B - Snow Show049.jpg - size: 460.3 KiB - - MetModels2010-02-21 Liza B - Snow Show050.jpg - size: 471.9 KiB - - MetModels2010-02-21 Liza B - Snow Show051.jpg - size: 545.6 KiB - - MetModels2010-02-21 Liza B - Snow Show052.jpg - size: 552.2 KiB - - MetModels2010-02-21 Liza B - Snow Show053.jpg - size: 517.8 KiB - - MetModels2010-02-21 Liza B - Snow Show054.jpg - size: 500 KiB - - MetModels2010-02-21 Liza B - Snow Show055.jpg - size: 500.6 KiB - - MetModels2010-02-21 Liza B - Snow Show056.jpg - size: 543.3 KiB - - MetModels2010-02-21 Liza B - Snow Show057.jpg - size: 494.4 KiB - - MetModels2010-02-21 Liza B - Snow Show058.jpg - size: 406.7 KiB - - MetModels2010-02-21 Liza B - Snow Show059.jpg - size: 509 KiB - - MetModels2010-02-21 Liza B - Snow Show060.jpg - size: 383 KiB - - MetModels2010-02-21 Liza B - Snow Show061.jpg - size: 358 KiB - - MetModels2010-02-21 Liza B - Snow Show062.jpg - size: 318.1 KiB - - MetModels2010-02-21 Liza B - Snow Show063.jpg - size: 442.6 KiB - - MetModels2010-02-21 Liza B - Snow Show064.jpg - size: 431.4 KiB - - MetModels2010-02-21 Liza B - Snow Show065.jpg - size: 407.1 KiB - - MetModels2010-02-21 Liza B - Snow Show066.jpg - size: 395 KiB - - MetModels2010-02-21 Liza B - Snow Show067.jpg - size: 451 KiB - - MetModels2010-02-21 Liza B - Snow Show068.jpg - size: 406.4 KiB - - MetModels2010-02-21 Liza B - Snow Show069.jpg - size: 415.9 KiB - - MetModels2010-02-21 Liza B - Snow Show070.jpg - size: 329.3 KiB - - MetModels2010-02-21 Liza B - Snow Show071.jpg - size: 333.5 KiB - - MetModels2010-02-21 Liza B - Snow Show072.jpg - size: 346.7 KiB - - MetModels2010-02-21 Liza B - Snow Show073.jpg - size: 377.9 KiB - - MetModels2010-02-21 Liza B - Snow Show074.jpg - size: 433.2 KiB - - MetModels2010-02-21 Liza B - Snow Show075.jpg - size: 404 KiB - - MetModels2010-02-21 Liza B - Snow Show076.jpg - size: 403.9 KiB - - MetModels2010-02-21 Liza B - Snow Show077.jpg - size: 457.3 KiB - - MetModels2010-02-21 Liza B - Snow Show078.jpg - size: 456.5 KiB - - MetModels2010-02-21 Liza B - Snow Show079.jpg - size: 398.3 KiB - - MetModels2010-02-21 Liza B - Snow Show080.jpg - size: 370.9 KiB - - MetModels2010-02-21 Liza B - Snow Show081.jpg - size: 394.5 KiB - - MetModels2010-02-21 Liza B - Snow Show082.jpg - size: 324.4 KiB - - MetModels2010-02-21 Liza B - Snow Show083.jpg - size: 348.9 KiB - - MetModels2010-02-21 Liza B - Snow Show084.jpg - size: 337.9 KiB - - MetModels2010-02-21 Liza B - Snow Show085.jpg - size: 430.2 KiB - - MetModels2010-02-21 Liza B - Snow Show086.jpg - size: 396.7 KiB - - MetModels2010-02-21 Liza B - Snow Show087.jpg - size: 369.2 KiB - - MetModels2010-02-21 Liza B - Snow Show088.jpg - size: 397.8 KiB - - MetModels2010-02-21 Liza B - Snow Show089.jpg - size: 369.1 KiB - - MetModels2010-02-21 Liza B - Snow Show090.jpg - size: 365.9 KiB - - MetModels2010-02-21 Liza B - Snow Show091.jpg - size: 353.5 KiB - - MetModels2010-02-21 Liza B - Snow Show092.jpg - size: 355.6 KiB - - MetModels2010-02-21 Liza B - Snow Show093.jpg - size: 346.2 KiB - - MetModels2010-02-21 Liza B - Snow Show094.jpg - size: 407.4 KiB - - MetModels2010-02-21 Liza B - Snow Show095.jpg - size: 351.7 KiB - - MetModels2010-02-21 Liza B - Snow Show096.jpg - size: 339.4 KiB - - MetModels2010-02-21 Liza B - Snow Show097.jpg - size: 394.8 KiB - - MetModels2010-02-21 Liza B - Snow Show098.jpg - size: 335.5 KiB - - MetModels2010-02-21 Liza B - Snow Show099.jpg - size: 331.5 KiB - - MetModels2010-02-21 Liza B - Snow Show100.jpg - size: 336 KiB - - MetModels2010-02-21 Liza B - Snow Show101.jpg - size: 306.1 KiB - - MetModels2010-02-21 Liza B - Snow Show102.jpg - size: 269.3 KiB - - MetModels2010-02-21 Liza B - Snow Show103.jpg - size: 418.6 KiB - - MetModels2010-02-21 Liza B - Snow Show104.jpg - size: 362.7 KiB - - MetModels2010-02-21 Liza B - Snow Show105.jpg - size: 283.9 KiB - - MetModels2010-02-21 Liza B - Snow Show106.jpg - size: 367.3 KiB - - MetModels2010-02-21 Liza B - Snow Show107.jpg - size: 419.2 KiB - - MetModels2010-02-21 Liza B - Snow Show108.jpg - size: 472.7 KiB - - MetModels2010-02-21 Liza B - Snow Show109.jpg - size: 496.4 KiB - - MetModels2010-02-21 Liza B - Snow Show110.jpg - size: 410.9 KiB - - MetModels2010-02-21 Liza B - Snow Show111.jpg - size: 398.3 KiB - - MetModels2010-02-21 Liza B - Snow Show112.jpg - size: 380 KiB - - MetModels2010-02-21 Liza B - Snow Show113.jpg - size: 417.3 KiB - - MetModels2010-02-21 Liza B - Snow Show114.jpg - size: 412.8 KiB - - MetModels2010-02-21 Liza B - Snow Show115.jpg - size: 397.1 KiB - - MetModels2010-02-21 Liza B - Snow Show116.jpg - size: 428.5 KiB - - MetModels2010-02-21 Liza B - Snow Show117.jpg - size: 457.6 KiB - - MetModels2010-02-21 Liza B - Snow Show118.jpg - size: 425.6 KiB - - MetModels2010-02-21 Liza B - Snow Show119.jpg - size: 359 KiB - - MetModels2010-02-21 Liza B - Snow Show120.jpg - size: 288.1 KiB - - MetModels2010-02-21 Liza B - Snow Show121.jpg - size: 275 KiB - - MetModels2010-02-21 Liza B - Snow Show122.jpg - size: 494.9 KiB - - MPLStudios2009-10-24 Liza - Blue Angel000.jpg - size: 183.9 KiB - - MPLStudios2009-10-24 Liza - Blue Angel001.jpg - size: 1.1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel002.jpg - size: 1.3 MiB - - MPLStudios2009-10-24 Liza - Blue Angel003.jpg - size: 1.4 MiB - - MPLStudios2009-10-24 Liza - Blue Angel004.jpg - size: 1.5 MiB - - MPLStudios2009-10-24 Liza - Blue Angel005.jpg - size: 1.2 MiB - - MPLStudios2009-10-24 Liza - Blue Angel006.jpg - size: 1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel007.jpg - size: 1.3 MiB - - MPLStudios2009-10-24 Liza - Blue Angel008.jpg - size: 1.2 MiB - - MPLStudios2009-10-24 Liza - Blue Angel009.jpg - size: 1.1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel010.jpg - size: 1.1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel011.jpg - size: 1.2 MiB - - MPLStudios2009-10-24 Liza - Blue Angel012.jpg - size: 1.2 MiB - - MPLStudios2009-10-24 Liza - Blue Angel013.jpg - size: 1.1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel014.jpg - size: 1.2 MiB - - MPLStudios2009-10-24 Liza - Blue Angel015.jpg - size: 1.3 MiB - - MPLStudios2009-10-24 Liza - Blue Angel016.jpg - size: 1.1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel017.jpg - size: 1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel018.jpg - size: 1.3 MiB - - MPLStudios2009-10-24 Liza - Blue Angel019.jpg - size: 1.3 MiB - - MPLStudios2009-10-24 Liza - Blue Angel020.jpg - size: 1.3 MiB - - MPLStudios2009-10-24 Liza - Blue Angel021.jpg - size: 1.5 MiB - - MPLStudios2009-10-24 Liza - Blue Angel022.jpg - size: 1.1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel023.jpg - size: 1.2 MiB - - MPLStudios2009-10-24 Liza - Blue Angel024.jpg - size: 1.4 MiB - - MPLStudios2009-10-24 Liza - Blue Angel025.jpg - size: 1.1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel026.jpg - size: 1.1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel027.jpg - size: 1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel028.jpg - size: 962.8 KiB - - MPLStudios2009-10-24 Liza - Blue Angel029.jpg - size: 1000.2 KiB - - MPLStudios2009-10-24 Liza - Blue Angel030.jpg - size: 1009.6 KiB - - MPLStudios2009-10-24 Liza - Blue Angel031.jpg - size: 962.5 KiB - - MPLStudios2009-10-24 Liza - Blue Angel032.jpg - size: 1.2 MiB - - MPLStudios2009-10-24 Liza - Blue Angel033.jpg - size: 1.2 MiB - - MPLStudios2009-10-24 Liza - Blue Angel034.jpg - size: 1.3 MiB - - MPLStudios2009-10-24 Liza - Blue Angel035.jpg - size: 1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel036.jpg - size: 1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel037.jpg - size: 1.3 MiB - - MPLStudios2009-10-24 Liza - Blue Angel038.jpg - size: 1.3 MiB - - MPLStudios2009-10-24 Liza - Blue Angel039.jpg - size: 1.1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel040.jpg - size: 1.3 MiB - - MPLStudios2009-10-24 Liza - Blue Angel041.jpg - size: 1.2 MiB - - MPLStudios2009-10-24 Liza - Blue Angel042.jpg - size: 1.1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel043.jpg - size: 1.1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel044.jpg - size: 1.1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel045.jpg - size: 1.1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel046.jpg - size: 949.5 KiB - - MPLStudios2009-10-24 Liza - Blue Angel047.jpg - size: 916.6 KiB - - MPLStudios2009-10-24 Liza - Blue Angel048.jpg - size: 1.3 MiB - - MPLStudios2009-10-24 Liza - Blue Angel049.jpg - size: 1.1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel050.jpg - size: 1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel051.jpg - size: 1.2 MiB - - MPLStudios2009-10-24 Liza - Blue Angel052.jpg - size: 1.1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel053.jpg - size: 1.2 MiB - - MPLStudios2009-10-24 Liza - Blue Angel054.jpg - size: 1017.5 KiB - - MPLStudios2009-10-24 Liza - Blue Angel055.jpg - size: 1.1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel056.jpg - size: 1018.7 KiB - - MPLStudios2009-10-24 Liza - Blue Angel057.jpg - size: 1.1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel058.jpg - size: 1.3 MiB - - MPLStudios2009-10-24 Liza - Blue Angel059.jpg - size: 1.2 MiB - - MPLStudios2009-10-24 Liza - Blue Angel060.jpg - size: 1.4 MiB - - MPLStudios2009-10-24 Liza - Blue Angel061.jpg - size: 1.4 MiB - - MPLStudios2009-10-24 Liza - Blue Angel062.jpg - size: 1.2 MiB - - MPLStudios2009-10-24 Liza - Blue Angel063.jpg - size: 1014.3 KiB - - MPLStudios2009-10-24 Liza - Blue Angel064.jpg - size: 915.7 KiB - - MPLStudios2009-10-24 Liza - Blue Angel065.jpg - size: 1.2 MiB - - MPLStudios2009-10-24 Liza - Blue Angel066.jpg - size: 1.1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel067.jpg - size: 1.1 MiB - - MPLStudios2009-10-24 Liza - Blue Angel068.jpg - size: 1.1 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter000.jpg - size: 184.4 KiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter001.jpg - size: 1 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter002.jpg - size: 1.2 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter003.jpg - size: 1.2 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter004.jpg - size: 1.3 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter005.jpg - size: 1 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter006.jpg - size: 532.7 KiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter007.jpg - size: 1.2 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter008.jpg - size: 1.1 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter009.jpg - size: 1.1 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter010.jpg - size: 840.3 KiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter011.jpg - size: 908.4 KiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter012.jpg - size: 787 KiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter013.jpg - size: 1.2 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter014.jpg - size: 1.2 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter015.jpg - size: 933.6 KiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter016.jpg - size: 1.3 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter017.jpg - size: 1.1 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter018.jpg - size: 1 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter019.jpg - size: 866.5 KiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter020.jpg - size: 1.2 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter021.jpg - size: 1001.2 KiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter022.jpg - size: 1.2 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter023.jpg - size: 1.3 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter024.jpg - size: 940.1 KiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter025.jpg - size: 1.1 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter026.jpg - size: 1.2 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter027.jpg - size: 1.2 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter028.jpg - size: 1 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter029.jpg - size: 867 KiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter030.jpg - size: 702.5 KiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter031.jpg - size: 755.3 KiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter032.jpg - size: 787.5 KiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter033.jpg - size: 836.2 KiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter034.jpg - size: 806.2 KiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter035.jpg - size: 948.7 KiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter036.jpg - size: 797.9 KiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter037.jpg - size: 703.5 KiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter038.jpg - size: 966.6 KiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter039.jpg - size: 959.7 KiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter040.jpg - size: 1.6 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter041.jpg - size: 1.2 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter042.jpg - size: 1.5 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter043.jpg - size: 1.8 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter044.jpg - size: 1.2 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter045.jpg - size: 1.5 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter046.jpg - size: 1.6 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter047.jpg - size: 1.7 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter048.jpg - size: 1.3 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter049.jpg - size: 1.4 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter050.jpg - size: 1.3 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter051.jpg - size: 1.2 MiB - - MPLStudios2009-12-26 Liza - Speaking Of Winter052.jpg - size: 1.3 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids000.jpg - size: 95 KiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids001.jpg - size: 1.3 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids002.jpg - size: 1.3 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids003.jpg - size: 1.2 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids004.jpg - size: 1.2 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids005.jpg - size: 1.3 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids006.jpg - size: 1.1 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids007.jpg - size: 1.2 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids008.jpg - size: 1.4 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids009.jpg - size: 1.1 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids010.jpg - size: 1.3 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids011.jpg - size: 1.5 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids012.jpg - size: 1.2 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids013.jpg - size: 1.2 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids014.jpg - size: 1.4 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids015.jpg - size: 1.5 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids016.jpg - size: 1.4 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids017.jpg - size: 1.4 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids018.jpg - size: 1.7 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids019.jpg - size: 1.3 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids020.jpg - size: 1.2 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids021.jpg - size: 1.3 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids022.jpg - size: 1.2 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids023.jpg - size: 1.5 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids024.jpg - size: 1.3 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids025.jpg - size: 1.4 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids026.jpg - size: 1.4 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids027.jpg - size: 1.4 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids028.jpg - size: 1.3 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids029.jpg - size: 1.4 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids030.jpg - size: 1.3 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids031.jpg - size: 1.4 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids032.jpg - size: 1.2 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids033.jpg - size: 1.1 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids034.jpg - size: 1.3 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids035.jpg - size: 1.6 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids036.jpg - size: 1.2 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids037.jpg - size: 1.4 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids038.jpg - size: 1 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids039.jpg - size: 1.3 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids040.jpg - size: 1.3 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids041.jpg - size: 1.3 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids042.jpg - size: 1.3 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids043.jpg - size: 1.4 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids044.jpg - size: 1.4 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids045.jpg - size: 1.3 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids046.jpg - size: 1.2 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids047.jpg - size: 1.3 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids048.jpg - size: 1.4 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids049.jpg - size: 1.3 MiB - - MPLStudios2010-02-05 Liza - Stripes and Plaids050.jpg - size: 1.4 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza000.jpg - size: 135.2 KiB - - ShowBeauty2014-02-14 Liza - Smiling Liza001.jpg - size: 2.4 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza002.jpg - size: 2.4 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza003.jpg - size: 2.5 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza004.jpg - size: 2.4 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza005.jpg - size: 2.7 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza006.jpg - size: 3.3 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza007.jpg - size: 3.3 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza008.jpg - size: 3.1 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza009.jpg - size: 3.1 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza010.jpg - size: 3.2 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza011.jpg - size: 3.1 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza012.jpg - size: 2.8 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza013.jpg - size: 3.3 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza014.jpg - size: 2.8 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza015.jpg - size: 3.1 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza016.jpg - size: 2.9 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza017.jpg - size: 2.9 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza018.jpg - size: 2.7 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza019.jpg - size: 2.9 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza020.jpg - size: 2.7 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza021.jpg - size: 2.9 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza022.jpg - size: 2.9 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza023.jpg - size: 3.1 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza024.jpg - size: 2.9 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza025.jpg - size: 3 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza026.jpg - size: 3 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza027.jpg - size: 3 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza028.jpg - size: 2.9 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza029.jpg - size: 2.9 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza030.jpg - size: 3.3 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza031.jpg - size: 2.9 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza032.jpg - size: 2.7 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza033.jpg - size: 2.7 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza034.jpg - size: 2.8 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza035.jpg - size: 2.9 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza036.jpg - size: 3 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza037.jpg - size: 3.1 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza038.jpg - size: 2.7 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza039.jpg - size: 3.2 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza040.jpg - size: 3.2 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza041.jpg - size: 3.2 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza042.jpg - size: 3 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza043.jpg - size: 2.8 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza044.jpg - size: 3.2 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza045.jpg - size: 3.2 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza046.jpg - size: 2.9 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza047.jpg - size: 2.9 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza048.jpg - size: 2.8 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza049.jpg - size: 2.8 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza050.jpg - size: 2.9 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza051.jpg - size: 3 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza052.jpg - size: 3.1 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza053.jpg - size: 3 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza054.jpg - size: 3.2 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza055.jpg - size: 2.9 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza056.jpg - size: 3.2 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza057.jpg - size: 3.2 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza058.jpg - size: 2.7 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza059.jpg - size: 3.2 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza060.jpg - size: 3.6 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza061.jpg - size: 3 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza062.jpg - size: 2.9 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza063.jpg - size: 3.2 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza064.jpg - size: 2.8 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza065.jpg - size: 3.4 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza066.jpg - size: 3.5 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza067.jpg - size: 3.7 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza068.jpg - size: 3.1 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza069.jpg - size: 2.9 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza070.jpg - size: 3.2 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza071.jpg - size: 3.6 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza072.jpg - size: 3 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza073.jpg - size: 3.2 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza074.jpg - size: 3.1 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza075.jpg - size: 2.8 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza076.jpg - size: 3 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza077.jpg - size: 3 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza078.jpg - size: 2.7 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza079.jpg - size: 2.8 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza080.jpg - size: 2.8 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza081.jpg - size: 2.9 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza082.jpg - size: 2.8 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza083.jpg - size: 2.7 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza084.jpg - size: 2.6 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza085.jpg - size: 2.5 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza086.jpg - size: 2.6 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza087.jpg - size: 3.2 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza088.jpg - size: 2.6 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza089.jpg - size: 2.5 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza090.jpg - size: 2.6 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza091.jpg - size: 2.7 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza092.jpg - size: 2.7 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza093.jpg - size: 2.7 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza094.jpg - size: 2.7 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza095.jpg - size: 3 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza096.jpg - size: 3.1 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza097.jpg - size: 3.1 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza098.jpg - size: 2.8 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza099.jpg - size: 3.1 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza100.jpg - size: 2.8 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza101.jpg - size: 3 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza102.jpg - size: 2.8 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza103.jpg - size: 2.9 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza104.jpg - size: 3 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza105.jpg - size: 3.2 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza106.jpg - size: 3.1 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza107.jpg - size: 3.1 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza108.jpg - size: 2.8 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza109.jpg - size: 3.3 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza110.jpg - size: 2.4 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza111.jpg - size: 3.3 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza112.jpg - size: 2.6 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza113.jpg - size: 2.8 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza114.jpg - size: 3.1 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza115.jpg - size: 2.8 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza116.jpg - size: 2.3 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza117.jpg - size: 3.5 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza118.jpg - size: 3.3 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza119.jpg - size: 3.1 MiB - - ShowBeauty2014-02-14 Liza - Smiling Liza120.jpg - size: 3.2 MiB - diff --git a/cli/src/main.rs b/cli/src/main.rs index e4ec6a7..59d897b 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -1,28 +1,92 @@ -use clap::{self, Parser}; +mod torrent; +mod tracker; -#[derive(clap::Parser)] +use std::io; + +use clap::{Command, CommandFactory, Parser, Subcommand, ValueHint}; +use clap_complete::{generate, Generator, Shell}; +use torrent::{create, metadata, raw}; +use tracker::check; + +#[derive(Parser)] #[command(version, about)] struct Cli { #[command(subcommand)] - commands: Commands, + commands: Option, + #[arg(short, long, value_name = "SHELL", value_enum)] + complete: Option, } -#[derive(clap::Subcommand)] -enum Commands { - Info { +#[derive(Subcommand)] +enum Cmds { + /// Torrent tooling + Torrent { + #[command(subcommand)] + commands: TorrentCmds, + }, + Tracker { + #[command(subcommand)] + commands: TrackerCmds, + }, +} + +#[derive(Subcommand)] +enum TorrentCmds { + /// Retrieve metadata from a ".torrent" file + Metadata { + /// Path to an existing torrent file + #[arg(value_hint = ValueHint::FilePath)] path: String, - } + /// BitTorrent specification V1 + #[arg(long, default_value_t = true)] + v1: bool, + /// BitTorrent specification V2 + #[arg(long)] + v2: bool, + }, + Raw { + /// Path to an existing torrent file + #[arg(value_hint = ValueHint::FilePath)] + path: String, + }, + /// Create a torrent file + Create { + /// Path to an existing torrent file + #[arg(value_hint = ValueHint::FilePath)] + path: String, + }, } -fn main() { +#[derive(Subcommand)] +enum TrackerCmds { + Check { + #[arg(value_hint = ValueHint::FilePath)] + path: String, + }, +} + +fn print_completions(gen: G, cmd: &mut Command) { + generate(gen, cmd, cmd.get_name().to_string(), &mut io::stdout()); +} + +#[tokio::main] +async fn main() { let cli = Cli::parse(); - match cli.commands { - Commands::Info { path } => { - match brs::torrent::parse(path) { - Ok(v) => println!("{v}"), - Err(e) => println!("{e}"), - } + if let Some(sh) = cli.complete { + print_completions(sh, &mut Cli::command()) + } + + if let Some(cmds) = cli.commands { + match cmds { + Cmds::Torrent { commands } => match commands { + TorrentCmds::Metadata { path, v1, v2 } => metadata(v1, v2, path), + TorrentCmds::Create { path } => create(path, String::new()), + TorrentCmds::Raw { path } => raw(path), + }, + Cmds::Tracker { commands } => match commands { + TrackerCmds::Check { path } => check(path).await, + }, } } } diff --git a/cli/src/torrent.rs b/cli/src/torrent.rs new file mode 100644 index 0000000..61826d3 --- /dev/null +++ b/cli/src/torrent.rs @@ -0,0 +1,26 @@ +use std::{collections::HashMap, fs}; + +use brs::torrent::v1; + +pub(crate) fn metadata(v1: bool, _v2: bool, path: String) { + if v1 { + let bytes = fs::read(path).unwrap(); + let torrent = v1::Torrent::parse_bytes(&bytes); + if let Err(e) = &torrent { + eprintln!("{e}"); + } + println!("{}", torrent.unwrap()) + } else { + unimplemented!() + } +} + +pub(crate) fn raw(path: String) { + let bytes = fs::read(path).unwrap(); + let out: HashMap = bendy::serde::from_bytes(&bytes).unwrap(); + println!("{:?}", out) +} + +pub(crate) fn create(_path: String, _data: String) { + unimplemented!() +} diff --git a/cli/src/tracker.rs b/cli/src/tracker.rs new file mode 100644 index 0000000..8aacff3 --- /dev/null +++ b/cli/src/tracker.rs @@ -0,0 +1,43 @@ +use std::fs; + +use brs::{ + torrent::v1, + tracker::{Tracker, TrackerRequest}, +}; +use rand::distributions::Alphanumeric; +use rand::Rng; + +pub(crate) async fn check(path: String) { + let bytes = fs::read(path).unwrap(); + let torrent = v1::Torrent::parse_bytes(&bytes); + if let Err(e) = &torrent { + eprintln!("Failed to parse torrent: {e}") + } + + let torrent = torrent.unwrap(); + let peer_id: String = rand::thread_rng() + .sample_iter(&Alphanumeric) + .take(12) + .map(char::from) + .collect(); + let info_hash = match torrent.calc_hash() { + Ok(v) => v, + Err(e) => return eprintln!("Failed to calculate info hash: {e}"), + }; + let mut tracker = Tracker::new(torrent.announce.clone()); + let rsp = tracker + .announce(TrackerRequest { + peer_id: format!("-BRS010-{peer_id}"), + downloaded: "0".to_string(), + left: torrent.calc_download_lenght().to_string(), + uploaded: "0".to_string(), + info_hash, + compact: true, + ..Default::default() + }) + .await; + + if let Err(e) = rsp { + eprintln!("{e}") + } +} diff --git a/flake.lock b/flake.lock index 7af1b31..af20abd 100644 --- a/flake.lock +++ b/flake.lock @@ -38,11 +38,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1711523803, - "narHash": "sha256-UKcYiHWHQynzj6CN/vTcix4yd1eCu1uFdsuarupdCQQ=", + "lastModified": 1711703276, + "narHash": "sha256-iMUFArF0WCatKK6RzfUJknjem0H9m4KgorO/p3Dopkk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "2726f127c15a4cc9810843b96cad73c7eb39e443", + "rev": "d8fe5e6c92d0d190646fb9f1056741a229980089", "type": "github" }, "original": { @@ -81,11 +81,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1711592024, - "narHash": "sha256-oD4OJ3TRmVrbAuKZWxElRCyCagNCDuhfw2exBmNOy48=", + "lastModified": 1711937855, + "narHash": "sha256-jlfDBRtsLoqRNFxtQtG47wsrwVsQSV4AqoMgWG6Bvng=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "aa858717377db2ed8ffd2d44147d907baee656e5", + "rev": "3f46a51b47f56c24b4d7e8db8fb8e73118923f96", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index a03b523..57e98c2 100644 --- a/flake.nix +++ b/flake.nix @@ -17,6 +17,8 @@ devShells.default = pkgs.mkShell { buildInputs = with pkgs; [ rust-bin.stable.latest.default + openssl + pkg-config ]; }; }