From a346a3c5caf5a2803d78b37e0bf092052714f1b7 Mon Sep 17 00:00:00 2001 From: Adam Chalmers Date: Tue, 19 Mar 2024 15:00:09 -0500 Subject: [PATCH 1/2] Revert "Add support for line, xLine, yLine, xLineTo, yLineTo (#1754)" This reverts commit be3fed84273e6df12e9bb68b197810bb8ab9f030. --- src/wasm-lib/Cargo.lock | 1080 +++++++++-------- src/wasm-lib/grackle/Cargo.toml | 2 - src/wasm-lib/grackle/fixtures/cube_lineTo.png | Bin 82261 -> 0 bytes src/wasm-lib/grackle/fixtures/cube_xyLine.png | Bin 82740 -> 0 bytes src/wasm-lib/grackle/src/binding_scope.rs | 20 - src/wasm-lib/grackle/src/error.rs | 2 +- src/wasm-lib/grackle/src/lib.rs | 10 - .../grackle/src/native_functions/sketch.rs | 2 +- .../src/native_functions/sketch/helpers.rs | 8 +- .../sketch/stdlib_functions.rs | 366 +----- src/wasm-lib/grackle/src/tests.rs | 136 +-- 11 files changed, 632 insertions(+), 994 deletions(-) delete mode 100644 src/wasm-lib/grackle/fixtures/cube_lineTo.png delete mode 100644 src/wasm-lib/grackle/fixtures/cube_xyLine.png diff --git a/src/wasm-lib/Cargo.lock b/src/wasm-lib/Cargo.lock index 270a718c52..dd1fd8a0f5 100644 --- a/src/wasm-lib/Cargo.lock +++ b/src/wasm-lib/Cargo.lock @@ -39,9 +39,9 @@ dependencies = [ [[package]] name = "aes" -version = "0.8.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" dependencies = [ "cfg-if", "cipher", @@ -64,9 +64,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "d713b3834d76b85304d4d525563c1276e2e30dc97cc67bfb4585a4a29fc2c89f" dependencies = [ "cfg-if", "getrandom", @@ -107,9 +107,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.13" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" dependencies = [ "anstyle", "anstyle-parse", @@ -121,36 +121,36 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.48.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys 0.48.0", ] [[package]] @@ -174,14 +174,14 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" dependencies = [ - "num-traits 0.2.18", + "num-traits 0.2.17", ] [[package]] name = "arc-swap" -version = "1.7.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b3d0060af21e8d11a926981cc00c6c1541aa91dd64b9f881985c3da1094425f" +checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" [[package]] name = "asn1-rs" @@ -193,7 +193,7 @@ dependencies = [ "asn1-rs-impl", "displaydoc", "nom", - "num-traits 0.2.18", + "num-traits 0.2.17", "rusticata-macros", "thiserror", "time", @@ -240,24 +240,24 @@ dependencies = [ [[package]] name = "async-recursion" -version = "1.1.0" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30c5ef0ede93efbf733c1a727f3b6b5a1060bbedd5600183e66f6e4be4af0ec5" +checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] name = "async-trait" -version = "0.1.78" +version = "0.1.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "461abc97219de0eaaf81fe3ef974a540158f3d079c2ab200f891f1a2ef201e85" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -272,15 +272,27 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + [[package]] name = "auto_impl" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" +checksum = "fee3da8ef1276b0bee5dd1c7258010d8fffd31801447323115a25560e1327b89" dependencies = [ + "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.53", + "syn 1.0.109", ] [[package]] @@ -318,9 +330,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.7" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" [[package]] name = "base64ct" @@ -330,15 +342,15 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bigdecimal" -version = "0.4.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9324c8014cd04590682b34f1e9448d38f0674d0f7b2dc553331016ef0e4e9ebc" +checksum = "c06619be423ea5bb86c95f087d5707942791a08a85530df0db2209a3ecfb8bc9" dependencies = [ "autocfg", "libm", "num-bigint", "num-integer", - "num-traits 0.2.18", + "num-traits 0.2.17", "serde", ] @@ -365,9 +377,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" [[package]] name = "bitvec" @@ -410,7 +422,7 @@ dependencies = [ "bitvec", "chrono", "hex", - "indexmap 2.2.5", + "indexmap 2.2.2", "js-sys", "once_cell", "rand 0.8.5", @@ -423,9 +435,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.15.4" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "bytecount" @@ -435,9 +447,9 @@ checksum = "e1e5f035d16fc623ae5f74981db80a439803888314e3a555fd6f04acd51a3205" [[package]] name = "bytemuck" -version = "1.15.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" +checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" [[package]] name = "byteorder" @@ -471,9 +483,12 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.90" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] [[package]] name = "ccm" @@ -514,17 +529,17 @@ dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", - "num-traits 0.2.18", + "num-traits 0.2.17", "serde", "wasm-bindgen", - "windows-targets 0.52.4", + "windows-targets 0.52.0", ] [[package]] name = "ciborium" -version = "0.2.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" dependencies = [ "ciborium-io", "ciborium-ll", @@ -533,18 +548,18 @@ dependencies = [ [[package]] name = "ciborium-io" -version = "0.2.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" +checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" [[package]] name = "ciborium-ll" -version = "0.2.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" dependencies = [ "ciborium-io", - "half", + "half 1.8.2", ] [[package]] @@ -559,9 +574,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.3" +version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "949626d00e063efc93b6dca932419ceb5432f99769911c0b995f7e884c778813" +checksum = "b230ab84b0ffdf890d5a10abdbc8b83ae1c4918275daea1ab8801f71536b2651" dependencies = [ "clap_builder", "clap_derive", @@ -584,14 +599,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.3" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90239a040c80f5e14809ca132ddc4176ab33d5e17e49691793296e3fcb34d72f" +checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -614,25 +629,26 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "colored" -version = "2.1.0" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" +checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6" dependencies = [ + "is-terminal", "lazy_static", "windows-sys 0.48.0", ] [[package]] name = "console" -version = "0.15.8" +version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8" dependencies = [ "encode_unicode", "lazy_static", "libc", "unicode-width", - "windows-sys 0.52.0", + "windows-sys 0.45.0", ] [[package]] @@ -662,9 +678,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.9.4" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" dependencies = [ "core-foundation-sys", "libc", @@ -672,15 +688,15 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "3fbc60abd742b35f2492f808e1abbb83d45f72db402e14c55057edc9c7b1e9e4" dependencies = [ "libc", ] @@ -702,9 +718,9 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" -version = "1.4.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] @@ -722,7 +738,7 @@ dependencies = [ "criterion-plot", "is-terminal", "itertools 0.10.5", - "num-traits 0.2.18", + "num-traits 0.2.17", "once_cell", "oorandom", "plotters", @@ -747,37 +763,46 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.12" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" dependencies = [ + "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" dependencies = [ + "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.18" +version = "0.9.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" dependencies = [ + "autocfg", + "cfg-if", "crossbeam-utils", + "memoffset 0.9.0", + "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] [[package]] name = "crunchy" @@ -819,9 +844,9 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.1.2" +version = "4.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" +checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c" dependencies = [ "cfg-if", "cpufeatures", @@ -841,7 +866,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -851,7 +876,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.14.3", + "hashbrown 0.14.2", "lock_api", "once_cell", "parking_lot_core 0.9.9", @@ -882,8 +907,8 @@ checksum = "377af281d8f23663862a7c84623bc5dcf7f8c44b13c7496a590bdc157f941a43" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", - "synstructure 0.13.1", + "syn 2.0.52", + "synstructure 0.13.0", ] [[package]] @@ -907,15 +932,15 @@ dependencies = [ "displaydoc", "nom", "num-bigint", - "num-traits 0.2.18", + "num-traits 0.2.17", "rusticata-macros", ] [[package]] name = "deranged" -version = "0.3.11" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" dependencies = [ "powerfmt", ] @@ -935,7 +960,7 @@ dependencies = [ "regex", "serde", "serde_tokenstream", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -952,19 +977,19 @@ dependencies = [ "regex", "serde", "serde_tokenstream", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] name = "diesel_derives" -version = "2.1.3" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d02eecb814ae714ffe61ddc2db2dd03e6c49a42e269b5001355500d431cce0c" +checksum = "ef8337737574f55a468005a83499da720f20c65586241ffea339db9ecdfd2b44" dependencies = [ "diesel_table_macro_syntax", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -973,7 +998,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" dependencies = [ - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -1023,14 +1048,14 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] name = "dyn-clone" -version = "1.0.17" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" +checksum = "23d2f3407d9a573d666de4b5bdf10569d73ca9478087346697dcbae6244bfbcd" [[package]] name = "ecdsa" @@ -1048,9 +1073,9 @@ dependencies = [ [[package]] name = "either" -version = "1.10.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "elliptic-curve" @@ -1090,22 +1115,22 @@ dependencies = [ [[package]] name = "enum-iterator" -version = "1.5.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94" +checksum = "7add3873b5dd076766ee79c8e406ad1a472c385476b9e38849f8eec24f1be689" dependencies = [ "enum-iterator-derive", ] [[package]] name = "enum-iterator-derive" -version = "1.3.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03cdc46ec28bd728e67540c528013c6a10eb69a02eb31078a1bda695438cbfb8" +checksum = "eecf8589574ce9b895052fa12d69af7a233f99e6107f5cb8dd1044f2a17bfdcb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -1116,12 +1141,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.48.0", ] [[package]] @@ -1147,13 +1172,13 @@ dependencies = [ [[package]] name = "exr" -version = "1.72.0" +version = "1.71.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" +checksum = "832a761f35ab3e6664babfbdc6cef35a4860e816ec3916dcfd0882954e98a8a8" dependencies = [ "bit_field", "flume", - "half", + "half 2.2.1", "lebe", "miniz_oxide", "rayon-core", @@ -1169,9 +1194,9 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "fdeflate" -version = "0.3.4" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" +checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10" dependencies = [ "simd-adler32", ] @@ -1188,9 +1213,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.6" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382" +checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" [[package]] name = "flate2" @@ -1234,9 +1259,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ "percent-encoding", ] @@ -1322,7 +1347,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -1368,9 +1393,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", "js-sys", @@ -1381,9 +1406,9 @@ dependencies = [ [[package]] name = "ghash" -version = "0.5.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40" dependencies = [ "opaque-debug", "polyval", @@ -1401,9 +1426,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" [[package]] name = "gloo-utils" @@ -1427,7 +1452,7 @@ dependencies = [ "inflections", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -1446,7 +1471,6 @@ dependencies = [ name = "grackle" version = "0.1.0" dependencies = [ - "image", "kcl-lib", "kittycad", "kittycad-execution-plan", @@ -1458,7 +1482,6 @@ dependencies = [ "serde_json", "thiserror", "tokio", - "twenty-twenty", "uuid", ] @@ -1475,17 +1498,17 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.25" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fbd2820c5e49886948654ab546d0688ff24530286bdcf8fca3cefb16d4618eb" +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" dependencies = [ "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http 0.2.12", - "indexmap 2.2.5", + "http 0.2.9", + "indexmap 2.2.2", "slab", "tokio", "tokio-util", @@ -1494,11 +1517,16 @@ dependencies = [ [[package]] name = "half" -version = "2.4.0" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5eceaaeec696539ddaf7b333340f1af35a5aa87ae3e4f3ead0532f72affab2e" +checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" + +[[package]] +name = "half" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0" dependencies = [ - "cfg-if", "crunchy", ] @@ -1510,9 +1538,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" [[package]] name = "heck" @@ -1521,16 +1549,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] -name = "heck" -version = "0.5.0" +name = "hermit-abi" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] [[package]] name = "hermit-abi" -version = "0.3.9" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" [[package]] name = "hex" @@ -1558,18 +1589,18 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.48.0", ] [[package]] name = "http" -version = "0.2.12" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" dependencies = [ "bytes", "fnv", @@ -1578,9 +1609,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea" dependencies = [ "bytes", "fnv", @@ -1589,12 +1620,12 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.6" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ "bytes", - "http 0.2.12", + "http 0.2.9", "pin-project-lite", ] @@ -1612,22 +1643,22 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.28" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", "futures-core", "futures-util", "h2", - "http 0.2.12", + "http 0.2.9", "http-body", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -1636,14 +1667,14 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.24.2" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" dependencies = [ "futures-util", - "http 0.2.12", + "http 0.2.9", "hyper", - "rustls 0.21.10", + "rustls 0.21.8", "tokio", "tokio-rustls 0.24.1", ] @@ -1663,9 +1694,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1686,9 +1717,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.5.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -1706,7 +1737,7 @@ dependencies = [ "exr", "gif", "jpeg-decoder", - "num-traits 0.2.18", + "num-traits 0.2.17", "png", "qoi", "tiff", @@ -1732,17 +1763,16 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", - "serde", ] [[package]] name = "indexmap" -version = "2.2.5" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" +checksum = "824b2ae422412366ba479e8111fd301f7b5faece8149317bb81925979a53f520" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.14.2", "serde", ] @@ -1799,7 +1829,7 @@ dependencies = [ "log", "rand 0.8.5", "rtcp", - "rtp 0.9.0", + "rtp", "thiserror", "tokio", "waitgroup", @@ -1815,13 +1845,13 @@ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" -version = "0.4.12" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.52.0", + "hermit-abi 0.3.3", + "rustix", + "windows-sys 0.48.0", ] [[package]] @@ -1833,15 +1863,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.12.1" @@ -1853,15 +1874,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "jpeg-decoder" -version = "0.3.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" +checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e" dependencies = [ "rayon", ] @@ -1929,7 +1950,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winnow 0.5.40", + "winnow", "zip", ] @@ -1942,7 +1963,7 @@ dependencies = [ "pretty_assertions", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -1953,14 +1974,14 @@ checksum = "f8aa5906d0730bd90f6b3331fe57c04951d00743169a29ee96408767b4060605" dependencies = [ "anyhow", "async-trait", - "base64 0.21.7", + "base64 0.21.5", "bigdecimal", "bytes", "chrono", "data-encoding", "format_serde_error", "futures", - "http 0.2.12", + "http 0.2.9", "itertools 0.10.5", "log", "mime_guess", @@ -1986,7 +2007,7 @@ dependencies = [ [[package]] name = "kittycad-execution-plan" version = "0.1.0" -source = "git+https://github.com/KittyCAD/modeling-api?branch=main#a25f5e41c4c2390927963f792ed22f8526195006" +source = "git+https://github.com/KittyCAD/modeling-api?branch=main#4dfeb5c9ce2cc3fb853dd14cf948a922f3724ef4" dependencies = [ "bytes", "insta", @@ -2006,17 +2027,17 @@ dependencies = [ [[package]] name = "kittycad-execution-plan-macros" version = "0.1.9" -source = "git+https://github.com/KittyCAD/modeling-api?branch=main#a25f5e41c4c2390927963f792ed22f8526195006" +source = "git+https://github.com/KittyCAD/modeling-api?branch=main#4dfeb5c9ce2cc3fb853dd14cf948a922f3724ef4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] name = "kittycad-execution-plan-traits" version = "0.1.13" -source = "git+https://github.com/KittyCAD/modeling-api?branch=main#a25f5e41c4c2390927963f792ed22f8526195006" +source = "git+https://github.com/KittyCAD/modeling-api?branch=main#4dfeb5c9ce2cc3fb853dd14cf948a922f3724ef4" dependencies = [ "serde", "thiserror", @@ -2025,8 +2046,8 @@ dependencies = [ [[package]] name = "kittycad-modeling-cmds" -version = "0.1.32" -source = "git+https://github.com/KittyCAD/modeling-api?branch=main#a25f5e41c4c2390927963f792ed22f8526195006" +version = "0.1.30" +source = "git+https://github.com/KittyCAD/modeling-api?branch=main#4dfeb5c9ce2cc3fb853dd14cf948a922f3724ef4" dependencies = [ "anyhow", "chrono", @@ -2035,7 +2056,7 @@ dependencies = [ "enum-iterator", "enum-iterator-derive", "euler", - "http 0.2.12", + "http 0.2.9", "kittycad-execution-plan-macros", "kittycad-execution-plan-traits", "kittycad-modeling-cmds-macros", @@ -2054,17 +2075,17 @@ dependencies = [ [[package]] name = "kittycad-modeling-cmds-macros" version = "0.1.2" -source = "git+https://github.com/KittyCAD/modeling-api?branch=main#a25f5e41c4c2390927963f792ed22f8526195006" +source = "git+https://github.com/KittyCAD/modeling-api?branch=main#4dfeb5c9ce2cc3fb853dd14cf948a922f3724ef4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] name = "kittycad-modeling-session" version = "0.1.1" -source = "git+https://github.com/KittyCAD/modeling-api?branch=main#a25f5e41c4c2390927963f792ed22f8526195006" +source = "git+https://github.com/KittyCAD/modeling-api?branch=main#4dfeb5c9ce2cc3fb853dd14cf948a922f3724ef4" dependencies = [ "futures", "kittycad", @@ -2103,9 +2124,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" [[package]] name = "libm" @@ -2113,17 +2134,6 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" -[[package]] -name = "libredox" -version = "0.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" -dependencies = [ - "bitflags 2.4.2", - "libc", - "redox_syscall 0.4.1", -] - [[package]] name = "linked-hash-map" version = "0.5.6" @@ -2132,9 +2142,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" [[package]] name = "lock_api" @@ -2148,9 +2158,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" dependencies = [ "serde", ] @@ -2204,9 +2214,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.1" +version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] name = "memoffset" @@ -2217,6 +2227,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + [[package]] name = "mime" version = "0.3.17" @@ -2241,9 +2260,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ "adler", "simd-adler32", @@ -2302,7 +2321,7 @@ dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", - "memoffset", + "memoffset 0.7.1", "pin-utils", ] @@ -2324,22 +2343,17 @@ checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" dependencies = [ "autocfg", "num-integer", - "num-traits 0.2.18", + "num-traits 0.2.17", ] -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - [[package]] name = "num-integer" -version = "0.1.46" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ - "num-traits 0.2.18", + "autocfg", + "num-traits 0.2.17", ] [[package]] @@ -2348,14 +2362,14 @@ version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" dependencies = [ - "num-traits 0.2.18", + "num-traits 0.2.17", ] [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", ] @@ -2366,7 +2380,16 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.3", + "libc", +] + +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ "libc", ] @@ -2378,9 +2401,9 @@ checksum = "049950a25a8f69e9673ed52fc58749548cee71194f6c3a8a04b80863637ce722" [[package]] name = "object" -version = "0.32.2" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" dependencies = [ "memchr", ] @@ -2414,9 +2437,9 @@ checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" [[package]] name = "opaque-debug" -version = "0.3.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openapitor" @@ -2430,8 +2453,8 @@ dependencies = [ "data-encoding", "format_serde_error", "futures-util", - "http 0.2.12", - "indexmap 2.2.5", + "http 0.2.9", + "indexmap 2.2.2", "json-patch", "log", "mime_guess", @@ -2449,7 +2472,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "serde_yaml 0.9.33", + "serde_yaml 0.9.25", "slog", "slog-async", "slog-json", @@ -2463,22 +2486,22 @@ dependencies = [ [[package]] name = "openapiv3" -version = "1.0.4" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b83630305ecc3355e998ddd2f926f98aae8e105eb42652174a58757851ba47" +checksum = "75e56d5c441965b6425165b7e3223cc933ca469834f4a8b4786817a1f9dc4f13" dependencies = [ - "indexmap 1.9.3", + "indexmap 2.2.2", "serde", "serde_json", ] [[package]] name = "openssl" -version = "0.10.64" +version = "0.10.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +checksum = "8cde4d2d9200ad5909f8dac647e29482e07c3a35de8a13fce7c9c7747ad9f671" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.4.1", "cfg-if", "foreign-types", "libc", @@ -2495,7 +2518,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -2506,9 +2529,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.101" +version = "0.9.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dda2b0f344e78efc2facf7d195d098df0dd72151b26ab98da807afc26c198dff" +checksum = "c1665caf8ab2dc9aef43d1c0023bd904633a6a05cb30b0ad59bec2ae986e57a7" dependencies = [ "cc", "libc", @@ -2652,7 +2675,7 @@ dependencies = [ "regex", "regex-syntax 0.7.5", "structmeta 0.2.0", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -2666,7 +2689,7 @@ dependencies = [ "regex", "regex-syntax 0.8.2", "structmeta 0.3.0", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -2675,7 +2698,7 @@ version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b8fcc794035347fb64beda2d3b462595dd2753e3f268d89c5aae77e8cf2c310" dependencies = [ - "base64 0.21.7", + "base64 0.21.5", "serde", ] @@ -2690,9 +2713,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "phonenumber" @@ -2703,7 +2726,7 @@ dependencies = [ "bincode", "either", "fnv", - "itertools 0.11.0", + "itertools 0.10.5", "lazy_static", "nom", "quick-xml", @@ -2717,22 +2740,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -2759,9 +2782,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" [[package]] name = "platforms" @@ -2775,7 +2798,7 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" dependencies = [ - "num-traits 0.2.18", + "num-traits 0.2.17", "plotters-backend", "plotters-svg", "wasm-bindgen", @@ -2799,9 +2822,9 @@ dependencies = [ [[package]] name = "png" -version = "0.17.13" +version = "0.17.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" +checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -2812,9 +2835,9 @@ dependencies = [ [[package]] name = "polyval" -version = "0.6.2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +checksum = "d52cff9d1d4dee5fe6d03729099f4a310a41179e0a10dbf542039873f2e826fb" dependencies = [ "cfg-if", "cpufeatures", @@ -2979,9 +3002,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.9.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" dependencies = [ "either", "rayon-core", @@ -2989,9 +3012,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -3028,6 +3051,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "redox_syscall" version = "0.4.1" @@ -3039,12 +3071,12 @@ dependencies = [ [[package]] name = "redox_users" -version = "0.4.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ "getrandom", - "libredox", + "redox_syscall 0.2.16", "thiserror", ] @@ -3062,9 +3094,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick", "memchr", @@ -3107,13 +3139,13 @@ version = "0.11.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78bf93c4af7a8bb7d879d51cebe797356ff10ae8516ace542b5182d9dcac10b2" dependencies = [ - "base64 0.21.7", + "base64 0.21.5", "bytes", "encoding_rs", "futures-core", "futures-util", "h2", - "http 0.2.12", + "http 0.2.9", "http-body", "hyper", "hyper-rustls", @@ -3127,8 +3159,8 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.10", - "rustls-pemfile 1.0.4", + "rustls 0.21.8", + "rustls-pemfile 1.0.3", "serde", "serde_json", "serde_urlencoded", @@ -3162,13 +3194,13 @@ dependencies = [ [[package]] name = "reqwest-middleware" -version = "0.2.5" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a735987236a8e238bf0296c7e351b999c188ccc11477f311b82b55c93984216" +checksum = "88a3e86aa6053e59030e7ce2d2a3b258dd08fc2d337d52f73f6cb480f5858690" dependencies = [ "anyhow", "async-trait", - "http 0.2.12", + "http 0.2.9", "reqwest", "serde", "task-local-extensions", @@ -3186,7 +3218,7 @@ dependencies = [ "chrono", "futures", "getrandom", - "http 0.2.12", + "http 0.2.9", "hyper", "parking_lot 0.11.2", "reqwest", @@ -3200,9 +3232,9 @@ dependencies = [ [[package]] name = "reqwest-tracing" -version = "0.4.8" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190838e54153d7a7e2ea98851304b3ce92daeabf14c54d32b01b84a3e636f683" +checksum = "14b1e66540e0cac90acadaf7109bf99c90d95abcc94b4c096bfa16a2d7aa7a71" dependencies = [ "anyhow", "async-trait", @@ -3254,17 +3286,16 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.8" +version = "0.17.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" dependencies = [ "cc", - "cfg-if", "getrandom", "libc", "spin 0.9.8", "untrusted 0.9.0", - "windows-sys 0.52.0", + "windows-sys 0.48.0", ] [[package]] @@ -3279,9 +3310,9 @@ dependencies = [ [[package]] name = "rtcp" -version = "0.10.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33648a781874466a62d89e265fee9f17e32bc7d05a256e6cca41bf97eadcd8aa" +checksum = "3677908cadfbecb4cc1da9a56a32524fae4ebdfa7c2ea93886e1b1e846488cb9" dependencies = [ "bytes", "thiserror", @@ -3301,19 +3332,6 @@ dependencies = [ "webrtc-util", ] -[[package]] -name = "rtp" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47fca9bd66ae0b1f3f649b8f5003d6176433d7293b78b0fce7e1031816bdd99d" -dependencies = [ - "bytes", - "rand 0.8.5", - "serde", - "thiserror", - "webrtc-util", -] - [[package]] name = "rustc-demangle" version = "0.1.23" @@ -3353,25 +3371,25 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.31" +version = "0.38.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.4.1", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.48.0", ] [[package]] name = "rustls" -version = "0.21.10" +version = "0.21.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" dependencies = [ "log", - "ring 0.17.8", + "ring 0.17.5", "rustls-webpki 0.101.7", "sct", ] @@ -3383,7 +3401,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" dependencies = [ "log", - "ring 0.17.8", + "ring 0.17.5", "rustls-pki-types", "rustls-webpki 0.102.2", "subtle", @@ -3397,7 +3415,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" dependencies = [ "openssl-probe", - "rustls-pemfile 2.1.1", + "rustls-pemfile 2.0.0", "rustls-pki-types", "schannel", "security-framework", @@ -3405,28 +3423,28 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "1.0.4" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" dependencies = [ - "base64 0.21.7", + "base64 0.21.5", ] [[package]] name = "rustls-pemfile" -version = "2.1.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f48172685e6ff52a556baa527774f61fcaa884f59daf3375c62a3f1cd2549dab" +checksum = "35e4980fa29e4c4b212ffb3db068a564cbf560e51d3944b7c88bd8bf5bec64f4" dependencies = [ - "base64 0.21.7", + "base64 0.21.5", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.3.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ede67b28608b4c60685c7d54122d4400d90f62b40caee7700e700380a390fa8" +checksum = "0a716eb65e3158e90e17cd93d855216e27bde02745ab842f2cab4a39dba1bacf" [[package]] name = "rustls-webpki" @@ -3434,7 +3452,7 @@ version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.8", + "ring 0.17.5", "untrusted 0.9.0", ] @@ -3444,7 +3462,7 @@ version = "0.102.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" dependencies = [ - "ring 0.17.8", + "ring 0.17.5", "rustls-pki-types", "untrusted 0.9.0", ] @@ -3457,9 +3475,9 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "same-file" @@ -3472,11 +3490,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.48.0", ] [[package]] @@ -3520,15 +3538,15 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.8", + "ring 0.17.5", "untrusted 0.9.0", ] [[package]] name = "sdp" -version = "0.6.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af90731e1f1150eb1740e35f9832958832a893965b632adc7ad27086077e24c7" +checksum = "4653054c30ebce63658762eb0d64e27673868a95564474811ae6c220cf767640" dependencies = [ "rand 0.8.5", "substring", @@ -3575,9 +3593,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.22" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" [[package]] name = "serde" @@ -3590,9 +3608,9 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.14" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" +checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" dependencies = [ "serde", ] @@ -3605,7 +3623,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -3625,7 +3643,7 @@ version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ - "indexmap 2.2.5", + "indexmap 2.2.2", "itoa", "ryu", "serde", @@ -3633,20 +3651,20 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.18" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" +checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] name = "serde_spanned" -version = "0.6.5" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" dependencies = [ "serde", ] @@ -3660,7 +3678,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -3689,11 +3707,11 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.9.33" +version = "0.9.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0623d197252096520c6f2a5e1171ee436e5af99a5d7caa2891e55e61950e6d9" +checksum = "1a49e178e4452f45cb61d0cd8cebc1b0fafd3e41929e996cef79aa3aca91f574" dependencies = [ - "indexmap 2.2.5", + "indexmap 2.2.2", "itoa", "ryu", "serde", @@ -3758,9 +3776,9 @@ checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "similar" -version = "2.4.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32fea41aca09ee824cc9724996433064c89f7777e60762749a4170a14abbfa21" +checksum = "2aeaf503862c419d66959f5d7ca015337d864e9c49485d771b732e2a20453597" [[package]] name = "slab" @@ -3825,11 +3843,11 @@ dependencies = [ [[package]] name = "slog-term" -version = "2.9.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6e022d0b998abfe5c3782c1f03551a596269450ccd677ea51c56f8b214610e8" +checksum = "87d29185c55b7b258b4f120eab00f48557d4d9bc814f41713f449d35b0f8977c" dependencies = [ - "is-terminal", + "atty", "slog", "term", "thread_local", @@ -3838,27 +3856,37 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" [[package]] name = "smol_str" -version = "0.2.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6845563ada680337a52d43bb0b29f396f2d911616f6573012645b9e3d048a49" +checksum = "74212e6bbe9a4352329b2f68ba3130c15a3f26fe88ff22dbdc6cdd58fa85e99c" dependencies = [ "serde", ] [[package]] name = "socket2" -version = "0.5.6" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socket2" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.48.0", ] [[package]] @@ -3907,7 +3935,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive 0.2.0", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -3919,7 +3947,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive 0.3.0", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -3930,7 +3958,7 @@ checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -3941,7 +3969,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -3959,7 +3987,7 @@ version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ - "heck 0.4.1", + "heck", "proc-macro2", "quote", "rustversion", @@ -3968,16 +3996,16 @@ dependencies = [ [[package]] name = "stun" -version = "0.5.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3f371788132e9d623e6eab4ba28aac083763a4133f045e6ebaee5ceb869803d" +checksum = "7beb1624a3ea34778d58d30e2b8606b4d29fe65e87c4d50b87ed30afd5c3830c" dependencies = [ - "base64 0.21.7", + "base64 0.21.5", "crc", "lazy_static", "md-5", "rand 0.8.5", - "ring 0.17.8", + "ring 0.16.20", "subtle", "thiserror", "tokio", @@ -4013,9 +4041,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.53" +version = "2.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" +checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" dependencies = [ "proc-macro2", "quote", @@ -4042,13 +4070,14 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "285ba80e733fac80aa4270fbcdf83772a79b80aa35c97075320abfee4a915b06" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", + "unicode-xid", ] [[package]] @@ -4089,7 +4118,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c138f99377e5d653a371cdad263615634cfc8467685dfe8e73e2b8e98f44b17" dependencies = [ - "heck 0.4.1", + "heck", "proc-macro-error", "proc-macro2", "quote", @@ -4119,14 +4148,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.10.1" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" dependencies = [ "cfg-if", "fastrand", + "redox_syscall 0.3.5", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.48.0", ] [[package]] @@ -4142,9 +4172,9 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.4.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" dependencies = [ "winapi-util", ] @@ -4161,29 +4191,29 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.58" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.58" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] name = "thread_local" -version = "1.1.8" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" dependencies = [ "cfg-if", "once_cell", @@ -4191,9 +4221,9 @@ dependencies = [ [[package]] name = "tiff" -version = "0.9.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +checksum = "6d172b0f4d3fba17ba89811858b9d3d97f928aece846475bbda076ca46736211" dependencies = [ "flate2", "jpeg-decoder", @@ -4202,13 +4232,14 @@ dependencies = [ [[package]] name = "time" -version = "0.3.34" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" dependencies = [ "deranged", "itoa", - "num-conv", + "libc", + "num_threads", "powerfmt", "serde", "time-core", @@ -4223,11 +4254,10 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.17" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" dependencies = [ - "num-conv", "time-core", ] @@ -4270,7 +4300,7 @@ dependencies = [ "parking_lot 0.12.1", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.5.5", "tokio-macros", "windows-sys 0.48.0", ] @@ -4283,7 +4313,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -4302,7 +4332,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.10", + "rustls 0.21.8", "tokio", ] @@ -4335,9 +4365,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d" dependencies = [ "bytes", "futures-core", @@ -4349,9 +4379,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.12" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +checksum = "2ef75d881185fd2df4a040793927c153d863651108a93c7e17a9e591baa95cc6" dependencies = [ "serde", "serde_spanned", @@ -4370,15 +4400,15 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.8" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c12219811e0c1ba077867254e5ad62ee2c9c190b0d957110750ac0cda1ae96cd" +checksum = "380f9e8120405471f7c9ad1860a713ef5ece6a670c7eae39225e477340f32fc4" dependencies = [ - "indexmap 2.2.5", + "indexmap 2.2.2", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.5", + "winnow", ] [[package]] @@ -4446,7 +4476,7 @@ checksum = "84fd902d4e0b9a4b27f2f440108dc034e1758628a9b702f8ec61ad66355422fa" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -4474,7 +4504,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -4534,9 +4564,9 @@ dependencies = [ [[package]] name = "try-lock" -version = "0.2.5" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "ts-rs" @@ -4558,7 +4588,7 @@ dependencies = [ "Inflector", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", "termcolor", ] @@ -4571,7 +4601,7 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http 1.1.0", + "http 1.0.0", "httparse", "log", "rand 0.8.5", @@ -4585,21 +4615,20 @@ dependencies = [ [[package]] name = "turn" -version = "0.7.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb2ac4f331064513ad510b7a36edc0df555bd61672986607f7c9ff46f98f415" +checksum = "58f4fcb97da0426e8146fe0e9b78cc13120161087256198701d12d9df77f7701" dependencies = [ "async-trait", - "base64 0.21.7", + "base64 0.21.5", "futures", "log", "md-5", "rand 0.8.5", - "ring 0.17.8", + "ring 0.16.20", "stun", "thiserror", "tokio", - "tokio-util", "webrtc-util", ] @@ -4632,9 +4661,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" @@ -4644,18 +4673,18 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.23" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.11.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" [[package]] name = "unicode-width" @@ -4681,9 +4710,9 @@ dependencies = [ [[package]] name = "unsafe-libyaml" -version = "0.2.11" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" +checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" [[package]] name = "untrusted" @@ -4699,9 +4728,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" dependencies = [ "form_urlencoded", "idna", @@ -4723,9 +4752,9 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" -version = "1.8.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" +checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" dependencies = [ "atomic", "getrandom", @@ -4762,9 +4791,9 @@ dependencies = [ [[package]] name = "walkdir" -version = "2.5.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" dependencies = [ "same-file", "winapi-util", @@ -4806,7 +4835,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", "wasm-bindgen-shared", ] @@ -4841,7 +4870,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4918,9 +4947,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.4" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" [[package]] name = "webrtc" @@ -4941,8 +4970,8 @@ dependencies = [ "regex", "ring 0.16.20", "rtcp", - "rtp 0.9.0", - "rustls 0.21.10", + "rtp", + "rustls 0.21.8", "sdp", "serde", "serde_json", @@ -4967,9 +4996,9 @@ dependencies = [ [[package]] name = "webrtc-data" -version = "0.8.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c08e648e10572b9edbe741074e0f4d3cb221aa7cdf9a814ee71606de312f33" +checksum = "a45d2461d0e0bf93f181e30eb0b40df32b8bf3efb89c53cebb1990e603e2067d" dependencies = [ "bytes", "log", @@ -5002,7 +5031,7 @@ dependencies = [ "rand_core 0.6.4", "rcgen", "ring 0.16.20", - "rustls 0.21.10", + "rustls 0.21.8", "sec1", "serde", "sha1", @@ -5017,9 +5046,9 @@ dependencies = [ [[package]] name = "webrtc-ice" -version = "0.10.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1bbd6b3dea22cc6e961e22b012e843d8869e2ac8e76b96e54d4a25e311857ad" +checksum = "66eb4b85646f1c52225779db3e1e7e873dede6db68cc9be080b648f1713083a3" dependencies = [ "arc-swap", "async-trait", @@ -5041,12 +5070,12 @@ dependencies = [ [[package]] name = "webrtc-mdns" -version = "0.6.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce981f93104a8debb3563bb0cedfe4aa2f351fdf6b53f346ab50009424125c08" +checksum = "62bebbd40e7f8b630a0f1a74783dbfff1edfc0ccaae891c4689891156a8c4d8c" dependencies = [ "log", - "socket2", + "socket2 0.5.5", "thiserror", "tokio", "webrtc-util", @@ -5054,22 +5083,22 @@ dependencies = [ [[package]] name = "webrtc-media" -version = "0.7.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "280017b6b9625ef7329146332518b339c3cceff231cc6f6a9e0e6acab25ca4af" +checksum = "1cfde3c7b9450b67d466bb2f02c6d9ff9514d33535eb9994942afd1f828839d1" dependencies = [ "byteorder", "bytes", "rand 0.8.5", - "rtp 0.10.0", + "rtp", "thiserror", ] [[package]] name = "webrtc-sctp" -version = "0.9.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df75ec042002fe995194712cbeb2029107a60a7eab646f1b789eb1be94d0e367" +checksum = "1af6116b7f9703560c3ad0b32f67220b171bb1b59633b03563db8404d0e482ea" dependencies = [ "arc-swap", "async-trait", @@ -5097,7 +5126,7 @@ dependencies = [ "hmac", "log", "rtcp", - "rtp 0.9.0", + "rtp", "sha1", "subtle", "thiserror", @@ -5107,13 +5136,14 @@ dependencies = [ [[package]] name = "webrtc-util" -version = "0.8.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e85154ef743d9a2a116d104faaaa82740a281b8b4bed5ee691a2df6c133d873" +checksum = "1adc96bee68417e1f4d19dd7698124a7f859db55ae2fd3eedbbb7e732f614735" dependencies = [ "async-trait", "bitflags 1.3.2", "bytes", + "cc", "ipnet", "lazy_static", "libc", @@ -5168,7 +5198,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", ] [[package]] @@ -5181,12 +5220,18 @@ dependencies = [ ] [[package]] -name = "windows-sys" -version = "0.52.0" +name = "windows-targets" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" dependencies = [ - "windows-targets 0.52.4", + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", ] [[package]] @@ -5206,19 +5251,25 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.4" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" dependencies = [ - "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", + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -5227,9 +5278,15 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.4" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" @@ -5239,9 +5296,15 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.4" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" @@ -5251,9 +5314,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.4" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_i686_msvc" @@ -5263,9 +5332,15 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.4" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" @@ -5275,9 +5350,15 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.4" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_gnullvm" @@ -5287,9 +5368,15 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.4" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" @@ -5299,9 +5386,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.4" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winnow" @@ -5312,15 +5399,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winnow" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" -dependencies = [ - "memchr", -] - [[package]] name = "winreg" version = "0.50.0" @@ -5342,9 +5420,9 @@ dependencies = [ [[package]] name = "x25519-dalek" -version = "2.0.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" +checksum = "fb66477291e7e8d2b0ff1bcb900bf29489a9692816d79874bea351e7a8b6de96" dependencies = [ "curve25519-dalek", "rand_core 0.6.4", @@ -5396,22 +5474,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "1c4061bedbb353041c12f413700357bec76df2c7e2ca8e4df8bac24c6bf68e3d" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] @@ -5431,7 +5509,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.52", ] [[package]] diff --git a/src/wasm-lib/grackle/Cargo.toml b/src/wasm-lib/grackle/Cargo.toml index af08170e27..586900bddf 100644 --- a/src/wasm-lib/grackle/Cargo.toml +++ b/src/wasm-lib/grackle/Cargo.toml @@ -6,7 +6,6 @@ description = "A new executor for KCL which compiles to Execution Plans" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -image = { version = "0.24.7", default-features = false, features = ["png"] } kcl-lib = { path = "../kcl" } kittycad = { workspace = true } kittycad-execution-plan = { workspace = true } @@ -16,7 +15,6 @@ kittycad-modeling-cmds = { workspace = true } kittycad-modeling-session = { workspace = true } thiserror = "1.0.57" tokio = { version = "1.36.0", features = ["macros", "rt"] } -twenty-twenty = "0.7.0" uuid = "1.7" [dev-dependencies] diff --git a/src/wasm-lib/grackle/fixtures/cube_lineTo.png b/src/wasm-lib/grackle/fixtures/cube_lineTo.png deleted file mode 100644 index 6450d6688a5d6fa205a29a5473825f5ba9dc574f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82261 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 diff --git a/src/wasm-lib/grackle/fixtures/cube_xyLine.png b/src/wasm-lib/grackle/fixtures/cube_xyLine.png deleted file mode 100644 index 2a04bd115ec015c527a47baa070d699e54f449f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82740 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 diff --git a/src/wasm-lib/grackle/src/binding_scope.rs b/src/wasm-lib/grackle/src/binding_scope.rs index 465b1b1b0d..b383d538a8 100644 --- a/src/wasm-lib/grackle/src/binding_scope.rs +++ b/src/wasm-lib/grackle/src/binding_scope.rs @@ -113,26 +113,6 @@ impl BindingScope { "lineTo".into(), EpBinding::from(KclFunction::LineTo(native_functions::sketch::LineTo)), ), - ( - "line".into(), - EpBinding::from(KclFunction::Line(native_functions::sketch::Line)), - ), - ( - "xLineTo".into(), - EpBinding::from(KclFunction::XLineTo(native_functions::sketch::XLineTo)), - ), - ( - "xLine".into(), - EpBinding::from(KclFunction::XLine(native_functions::sketch::XLine)), - ), - ( - "yLineTo".into(), - EpBinding::from(KclFunction::YLineTo(native_functions::sketch::YLineTo)), - ), - ( - "yLine".into(), - EpBinding::from(KclFunction::YLine(native_functions::sketch::YLine)), - ), ( "extrude".into(), EpBinding::from(KclFunction::Extrude(native_functions::sketch::Extrude)), diff --git a/src/wasm-lib/grackle/src/error.rs b/src/wasm-lib/grackle/src/error.rs index 33a70447d0..143d194545 100644 --- a/src/wasm-lib/grackle/src/error.rs +++ b/src/wasm-lib/grackle/src/error.rs @@ -76,7 +76,7 @@ impl From for Error { ) -> Self { Self::Execution { error, - instruction: instruction.expect("no instruction"), + instruction, instruction_index, } } diff --git a/src/wasm-lib/grackle/src/lib.rs b/src/wasm-lib/grackle/src/lib.rs index 189f68b79e..40beaa5114 100644 --- a/src/wasm-lib/grackle/src/lib.rs +++ b/src/wasm-lib/grackle/src/lib.rs @@ -262,11 +262,6 @@ impl Planner { KclFunction::StartSketchAt(f) => f.call(&mut ctx, args)?, KclFunction::Extrude(f) => f.call(&mut ctx, args)?, KclFunction::LineTo(f) => f.call(&mut ctx, args)?, - KclFunction::Line(f) => f.call(&mut ctx, args)?, - KclFunction::XLineTo(f) => f.call(&mut ctx, args)?, - KclFunction::XLine(f) => f.call(&mut ctx, args)?, - KclFunction::YLineTo(f) => f.call(&mut ctx, args)?, - KclFunction::YLine(f) => f.call(&mut ctx, args)?, KclFunction::Add(f) => f.call(&mut ctx, args)?, KclFunction::Close(f) => f.call(&mut ctx, args)?, KclFunction::UserDefined(f) => { @@ -636,11 +631,6 @@ enum KclFunction { Id(native_functions::Id), StartSketchAt(native_functions::sketch::StartSketchAt), LineTo(native_functions::sketch::LineTo), - Line(native_functions::sketch::Line), - XLineTo(native_functions::sketch::XLineTo), - XLine(native_functions::sketch::XLine), - YLineTo(native_functions::sketch::YLineTo), - YLine(native_functions::sketch::YLine), Add(native_functions::Add), UserDefined(UserDefinedFunction), Extrude(native_functions::sketch::Extrude), diff --git a/src/wasm-lib/grackle/src/native_functions/sketch.rs b/src/wasm-lib/grackle/src/native_functions/sketch.rs index 5ae32403f9..6394d6df0e 100644 --- a/src/wasm-lib/grackle/src/native_functions/sketch.rs +++ b/src/wasm-lib/grackle/src/native_functions/sketch.rs @@ -3,4 +3,4 @@ pub mod helpers; pub mod stdlib_functions; -pub use stdlib_functions::{Close, Extrude, Line, LineTo, StartSketchAt, XLine, XLineTo, YLine, YLineTo}; +pub use stdlib_functions::{Close, Extrude, LineTo, StartSketchAt}; diff --git a/src/wasm-lib/grackle/src/native_functions/sketch/helpers.rs b/src/wasm-lib/grackle/src/native_functions/sketch/helpers.rs index 258314b2b8..58b377aabf 100644 --- a/src/wasm-lib/grackle/src/native_functions/sketch/helpers.rs +++ b/src/wasm-lib/grackle/src/native_functions/sketch/helpers.rs @@ -139,7 +139,7 @@ pub fn sequence_binding( } } -/// Extract a 2D point from an argument to a KCL Function. +/// Extract a 2D point from an argument to a Cabble. pub fn arg_point2d( arg: EpBinding, fn_name: &'static str, @@ -148,7 +148,7 @@ pub fn arg_point2d( arg_number: usize, ) -> Result { let expected = "2D point (array with length 2)"; - let elements = sequence_binding(arg, fn_name, "an array of length 2", arg_number)?; + let elements = sequence_binding(arg, "startSketchAt", "an array of length 2", arg_number)?; if elements.len() != 2 { return Err(CompileError::ArgWrongType { fn_name, @@ -165,12 +165,12 @@ pub fn arg_point2d( let start_z = start + 2; instructions.extend([ Instruction::Copy { - source: single_binding(elements[0].clone(), fn_name, "number", arg_number)?, + source: single_binding(elements[0].clone(), "startSketchAt", "number", arg_number)?, destination: Destination::Address(start_x), length: 1, }, Instruction::Copy { - source: single_binding(elements[1].clone(), fn_name, "number", arg_number)?, + source: single_binding(elements[1].clone(), "startSketchAt", "number", arg_number)?, destination: Destination::Address(start_y), length: 1, }, diff --git a/src/wasm-lib/grackle/src/native_functions/sketch/stdlib_functions.rs b/src/wasm-lib/grackle/src/native_functions/sketch/stdlib_functions.rs index a00802e5a1..d9f6dd18e5 100644 --- a/src/wasm-lib/grackle/src/native_functions/sketch/stdlib_functions.rs +++ b/src/wasm-lib/grackle/src/native_functions/sketch/stdlib_functions.rs @@ -1,7 +1,7 @@ use kittycad_execution_plan::{ api_request::ApiRequest, sketch_types::{self, Axes, BasePath, Plane, SketchGroup}, - BinaryArithmetic, BinaryOperation, Destination, Instruction, Operand, + Destination, Instruction, }; use kittycad_execution_plan_traits::{Address, InMemory, Primitive, Value}; use kittycad_modeling_cmds::{ @@ -13,22 +13,6 @@ use uuid::Uuid; use super::helpers::{arg_point2d, no_arg_api_call, sg_binding, single_binding, stack_api_call}; use crate::{binding_scope::EpBinding, error::CompileError, native_functions::Callable, EvalPlan}; -#[derive(PartialEq)] -pub enum At { - RelativeXY, - AbsoluteXY, - RelativeX, - AbsoluteX, - RelativeY, - AbsoluteY, -} - -impl At { - pub fn is_relative(&self) -> bool { - *self == At::RelativeX || *self == At::RelativeY || *self == At::RelativeXY - } -} - #[derive(Debug, Clone)] #[cfg_attr(test, derive(Eq, PartialEq))] pub struct Close; @@ -156,124 +140,25 @@ impl Callable for LineTo { &self, ctx: &mut crate::native_functions::Context<'_>, args: Vec, - ) -> Result { - LineBare::call(ctx, "lineTo", args, LineBareOptions { at: At::AbsoluteXY }) - } -} - -#[derive(Debug, Clone)] -#[cfg_attr(test, derive(Eq, PartialEq))] -pub struct Line; - -impl Callable for Line { - fn call( - &self, - ctx: &mut crate::native_functions::Context<'_>, - args: Vec, - ) -> Result { - LineBare::call(ctx, "line", args, LineBareOptions { at: At::RelativeXY }) - } -} - -#[derive(Debug, Clone)] -#[cfg_attr(test, derive(Eq, PartialEq))] -pub struct XLineTo; - -impl Callable for XLineTo { - fn call( - &self, - ctx: &mut crate::native_functions::Context<'_>, - args: Vec, - ) -> Result { - LineBare::call(ctx, "xLineTo", args, LineBareOptions { at: At::AbsoluteX }) - } -} - -#[derive(Debug, Clone)] -#[cfg_attr(test, derive(Eq, PartialEq))] -pub struct XLine; - -impl Callable for XLine { - fn call( - &self, - ctx: &mut crate::native_functions::Context<'_>, - args: Vec, - ) -> Result { - LineBare::call(ctx, "xLine", args, LineBareOptions { at: At::RelativeX }) - } -} - -#[derive(Debug, Clone)] -#[cfg_attr(test, derive(Eq, PartialEq))] -pub struct YLineTo; - -impl Callable for YLineTo { - fn call( - &self, - ctx: &mut crate::native_functions::Context<'_>, - args: Vec, - ) -> Result { - LineBare::call(ctx, "yLineTo", args, LineBareOptions { at: At::AbsoluteY }) - } -} - -#[derive(Debug, Clone)] -#[cfg_attr(test, derive(Eq, PartialEq))] -pub struct YLine; - -impl Callable for YLine { - fn call( - &self, - ctx: &mut crate::native_functions::Context<'_>, - args: Vec, - ) -> Result { - LineBare::call(ctx, "yLine", args, LineBareOptions { at: At::RelativeY }) - } -} - -#[derive(Debug, Clone)] -#[cfg_attr(test, derive(Eq, PartialEq))] -/// Exposes all the possible arguments the `line` modeling command can take. -/// Reduces code for the other line functions needed. -/// We do not expose this to the developer since it does not align with -/// the documentation (there is no "lineBare"). -pub struct LineBare; - -/// Used to configure the call to handle different line variants. -pub struct LineBareOptions { - /// Where to start coordinates at, ex: At::RelativeXY. - at: At, -} - -impl LineBare { - fn call( - ctx: &mut crate::native_functions::Context<'_>, - fn_name: &'static str, - args: Vec, - opts: LineBareOptions, ) -> Result { let mut instructions = Vec::new(); - - let required = 2; - + let fn_name = "lineTo"; + // Get both required params. let mut args_iter = args.into_iter(); - let Some(to) = args_iter.next() else { return Err(CompileError::NotEnoughArgs { fn_name: fn_name.into(), - required, - actual: args_iter.count(), + required: 2, + actual: 0, }); }; - let Some(sketch_group) = args_iter.next() else { return Err(CompileError::NotEnoughArgs { fn_name: fn_name.into(), - required, - actual: args_iter.count(), + required: 2, + actual: 1, }); }; - let tag = match args_iter.next() { Some(a) => a, None => { @@ -286,90 +171,26 @@ impl LineBare { EpBinding::Single(empty_string_addr) } }; - // Check the type of required params. - // We don't check `to` here because it can take on either a - // EpBinding::Sequence or EpBinding::Single. - + let to = arg_point2d(to, fn_name, &mut instructions, ctx, 0)?; let sg = sg_binding(sketch_group, fn_name, "sketch group", 1)?; let tag = single_binding(tag, fn_name, "string tag", 2)?; let id = Uuid::new_v4(); - // Start of the path segment (which is a straight line). let length_of_3d_point = Point3d::::default().into_parts().len(); let start_of_line = ctx.next_address.offset_by(1); - // Reserve space for the line's end, and the `relative: bool` field. ctx.next_address.offset_by(length_of_3d_point + 1); let new_sg_index = ctx.assign_sketch_group(); - - // Copy based on the options. - match opts { - LineBareOptions { at: At::AbsoluteXY, .. } | LineBareOptions { at: At::RelativeXY, .. } => { - // Push the `to` 2D point onto the stack. - let EpBinding::Sequence { elements, length_at: _ } = to.clone() else { - return Err(CompileError::InvalidOperand("Must pass a list of length 2")); - }; - let &[EpBinding::Single(el0), EpBinding::Single(el1)] = elements.as_slice() else { - return Err(CompileError::InvalidOperand("Must pass a sequence here.")); - }; - instructions.extend([ - Instruction::Copy { - // X - source: el0, - length: 1, - destination: Destination::StackPush, - }, - Instruction::Copy { - // Y - source: el1, - length: 1, - destination: Destination::StackExtend, - }, - Instruction::StackExtend { data: vec![0.0.into()] }, // Z - ]); - } - LineBareOptions { at: At::AbsoluteX, .. } | LineBareOptions { at: At::RelativeX, .. } => { - let EpBinding::Single(addr) = to else { - return Err(CompileError::InvalidOperand("Must pass a single value here.")); - }; - instructions.extend([ - Instruction::Copy { - // X - source: addr, - length: 1, - destination: Destination::StackPush, - }, - Instruction::StackExtend { - data: vec![Primitive::from(0.0)], - }, // Y - Instruction::StackExtend { - data: vec![Primitive::from(0.0)], - }, // Z - ]); - } - LineBareOptions { at: At::AbsoluteY, .. } | LineBareOptions { at: At::RelativeY, .. } => { - let EpBinding::Single(addr) = to else { - return Err(CompileError::InvalidOperand("Must pass a single value here.")); - }; - instructions.extend([ - Instruction::StackPush { - data: vec![Primitive::from(0.0)], - }, // X - Instruction::Copy { - // Y - source: addr, - length: 1, - destination: Destination::StackExtend, - }, - Instruction::StackExtend { - data: vec![Primitive::from(0.0)], - }, // Z - ]); - } - } - instructions.extend([ + // Push the `to` 2D point onto the stack. + Instruction::Copy { + source: to, + length: 2, + destination: Destination::StackPush, + }, + // Make it a 3D point. + Instruction::StackExtend { data: vec![0.0.into()] }, // Append the new path segment to memory. // First comes its tag. Instruction::SetPrimitive { @@ -383,7 +204,7 @@ impl LineBare { // Then its `relative` field. Instruction::SetPrimitive { address: start_of_line + 1 + length_of_3d_point, - value: opts.at.is_relative().into(), + value: false.into(), }, // Push the path ID onto the stack. Instruction::SketchGroupCopyFrom { @@ -410,159 +231,16 @@ impl LineBare { data: vec![Primitive::from("ToPoint".to_owned())], }, // `BasePath::from` point. - // Place them in the secondary stack to prepare ToPoint structure. Instruction::SketchGroupGetLastPoint { source: sg, destination: Destination::StackExtend, }, - ]); - - // Reserve space for the segment last point - let to_point_from = ctx.next_address.offset_by(2); - - instructions.extend([ - // Copy to the primary stack as well to be worked with. - Instruction::SketchGroupGetLastPoint { - source: sg, - destination: Destination::Address(to_point_from), + // `BasePath::to` point. + Instruction::Copy { + source: start_of_line + 1, + length: 2, + destination: Destination::StackExtend, }, - ]); - - // `BasePath::to` point. - - // The copy here depends on the incoming `to` data. - // Sometimes it's a list, sometimes it's single datum. - // And the relative/not relative matters. When relative, we need to - // copy coords from `from` into the new `to` coord that don't change. - // At least everything else can be built up from these "primitives". - if let EpBinding::Sequence { elements, length_at: _ } = to.clone() { - if let &[EpBinding::Single(el0), EpBinding::Single(el1)] = elements.as_slice() { - match opts { - // ToPoint { from: { x1, y1 }, to: { x1 + x2, y1 + y2 } } - LineBareOptions { at: At::RelativeXY, .. } => { - instructions.extend([ - Instruction::BinaryArithmetic { - arithmetic: BinaryArithmetic { - operation: BinaryOperation::Add, - operand0: Operand::Reference(to_point_from + 0), - operand1: Operand::Reference(el0), - }, - destination: Destination::StackExtend, - }, - Instruction::BinaryArithmetic { - arithmetic: BinaryArithmetic { - operation: BinaryOperation::Add, - operand0: Operand::Reference(to_point_from + 1), - operand1: Operand::Reference(el1), - }, - destination: Destination::StackExtend, - }, - ]); - } - // ToPoint { from: { x1, y1 }, to: { x2, y2 } } - LineBareOptions { at: At::AbsoluteXY, .. } => { - // Otherwise just directly copy the new points. - instructions.extend([ - Instruction::Copy { - source: el0, - length: 1, - destination: Destination::StackExtend, - }, - Instruction::Copy { - source: el1, - length: 1, - destination: Destination::StackExtend, - }, - ]); - } - _ => { - return Err(CompileError::InvalidOperand( - "A Sequence with At::...X or At::...Y is not valid here. Must be At::...XY.", - )); - } - } - } - } else if let EpBinding::Single(addr) = to { - match opts { - // ToPoint { from: { x1, y1 }, to: { x1 + x2, y1 } } - LineBareOptions { at: At::RelativeX } => { - instructions.extend([ - Instruction::BinaryArithmetic { - arithmetic: BinaryArithmetic { - operation: BinaryOperation::Add, - operand0: Operand::Reference(to_point_from + 0), - operand1: Operand::Reference(addr), - }, - destination: Destination::StackExtend, - }, - Instruction::Copy { - source: to_point_from + 1, - length: 1, - destination: Destination::StackExtend, - }, - ]); - } - // ToPoint { from: { x1, y1 }, to: { x2, y1 } } - LineBareOptions { at: At::AbsoluteX } => { - instructions.extend([ - Instruction::Copy { - source: addr, - length: 1, - destination: Destination::StackExtend, - }, - Instruction::Copy { - source: to_point_from + 1, - length: 1, - destination: Destination::StackExtend, - }, - ]); - } - // ToPoint { from: { x1, y1 }, to: { x1, y1 + y2 } } - LineBareOptions { at: At::RelativeY } => { - instructions.extend([ - Instruction::Copy { - source: to_point_from + 0, - length: 1, - destination: Destination::StackExtend, - }, - Instruction::BinaryArithmetic { - arithmetic: BinaryArithmetic { - operation: BinaryOperation::Add, - operand0: Operand::Reference(to_point_from + 1), - operand1: Operand::Reference(addr), - }, - destination: Destination::StackExtend, - }, - ]); - } - // ToPoint { from: { x1, y1 }, to: { x1, y2 } } - LineBareOptions { at: At::AbsoluteY } => { - instructions.extend([ - Instruction::Copy { - source: to_point_from + 0, - length: 1, - destination: Destination::StackExtend, - }, - Instruction::Copy { - source: addr, - length: 1, - destination: Destination::StackExtend, - }, - ]); - } - _ => { - return Err(CompileError::InvalidOperand( - "A Single binding with At::...XY is not valid here.", - )); - } - } - } else { - return Err(CompileError::InvalidOperand( - "Must be a sequence or single value binding.", - )); - } - - instructions.extend([ // `BasePath::name` string. Instruction::Copy { source: tag, diff --git a/src/wasm-lib/grackle/src/tests.rs b/src/wasm-lib/grackle/src/tests.rs index 57604592f2..3902cd9d84 100644 --- a/src/wasm-lib/grackle/src/tests.rs +++ b/src/wasm-lib/grackle/src/tests.rs @@ -1048,10 +1048,14 @@ fn store_object_with_array_property() { /// Write the program's plan to the KCVM debugger's normal input file. #[allow(unused)] -fn kcvm_dbg(kcl_program: &str, path: &str) { +fn kcvm_dbg(kcl_program: &str) { let (plan, _scope, _) = must_plan(kcl_program); let plan_json = serde_json::to_string_pretty(&plan).unwrap(); - std::fs::write(path, plan_json).unwrap(); + std::fs::write( + "/Users/adamchalmers/kc-repos/modeling-api/execution-plan-debugger/test_input.json", + plan_json, + ) + .unwrap(); } #[tokio::test] @@ -1065,6 +1069,8 @@ async fn stdlib_cube_partial() { |> close(%) |> extrude(100.0, %) "#; + let (_plan, _scope, last_address) = must_plan(program); + assert_eq!(last_address, Address::ZERO + 66); let ast = kcl_lib::parser::Parser::new(kcl_lib::token::lexer(program)) .ast() .unwrap(); @@ -1107,115 +1113,23 @@ async fn stdlib_cube_partial() { }, ] ); - use kittycad_modeling_cmds::{each_cmd, ok_response::OkModelingCmdResponse, ImageFormat}; - let out = client - .unwrap() - .run_command( - uuid::Uuid::new_v4().into(), - kittycad_modeling_cmds::ModelingCmd::from(each_cmd::TakeSnapshot { - format: ImageFormat::Png, - }), - ) - .await - .unwrap(); - - let out = match out { - OkModelingCmdResponse::TakeSnapshot(kittycad_modeling_cmds::output::TakeSnapshot { contents: b }) => b, - other => panic!("wrong output: {other:?}"), - }; - - use image::io::Reader as ImageReader; - let img = ImageReader::new(std::io::Cursor::new(out)) - .with_guessed_format() - .unwrap() - .decode() - .unwrap(); - twenty_twenty::assert_image("fixtures/cube_lineTo.png", &img, 0.9999); -} - -#[tokio::test] -async fn stdlib_cube_xline_yline() { - let program = r#" - let cube = startSketchAt([0.0, 0.0], "adam") - |> xLine(210.0, %, "side0") - |> yLine(210.0, %, "side1") - |> xLine(-210.0, %, "side2") - |> yLine(-210.0, %, "side3") - |> close(%) - |> extrude(100.0, %) - "#; - kcvm_dbg( - program, - "/home/lee/Code/Zoo/modeling-api/execution-plan-debugger/cube_xyline.json", - ); - let (_plan, _scope, _last_address) = must_plan(program); - - let ast = kcl_lib::parser::Parser::new(kcl_lib::token::lexer(program)) - .ast() - .unwrap(); - let mut client = Some(test_client().await); - let mem = match crate::execute(ast, &mut client).await { - Ok(mem) => mem, - Err(e) => panic!("{e}"), - }; - let sg = &mem.sketch_groups.last().unwrap(); - assert_eq!( - sg.path_rest, - vec![ - sketch_types::PathSegment::ToPoint { - base: sketch_types::BasePath { - from: Point2d { x: 0.0, y: 0.0 }, - to: Point2d { x: 210.0, y: 0.0 }, - name: "side0".into(), - } - }, - sketch_types::PathSegment::ToPoint { - base: sketch_types::BasePath { - from: Point2d { x: 210.0, y: 0.0 }, - to: Point2d { x: 210.0, y: 210.0 }, - name: "side1".into(), - } - }, - sketch_types::PathSegment::ToPoint { - base: sketch_types::BasePath { - from: Point2d { x: 210.0, y: 210.0 }, - to: Point2d { x: 0.0, y: 210.0 }, - name: "side2".into(), - } - }, - sketch_types::PathSegment::ToPoint { - base: sketch_types::BasePath { - from: Point2d { x: 0.0, y: 210.0 }, - to: Point2d { x: 0.0, y: 0.0 }, - name: "side3".into(), - } - }, - ] - ); - use kittycad_modeling_cmds::{each_cmd, ok_response::OkModelingCmdResponse, ImageFormat}; - let out = client - .unwrap() - .run_command( - uuid::Uuid::new_v4().into(), - kittycad_modeling_cmds::ModelingCmd::from(each_cmd::TakeSnapshot { - format: ImageFormat::Png, - }), - ) - .await - .unwrap(); - - let out = match out { - OkModelingCmdResponse::TakeSnapshot(kittycad_modeling_cmds::output::TakeSnapshot { contents: b }) => b, - other => panic!("wrong output: {other:?}"), - }; - - use image::io::Reader as ImageReader; - let img = ImageReader::new(std::io::Cursor::new(out)) - .with_guessed_format() - .unwrap() - .decode() - .unwrap(); - twenty_twenty::assert_image("fixtures/cube_xyLine.png", &img, 0.9999); + // use kittycad_modeling_cmds::{each_cmd, ok_response::OkModelingCmdResponse, ImageFormat}; + // let out = client + // .unwrap() + // .run_command( + // uuid::Uuid::new_v4().into(), + // each_cmd::TakeSnapshot { + // format: ImageFormat::Png, + // }, + // ) + // .await + // .unwrap(); + // let out = match out { + // OkModelingCmdResponse::TakeSnapshot(b) => b, + // other => panic!("wrong output: {other:?}"), + // }; + // let out: Vec = out.contents.into(); + // std::fs::write("image.png", out).unwrap(); } async fn test_client() -> Session { From 5f55bd352f23f17f769cb3755daaaa09c711623a Mon Sep 17 00:00:00 2001 From: Adam Chalmers Date: Tue, 19 Mar 2024 15:01:12 -0500 Subject: [PATCH 2/2] Restore Lee's commit, without Cargo.lock changes --- .codespellrc | 2 +- src/wasm-lib/Cargo.lock | 23 +- src/wasm-lib/grackle/Cargo.toml | 2 + src/wasm-lib/grackle/fixtures/cube_lineTo.png | Bin 0 -> 82261 bytes src/wasm-lib/grackle/fixtures/cube_xyLine.png | Bin 0 -> 82740 bytes src/wasm-lib/grackle/src/binding_scope.rs | 20 + src/wasm-lib/grackle/src/error.rs | 2 +- src/wasm-lib/grackle/src/lib.rs | 10 + .../grackle/src/native_functions/sketch.rs | 2 +- .../src/native_functions/sketch/helpers.rs | 8 +- .../sketch/stdlib_functions.rs | 366 ++++++++++++++++-- src/wasm-lib/grackle/src/tests.rs | 136 +++++-- 12 files changed, 510 insertions(+), 61 deletions(-) create mode 100644 src/wasm-lib/grackle/fixtures/cube_lineTo.png create mode 100644 src/wasm-lib/grackle/fixtures/cube_xyLine.png diff --git a/.codespellrc b/.codespellrc index afecf2a1a4..be18a535ce 100644 --- a/.codespellrc +++ b/.codespellrc @@ -1,3 +1,3 @@ [codespell] -ignore-words-list: crate,everytime,inout,co-ordinate,ot,nwo +ignore-words-list: crate,everytime,inout,co-ordinate,ot,nwo,absolutey skip: **/target,node_modules,build,**/Cargo.lock diff --git a/src/wasm-lib/Cargo.lock b/src/wasm-lib/Cargo.lock index dd1fd8a0f5..23d59ceac4 100644 --- a/src/wasm-lib/Cargo.lock +++ b/src/wasm-lib/Cargo.lock @@ -1471,6 +1471,7 @@ dependencies = [ name = "grackle" version = "0.1.0" dependencies = [ + "image", "kcl-lib", "kittycad", "kittycad-execution-plan", @@ -1482,6 +1483,7 @@ dependencies = [ "serde_json", "thiserror", "tokio", + "twenty-twenty", "uuid", ] @@ -2007,7 +2009,7 @@ dependencies = [ [[package]] name = "kittycad-execution-plan" version = "0.1.0" -source = "git+https://github.com/KittyCAD/modeling-api?branch=main#4dfeb5c9ce2cc3fb853dd14cf948a922f3724ef4" +source = "git+https://github.com/KittyCAD/modeling-api?branch=main#494225aaac06fab77c4822e7dc48738ecca35392" dependencies = [ "bytes", "insta", @@ -2027,7 +2029,7 @@ dependencies = [ [[package]] name = "kittycad-execution-plan-macros" version = "0.1.9" -source = "git+https://github.com/KittyCAD/modeling-api?branch=main#4dfeb5c9ce2cc3fb853dd14cf948a922f3724ef4" +source = "git+https://github.com/KittyCAD/modeling-api?branch=main#494225aaac06fab77c4822e7dc48738ecca35392" dependencies = [ "proc-macro2", "quote", @@ -2037,7 +2039,7 @@ dependencies = [ [[package]] name = "kittycad-execution-plan-traits" version = "0.1.13" -source = "git+https://github.com/KittyCAD/modeling-api?branch=main#4dfeb5c9ce2cc3fb853dd14cf948a922f3724ef4" +source = "git+https://github.com/KittyCAD/modeling-api?branch=main#494225aaac06fab77c4822e7dc48738ecca35392" dependencies = [ "serde", "thiserror", @@ -2046,8 +2048,8 @@ dependencies = [ [[package]] name = "kittycad-modeling-cmds" -version = "0.1.30" -source = "git+https://github.com/KittyCAD/modeling-api?branch=main#4dfeb5c9ce2cc3fb853dd14cf948a922f3724ef4" +version = "0.1.32" +source = "git+https://github.com/KittyCAD/modeling-api?branch=main#494225aaac06fab77c4822e7dc48738ecca35392" dependencies = [ "anyhow", "chrono", @@ -2075,7 +2077,7 @@ dependencies = [ [[package]] name = "kittycad-modeling-cmds-macros" version = "0.1.2" -source = "git+https://github.com/KittyCAD/modeling-api?branch=main#4dfeb5c9ce2cc3fb853dd14cf948a922f3724ef4" +source = "git+https://github.com/KittyCAD/modeling-api?branch=main#494225aaac06fab77c4822e7dc48738ecca35392" dependencies = [ "proc-macro2", "quote", @@ -2085,11 +2087,12 @@ dependencies = [ [[package]] name = "kittycad-modeling-session" version = "0.1.1" -source = "git+https://github.com/KittyCAD/modeling-api?branch=main#4dfeb5c9ce2cc3fb853dd14cf948a922f3724ef4" +source = "git+https://github.com/KittyCAD/modeling-api?branch=main#494225aaac06fab77c4822e7dc48738ecca35392" dependencies = [ "futures", "kittycad", "kittycad-modeling-cmds", + "lsystem", "reqwest", "serde_json", "thiserror", @@ -2187,6 +2190,12 @@ dependencies = [ "url", ] +[[package]] +name = "lsystem" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23c47210f2a9f5ae2073e7b847026e3233bcb012aa6845201c69c26481762a81" + [[package]] name = "matchit" version = "0.7.3" diff --git a/src/wasm-lib/grackle/Cargo.toml b/src/wasm-lib/grackle/Cargo.toml index 586900bddf..af08170e27 100644 --- a/src/wasm-lib/grackle/Cargo.toml +++ b/src/wasm-lib/grackle/Cargo.toml @@ -6,6 +6,7 @@ description = "A new executor for KCL which compiles to Execution Plans" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +image = { version = "0.24.7", default-features = false, features = ["png"] } kcl-lib = { path = "../kcl" } kittycad = { workspace = true } kittycad-execution-plan = { workspace = true } @@ -15,6 +16,7 @@ kittycad-modeling-cmds = { workspace = true } kittycad-modeling-session = { workspace = true } thiserror = "1.0.57" tokio = { version = "1.36.0", features = ["macros", "rt"] } +twenty-twenty = "0.7.0" uuid = "1.7" [dev-dependencies] diff --git a/src/wasm-lib/grackle/fixtures/cube_lineTo.png b/src/wasm-lib/grackle/fixtures/cube_lineTo.png new file mode 100644 index 0000000000000000000000000000000000000000..6450d6688a5d6fa205a29a5473825f5ba9dc574f GIT binary patch literal 82261 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 literal 0 HcmV?d00001 diff --git a/src/wasm-lib/grackle/fixtures/cube_xyLine.png b/src/wasm-lib/grackle/fixtures/cube_xyLine.png new file mode 100644 index 0000000000000000000000000000000000000000..2a04bd115ec015c527a47baa070d699e54f449f2 GIT binary patch literal 82740 zcmeFaeSDPll{Y*ID4^Cvd^GKtjs!*Yp#{%*)T0&6?j$I3gfPtWiC5@;=w|J?DFVGuM^Gz3=Yx zJpa*;9g>;J%ypgLdHJ62Ip_CV`t5tieCd+Exg-<{eQDg-yS^I=U4$P~-|u@d{)x>y za$hKARQtHQ?)Zn9DW{L7EYBIYB4=FxWouV&9dp-Rk3II-eG~A%8S=m8s{cR!_Y?W( zf&%%L#~%CUH}6`sbQ zxZpf4Addh5ynq!082SPT4&eL?=su9ZTu57j+2#f3alv_9pa%Rz#s$v9FO3WNSU?&V z=(k{YdVyCAWTzJh(?E85!FgP89v6xd0f2d-+7if4|Gz0Cbw;23OVf<1$X6ThsSPh` zZ5~?EdSD3tzp=I8mfYLcwC}t7^rlVmpLX7std5Pi#+9hrX1r1RZ&L5Jhi$mXIk_x zGv}Rtw(J`XA2)qBKCGa#Vp{dQ<|D2!)_EvVbc?(=W&M`gw<;QMt!R9pBX|1V|9&8^ zWk>s&t-tVojTio{PxXxId7I8f-~aCiCN>_$^Y!<|SL%h$)lc+BO1=WeKIO!LmBMfZB6!VOo3k8PT>b<>sJ zrQ1)P-0_FWoj;xTACnu49*SRA)oWE`cw^Dz@^?Dct%{83wJPHmdzZae+q(1@MMqkn zeX;ax<|$lKapdHt`6oB+sME(a-lHnl$a{5j-z%E8fAYNjCl6D`Rk!are*66W%c3pI zqUR^iubsT(aziyu8^%nv2 znFEr4QQ0^szeN8+9#U#-})X8Z4WOdzj z)eYB$mwAh!V>=$;0*>t18SdEHQuvvQ?wX@~i!lXl2X5GGMjQEc#+=tO=A1q->-ht- z>SG;MvANg9GiKwL=bJBX`BP@+pJK-%zv8PKC&xZ+>q!<9o2tjSi*z@ua>?uC6OakQ z#Feu=>@14EfX-$(#YNz*DYVRc(&+E-4Zi*@) zYU5jU)gNj{YV!Vbpfi^zbf#uj@|E=19bY7wJ8u8Zq&c@unzY7yh*!+3hkpN+Z#?yqRNjc+?Jv3T!7Czp)t-ZIG3dDC2x=!|)_u&|S&UptE$qwnLX z(#Qe)67D#!kHcW@@15NC-ke_UJ%7e;C$}{hb?z^kH{84X!Q#FDJ#9z*j`k-$^)B%# zNYa#+WZWya7O))1>VA8Nnwc7%PmBDrtZeLWw%B_~otbCSrYd{={J?=`=nOAfl?FEO z+5sqy_{sfIuRZF$D(mMBj%U0fSK6tj(E41g^|@;2I4Aw2xAQXBw;hgk9^<_N{#{a=dXfe#jCy1O`u8iFUT+@PnzH?W^mUc)KF4R?k6$WUZ*!(HueNG+ zA8$YOV@6~2&&#%dxNQ4=U7O3jWj z{s8|>j}0-!uBR7IstE++p4;=}fVA>^|Mfs^_(Rc_i)K1?flC~D907AoxK8XLy3G6a z{PsCwBE?$PDYCpfhnU#0Z85aGj;L(8q(hr7k`s?scOXhmmr>4ybT}K3|pc&_-Gbo z<`!3Tqqm8?;=@Ws$>6(U`J$Yh?0)0Mj_SW6eN^AOw%$Yv_Y68QW&EIbC5{7#WX^A|T0JyvzNywLDx?ZJ3B7E1@AIb) zPVRWStmExEx?&YYt>L&yH@gTnJDcHu{wHJRf3ndN+uYPzctSPwB%T^GvfY3xBO#+= zOW~wHKf{NB^b;zPrlg#=g;3wqPgUnQ|d{W68OhrUEtQ#-l75{{| zKbkh{v`r1tFRSBCopTy8Pss&0(b5pSr+*Af>jCbZpdc0Wv=@)8E1tj1qWbK&5W@N?` zU)iQ^;^LVGgk5X99jq+__zVcaib~{l7dqTBdJ1b zpdgB%Hu#bqcy9dXaKNF&%{pkTK-au?z`Rl`FBLp3S^*_>eamG=QGd#h-;9RQqQ(ty{r3-BklQVdU5rH zP+HB4lVAE}?*XdX^CRY*-){*}#+*;~Q8V8l9 zHRM$luV~Ex12Q20@OTgq1ACQhuFA`-y>;p2{;{|6N`!bgSUGfQ-9zQ?gt7*UUA;1< z(3_Ndd!%JyYuZm$Q|L4G5k7NrtbBWu1s#D%rQWBEON=*8Pi{g-_2*gUkS<}SdQ$JK zUA?(D8a2lh1WAo#r_}sb51l-qLz66gm*y-n0bPcPGPX(*H&>CRv&L^sNsB-IQs;+L z8ebUV4Xj;!vzOYKJH(q^yJc0zyB#N2O&*f=Ncpl^f5H#B%Uf5j-n0J5$X)FZHV>?Z zpH-8X{N8i3&gzN}bLLzqD@K%28d7`Ul#wYY`y_D=6i9C zxeQFLM6tvzUcCk8wn%+q)%xKpU(FopeJy^a zl2*v{lBNmXCXr&QoN6MkX(mb#s3Cj3stDa|ljpK>uih^pcl(sk@HcfCF8B6qKMwyi zSp!e=+2~<^I$qEjyB=Q8Bvez_h1GJ7)kjYFB&7GOZ&}crUO3@j09a|-!oUbhoQ8WPzUeLK`d1-%9KJ4U>Ln{potBY5DYA$^NNDQ-ZnJtP$8V)jaz=dS z@M!1KptQIE73^Wqhtrn~L=nGt$m#ud|3Y(hxn&AgsX4pPaXOPaidJw2~?T@)?x4b8Tk`iW!s? zFCvyPIwykC8NRBi#~SYjrcGf5vzA<@rqmQtJ`QtC#19E*>{0^CGo=4Gc+*`#d{>@m z6u4vj?H>J5c|w$LQMx@ZT=AfjQyMFds?N86Jg0tMn`*%@Z%1-&}mBN(LZ8 z>jz_S^sh*+L8L<4Qk9alTh+pR5Z#!jQtGf&GJVr&%Fq-1pcpuzORzN4rQSPl$N&mn zK@_aq%h%#7Zx_;-DS>0u&-gM?f*bJ~H#=u^rzHvA?Q}*onuJ{$8)mTONk5}z=9PJt zQs-MHc#XVz@f>!u;FCvXEl5%pkQH8wSt5-$V1Tq>^d}X_`Ekr|%_(qm`MTsc? zsV0$^9@S(Xc0};1dPAH8)c}EX`@H>@TJ>QFAVEkBV9MhX&4Ppxsr#sDb$O$TZ01|I z=cFOxxdD2+B2f9sG6e=~x$V{R3QbSxFp*`5Vv=mb1vL3nasNx|mLr5U)E=DEP;vCs z!HuyNmBK8gsA{~D9+;fwL($Gd)xFM=gLiH^-MQ&M(oHi?v!3PkA>~7pH6+9o(uX;p zh^LX8B+xqMEm72<(V`nyTswc*HWmM>rO;gb6}*~RVCtP6 zns@Tcs<%_AhI{106heZ$VInS{ucVjc<_bsedZKdSp;y{I>KL?H@t~5MQkQ$a8Ct}= zCQ;6!(5g_eJ3vEA)V$HZoik-D>yO6r+`MYA?dYph69;!~nRL5oHu zI3fAvRWkD}pS(mGt_JASE!fOtGto*w1^qY!)~UTk`1lU20&0S)uBueDH2HC9(~HAK zF7tBeROv!BA89S5a}F>%y|fBW1`O4kSnJoBk+pdxPKg>>01q+KZVex$UuVEHsMyOW zRZYfQ!!?QsSe{0-7rOtKOxeJmY2*SnC zAt8_GVuN|0Ct!9IvMh>7M?Zc^-O-<)dno>_rW$e0f1_#z4Usn$N2@E}uey=p^o4o- z)CWH_d`%2Q(IQ8X`89FIs!#2^Ccy`+zNZwQ8=uW~4Sw|-sC zty~ZJGJM_JduN_)`_3|ykKbX!YPe{Oa_m7CC-P>Iuz0cV*fIJur$-wNJ4&Ly)i~2| zjS@B|jZnS82vt?1da2h#mwai*7-A&9KhliJoRaxqlZ=`c?+9xT!RfnPZKo%i9dHUB zTi}%lN+nyfg@}s5-+6Tj{_@Ey@V?5Q?CF@-GF}@%SpV-dGB5?n)Vx1Zc21X6<>sp^ zX55yhjFu_Irce_S3Z=a&Ei^TiPMtF~$|z)XPq>E2+VH{+#NFB&vb8n*iBEV392_)h zC4Lp#kQ=5?Ve;M|)t&%8OlItei>}r@bCUe6_;_fker#R_7eU>2dJHCq(1%xIcR&%( zJ~r#yw;$O)%o}Gsa>uU1j_EDo8dfBr{F~6Jf?V9$p-*NApiawoEReVeCa#COa+Pd;!-g0n2i*H`JI^#W%fcIBzoR~T2iOxkU=a)S&Ygh`p zk#3HSE17j~YE`d*!amn~Rb9@Td4v4#DDMAI`Lm%$z9ag#MoxUs?SC84QP4Df=CEEhw|*r(_D;#ndoQjmKBw%3-B9eY{JcSdmxpAPKbz9< z++|DZ9+8()iRaimzqsyE8A1^PlaN+qHx{Pe~`r9rPofYT0(~#a0mK&96u*R1w ze5{GfZT%K#)kU8ZJ895rOx5}$GrxYM?~;tSJ1(s%z9M#g{Gy9PjU7uf-m96lWb%;M zPWZ1Sb=QY}T>flTYK#r#%E^gDCoz%t_0g z`r36n?(-JC7&{hzN5AO2dSom5rhNkm+pAnYfdqFZLOL;lmIO~GF}l@Gy_;Ni5f&bkv-%n0)D;5Mr0DN-Q9n!jx9D(hDdQ1cD;!ey z(ibU<@X3uMPfq9C6k9vTeO1D7n`s5=I%Zn*N6sq|4tz-%P3Z{C4$w%MPx@*)<9(P> z0$D%MVTk80U6CJW4u)j(HAH$r0xD3YN$A}x8^0=|9MvDid&5`~|A7vyV#@wGapWli zJ`GKkmk!^v@X%k*py}nDUg$g&cOTGN`0I$xDkn5X)<;fis9I*!juJHYc0B1y)TAJP|fwM8D~ z%R)|_*!^Nr9#6^}^K$joej)=)UA55=!VroY5L{l@&lK^dNfO+z^3mf9YwLGKUdU{H zCbRW9qejx?muF&ZSFol9ZwU(@d=z1NgIzpJfbAxW?jsu!^bs0A3E-nU38A!-<7|4C zwnVs$c9lOFxgiOv9Rp^lGWWSestaw~m%B!dAbz#x3iK@D(P2_f` zHU&~VdhI}D}) z*ZF7`NF(}Y=f>HT*i6p9l+{;uCjN5o_YN&-?-zoP&XI=kb`(O>aFY`Umaoa*_U-;9 zGk;ZCd`0t>vC$o6kA)gjSJgdSzAJC}ma1*}zn}HQmglzLH|LM1Q8+ZpLs#)P?0M4u z!pGxfEt=u8sjyA8V++5#gnebwsl&c9ampJf)rm8*F8BCwS7?v0Q*phT=P9QNt*p1H zky;v07qh|qPgxhUQWy2A<*@ymuUxsbE_;zA1)-Fz{7|YSQE&_^m-c}wl_NXNcCEQE z1?|-k2eXZ;m2^-&{3L#8I2DqSu2LEv;M9Sy#kH5_K!`jgdVWeY z!z*P*`x&0J9;k-M+r$A@8j||s)lOYp%ZB&&gnq6xlzGmwSxZ&3l|Nu#h|4T$N%~t- zvQRAgvUse2Xh~gmKgb2j4$&aeLN<@4R(AI85BG^YG(RtmP8Tjj%Re(m!h#s##X~1) zT6{ukqC{1-^-=#ukP4e-LYPsV{SZ6&8m}pn!3+gZxx+01GC1oA6uxZ z{%4oZPw@K~BNwa4r%~k$>Fzdy`aCFt=ChG1VnEf$;a(qK2dj5u!^A~7<)zSc!64=1 zr0r|-J$Zm{v6cD#M`=Qj$RcG5+|FoCEv>SH^izGfJm9wD^W-s6G6581)BHFI+mJET zC?v>-lJOq3E)s2|(2lLf$lKkSAez^FovpC!UE!?*fdd@~+|W~VPj*k7P-FMzo?C*% z5E>{FqciK^Q~S%{%luT_2TTC}g&>_fOBO+Y08-QsNjL@^geS6AFjJaPLvDcihk=Qd z80i2h!E6f=AiOPpMDC%AD42QXz?46%{O1Q+bEj&LWq>iOV%1Pr^*qCo^Fzuh2N|=Z zh%B|#f~>2S-V*44&Xi{8dn-E43*Dh!$XKDE`^i{TSqxV^Eex-lgW55eLiiNqO#QNj zK@}PTMzXZ-dT|*_UI=K(N=cMLgd-CPba^oGxC*sq7+7m1N;R47-j4GpZ ztTeMO=-twt1ls+@gyPi+4RW2~cJsF|ix1Ihb!5tz(QWli-K{C?mS6($6Cphsyagf} zTzGhCpY)K_YeM}*R@sYYVx>{a0S+u*2A@(Xl@4(rCKGL&(;hINnmBzi6b%t3NF;p; zG$KAlmFQL_kjlRW;bd1vwyWDwRp2m9QM{~G>p&wVCFRZGuC(w&jn_Ju^{2*%XE`{y zjXsIM&L(oo&|`^_6l#lQ=6CQjwQM+|BlB~W7n|sIdQ>G%&S$hl?->QqyQI$wq&$)` zLIjvKDiKEkT(>~l*+?R;@~;8H9!P$P%t@Z z%tK&YB$D6Q589XerA_AwKVu6oZ{1tS0z3JHfLCI@q6Y*xKGE&*Kh#DsWeQR*%9b3I#5M84WEQGz>SyLg$g zsVJ(W6$9=k@7c}wWG$EpV-qHH96XO`k;;XXM6#%==|<8sC!CU);gSsTG7R&Osf0*Y z5wjsr%*#iK&+d(I(-5i|0=N`fS~n&YGj32WND+OQ*H&&^l5tlkE52|^-N5p2FK}OX z>x+-vTzfx)U+A(wWZj(hP)f;VC85h^{nO?qUdS$?dwuh74w9{6(q7iGq^#wP8fH53n+%r`h<3}?u`%>{t{{ZYl1x~#zBm4G|69YQ3BklXJ znxQPDnMf_NkX;CXrWiI?2tf3SAq93-v!!2Uw5(;*ExAJ)^Dk~3bua{~b>&wYudN!o zdiReClgpY_wCZW zMa~+SCpZG*GnOY<5VYnXGaIr<)Sy%VV4}JMf zD8-|rLLb%+!GLqUcXY#!_B-d-zVvaaH;|Lb{!E}F6RgteKJ)Z$13jgYDn<2LAAMET z^@l6aoZkjzczO=U7wV zWSo(o7OfNT=5x~TeAIXD^}a)VLj*LjDO#aQvM>h-4>zD-9+XOo#BYp3=45N)tiaDi zBXbdQ$KsU*;UX`WsKpS|WuQq#q;i3*R;aAxH^>d*Sp>o0FGWlcnlNcIv&Ll|yL;!W z9mCr&9NAuNbqV-8vVB@JP^iDlyMwJvd<>+Y;eIat{2_D8lnzbh&qiphnuxiHxH51! z81ibWBKRo0N-`nf)L_!?2i7iJCH#17oc1|8etV+c|rOp2uIk7e$WQs zH!$hh06lmsfHJ1OBm=OPIfy_4cS3ud9*Islfr$oX36?f^h?jD*nVpP zuh>{K!I<_mUG0rwn+mfl?XnOV%Iw8}l0Y6>k!W(cf;L09gTWl-O?w#UqWfb;Z{w7a z;5cQe-+d2(xR5#w%w8&>IR%(zC>rkeAgb#Vs$NhAXd7ZT!us{VJDPHcUWq6n7|6u> zH^!0r`DS&H}tB9cWCUBtxZk;m+x$ zs97y(gG6vrmKN=TKg>@ZHx`&kT01eWA}tHpA-}&62OTqfT~n?{=w<0l{&e+(uMS^_Tx*4ZLSP&!)#PVjY3LDK zgjLqNNAz1T^J-Y2WMwHJ+XX~J9aMdQ`=DC*O)_+I@#KMAvz1dXr)YqLP%di@IRi0D z%?u7+n0z(nMd>Tf{<`Vajx-jdI@Rya6XIc&N577p6tFb_sp;1639S)!ANuy5a9(~> zaOB&2S$Y2Tx&)`W5b?4$vap&5)_T7s$Li`DI`Yjv;pn}2YeM}H!dHV%Oc4jNtoI5; zzW!N&*N_b{Z||D>K?6!Ql`m5UxM6u74j=ZYDJfD9latb6LNz8NrJ~b#xRgyG5+V9k z_EKfT$AAif%feS9sR`wmyqQt@Kx?M%B+{gzyWMiO7xju+TehCq@CjmUKC(<^Nc(oz zE?ix!e}CywYlJa-qEDmjTf(OTogO>s_E>4di>hJLo&1)Uk(v%sNvf0;LgG4BGR@u~ zyx@36y_6dn-Cre$^dw8mqGEHNGXas)> zJ_N=GBmpuG^2&-2YE>N}myQ)C+GGZAZmZ0wea+w*Aq{9hn6SVG;sECNHm~q-kSgk7 zNbX_30S4VwTJJ2}B-pXRSB6p>ew;cEj<+{-CI)SpI4}gVdh)Z&#Vv{7r%i$z5LhLg zi8KiH2DMEmUNSRF^`?sn3Tm>@2tCtC030TU2V-2>4fStO+oL12JK;*CL;T#^FR02i0q8+w3RAv7g*5%47B3QymENgovr034Ks z+63)NP8Q0~5Sa-O+@||glq?4?!ERyG>1g!ECj(mmyrRoFd#U$N!Oo&n-D_x^Hzb3i zXnGHuy@VD-eW<|Ln0Cu zVVAgr&7(>{kBEcrEvAFG54j5CbWm7H=!iI}%1#Iail@q>KueWQ9lHoie@l>Y{pr{6 zk@6G+rbrDEg`NYmf?WZ`Z>ed!FJ7wj|MupO=TyX%B-`sf%+VQYfTij-J3c(pI6P{# zesf~$oD(ZNVNT3?(RNx>sLt6NZ)-Esx-6yMar!U^8_dD!i)*}G0O#1~3X%cXVn$L_z4rg5L1!K=24? zVkHY;O(G!#1+7zZdItAAc9h(3iRzSJOk#W{w}j{CMi?43;my(!EVCEEYVr5@6v!)o zRBHYDqE91C6#Wbx_mvsO;g{jw7@5NTieKTVc1~c6oxu9{08!77jZ>Nn+T=s1#Vuiu zC7o2kB~;Ba>&P7?01=W@FG6P1H`H6QUPwrweM*)>)GSbz5(?>`<(?4H5IUuUM*I^J z9E1VF3{e{hNiZn1%siSz0Lh_DbPb0Ax9kZND#T|k2mXaoYu^&!FKRFSXHA=TlXs_% zG1M^!Y>05Sj~+|Yq+wpEa%xtI(w0g8W*6Qi3GdI%9NHA++F+^o+a9o38h21pHr~}3 zY?95=?`ghp>VfW+_{cZ_IU$w&)+q7%KxAT+z2$DEEyn$>7f+Ap7YI;?NCc+C(*cR8 zm?=06WZ49Yc6wzj6_t}WYQ9e2CUFx>0BJ({2%f$BBX>nM5JDvAmp%AO?}r?T)QKCH z6EO|Yl$>C*#`~?7B6{d}-;i&^Ns%|OTT!g@>xrfkYdql|GnQ{})=X-HBARRCWwrs0 zLD>aEC%>21B3ggW6SV@wfQN_s*nAJXZvhY!Qec!`mIGA)SEOgHho_%8(0~)v5$_Pt z4!6?}cMq?J+m zrmu8fo!&n-FlAII6*a3p5&^_a`-l4GKwQ&SgXe-;i3~*t;M$=o*^5+O!p(@AMwozk z!rVd#6>5PiM4fQ+$x$cYkD^YZZy{(RksB;rvjwRhLYi>15afaoL|zklL+G4KIH?ZV z^ibjJ)MEE@XlHsW;QuQU{{QbN500nO{Xz7>0k~)DM+N zIH%3`^j~t501fn~10{j39iU(=XsQWn427zoP@c8GycIG6 z+ZxJQr3e_czibJ;B3=Bm0`3w&iY>zF5tIQrBQPx8qm)Gtdmu#)vnxd!p6787Br{K? zEb6=Ofz%co<&5-crPo=YpvoEe;%*qqxwaeOY&e62v+H2-kEGg;KgX4_tk!K4Jw^sZ z00{!fIQt@M!e&w=8ypK~C)NsJ_Gs$3zM#wcrAuZg5KE=0N>jNJeriz;f~TN;#0s5< zhgNDBO;($U>!6-+dt#&_RH!P1DdsQUG6yQJ^e)6Jvl?im=@{RvWexeAVp&X4*)=)@ezRA~J?uDcXEfbr=I`oW zb#0)}nz&swl}y6%tB+j!jZg~WfW!-pt0f`C;4CCli$u(gFAs`E| zM*UEKZODiFoH?Lo^`e<0(Q+1lJ!ev=*F$Fp4H#Q{$%0#A14EDGhyDmxaasS8TT+V` z=YKhUSXQX`jYGeB@OYobu&J3gNgZG_+is3$Dz2a5M&oq*vQ9|~s^hwsUE6Z>$dx*c z`#W^ik62=;_lKOCrVDEfIIm3IA@Q=Q+%&V7FK$NsGxTYHe)Y^-neqQsgiITqK$n~Ma*t^E@!}4DU5|sj75>Cwg1Yc8Q(k{I~?nn zauC~-?6~Y=Y}s18`j*%a1`n;h|FVZdm(3mJJ+`TQ{p}q^x*E0@YahSD(*ZN#VH=$B zgk_6-0|k-in7IY;hT;1ag6-R5dmJ%E%eAUjNtskE`{qemW;j`G* z<6Gms-^AK}bHF3&3@0l9H;1BuMJOrKk+=W4DW^yFtA^0hTOae=(TSFp&59-GN%(J}Wd(5nNq`ze3V_Zcte%JcD&gI0C2*f#L_Y!0#v{2@J_c*jhPmRR5Le zClj3s2{@3Ohddww5Qq33nhF^xu!RDu7!}tNYB<254fvW+N!pa3nvc4H{v=ByL0Cd4 zLNb;H3piJjs6DKmv4jl=ts6H4GW1?w2x>DI7^sbGvi@>b$m5wa6{fgtD7^*Ut8SUx zSI+i4@|H>}u*55>ysAIYESx!_-Red7ZEOh0HPm~QfKJ#lR8OTiwq^)`g#`Un+#(*p zKmf2I>jBOXULsjsR~c5c!a-VqHFnCaQJg0a36Y82Bk=t>>G(9R z(h~0%G*aO&Hn9i4C32L;qzODn^Smz{^=x)M*VUi0I7F*9N}Hi3>fg!0tJK|WWTS+l zd1>Bw`a#=>$78FyM(FF}(Pu(JZy>RhTxs*Dn)xe2`QXi@UXmqfUjXi?{$ijI6qHZU zEi?^YNeXF-Nrjt0c}Pp$Qjeo_#9@jHR9aVMntU+9BJgsERzWnLOa&YRG{dSa!UbVf zvgb~lj?FhawOq^FX!I((gRwFiDrs9KY;8D%`>RCK+_1ym9%4r&V+Z>!31eL75D!^o zW3gUvhJQRQz`eM%awFIop&~CqMMY97fLAy&sbuzrT0*SI6X5Ov|4~4YXdz?{M4F0x zAiEzl6|~2S5afj#J1iM@k2jJSf*kP-es2F+@=o~>Sria^@<*Ws zcrLWyu1Wuhtdu)1EBB>(w8rbB`e~y@Iz0=ozF8Ck2K{+&+Fc-5ZPCz#@l;(jS0n;v!M8Vzph6C-QgM3!sM!z#t*? z$fq_$_p5TaO`^tgPc*kll*i$A=3IeIqLOlAbH+tyje)$9*{jt#!yH-D5isLyBR1-9 zEZZ1Ap8Oe5Nr_YipjNT#QTYYqk&pXK1u=xDvVa--O5O;suRrz|{|2kX8*`XNSxd6y zME&|Lf?~o9MSdnJiQhEVq@G#&uR)ccB$|ak6|)s9=E8`EK9v`J1IH0qDP20mw4-vE zm*(pjv3Yz?f-2r zI&=M*Xx;Le0|m~7`Yu-=C_;P|k{a6=w-utZlO{{mJkv(?P%`x%f~=^1qe@g(Lc*!l zitf(j;_tMx^`aoWWB00|_V3Ku#g2ZsP8Ip3e!E&q>_@Vno;(s|u-h4Du2+E%gP+IlMs~O19a) z+FoUMphtZqjYfUcoZJ$&(QXWCng3J`*V!`21~M(FHGgOO09&QXgi4pV<%E~AAU_0a zrRHUU#Sm-)XdeQ&TaYfM3J;e~ZwItY)FL?m0gU+nrF(GKc#z~lj7|cw3CfV48nf@g zxj=|WvpfkRYU>h$a@2Y12ldTn$}#It1o)^)zfG;q{*H^T z*RvhiZ5iz`a|lqI;d5kztvmk)e{dyl7q*dmOEHG0ri`69Fdc9nd6;Bi2({q2eAT03W9=#=l37m zQP@CdC@r|`(L>Db-poJVADS`qczzCe2Q<0`OIK^cL0FKepw-e&fpkZG6~ z3*uyMRp3H)+BjjJ5O@(v0kuM~MtDA0EQAPGznr+GAM{PkG^C*<1hWl6VlaG3vP2!> z5kv$?QSlq|4;N>lo{~uN}n}<)=gd?l@a!s z#S|!SxxwQUXrk(BVw9HdDct(VUq8%nGkzJ?Mj4=9#stc&ky>iF5q#zfeY>7}Z~N*x z(f$C0y=#U5>q{xB1et>v(O47>5qCrRB2CGQbD*@nC0E1!<5}^L&cu^;O;kd+2p^$Z z3BDY$n8uq7EGkz>4wQ{5C-Ae-4@he?ynqeUO1Ov`fvsPq_up7nVU317c%+9-A;$O` zbNst!&3@QG&FlrXd6o+wpD;;Lxa>mA80(YJU5{EL9Bt!>$r=v@v&80EVJAJ1Q7Gr+ zBgTNRS|B_NVy-48h_#THsGL9#ND+Dj$@EiyC7NU?SP`I_r3g+`OZ=f=8X;S* z0UW;6;3DK@$|#?1Dk>F=QCPb46)n+EG%Mpx66|?nn7lQjfn+Q1w$E4ZLxA0aI{~1M7VKCBIEV@D|(OvB2B8Y&ILQDai1yX?+Fp~5lu1MWf^VJf?GSoQX7F2C~VIVm26*!tVq7kj&d{8berb70J}jPXPnVxtGiBh-}|e^u90>)cS56^-H! z_b`Gw)L*j*j#`$1@EH6oz+DI?mxb$1$HD^{mWb#=5}eUq1P=%Ef?>m@!Oe#j=#v7k zAp(XMxm);s38;_(I8~|ovWPj66 zYveOuGjN(8x4vk8gG`iDkZ3CQ-CLqfLa8*K zz(CcuLG}yUz64Pk;=@O}@FMLx5|8kV`bzy&lbwWo@rxkPG$VqS{J$IbU?(=4PQ;#F zyKwl$WX?>>p-d-jQ|dBba3*eHX^=|U$I*kg8m7?=QeC3UC=r-&s9@(d$!goBfwsOu zVb6f|ZQkgK*-$p&6$Df}-Gt#nFt`!)42bptbITT`3fMHLXz1jP+RbX16(uxxDF2!a zDI&Gvz6rw?oIol8MBJJ1=^w|ydw>?>u`Gj7xd!OBaC1%r; zyP)mW3d(JR3r>Di*nFPWa*ug--j+2nI%223QNOW%zoFlq+7UhJH9z!KlU`bF& z0THNu2Aufeu%gOePdSKMqOMTWVNr4hiOT?f+NKjlccx3b=%#Ul)ocl-ZZOoc*m(2 zTB7DYKW5U5ol_b;V7(R`s@3q_%#H)m_V#Gw+b5rx`M84W$ZH4wCU@c^d68#=?=9>+ zQ}3O>VZ+vAuOnj5d?oF+NpJKCpL^q)NeJ0btSSn(EdBnp)u?ETXB4vriz=BjVvb-$ z{l_#`{t3zGA3`{m0ud=+=(6&0XmF|QMDY_&VCF!ncVh31C4Ktmu9`Kergdlmwm@5- z9(!!j&CNrz*56#P z6@G&2oxkQlWM?d1D$`1}-ZO=*4HX^b)TBA((+&-t-#k9vvXv?FCCT0PyscIq{Y7Ex z=i#;mneC9%>|L8?EjtijR@nM_^%G-mibrR4ePYX}j~1SI>v-$3!<|1ngoEu?KQQV1 zuLtCnN8dgY+kE=Icy!Cd?Qew+zaF{CiydxRHD=`IuU&ok{K`l%e*f2>-Za&lz{@$?KZ8e9s?V95KDXrtfqDJrib=wZzzT|^Bbb=CnGguFe7Mgd;H>N8@%`HcD##Sp36EuE}H+Ih8RgA^eE4ij!%o?2f^)CEjt26u!)`P6QZ9F z#UXDDu9@fCHgrBv*mQTeQ9gGIPScDwt=lx>)8fP>y?6TH4vgV;1Hhwgx zo@0nCyekFiMVW|qhMRS??jlZc?Dd8czw*(Adz*x}Hu^jLiFikNx};yyL3iK!w#cW7 z;^f$^T8~Hn=@^@BvVSK@VPXl~fv@Q6y2gfnL4gfRp*VHVQ*Y+`3eRuH^(NcW*ToC<5KCpC8$BMc7Sqp%PDq#OeI@Dv9*R+{!bwYg8sJ#R|Gt!5k!>$)Opp8!nP(P>W) zp|4hp-CD%v{!G4sEHBJLwwKn!i5{LEvl*z2kr!~P6dd#$&$bV5(+avud@n=GaA=mh^JOP<{!F**+5b(<`C9*YB=;YQ`g6NMGCyF~4Y+r2WC zHnE$=xkAe+kKmI1mqB@G?z1tk@as zx%qPsJvZa29@w;4HYM^*J#_tsdu6^k(6#I06>OSd(plrZLMoKf(P$XFeqCsH{ft6% zvXqDgBQ_g1p#-j*`KtqTQ6!D(X`4@3=g^5J6a9~4E3KiK6C-XzJUl`+ScjSo8V5A`O` zYYFZ0fOx&YS)J%N^IoH0)KH@fz1RC5vo*>OPG2`63fP|=rb*#2(PL>k#8mNBBH9Fw!gC<$X^*Nl!uzIPMb+Hkt=A z0`h7%xvOO*v6B~N9n{~`3?b;QgX1*2gT)<=1nQz+4k!In5!*K1Zo1Lq6vlg2@GJ{9 zE_~R%aUs(`Z`Q4G!5eH*^2Hw77C!9Ww&1K!GU-Iyf@o>-bi^{+0MoS&b=s;u!7wGPS}pEuCtyU^{$&vWP_{v#(#JzIZG z$#vO>c_u~;YUr`|ovH{Iaavr&Ro2p5rp>$w!q|WOGbam8teht2EPg!Gjx_O4SP(Z2 zuq*x{qmWLjI})#*bHAb&)vguoH6`)fJVixto`Nsdt0ZyC#U&a$BwpX_mFX#d(qy&D ztJC7Cbvd_2cq*ztllFGAysDZ*-dnfHZi-yWrcKW_X=7WtgUn`)3_FI!e@O4(rYFNT zJ;`C22}*=u7aew7sA6C3l__ulUvhrGcD5sPYF8QT(BV6Cc0VL&rn3vUyt)2u=I;Ae+{07*0|8Dy{c>*BB}-vwlQnAreYpY%do&o@s+O+{VKAiY;V& zoi3bMJDGD$vrJ33=qsl!FgL4vzR1mLm~hobjhNm|9*a`}YBdIjqSgfHm2~L=C%Ms{4W%ZfEShN)d%F;z}S zeDvesetN*l{&6<8+Alovf~R3j#mO6&y?^=c2U7kwZ*&K1 z$gvrJ5tQ{m|CfNhzx*eMYIJ?+sDOnpt2k3rtK@?c=WldIaJcBrv#1Y%gk9k`(?$LO- z%!Zq76zeQ`zX?`?(IkpsToZWkYiSpDwn0ZuY500{*a?N{|@`vOU5ck<~e#jSpN-rW9 z#fz*T{T1Kbx8*q<3VxOFS9R|H__CMuv18}D4wW@UdvU{Z@2l2k#@+BXKdt!sRgQY- z#XhmVhIL2!cnwZ#*6E~Khk;IuEWWZ@@l_kA44>pY{5m~2ZM&YHrns}#+XBNL*@9r+ zx?W6tHi^Mv)tt}uhELlhSPj2dIV5*nlZMTgID1Gm%{-FcI-F@iF_k7j$4qcKaTjC0 zoxxkst+9B^)BdJTQTWK86r6F3;j0U#Y5Y+4Vs!HaE$k|^BhzI*{bII@+RYyK-AB8< zPd?sjHDFpwct^UF@NU9N%lWipcj~@J{aw)$ryo=wyk9Tx@`4AMEf}VrP_UhwU2Zw? zJ6+A^^uBV}zi|o!nb^SIdSU%%+Hnu=8wogiJaD8be2vL=YIndfaTgPAic24d^&sFA zzY9v3Fi?plppLn09k=@J9zcmXC&d9)O;|~S)Hi0oo}DrNM2o7{$wXGQp4GU>FiQ*H z3iQQnd75aAkEU^Na66EbDyPzQg99ny+R4c?K;&}Ohn0)R#Cj-atAqe^g0*{?7?Pgf zeByWA1NwS9gNm?FEseb>-WI19BtTPJbT5TtYxnTe%wSJgbx~qViy7x&rZ09h$J)ud zr6}pq2?ZlE72-=UeQ5pc|4DzSi3WCB7p`|xDiK7nFbctA#Gqr`C|R53bS#HyZ1_r3 zi+q|Kc~iy#$i>i;slOta zm#i!QR27ciY?)gOwY^z59Q1T^&DuSB!~W43SOIU6w&3eti%-sGJs^|KYVIsrcZC3ylkev|`J4lFLgk%#;%U7wmHu&q0@hhF6q9)aYiA`UlHW^}@zVFg$iBui$ zmw@R|A%vFp~g{SqLCYA`7LF7EPiIqO4^AD1_@h4>yR%&AL1!o>K zRhOCQxj82%NfVpn+NNv#3XQv^_+E{8Y;QExFSmI?_K@N&U2Y(WSlqOn<9tZ?A{dC8 zQ8V1>LHE=D_$Mh~*lISkMYT)zvd7zvbr{}Gx1)TfQ3v%4)?e-WH_lP}Q zU*}?{?~B?wY#NSiY-4gOjnn*36poqYV(O(J9H|5dG)k?8#TE4&q>8|Jj1|uyftitr-Q345g{?H zY&L&V6gX6mRgDQT?ojRDt^*h5OO4YCMwF_Nx~8w$m#dpqhGK@embW0=iU#Z0iwT*K zIX~fOcGB#OVj59O{O+^*ptWj2#E!8bAvMC{|26)wq_N-_R6(f=jul#t7Ko!Rn#PXN z2=v-S@dx{s3d_Y~$9<+M%0YoUAJViT$ra-&G{MpO(%L!>)v>ie9KV=(QvipT?_^Vi zk~ZYA$sU}vsFTsd)E!n#BMRYJrzJtLV|tm_Shq{!I>{Lqj3{LMgns-%0l2F8)v#XG zR!J}0f;QR?$ThD`-!=?y>j9Koxb>%O1`af3`x`@yqphP$_kLy+fMRmWhOGJ2eT~cl z?La|@jxkd;6Cw1tey(j6w{Cq~fip-3DyC^zo8A8E2QFISfVyBFMTWq-Q}3Q`hnW~b zK9bCJ@kR?Y89kIgAojriPgqcT4Owm5PXHIrqOe}L*iBPr7ihJcK;1Hn0o2zJL5(PX zH(2gO&jnEDVPVl-?Vvff?SUabYlIFu?cMBTFs^k(8GS52RPAs5>;YY%RrC)&PclnA z33Oun_=rWuI-WNqj7Bq;bK1T}o(o5&)_{2Im=@Ig93}P5O4CHsj-{+X`u7Lld}3C& zxvD4k6_ZV&>KmuhMKQ`Z_>f{k(@oSnsCxV&e1-WHNlFva?*WI?gW8$UT}PUlDy)@1 z{EnKikA%vEJjtmf9A%!*QEuFFqBXDqd{F11I-S?>3f&RZjV+qMIgC|DiiK`km2Ma8 zL?f8%C34EH-7DuAw0+86Y(8d?F_oIk*)D{*8jjmLCwPEfuZ#Nl#NEZI7j%~1Ca6!T z3Fk!0nA0!=U;u2oR%OnXJ?89NPR#NR0q`UUy7D@nGt@Tzti~nRNs0R=`KEX8=;e3A zKFZa&cAVW7;?uYj@jcsE!2ML^|w7qcMD zGxa7m&1G4TLAZEdqrWK&LFfSUZUUUdx_kjN+-;#V%?^C<7gh05^eCD~0R|QlRPx>} zS)1!`)v7xgKw0bChHImMW#z3TVswj3XODTR8!UFI@KO8q>xN0ViSMHh5jU`q$Xvhd zPBNaEJZ_y@!HzCj)|;@DRzh}gWd}bbA#gjunkDYF8NLY-0bG%%^-N6mihh0l>>XB~ z(k?$N7lWGbBrO0SpVBir8l2RK(JR@|9sUE`w``^GZEy@_(~o_2eQ40|d-cA+%}i8r zXP(Q>JeN-V(D^bgrjPB2GgF$P;hme9zOw%3sHFqg9BlZAPR4PyA%xNm6)j6E&K}x+ zMaz;KS-V92kx7#O z{IAU?E(-K;Le1=sg@`U)H|dvpm#?ahUblYs0y+hUr`ASZGKZS#?-ZK0@6ylJg>#Gy zAwqZ9I~gQDhz;2cNh|hIWt+@(&FEpXS_r5o&ui+Upwf^~?)!l}WqZDUgV2vR0VLHk z2Qj{Kl59)-@odqLVqCv|g708!L{2th;grn1^|o=WTPlJ*Ju00Hu{)tS@*;z?dhMj4 zYYmwh9sP%_1ND!+v{;7#{-5-+@{Yz;w#`r^YT4FBdR^!sa>uw&Y;voio%6C9-Fr9_ zPMNM*{Zj_B+hGQhF6OF)j4N(R^*3-%#iuGN($vOL!uFgibmaQmPv1CEeGDX7%($oA zKsSED_IycV+;Pw_{_ZGx5)XYTS5c^%ny@WLjQpA==^q$_%32l8>FhC)}~Z;K4>MI6<(M$`^gDi*3TyvY%xZm@8lqJJ_TpVsXy;$Q-MzB8 z{o7xV;B0@0LeG8Es+g82I(4^3T+s|)LCP3FQ+ghkyLW>30t;vB+tSYa8`bba5NQ9( zmmYKxZ~$$O;(p)V2Ju^oY-W$_iGoRLz^GIyF~^fKG#^ zOpf+AvO7N7m#KX;u_?Dr1D`dup@X6azrMhiC~&5TnyZ=3>`4@Qj1?LGZYr=Xzq7Z1 zv)B?Du_M>ojqjzK(#sx(KcqBVd;lxo!6N2j0yX91yY=-K zGrOEUm}wjx7NbW(Pi!|Bk!^tXcIr-blw8Mq+}8!+z0ln}+cFFo8xV+cbrNLBq?h$? z?C1eGVgSADAO*{72HG&>UkbqvjLPM{a{XQh0o#hvP9^|{7_!ac4Yyg~c z75F&Lw+Akp{`AFTk| zKYFzpU#p&*5NGEElXrc9?>3>kjA??`&*wsNSExGx-`)Hd$4BKV*itFkMq=_sx}@Bg z#1h!}Xab=SJABkVRj4(3MMOp%VC6QHQ?cC4qWujgc2{)wEHsNSHC88*y5IQ-Sb!2O zr0q8seLWjA2#9OeW>}?L-GD`WbCYy=>JbJbsIjGh(=1&G@6L$Uw=q(zlimLI|AZ@6n> znOUfp>s0Mc4!3wWC@lAWP1nby&Jh96FgIa@z=8x0^Gn>CKY1JNJG)sb8j+u=XYlu) zEVJE0NPDu0!@N(>g^zwx$lMN1k}#b-_q`%%80(B^V|{0|G01l3uIRye&wj?gZA&rk zK);psG1%!N+8iz-6uzb6GxFQ7mCZXfWg6Zbpt~pKXa>RMV7el)OZz+moJ+<#OxL;+ z7v69MCf-d(TUb|V)Ag)o68GBvP|%A&X<_@@)C)(xj%II|&=o+#@hgqqmO;srvQQdo zWuN)!AIoj}XHjv{9DwTrx8GrvP&52w(bXGIUpSoK-^HB-=Cmf{{>}#kd7dwPv7hYj zqU|DbQ4LNA;GUT^N+LJUs%fU+fpl{FSmyPCUV>+|5@)%bqG?wm5}mn2Na4;X_d=q9 zaxWyyCUa~}%wsoQZ;hLdgz>lM4KL_ir>NO-A_St$x}d5!fyYrizAYi}0Q@%1@qs|g z?VyNWiiGN9*DOtOxM>Gi8*c>iGdxWbXh74urUgx-(T%96c zn?=Jas7nFk(*C)IW02av6k`QAv zb;vc?iD%}@exOpwIadR|aiGhz<8+7S)b5%NYPQg9)u`=nE2s&g@6qQq!7r8uIhP;7 zgf?i}6CZEmdrEf3wfJ|;8KWDgEr2!Z84ik;+`8CvE-2w6cL!;66D(EPrIT-~Dr>^2 z~VDSwOxeI5UH$up>9ahS;7580#PSE!BXK;EOV7M=E458#@WG z6GvOFy75)(;uC^xCxxHtC%6XiNsp*YB>!qr9eSoNQIAI9$S|o3nF?-;J}t?6Ti6J4 z|9)g}Q%reigIz2!P@&jhZNJ7TdN*naa3mFNK24D;X1~8sI_Gd3dsz0?QssGu zzo1Wxyq?5R9pRjDzu((y?25-5Ln|IRl;=D1Y(V~sAFt`NJm*ktO3pjKpA{PSyT|`a zPyM@on=mW?Y+q86b8uK%R^WU8x~E3G_tC=U+%wg)pFI8zx$3{}uYI@c`@{bbn5bat z-J#>0IDD`F^-skJ86}SY_P-{&?lRZpv6rgS-~aVj)U(h9Cn@K6Q!J?K+~-f zwzXPKUq)K))*7w%5+i|i&dZ*!C&iBMgFD<#_^q2lL==#Nc6gVe(vTOnNQtC*yAS?8 zry=zFuaC567D04A_?zW4t{>$G)DThC~bL1!4|H%dXHG;S8 zzB#fr?~jw`{&C7UThssYWx79P+|gJ@v=Y=A_qMpl+XtV*8=IQpdzd(>=+RaCoLIeV0qf!fCjBn(dxU{VCbgnyG zxlrMsj?{g+Hu4Ke=fN``~ zFwAAJOeTsN-qpvU_sekoP0K z8+OYc!pj_4)4Jum0%}=hmJ0``u(&ARwL zf|WqME&49;h8;x=$jk(pild493{8_w-WxbWYeiT`bpD9g+?Crl*h%!-69L8f5$P*` zVqbW=OPf;ePXw9hW)M&t-Ai8l=}7~&P&7G_GA^v?WP;Xd@Y0Hy0&NzZ>uet%#qsp_ z3U7E@y37 z4n*>9YLV>B;C?%ayMdZd){4i;ZOwM`V&ac63;Geq=l$E8h-$OC$j2`C#LIO?VB5G@ zQ1|C+4zexProfz#NAxgo0^7?%R*u?ewh}sM&J+GewTt1~Q zA`!R2akL4sbxH4?rl^J5420AAq`GkPtO;Hh1*!fdknG3zsdM37xrEZ0vJzjewDM8U z49m~Su-Mjj!Is~`(>hkfIG}ceEP0L5avM z%%nVR8!fz@4#c%aM&IdPaD!XZoURRSznMINtI{HwtJa!^wM0OflV*SA7C%N=Yf>S<8We8?mhoQi_G zR5=%8W(t1)MSsEV9bXqnwT-K583FP1TRkND)v~M5n2|~roHh3-%62i`_e^>v|JGU) zo7_xT(0!ZhOVsp>NK&{7N2J}+k2L)0VxZ!-M&+*6Vs5P^x}jF<-&<>f6D+SJ;U#rv zyqKxC|S=LOfrBOeD3I{SGxu!W2FE4ZF1n)6^gF5)zaj#u=2Iw5FI19jWrB;nx z&8=-XH@VW-AEAEyV;7Rs0$yOqB)-?b#qQ=4 z)mBDPuvbU2Homt@Z1leA_ahtCj|8f2M3J`5ne|adNq@%ZUs=zDPU)^cDKoi6gV1jk zWZ^RZLTAd#Fn8Np7vI}Mi$pb>#OabX#|8<$#@d;*AP+CIM@t7xBv4*vdD|{x1{K?t z-69+56SZin7m+kipLRf2Je7l$<<|?_U#~uCMGYw~U9YvP$aCtX&BYsWf#yLv*V=hP$ON9@G)PuNStP#h+nVpP1;oA zFX@13e0NV{CXtOSq^Kvpc759ncEi{qw`(ICHCEIoDLQ<2V6y;hNxG<8;Vo+A6|SPw z4u51f4T)^@*>19FIKmFT$iHgK@YhQix8SsT*cuVn$T+J`;t9D0E$FbWjVQBHm!8Ux z`pHp3DyzIj_i*kc;VCuD2Zwp1EK>yAC)RucE*w8fbBQvJ?XM8Oi0ttHDn5!wQ zT^~*1KXAo@AaHANR4{6kE(tKBbhrA;RFReZQd>5dkM5Ag9kAEMAMDPIcdqftUH=TJ zW%M8-Y()bxy0Ob1t$_k$24Hq00P9KufYaT`4vl|L;u9Hn*~pB(ldZ&}+-?r|b`SlT z^E+Du@CC&L?h4>G35Y)!oHVJnZ5sk^oytR`tEo;i?LipGC)Bk^wo-vfP$qP}`#y>j zyurL>=0ujbnGz+!>R@O2-W`fU9(U!5t(v(f(fJ<52>$9Dbcn!PYf@Gv^d95aVfX21 z>x0R0Fz*PniTk<)rh0=~n&P{RXE5KSPzwF2^_FZppJCFk#i8j@(zWz6d zZS6|kxjvDV8n=R-6lM{!f55B!e(eN#p4UB$#zu)coM^&KI`e?UDF|`t0oq0C9RI-_ z!}*b|s&VuqRxymMO!`TiTZ!%=gh)^Xt*FWw4Or>w2N4M2j~JS85?B%PVpmZ+cJ%QpTyH8np{UUd6Lmy?>>2<1mr|EA1%j(WAu3z z9z+4l3{r9INmi~FB0iM#;$3b}sdZP-tv>DVnKZ6Z9qU)9u+)4PJJ!W-Vl4ftAEP@y zt@?Bi{c=ZGaCSR>g?Y|8sQ{>IDL47EoDOKl&!UHI`z&2{ux?uk2Le+ocBesl&NR*p zAlbTAKoUc!}XH$2T;MVpM*wto)KR2i?&CI>W;~%DPIcj6A_nxtzGVA%e`S}JrWr%oVEIq{;^1gyxQBzjMJ4pQ z>j&*)>$IV2b;n=LH7`*5*mY33E9l9`Mp822x4|>RnMC>b#hy; z_y-1d12wYfAub9ZomVQgflO_aw9X2rI}XBU)^xcCwN@WikmU<(t_v~rK%?DFm1zy^%XOuIhiSF0+b>+@ORd||0^8JTqu3vL z?f%9&FP(RrGy}<4S^~VNGZn5aL#jsEuQ19^?E)e*Yplmut7}Nv?=+;Y6pTfq$P#9! zF7r!6Nlp%-nBeW?!Od=qrpT(m;7VJXe|t;^a2N%)Y7n-#grzY?BXQ-p%?q>RM&LChx6asV-cl5>JrmrIzNY>C~?E zZuaLw=Dw@-=z=DCeBCw9_0Iz{h5Kt~ky%%8Xrl~NhM#m8(^$q$O6|E`M)&UhO5+f9tgB7 zI+v2zgwMMW?atQ+?8e!+zb^&1nYivE}6FJ)_j3Vbw){HcDc0I=MY0}oiH(Kz* z3C!~`r3LZm0SyVBELeVhm~Nd4~dXrGLo-0%3FOioy{DI9Bd zC-Jw|fa` zucY#C(-6p= zZ8;J4pH<^D#f_e1p3$)BwmgmBNerqhn26Fm9xqrnp_%l&*;3~eDh*p;yWqRvDL^nt z|6Ur1Qd7G?Y7X}%+kgw*sD|V#67KzN1JD-#Y@jY^E*w>tT|Yc(e2<4vbWUM9W9>h| zCW*`woNaVH%R6mGR?`nLORA8c1kXI-$8{jA<|t?jz#^N(=bd*EJ2gi&SMJt#OpK3U z;|6ZaPFWo`0fp=sCas3J`f=oCl86Z`WM|hn^*I(~AD$r~+CB38Ya2lB91Aw4gn4Kb zp`OdhN;P5Y3=E)nUoelHd!xqa(dX2%lPtI?aTjlHr+g%`c~Vra2H{OrR0CXw&M#>C zGd@29LMyFVtvJzya?GEeh@JGro0PUGu47tm-Us3K1zIYnMn59UmGIqXbhQ%m-aCB< zUCnTSbaOyQ?1&j#xAkp>p9rO3BPiZfI$SNjx$tvm4>Wj$BacBtEj z4`I%2O-j@fjA=7PG}F|kRH;&H6(7J!1SAHLG(=E=83E-XFfcQ~ywAD&+xt7iIZFTS zUu3Ne0yBqmzHfi~@!P+>H@P0#c1!Bv{5Og_*y*H4jRq|)%G0Ts+cGV<&uXoTZWEU_ z3TY7+fmv$#Aq}vx|F-qY~1IOV@K8mM?sYnr}0>@XoN?BDodp2`0e7c~c6J==)K|Uiw#2)_M1! zC}B_Gz31t1(8pyrMVcnMvU;ysJVn429^wQh>@--GqlDEsoPpk=Vm)y_^cJbuj-BK? zto|uD1GGP=ouZLU&i7GF)UIIq)GSwl(eiKc6zM?njPVt+NpadqPSm?%Gf%%_7OE3= zMFX7j=tRKDE7Zyri(A+!B~LC2gzGkdf-L6NBdR(nw8HuVLZJ=gdLrnNf6MV75bwGez(G$fI_EkdoD03K8LC{Z zLEVU>#Q2>HlTp5(p!h0h4bg1|XEG`CxM%1GA%T>?oqCSOUsv@yp4_kLQVj5>31=$PSP)*Ti~7i? z0!}5onOszF-$&tvs<-VtxV>FuIBjCNvYY%sm4+$qqT`H`1b5wyYKaD9LCmy_Vj*o4 z>tGxWrXrn#J4Ae6cKGi?-t`?vQ{|mhV?=1h%zrd4yie;LslkQ4Q)7SBkL!()JPXNp zl>iYkJo6FMdf>4;_*7+(P5y91{NQfoGF^TR<6tJm7~WBouLm2j2#XI4(E|-79Q@NE zCHIjDQe6gnH}1dcde-V!mFx8da_%Bw3^?kPbbb|5G+3HgUQ3rvGbUX-Z!0tNV zk*8jMDU`o(;O#Qj;`=j8s=cv1d&+~)F5G%+WKlxk((SFiR9tzr)#`vlyFIU|zG~pnswVc6y!1yt=sNww&tObm zeD00d+z->_8wJS@&)yTwfuf|A)XvfLp(UvdUT&`%8|hn{a9+8W&I$%Zvxoe zu0_8nMi5JW^sH~pqHHjG-%MK&JRx~gq>e%HR*BW$wc%99`B~!U2h#_pXU*OF$@Jv5 zkr|>dQ;c}of%062$?amGiM8$yFOtIbLMWR#|Dy$#;kzxtXUayNEt4I4YozM#?&d@N zWs2ZTwqT=#9sT*wh*=e z9*0Rg(jLqnck-ZbBvz9UGEP|<@N4fQiYP&VC}q4654YEv^gs(KS>*>sPq5)DpJz<3 z{_BGISA=Q9;APCTk9~P)IKeE22FvAuEIaZRyfc`4Zl>JPk{vYV;NRhtUy!G#dmc8A9dY^#oSr7Tzosq{tliyX+5KkD zz?GfxKA+DOg1G`mEMNcC=s(sy?qt3B8Z8wYJHkn>3h$WI-q!Zy@@M-V{DaGtUg7n- zyOOu8lKcU?veRUqYqR-@Eg8XL*Z`hlSvRJkR94=9K(OuyXF=(GD7EvUDhg$KZnG9h z^GFl1riQIQg_SEUm7`^d%WP*m7piCs<&GxjRwq|9c64;ig`-W~p?8(}cUdCSq~U31 z$Q`daDt=s0HhrV7X($MxnrTy3)~OI$4aN&uh=W3215J(kH_y?NR~4LP?U+^dD^PzA z%$~g}=i@~Qp3mq=iNO*vn8a)=y6Xh`G_SNoikY|YiS&=xPFKwPQuV!!Tlzk8wI?p! ze8oi4b{2{QHaR9$-&ZVob>kUR-1! z`D0xK&ZjT+=5*)qoYYYW3anw5>x~ruiaigeyT4){ZC_D(aIxT?Dfo{yW}R=6N19jK z#}Z9ePnWp%tIhd)Upf79`jZP5%$HtH7)%8OIGe%m_TXO<7r@wsBSWErx&_^}j_cqB zrU~wyrrb8m58sFOujPULQm|BrJSWfoa$HffXr*<*;_FWqARSxxUK#6D4&_ zUVT#M&}~Vb%i5%l$*Tvyz(d_lQ%f=7ts2FBWM$Mi!^EoC)fO4d0m*b5KHer@8VX-) zY2VV+U>yB(TIH2~Z%kTRK0<)O<4mJ_3Jk$d(<-k0*I(kSLq2O)e1hVal;zKy3As{~ z4wEtxSLG{k^v+2=(tqYI<%`?8p{1x@xdGaHq37D#GV#8~-xLkLm9in!KW)|}VMj&| z96Gthb*k&6WIfW7v!gI3E8L~HR%|#s*etPhVs+t#i+!64L#^hj{-Y_f3p|x2!cMV- z&_;U2C7i=nlXb8SirpOW#1I=`*(Qo4qI3gsp9VwZ-6n!2LL8z^(+)9!3lmqFXF zd2jL4pTGH|x=k<39~r`9<&KTj4aNZ2m+liKYhF?uLy_)e*xMcE?t2TfM%I=$pLYfh zm_ujcEfs->6C%B{w&%$Q2#Jm%51YxU8RhhCiV0}pcu(M>DYs*`i;O)I~1e;p|E-jH?CUXZCiQHCg{(%|`BUB!)f>GI0Tu35ssPYZKL8yXtk ziH|Q%G|0ng(hDtHr#ut}9DK824c8RJ#)dM)KAW|BGqV`Cl1`Rq9(@7~QV39% zCcF0smXUYu$0{o~&r!aNE(AH91Zr@w5!?^MZ@TIVf%UE!h&smfvlQHG4D2mOS{(B` z-%0Iz$9jw0K{$~n5!7!JrHZD8&l$t#TG+0j9dJcsywTJlZ>l+hW*6Z)o_O#iQ ze#EP@qxHj1((|~VJxt>;15jOE-M%8{gB3YzzgORM&|PegIZ@zWO#>(&qM ze?pW8n#RDGr@&ridT#W^f|I|{lnN%H{Oor3Tj*c`;&e&sadr$3Z}ibZ&>l3(1C7>h z_^Ay9T`FY7rox0(tZPWYN1JO4m&q+9CkCvszGFJW?98m=u-YKbPG}tdZKA6%{|mPH zJ;FZpSh9&SWi-f|8l-ZyhgNr_R0?{{HM{@w_>!JW2lB3+-kf1SFaCAS*H@sfa&B#z zEjCVbL$qrXs-Zur5ov$3+CBYAK3NI^p=#_tn2w*(qD1h3%E6o94Ndc2e9LPZHQXqausqBL>3YbrWy+K{`s7NCnbNd{tG*q>sQU zN`wJCc3Bs2!Sz38mV$S^7A|YQX{U!l-f{&DCswzSK#u1R8M>> z6G)ETv(nw3+>!ip}UI2Q1^qd>2YCD5e@We^1t2~Y?zt2 zG`((``yTu7kEPQu9r@j#cCOj?FMkQ;T`S4E*zYm=|M_~yOi1HZk}-JR!NE()YeDoy z-aNH-hbTEN`wMJU5m%#*wxASA?i?g{sO`pukGr|xN?|^VHvzJ1(jbI`L_=~Kz{gk% zoN<65d^yugXmA>_B^NP0dGCqFx_L_;NJ#MD+Fy`90&p!+`IchJgCaHBzOD5L z&pLTP>s@8~eh!M3jsc9Pi=nR*wDeM**8oRRRoRX=AElkzFfNV4wgzf-M9nbe#l(|Q zn+Awy2oEL5kf~s1N)V(2vWnc>L)<`ju2y?m&n4zITcEaNWli&rw`QM}zbgz+6@tkS z$T;Ok8Tyfe4)Go|LHg1$J0;rUuSX*feK&G(Cwb9PGr^O(?8HlKM3I4pGtjtLAPMwo z6(Z~pHD0CcPt?2-`B@ztIwigP)pYlP4X1B@-?$Ax!kl9T1+|xw-gEz5>H#LTpm+tj zcIAfbPj|Ox_pBGs!C!T<9(PJU@4lg9N{VO5bwD=)$V5gyj|=@oKm_`@^Hi`-thl)mm~KRf3A zb;g3hp}>m29Voi`*zs3a*I!(nl7wI1Eo#`d8oqzGXiie`;6?npa`oe_MezN~)h92m zJDEgZi>|KAVBfO~T)jkJUtN8Cf(s6U20km~iyyGHoKwD_x7IPX-q|-Z1~3kXcNz~oj2a_dj+M-oZDKS zS7N#z@B{YMKEzKsx1Oc4kEPC(sayj_kwZG;#K0d@eO?=96C>{wRNxFU*lKdbOvp93 zN_O*cw_O^2s89?$m2Vnr z`kGqWa)Tp9Y-Q4W=v19NcI?X4D=!YPc|>lb`(=g$c5j6f@LtBS#1e;_A2rsTKmSV4 zyDJk$Ua^Eu4vpNiz{b`zl4$MBPxVlqh^4cmb>pLw0n>impCB|0dLS)II0w(7pS>+{ zx;PnY&N0&IMde}cZz5TYE%^>)i&Ldq(1>(d>JNvV=SX0phY$_L7`a30Zj?}~UJd&U zZVq}hiK8pT;6oo4#_XTJ$M;3Q)>5C>H4&)Tgg-8aHHa%<;0_wm3ryG z*`YCKq}>_p0I=^F;Wc;X8?D)Y!VuO@YN~FbYm-EDa;8p^ZV9O+mQ@N94-w0j)Iy9t zE{N(Oft3ZeS>717O?tglUQAK5I_+63(uE!H2V(sb!PHwwMo|?&zacXpwvL&geojq- z2uaA#IFsc*H#o~E_Z7wno<}9maYJ@z&4pq^_=Jh%iLct^DeFUj}nu4vzJNZ z#iRo%na)8*D;oam?pemROUhFaxO@-MOZmI$U0WS}D0p1tpmT^(^h08JMb-YEF2q_X zGlrOP2y3_bU}9*m)bK!L$b>f z8E&%6e>9wCI~1Nq5~8JwkoYs5zm&N-(&relkB7Cki4ux4H0K>OyZ4L>-7{z z_oG#v-gFsmI^NNpD0`Ifs+h59lh;9GK4h+I;% zxGXT6osi(F!ag=E|NS);l{&)^DV8!DY5uGIFEx7@ix382idqrh}wq z$+KsrW-vh{Xu*;_M)4`;L!k!;7cezr4IzS>V6*XFGMMfJUe9AxHAeEuWKBcwQd5>} zzhwrf#VH=6;;$F4$5wT%mv5EHBWZr&_syTIFJCyACgbmn=@lDOl%;r#wS&;cqwcwQ zZ20r&qi*%=;8Uq%gjI3S0Ymkg69a>BxQ1qLVdhkzZq_P`#)c3nFG99yyVI~5N$5_) zpIXnNS*%IiM_Dv{iykC*51*29(Ci|}63~yJlTUn_~)aBEk zd%~*lfbmXDViDnb#2J8(dlA|p?uN?X03V3OcxOpIDk_cjgnsYWw<({YFpjR-HvJ2=gpyXg%K}bsiGN`^N)wvjF zG9!2V{a6^#2^vrHd(Ar&8EV2{r8{2avOfUrX8f(1e?`n#X*0oxSSM+4a-w&l{TFm; z2DLHKhae63?Qd(}s=ZrfIX2~-=#xq*4Gx{)&nYV=A562NlRKsp%1Kew$OfFA$up+a zILjxMhfeWNDvwF!F=?Q6j?1Lyp>r4~eMO!7Jn01Mz4b}uF{wNz<1wuhG3ioiR|EJ# h|59kcUHDec7gxUcLe-ua`0ttjS^D(Rr+)Iw{|9fWF%19! literal 0 HcmV?d00001 diff --git a/src/wasm-lib/grackle/src/binding_scope.rs b/src/wasm-lib/grackle/src/binding_scope.rs index b383d538a8..465b1b1b0d 100644 --- a/src/wasm-lib/grackle/src/binding_scope.rs +++ b/src/wasm-lib/grackle/src/binding_scope.rs @@ -113,6 +113,26 @@ impl BindingScope { "lineTo".into(), EpBinding::from(KclFunction::LineTo(native_functions::sketch::LineTo)), ), + ( + "line".into(), + EpBinding::from(KclFunction::Line(native_functions::sketch::Line)), + ), + ( + "xLineTo".into(), + EpBinding::from(KclFunction::XLineTo(native_functions::sketch::XLineTo)), + ), + ( + "xLine".into(), + EpBinding::from(KclFunction::XLine(native_functions::sketch::XLine)), + ), + ( + "yLineTo".into(), + EpBinding::from(KclFunction::YLineTo(native_functions::sketch::YLineTo)), + ), + ( + "yLine".into(), + EpBinding::from(KclFunction::YLine(native_functions::sketch::YLine)), + ), ( "extrude".into(), EpBinding::from(KclFunction::Extrude(native_functions::sketch::Extrude)), diff --git a/src/wasm-lib/grackle/src/error.rs b/src/wasm-lib/grackle/src/error.rs index 143d194545..33a70447d0 100644 --- a/src/wasm-lib/grackle/src/error.rs +++ b/src/wasm-lib/grackle/src/error.rs @@ -76,7 +76,7 @@ impl From for Error { ) -> Self { Self::Execution { error, - instruction, + instruction: instruction.expect("no instruction"), instruction_index, } } diff --git a/src/wasm-lib/grackle/src/lib.rs b/src/wasm-lib/grackle/src/lib.rs index 40beaa5114..189f68b79e 100644 --- a/src/wasm-lib/grackle/src/lib.rs +++ b/src/wasm-lib/grackle/src/lib.rs @@ -262,6 +262,11 @@ impl Planner { KclFunction::StartSketchAt(f) => f.call(&mut ctx, args)?, KclFunction::Extrude(f) => f.call(&mut ctx, args)?, KclFunction::LineTo(f) => f.call(&mut ctx, args)?, + KclFunction::Line(f) => f.call(&mut ctx, args)?, + KclFunction::XLineTo(f) => f.call(&mut ctx, args)?, + KclFunction::XLine(f) => f.call(&mut ctx, args)?, + KclFunction::YLineTo(f) => f.call(&mut ctx, args)?, + KclFunction::YLine(f) => f.call(&mut ctx, args)?, KclFunction::Add(f) => f.call(&mut ctx, args)?, KclFunction::Close(f) => f.call(&mut ctx, args)?, KclFunction::UserDefined(f) => { @@ -631,6 +636,11 @@ enum KclFunction { Id(native_functions::Id), StartSketchAt(native_functions::sketch::StartSketchAt), LineTo(native_functions::sketch::LineTo), + Line(native_functions::sketch::Line), + XLineTo(native_functions::sketch::XLineTo), + XLine(native_functions::sketch::XLine), + YLineTo(native_functions::sketch::YLineTo), + YLine(native_functions::sketch::YLine), Add(native_functions::Add), UserDefined(UserDefinedFunction), Extrude(native_functions::sketch::Extrude), diff --git a/src/wasm-lib/grackle/src/native_functions/sketch.rs b/src/wasm-lib/grackle/src/native_functions/sketch.rs index 6394d6df0e..5ae32403f9 100644 --- a/src/wasm-lib/grackle/src/native_functions/sketch.rs +++ b/src/wasm-lib/grackle/src/native_functions/sketch.rs @@ -3,4 +3,4 @@ pub mod helpers; pub mod stdlib_functions; -pub use stdlib_functions::{Close, Extrude, LineTo, StartSketchAt}; +pub use stdlib_functions::{Close, Extrude, Line, LineTo, StartSketchAt, XLine, XLineTo, YLine, YLineTo}; diff --git a/src/wasm-lib/grackle/src/native_functions/sketch/helpers.rs b/src/wasm-lib/grackle/src/native_functions/sketch/helpers.rs index 58b377aabf..258314b2b8 100644 --- a/src/wasm-lib/grackle/src/native_functions/sketch/helpers.rs +++ b/src/wasm-lib/grackle/src/native_functions/sketch/helpers.rs @@ -139,7 +139,7 @@ pub fn sequence_binding( } } -/// Extract a 2D point from an argument to a Cabble. +/// Extract a 2D point from an argument to a KCL Function. pub fn arg_point2d( arg: EpBinding, fn_name: &'static str, @@ -148,7 +148,7 @@ pub fn arg_point2d( arg_number: usize, ) -> Result { let expected = "2D point (array with length 2)"; - let elements = sequence_binding(arg, "startSketchAt", "an array of length 2", arg_number)?; + let elements = sequence_binding(arg, fn_name, "an array of length 2", arg_number)?; if elements.len() != 2 { return Err(CompileError::ArgWrongType { fn_name, @@ -165,12 +165,12 @@ pub fn arg_point2d( let start_z = start + 2; instructions.extend([ Instruction::Copy { - source: single_binding(elements[0].clone(), "startSketchAt", "number", arg_number)?, + source: single_binding(elements[0].clone(), fn_name, "number", arg_number)?, destination: Destination::Address(start_x), length: 1, }, Instruction::Copy { - source: single_binding(elements[1].clone(), "startSketchAt", "number", arg_number)?, + source: single_binding(elements[1].clone(), fn_name, "number", arg_number)?, destination: Destination::Address(start_y), length: 1, }, diff --git a/src/wasm-lib/grackle/src/native_functions/sketch/stdlib_functions.rs b/src/wasm-lib/grackle/src/native_functions/sketch/stdlib_functions.rs index d9f6dd18e5..a00802e5a1 100644 --- a/src/wasm-lib/grackle/src/native_functions/sketch/stdlib_functions.rs +++ b/src/wasm-lib/grackle/src/native_functions/sketch/stdlib_functions.rs @@ -1,7 +1,7 @@ use kittycad_execution_plan::{ api_request::ApiRequest, sketch_types::{self, Axes, BasePath, Plane, SketchGroup}, - Destination, Instruction, + BinaryArithmetic, BinaryOperation, Destination, Instruction, Operand, }; use kittycad_execution_plan_traits::{Address, InMemory, Primitive, Value}; use kittycad_modeling_cmds::{ @@ -13,6 +13,22 @@ use uuid::Uuid; use super::helpers::{arg_point2d, no_arg_api_call, sg_binding, single_binding, stack_api_call}; use crate::{binding_scope::EpBinding, error::CompileError, native_functions::Callable, EvalPlan}; +#[derive(PartialEq)] +pub enum At { + RelativeXY, + AbsoluteXY, + RelativeX, + AbsoluteX, + RelativeY, + AbsoluteY, +} + +impl At { + pub fn is_relative(&self) -> bool { + *self == At::RelativeX || *self == At::RelativeY || *self == At::RelativeXY + } +} + #[derive(Debug, Clone)] #[cfg_attr(test, derive(Eq, PartialEq))] pub struct Close; @@ -140,25 +156,124 @@ impl Callable for LineTo { &self, ctx: &mut crate::native_functions::Context<'_>, args: Vec, + ) -> Result { + LineBare::call(ctx, "lineTo", args, LineBareOptions { at: At::AbsoluteXY }) + } +} + +#[derive(Debug, Clone)] +#[cfg_attr(test, derive(Eq, PartialEq))] +pub struct Line; + +impl Callable for Line { + fn call( + &self, + ctx: &mut crate::native_functions::Context<'_>, + args: Vec, + ) -> Result { + LineBare::call(ctx, "line", args, LineBareOptions { at: At::RelativeXY }) + } +} + +#[derive(Debug, Clone)] +#[cfg_attr(test, derive(Eq, PartialEq))] +pub struct XLineTo; + +impl Callable for XLineTo { + fn call( + &self, + ctx: &mut crate::native_functions::Context<'_>, + args: Vec, + ) -> Result { + LineBare::call(ctx, "xLineTo", args, LineBareOptions { at: At::AbsoluteX }) + } +} + +#[derive(Debug, Clone)] +#[cfg_attr(test, derive(Eq, PartialEq))] +pub struct XLine; + +impl Callable for XLine { + fn call( + &self, + ctx: &mut crate::native_functions::Context<'_>, + args: Vec, + ) -> Result { + LineBare::call(ctx, "xLine", args, LineBareOptions { at: At::RelativeX }) + } +} + +#[derive(Debug, Clone)] +#[cfg_attr(test, derive(Eq, PartialEq))] +pub struct YLineTo; + +impl Callable for YLineTo { + fn call( + &self, + ctx: &mut crate::native_functions::Context<'_>, + args: Vec, + ) -> Result { + LineBare::call(ctx, "yLineTo", args, LineBareOptions { at: At::AbsoluteY }) + } +} + +#[derive(Debug, Clone)] +#[cfg_attr(test, derive(Eq, PartialEq))] +pub struct YLine; + +impl Callable for YLine { + fn call( + &self, + ctx: &mut crate::native_functions::Context<'_>, + args: Vec, + ) -> Result { + LineBare::call(ctx, "yLine", args, LineBareOptions { at: At::RelativeY }) + } +} + +#[derive(Debug, Clone)] +#[cfg_attr(test, derive(Eq, PartialEq))] +/// Exposes all the possible arguments the `line` modeling command can take. +/// Reduces code for the other line functions needed. +/// We do not expose this to the developer since it does not align with +/// the documentation (there is no "lineBare"). +pub struct LineBare; + +/// Used to configure the call to handle different line variants. +pub struct LineBareOptions { + /// Where to start coordinates at, ex: At::RelativeXY. + at: At, +} + +impl LineBare { + fn call( + ctx: &mut crate::native_functions::Context<'_>, + fn_name: &'static str, + args: Vec, + opts: LineBareOptions, ) -> Result { let mut instructions = Vec::new(); - let fn_name = "lineTo"; - // Get both required params. + + let required = 2; + let mut args_iter = args.into_iter(); + let Some(to) = args_iter.next() else { return Err(CompileError::NotEnoughArgs { fn_name: fn_name.into(), - required: 2, - actual: 0, + required, + actual: args_iter.count(), }); }; + let Some(sketch_group) = args_iter.next() else { return Err(CompileError::NotEnoughArgs { fn_name: fn_name.into(), - required: 2, - actual: 1, + required, + actual: args_iter.count(), }); }; + let tag = match args_iter.next() { Some(a) => a, None => { @@ -171,26 +286,90 @@ impl Callable for LineTo { EpBinding::Single(empty_string_addr) } }; + // Check the type of required params. - let to = arg_point2d(to, fn_name, &mut instructions, ctx, 0)?; + // We don't check `to` here because it can take on either a + // EpBinding::Sequence or EpBinding::Single. + let sg = sg_binding(sketch_group, fn_name, "sketch group", 1)?; let tag = single_binding(tag, fn_name, "string tag", 2)?; let id = Uuid::new_v4(); + // Start of the path segment (which is a straight line). let length_of_3d_point = Point3d::::default().into_parts().len(); let start_of_line = ctx.next_address.offset_by(1); + // Reserve space for the line's end, and the `relative: bool` field. ctx.next_address.offset_by(length_of_3d_point + 1); let new_sg_index = ctx.assign_sketch_group(); + + // Copy based on the options. + match opts { + LineBareOptions { at: At::AbsoluteXY, .. } | LineBareOptions { at: At::RelativeXY, .. } => { + // Push the `to` 2D point onto the stack. + let EpBinding::Sequence { elements, length_at: _ } = to.clone() else { + return Err(CompileError::InvalidOperand("Must pass a list of length 2")); + }; + let &[EpBinding::Single(el0), EpBinding::Single(el1)] = elements.as_slice() else { + return Err(CompileError::InvalidOperand("Must pass a sequence here.")); + }; + instructions.extend([ + Instruction::Copy { + // X + source: el0, + length: 1, + destination: Destination::StackPush, + }, + Instruction::Copy { + // Y + source: el1, + length: 1, + destination: Destination::StackExtend, + }, + Instruction::StackExtend { data: vec![0.0.into()] }, // Z + ]); + } + LineBareOptions { at: At::AbsoluteX, .. } | LineBareOptions { at: At::RelativeX, .. } => { + let EpBinding::Single(addr) = to else { + return Err(CompileError::InvalidOperand("Must pass a single value here.")); + }; + instructions.extend([ + Instruction::Copy { + // X + source: addr, + length: 1, + destination: Destination::StackPush, + }, + Instruction::StackExtend { + data: vec![Primitive::from(0.0)], + }, // Y + Instruction::StackExtend { + data: vec![Primitive::from(0.0)], + }, // Z + ]); + } + LineBareOptions { at: At::AbsoluteY, .. } | LineBareOptions { at: At::RelativeY, .. } => { + let EpBinding::Single(addr) = to else { + return Err(CompileError::InvalidOperand("Must pass a single value here.")); + }; + instructions.extend([ + Instruction::StackPush { + data: vec![Primitive::from(0.0)], + }, // X + Instruction::Copy { + // Y + source: addr, + length: 1, + destination: Destination::StackExtend, + }, + Instruction::StackExtend { + data: vec![Primitive::from(0.0)], + }, // Z + ]); + } + } + instructions.extend([ - // Push the `to` 2D point onto the stack. - Instruction::Copy { - source: to, - length: 2, - destination: Destination::StackPush, - }, - // Make it a 3D point. - Instruction::StackExtend { data: vec![0.0.into()] }, // Append the new path segment to memory. // First comes its tag. Instruction::SetPrimitive { @@ -204,7 +383,7 @@ impl Callable for LineTo { // Then its `relative` field. Instruction::SetPrimitive { address: start_of_line + 1 + length_of_3d_point, - value: false.into(), + value: opts.at.is_relative().into(), }, // Push the path ID onto the stack. Instruction::SketchGroupCopyFrom { @@ -231,16 +410,159 @@ impl Callable for LineTo { data: vec![Primitive::from("ToPoint".to_owned())], }, // `BasePath::from` point. + // Place them in the secondary stack to prepare ToPoint structure. Instruction::SketchGroupGetLastPoint { source: sg, destination: Destination::StackExtend, }, - // `BasePath::to` point. - Instruction::Copy { - source: start_of_line + 1, - length: 2, - destination: Destination::StackExtend, + ]); + + // Reserve space for the segment last point + let to_point_from = ctx.next_address.offset_by(2); + + instructions.extend([ + // Copy to the primary stack as well to be worked with. + Instruction::SketchGroupGetLastPoint { + source: sg, + destination: Destination::Address(to_point_from), }, + ]); + + // `BasePath::to` point. + + // The copy here depends on the incoming `to` data. + // Sometimes it's a list, sometimes it's single datum. + // And the relative/not relative matters. When relative, we need to + // copy coords from `from` into the new `to` coord that don't change. + // At least everything else can be built up from these "primitives". + if let EpBinding::Sequence { elements, length_at: _ } = to.clone() { + if let &[EpBinding::Single(el0), EpBinding::Single(el1)] = elements.as_slice() { + match opts { + // ToPoint { from: { x1, y1 }, to: { x1 + x2, y1 + y2 } } + LineBareOptions { at: At::RelativeXY, .. } => { + instructions.extend([ + Instruction::BinaryArithmetic { + arithmetic: BinaryArithmetic { + operation: BinaryOperation::Add, + operand0: Operand::Reference(to_point_from + 0), + operand1: Operand::Reference(el0), + }, + destination: Destination::StackExtend, + }, + Instruction::BinaryArithmetic { + arithmetic: BinaryArithmetic { + operation: BinaryOperation::Add, + operand0: Operand::Reference(to_point_from + 1), + operand1: Operand::Reference(el1), + }, + destination: Destination::StackExtend, + }, + ]); + } + // ToPoint { from: { x1, y1 }, to: { x2, y2 } } + LineBareOptions { at: At::AbsoluteXY, .. } => { + // Otherwise just directly copy the new points. + instructions.extend([ + Instruction::Copy { + source: el0, + length: 1, + destination: Destination::StackExtend, + }, + Instruction::Copy { + source: el1, + length: 1, + destination: Destination::StackExtend, + }, + ]); + } + _ => { + return Err(CompileError::InvalidOperand( + "A Sequence with At::...X or At::...Y is not valid here. Must be At::...XY.", + )); + } + } + } + } else if let EpBinding::Single(addr) = to { + match opts { + // ToPoint { from: { x1, y1 }, to: { x1 + x2, y1 } } + LineBareOptions { at: At::RelativeX } => { + instructions.extend([ + Instruction::BinaryArithmetic { + arithmetic: BinaryArithmetic { + operation: BinaryOperation::Add, + operand0: Operand::Reference(to_point_from + 0), + operand1: Operand::Reference(addr), + }, + destination: Destination::StackExtend, + }, + Instruction::Copy { + source: to_point_from + 1, + length: 1, + destination: Destination::StackExtend, + }, + ]); + } + // ToPoint { from: { x1, y1 }, to: { x2, y1 } } + LineBareOptions { at: At::AbsoluteX } => { + instructions.extend([ + Instruction::Copy { + source: addr, + length: 1, + destination: Destination::StackExtend, + }, + Instruction::Copy { + source: to_point_from + 1, + length: 1, + destination: Destination::StackExtend, + }, + ]); + } + // ToPoint { from: { x1, y1 }, to: { x1, y1 + y2 } } + LineBareOptions { at: At::RelativeY } => { + instructions.extend([ + Instruction::Copy { + source: to_point_from + 0, + length: 1, + destination: Destination::StackExtend, + }, + Instruction::BinaryArithmetic { + arithmetic: BinaryArithmetic { + operation: BinaryOperation::Add, + operand0: Operand::Reference(to_point_from + 1), + operand1: Operand::Reference(addr), + }, + destination: Destination::StackExtend, + }, + ]); + } + // ToPoint { from: { x1, y1 }, to: { x1, y2 } } + LineBareOptions { at: At::AbsoluteY } => { + instructions.extend([ + Instruction::Copy { + source: to_point_from + 0, + length: 1, + destination: Destination::StackExtend, + }, + Instruction::Copy { + source: addr, + length: 1, + destination: Destination::StackExtend, + }, + ]); + } + _ => { + return Err(CompileError::InvalidOperand( + "A Single binding with At::...XY is not valid here.", + )); + } + } + } else { + return Err(CompileError::InvalidOperand( + "Must be a sequence or single value binding.", + )); + } + + instructions.extend([ // `BasePath::name` string. Instruction::Copy { source: tag, diff --git a/src/wasm-lib/grackle/src/tests.rs b/src/wasm-lib/grackle/src/tests.rs index 3902cd9d84..57604592f2 100644 --- a/src/wasm-lib/grackle/src/tests.rs +++ b/src/wasm-lib/grackle/src/tests.rs @@ -1048,14 +1048,10 @@ fn store_object_with_array_property() { /// Write the program's plan to the KCVM debugger's normal input file. #[allow(unused)] -fn kcvm_dbg(kcl_program: &str) { +fn kcvm_dbg(kcl_program: &str, path: &str) { let (plan, _scope, _) = must_plan(kcl_program); let plan_json = serde_json::to_string_pretty(&plan).unwrap(); - std::fs::write( - "/Users/adamchalmers/kc-repos/modeling-api/execution-plan-debugger/test_input.json", - plan_json, - ) - .unwrap(); + std::fs::write(path, plan_json).unwrap(); } #[tokio::test] @@ -1069,8 +1065,6 @@ async fn stdlib_cube_partial() { |> close(%) |> extrude(100.0, %) "#; - let (_plan, _scope, last_address) = must_plan(program); - assert_eq!(last_address, Address::ZERO + 66); let ast = kcl_lib::parser::Parser::new(kcl_lib::token::lexer(program)) .ast() .unwrap(); @@ -1113,23 +1107,115 @@ async fn stdlib_cube_partial() { }, ] ); - // use kittycad_modeling_cmds::{each_cmd, ok_response::OkModelingCmdResponse, ImageFormat}; - // let out = client - // .unwrap() - // .run_command( - // uuid::Uuid::new_v4().into(), - // each_cmd::TakeSnapshot { - // format: ImageFormat::Png, - // }, - // ) - // .await - // .unwrap(); - // let out = match out { - // OkModelingCmdResponse::TakeSnapshot(b) => b, - // other => panic!("wrong output: {other:?}"), - // }; - // let out: Vec = out.contents.into(); - // std::fs::write("image.png", out).unwrap(); + use kittycad_modeling_cmds::{each_cmd, ok_response::OkModelingCmdResponse, ImageFormat}; + let out = client + .unwrap() + .run_command( + uuid::Uuid::new_v4().into(), + kittycad_modeling_cmds::ModelingCmd::from(each_cmd::TakeSnapshot { + format: ImageFormat::Png, + }), + ) + .await + .unwrap(); + + let out = match out { + OkModelingCmdResponse::TakeSnapshot(kittycad_modeling_cmds::output::TakeSnapshot { contents: b }) => b, + other => panic!("wrong output: {other:?}"), + }; + + use image::io::Reader as ImageReader; + let img = ImageReader::new(std::io::Cursor::new(out)) + .with_guessed_format() + .unwrap() + .decode() + .unwrap(); + twenty_twenty::assert_image("fixtures/cube_lineTo.png", &img, 0.9999); +} + +#[tokio::test] +async fn stdlib_cube_xline_yline() { + let program = r#" + let cube = startSketchAt([0.0, 0.0], "adam") + |> xLine(210.0, %, "side0") + |> yLine(210.0, %, "side1") + |> xLine(-210.0, %, "side2") + |> yLine(-210.0, %, "side3") + |> close(%) + |> extrude(100.0, %) + "#; + kcvm_dbg( + program, + "/home/lee/Code/Zoo/modeling-api/execution-plan-debugger/cube_xyline.json", + ); + let (_plan, _scope, _last_address) = must_plan(program); + + let ast = kcl_lib::parser::Parser::new(kcl_lib::token::lexer(program)) + .ast() + .unwrap(); + let mut client = Some(test_client().await); + let mem = match crate::execute(ast, &mut client).await { + Ok(mem) => mem, + Err(e) => panic!("{e}"), + }; + let sg = &mem.sketch_groups.last().unwrap(); + assert_eq!( + sg.path_rest, + vec![ + sketch_types::PathSegment::ToPoint { + base: sketch_types::BasePath { + from: Point2d { x: 0.0, y: 0.0 }, + to: Point2d { x: 210.0, y: 0.0 }, + name: "side0".into(), + } + }, + sketch_types::PathSegment::ToPoint { + base: sketch_types::BasePath { + from: Point2d { x: 210.0, y: 0.0 }, + to: Point2d { x: 210.0, y: 210.0 }, + name: "side1".into(), + } + }, + sketch_types::PathSegment::ToPoint { + base: sketch_types::BasePath { + from: Point2d { x: 210.0, y: 210.0 }, + to: Point2d { x: 0.0, y: 210.0 }, + name: "side2".into(), + } + }, + sketch_types::PathSegment::ToPoint { + base: sketch_types::BasePath { + from: Point2d { x: 0.0, y: 210.0 }, + to: Point2d { x: 0.0, y: 0.0 }, + name: "side3".into(), + } + }, + ] + ); + use kittycad_modeling_cmds::{each_cmd, ok_response::OkModelingCmdResponse, ImageFormat}; + let out = client + .unwrap() + .run_command( + uuid::Uuid::new_v4().into(), + kittycad_modeling_cmds::ModelingCmd::from(each_cmd::TakeSnapshot { + format: ImageFormat::Png, + }), + ) + .await + .unwrap(); + + let out = match out { + OkModelingCmdResponse::TakeSnapshot(kittycad_modeling_cmds::output::TakeSnapshot { contents: b }) => b, + other => panic!("wrong output: {other:?}"), + }; + + use image::io::Reader as ImageReader; + let img = ImageReader::new(std::io::Cursor::new(out)) + .with_guessed_format() + .unwrap() + .decode() + .unwrap(); + twenty_twenty::assert_image("fixtures/cube_xyLine.png", &img, 0.9999); } async fn test_client() -> Session {